Статус: Новичок
Группы: Участники
Зарегистрирован: 29.02.2008(UTC) Сообщений: 2 Откуда: Омск
|
День добрый. Использую WinAPI Crypt2. Создал самоподписанный сертификат и экспериментировал на нем. Сертификат находился в хранилище Windows и успешно подписывал сообщения. Любой почтовый клиент мог его проверить на не изменяемость. Но пришла наконец лицензия на КриптоПро 3.0 и ключ созданный по ГОСТ Р 34.11/34.10-2001. Установил КриптоПро 3.0 ключевым контейнером являлась дискета. Сертификат ипортирован в хранилизе "Личные" ("MY"). Для подписи использую высокоуровневые функции CryptSignMessage. Но при использовании сертификата ГОСТ почтовые клиенты (TheBat и Outlook exp говорят что ЭЦП не верна...КриптоПро конечно установлен). Привожу листинг кода подписания блока письма (создание "smime.p7s"). К дискете как и положено 2 обращения, но возвращаемая длина Sign = 2828, при том что подписы TheBat = 2988. Прошу помощи, т.к. уже все перечитал...понимаю что тут где-то маленькая загвоздка, но никак не соображу((. Код:function SignMessage(MessageToSign: String; var Sign: String): Boolean;
var
CerType : Cardinal;
CERT_STORE_NAME,
SIGNER_NAME : PWideChar;
hStoreHandle : HCERTSTORE;
pSignerCert : PCCERT_CONTEXT;
SigParams : CRYPT_SIGN_MESSAGE_PARA;
sData, signature : PByte;
data : array[0..0] of PByte;
dwDataSizeArray : array[0..0] of DWORD;
cbSignedBlob : DWORD;
EMime : TIdEncoderMIME;
ini : TIniFile;
Store,SigNM : String;
hProv : HCRYPTPROV;
err, PassStr : String;
pass : PByte;
begin
try
ini := TIniFile.Create(FileIni);
CerType:= PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
//// Наименование персонального хранилища
Store:= ini.ReadString('Certificate','Store',''); // Store=FAT12\F0ADF00A\55060647.000\A181
SigNM:= ini.ReadString('Certificate','Owner_Cert_Sign','');
PassStr:=ini.ReadString('Certificate','Pass','');
ini.Free;
GetMem(SIGNER_NAME,(Length(SigNM)+1)*2);
GetMem(CERT_STORE_NAME,(Length(Store)+1)*2);
SIGNER_NAME:=StringToWideChar(SigNM,SIGNER_NAME,Length(SigNM)+1);
CERT_STORE_NAME:=StringToWideChar(Store,CERT_STORE_NAME,Length(Store)+1);
CryptAcquireContext(@hProv, PAnsiChar(Store),'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider', 75, 0) // все проходит без ошибок
pass := @PassStr[1];
//Пароль доступа к хранилищю, тож отрабатывает на ура.
CryptSetProvParam(
hProv,
PP_KEYEXCHANGE_PIN,
pass,
0)
hStoreHandle := CertOpenSystemStore(hProv,'MY');
// Получаем указатель на наш сертификат, всё находит.
pSignerCert:=CertFindCertificateInStore(
hStoreHandle,
CerType,
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME,
nil);
// Подписываем
GetMem(sData, Length(MessageToSign));
system.Move(Pointer(MessageToSign)^, sData^, Length(MessageToSign));
ZeroMemory(@sigParams, SizeOf(CRYPT_SIGN_MESSAGE_PARA));
//Параметры полей сертификата подписи
SigParams.cbSize := SizeOf(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType := CerType;
SigParams.pSigningCert := pSignerCert;
SigParams.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411; // szOID_CP_GOST_R3411 = '1.2.643.2.2.9'
SigParams.HashAlgorithm.Parameters.cbData := 0;
SigParams.cMsgCert := 0;
SigParams.rgpMsgCert := nil;
SigParams.cMsgCrl := 0;
SigParams.cAuthAttr := 0;
SigParams.dwInnerContentType := 0;
SigParams.cMsgCrl := 0;
SigParams.cUnauthAttr := 0;
SigParams.dwFlags := 0;
SigParams.pvHashAuxInfo := nil;
SigParams.rgAuthAttr := nil;
data[0] := sData;
dwDataSizeArray[0] := Length(MessageToSign);
cbSignedBlob := 0;
CryptSignMessage(@sigParams,
False,
1,
@data[0],
@dwDataSizeArray[0],
nil,
@cbSignedBlob); //cbSignedBlob получаем равным 2136
GetMem(signature, cbSignedBlob);
CryptSignMessage(@sigParams,
False,
1,
@data[0],
@dwDataSizeArray[0],
signature,
@cbSignedBlob); //cbSignedBlob получаем равным 2120 - Так и должно быть???
SetLength(Sign, cbSignedBlob);
system.Move(signature^, Pointer(Sign)^, cbSignedBlob);
EMime:=TIdEncoderMIME.Create(Self);
EMime.FillChar:='=';
Sign:=EMime.Encode(Sign);
EMime.Free;
FreeMem(signature);
FreeMem(sData);
FreeMem(CERT_STORE_NAME);
FreeMem(SIGNER_NAME);
Result:=True;
// Освобождаем контекст
CertFreeCertificateContext(pSignerCert);
// Закрываем хранилище
CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG)
end;
Получаемое значение ЭЦП немного странное, т.е. в нем встречаются повторяющиеся блоки: Код:MIIIRAYJKoZIhvcNAQcCoIIINTCCCDECAQExDDAKBgYqhQMCAgkFADCCBwYGCSqGSIb3DQEH
AaCCBvcEggbzQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7DQogYm91bmRhcnk9Ij1f
..............................................................................................................................
IGZpbGVuYW1lPSJSZWVzdHJfMjAwOF9ZZWFyXzRfTW9udGhfNl9EQVlfMC5kYmYiDQoNCkEy
d0VCZ0FBQUFCQ0ErSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUJKVGtSZlRrVlhBQUFB
QUVNQkFBQUFCUUFBQUFBQQoNQUFBQUFBQUFBQUFBQUU1UFRWOU1TVU1BQUFBQVF3WUFBQUFJ
QUFBQUFBQUFBQUFBQUFBQUFBQUFVa0ZPUjBVQUFBQUFBQUJECg1EZ0FBQUFRQUFBQUFBQUFB
QUFBQUFBQUFBQUJFUVZSQlgxQUFBQUFBQUVRU0FBQUFDQUFBQUFBQUFBQUFBQUFBQUFBQUFG
QlMKDVQwTkVRVlJGQUFBQVJCb0FBQUFJQUFBQUFBQUFBQUFBQUFBQUFBQUFUbDlQVXdBQUFB
QUFBQUJESWdBQUFBTUFBQUFBQUFBQQoNQUFBQUFBQUFBQUJPWDB0QlUxTUFBQUFBQUVNbEFB
QUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFFNWZTMVpKVkFBQUFBQUFReVlBCg1BQUFFQUFBQUFB
QUFBQUFBQUFBQUFBQUFVRTlMUVZveEFBQUFBQUJPS2dBQUFBZ0NBQUFBQUFBQUFBQUFBQUFB
QUFCUVQwdEIKDVdqSUFBQUFBQUU0eUFBQUFDQUlBQUFBQUFBQUFBQUFBQUFBQUFGQlBTMEZh
TXdBQUFBQUFUam9BQUFBSUFnQUFBQUFBQUFBQQoNQUFBQUFBQUFVRTlMUVZvMEFBQUFBQUJP
UWdBQUFBZ0NBQUFBQUFBQUFBQUFBQUFBQUFCUVQwdEJXalVBQUFBQUFFNUtBQUFBCg1DQUlB
QUFBQUFBQUFBQUFBQUFBQUFFUkJWRjlRVDB0QldnQUFSRklBQUFBSUFBQUFBQUFBQUFBQUFB
QUFBQUFBVTFWTlRVRXgKDUFBQUFBQUJPV2dBQUFBd0NBQUFBQUFBQUFBQUFBQUFBQUFCVFZV
MU5RVElBQUFBQUFFNW1BQUFBREFJQUFBQUFBQUFBQUFBQQoNQUFBQUFGTlZUVTFCTXdBQUFB
QUFUbklBQUFBTUFnQUFBQUFBQUFBQUFBQUFBQUFBVTFWTlRVRTBBQUFBQUFCT2ZnQUFBQXdD
Cg1BQUFBQUFBQUFBQUFBQUFBQUFCVFZVMU5RVFVBQUFBQUFFNktBQUFBREFJQUFBQUFBQUFB
QUFBQUFBQUFBRk5WVFUxQk5nQUEKDUFBQUFUcFlBQUFBTUFnQUFBQUFBQUFBQUFBQUFBQUFB
VTFWTlRVRTNBQUFBQUFCT29nQUFBQXdDQUFBQUFBQUFBQUFBQUFBQQoNQUFCVFZVMU5RVGdB
QUFBQUFFNnVBQUFBREFJQUFBQUFBQUFBQUFBQUFBQUFBRk5WVFUxQk9RQUFBQUFBVHJvQUFB
QU1BZ0FBCg1BQUFBQUFBQUFBQUFBQUFBVTFWTlRVRXhNQUFBQUFCT3hnQUFBQXdDQUFBQUFB
QUFBQUFBQUFBQUFBQkpSRkJCV1FBQUFBQUEKDUFFUFNBQUFBRUFBQUFBQUFBQUFBQUFBQUFB
dTELMAkGA1UEBhMCUlUxITAfBgNVBAcMGNCV0LrQsNGC0LXRgNC40L3QsdGD0YDQszEuMCwG
A1UECgwl0JfQkNCeIMKr0J/QpCDCq9Ch0JrQkSDQmtC+0L3RgtGD0YDCuzEdMBsGA1UEAxMU
BQAEQIwggLglMwsunBxzFUwYoEO8FOuEVFvVhb3LMk40CiYf6sv7ISk54Xx5/jiajjKuyw1c
IEP/BUGhqiomE3zfjTk
Отредактировано пользователем 7 апреля 2008 г. 15:34:28(UTC)
| Причина: Не указана
|