Добрый день!
Разбираюсь API - хотелось бы получить пояснения
Алгоритм валидации подписи
CADES_BES:
На входе имеются данные и
detached подпись.
CryptMsgOpenToDecode ( CMSG_DETACHED_FLAG)
CryptMsgUpdate (подпись)
CryptMsgUpdate (данные)
CadesMsgIsType - проверить тип подписи
CryptMsgGetParam -
вытягиваю все параметры которы получается - просто для теста - очевидно, что не все из них нужны
CMSG_SIGNER_COUNT_PARAM,CMSG_CRL_COUNT_PARAM,CMSG_CERT_PARAM,CMSG_COMPUTED_HASH_PARAM,CMSG_ENCRYPTED_DIGEST,CMSG_ENCODED_SIGNER,
CMSG_SIGNER_CERT_INFO_PARAM, CMSG_SIGNER_CERT_ID_PARAM, CMSG_SIGNER_CERT_ID_PARAM,CMSG_SIGNER_HASH_ALGORITHM_PARAM,CMSG_SIGNER_INFO_PARAM,
CRYPT_ATTRIBUTES
CMSG_SIGNER_CERT_INFO_PARAM позволяет вытащить
- версию сертификата
- серийный номер
- кем выдан (issuer)
- NotAfter и NotBefor - почему-то нулевые
- CRYPT_ALGORITHM_IDENTIFIER = 0
CERT_ID_ISSUER_SERIAL_NUMBER -
CMSG_SIGNER_HASH_ALGORITHM_PARAM
CMSG_SIGNER_INFO_PARAM
- алгоритм хэширования
- алгоритм шифрования
CMSG_SIGNER_AUTH_ATTR_PARAM -подписанные аттрибуты
- szOID_PKCS_9_CONTENT_TYPE
- szOID_RSA_signingTime - время подписи
- szOID_PKCS_9_MESSAGE_DIGEST - хэш данных
- szCPOID_RSA_SMIMEaaSigningCertificateV2 - наcколько понял CERT_ID
Пока речь идет о CADES_BES.
мои действия :
- CadesMsgGetSigningCertId (CERT_ID) - предплоложительно инфо о сертификате, взятое из подписанных аттрибутов
- получаю у CertCreateCertificateContext CERT_INFO
- сравниваю сертификат из пункта 1 с полученным из CMSG_CERT_PARAM - есть совпадение
- получаю алгоритм подписи = 34.10-2012 (256 бит)
- пулучаю public key и отправляю в СryptImportPublicKeyInfo
Проверки:1. CryptMsgControl (CMSG_CTRL_VERIFY_SIGNATURE...) - возвращает
TRUE2. Сравнение хэша открепленных данных с хэшом из szOID_PKCS_9_MESSAGE_DIGEST =
совпадение3. Сравнение хэшей с помощью CadesVerifyHash =
CADES_VERIFY_SUCCESS3. CryptVerifyDetachedMessageSignature -CryptVerifyDetachedMessageSignature =
TRUEСоответсвенно вопросы (предположения):1. Чем иммено отличются проверки CryptMsgControl CadesVerifyHash CryptVerifyDetachedMessageSignature
Создается впечатление -что они дублируют друг друга
2. правильно ли я понимаю что вычислить значение CMSG_ENCRYPTED_DIGEST из данных для
проверки без вызова CSP - сложно или невозможно
причем с раскодированием - тоже сложно или невозможно
3. CMSG_COMPUTED_HASH_PARAM - хэш ASN1 предсавления подписанных атрибутов (RFC 3852)
4. CMSG_COMPUTED_HASH_PARAM и CMSG_ENCRYPTED_DIGEST должны проверяться одной (или всеми)
проверками из списка проверок ?
5. Все проверки из списка выше, проверяют только хэши/подписи и для проверки
цепочки сертификатов необходимы дальнейшие дейсвия.
Примеры (С++) есть, почти все работают, но не дают полного понимания картины.
Заранее спасибо.