ADD: FTP - reuse ssl session for data connection (GnuTLS)

This commit is contained in:
Alexander Koblov 2023-11-17 20:30:47 +03:00
commit e39d537380
2 changed files with 36 additions and 0 deletions

View file

@ -74,6 +74,7 @@ type
TSSLGnuTLS = class(TCustomSSL)
private
FShutdown: Integer;
FDatum: gnutls_datum_t;
FSession: gnutls_session_t;
FPriorities: array[Byte] of AnsiChar;
FCredentials: gnutls_certificate_credentials_t;
@ -192,6 +193,14 @@ function TSSLGnuTLS.DeInit: Boolean;
begin
Result := True;
if Assigned(FSessionNew) then
begin
gnutls_free(FDatum.data);
FSessionNew := nil;
FDatum.data := nil;
FDatum.size := 0
end;
if Assigned(FCredentials) then
begin
gnutls_certificate_free_credentials(FCredentials);
@ -244,6 +253,10 @@ begin
if Prepare then
begin
gnutls_transport_set_ptr(FSession, gnutls_transport_ptr_t(FSocket.Socket));
// Reuse session
if Assigned(FSessionOld) then begin
gnutls_session_set_data(FSession, gnutls_datum_ptr_t(FSessionOld)^.data, gnutls_datum_ptr_t(FSessionOld)^.size);
end;
// do blocking call of SSL_Connect
if FSocket.ConnectionTimeout <= 0 then
begin
@ -262,6 +275,13 @@ begin
end;
if SSLCheck then
begin
if (FSessionOld = nil) then
begin
if (gnutls_session_get_data2(FSession, @FDatum) = GNUTLS_E_SUCCESS) then
begin
FSessionNew := @FDatum;
end;
end;
FSSLEnabled := True;
FShutdown := 0;
Result := True;

View file

@ -22,6 +22,7 @@
unit ssl_gnutls_lib;
{$mode delphi}
{$packrecords c}
interface
@ -125,6 +126,13 @@ type
GNUTLS_SHUT_WR = 1
);
type
gnutls_datum_t = record
data: pcuchar;
size: cuint;
end;
gnutls_datum_ptr_t = ^gnutls_datum_t;
type
gnutls_session_st = record end;
gnutls_session_t = ^gnutls_session_st;
@ -147,6 +155,10 @@ var
gnutls_certificate_allocate_credentials: function(out res: gnutls_certificate_credentials_t): cint; cdecl;
gnutls_certificate_free_credentials: procedure(sc: gnutls_certificate_credentials_t); cdecl;
gnutls_free: procedure(ptr: Pointer); cdecl;
gnutls_session_get_data2: function(session: gnutls_session_t; data: gnutls_datum_ptr_t): cint; cdecl;
gnutls_session_set_data: function(session: gnutls_session_t; session_data: Pointer; session_data_size: csize_t): cint; cdecl;
gnutls_transport_set_ptr: procedure(session: gnutls_session_t; ptr: gnutls_transport_ptr_t); cdecl;
gnutls_record_check_pending: function(session: gnutls_session_t): csize_t; cdecl;
@ -216,6 +228,10 @@ begin
@gnutls_certificate_allocate_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_allocate_credentials');
@gnutls_certificate_free_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_free_credentials');
@gnutls_free:= SafeGetProcAddress(gnutls, 'gnutls_free');
@gnutls_session_get_data2:= SafeGetProcAddress(gnutls, 'gnutls_session_get_data2');
@gnutls_session_set_data:= SafeGetProcAddress(gnutls, 'gnutls_session_set_data');
@gnutls_transport_set_ptr:= SafeGetProcAddress(gnutls, 'gnutls_transport_set_ptr');
@gnutls_record_check_pending:= SafeGetProcAddress(gnutls, 'gnutls_record_check_pending');