GitHub

@@ -2,7 +2,7 @@ open Core.Std

22

open Async.Std

33

open Import

445-

let foreign = Foreign.foreign

5+

module Bindings = Ffi_bindings.Bindings(Ffi_generated)

6677

module Ssl_error = struct

88

type t =

@@ -27,26 +27,20 @@ let bigstring_strlen bigstr =

2727

;;

28282929

let 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

3630

let err_error_string =

3731

(* We need to write error strings from C into bigstrings. To reduce allocation, reuse

3832

scratch space for this. *)

3933

let scratch_space = Bigstring.create 1024 in

4034

fun 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);

4539

Bigstring.to_string ~len:(bigstring_strlen scratch_space) scratch_space

4640

in

4741

fun () ->

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. :( *)

5751

let 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

6452

fun () ->

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 *)

7159

let 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

7660

let initialized = ref false in

7761

fun () ->

7862

if 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 ();

8569

end

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-9372

module Ssl_ctx = struct

94-9573

type t = unit Ctypes.ptr

96749775

let t = Ctypes.(ptr void) (* for use in ctypes type signatures *)

98769977

let sexp_of_t x = Ctypes.(ptr_diff x null) |> <:sexp_of<int>>

1007810179

let 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

11380

fun ver ->

11481

possibly_init ();

11582

let ver_method =

11683

let module V = Version in

11784

match 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 ()

12188

in

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

;;

1289512996

let 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

13497

fun ?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

152115

let sexp_of_t bio = Ctypes.(ptr_diff bio null) |> <:sexp_of<int>>

153116154117

let 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

161118

fun () ->

162-

bio_s_mem ()

163-

|> bio_new

119+

Bindings.Bio.bio_s_mem ()

120+

|> Bindings.Bio.bio_new

164121

;;

165122166123

let read =

167-

let bio_read =

168-

foreign "BIO_read" Ctypes.(t @-> ptr char @-> int @-> returning int)

169-

in

170124

fun bio ~buf ~len ->

171-

let retval = bio_read bio buf len in

125+

let retval = Bindings.Bio.bio_read bio buf len in

172126

if verbose then Debug.amf _here_ "BIO_read(%i) -> %i" len retval;

173127

retval

174128

;;

175129176130

let write =

177-

let bio_write =

178-

foreign "BIO_write" Ctypes.(t @-> string @-> int @-> returning int)

179-

in

180131

fun bio ~buf ~len ->

181-

let retval = bio_write bio buf len in

132+

let retval = Bindings.Bio.bio_write bio buf len in

182133

if verbose then Debug.amf _here_ "BIO_write(%i) -> %i" len retval;

183134

retval

184135

;;

@@ -193,42 +144,34 @@ module Ssl = struct

193144

let sexp_of_t ssl = Ctypes.(ptr_diff ssl null) |> <:sexp_of<int>>

194145195146

let 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

198147

fun ctx ->

199-

let p = ssl_new ctx in

148+

let p = Bindings.Ssl.ssl_new ctx in

200149

if p = Ctypes.null

201150

then failwith "Unable to allocate an SSL connection."

202151

else begin

203-

Gc.add_finalizer_exn p ssl_free;

152+

Gc.add_finalizer_exn p Bindings.Ssl.ssl_free;

204153

p

205154

end

206155

;;

207156208157

let set_method =

209-

let ssl_set_method =

210-

foreign "SSL_set_ssl_method" Ctypes.(t @-> ptr void @-> returning int)

211-

in

212158

fun t version ->

213159

let version_method =

214160

let open Version in

215161

match 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 ()

219165

in

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

;;

224170225171

let get_error =

226-

let ssl_get_error =

227-

foreign "SSL_get_error" Ctypes.(ptr void @-> int @-> returning int)

228-

in

229172

let module E = Ssl_error in

230173

fun 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

;;

243186244187

let 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

251188

fun 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

;;

255192256193

let connect =

257-

let ssl_connect = foreign "SSL_connect" Ctypes.(t @-> returning int) in

258194

fun ssl ->

259-

let retval = ssl_connect ssl in

195+

let retval = Bindings.Ssl.ssl_connect ssl in

260196

Result.(get_error ssl ~retval

261197

>>= fun _ ->

262198

if verbose then Debug.amf _here_ "SSL_connect -> %i" retval;

263199

return ())

264200

;;

265201266202

let accept =

267-

let ssl_accept = foreign "SSL_accept" Ctypes.(t @-> returning int) in

268203

fun ssl ->

269-

let retval = ssl_accept ssl in

204+

let retval = Bindings.Ssl.ssl_accept ssl in

270205

Result.(get_error ssl ~retval

271206

>>= fun _ ->

272207

if verbose then Debug.amf _here_ "SSL_accept -> %i" retval;

273208

return ())

274209275210

let set_bio =

276-

let ssl_set_bio =

277-

foreign "SSL_set_bio" Ctypes.(t @-> Bio.t @-> Bio.t @-> returning void)

278-

in

279211

fun ssl ~input ~output ->

280-

ssl_set_bio ssl input output

212+

Bindings.Ssl.ssl_set_bio ssl input output

281213

;;

282214283215

let read =

284-

let ssl_read =

285-

foreign "SSL_read" Ctypes.(t @-> ptr char @-> int @-> returning int)

286-

in

287216

fun ssl ~buf ~len ->

288-

let retval = ssl_read ssl buf len in

217+

let retval = Bindings.Ssl.ssl_read ssl buf len in

289218

if verbose then Debug.amf _here_ "SSL_read(%i) -> %i" len retval;

290219

get_error ssl ~retval

291220

;;

292221293222

let write =

294-

let ssl_write =

295-

foreign "SSL_write" Ctypes.(t @-> string @-> int @-> returning int)

296-

in

297223

fun ssl ~buf ~len ->

298-

let retval = ssl_write ssl buf len in

224+

let retval = Bindings.Ssl.ssl_write ssl buf len in

299225

if 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

;;

307233308234

let use_certificate_file =

309-

let ssl_use_certificate_file =

310-

foreign "SSL_use_certificate_file" Ctypes.(t @-> string @-> int @-> returning int)

311-

in

312235

fun ssl ~crt ~file_type ->

313236

let c_enum = type_to_c_enum file_type in

314237

In_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

316239

if retval > 0

317240

then Ok ()

318241

else Error (get_error_stack ()))

319242

;;

320243321244

let 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

325245

fun ssl ~key ~file_type ->

326246

let c_enum = type_to_c_enum file_type in

327247

In_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

329249

if retval > 0

330250

then Ok ()

331251

else Error (get_error_stack ()))

Read the original on github.com ↗