Статус: Участник
Группы: Участники
Зарегистрирован: 25.03.2019(UTC) Сообщений: 27 Откуда: Хабаровск Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Автор: Андрей * Задача - перевести байты (сертификата) в hex-строку, а не отформатированную строку base64 в hex-строку.
с помощью Александра разобрался с hex-сертификатом, ниже рабочий код функции, поиск сертификата в хранилище происходит по отпечатку:
Код:function BytesToHex(Value: PAnsiChar; Count: Integer): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Count - 1 do
begin
Result := Result + IntToHex(Byte(Value[i]), 2);
end;
end;
function TForm1.GetCertificateHEX(Thumbprint: String; var Cert: PCCERT_CONTEXT): string;
var
buf : array of byte;
buflen : DWORD;
hStore : HCERTSTORE;
certHash : CRYPT_HASH_BLOB;
thumb : string;
certValue: string;
begin
Result := '';
if Assigned(Cert) then CertFreeCertificateContext(Cert);
thumb := trim(Thumbprint);
if length(thumb)=0 then Exit;
buflen := length(thumb) div 2;
SetLength(buf,buflen);
HexToBin(PChar(thumb),PChar(buf),buflen);
certHash.cbData:= buflen;
certHash.pbData:= PByte(buf);
//ищем сертификат в CURRENT_USER\MY\
hStore := CertOpenSystemStore(0,'MY');
Cert := CertFindCertificateInStore(hStore,
PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
0,
CERT_FIND_SHA1_HASH,
@certHash,
nil);
//Освобождаем ресурсы хранилища
CertCloseStore(hStore, CERT_CLOSE_STORE_CHECK_FLAG);
If not Assigned(Cert) then Exit;
SetLength(certValue, Cert.cbCertEncoded);
system.Move(Cert.pbCertEncoded^, Pointer(certValue)^, Cert.cbCertEncoded);
Result := BytesToHex(PAnsiChar(certValue), Cert.cbCertEncoded);
end;
сейчас вопрос про оформление. можно ли в принципе передать объект в виде строки? типа такого: Код: jso.CPSign(GetCertificateHEX(MyCert.Thumbprint, Cert), // certificateHEX
'', // pin
1, // pdfLockMode
'Причина: тест', // signReason
'Местоположение: тестовое', // signLocation
'контакт', // signContactInfo
'http://qs.cryptopro.ru/tsp/tsp.srf', // timeStamp
false, // bShowCertificatesDialog
false, // bShowSignDialogs
'{pageNumber: 0, coords: [122, 539, 422, 439], customAppearance: '
+'{font: "Calibri", borderStyle: border.s, borderColor: color.black, '
+' borderWidth: 1, textFields: [ {text: " ДОКУМЕНТ ПОДПИСАН \nЭЛЕКТРОННОЙ ПОДПИСЬЮ", '
+' coords: [50, 100, 250, 60]}, {type: "CN", coords: [10, 60, 300, 40], fontSize: 11}, '
+'{type: "SerialNumber", coords: [10, 40, 300, 20], fontSize: 11 }, '
+'{ text: "Компания: ООО \"КРИПТО-ПРО\"", coords: [10, 20, 300, 0], fontSize: 11}]}}'));
или обязательно надо создавать объект и еще: очень хотелось бы обойтись без правки файлов акробата, как это сделал Александр
|