@@ -2,7 +2,7 @@ open Core.Std
22open Async.Std
33open Import
445-let foreign = Foreign.foreign
5+module Bindings = Ffi_bindings.Bindings(Ffi_generated)
6677module Ssl_error = struct
88type t =
@@ -27,26 +27,20 @@ let bigstring_strlen bigstr =
2727;;
28282929let get_error_stack =
30-let err_get_error =
31- foreign "ERR_get_error" Ctypes.(void @-> returning ulong)
32-in
33-let err_error_string_n =
34- foreign "ERR_error_string_n" Ctypes.(ulong @-> ptr char @-> int @-> returning void)
35-in
3630let err_error_string =
3731(* We need to write error strings from C into bigstrings. To reduce allocation, reuse
3832 scratch space for this. *)
3933let scratch_space = Bigstring.create 1024 in
4034fun err ->
41- err_error_string_n
35+Bindings.err_error_string_n
4236 err
4337 (Ctypes.bigarray_start Ctypes.array1 scratch_space)
4438 (Bigstring.length scratch_space);
4539Bigstring.to_string ~len:(bigstring_strlen scratch_space) scratch_space
4640in
4741fun () ->
4842 iter_while_rev
49-~iter:err_get_error
43+~iter:Bindings.err_get_error
5044~cond:(fun x -> x <> Unsigned.ULong.zero)
5145|> List.rev_map ~f:err_error_string
5246;;
@@ -55,84 +49,53 @@ let get_error_stack =
55495650(* OpenSSL_add_all_algorithms is a macro, so we have to replicate it manually. :( *)
5751let add_all_algorithms =
58-let add_all_digests =
59- foreign "OpenSSL_add_all_digests" Ctypes.(void @-> returning void)
60-in
61-let add_all_ciphers =
62- foreign "OpenSSL_add_all_ciphers" Ctypes.(void @-> returning void)
63-in
6452fun () ->
65- add_all_ciphers ();
66- add_all_digests ();
53+Bindings.add_all_ciphers ();
54+Bindings.add_all_digests ();
6755;;
68566957(* Call the openssl initialization method if it hasn't been already. *)
7058(* val possibly_init : unit -> unit *)
7159let possibly_init =
72-let init = foreign "SSL_library_init" Ctypes.(void @-> returning ulong) in
73-let ssl_load_error_strings =
74- foreign "SSL_load_error_strings" Ctypes.(void @-> returning void)
75-in
7660let initialized = ref false in
7761fun () ->
7862if not !initialized then begin
7963 initialized := true;
8064(* SSL_library_init() always returns "1", so it is safe to discard the return
8165 value. *)
82- ignore (init () : Unsigned.ulong);
83- ssl_load_error_strings ();
66+ ignore (Bindings.init () : Unsigned.ulong);
67+Bindings.ssl_load_error_strings ();
8468 add_all_algorithms ();
8569end
8670;;
877188-let ssl_method_t = Ctypes.(void @-> returning (ptr void))
89-let sslv3_method = foreign "SSLv3_method" ssl_method_t
90-let tlsv1_method = foreign "TLSv1_method" ssl_method_t
91-let sslv23_method = foreign "SSLv23_method" ssl_method_t
92-9372module Ssl_ctx = struct
94-9573type t = unit Ctypes.ptr
96749775let t = Ctypes.(ptr void) (* for use in ctypes type signatures *)
98769977let sexp_of_t x = Ctypes.(ptr_diff x null) |> <:sexp_of<int>>
1007810179let create_exn =
102-(* SSLv2 isn't secure, so we don't use it. If you really really really need it, use
103- SSLv23 which will at least try to upgrade the security whenever possible.
104-105- let sslv2_method = foreign "SSLv2_method" ssl_method_t
106- *)
107-let ssl_ctx_new =
108- foreign "SSL_CTX_new" Ctypes.(ptr void @-> returning (ptr_opt void))
109-in
110-let ssl_ctx_free =
111- foreign "SSL_CTX_free" Ctypes.(t @-> returning void)
112-in
11380fun ver ->
11481 possibly_init ();
11582let ver_method =
11683let module V = Version in
11784match ver with
118-| V.Sslv3 -> sslv3_method ()
119-| V.Tlsv1 -> tlsv1_method ()
120-| V.Sslv23 -> sslv23_method ()
85+| V.Sslv3 -> Bindings.sslv3_method ()
86+| V.Tlsv1 -> Bindings.tlsv1_method ()
87+| V.Sslv23 -> Bindings.sslv23_method ()
12188in
122-match ssl_ctx_new ver_method with
89+match Bindings.Ssl_ctx.ssl_ctx_new ver_method with
12390| None -> failwith "Could not allocate a new SSL context."
12491| Some p ->
125-Gc.add_finalizer_exn p ssl_ctx_free;
92+Gc.add_finalizer_exn p Bindings.Ssl_ctx.ssl_ctx_free;
12693 p
12794 ;;
1289512996let load_verify_locations =
130-let ssl_ctx_load_verify_locations =
131- foreign "SSL_CTX_load_verify_locations"
132-Ctypes.(t @-> string_opt @-> string_opt @-> returning int)
133-in
13497fun ?ca_file ?ca_path ctx ->
135-In_thread.run (fun () -> ssl_ctx_load_verify_locations ctx ca_file ca_path)
98+In_thread.run (fun () -> Bindings.Ssl_ctx.ssl_ctx_load_verify_locations ctx ca_file ca_path)
13699>>= function
137100| 0 -> Deferred.return (Or_error.return ())
138101| _ -> Deferred.return begin
@@ -152,33 +115,21 @@ module Bio = struct
152115let sexp_of_t bio = Ctypes.(ptr_diff bio null) |> <:sexp_of<int>>
153116154117let create =
155-let bio_new =
156- foreign "BIO_new" Ctypes.(ptr void @-> returning t)
157-in
158-let bio_s_mem =
159- foreign "BIO_s_mem" Ctypes.(void @-> returning (ptr void))
160-in
161118fun () ->
162- bio_s_mem ()
163-|> bio_new
119+Bindings.Bio.bio_s_mem ()
120+|> Bindings.Bio.bio_new
164121 ;;
165122166123let read =
167-let bio_read =
168- foreign "BIO_read" Ctypes.(t @-> ptr char @-> int @-> returning int)
169-in
170124fun bio ~buf ~len ->
171-let retval = bio_read bio buf len in
125+let retval = Bindings.Bio.bio_read bio buf len in
172126if verbose then Debug.amf _here_ "BIO_read(%i) -> %i" len retval;
173127 retval
174128 ;;
175129176130let write =
177-let bio_write =
178- foreign "BIO_write" Ctypes.(t @-> string @-> int @-> returning int)
179-in
180131fun bio ~buf ~len ->
181-let retval = bio_write bio buf len in
132+let retval = Bindings.Bio.bio_write bio buf len in
182133if verbose then Debug.amf _here_ "BIO_write(%i) -> %i" len retval;
183134 retval
184135 ;;
@@ -193,42 +144,34 @@ module Ssl = struct
193144let sexp_of_t ssl = Ctypes.(ptr_diff ssl null) |> <:sexp_of<int>>
194145195146let create_exn =
196-let ssl_new = foreign "SSL_new" Ctypes.(Ssl_ctx.t @-> returning t) in
197-let ssl_free = foreign "SSL_free" Ctypes.( t @-> returning void) in
198147fun ctx ->
199-let p = ssl_new ctx in
148+let p = Bindings.Ssl.ssl_new ctx in
200149if p = Ctypes.null
201150then failwith "Unable to allocate an SSL connection."
202151else begin
203-Gc.add_finalizer_exn p ssl_free;
152+Gc.add_finalizer_exn p Bindings.Ssl.ssl_free;
204153 p
205154end
206155 ;;
207156208157let set_method =
209-let ssl_set_method =
210- foreign "SSL_set_ssl_method" Ctypes.(t @-> ptr void @-> returning int)
211-in
212158fun t version ->
213159let version_method =
214160let open Version in
215161match version with
216-| Sslv3 -> sslv3_method ()
217-| Tlsv1 -> tlsv1_method ()
218-| Sslv23 -> sslv23_method ()
162+| Sslv3 -> Bindings.sslv3_method ()
163+| Tlsv1 -> Bindings.tlsv1_method ()
164+| Sslv23 -> Bindings.sslv23_method ()
219165in
220-match ssl_set_method t version_method with
166+match Bindings.Ssl.ssl_set_method t version_method with
221167| 1 -> ()
222168| e -> failwithf "Failed to set SSL version: %i" e ()
223169 ;;
224170225171let get_error =
226-let ssl_get_error =
227- foreign "SSL_get_error" Ctypes.(ptr void @-> int @-> returning int)
228-in
229172let module E = Ssl_error in
230173fun ssl ~retval ->
231- ssl_get_error ssl retval
174+Bindings.Ssl.ssl_get_error ssl retval
232175|> function
233176| 1 -> Error E.Ssl_error
234177| 2 -> Error E.Want_read
@@ -242,60 +185,43 @@ module Ssl = struct
242185 ;;
243186244187let set_initial_state =
245-let ssl_set_connect_state =
246- foreign "SSL_set_connect_state" Ctypes.(t @-> returning void)
247-in
248-let ssl_set_accept_state =
249- foreign "SSL_set_accept_state" Ctypes.(t @-> returning void)
250-in
251188fun ssl -> function
252-| `Connect -> ssl_set_connect_state ssl
253-| `Accept -> ssl_set_accept_state ssl
189+| `Connect -> Bindings.Ssl.ssl_set_connect_state ssl
190+| `Accept -> Bindings.Ssl.ssl_set_accept_state ssl
254191 ;;
255192256193let connect =
257-let ssl_connect = foreign "SSL_connect" Ctypes.(t @-> returning int) in
258194fun ssl ->
259-let retval = ssl_connect ssl in
195+let retval = Bindings.Ssl.ssl_connect ssl in
260196Result.(get_error ssl ~retval
261197>>= fun _ ->
262198if verbose then Debug.amf _here_ "SSL_connect -> %i" retval;
263199 return ())
264200 ;;
265201266202let accept =
267-let ssl_accept = foreign "SSL_accept" Ctypes.(t @-> returning int) in
268203fun ssl ->
269-let retval = ssl_accept ssl in
204+let retval = Bindings.Ssl.ssl_accept ssl in
270205Result.(get_error ssl ~retval
271206>>= fun _ ->
272207if verbose then Debug.amf _here_ "SSL_accept -> %i" retval;
273208 return ())
274209275210let set_bio =
276-let ssl_set_bio =
277- foreign "SSL_set_bio" Ctypes.(t @-> Bio.t @-> Bio.t @-> returning void)
278-in
279211fun ssl ~input ~output ->
280- ssl_set_bio ssl input output
212+Bindings.Ssl.ssl_set_bio ssl input output
281213 ;;
282214283215let read =
284-let ssl_read =
285- foreign "SSL_read" Ctypes.(t @-> ptr char @-> int @-> returning int)
286-in
287216fun ssl ~buf ~len ->
288-let retval = ssl_read ssl buf len in
217+let retval = Bindings.Ssl.ssl_read ssl buf len in
289218if verbose then Debug.amf _here_ "SSL_read(%i) -> %i" len retval;
290219 get_error ssl ~retval
291220 ;;
292221293222let write =
294-let ssl_write =
295- foreign "SSL_write" Ctypes.(t @-> string @-> int @-> returning int)
296-in
297223fun ssl ~buf ~len ->
298-let retval = ssl_write ssl buf len in
224+let retval = Bindings.Ssl.ssl_write ssl buf len in
299225if verbose then Debug.amf _here_ "SSL_write(%i) -> %i" len retval;
300226 get_error ssl ~retval
301227 ;;
@@ -306,26 +232,20 @@ module Ssl = struct
306232 ;;
307233308234let use_certificate_file =
309-let ssl_use_certificate_file =
310- foreign "SSL_use_certificate_file" Ctypes.(t @-> string @-> int @-> returning int)
311-in
312235fun ssl ~crt ~file_type ->
313236let c_enum = type_to_c_enum file_type in
314237In_thread.run (fun () ->
315-let retval = ssl_use_certificate_file ssl crt c_enum in
238+let retval = Bindings.Ssl.ssl_use_certificate_file ssl crt c_enum in
316239if retval > 0
317240then Ok ()
318241else Error (get_error_stack ()))
319242 ;;
320243321244let use_private_key_file =
322-let ssl_use_private_key_file =
323- foreign "SSL_use_PrivateKey_file" Ctypes.(t @-> string @-> int @-> returning int)
324-in
325245fun ssl ~key ~file_type ->
326246let c_enum = type_to_c_enum file_type in
327247In_thread.run (fun () ->
328-let retval = ssl_use_private_key_file ssl key c_enum in
248+let retval = Bindings.Ssl.ssl_use_private_key_file ssl key c_enum in
329249if retval > 0
330250then Ok ()
331251else Error (get_error_stack ()))