OpenSSL RSA_verify() Access Violation lazarus / 62-General ---------------------------------------------------------------------- Fibonacci · 2024-10-07 08:57 I guess Im doing something wrong and I dont see it Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i uses  SysUtils,  Classes,  openssl; const  //LIBCRYPTO = 'libcrypto.dll';  //LIBCRYPTO = 'libcrypto-1_1-x64.dll';  LIBCRYPTO = 'libcrypto-3-x64.dll'; function RSA_verify(typ:integer; m: PByte; m_length: cardinal; sigbuf: PByte; siglen: cardinal; rsa: PRSA): integer; cdecl; external LIBCRYPTO; function loadpub(path: string): PRSA;var  bio: PBIO;  evp: PEVP_PKEY;begin  result := nil;  bio := BIO_new_file(@path[1], 'r');  if bio = nil then exit;  evp := nil;  //evp := EvpPkeyNew;  result := PEM_read_bio_PUBKEY(bio, evp, nil, nil);end; var  r: integer;  message, signature: string;  rsa: PRSA;  f: PRSA_METHOD; begin  //if not InitSSLInterface then begin  //if not InitSSLInterface('libssl.dll', 'libcrypto.dll') then begin  //if not InitSSLInterface('libssl-1_1-x64.dll', 'libcrypto-1_1-x64.dll') then begin  if not InitSSLInterface('libssl-3-x64.dll', 'libcrypto-3-x64.dll') then begin    writeln('init ssl failed');    readln;    halt;  end;   message := 'message';  signature := 'signature';   //rsa := loadpub('public_key.pem');  rsa := loadpub('public_key_sign.pem');  writeln('rsa = ', inttohex(ptrint(rsa)));   try    // Access violation reading from address $0000000000000060.    f := RSA_get_method(rsa);    r := f^.rsa_verify(672{NID_sha256}, @message[1], length(message), @signature[1], length(signature), rsa);     // Access violation reading from address $0000000000000060.    //r := RSA_verify(672{NID_sha256}, @message[1], length(message), @signature[1], length(signature), rsa);  except    on E: Exception do writeln(e.Message);  end;   readln;end. ---------------------------------------------------------------------- Fibonacci · 2024-10-07 10:11 Solved using mormot, in case anyone interested: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i uses  SysUtils,  Classes,  mormot.crypt.rsa,  mormot.crypt.secure,  mormot.crypt.core; const  _PEM_SIGNATURE_FILE = 'D:\...\public_key_sign.pem';  _MESSAGE_FILE       = 'D:\...\plaintext.txt';  _SIGNATURE_FILE     = 'D:\...\rsa_signature.txt'; function loadfile(path: string): string;var  m: TMemoryStream;begin  if not FileExists(path) then exit('');  m := TMemoryStream.Create;  try    m.LoadFromFile(path);  setlength(result, m.Size);    m.Read(result[1], m.Size);  finally    m.Free;  end;end;  var  k: TRsa;  message, signature: string;  hash: TSha256Digest; begin  k := TRsa.Create;  try    k.LoadFromPublicKeyPem(loadfile(_PEM_SIGNATURE_FILE));     message := loadfile(_MESSAGE_FILE);    hash := Sha256Digest(message);     signature := loadfile(_SIGNATURE_FILE);     writeln('verify 1 = ', k.Verify(@hash[0], @signature[1], hfSHA256, length(signature)));    writeln('verify 2 = ', k.Verify(@hash[0], hfSHA256, signature));  finally       k.Free;  end;   readln;end. ---------------------------------------------------------------------- Thaddy · 2024-10-07 12:26 it failed because the structures are not initialized. Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i   rsa: PRSA;  f: PRSA_METHOD; ---------------------------------------------------------------------- Fibonacci · 2024-10-07 12:32 Quote from: Thaddy on October 07, 2024, 02:26:17 pmit failed because the structures are not initialized. Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i   rsa: PRSA;  f: PRSA_METHOD; PRSA type is Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i PRSA = SslPtr;SslPtr = Pointer; PRSA_METHOD is a record There is nothing to initialize ---------------------------------------------------------------------- Thaddy · 2024-10-07 13:11 The P suggests a pointer type. If not try {$packrecords C} but I seem to remember the are pointers to a BIO struct and a pointer to an EVP_KEY_ struct. [edit] I checked. They are pointers. see openssl.pas line 177