| ||||
| ||||
И снова здравствуйте! Возникла проблема в отработке функции CryptMsgCalculateEncodedLength, постоянно возвращается 0. Не подскажете, что не так во фрагменте проги на Делфи: ---------------------------------------- VAR HashAlgorithm: CRYPT_ALGORITHM_IDENTIFIER; // Идентификатор алг-ма хеширования SignerEncodeInfo : MSG_SIGNER_ENCODE_INFO; // Структура, описывающая отправителя SignerEncodeInfoArray : array[1..1] of CMSG_SIGNER_ENCODE_INFO; // Массив структур, описывающих отправителя SignerCertBlob : CERT_BLOB; SignerCertBlobArray : array[1..1] of CERT_BLOB; cbEncodedBlob : DWORD; pbEncodedBlob : pbyte; SignedMsgEncodeInfo : CMSG_SIGNED_ENCODE_INFO; // Структура, описывающая подписанное сообщение flags : DWORD; OID : string; OID := ’szOID_RSA_MD5’; // -------------------------------------------------------------------- // Инициализируем структуру алгоритма HashAlgorithm.pszObjId := pansichar(OID); // Идентификатор алгоритма хэша // -------------------------------------------------------------------- // Инициализируем структуру CMSG_SIGNER_ENCODE_INFO SignerEncodeInfo.cbSize := sizeof(CMSG_SIGNER_ENCODE_INFO); SignerEncodeInfo.pCertInfo := pUserCert^.pCertInfo; SignerEncodeInfo.hCryptProv := hProv; SignerEncodeInfo.dwKeySpec := keytype; SignerEncodeInfo.HashAlgorithm := HashAlgorithm; SignerEncodeInfo.pvHashAuxInfo := NIL; SignerEncodeInfo.cAuthAttr := 0; SignerEncodeInfo.rgAuthAttr := NIL; SignerEncodeInfo.cUnauthAttr := 0; SignerEncodeInfo.rgUnauthAttr := NIL; // -------------------------------------------------------------------- // Создадим массив отправителей. Сейчас только из одного. SignerEncodeInfoArray[1] := SignerEncodeInfo; // -------------------------------------------------------------------- // Инициализируем структуру CMSG_SIGNED_ENCODE_INFO SignerCertBlob.cbData := pUserCert^.cbCertEncoded; SignerCertBlob.pbData := pUserCert^.pbCertEncoded; SignerCertBlobArray[1] := SignerCertBlob; // -------------------------------------------------------------------- // Инициализируем структуру массив структур CertBlob. SignedMsgEncodeInfo.cbSize := sizeof(CMSG_SIGNED_ENCODE_INFO); SignedMsgEncodeInfo.cSigners := 1; SignedMsgEncodeInfo.rgSigners := @SignerEncodeInfoArray; SignedMsgEncodeInfo.cCertEncoded := include; // Если задан флаг добавления сертификата отправителя if ( include = 1 ) Then SignedMsgEncodeInfo.rgCertEncoded := @SignerCertBlobArray; else SignedMsgEncodeInfo.rgCertEncoded := NIL; SignedMsgEncodeInfo.rgCrlEncoded := NIL; if (detached) flags := CMSG_DETACHED_FLAG; // -------------------------------------------------------------------- // Определим длину подписанного сообщения cbEncodedBlob := CryptMsgCalculateEncodedLength( TYPE_DER, // Message encoding type flags, // Flags CMSG_SIGNED, // Message type @SignedMsgEncodeInfo, // Pointer to structure NIL, // Inner content object ID mem_len // Size of content ); ---------------------------------------- cbEncodedBlob всегда в нуле. Спасибо. | ||||
Ответы: | ||||
| ||||
Советую посмотреть код ошибки у последней функции (что возвращает функция GetLastError). | ||||
| ||||
А где можно найти расшифровку ошибок для конкретной функции CryptoAPI? | ||||
| ||||
:) Уже смешно... В MSDN!!! :) | ||||
| ||||
Спасибо :)))) | ||||
| ||||
Мне интерсно знать, получилось у Вас решить этот вопрос, сталкнулся с тем же. | ||||
| ||||
to AleKo Да, решил проблему. Но было давно это. Не помню, где был хомут. Могу выслать на малы процедуру наложения подписи. | ||||
| ||||
Если можно, буду очень благодарен. Может у Вас есть другой вариант наложения нескольких подписей при формировании сообщения. | ||||
| ||||
Так дайте мне Ваше мыло. | ||||
| ||||
Сюда пожалуйста: return99@mail.ru | ||||