Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 25.03.2019(UTC) Сообщений: 47  Откуда: Хабаровск Сказал(а) «Спасибо»: 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}]}}'));
 
 или обязательно надо создавать объект и еще: очень хотелось бы обойтись без правки файлов акробата, как это сделал Александр  
            
	  
         
     |