ssl_gnutls_lib.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. {==============================================================================|
  2. | Project : Ararat Synapse | 001.000.000 |
  3. |==============================================================================|
  4. | Content: SSL support by GnuTLS |
  5. |==============================================================================|
  6. | Copyright (C) 2013-2023 Alexander Koblov <[email protected]> |
  7. | |
  8. | The GnuTLS is free software; you can redistribute it and/or |
  9. | modify it under the terms of the GNU Lesser General Public License |
  10. | as published by the Free Software Foundation; either version 2.1 of |
  11. | the License, or (at your option) any later version. |
  12. | |
  13. | This library is distributed in the hope that it will be useful, but |
  14. | WITHOUT ANY WARRANTY; without even the implied warranty of |
  15. | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
  16. | Lesser General Public License for more details. |
  17. | |
  18. | You should have received a copy of the GNU Lesser General Public License |
  19. | along with this program. If not, see <https://www.gnu.org/licenses/> |
  20. |==============================================================================}
  21. unit ssl_gnutls_lib;
  22. {$mode delphi}
  23. {$packrecords c}
  24. interface
  25. uses
  26. CTypes;
  27. const
  28. GNUTLS_E_SUCCESS = 0;
  29. GNUTLS_E_AGAIN = -28;
  30. GNUTLS_E_INTERRUPTED = -52;
  31. type
  32. gnutls_protocol_t =
  33. (
  34. GNUTLS_SSL3 = 1,
  35. GNUTLS_TLS1_0,
  36. GNUTLS_TLS1_1,
  37. GNUTLS_TLS1_2,
  38. GNUTLS_TLS1_3,
  39. GNUTLS_VERSION_UNKNOWN = $ff
  40. ) ;
  41. gnutls_cipher_algorithm_t =
  42. (
  43. GNUTLS_CIPHER_NULL = 1,
  44. GNUTLS_CIPHER_ARCFOUR_128,
  45. GNUTLS_CIPHER_3DES_CBC,
  46. GNUTLS_CIPHER_AES_128_CBC,
  47. GNUTLS_CIPHER_AES_256_CBC,
  48. GNUTLS_CIPHER_ARCFOUR_40,
  49. GNUTLS_CIPHER_CAMELLIA_128_CBC,
  50. GNUTLS_CIPHER_CAMELLIA_256_CBC,
  51. GNUTLS_CIPHER_RC2_40_CBC = 90,
  52. GNUTLS_CIPHER_DES_CBC
  53. );
  54. gnutls_kx_algorithm_t =
  55. (
  56. GNUTLS_KX_RSA = 1,
  57. GNUTLS_KX_DHE_DSS,
  58. GNUTLS_KX_DHE_RSA,
  59. GNUTLS_KX_ANON_DH,
  60. GNUTLS_KX_SRP,
  61. GNUTLS_KX_RSA_EXPORT,
  62. GNUTLS_KX_SRP_RSA,
  63. GNUTLS_KX_SRP_DSS,
  64. GNUTLS_KX_PSK,
  65. GNUTLS_KX_DHE_PSK
  66. );
  67. gnutls_mac_algorithm_t =
  68. (
  69. GNUTLS_MAC_UNKNOWN = 0,
  70. GNUTLS_MAC_NULL = 1,
  71. GNUTLS_MAC_MD5,
  72. GNUTLS_MAC_SHA1,
  73. GNUTLS_MAC_RMD160,
  74. GNUTLS_MAC_MD2,
  75. GNUTLS_MAC_SHA256,
  76. GNUTLS_MAC_SHA384,
  77. GNUTLS_MAC_SHA512
  78. );
  79. gnutls_compression_method_t =
  80. (
  81. GNUTLS_COMP_NULL = 1,
  82. GNUTLS_COMP_DEFLATE,
  83. GNUTLS_COMP_LZO
  84. );
  85. gnutls_certificate_type_t =
  86. (
  87. GNUTLS_CRT_X509 = 1,
  88. GNUTLS_CRT_OPENPGP
  89. );
  90. gnutls_init_flags_t =
  91. (
  92. GNUTLS_SERVER = 1,
  93. GNUTLS_CLIENT
  94. );
  95. gnutls_credentials_type_t =
  96. (
  97. GNUTLS_CRD_CERTIFICATE = 1,
  98. GNUTLS_CRD_ANON,
  99. GNUTLS_CRD_SRP,
  100. GNUTLS_CRD_PSK,
  101. GNUTLS_CRD_IA
  102. );
  103. gnutls_x509_crt_fmt_t =
  104. (
  105. GNUTLS_X509_FMT_DER = 0,
  106. GNUTLS_X509_FMT_PEM = 1
  107. );
  108. gnutls_close_request_t =
  109. (
  110. GNUTLS_SHUT_RDWR = 0,
  111. GNUTLS_SHUT_WR = 1
  112. );
  113. type
  114. gnutls_datum_t = record
  115. data: pcuchar;
  116. size: cuint;
  117. end;
  118. gnutls_datum_ptr_t = ^gnutls_datum_t;
  119. type
  120. gnutls_session_st = record end;
  121. gnutls_session_t = ^gnutls_session_st;
  122. gnutls_transport_ptr_t = type UIntPtr;
  123. gnutls_session_ptr_t = ^gnutls_session_t;
  124. gnutls_certificate_credentials_st = record end;
  125. gnutls_certificate_credentials_t = ^gnutls_certificate_credentials_st;
  126. var
  127. gnutls_global_init: function(): cint; cdecl;
  128. gnutls_init: function(session: gnutls_session_ptr_t; flags: gnutls_init_flags_t): cint; cdecl;
  129. gnutls_deinit: procedure(session: gnutls_session_t); cdecl;
  130. gnutls_priority_set_direct: function(session: gnutls_session_t; const priorities: PAnsiChar; const err_pos: PPAnsiChar): cint; cdecl;
  131. gnutls_credentials_set: function(session: gnutls_session_t; cred_type: gnutls_credentials_type_t; cred: Pointer): cint; cdecl;
  132. gnutls_certificate_set_x509_trust_file: function(res: gnutls_certificate_credentials_t; const CAFILE: PAnsiChar; crt_type: gnutls_x509_crt_fmt_t): cint; cdecl;
  133. gnutls_certificate_set_x509_key_file: function(res: gnutls_certificate_credentials_t; const CERTFILE: PAnsiChar; const KEYFILE: PAnsiChar; crt_type: gnutls_x509_crt_fmt_t): cint; cdecl;
  134. gnutls_certificate_allocate_credentials: function(out res: gnutls_certificate_credentials_t): cint; cdecl;
  135. gnutls_certificate_free_credentials: procedure(sc: gnutls_certificate_credentials_t); cdecl;
  136. gnutls_free: procedure(ptr: Pointer); cdecl;
  137. gnutls_session_get_data2: function(session: gnutls_session_t; data: gnutls_datum_ptr_t): cint; cdecl;
  138. gnutls_session_set_data: function(session: gnutls_session_t; session_data: Pointer; session_data_size: csize_t): cint; cdecl;
  139. gnutls_transport_set_ptr: procedure(session: gnutls_session_t; ptr: gnutls_transport_ptr_t); cdecl;
  140. gnutls_record_check_pending: function(session: gnutls_session_t): csize_t; cdecl;
  141. gnutls_handshake: function(session: gnutls_session_t): cint; cdecl;
  142. gnutls_bye: function(session: gnutls_session_t; how: gnutls_close_request_t): cint; cdecl;
  143. gnutls_record_send: function(session: gnutls_session_t; const data: Pointer; sizeofdata: csize_t): PtrInt; cdecl;
  144. gnutls_record_recv: function(session: gnutls_session_t; data: Pointer; sizeofdata: csize_t): PtrInt; cdecl;
  145. gnutls_protocol_get_name: function(version: gnutls_protocol_t): PAnsiChar; cdecl;
  146. gnutls_protocol_get_version: function(session: gnutls_session_t): gnutls_protocol_t; cdecl;
  147. gnutls_cipher_get: function(session: gnutls_session_t): gnutls_cipher_algorithm_t; cdecl;
  148. gnutls_kx_get: function(session: gnutls_session_t): gnutls_kx_algorithm_t; cdecl;
  149. gnutls_mac_get: function(session: gnutls_session_t): gnutls_mac_algorithm_t; cdecl;
  150. gnutls_compression_get: function(session: gnutls_session_t): gnutls_compression_method_t; cdecl;
  151. gnutls_certificate_type_get: function(session: gnutls_session_t): gnutls_certificate_type_t; cdecl;
  152. gnutls_cipher_suite_get_name: function(kx_algorithm: gnutls_kx_algorithm_t; cipher_algorithm: gnutls_cipher_algorithm_t;
  153. mac_algorithm: gnutls_mac_algorithm_t): PAnsiChar; cdecl;
  154. gnutls_cipher_get_key_size: function(algorithm: gnutls_cipher_algorithm_t): csize_t; cdecl;
  155. gnutls_strerror: function(error: cint): PAnsiChar; cdecl;
  156. gnutls_check_version: function(const req_version: PAnsiChar): PAnsiChar; cdecl;
  157. function InitSSLInterface: Boolean;
  158. implementation
  159. uses
  160. SysUtils, DynLibs;
  161. function SafeGetProcAddress(Lib : TlibHandle; const ProcName : AnsiString) : Pointer;
  162. begin
  163. Result:= GetProcedureAddress(Lib, ProcName);
  164. if (Result = nil) then raise Exception.Create(EmptyStr);
  165. end;
  166. function InitSSLInterface: Boolean;
  167. const
  168. libgnutls: array[0..2] of String = ('30', '28', '26');
  169. var
  170. index: Integer;
  171. gnutls: TLibHandle;
  172. begin
  173. for index:= Low(libgnutls) to High(libgnutls) do
  174. begin
  175. gnutls:= LoadLibrary('libgnutls.so.' + libgnutls[index]);
  176. if gnutls <> NilHandle then Break;
  177. end;
  178. Result:= (gnutls <> NilHandle);
  179. if Result then
  180. try
  181. @gnutls_check_version:= SafeGetProcAddress(gnutls, 'gnutls_check_version');
  182. if (gnutls_check_version('3.0.0') = nil) then raise Exception.Create(EmptyStr);
  183. @gnutls_global_init:= SafeGetProcAddress(gnutls, 'gnutls_global_init');
  184. @gnutls_init:= SafeGetProcAddress(gnutls, 'gnutls_init');
  185. @gnutls_deinit:= SafeGetProcAddress(gnutls, 'gnutls_deinit');
  186. @gnutls_priority_set_direct:= SafeGetProcAddress(gnutls, 'gnutls_priority_set_direct');
  187. @gnutls_credentials_set:= SafeGetProcAddress(gnutls, 'gnutls_credentials_set');
  188. @gnutls_certificate_set_x509_trust_file:= SafeGetProcAddress(gnutls, 'gnutls_certificate_set_x509_trust_file');
  189. @gnutls_certificate_set_x509_key_file:= SafeGetProcAddress(gnutls, 'gnutls_certificate_set_x509_key_file');
  190. @gnutls_certificate_allocate_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_allocate_credentials');
  191. @gnutls_certificate_free_credentials:= SafeGetProcAddress(gnutls, 'gnutls_certificate_free_credentials');
  192. @gnutls_free:= SafeGetProcAddress(gnutls, 'gnutls_free');
  193. @gnutls_session_get_data2:= SafeGetProcAddress(gnutls, 'gnutls_session_get_data2');
  194. @gnutls_session_set_data:= SafeGetProcAddress(gnutls, 'gnutls_session_set_data');
  195. @gnutls_transport_set_ptr:= SafeGetProcAddress(gnutls, 'gnutls_transport_set_ptr');
  196. @gnutls_record_check_pending:= SafeGetProcAddress(gnutls, 'gnutls_record_check_pending');
  197. @gnutls_handshake:= SafeGetProcAddress(gnutls, 'gnutls_handshake');
  198. @gnutls_bye:= SafeGetProcAddress(gnutls, 'gnutls_bye');
  199. @gnutls_record_send:= SafeGetProcAddress(gnutls, 'gnutls_record_send');
  200. @gnutls_record_recv:= SafeGetProcAddress(gnutls, 'gnutls_record_recv');
  201. @gnutls_protocol_get_name:= SafeGetProcAddress(gnutls, 'gnutls_protocol_get_name');
  202. @gnutls_protocol_get_version:= SafeGetProcAddress(gnutls, 'gnutls_protocol_get_version');
  203. @gnutls_cipher_get:= SafeGetProcAddress(gnutls, 'gnutls_cipher_get');
  204. @gnutls_kx_get:= SafeGetProcAddress(gnutls, 'gnutls_kx_get');
  205. @gnutls_mac_get:= SafeGetProcAddress(gnutls, 'gnutls_mac_get');
  206. @gnutls_compression_get:= SafeGetProcAddress(gnutls, 'gnutls_compression_get');
  207. @gnutls_certificate_type_get:= SafeGetProcAddress(gnutls, 'gnutls_certificate_type_get');
  208. @gnutls_cipher_suite_get_name:= SafeGetProcAddress(gnutls, 'gnutls_cipher_suite_get_name');
  209. @gnutls_cipher_get_key_size:= SafeGetProcAddress(gnutls, 'gnutls_cipher_get_key_size');
  210. @gnutls_strerror:= SafeGetProcAddress(gnutls, 'gnutls_strerror');
  211. if (gnutls_global_init() <> GNUTLS_E_SUCCESS) then
  212. raise Exception.Create(EmptyStr);
  213. except
  214. Result:= False;
  215. FreeLibrary(gnutls);
  216. end;
  217. end;
  218. end.