| ||||
| ||||
Подписываю обычный текстовый файл с помощью 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; В чём может быть проблема? | ||||
Ответы: | ||||
| ||||
подпись неверна с какой ошибкой? 0x80091007? | ||||
| ||||
нет. GetLastError выдаёт 2148086027, что в HEX: 8009310B | ||||
| ||||
И что интересно, такая же ошибка (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; | ||||
| ||||
Это ошибка "Встречено неверное значение тега ASN1." Дело не в CryptoAPI а в неверной записи/считывании файла либо в неверном указании его длины. | ||||
| ||||
Проверил.Всё считывается и записывается байт в байт. Может что-то с параметрами? Единственное, при первом вызове CryptSignMessage возвращается размер подписи 1148, а при втором (при получении самой подписи) - 1132 | ||||
| ||||
А может файл надо упаковывыть определённым образом перед передачей функции CryptSignMessage? я просто передаю то, что считал | ||||
| ||||
Есть где-нибудь рабочий пример работы с этими функциями на Delphi (я имею в виду проект целиком а не кусок кода)? | ||||
| ||||
То что CryptSignMessage возвращает разный размер это нормально. Попробуйте csptest подписать и проверить. | ||||
| ||||
При использовании csptest для проверки подписи, пишет, что режим проверки записи <Verify> отключён. У меня тестовая версия Крипто Про CSP и тестовый сертификат.Как включить этот режим? | ||||
| ||||
Так проверка подписи как раз будет работать даже если лицензия на CSP истекла. А от того, где был получен сертификат это вообще не зависит. С какими параметрами Вы запускаете csptest и какое исходное сообщение о Verify он выдает? | ||||
| ||||
сначала запустил 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) отключен. | ||||
| ||||
Параметр signature требует указания имени файла с подписью. | ||||
| ||||
Попробовал csptest -sfsign -in src_mes.txt -my basil -verify -detached -signature cspt_detsig.txt То же сообщение. | ||||
| ||||
Получилось. csptest -sfsign -in src_mes.txt -my basil -verify -detached -signature cspt_detsig.txt Пишет: Detached Signature war verified OK. Но вот в программе то не получается.. | ||||
| ||||
Что именно не получается? Подпись на дельфи и проверка csptest или наоборот - подпись csptest и проверка в дельфи? | ||||
| ||||
Подписываю с помощью csptest, проверяю на delphi -> вылетает Access Violation Read Address 00000003. Подписываю с помощью delphi, проверяю на csptest -> Режим проверки записи (VERIFY) отключен. | ||||
| ||||
Подписываю с помощью csptest, проверяю на delphi -> вылетает Access Violation Read Address 00000003. Подписываю с помощью delphi, проверяю на csptest -> Режим проверки записи (VERIFY) отключен. | ||||
| ||||
Подписываю с помощью csptest, проверяю на delphi -> вылетает Access Violation Read Address 00000003. Подписываю с помощью delphi, проверяю на csptest -> Режим проверки записи (VERIFY) отключен. | ||||
| ||||
Вот после нескольких попыток, получил: 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 - коде?! | ||||
| ||||
Вот после нескольких попыток, получил: 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 - коде?! | ||||
| ||||
ответил в http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2670 | ||||
| ||||
Hi! Nice site! I wish you well! | ||||
| ||||
Hi! Nice site! I wish you well! | ||||