|
@@ -45,7 +45,7 @@ unit OpenSSL;
|
|
|
| if need be, it should be re-added, or handled by the |
|
|
|
| OS threading init somehow |
|
|
|
| |
|
|
|
-| 2010 - Felipe Monteiro de Carvalho - Many improvements |
|
|
|
+| 2010 - Felipe Monteiro de Carvalho - Added RAND functios |
|
|
|
|==============================================================================|
|
|
|
| History: see HISTORY.HTM from distribution package |
|
|
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
|
@@ -108,7 +108,8 @@ type
|
|
|
PEVP_MD = SslPtr;
|
|
|
PBIO_METHOD = SslPtr;
|
|
|
PBIO = SslPtr;
|
|
|
- EVP_PKEY = SslPtr;
|
|
|
+ PEVP_PKEY = SslPtr;
|
|
|
+ PPEVP_PKEY = ^PEVP_PKEY;
|
|
|
PRSA = SslPtr;
|
|
|
PPRSA = ^PRSA;
|
|
|
PASN1_UTCTIME = SslPtr;
|
|
@@ -241,6 +242,10 @@ type
|
|
|
// in the OpenSSL library will occur
|
|
|
end;
|
|
|
|
|
|
+ // PEM
|
|
|
+
|
|
|
+ Ppem_password_cb = Pointer;
|
|
|
+
|
|
|
const
|
|
|
SSL_ERROR_NONE = 0;
|
|
|
SSL_ERROR_SSL = 1;
|
|
@@ -367,6 +372,76 @@ const
|
|
|
RSA_NO_PADDING = 3;
|
|
|
RSA_PKCS1_OAEP_PADDING = 4;
|
|
|
|
|
|
+ // BIO
|
|
|
+
|
|
|
+ BIO_NOCLOSE = $00;
|
|
|
+ BIO_CLOSE = $01;
|
|
|
+
|
|
|
+ //* modifiers */
|
|
|
+ BIO_FP_READ = $02;
|
|
|
+ BIO_FP_WRITE = $04;
|
|
|
+ BIO_FP_APPEND = $08;
|
|
|
+ BIO_FP_TEXT = $10;
|
|
|
+
|
|
|
+ BIO_C_SET_CONNECT = 100;
|
|
|
+ BIO_C_DO_STATE_MACHINE = 101;
|
|
|
+ BIO_C_SET_NBIO = 102;
|
|
|
+ BIO_C_SET_PROXY_PARAM = 103;
|
|
|
+ BIO_C_SET_FD = 104;
|
|
|
+ BIO_C_GET_FD = 105;
|
|
|
+ BIO_C_SET_FILE_PTR = 106;
|
|
|
+ BIO_C_GET_FILE_PTR = 107;
|
|
|
+ BIO_C_SET_FILENAME = 108;
|
|
|
+ BIO_C_SET_SSL = 109;
|
|
|
+ BIO_C_GET_SSL = 110;
|
|
|
+ BIO_C_SET_MD = 111;
|
|
|
+ BIO_C_GET_MD = 112;
|
|
|
+ BIO_C_GET_CIPHER_STATUS = 113;
|
|
|
+ BIO_C_SET_BUF_MEM = 114;
|
|
|
+ BIO_C_GET_BUF_MEM_PTR = 115;
|
|
|
+ BIO_C_GET_BUFF_NUM_LINES = 116;
|
|
|
+ BIO_C_SET_BUFF_SIZE = 117;
|
|
|
+ BIO_C_SET_ACCEPT = 118;
|
|
|
+ BIO_C_SSL_MODE = 119;
|
|
|
+ BIO_C_GET_MD_CTX = 120;
|
|
|
+ BIO_C_GET_PROXY_PARAM = 121;
|
|
|
+ BIO_C_SET_BUFF_READ_DATA = 122; // data to read first */
|
|
|
+ BIO_C_GET_CONNECT = 123;
|
|
|
+ BIO_C_GET_ACCEPT = 124;
|
|
|
+ BIO_C_SET_SSL_RENEGOTIATE_BYTES = 125;
|
|
|
+ BIO_C_GET_SSL_NUM_RENEGOTIATES = 126;
|
|
|
+ BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT = 127;
|
|
|
+ BIO_C_FILE_SEEK = 128;
|
|
|
+ BIO_C_GET_CIPHER_CTX = 129;
|
|
|
+ BIO_C_SET_BUF_MEM_EOF_RETURN = 130;//*return end of input value*/
|
|
|
+ BIO_C_SET_BIND_MODE = 131;
|
|
|
+ BIO_C_GET_BIND_MODE = 132;
|
|
|
+ BIO_C_FILE_TELL = 133;
|
|
|
+ BIO_C_GET_SOCKS = 134;
|
|
|
+ BIO_C_SET_SOCKS = 135;
|
|
|
+
|
|
|
+ BIO_C_SET_WRITE_BUF_SIZE = 136;//* for BIO_s_bio */
|
|
|
+ BIO_C_GET_WRITE_BUF_SIZE = 137;
|
|
|
+ BIO_C_MAKE_BIO_PAIR = 138;
|
|
|
+ BIO_C_DESTROY_BIO_PAIR = 139;
|
|
|
+ BIO_C_GET_WRITE_GUARANTEE = 140;
|
|
|
+ BIO_C_GET_READ_REQUEST = 141;
|
|
|
+ BIO_C_SHUTDOWN_WR = 142;
|
|
|
+ BIO_C_NREAD0 = 143;
|
|
|
+ BIO_C_NREAD = 144;
|
|
|
+ BIO_C_NWRITE0 = 145;
|
|
|
+ BIO_C_NWRITE = 146;
|
|
|
+ BIO_C_RESET_READ_REQUEST = 147;
|
|
|
+ BIO_C_SET_MD_CTX = 148;
|
|
|
+
|
|
|
+ BIO_C_SET_PREFIX = 149;
|
|
|
+ BIO_C_GET_PREFIX = 150;
|
|
|
+ BIO_C_SET_SUFFIX = 151;
|
|
|
+ BIO_C_GET_SUFFIX = 152;
|
|
|
+
|
|
|
+ BIO_C_SET_EX_ARG = 153;
|
|
|
+ BIO_C_GET_EX_ARG = 154;
|
|
|
+
|
|
|
var
|
|
|
SSLLibHandle: TLibHandle = 0;
|
|
|
SSLUtilHandle: TLibHandle = 0;
|
|
@@ -437,18 +512,18 @@ var
|
|
|
function X509Digest(data: PX509; _type: PEVP_MD; md: String; var len: cInt):cInt;
|
|
|
function X509print(b: PBIO; a: PX509): cInt;
|
|
|
function X509SetVersion(x: PX509; version: cInt): cInt;
|
|
|
- function X509SetPubkey(x: PX509; pkey: EVP_PKEY): cInt;
|
|
|
+ function X509SetPubkey(x: PX509; pkey: PEVP_PKEY): cInt;
|
|
|
function X509SetIssuerName(x: PX509; name: PX509_NAME): cInt;
|
|
|
function X509NameAddEntryByTxt(name: PX509_NAME; field: string; _type: cInt;
|
|
|
bytes: string; len, loc, _set: cInt): cInt;
|
|
|
- function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): cInt;
|
|
|
+ function X509Sign(x: PX509; pkey: PEVP_PKEY; const md: PEVP_MD): cInt;
|
|
|
function X509GmtimeAdj(s: PASN1_UTCTIME; adj: cInt): PASN1_UTCTIME;
|
|
|
function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): cInt;
|
|
|
function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): cInt;
|
|
|
function X509GetSerialNumber(x: PX509): PASN1_cInt;
|
|
|
- function EvpPkeyNew: EVP_PKEY;
|
|
|
- procedure EvpPkeyFree(pk: EVP_PKEY);
|
|
|
- function EvpPkeyAssign(pkey: EVP_PKEY; _type: cInt; key: Prsa): cInt;
|
|
|
+ function EvpPkeyNew: PEVP_PKEY;
|
|
|
+ procedure EvpPkeyFree(pk: PEVP_PKEY);
|
|
|
+ function EvpPkeyAssign(pkey: PEVP_PKEY; _type: cInt; key: Prsa): cInt;
|
|
|
function EvpGetDigestByName(Name: String): PEVP_MD;
|
|
|
procedure EVPcleanup;
|
|
|
function SSLeayversion(t: cInt): string;
|
|
@@ -470,7 +545,7 @@ var
|
|
|
function Asn1UtctimeNew: PASN1_UTCTIME;
|
|
|
procedure Asn1UtctimeFree(a: PASN1_UTCTIME);
|
|
|
function i2dX509bio(b: PBIO; x: PX509): cInt;
|
|
|
- function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): cInt;
|
|
|
+ function i2dPrivateKeyBio(b: PBIO; pkey: PEVP_PKEY): cInt;
|
|
|
|
|
|
// 3DES functions
|
|
|
procedure DESsetoddparity(Key: des_cblock);
|
|
@@ -570,6 +645,16 @@ var
|
|
|
function EVP_DecryptUpdate(ctx: PEVP_CIPHER_CTX; out_data: PByte;
|
|
|
outl: pcint; const in_: PByte; inl: cint): cint;
|
|
|
function EVP_DecryptFinal(ctx: PEVP_CIPHER_CTX; outm: PByte; outlen: pcint): cint;
|
|
|
+ //
|
|
|
+ // PEM Functions - pem.h
|
|
|
+ //
|
|
|
+ function PEM_read_bio_PrivateKey(bp: PBIO; X: PPEVP_PKEY;
|
|
|
+ cb: Ppem_password_cb; u: Pointer): PEVP_PKEY;
|
|
|
+
|
|
|
+ // BIO Functions - bio.h
|
|
|
+
|
|
|
+ function BIO_ctrl(bp: PBIO; cmd: cint; larg: clong; parg: Pointer): clong;
|
|
|
+ function BIO_read_filename(b: PBIO; const name: PChar): cint;
|
|
|
|
|
|
|
|
|
function IsSSLloaded: Boolean;
|
|
@@ -634,18 +719,18 @@ type
|
|
|
TX509Digest = function(data: PX509; _type: PEVP_MD; md: PChar; len: PcInt):cInt; cdecl;
|
|
|
TX509print = function(b: PBIO; a: PX509): cInt; cdecl;
|
|
|
TX509SetVersion = function(x: PX509; version: cInt): cInt; cdecl;
|
|
|
- TX509SetPubkey = function(x: PX509; pkey: EVP_PKEY): cInt; cdecl;
|
|
|
+ TX509SetPubkey = function(x: PX509; pkey: PEVP_PKEY): cInt; cdecl;
|
|
|
TX509SetIssuerName = function(x: PX509; name: PX509_NAME): cInt; cdecl;
|
|
|
TX509NameAddEntryByTxt = function(name: PX509_NAME; field: PChar; _type: cInt;
|
|
|
bytes: PChar; len, loc, _set: cInt): cInt; cdecl;
|
|
|
- TX509Sign = function(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): cInt; cdecl;
|
|
|
+ TX509Sign = function(x: PX509; pkey: PEVP_PKEY; const md: PEVP_MD): cInt; cdecl;
|
|
|
TX509GmtimeAdj = function(s: PASN1_UTCTIME; adj: cInt): PASN1_UTCTIME; cdecl;
|
|
|
TX509SetNotBefore = function(x: PX509; tm: PASN1_UTCTIME): cInt; cdecl;
|
|
|
TX509SetNotAfter = function(x: PX509; tm: PASN1_UTCTIME): cInt; cdecl;
|
|
|
TX509GetSerialNumber = function(x: PX509): PASN1_cInt; cdecl;
|
|
|
- TEvpPkeyNew = function: EVP_PKEY; cdecl;
|
|
|
- TEvpPkeyFree = procedure(pk: EVP_PKEY); cdecl;
|
|
|
- TEvpPkeyAssign = function(pkey: EVP_PKEY; _type: cInt; key: Prsa): cInt; cdecl;
|
|
|
+ TEvpPkeyNew = function: PEVP_PKEY; cdecl;
|
|
|
+ TEvpPkeyFree = procedure(pk: PEVP_PKEY); cdecl;
|
|
|
+ TEvpPkeyAssign = function(pkey: PEVP_PKEY; _type: cInt; key: Prsa): cInt; cdecl;
|
|
|
TEvpGetDigestByName = function(Name: PChar): PEVP_MD; cdecl;
|
|
|
TEVPcleanup = procedure; cdecl;
|
|
|
TSSLeayversion = function(t: cInt): PChar; cdecl;
|
|
@@ -667,7 +752,7 @@ type
|
|
|
TAsn1UtctimeNew = function: PASN1_UTCTIME; cdecl;
|
|
|
TAsn1UtctimeFree = procedure(a: PASN1_UTCTIME); cdecl;
|
|
|
Ti2dX509bio = function(b: PBIO; x: PX509): cInt; cdecl;
|
|
|
- Ti2dPrivateKeyBio= function(b: PBIO; pkey: EVP_PKEY): cInt; cdecl;
|
|
|
+ Ti2dPrivateKeyBio= function(b: PBIO; pkey: PEVP_PKEY): cInt; cdecl;
|
|
|
|
|
|
// 3DES functions
|
|
|
TDESsetoddparity = procedure(Key: des_cblock); cdecl;
|
|
@@ -759,6 +844,15 @@ type
|
|
|
outl: pcint; const in_: PByte; inl: cint): cint; cdecl;
|
|
|
TEVP_DecryptFinal = function(ctx: PEVP_CIPHER_CTX; outm: PByte; outlen: pcint): cint; cdecl;
|
|
|
|
|
|
+ // PEM functions
|
|
|
+
|
|
|
+ TPEM_read_bio_PrivateKey = function(bp: PBIO; X: PPEVP_PKEY;
|
|
|
+ cb: Ppem_password_cb; u: Pointer): PEVP_PKEY; cdecl;
|
|
|
+
|
|
|
+ // BIO Functions
|
|
|
+
|
|
|
+ TBIO_ctrl = function(bp: PBIO; cmd: cint; larg: clong; parg: Pointer): clong; cdecl;
|
|
|
+
|
|
|
var
|
|
|
// libssl.dll
|
|
|
_SslGetError: TSslGetError = nil;
|
|
@@ -932,6 +1026,13 @@ var
|
|
|
_EVP_DecryptUpdate: TEVP_DecryptUpdate = nil;
|
|
|
_EVP_DecryptFinal: TEVP_DecryptFinal = nil;
|
|
|
|
|
|
+ // PEM
|
|
|
+ _PEM_read_bio_PrivateKey: TPEM_read_bio_PrivateKey = nil;
|
|
|
+
|
|
|
+ // BIO Functions
|
|
|
+
|
|
|
+ _BIO_ctrl: TBIO_ctrl = nil;
|
|
|
+
|
|
|
var
|
|
|
SSLloaded: boolean = false;
|
|
|
|
|
@@ -1324,7 +1425,7 @@ begin
|
|
|
Result := 0;
|
|
|
end;
|
|
|
|
|
|
-function EvpPkeyNew: EVP_PKEY;
|
|
|
+function EvpPkeyNew: PEVP_PKEY;
|
|
|
begin
|
|
|
if InitSSLInterface and Assigned(_EvpPkeyNew) then
|
|
|
Result := _EvpPkeyNew
|
|
@@ -1332,7 +1433,7 @@ begin
|
|
|
Result := nil;
|
|
|
end;
|
|
|
|
|
|
-procedure EvpPkeyFree(pk: EVP_PKEY);
|
|
|
+procedure EvpPkeyFree(pk: PEVP_PKEY);
|
|
|
begin
|
|
|
if InitSSLInterface and Assigned(_EvpPkeyFree) then
|
|
|
_EvpPkeyFree(pk);
|
|
@@ -1468,7 +1569,7 @@ begin
|
|
|
_PKCS12free(p12);
|
|
|
end;
|
|
|
|
|
|
-function EvpPkeyAssign(pkey: EVP_PKEY; _type: cInt; key: Prsa): cInt;
|
|
|
+function EvpPkeyAssign(pkey: PEVP_PKEY; _type: cInt; key: Prsa): cInt;
|
|
|
begin
|
|
|
if InitSSLInterface and Assigned(_EvpPkeyAssign) then
|
|
|
Result := _EvpPkeyAssign(pkey, _type, key)
|
|
@@ -1484,7 +1585,7 @@ begin
|
|
|
Result := 0;
|
|
|
end;
|
|
|
|
|
|
-function X509SetPubkey(x: PX509; pkey: EVP_PKEY): cInt;
|
|
|
+function X509SetPubkey(x: PX509; pkey: PEVP_PKEY): cInt;
|
|
|
begin
|
|
|
if InitSSLInterface and Assigned(_X509SetPubkey) then
|
|
|
Result := _X509SetPubkey(x, pkey)
|
|
@@ -1509,7 +1610,7 @@ begin
|
|
|
Result := 0;
|
|
|
end;
|
|
|
|
|
|
-function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): cInt;
|
|
|
+function X509Sign(x: PX509; pkey: PEVP_PKEY; const md: PEVP_MD): cInt;
|
|
|
begin
|
|
|
if InitSSLInterface and Assigned(_X509Sign) then
|
|
|
Result := _X509Sign(x, pkey, md)
|
|
@@ -1563,7 +1664,7 @@ begin
|
|
|
Result := 0;
|
|
|
end;
|
|
|
|
|
|
-function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): cInt;
|
|
|
+function i2dPrivateKeyBio(b: PBIO; pkey: PEVP_PKEY): cInt;
|
|
|
begin
|
|
|
if InitSSLInterface and Assigned(_i2dPrivateKeyBio) then
|
|
|
Result := _i2dPrivateKeyBio(b, pkey)
|
|
@@ -2057,6 +2158,32 @@ begin
|
|
|
Result := -1;
|
|
|
end;
|
|
|
|
|
|
+{ PEM }
|
|
|
+
|
|
|
+function PEM_read_bio_PrivateKey(bp: PBIO; X: PPEVP_PKEY;
|
|
|
+ cb: Ppem_password_cb; u: Pointer): PEVP_PKEY;
|
|
|
+begin
|
|
|
+ if InitSSLInterface and Assigned(_PEM_read_bio_PrivateKey) then
|
|
|
+ Result := _PEM_read_bio_PrivateKey(bp, x, cb, u)
|
|
|
+ else
|
|
|
+ Result := nil;
|
|
|
+end;
|
|
|
+
|
|
|
+// BIO Functions
|
|
|
+
|
|
|
+function BIO_ctrl(bp: PBIO; cmd: cint; larg: clong; parg: Pointer): clong;
|
|
|
+begin
|
|
|
+ if InitSSLInterface and Assigned(_BIO_ctrl) then
|
|
|
+ Result := _BIO_ctrl(bp, cmd, larg, parg)
|
|
|
+ else
|
|
|
+ Result := -1;
|
|
|
+end;
|
|
|
+
|
|
|
+function BIO_read_filename(b: PBIO; const name: PChar): cint;
|
|
|
+begin
|
|
|
+ Result := BIO_ctrl(b, BIO_C_SET_FILENAME, BIO_CLOSE or BIO_FP_READ, Pointer(name));
|
|
|
+end;
|
|
|
+
|
|
|
|
|
|
{$IFNDEF WINDOWS}
|
|
|
{ Try to load all library versions until you find or run out }
|
|
@@ -2282,6 +2409,14 @@ begin
|
|
|
_EVP_DecryptUpdate := GetProcAddr(SSLUtilHandle, 'EVP_DecryptUpdate', AVerboseLoading);
|
|
|
_EVP_DecryptFinal := GetProcAddr(SSLUtilHandle, 'EVP_DecryptFinal', AVerboseLoading);
|
|
|
|
|
|
+ // PEM
|
|
|
+
|
|
|
+ _PEM_read_bio_PrivateKey := GetProcAddr(SSLUtilHandle, 'PEM_read_bio_PrivateKey', AVerboseLoading);
|
|
|
+
|
|
|
+ // BIO
|
|
|
+
|
|
|
+ _BIO_ctrl := GetProcAddr(SSLUtilHandle, 'BIO_ctrl', AVerboseLoading);
|
|
|
+
|
|
|
//init library
|
|
|
if assigned(_SslLibraryInit) then
|
|
|
_SslLibraryInit;
|
|
@@ -2505,6 +2640,13 @@ begin
|
|
|
_EVP_DecryptUpdate := nil;
|
|
|
_EVP_DecryptFinal := nil;
|
|
|
|
|
|
+ // PEM
|
|
|
+
|
|
|
+ _PEM_read_bio_PrivateKey := nil;
|
|
|
+
|
|
|
+ // BIO
|
|
|
+
|
|
|
+ _BIO_ctrl := nil;
|
|
|
|
|
|
Result := True;
|
|
|
end;
|