File: ssl_context.ml

package info (click to toggle)
ocaml-ssl 0.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 448 kB
  • sloc: ml: 1,568; ansic: 1,547; makefile: 35
file content (143 lines) | stat: -rw-r--r-- 6,086 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
open Ssl
open Alcotest
open Util

let certfile = open_in "client.pem"
let certstring = really_input_string certfile (in_channel_length certfile)
let clientkeyfile = open_in "client.key"

let clientkeystring =
  really_input_string clientkeyfile (in_channel_length clientkeyfile)

let serverkeyfile = open_in "server.key"

let serverkeystring =
  really_input_string serverkeyfile (in_channel_length serverkeyfile)

let test_create_context () =
  Ssl.create_context TLSv1_3 Server_context |> ignore;
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error)

let test_add_extra_chain_cert () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.add_extra_chain_cert context certstring;
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error);
  check_raises "certificate error" (Certificate_error "") (fun () ->
      try Ssl.add_extra_chain_cert context "" with
      | Certificate_error _ -> raise (Certificate_error ""))

let test_add_cert_to_store () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.add_cert_to_store context certstring;
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error);
  check_raises "certificate error" (Certificate_error "") (fun () ->
      try Ssl.add_cert_to_store context "" with
      | Certificate_error _ -> raise (Certificate_error ""))

let test_use_certificate () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.use_certificate context "client.pem" "client.key";
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error);
  check_raises "certificate error" (Certificate_error "") (fun () ->
      try Ssl.use_certificate context "" "client.key" with
      | Certificate_error _ -> raise (Certificate_error ""));
  check_raises "key error" (Private_key_error "") (fun () ->
      try Ssl.use_certificate context "client.pem" "" with
      | Private_key_error _ -> raise (Private_key_error ""));
  check_raises "unmatching key" (Private_key_error "") (fun () ->
      try Ssl.use_certificate context "client.pem" "server.key" with
      | Private_key_error _ -> raise (Private_key_error ""))

let test_use_certificate_from_string () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.use_certificate_from_string context certstring clientkeystring;
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error);
  check_raises "certificate error" (Certificate_error "") (fun () ->
      try Ssl.use_certificate_from_string context "" clientkeystring with
      | Certificate_error _ -> raise (Certificate_error ""));
  check_raises "key error" (Private_key_error "") (fun () ->
      try Ssl.use_certificate_from_string context certstring "" with
      | Private_key_error _ -> raise (Private_key_error ""));
  check_raises "unmatching key" (Private_key_error "") (fun () ->
      try
        Ssl.use_certificate_from_string context certstring serverkeystring
      with
      | Private_key_error _ -> raise (Private_key_error ""))

let test_set_password_callback () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.set_password_callback context (fun _ -> "password");
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error)

let test_set_client_CA_list_from_file () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.set_client_CA_list_from_file context "ca.pem";
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error);
  check_raises "certificate error" (Certificate_error "") (fun () ->
      try Ssl.set_client_CA_list_from_file context "" with
      | Certificate_error _ -> raise (Certificate_error ""))

let test_set_client_verify_callback () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.set_verify_depth context 1;
  Ssl.use_certificate context "client.pem" "client.key";
  Ssl.set_client_verify_callback_verbose true;
  Ssl.set_verify context [ Verify_peer ] (Some Ssl.client_verify_callback);
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error);
  check_raises "verify depth error" (Invalid_argument "depth") (fun () ->
      Ssl.set_verify_depth context (-1))

let test_context_alpn () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  Ssl.set_context_alpn_protos context [ "http/1.1" ];
  Ssl.set_context_alpn_select_callback context (fun _ -> Some "http/1.1");
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error)

let test_set_version () =
  let context = Ssl.create_context TLSv1_3 Server_context in
  check bool "no errors" true (Ssl.get_error_string () |> check_ssl_no_error);
  let[@alert "-deprecated"] tlsv1 = TLSv1 in
  Ssl.set_min_protocol_version context tlsv1;
  check
    protocol_testable
    "min version"
    tlsv1
    (Ssl.get_min_protocol_version context);
  check
    protocol_testable
    "max version"
    TLSv1_3
    (Ssl.get_max_protocol_version context);
  (* Set max *)
  Ssl.set_max_protocol_version context TLSv1_2;
  check
    protocol_testable
    "max version"
    TLSv1_2
    (Ssl.get_max_protocol_version context)

let () =
  Alcotest.run
    "Ssl context"
    [ ( "Context"
      , [ test_case "Create context" `Quick test_create_context
        ; test_case "Add extra chain cert" `Quick test_add_extra_chain_cert
        ; test_case "Add cert to store" `Quick test_add_cert_to_store
        ; test_case "Use certificate" `Quick test_use_certificate
        ; test_case
            "Use certificate from string"
            `Quick
            test_use_certificate_from_string
        ; test_case "Set password callback" `Quick test_set_password_callback
        ; test_case
            "Set client CA list from file"
            `Quick
            test_set_client_CA_list_from_file
        ; test_case
            "Set verify functions"
            `Quick
            test_set_client_verify_callback
        ; test_case "Context alpn" `Quick test_context_alpn
        ; test_case "Set min / max protocol version" `Quick test_set_version
        ] )
    ]