@@ -3,7 +3,6 @@ open State
3
3
4
4
type state = State .state
5
5
6
- type client_hello_errors = State .client_hello_errors
7
6
type error = State .error
8
7
type fatal = State .fatal
9
8
type failure = State .failure
@@ -21,44 +20,17 @@ let alert_of_error = function
21
20
| `CouldntSelectCertificate -> Packet. HANDSHAKE_FAILURE
22
21
23
22
let alert_of_fatal = function
24
- | `NoSecureRenegotiation -> Packet. HANDSHAKE_FAILURE
25
- | `NoSupportedGroup -> Packet. HANDSHAKE_FAILURE
26
- | `MACUnderflow -> Packet. BAD_RECORD_MAC
27
- | `MACMismatch -> Packet. BAD_RECORD_MAC
28
- | `RecordOverflow _ -> Packet. RECORD_OVERFLOW
29
- | `UnknownRecordVersion _ -> Packet. PROTOCOL_VERSION
30
- | `UnknownContentType _ -> Packet. UNEXPECTED_MESSAGE
31
- | `ReaderError (Reader. TrailingBytes _ | Reader. WrongLength _ ) -> Packet. UNEXPECTED_MESSAGE
32
- | `ReaderError (Reader. Unknown _ ) -> Packet. DECODE_ERROR
33
- | `CannotHandleApplicationDataYet -> Packet. UNEXPECTED_MESSAGE
34
- | `BadRecordVersion _ -> Packet. PROTOCOL_VERSION
35
- | `InvalidRenegotiation -> Packet. HANDSHAKE_FAILURE
36
- | `InvalidServerHello -> Packet. UNSUPPORTED_EXTENSION
37
- | `InvalidRenegotiationVersion _ -> Packet. HANDSHAKE_FAILURE
38
- | `BadCertificate _ -> Packet. BAD_CERTIFICATE
39
- | `NoVersions _ -> Packet. PROTOCOL_VERSION
40
- | `BadDH _ -> Packet. ILLEGAL_PARAMETER
41
- | `BadFinished -> Packet. DECRYPT_ERROR
42
- | `HandshakeFragmentsNotEmpty -> Packet. HANDSHAKE_FAILURE
43
- | `InvalidSession -> Packet. HANDSHAKE_FAILURE
44
- | `UnexpectedCCS -> Packet. UNEXPECTED_MESSAGE
45
- | `UnexpectedHandshake _ -> Packet. UNEXPECTED_MESSAGE
46
- | `SignatureVerificationFailed _ -> Packet. HANDSHAKE_FAILURE
47
- | `SigningFailed _ -> Packet. HANDSHAKE_FAILURE
48
- | `InvalidClientHello `NoSignatureAlgorithmsExtension
49
- | `InvalidClientHello `NoKeyShareExtension
50
- | `InvalidClientHello `NoSupportedGroupExtension -> Packet. MISSING_EXTENSION
51
- | `InvalidClientHello (`NotSetSupportedGroup _)
52
- | `InvalidClientHello (`NotSetKeyShare _)
53
- | `InvalidClientHello (`NotSubsetKeyShareSupportedGroup _ ) -> Packet. ILLEGAL_PARAMETER
54
- | `InvalidClientHello _ -> Packet. HANDSHAKE_FAILURE
55
- | `InappropriateFallback -> Packet. INAPPROPRIATE_FALLBACK
56
- | `NoApplicationProtocol -> Packet. NO_APPLICATION_PROTOCOL
57
- | `InvalidMessage -> Packet. HANDSHAKE_FAILURE
58
- | `Toomany0rttbytes -> Packet. UNEXPECTED_MESSAGE
59
- | `MissingContentType -> Packet. UNEXPECTED_MESSAGE
60
- | `Downgrade12 | `Downgrade11 -> Packet. ILLEGAL_PARAMETER
61
- | `WriteHalfClosed -> Packet. UNEXPECTED_MESSAGE
23
+ | `Protocol_version _ -> Packet. PROTOCOL_VERSION
24
+ | `Unexpected _ -> Packet. UNEXPECTED_MESSAGE
25
+ | `Decode _ -> Packet. DECODE_ERROR
26
+ | `Handshake _ -> Packet. HANDSHAKE_FAILURE
27
+ | `Bad_mac -> Packet. BAD_RECORD_MAC
28
+ | `Record_overflow _ -> Packet. RECORD_OVERFLOW
29
+ | `Unsupported_extension -> Packet. UNSUPPORTED_EXTENSION
30
+ | `Bad_certificate _ -> Packet. BAD_CERTIFICATE
31
+ | `Missing_extension _ -> Packet. MISSING_EXTENSION
32
+ | `Inappropriate_fallback -> Packet. INAPPROPRIATE_FALLBACK
33
+ | `No_application_protocol -> Packet. NO_APPLICATION_PROTOCOL
62
34
63
35
let alert_of_failure = function
64
36
| `Error x -> Packet. FATAL , alert_of_error x
@@ -178,13 +150,13 @@ let verify_mac sequence mac mac_k ty ver decrypted =
178
150
let module H = (val Digestif. module_of_hash' mac) in
179
151
String. length decrypted - H. digest_size
180
152
in
181
- let * () = guard (macstart > = 0 ) (`Fatal `MACUnderflow ) in
153
+ let * () = guard (macstart > = 0 ) (`Fatal ( `Decode " MAC underflow " ) ) in
182
154
let (body, mmac) = split_str decrypted macstart in
183
155
let cmac =
184
156
let ver = pair_of_tls_version ver in
185
157
let hdr = Crypto. pseudo_header sequence ty ver (String. length body) in
186
158
Crypto. mac mac mac_k hdr body in
187
- let * () = guard (String. equal cmac mmac) (`Fatal `MACMismatch ) in
159
+ let * () = guard (String. equal cmac mmac) (`Fatal `Bad_mac ) in
188
160
Ok body
189
161
190
162
@@ -202,7 +174,7 @@ let decrypt ?(trial = false) (version : tls_version) (st : crypto_state) ty buf
202
174
https://www.openssl.org/~bodo/tls-cbc.txt *)
203
175
let mask_decrypt_failure seq mac mac_k =
204
176
let * _ = compute_mac seq mac mac_k buf in
205
- Error (`Fatal `MACMismatch )
177
+ Error (`Fatal `Bad_mac )
206
178
in
207
179
208
180
let dec ctx =
@@ -223,7 +195,7 @@ let decrypt ?(trial = false) (version : tls_version) (st : crypto_state) ty buf
223
195
Ok (CBC { c with iv_mode = Iv iv' }, msg)
224
196
| Random_iv ->
225
197
if String. length buf < Crypto. cbc_block c.cipher then
226
- Error (`Fatal `MACUnderflow )
198
+ Error (`Fatal ( `Decode " MAC underflow " ) )
227
199
else
228
200
let iv, buf = split_str buf (Crypto. cbc_block c.cipher) in
229
201
let * msg, _ = dec iv buf in
@@ -233,7 +205,7 @@ let decrypt ?(trial = false) (version : tls_version) (st : crypto_state) ty buf
233
205
if c.explicit_nonce then
234
206
let explicit_nonce_len = 8 in
235
207
if String. length buf < explicit_nonce_len then
236
- Error (`Fatal `MACUnderflow )
208
+ Error (`Fatal ( `Decode " MAC underflow " ) )
237
209
else
238
210
let explicit_nonce, buf = split_str buf explicit_nonce_len in
239
211
let adata =
@@ -242,7 +214,7 @@ let decrypt ?(trial = false) (version : tls_version) (st : crypto_state) ty buf
242
214
and nonce = c.nonce ^ explicit_nonce
243
215
in
244
216
match Crypto. decrypt_aead ~cipher: c.cipher ~key: c.cipher_secret ~nonce ~adata buf with
245
- | None -> Error (`Fatal `MACMismatch )
217
+ | None -> Error (`Fatal `Bad_mac )
246
218
| Some x -> Ok (AEAD c, x)
247
219
else
248
220
(* RFC 7905: no explicit nonce, instead TLS 1.3 construction is adapted *)
@@ -252,7 +224,7 @@ let decrypt ?(trial = false) (version : tls_version) (st : crypto_state) ty buf
252
224
and nonce = Crypto. aead_nonce c.nonce seq
253
225
in
254
226
(match Crypto. decrypt_aead ~adata ~cipher: c.cipher ~key: c.cipher_secret ~nonce buf with
255
- | None -> Error (`Fatal `MACMismatch )
227
+ | None -> Error (`Fatal `Bad_mac )
256
228
| Some x -> Ok (AEAD c, x))
257
229
in
258
230
match st, version with
@@ -275,12 +247,12 @@ let decrypt ?(trial = false) (version : tls_version) (st : crypto_state) ty buf
275
247
let nonce = Crypto. aead_nonce c.nonce ctx.sequence in
276
248
let unpad x =
277
249
let rec eat = function
278
- | - 1 -> Error (`Fatal `MissingContentType )
250
+ | - 1 -> Error (`Fatal ( `Unexpected ( `Message " missing content type " )) )
279
251
| idx -> match String. get_uint8 x idx with
280
252
| 0 -> eat (pred idx)
281
253
| n -> match Packet. int_to_content_type n with
282
254
| Some ct -> Ok (String. sub x 0 idx, ct)
283
- | None -> Error (`Fatal (`UnknownContentType n ))
255
+ | None -> Error (`Fatal (`Unexpected ( `Content_type n) ))
284
256
in
285
257
eat (pred (String. length x))
286
258
in
@@ -290,12 +262,13 @@ let decrypt ?(trial = false) (version : tls_version) (st : crypto_state) ty buf
290
262
if trial then
291
263
Ok (Some ctx, " " , Packet. APPLICATION_DATA )
292
264
else
293
- Error (`Fatal `MACMismatch )
265
+ Error (`Fatal `Bad_mac )
294
266
| Some x ->
295
267
let * data, ty = unpad x in
296
268
Ok (Some { ctx with sequence = Int64. succ ctx.sequence }, data, ty))
297
- | _ -> Error (`Fatal `InvalidMessage ))
298
- | _ -> Error (`Fatal `InvalidMessage ))
269
+ | _ -> Error (`Fatal (`Handshake (`Message " unexpected cipher state (must be AEAD)" ))))
270
+ | _ ->
271
+ Error (`Fatal (`Handshake (`Message " unexpected content type (TLS 1.3)" ))))
299
272
| Some ctx , _ ->
300
273
let * st', msg = dec ctx in
301
274
let ctx' = { cipher_st = st' ; sequence = Int64. succ ctx.sequence } in
@@ -392,7 +365,7 @@ let handle_change_cipher_spec = function
392
365
| Server13 AwaitClientHelloHRR13
393
366
| Server13 (AwaitClientCertificate13 _)
394
367
| Server13 (AwaitClientFinished13 _ ) -> (fun s _ -> Ok (s, [] ))
395
- | _ -> (fun _ _ -> Error (`Fatal `UnexpectedCCS ))
368
+ | _ -> (fun _ _ -> Error (`Fatal ( `Unexpected ( `Message " change cipher spec " )) ))
396
369
397
370
and handle_handshake = function
398
371
| Client cs -> Handshake_client. handle_handshake cs
@@ -420,7 +393,7 @@ let handle_packet hs buf = function
420
393
(Tracing. cs ~tag: " application-data-in" buf;
421
394
Ok (hs, [] , non_empty buf, false ))
422
395
else
423
- Error (`Fatal `CannotHandleApplicationDataYet )
396
+ Error (`Fatal ( `Unexpected ( `Message " application data " )) )
424
397
425
398
| Packet. CHANGE_CIPHER_SPEC ->
426
399
let * hs, items = handle_change_cipher_spec hs.machina hs buf in
@@ -442,7 +415,10 @@ let decrement_early_data hs ty buf =
442
415
let bytes left cipher =
443
416
let count = String. length buf - fst (Ciphersuite. kn_13 (Ciphersuite. privprot13 cipher)) in
444
417
let left' = Int32. sub left (Int32. of_int count) in
445
- if left' < 0l then Error (`Fatal `Toomany0rttbytes ) else Ok left'
418
+ if left' < 0l then
419
+ Error (`Fatal (`Unexpected (`Message " too many 0RTT bytes" )))
420
+ else
421
+ Ok left'
446
422
in
447
423
if ty = Packet. APPLICATION_DATA && early_data hs then
448
424
let cipher = match hs.session with
@@ -466,8 +442,12 @@ let handle_raw_record state (hdr, buf as record : raw_record) =
466
442
| Client (AwaitServerHello _ ), _ -> Ok ()
467
443
| Server AwaitClientHello , _ -> Ok ()
468
444
| Server13 AwaitClientHelloHRR13 , _ -> Ok ()
469
- | _ , `TLS_1_3 -> guard (hdr.version = `TLS_1_2 ) (`Fatal (`BadRecordVersion hdr.version))
470
- | _ , v -> guard (version_eq hdr.version v) (`Fatal (`BadRecordVersion hdr.version))
445
+ | _ , `TLS_1_3 ->
446
+ guard (hdr.version = `TLS_1_2 )
447
+ (`Fatal (`Protocol_version (`Bad_record hdr.version)))
448
+ | _ , v ->
449
+ guard (version_eq hdr.version v)
450
+ (`Fatal (`Protocol_version (`Bad_record hdr.version)))
471
451
in
472
452
let trial = match hs.machina with
473
453
| Server13 (AwaitEndOfEarlyData13 _ ) | Server13 Established13 -> false
@@ -607,7 +587,7 @@ let reneg ?authenticator ?acceptable_cas ?cert st =
607
587
608
588
let key_update ?(request = true ) state =
609
589
if state.write_closed then
610
- Error (`Fatal `WriteHalfClosed )
590
+ Error (`Fatal ( `Unexpected ( `Message " write half already closed " )) )
611
591
else
612
592
let * state', out = Handshake_common. output_key_update ~request state in
613
593
let _, outbuf = send_records state [out] in
0 commit comments