03.02.2005 12:04:55ОПРЕДЕЛЕНИЕ ДЛИНЫ ПОДПИСЫВАЕМОГО СООБЩЕНИЯ Ответов: 9
Дробязко Алексей
И снова здравствуйте!
Возникла проблема в отработке функции 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 всегда в нуле.
Спасибо.
 
Ответы:
03.02.2005 14:09:09Юрий
Советую посмотреть код ошибки у последней функции (что возвращает функция GetLastError).
03.02.2005 14:40:32Дробязко Алексей
А где можно найти расшифровку ошибок для конкретной функции CryptoAPI?
03.02.2005 16:01:46Юрий
:) Уже смешно...

В MSDN!!! :)
03.02.2005 16:25:48Дробязко Алексей
Спасибо :))))
05.12.2006 5:15:03AleKo
Мне интерсно знать, получилось у Вас решить этот вопрос, сталкнулся с тем же.
05.12.2006 10:25:12Дробязко Алексей
to AleKo
Да, решил проблему. Но было давно это. Не помню, где был хомут. Могу выслать на малы процедуру наложения подписи.
05.12.2006 10:49:08AleKo
Если можно, буду очень благодарен.
Может у Вас есть другой вариант наложения нескольких подписей при формировании сообщения.
05.12.2006 10:52:03Дробязко Алексей
Так дайте мне Ваше мыло.
05.12.2006 10:54:39AleKo
Сюда пожалуйста:
return99@mail.ru