| ||||
| ||||
Несколько вопросов по ЭЦП 1. При получении сертификата было выбрано both - насколько я понимаю, это значит что ключи и обмена и подписи, но при вызове CryptGetUserKey(hProv, AT_SIGNATURE, @hKeyS) получаем NTE_NO_KEY, то есть как бы ключа для подписи нет. Далее его можно сгенерить CryptGenKey(hProv, AT_SIGNATURE, 1024 shl 16, @hKeyS), но непонятно, почему его нет изначально. 2. Далее создаю хэш CryptCreateHash(hProv, CALG_GR3411, 0, 0, @hHash) хэширую данные CryptHashData(hHash, PBYTE(msgtext), msglen, 0) определяю размер подписи CryptSignHash(hHash, AT_SIGNATURE, nil, 0, nil, @dwSigLen) выделяю память ... и подписываю хэш CryptSignHash(hHash, AT_SIGNATURE, nil, 0, pbSignature, @dwSigLen) Всё прекрасно, получили подпись. Но потом, при проверке её, которая делается так: CryptCreateHash(hProv, CALG_GR3411, 0, 0, @hHash) CryptHashData(hHash, PBYTE(msg), len, 0) CryptVerifySignature(hHash, pbSign, dwSignLen, hPubKey, nil, 0) получаю ошибку 0x80090005 hPubKey получен вот так: CryptImportPublicKeyInfoEx( hProv, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, @CertContext.pCertInfo.SubjectPublicKeyInfo, CALG_GR3410, 0, nil, @hPublicKey) Что я делаю неправильно? (Сорри, всё это на паскале, но суть от этого не меняется) | ||||
Ответы: | ||||
| ||||
1. "both" означает, что создаётся только одна ключевая пара - AT_KEYEXCHANGE, которая используется как для обмена, так и для подписи. Это стандартный способ, реализованный в веб-интерфейсе Microsoft CA. 2. Судя по всему, сертификат выдан на кл. пару обмена, а подпись сделана на ключе AT_SIGNATURE. Поэтому она и не проверяется. | ||||