26.08.2003 18:23:45Проблемы с ЭЦП Ответов: 1
Дмитрий
Несколько вопросов по ЭЦП
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)

Что я делаю неправильно? (Сорри, всё это на паскале, но суть от этого не меняется)
 
Ответы:
01.09.2003 11:05:59Василий
1. "both" означает, что создаётся только одна ключевая пара - AT_KEYEXCHANGE, которая используется как для обмена, так и для подписи. Это стандартный способ, реализованный в веб-интерфейсе Microsoft CA.
2. Судя по всему, сертификат выдан на кл. пару обмена, а подпись сделана на ключе AT_SIGNATURE. Поэтому она и не проверяется.