Browse Source

OpenSSL: add support for OSSL_PARAM, EVP_PKEY_encrypt, EVP_PKEY_decrypt

Jan Rysavy 1 year ago
parent
commit
08bae9ee2e
1 changed files with 161 additions and 0 deletions
  1. 161 0
      packages/openssl/src/openssl.pas

+ 161 - 0
packages/openssl/src/openssl.pas

@@ -149,6 +149,19 @@ const
 
   SHA_DIGEST_LENGTH = 20;
 
+const
+  OSSL_PKEY_PARAM_PAD_MODE = 'pad-mode';
+  OSSL_ASYM_CIPHER_PARAM_PAD_MODE = OSSL_PKEY_PARAM_PAD_MODE;
+  OSSL_PKEY_RSA_PAD_MODE_NONE = 'none';
+  OSSL_PKEY_RSA_PAD_MODE_PKCSV15 = 'pkcs1';
+  OSSL_PKEY_RSA_PAD_MODE_OAEP = 'oaep';
+  OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL = 'oaep-label';
+  OSSL_ALG_PARAM_DIGEST = 'digest';
+  OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST = OSSL_ALG_PARAM_DIGEST;
+  OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS = 'digest-props';
+  SN_sha256 = 'SHA256';
+  LN_sha256 = 'sha256';
+
 type
   uint64_t = qword;
   SslPtr = Pointer;
@@ -168,6 +181,10 @@ type
   PASN1_INTEGER = SSlPtr;
   POPENSSL_INIT_SETTINGS = SSLPtr;
 
+  POSSL_LIB_CTX = pointer;
+  POSSL_PARAM = pointer;
+  POSSL_PARAM_BLD = pointer;
+
   PDH = pointer;
   PSTACK_OFX509 = pointer;
 
@@ -1295,6 +1312,12 @@ var
   procedure OpenSSL_add_all_ciphers;
   procedure OpenSSL_add_all_digests;
   //
+  function OSSL_PARAM_BLD_new: POSSL_PARAM_BLD;
+  function OSSL_PARAM_BLD_push_utf8_string(bld: POSSL_PARAM_BLD; key: PAnsiChar; const buf: PAnsiChar; bsize: csize_t): integer;
+  function OSSL_PARAM_BLD_to_param(bld: POSSL_PARAM_BLD): POSSL_PARAM;
+  procedure OSSL_PARAM_BLD_free(bld: POSSL_PARAM_BLD);
+  procedure OSSL_PARAM_free(params: POSSL_PARAM);
+  //
   function EVP_DigestInit(ctx: PEVP_MD_CTX; type_: PEVP_MD): cint;
   function EVP_DigestUpdate(ctx: PEVP_MD_CTX; const data: Pointer; cnt: csize_t): cint;
   function EVP_DigestFinal(ctx: PEVP_MD_CTX; md: PByte; s: pcuint): cint;
@@ -1302,6 +1325,12 @@ var
     key: pEVP_PKEY): integer;
   function EVP_PKEY_size(key: pEVP_PKEY): integer;
   procedure EVP_PKEY_free(key: pEVP_PKEY);
+  function EVP_PKEY_encrypt_init_ex(ctx: PEVP_PKEY_CTX; params: POSSL_PARAM): integer;
+  function EVP_PKEY_encrypt(ctx: PEVP_PKEY_CTX; out_: PByte; var outlen: csize_t; const in_: PByte; inlen: csize_t): integer;
+  function EVP_PKEY_decrypt(ctx: PEVP_PKEY_CTX; out_: PByte; var outlen: csize_t; const in_: PByte; inlen: csize_t): integer;
+  procedure EVP_PKEY_CTX_free(ctx: PEVP_PKEY_CTX);
+  function EVP_PKEY_CTX_new_from_name(libctx: POSSL_LIB_CTX; const name: PAnsiChar; const propquery: PAnsiChar): PEVP_PKEY_CTX;
+  function EVP_PKEY_CTX_new_from_pkey(libctx: POSSL_LIB_CTX; const pkey: PEVP_PKEY; const propquery: PAnsiChar): PEVP_PKEY_CTX;
   function EVP_VerifyFinal(ctx: pEVP_MD_CTX; sigbuf: pointer;
     siglen: cardinal; pkey: pEVP_PKEY): integer;
   //
@@ -1771,6 +1800,12 @@ type
   TOpenSSL_add_all_ciphers = procedure(); cdecl;
   TOpenSSL_add_all_digests = procedure(); cdecl;
   //
+  TOSSL_PARAM_BLD_new = function: POSSL_PARAM_BLD; cdecl;
+  TOSSL_PARAM_BLD_push_utf8_string = function(bld: POSSL_PARAM_BLD; key: PAnsiChar; const buf: PAnsiChar; bsize: csize_t): integer; cdecl;
+  TOSSL_PARAM_BLD_to_param = function(bld: POSSL_PARAM_BLD): POSSL_PARAM; cdecl;
+  TOSSL_PARAM_BLD_free = procedure(bld: POSSL_PARAM_BLD); cdecl;
+  TOSSL_PARAM_free = procedure(params: POSSL_PARAM); cdecl;
+  //
   TEVP_DigestInit = function(ctx: PEVP_MD_CTX; type_: PEVP_MD): cint; cdecl;
   TEVP_DigestUpdate = function(ctx: PEVP_MD_CTX; const data: Pointer; cnt: csize_t): cint; cdecl;
   TEVP_DigestFinal = function(ctx: PEVP_MD_CTX; md: PByte; s: pcuint): cint; cdecl;
@@ -1779,6 +1814,12 @@ type
     key: pEVP_PKEY): integer; cdecl;
   TEVP_PKEY_size = function(key: pEVP_PKEY): integer; cdecl;
   TEVP_PKEY_free = Procedure(key: pEVP_PKEY); cdecl;
+  TEVP_PKEY_encrypt_init_ex = function(ctx: PEVP_PKEY_CTX; params: POSSL_PARAM): integer; cdecl;
+  TEVP_PKEY_encrypt = function(ctx: PEVP_PKEY_CTX; out_: PByte; var outlen: csize_t; const in_: PByte; inlen: csize_t): integer; cdecl;
+  TEVP_PKEY_decrypt = function(ctx: PEVP_PKEY_CTX; out_: PByte; var outlen: csize_t; const in_: PByte; inlen: csize_t): integer; cdecl;
+  TEVP_PKEY_CTX_free = procedure(pctx: PEVP_PKEY_CTX); cdecl;
+  TEVP_PKEY_CTX_new_from_name = function(libctx: POSSL_LIB_CTX; const name: PAnsiChar; const propquery: PAnsiChar): PEVP_PKEY_CTX; cdecl;
+  TEVP_PKEY_CTX_new_from_pkey = function(libctx: POSSL_LIB_CTX; const pkey: PEVP_PKEY; const propquery: PAnsiChar): PEVP_PKEY_CTX; cdecl;
   TEVP_VerifyFinal = function(ctx: pEVP_MD_CTX; sigbuf: pointer;
     siglen: cardinal; pkey: pEVP_PKEY): integer;  cdecl;
   //
@@ -2040,6 +2081,12 @@ var
   _OpenSSL_add_all_ciphers: TOpenSSL_add_all_ciphers = nil;
   _OpenSSL_add_all_digests: TOpenSSL_add_all_digests = nil;
   //
+  _OSSL_PARAM_BLD_new: TOSSL_PARAM_BLD_new = nil;
+  _OSSL_PARAM_BLD_push_utf8_string: TOSSL_PARAM_BLD_push_utf8_string = nil;
+  _OSSL_PARAM_BLD_to_param: TOSSL_PARAM_BLD_to_param = nil;
+  _OSSL_PARAM_BLD_free: TOSSL_PARAM_BLD_free = nil;
+  _OSSL_PARAM_free: TOSSL_PARAM_free = nil;
+//
   _EVP_DigestInit: TEVP_DigestInit = nil;
   _EVP_DigestUpdate: TEVP_DigestUpdate = nil;
   _EVP_DigestFinal: TEVP_DigestFinal = nil;
@@ -2047,6 +2094,13 @@ var
   _EVP_SignFinal: TEVP_SignFinal = nil;
   _EVP_PKEY_size: TEVP_PKEY_size = nil;
   _EVP_PKEY_free: TEVP_PKEY_free = nil;
+  _EVP_PKEY_encrypt_init_ex: TEVP_PKEY_encrypt_init_ex = nil;
+  _EVP_PKEY_encrypt: TEVP_PKEY_encrypt = nil;
+  _EVP_PKEY_decrypt: TEVP_PKEY_decrypt = nil;
+  _EVP_PKEY_CTX_free: TEVP_PKEY_CTX_free = nil;
+  _EVP_PKEY_CTX_new_from_name: TEVP_PKEY_CTX_new_from_name = nil;
+  _EVP_PKEY_CTX_new_from_pkey: TEVP_PKEY_CTX_new_from_pkey = nil;
+
   _EVP_VerifyFinal: TEVP_VerifyFinal = nil;
   //
   _EVP_get_cipherbyname: TEVP_get_cipherbyname = nil;
@@ -3633,6 +3687,42 @@ begin
      _OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_DIGESTS, Nil)
 end;
 //
+function OSSL_PARAM_BLD_new: POSSL_PARAM_BLD;
+begin
+  if InitSSLInterface and Assigned(_OSSL_PARAM_BLD_new) then
+    Result := _OSSL_PARAM_BLD_new
+  else
+    Result := nil;
+end;
+
+function OSSL_PARAM_BLD_push_utf8_string(bld: POSSL_PARAM_BLD; key: PAnsiChar; const buf: PAnsiChar; bsize: csize_t): integer;
+begin
+  if InitSSLInterface and Assigned(_OSSL_PARAM_BLD_push_utf8_string) then
+    Result := _OSSL_PARAM_BLD_push_utf8_string(bld, key, buf, bsize)
+  else
+    Result := 0;
+end;
+
+function OSSL_PARAM_BLD_to_param(bld: POSSL_PARAM_BLD): POSSL_PARAM;
+begin
+  if InitSSLInterface and Assigned(_OSSL_PARAM_BLD_to_param) then
+    Result := _OSSL_PARAM_BLD_to_param(bld)
+  else
+    Result := nil;
+end;
+
+procedure OSSL_PARAM_BLD_free(bld: POSSL_PARAM_BLD);
+begin
+  if InitSSLInterface and Assigned(_OSSL_PARAM_BLD_free) then
+    _OSSL_PARAM_BLD_free(bld);
+end;
+
+procedure OSSL_PARAM_free(params: POSSL_PARAM);
+begin
+  if InitSSLInterface and Assigned(_OSSL_PARAM_free) then
+    _OSSL_PARAM_free(params);
+end;
+//
 function EVP_DigestInit(ctx: PEVP_MD_CTX; type_: PEVP_MD): cint;
 begin
   if InitSSLInterface and Assigned(_EVP_DigestInit) then
@@ -3688,6 +3778,52 @@ begin
     _EVP_PKEY_free(key);
 end;
 
+function EVP_PKEY_encrypt_init_ex(ctx: PEVP_PKEY_CTX; params: POSSL_PARAM): integer;
+begin
+  if InitSSLInterface and Assigned(_EVP_PKEY_encrypt_init_ex) then
+    Result := _EVP_PKEY_encrypt_init_ex(ctx, params)
+  else
+    Result := -1;
+end;
+
+function EVP_PKEY_encrypt(ctx: PEVP_PKEY_CTX; out_: PByte; var outlen: csize_t; const in_: PByte; inlen: csize_t): integer;
+begin
+  if InitSSLInterface and Assigned(_EVP_PKEY_encrypt) then
+    Result := _EVP_PKEY_encrypt(ctx, out_, outlen, in_, inlen)
+  else
+    Result := -1;
+end;
+
+function EVP_PKEY_decrypt(ctx: PEVP_PKEY_CTX; out_: PByte; var outlen: csize_t; const in_: PByte; inlen: csize_t): integer;
+begin
+  if InitSSLInterface and Assigned(_EVP_PKEY_decrypt) then
+    Result := _EVP_PKEY_decrypt(ctx, out_, outlen, in_, inlen)
+  else
+    Result := -1;
+end;
+
+procedure EVP_PKEY_CTX_free(ctx: PEVP_PKEY_CTX);
+begin
+  if InitSSLInterface and Assigned(_EVP_PKEY_CTX_free) then
+    _EVP_PKEY_CTX_free(ctx);
+end;
+
+function EVP_PKEY_CTX_new_from_name(libctx: POSSL_LIB_CTX; const name: PAnsiChar; const propquery: PAnsiChar): PEVP_PKEY_CTX;
+begin
+  if InitSSLInterface and Assigned(_EVP_PKEY_CTX_new_from_name) then
+    Result := _EVP_PKEY_CTX_new_from_name(libctx, name, propquery)
+  else
+    Result := nil;
+end;
+
+function EVP_PKEY_CTX_new_from_pkey(libctx: POSSL_LIB_CTX; const pkey: PEVP_PKEY; const propquery: PAnsiChar): PEVP_PKEY_CTX;
+begin
+  if InitSSLInterface and Assigned(_EVP_PKEY_CTX_new_from_pkey) then
+    Result := _EVP_PKEY_CTX_new_from_pkey(libctx, pkey, propquery)
+  else
+    Result := nil;
+end;
+      
 function EVP_VerifyFinal(ctx: pEVP_MD_CTX; sigbuf: pointer;
     siglen: cardinal; pkey: pEVP_PKEY): integer;
 begin
@@ -5215,12 +5351,25 @@ begin
   _OpenSSL_add_all_algorithms := GetProcAddr(SSLUtilHandle, 'OpenSSL_add_all_algorithms');
   _OpenSSL_add_all_ciphers := GetProcAddr(SSLUtilHandle, 'OpenSSL_add_all_ciphers');
   _OpenSSL_add_all_digests := GetProcAddr(SSLUtilHandle, 'OpenSSL_add_all_digests');
+
+  _OSSL_PARAM_BLD_new := GetProcAddr(SSLUtilHandle, 'OSSL_PARAM_BLD_new');
+  _OSSL_PARAM_BLD_push_utf8_string := GetProcAddr(SSLUtilHandle, 'OSSL_PARAM_BLD_push_utf8_string');
+  _OSSL_PARAM_BLD_to_param := GetProcAddr(SSLUtilHandle, 'OSSL_PARAM_BLD_to_param');
+  _OSSL_PARAM_BLD_free := GetProcAddr(SSLUtilHandle, 'OSSL_PARAM_BLD_free');
+  _OSSL_PARAM_free := GetProcAddr(SSLUtilHandle, 'OSSL_PARAM_free');
+  //
   _EVP_DigestInit := GetProcAddr(SSLUtilHandle, 'EVP_DigestInit');
   _EVP_DigestUpdate := GetProcAddr(SSLUtilHandle, 'EVP_DigestUpdate');
   _EVP_DigestFinal := GetProcAddr(SSLUtilHandle, 'EVP_DigestFinal');
   _EVP_SignFinal := GetProcAddr(SSLUtilHandle, 'EVP_SignFinal');
   _EVP_PKEY_size := GetProcAddr(SSLUtilHandle,'EVP_PKEY_size');
   _EVP_PKEY_free := GetProcAddr(SSLUtilHandle,'EVP_PKEY_free');
+  _EVP_PKEY_encrypt_init_ex := GetProcAddr(SSLUtilHandle,'EVP_PKEY_encrypt_init_ex');
+  _EVP_PKEY_encrypt := GetProcAddr(SSLUtilHandle,'EVP_PKEY_encrypt');
+  _EVP_PKEY_decrypt := GetProcAddr(SSLUtilHandle,'EVP_PKEY_decrypt');
+  _EVP_PKEY_CTX_free := GetProcAddr(SSLUtilHandle,'EVP_PKEY_CTX_free');
+  _EVP_PKEY_CTX_new_from_name := GetProcAddr(SSLUtilHandle,'EVP_PKEY_CTX_new_from_name');
+  _EVP_PKEY_CTX_new_from_pkey := GetProcAddr(SSLUtilHandle,'EVP_PKEY_CTX_new_from_pkey');
   _EVP_VerifyFinal := GetProcAddr(SSLUtilHandle,'EVP_VerifyFinal');
   _EVP_get_cipherbyname := GetProcAddr(SSLUtilHandle, 'EVP_get_cipherbyname');
   _EVP_get_digestbyname := GetProcAddr(SSLUtilHandle, 'EVP_get_digestbyname');
@@ -5651,6 +5800,12 @@ begin
   _OpenSSL_add_all_ciphers := nil;
   _OpenSSL_add_all_digests := nil;
   //
+  _OSSL_PARAM_BLD_new := nil;
+  _OSSL_PARAM_BLD_push_utf8_string := nil;
+  _OSSL_PARAM_BLD_to_param := nil;
+  _OSSL_PARAM_BLD_free := nil;
+  _OSSL_PARAM_free := nil;
+  //
   _EVP_DigestInit := nil;
   _EVP_DigestUpdate := nil;
   _EVP_DigestFinal := nil;
@@ -5658,6 +5813,12 @@ begin
       _EVP_SignFinal := nil;
       _EVP_PKEY_size := nil;
       _EVP_PKEY_free := nil;
+      _EVP_PKEY_encrypt_init_ex := nil;
+      _EVP_PKEY_encrypt := nil;
+      _EVP_PKEY_decrypt := nil;
+      _EVP_PKEY_CTX_free := nil;
+      _EVP_PKEY_CTX_new_from_name := nil;
+      _EVP_PKEY_CTX_new_from_pkey := nil;
       _EVP_VerifyFinal := nil;
   //
   _EVP_get_cipherbyname := nil;