23.05.2006 13:44:06cryptoapi цифровая подпись Ответов: 23
Василий
Подписываю обычный текстовый файл с помощью CryptSignMessage:
procedure TForm1.N3Click(Sender: TObject);
var
hStoreHandle : HCERTSTORE;
pSignerCert: PCCERT_CONTEXT;
hProv: HCRYPTPROV;
enctype: Cardinal;
SigParams: CRYPT_SIGN_MESSAGE_PARA;
MessageArray: array of PByte;
MessageSize : array of DWORD;
Signed_MessageBlob: PByte;
cbSignedMessageBlob: DWord;
f1:file;
pSignerName: PWideChar;
begin

Memo.Clear;

hStoreHandle := CertOpenSystemStore(0,CERT_STORE_NAME);

if hStoreHandle = nil then
begin
Memo.Lines.Add('ОШИБКА ПРИ ОТКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end
else
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ОТКРЫТО');


enctype := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;

//получаем сертификат
GetMem(pSignerName,2*Length(SIGNER_NAME)+1);
StringToWideChar(SIGNER_NAME,pSignerName,2*Length(SIGNER_NAME)+1);
pSignerCert:= CertFindCertificateInStore(hStoreHandle,enctype,0,CERT_FIND_SUBJECT_STR,pSignerName,nil);
FreeMem(pSignerName);


if pSignerCert = nil then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('НЕ НАЙДЕН СЕРТИФИКАТ ' + SIGNER_NAME + ' ' + err);
exit;
end
else
Memo.Lines.Add('СЕРТИФИКАТ ' + SIGNER_NAME + ' НАЙДЕН');


if CertCloseStore(hStoreHandle,0) then
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ЗАКРЫТО')
else
begin
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end;

//получаем провайдер
if not CryptAcquireContext(@hProv, nil, PROVIDER_NAME, PROVIDER_TYPE,CRYPT_VERIFYCONTEXT) then
begin
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НЕ НАЙДЕН');
exit;
end
else
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НАЙДЕН');


FillChar(SigParams, sizeof(CRYPT_SIGN_MESSAGE_PARA), #0);

with SigParams do begin
cbSize := sizeof(CRYPT_SIGN_MESSAGE_PARA);
dwMsgEncodingType := enctype;
pSigningCert := pSignerCert;
HashAlgorithm.pszObjId := szOID_RSA_MD2; cMsgCert := 1;
rgpMsgCert := @pSignerCert;
end;


SetLength(MessageArray, sizeof(PByte));
SetLength(MessageSize, sizeof(DWORD));

AssignFile(f1,srcFile);

Reset(f1, 1);

MessageSize[0] := FileSize(f1);
GetMem(MessageArray[0], MessageSize[0]);

BlockRead(f1, MessageArray[0]^, MessageSize[0]);
CloseFile(f1);


if CryptSignMessage(@SigParams,true,1,MessageArray,MessageSize,nil,@cbSignedMessageBlob) then
Memo.Lines.Add(Format('CryptSignMessage first - done.'+#13#10+'The size of the BLOB is %d.',[cbSignedMessageBlob]))
else
Memo.Lines.Add('CryptSignMessage first - Error');
//Exception.Create('CryptSignMessage first - Error');


GetMem(Signed_MessageBlob, cbSignedMessageBlob);
//SetLength(Signed_MessageBlob, cbSignedMessageBlob);
if CryptSignMessage(@SigParams,true,1,MessageArray,MessageSize,Signed_MessageBlob,@cbSignedMessageBlob) then
begin
Memo.Lines.Add(Format('CryptSignMessage second - done'+#13#10+'The size of the BLOB is %d.',[cbSignedMessageBlob]));

AssignFile(f1,detSignFile);
Rewrite(f1, 1);
BlockWrite(f1, Signed_MessageBlob, cbSignedMessageBlob);
CloseFile (f1);
end
else
Memo.Lines.Add('CryptSignMessage second - Error');

FreeMem(Signed_MessageBlob);

//Закрываем провайдер
if not CryptReleaseContext(hProv, 0) then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ КОНТЕКСТА ПРОВАЙДЕРА: ' + err);
end
else
Memo.Lines.Add('КОНТЕКСТ ПРОВАЙДЕРА '+PROVIDER_NAME+' ЗАКРЫТ');

end;

Подпись проходит без видимых ошибок, но проверка подписи с помощью CryptVerifyDetachedMessageSignature выдаёт, что подпись неверна:
procedure TForm1.N21Click(Sender: TObject);
var
hStoreHandle : HCERTSTORE; //хранилище
enctype: cardinal; //формат данных
pSignerCert: PCCERT_CONTEXT; //сертификат
pSignerName: PWideChar; //SIGNER
VerifyPara: CRYPT_VERIFY_MESSAGE_PARA;
err:string;
hProv: HCRYPTPROV;
Sign: PByte;
SignSize: DWORD;
f1: file;
MessageArray: pacarPbyte;
MessageSize : pacarDWORD;
function MySignerCertificateCallback(pvGetArg : pvoid;dwCertEncodingType : DWORD;pSignerId : PCERT_INFO;hMsgCertStore : HCERTSTORE): PCCERT_CONTEXT ;
begin
result := PCCERT_CONTEXT(pvGetArg);
end;

begin

Memo.Clear;

hStoreHandle := CertOpenSystemStore(0,CERT_STORE_NAME);

if hStoreHandle = nil then
begin
Memo.Lines.Add('ОШИБКА ПРИ ОТКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end
else
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ОТКРЫТО');


enctype := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;

//получаем сертификат
GetMem(pSignerName,2*Length(SIGNER_NAME)+1);
StringToWideChar(SIGNER_NAME,pSignerName,2*Length(SIGNER_NAME)+1);
pSignerCert:= CertFindCertificateInStore(hStoreHandle,enctype,0,CERT_FIND_SUBJECT_STR,pSignerName,nil);
FreeMem(pSignerName);

if pSignerCert = nil then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('НЕ НАЙДЕН СЕРТИФИКАТ ' + SIGNER_NAME + ' ' + err);
exit;
end
else
Memo.Lines.Add('СЕРТИФИКАТ ' + SIGNER_NAME + ' НАЙДЕН');


if CertCloseStore(hStoreHandle,0) then
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ЗАКРЫТО')
else
begin
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end;

//получаем провайдер
if not CryptAcquireContext(@hProv, nil, PROVIDER_NAME, PROVIDER_TYPE,CRYPT_VERIFYCONTEXT) then
begin
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НЕ НАЙДЕН');
exit;
end
else
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НАЙДЕН');

// Заполняем структуру CRYPT_VERIFY_MESSAGE_PARA
VerifyPara.cbSize := SizeOf(CRYPT_VERIFY_MESSAGE_PARA);
VerifyPara.dwMsgAndCertEncodingType := enctype;
VerifyPara.hCryptProv := hProv;
VerifyPara.pfnGetSignerCertificate := @MySignerCertificateCallback;
VerifyPara.pvGetArg := pSignerCert;

//Считываем подпись
AssignFile(f1,detSignFile);
Reset(f1, 1);


SignSize := FileSize(f1);
GetMem(Sign, SignSize);

BlockRead(f1,Sign^,SignSize);
CloseFile(f1);

//Считываем Исходный файл
SetLength(MessageArray, sizeof(PByte));
SetLength(MessageSize, sizeof(DWORD));

AssignFile(f1,srcFile);
Reset(f1, 1);

MessageSize[0] := FileSize(f1);
GetMem(MessageArray[0], MessageSize[0]);

BlockRead(f1, MessageArray[0]^, MessageSize[0]);
CloseFile (f1);



if CryptVerifyDetachedMessageSignatureMy(@VerifyPara,
0,
Sign,
SignSize,
1,
MessageArray,
MessageSize,
pSignerCert) then
begin
Memo.Lines.Add('ПОДПИСЬ ВЕРНА');
end
else
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('ПОДПИСЬ НЕВЕРНА:' + err);
end;

//Закрываем провайдер
if not CryptReleaseContext(hProv, 0) then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ КОНТЕКСТА ПРОВАЙДЕРА: ' + err);
end
else
Memo.Lines.Add('КОНТЕКСТ ПРОВАЙДЕРА '+PROVIDER_NAME+' ЗАКРЫТ');


FreeMem(Sign);
FreeMem(MessageArray[0], MessageSize[0]);
end;
В чём может быть проблема?
 
Ответы:
23.05.2006 14:35:38Kirill Sobolev
подпись неверна с какой ошибкой? 0x80091007?
23.05.2006 14:42:55Василий
нет. GetLastError выдаёт 2148086027, что в HEX: 8009310B
23.05.2006 15:01:37Василий
И что интересно, такая же ошибка (2148086027) выдаётся при использовании CryptSignMessage и CryptVerifyMessageSignature:

//Подписать
procedure TForm1.N4Click(Sender: TObject);
var
hStoreHandle : HCERTSTORE; //хранилище

pSignerCert: PCCERT_CONTEXT;
hProv: HCRYPTPROV;
err : string;

enctype: Cardinal;
SigParams: CRYPT_SIGN_MESSAGE_PARA;

MessageArray: array of PByte;
MessageSize : array of DWORD;

Signed_MessageBlob: PByte;
cbSignedMessageBlob: DWord;

f1:file;
pSignerName: PWideChar; //SIGNER
begin

Memo.Clear;

hStoreHandle := CertOpenSystemStore(0,CERT_STORE_NAME);

if hStoreHandle = nil then
begin
Memo.Lines.Add('ОШИБКА ПРИ ОТКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end
else
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ОТКРЫТО');


enctype := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;

//получаем сертификат
GetMem(pSignerName,2*Length(SIGNER_NAME)+1);
StringToWideChar(SIGNER_NAME,pSignerName,2*Length(SIGNER_NAME)+1);
pSignerCert:= CertFindCertificateInStore(hStoreHandle,enctype,0,CERT_FIND_SUBJECT_STR,pSignerName,nil);
FreeMem(pSignerName);


if pSignerCert = nil then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('НЕ НАЙДЕН СЕРТИФИКАТ ' + SIGNER_NAME + ' ' + err);
exit;
end
else
Memo.Lines.Add('СЕРТИФИКАТ ' + SIGNER_NAME + ' НАЙДЕН');


if CertCloseStore(hStoreHandle,0) then
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ЗАКРЫТО')
else
begin
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end;

//получаем провайдер
if not CryptAcquireContext(@hProv, nil, PROVIDER_NAME, PROVIDER_TYPE,CRYPT_VERIFYCONTEXT) then
begin
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НЕ НАЙДЕН');
exit;
end
else
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НАЙДЕН');


FillChar(SigParams, sizeof(CRYPT_SIGN_MESSAGE_PARA), #0);

with SigParams do begin
cbSize := sizeof(CRYPT_SIGN_MESSAGE_PARA);
dwMsgEncodingType := enctype;
pSigningCert := pSignerCert;
HashAlgorithm.pszObjId := szOID_RSA_MD2;
cMsgCert := 1;
rgpMsgCert := @pSignerCert;
end;


SetLength(MessageArray, sizeof(PByte));
SetLength(MessageSize, sizeof(DWORD));

AssignFile(f1,srcFile);

Reset(f1, 1);

MessageSize[0] := FileSize(f1);
GetMem(MessageArray[0], MessageSize[0]);

BlockRead(f1, MessageArray[0]^, MessageSize[0]);
CloseFile (f1);


if CryptSignMessage(@SigParams,false,1,MessageArray,MessageSize,nil,@cbSignedMessageBlob) then
Memo.Lines.Add(Format('CryptSignMessage first - done.'+#13#10+'The size of the BLOB is %d.',[cbSignedMessageBlob]))
else
Memo.Lines.Add('CryptSignMessage first - Error');



GetMem(Signed_MessageBlob, cbSignedMessageBlob);
if CryptSignMessage(@SigParams,true,1,MessageArray,MessageSize,Signed_MessageBlob,@cbSignedMessageBlob) then
begin
Memo.Lines.Add(Format('CryptSignMessage second - done'+#13#10+'The size of the BLOB is %d.',[cbSignedMessageBlob]));

AssignFile(f1,attSignFile);
Rewrite(f1, 1);
BlockWrite(f1, Signed_MessageBlob, cbSignedMessageBlob);
CloseFile (f1);

end
else
Memo.Lines.Add('CryptSignMessage second - Error');

FreeMem(Signed_MessageBlob);

//Закрываем провайдер
if not CryptReleaseContext(hProv, 0) then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ КОНТЕКСТА ПРОВАЙДЕРА: ' + err);
end
else
Memo.Lines.Add('КОНТЕКСТ ПРОВАЙДЕРА '+PROVIDER_NAME+' ЗАКРЫТ');


end;
//Проверить
procedure TForm1.N5Click(Sender: TObject);
var
hStoreHandle : HCERTSTORE; //хранилище
enctype: cardinal; //формат данных
pSignerCert: PCCERT_CONTEXT; //сертификат
pSignerName: PWideChar; //SIGNER
VerifyPara: CRYPT_VERIFY_MESSAGE_PARA;
err:string;
hProv: HCRYPTPROV;
Sign: PByte;
SignSize: DWORD;
f1: file;

Signed_MessageBlob: PByte;
cbSignedMessageBlob: DWord;

DecMessageBlob: PByte;
cbDecMessageBlob: DWord;

function MySignerCertificateCallback( pvGetArg : pvoid; dwCertEncodingType : DWORD;pSignerId : PCERT_INFO;hMsgCertStore : HCERTSTORE): PCCERT_CONTEXT ;
begin
Result := PCCERT_CONTEXT(pvGetArg);
end;
begin

Memo.Clear;

hStoreHandle := CertOpenSystemStore(0,CERT_STORE_NAME);

if hStoreHandle = nil then
begin
Memo.Lines.Add('ОШИБКА ПРИ ОТКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end
else
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ОТКРЫТО');


enctype := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;

//получаем сертификат
GetMem(pSignerName,2*Length(SIGNER_NAME)+1);
StringToWideChar(SIGNER_NAME,pSignerName,2*Length(SIGNER_NAME)+1);
pSignerCert:= CertFindCertificateInStore(hStoreHandle,enctype,0,CERT_FIND_SUBJECT_STR,pSignerName,nil);
FreeMem(pSignerName);

if pSignerCert = nil then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('НЕ НАЙДЕН СЕРТИФИКАТ ' + SIGNER_NAME + ' ' + err);
exit;
end
else
Memo.Lines.Add('СЕРТИФИКАТ ' + SIGNER_NAME + ' НАЙДЕН');


if CertCloseStore(hStoreHandle,0) then
Memo.Lines.Add('ХРАНИЛИЩЕ ' + CERT_STORE_NAME + ' ЗАКРЫТО')
else
begin
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ ХРАНИЛИЩА '+ CERT_STORE_NAME);
exit;
end;

//получаем провайдер
if not CryptAcquireContext(@hProv, nil, PROVIDER_NAME, PROVIDER_TYPE,CRYPT_VERIFYCONTEXT) then
begin
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НЕ НАЙДЕН');
exit;
end
else
Memo.Lines.Add('ПРОВАЙДЕР '+PROVIDER_NAME+' НАЙДЕН');

// Заполняем структуру CRYPT_VERIFY_MESSAGE_PARA
with VerifyPara do
begin
cbSize := SizeOf(CRYPT_VERIFY_MESSAGE_PARA);
dwMsgAndCertEncodingType := enctype;
hCryptProv := hProv;
pfnGetSignerCertificate := @MySignerCertificateCallback;
pvGetArg := pSignerCert;
end;

//Считываем подпись
AssignFile(f1,attSignFile);
Reset(f1, 1);
cbSignedMessageBlob := FileSize(f1);
GetMem(Signed_MessageBlob, cbSignedMessageBlob);
BlockRead(f1,Signed_MessageBlob^,cbSignedMessageBlob);
CloseFile(f1);


DecMessageBlob := nil;
cbDecMessageBlob := 0;

if CryptVerifyMessageSignature(@VerifyPara,
0,
Signed_MessageBlob,
cbSignedMessageBlob,
DecMessageBlob,
cbDecMessageBlob,
pSignerCert) then
begin
Memo.Lines.Add('ПОДПИСЬ ВЕРНА');
end
else
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('ПОДПИСЬ НЕВЕРНА: ' + err);
end;

//Закрываем провайдер
if not CryptReleaseContext(hProv, 0) then
begin
err := getErrorString(GetLastError);
Memo.Lines.Add('ОШИБКА ПРИ ЗАКРЫТИИ КОНТЕКСТА ПРОВАЙДЕРА: ' + err);
end
else
Memo.Lines.Add('КОНТЕКСТ ПРОВАЙДЕРА '+PROVIDER_NAME+' ЗАКРЫТ');


FreeMem(Signed_MessageBlob);
end;


23.05.2006 16:20:00Kirill Sobolev
Это ошибка "Встречено неверное значение тега ASN1."
Дело не в CryptoAPI а в неверной записи/считывании файла либо в неверном указании его длины.
23.05.2006 16:42:41Василий
Проверил.Всё считывается и записывается байт в байт. Может что-то с параметрами? Единственное, при первом вызове CryptSignMessage возвращается размер подписи 1148, а при втором (при получении самой подписи) - 1132
23.05.2006 16:45:18Василий
А может файл надо упаковывыть определённым образом перед передачей функции CryptSignMessage? я просто передаю то, что считал
23.05.2006 16:46:47Василий
Есть где-нибудь рабочий пример работы с этими функциями на Delphi (я имею в виду проект целиком а не кусок кода)?
23.05.2006 17:41:37Kirill Sobolev
То что CryptSignMessage возвращает разный размер это нормально.
Попробуйте csptest подписать и проверить.
23.05.2006 18:14:23Василий
При использовании csptest для проверки подписи, пишет, что режим проверки записи <Verify> отключён. У меня тестовая версия Крипто Про CSP и тестовый сертификат.Как включить этот режим?
24.05.2006 10:18:07Kirill Sobolev
Так проверка подписи как раз будет работать даже если лицензия на CSP истекла. А от того, где был получен сертификат это вообще не зависит.
С какими параметрами Вы запускаете csptest и какое исходное сообщение о Verify он выдает?
24.05.2006 11:19:50Василий
сначала запустил
csptest -sfsign -in src_mes.txt -out cspt_detsig.txt -my basil -sign -detached

На выходе получил:
Source message length: 141
Calculated signature (or signed message) length: 394
Signature was done. Signature (or signed message) length: 378
Output file (cspt_detsig.txt) has been saved
Total: SYS: 0.063 sec USR: 0.266 sec UTC: 10.484 sec
[ErrorCode: 0x00000000]
Затем запускаю проверку:
csptest -sfsign -in src_mes.txt -my basil -verify -detached -signature
На выходе получил:
Режим проверки записи (VERIFY) отключен.

24.05.2006 12:11:24Kirill Sobolev
Параметр signature требует указания имени файла с подписью.
24.05.2006 12:21:51Василий
Попробовал
csptest -sfsign -in src_mes.txt -my basil -verify -detached -signature cspt_detsig.txt

То же сообщение.
24.05.2006 12:51:07Василий
Получилось.
csptest -sfsign -in src_mes.txt -my basil -verify -detached -signature cspt_detsig.txt

Пишет: Detached Signature war verified OK.
Но вот в программе то не получается..
24.05.2006 14:04:45Kirill Sobolev
Что именно не получается? Подпись на дельфи и проверка csptest или наоборот - подпись csptest и проверка в дельфи?
24.05.2006 14:18:17Василий
Подписываю с помощью csptest, проверяю на delphi -> вылетает Access Violation Read Address 00000003.

Подписываю с помощью delphi, проверяю на csptest -> Режим проверки записи (VERIFY) отключен.
24.05.2006 14:18:31Василий
Подписываю с помощью csptest, проверяю на delphi -> вылетает Access Violation Read Address 00000003.

Подписываю с помощью delphi, проверяю на csptest -> Режим проверки записи (VERIFY) отключен.
24.05.2006 14:19:51Василий
Подписываю с помощью csptest, проверяю на delphi -> вылетает Access Violation Read Address 00000003.

Подписываю с помощью delphi, проверяю на csptest -> Режим проверки записи (VERIFY) отключен.
24.05.2006 17:25:26Василий
Вот после нескольких попыток, получил:

csptest -sfsign -in src_mes.txt -out detached_sign.txt -my basil_sign -sign -detached

ВОЗВРАЩАЕТ:
CSP (Type:71) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
CSP (Type:75) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
#0: basil_sign, RU
Valid from 24.05.2006 to 24.05.2007

Source message length: 141
Calculated signature (or signed message) length: 394
Signature was done. Signature (or signed message) length: 378
Output file (detached_sign.txt) has been saved
Total: SYS: 0.141 sec USR: 0.250 sec UTC: 6.031 sec
[ErrorCode: 0x00000000]

ПРОВЕРКА
csptest -sfsign -in src_mes.txt -my basil_sign -verify -signature detached_sign.txt

ВОЗВРАЩАЕТ:

CSP (Type:71) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
CSP (Type:75) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
#0: basil_sign, RU
Valid from 24.05.2006 to 24.05.2007
An error occurred in running the program.
.\signtsf.c:605:Signature was NOT verified
Error number 8009310b (-2146881269).
Встречено неверное значение тега ASN1.
Total: SYS: 0.063 sec USR: 0.078 sec UTC: 0.140 sec
[ErrorCode: 0x8009310b]

Получается проблема не в Delphi - коде?!
24.05.2006 17:25:59Василий
Вот после нескольких попыток, получил:

csptest -sfsign -in src_mes.txt -out detached_sign.txt -my basil_sign -sign -detached

ВОЗВРАЩАЕТ:
CSP (Type:71) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
CSP (Type:75) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
#0: basil_sign, RU
Valid from 24.05.2006 to 24.05.2007

Source message length: 141
Calculated signature (or signed message) length: 394
Signature was done. Signature (or signed message) length: 378
Output file (detached_sign.txt) has been saved
Total: SYS: 0.141 sec USR: 0.250 sec UTC: 6.031 sec
[ErrorCode: 0x00000000]

ПРОВЕРКА
csptest -sfsign -in src_mes.txt -my basil_sign -verify -signature detached_sign.txt

ВОЗВРАЩАЕТ:

CSP (Type:71) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
CSP (Type:75) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED.
#0: basil_sign, RU
Valid from 24.05.2006 to 24.05.2007
An error occurred in running the program.
.\signtsf.c:605:Signature was NOT verified
Error number 8009310b (-2146881269).
Встречено неверное значение тега ASN1.
Total: SYS: 0.063 sec USR: 0.078 sec UTC: 0.140 sec
[ErrorCode: 0x8009310b]

Получается проблема не в Delphi - коде?!
25.05.2006 10:52:20Kirill Sobolev
ответил в http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2670
05.11.2007 14:07:21Debbie
Hi! Nice site! I wish you well!
05.11.2007 14:08:49Mike
Hi! Nice site! I wish you well!