Fórum Validar pin de certificado digital com wincrypt - Delphi #617917
13/04/2022
0
Estou com dificuldade em localizar a função na biblioteca wincrypt para autenticar o pin do usuario referente ao certificado digital, tem como alguem ajudar. Segue código.
function GetCertificado: boolean;
var
hStore: HCERTSTORE;
ACertContext: PCCERT_CONTEXT;
pProvKey: PCRYPT_KEY_PROV_INFO;
dwProvKeyInfoSize, dwKeySpec, pcbSignature: DWORD;
certString : string;
pfCallerFreeProv: LongBool;
ProviderOrKeyHandle: HCRYPTPROV_OR_NCRYPT_KEY_HANDLE;
mCryptProvider: HCRYPTPROV;
pSignatureAlgorithm: PCRYPT_ALGORITHM_IDENTIFIER;
n : Pointer;
pbSignature : PByte;
begin
Result := False;
hStore := nil;
try
hStore := CertOpenSystemStore(0, 'My');
ACertContext := CryptUIDlgSelectCertificateFromStore(hStore, 0,
'Selecione um Certificado',
'Selecione o Certificado que deseja utilizar:',
CRYPTUI_SELECT_LOCATION_COLUMN or CRYPTUI_SELECT_ISSUEDBY_COLUMN or
CRYPTUI_SELECT_INTENDEDUSE_COLUMN, 0, Nil);
if (Assigned(ACertContext)) and (ACertContext <> nil) and (GetCertIsHardware(ACertContext)) then
begin
certString := CertToDERBase64(ACertContext);
MsgAdverte('CERTIFICADO DIGITAL SELECIONADO = ' + #13 + certString);
if CryptAcquireCertificatePrivateKey( ACertContext,
CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG,
Nil,
ProviderOrKeyHandle,
dwKeySpec,
pfCallerFreeProv) then
begin
MsgAdverte
('Certificado foi selecionado. Certificado tem chave privada. Drivers do certificados encontrados');
if not GetCNGProviderIsHardware(ProviderOrKeyHandle) then
Exit;
MsgAdverte
('provedor do serviços de criptografia recuperado com sucesso ' + ProviderOrKeyHandle.ToString);
pProvKey := nil;
dwProvKeyInfoSize := 0;
if not CertGetCertificateContextProperty(ACertContext, CERT_KEY_PROV_INFO_PROP_ID, pProvKey, dwProvKeyInfoSize) then
MsgErro('CertGetCertificateContextProperty: erro')
else
MsgAdverte('CertGetCertificateContextProperty com sucesso ');
GetMem(pProvKey, dwProvKeyInfoSize);
if not CryptAcquireContext( mCryptProvider, Nil, Nil, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) then
MsgErro('CryptAcquireContext: provedor inválido')
else
MsgAdverte('CryptAcquireContext com sucesso ' + mCryptProvider.ToString);
//???? como validar o pin do certtificado digital selecionado acima?
end
else
RegUsuario.Mensagem := 'Drivers do certificado não encontrados';
end
else
begin
RegUsuario.Mensagem := 'Operação cancelada pelo usuário';
end;
finally
CertCloseStore(hStore, 0);
end;
end;
Marcos Barbosa
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)