{"id":18793993,"url":"https://github.com/demetrous-fd/cryptopro-adapter","last_synced_at":"2026-04-13T00:46:33.265Z","repository":{"id":250282676,"uuid":"833975409","full_name":"Demetrous-fd/CryptoPro-Adapter","owner":"Demetrous-fd","description":"Модуль для работы с утилитами КриптоПро на Windows и Linux.","archived":false,"fork":false,"pushed_at":"2025-02-11T05:44:10.000Z","size":72,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-21T15:54:41.918Z","etag":null,"topics":["cades","cryptopro","cryptoprocsp","linux","nmcades","windows"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Demetrous-fd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-07-26T06:51:23.000Z","updated_at":"2025-02-11T04:47:56.000Z","dependencies_parsed_at":"2024-07-26T09:49:04.102Z","dependency_job_id":"3ce4033c-7c9e-4647-b924-3f19f3e93952","html_url":"https://github.com/Demetrous-fd/CryptoPro-Adapter","commit_stats":null,"previous_names":["demetrous-fd/cryptopro-adapter"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Demetrous-fd/CryptoPro-Adapter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Demetrous-fd%2FCryptoPro-Adapter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Demetrous-fd%2FCryptoPro-Adapter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Demetrous-fd%2FCryptoPro-Adapter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Demetrous-fd%2FCryptoPro-Adapter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Demetrous-fd","download_url":"https://codeload.github.com/Demetrous-fd/CryptoPro-Adapter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Demetrous-fd%2FCryptoPro-Adapter/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259455733,"owners_count":22860421,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cades","cryptopro","cryptoprocsp","linux","nmcades","windows"],"created_at":"2024-11-07T21:27:43.136Z","updated_at":"2026-04-13T00:46:33.256Z","avatar_url":"https://github.com/Demetrous-fd.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CryptoPro Adapter\n\nМодуль для работы с certmgr и nmcades на Windows и Linux.\n\n### Требования\n\n- КриптоПро ЭЦП 4-5 версии\n- КриптоПро ЭЦП Browser plug-in\n\n### Запуск процессов\n- `NewNMCadesProcess() (*CadesProcess, error)`\n\t```golang\n\ttype CadesProcess struct {\n\t\tcmd    *exec.Cmd\n\t\tstdout *io.ReadCloser\n\t\tstdin  *io.WriteCloser\n\t}\n\tfunc PostMessage(file io.WriteCloser, message []byte) error\n\tfunc GetMessage(stdout io.ReadCloser) string\n\t```\n- `NewCertManagerProcess(args ...string) (string, error)`\n\n\n### CadesManager\n```golang\ntype CadesManager struct{}\n\ntype Container struct {\n\tContainerName       string `json:\"containerName\"`\n\tUniqueContainerName string `json:\"uniqueContainerName\"`\n}\n\ntype InstallPfxResult struct {\n\tContainer  Container `json:\"container\"`\n\tThumbprint string    `json:\"thumbprint\"`\n\tOutput     string    `json:\"output\"`\n\tOK         bool      `json:\"ok\"`\n}\n\nfunc (cm *CadesManager) GetContainer(partOfContainerName string) (*Container, error)\nfunc (cm *CadesManager) GetListOfContainers() ([]Container, error)\nfunc (cm *CadesManager) CopyContainer(container *Container, newLocation string) (*Container, error)\nfunc (cm *CadesManager) LinkCertWithContainer(certPath, containerName string) (bool, error)\nfunc (cm *CadesManager) DeleteCertificate(thumbprint string) (bool, error)\nfunc (cm *CadesManager) DeleteContainer(container *Container) (bool, error) \nfunc (cm *CadesManager) AbsorbCertificates(pattern string) (string, error)\nfunc (cm *CadesManager) IsCertificateExists(thumbprint string, store string) (bool, error)\nfunc (cm *CadesManager) GetCertificatesInfo(thumbprint string, store string) ([]GostCertificate, error)\nfunc (cm *CadesManager) RenameContainer(container *Container, newContainerName string) (*Container, error)\nfunc (cm *CadesManager) InstallContainerFromFolder(containerFolderPath string, rootContainersFolderPath string, containerStorageName string, containerName string) (*Container, error)\nfunc (cm *CadesManager) InstallPfx(path string, password string, exportable bool) (*InstallPfxResult, error)\nfunc (cm *CadesManager) ExportContainerToPfx(filePath string, containerName string, password string) (string, error)\nfunc (cm *CadesManager) ExportContainerToPfxByThumbprint(filePath string, thumbprint string, password string) (string, error)\nfunc (cm *CadesManager) InstallCertificate(filePath string, storeName string, autoDist bool) error\nfunc (cm *CadesManager) GetCSPInfo() (string, error)\n```\n\n\n### Utils\n- Методы для получения Отпечатока SHA1 из сертификата\n  ```golang\n  func GetCertificateThumbprintFromFile(path string) (string, error)\n  func GetCertificateThumbprint(data []byte) (string, error)\n  func GetThumbprint(certificate *x509.Certificate) string\n  ```\n- Метод для получения открытого ключа из сертификата\n  ```golang\n  func GetCertificatePublicKey(publicKeyInfo *SubjectPublicKeyInfoAsn1) string\n  ```\n- Методы для получения первых 8 байт открытого ключа из сертификата и контейнера\n  ```golang\n  func ParseSubjectPublicKeyInfo(cert *x509.Certificate) (*SubjectPublicKeyInfoAsn1, error)\n  func GetCertificateShortPublicKey(publicKeyInfo *SubjectPublicKeyInfoAsn1) string\n  func GetShortPublicKeyFromPrivateKey(headerData []byte) string\n  ```\n- Метод для создания нового имени ключевого носителя (name.key)\n  ```golang\n  func NewPrivateKeyName(cp1251Name string) []byte\n  ```\n- Методы для прямого переименования контейнера\n  ```golang\n  func DirectRenameContainerFolder(path string, newNameInCP1251 string) (bool, error)\n  func DirectRenameContainerHDImage(username string, uniqueContainerName string, newNameInCP1251 string) (bool, error)\n\n  func GetUserSid(username string) (string, error)\n  func DirectRenameContainerRegistry(userSid string, containerName string, newNameInCP1251 string) (bool, error)\n  ```\n- Метод для парсинга сертификата\n  ```golang\n  type AlgorithmInfo struct {\n  \tOID        string   `json:\"oid\"`\n  \tName       string   `json:\"name\"`\n  \tParameters []string `json:\"parameters\"`\n  }\n\n  type GostCertificate struct {\n\tIssuer         map[string]string `json:\"issuer\"`\n\tSubject        map[string]string `json:\"subject\"`\n\tSerialNumber   string            `json:\"serial_number\"`\n\tThumbprint     string            `json:\"thumbprint\"`\n\tPublicKey      string            `json:\"public_key\"`\n\tShortPublicKey string            `json:\"short_public_key\"`\n\tContainer      string            `json:\"container,omitempty\"`\n\tContainerLink  bool              `json:\"container_link,omitempty\"`\n\tAlgorithm      AlgorithmInfo     `json:\"algorithm\"`\n\tNotAfter       time.Time         `json:\"not_after\"`\n\tNotBefore      time.Time         `json:\"not_before\"`\n  }\n\n  func ParseGostCertificate(x509Certificate *x509.Certificate) (*GostCertificate, error)\n  ```\n- Методы для реализаций интерфейсов COM через NMCades\n  ```golang\n    type DefaultTypeValue[T any] struct {\n        Value T\n    }\n    type ErrorCollector struct {\n        err error\n    }\n  ```\n  - `ValueToParam(value any) *CadesParam`\n  - `ArgumentsToParams(maxArgs uint8, args []any) []CadesParam`\n  - `GetProperty[T any](c *CadesObject, name string) (T, error)`\n  - `GetPropertyWithObject(c *CadesObject, name string) (*CadesObject, error)`\n  - `CallMethod(c *CadesObject, name string, params []CadesParam) (*CadesResponseData, error)`\n  - `CallVoidMethod(c *CadesObject, name string, params []CadesParam) error`\n  - `SafeExecute[T any](ec *ErrorCollector, f func() (T, error)) T`\n  - `SafeExecuteWithObject[T any](w *ErrorCollector, f func() (*T, error)) *T`\n\n### NMCades\n\n```golang\ntype CallbackData struct {\n\tId     uint32 `json:\"callback_id\"`\n\tObject string `json:\"object\"`\n\tType   string `json:\"type\"`\n\tValue  string `json:\"value\"`\n}\n\ntype CadesRequestData struct {\n\tCallbackId  uint32       `json:\"callback_id,omitempty\"`\n\tRequestId   uint32       `json:\"requestid,omitempty\"`\n\tObjId       uint32       `json:\"objid,omitempty\"`\n\tObject      string       `json:\"object,omitempty\"`\n\tDestination string       `json:\"destination,omitempty\"`\n\tType        string       `json:\"type,omitempty\"`\n\tValue       string       `json:\"value,omitempty\"`\n\tMethod      string       `json:\"method,omitempty\"`\n\tProperty    string       `json:\"get_property,omitempty\"`\n\tUrl         string       `json:\"url,omitempty\"`\n\tParams      []CadesParam `json:\"params,omitempty\"`\n}\n\ntype ReturnValue struct {\n\tType       string      `json:\"type\"`\n\tValue      interface{} `json:\"value\"`\n\tMethods    []string    `json:\"methods,omitempty\"`\n\tProperties []string    `json:\"properties,omitempty\"`\n}\n\ntype CadesResponseData struct {\n\tRequestId   uint32      `json:\"requestid,omitempty\"`\n\tReturnValue ReturnValue `json:\"retval,omitempty\"`\n\tType        string      `json:\"type,omitempty\"`\n\tValue       interface{} `json:\"value,omitempty\"`\n\tMessage     string      `json:\"message,omitempty\"`\n}\n\ntype CadesRequestBody struct {\n\tTabid string            `json:\"tabid\"`\n\tData  *CadesRequestData `json:\"data\"`\n}\n\ntype CadesResponseBody struct {\n\tTabid string           `json:\"tabid\"`\n\tData  *json.RawMessage `json:\"data\"`\n}\n\ntype CadesParam struct {\n\tType  string `json:\"type\"`\n\tValue any    `json:\"value\"`\n}\n\ntype CadesProcess struct {\n\tcmd    *exec.Cmd\n\tstdout *io.ReadCloser\n\tstdin  *io.WriteCloser\n}\n\ntype Cades struct {\n\tId        string\n\tRequestId uint32\n\tObjId     uint32\n\tProcess   *CadesProcess\n}\n\ntype CadesObject struct {\n\tCades *Cades\n\tObjId uint32\n}\n```\n\n- `NewCades() (*Cades, error)` Создание экземляра nmcades\n  - `(cades *Cades) SendRequest(request *CadesRequestBody) (*CadesResponseData, error)`\n  - `(cades *Cades) Close()`\n\n#### Пример использования nmcades\n\n```golang\npackage main\n\nimport (\n\t\"log\"\n\tcades \"github.com/Demetrous-fd/CryptoPro-Adapter\"\n)\n\nfunc getCertificate(thumbprint string) (*cades.Certificate, error) {\n\tdefaultValue := cades.DefaultTypeValue[cades.Certificate]{}.Value\n\n\tcadesObj, err := cades.NewCades()\n\tif err != nil {\n\t\tlog.Println(\"Fail to create a cades object\", err)\n\t\treturn \u0026defaultValue, err\n\t}\n\n\tstore, err := NewStore(cadesObj)\n\tif err != nil {\n\t\tlog.Println(\"Fail to create a store object\", err)\n\t\treturn \u0026defaultValue, err\n\t}\n\n\terr = store.Open(cades.CAPICOM_CURRENT_USER_STORE, cades.CAPICOM_MY_STORE)\n\tif err != nil {\n\t\tlog.Println(\"Fail to open store\", err)\n\t\treturn \u0026defaultValue, err\n\t}\n\n\tcertificates, err := store.Certificates()\n\tif err != nil {\n\t\tlog.Println(\"Fail to create a Certificates object\", err)\n\t\treturn \u0026defaultValue, err\n\t}\n\n\tcerts, err := certificates.Find(cades.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint)\n\tif err != nil {\n\t\tlog.Println(\"Fail to create a Certificates object\", err)\n\t\treturn \u0026defaultValue, err\n\t}\n\n\tcount, err := certs.Count()\n\tif err != nil {\n\t\tlog.Println(\"Fail to execute Certificates.Count method\", err)\n\t\treturn \u0026defaultValue, err\n\t}\n\n\tif count \u003c= 0 {\n\t\treturn \u0026defaultValue, cades.ErrEmpty\n\t}\n\n\tcertificate, err := certificates.Item(1)\n\tif err != nil {\n\t\tlog.Println(\"Fail to execute Certificates.Item method\", err)\n\t\treturn \u0026defaultValue, err\n\t}\n\n\treturn certificate, nil\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdemetrous-fd%2Fcryptopro-adapter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdemetrous-fd%2Fcryptopro-adapter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdemetrous-fd%2Fcryptopro-adapter/lists"}