У кого есть опыт по взаимодействию?
Надо подписывать УКЭП сообщения.
Кто посоветует - может у кого есть готовые решения?
Модератор: Модераторы
olegy123 писал(а):под линухом не в курсе
if not CryptAcquireCertificatePrivateKey(Cert, 0, nil, hProvider, @dwKeyType, @bReleaseContext) then
raise Exception.Create('CryptAcquireCertificatePrivateKey');
if Password <> NullString then
begin
sPasswd := (Password)+#0;
Passwd := AllocMem(Length(sPasswd));
Move(sPasswd[1], Passwd^, Length(sPasswd));
if not CryptSetProvParam(hProvider, PP_KEYEXCHANGE_PIN, Passwd, 0) then
raise Exception.Create('CryptSetProvParam');
Freemem(Passwd);
Passwd:=nil;
end;
end;
FillChar(SignParam, SizeOf(CRYPT_SIGN_MESSAGE_PARA), 0);
SignParam.cbSize:= SizeOf(CRYPT_SIGN_MESSAGE_PARA);
SignParam.dwMsgEncodingType:=MY_ENCODING;
SignParam.pSigningCert:=Cert;
SignParam.HashAlgorithm.pszObjId:= CertAlgIdToOID(CertOidToAlgId(cert^.CertInfo^.SignatureAlgorithm.pszObjId));
//SignParam.HashAlgorithm.pszObjId:= szOID_CP_GOST_R3411;
SignParam.cMsgCert:= 1;
SignParam.rgpMsgCert:=@Cert;
{$ifdef unix}
SignParam.dwFlags:=CRYPT_MESSAGE_SILENT_KEYSET_FLAG;
{$endif}
pbMessage:=AInBuf;
cbMessage:=AInBufSize;
try
MessageArray[0] := pbMessage;
MessageSize[0] := cbMessage;
cbSignMessage:= 0;
if not CryptSignMessage(@SignParam, True, 1, @MessageArray, @MessageSize, nil, cbSignMessage) then
raise Exception.Create('CryptSignMessage (size)');
pbSignMessage:= AllocMem(cbSignMessage);
if not CryptSignMessage(@SignParam, True, 1, @MessageArray, @MessageSize, pbSignMessage, cbSignMessage) then
raise Exception.Create('CryptSignMessage (sign)');
AOutBuf:= pbSignMessage;
AOutBufSize:= cbSignMessage;
Result := True;
finally
if bReleaseContext and (hProvider > 0) then
CryptReleaseContext(hProvider, 0);
end;
StoreName := PAnsiChar('MY');
FEngine := CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, StoreName);;
if Engine = nil then
raise Exception.Create('store not opened');
if FThumbprint <> '' then
Hash := StrToHashBlob(FThumbprint)
else
Hash := StrToHashBlob(LowerCase(FCertInfo.Thumbprint));
FCert := CertFindCertificateInStore(Engine, MY_ENCODING, 0, CERT_FIND_SHA1_HASH, @Hash, nil);
Freemem(Hash.pbData, Hash.cbData);
if FCert = nil then
raise Exception.Create('certificate not found');
public string getH5(string message)
{
byte[] msg = Encoding.UTF8.GetBytes(message);
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(contentInfo, true);
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.ReadOnly);
string singerName = "Тут имя сертификата (CN)";
X509Certificate2Collection certColl2 = storeMy.Certificates.Find(X509FindType.FindBySubjectName,
singerName, false);
storeMy.Close();
if (certColl2.Count == 0)
return "";
X509Certificate2 cert1 = certColl2[0];
CmsSigner cmsSigner = new CmsSigner(cert1);
signedCms.ComputeSignature(cmsSigner, false);
var r = signedCms.Encode();
return Convert.ToBase64String(r);
}
alexs писал(а):alps
Подскажи - где взять интерфейс к библиотекам криптопро на паскале?
А то самому заниматься переводом - не хочется. Времени много уйдёт.
Я пробую через комобъект - но это только для винды.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: Google [Bot] и гости: 1