(** Ciphersuite definitions and some helper functions. *) (** sum type of all possible key exchange methods *) type key_exchange_algorithm_dhe = [ `FFDHE | `ECDHE ] type key_exchange_algorithm = [ key_exchange_algorithm_dhe | `RSA ] let pp_key_exchange_algorithm_dhe ppf = function | `FFDHE -> Fmt.string ppf "FFDHE" | `ECDHE -> Fmt.string ppf "ECDHE" let pp_key_exchange_algorithm ppf = function | #key_exchange_algorithm_dhe as d -> pp_key_exchange_algorithm_dhe ppf d | `RSA -> Fmt.string ppf "RSA" (** [required_usage kex] is [usage] which a certificate must have if it is used in the given [kex] method *) let required_usage = function | #key_exchange_algorithm_dhe -> `Digital_signature | `RSA -> `Key_encipherment type block_cipher = | TRIPLE_DES_EDE_CBC | AES_128_CBC | AES_256_CBC let pp_block_cipher ppf = function | TRIPLE_DES_EDE_CBC -> Fmt.string ppf "3DES EDE CBC" | AES_128_CBC -> Fmt.string ppf "AES128 CBC" | AES_256_CBC -> Fmt.string ppf "AES256 CBC" type aead_cipher = | AES_128_CCM | AES_256_CCM | AES_128_GCM | AES_256_GCM | CHACHA20_POLY1305 let pp_aead_cipher ppf = function | AES_128_CCM -> Fmt.string ppf "AES128 CCM" | AES_256_CCM -> Fmt.string ppf "AES256 CCM" | AES_128_GCM -> Fmt.string ppf "AES128 GCM" | AES_256_GCM -> Fmt.string ppf "AES256 GCM" | CHACHA20_POLY1305 -> Fmt.string ppf "CHACHA20 POLY1305" type payload_protection13 = [ `AEAD of aead_cipher ] let pp_payload_protection13 ppf = function | `AEAD a -> Fmt.pf ppf "AEAD %a" pp_aead_cipher a type payload_protection = [ payload_protection13 | `Block of block_cipher * Digestif.hash' ] let pp_hash ppf = function | `MD5 -> Fmt.string ppf "MD5" | `SHA1 -> Fmt.string ppf "SHA1" | `SHA224 -> Fmt.string ppf "SHA224" | `SHA256 -> Fmt.string ppf "SHA256" | `SHA384 -> Fmt.string ppf "SHA384" | `SHA512 -> Fmt.string ppf "SHA512" let pp_payload_protection ppf = function | #payload_protection13 as p -> pp_payload_protection13 ppf p | `Block (b, h) -> Fmt.pf ppf "BLOCK %a %a" pp_block_cipher b pp_hash h (* this is K_LEN, max 8 N_MIN from RFC5116 sections 5.1 & 5.2 -- as defined in TLS1.3 RFC 8446 Section 5.3 *) let kn_13 = function | AES_128_GCM -> (16, 12) | AES_256_GCM -> (32, 12) | AES_128_CCM -> (16, 12) | AES_256_CCM -> (32, 12) | CHACHA20_POLY1305 -> (32, 12) (** [key_length iv payload_protection] is [(key size, IV size, mac size)] where key IV, and mac sizes are the required bytes for the given [payload_protection] *) (* NB only used for <= TLS 1.2, IV length for AEAD defined in RFC 5288 Section 3 (for GCM), salt[4] for CCM in RFC 6655 Section 3 *) let key_length iv pp = let mac_size m = let module H = (val Digestif.module_of_hash' m) in H.digest_size in match pp with | `AEAD AES_128_CCM -> (16, 4 , 0) | `AEAD AES_256_CCM -> (32, 4 , 0) | `AEAD AES_128_GCM -> (16, 4 , 0) | `AEAD AES_256_GCM -> (32, 4 , 0) | `AEAD CHACHA20_POLY1305 -> (32, 12, 0) | `Block (bc, mac) -> let keylen, ivlen = match bc with | TRIPLE_DES_EDE_CBC -> (24, 8) | AES_128_CBC -> (16, 16) | AES_256_CBC -> (32, 16) and maclen = mac_size mac in match iv with | None -> (keylen, 0, maclen) | Some () -> (keylen, ivlen, maclen) type ciphersuite13 = [ | `AES_128_GCM_SHA256 | `AES_256_GCM_SHA384 | `CHACHA20_POLY1305_SHA256 | `AES_128_CCM_SHA256 ] let privprot13 = function | `AES_128_GCM_SHA256 -> AES_128_GCM | `AES_256_GCM_SHA384 -> AES_256_GCM | `CHACHA20_POLY1305_SHA256 -> CHACHA20_POLY1305 | `AES_128_CCM_SHA256 -> AES_128_CCM let hash13 = function | `AES_128_GCM_SHA256 -> `SHA256 | `AES_256_GCM_SHA384 -> `SHA384 | `CHACHA20_POLY1305_SHA256 -> `SHA256 | `AES_128_CCM_SHA256 -> `SHA256 let any_ciphersuite_to_ciphersuite13 = function | Packet.TLS_AES_128_GCM_SHA256 -> Some `AES_128_GCM_SHA256 | Packet.TLS_AES_256_GCM_SHA384 -> Some `AES_256_GCM_SHA384 | Packet.TLS_CHACHA20_POLY1305_SHA256 -> Some `CHACHA20_POLY1305_SHA256 | Packet.TLS_AES_128_CCM_SHA256 -> Some `AES_128_CCM_SHA256 | _ -> None type ciphersuite = [ ciphersuite13 | `DHE_RSA_WITH_AES_128_GCM_SHA256 | `DHE_RSA_WITH_AES_256_GCM_SHA384 | `DHE_RSA_WITH_AES_256_CCM | `DHE_RSA_WITH_AES_128_CCM | `DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | `DHE_RSA_WITH_AES_256_CBC_SHA256 | `DHE_RSA_WITH_AES_128_CBC_SHA256 | `DHE_RSA_WITH_AES_256_CBC_SHA | `DHE_RSA_WITH_AES_128_CBC_SHA | `DHE_RSA_WITH_3DES_EDE_CBC_SHA | `ECDHE_RSA_WITH_AES_128_GCM_SHA256 | `ECDHE_RSA_WITH_AES_256_GCM_SHA384 | `ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | `ECDHE_RSA_WITH_AES_256_CBC_SHA384 | `ECDHE_RSA_WITH_AES_128_CBC_SHA256 | `ECDHE_RSA_WITH_AES_256_CBC_SHA | `ECDHE_RSA_WITH_AES_128_CBC_SHA | `ECDHE_RSA_WITH_3DES_EDE_CBC_SHA | `RSA_WITH_AES_256_CBC_SHA256 | `RSA_WITH_AES_128_CBC_SHA256 | `RSA_WITH_AES_256_CBC_SHA | `RSA_WITH_AES_128_CBC_SHA | `RSA_WITH_3DES_EDE_CBC_SHA | `RSA_WITH_AES_128_GCM_SHA256 | `RSA_WITH_AES_256_GCM_SHA384 | `RSA_WITH_AES_256_CCM | `RSA_WITH_AES_128_CCM | `ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA | `ECDHE_ECDSA_WITH_AES_128_CBC_SHA | `ECDHE_ECDSA_WITH_AES_256_CBC_SHA | `ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | `ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | `ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | `ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | `ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 ] let ciphersuite_to_ciphersuite13 : ciphersuite -> ciphersuite13 option = function | #ciphersuite13 as cs -> Some cs | _ -> None let any_ciphersuite_to_ciphersuite = function | Packet.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 -> Some `DHE_RSA_WITH_AES_256_CBC_SHA256 | Packet.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 -> Some `DHE_RSA_WITH_AES_128_CBC_SHA256 | Packet.TLS_DHE_RSA_WITH_AES_256_CBC_SHA -> Some `DHE_RSA_WITH_AES_256_CBC_SHA | Packet.TLS_DHE_RSA_WITH_AES_128_CBC_SHA -> Some `DHE_RSA_WITH_AES_128_CBC_SHA | Packet.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA -> Some `DHE_RSA_WITH_3DES_EDE_CBC_SHA | Packet.TLS_RSA_WITH_AES_256_CBC_SHA256 -> Some `RSA_WITH_AES_256_CBC_SHA256 | Packet.TLS_RSA_WITH_AES_128_CBC_SHA256 -> Some `RSA_WITH_AES_128_CBC_SHA256 | Packet.TLS_RSA_WITH_AES_256_CBC_SHA -> Some `RSA_WITH_AES_256_CBC_SHA | Packet.TLS_RSA_WITH_AES_128_CBC_SHA -> Some `RSA_WITH_AES_128_CBC_SHA | Packet.TLS_RSA_WITH_3DES_EDE_CBC_SHA -> Some `RSA_WITH_3DES_EDE_CBC_SHA | Packet.TLS_RSA_WITH_AES_128_CCM -> Some `RSA_WITH_AES_128_CCM | Packet.TLS_RSA_WITH_AES_256_CCM -> Some `RSA_WITH_AES_256_CCM | Packet.TLS_DHE_RSA_WITH_AES_128_CCM -> Some `DHE_RSA_WITH_AES_128_CCM | Packet.TLS_DHE_RSA_WITH_AES_256_CCM -> Some `DHE_RSA_WITH_AES_256_CCM | Packet.TLS_RSA_WITH_AES_128_GCM_SHA256 -> Some `RSA_WITH_AES_128_GCM_SHA256 | Packet.TLS_RSA_WITH_AES_256_GCM_SHA384 -> Some `RSA_WITH_AES_256_GCM_SHA384 | Packet.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 -> Some `DHE_RSA_WITH_AES_128_GCM_SHA256 | Packet.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 -> Some `DHE_RSA_WITH_AES_256_GCM_SHA384 | Packet.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -> Some `ECDHE_RSA_WITH_AES_128_GCM_SHA256 | Packet.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 -> Some `ECDHE_RSA_WITH_AES_256_GCM_SHA384 | Packet.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 -> Some `ECDHE_RSA_WITH_AES_256_CBC_SHA384 | Packet.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 -> Some `ECDHE_RSA_WITH_AES_128_CBC_SHA256 | Packet.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA -> Some `ECDHE_RSA_WITH_AES_256_CBC_SHA | Packet.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA -> Some `ECDHE_RSA_WITH_AES_128_CBC_SHA | Packet.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA -> Some `ECDHE_RSA_WITH_3DES_EDE_CBC_SHA | Packet.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -> Some `ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | Packet.TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -> Some `DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | Packet.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA -> Some `ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA | Packet.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA -> Some `ECDHE_ECDSA_WITH_AES_128_CBC_SHA | Packet.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA -> Some `ECDHE_ECDSA_WITH_AES_256_CBC_SHA | Packet.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 -> Some `ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | Packet.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 -> Some `ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | Packet.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -> Some `ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | Packet.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -> Some `ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | Packet.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 -> Some `ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 | x -> any_ciphersuite_to_ciphersuite13 x let ciphersuite_to_any_ciphersuite = function | `DHE_RSA_WITH_AES_256_CBC_SHA256 -> Packet.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 | `DHE_RSA_WITH_AES_128_CBC_SHA256 -> Packet.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 | `DHE_RSA_WITH_AES_256_CBC_SHA -> Packet.TLS_DHE_RSA_WITH_AES_256_CBC_SHA | `DHE_RSA_WITH_AES_128_CBC_SHA -> Packet.TLS_DHE_RSA_WITH_AES_128_CBC_SHA | `DHE_RSA_WITH_3DES_EDE_CBC_SHA -> Packet.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA | `RSA_WITH_AES_256_CBC_SHA256 -> Packet.TLS_RSA_WITH_AES_256_CBC_SHA256 | `RSA_WITH_AES_128_CBC_SHA256 -> Packet.TLS_RSA_WITH_AES_128_CBC_SHA256 | `RSA_WITH_AES_256_CBC_SHA -> Packet.TLS_RSA_WITH_AES_256_CBC_SHA | `RSA_WITH_AES_128_CBC_SHA -> Packet.TLS_RSA_WITH_AES_128_CBC_SHA | `RSA_WITH_3DES_EDE_CBC_SHA -> Packet.TLS_RSA_WITH_3DES_EDE_CBC_SHA | `RSA_WITH_AES_128_CCM -> Packet.TLS_RSA_WITH_AES_128_CCM | `RSA_WITH_AES_256_CCM -> Packet.TLS_RSA_WITH_AES_256_CCM | `DHE_RSA_WITH_AES_128_CCM -> Packet.TLS_DHE_RSA_WITH_AES_128_CCM | `DHE_RSA_WITH_AES_256_CCM -> Packet.TLS_DHE_RSA_WITH_AES_256_CCM | `RSA_WITH_AES_128_GCM_SHA256 -> Packet.TLS_RSA_WITH_AES_128_GCM_SHA256 | `RSA_WITH_AES_256_GCM_SHA384 -> Packet.TLS_RSA_WITH_AES_256_GCM_SHA384 | `DHE_RSA_WITH_AES_128_GCM_SHA256 -> Packet.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 | `DHE_RSA_WITH_AES_256_GCM_SHA384 -> Packet.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 | `ECDHE_RSA_WITH_AES_128_GCM_SHA256 -> Packet.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | `ECDHE_RSA_WITH_AES_256_GCM_SHA384 -> Packet.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 | `ECDHE_RSA_WITH_AES_256_CBC_SHA384 -> Packet.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 | `ECDHE_RSA_WITH_AES_128_CBC_SHA256 -> Packet.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 | `ECDHE_RSA_WITH_AES_256_CBC_SHA -> Packet.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA | `ECDHE_RSA_WITH_AES_128_CBC_SHA -> Packet.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA | `ECDHE_RSA_WITH_3DES_EDE_CBC_SHA -> Packet.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA | `ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -> Packet.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | `DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -> Packet.TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | `AES_128_GCM_SHA256 -> Packet.TLS_AES_128_GCM_SHA256 | `AES_256_GCM_SHA384 -> Packet.TLS_AES_256_GCM_SHA384 | `CHACHA20_POLY1305_SHA256 -> Packet.TLS_CHACHA20_POLY1305_SHA256 | `AES_128_CCM_SHA256 -> Packet.TLS_AES_128_CCM_SHA256 | `ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA -> Packet.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA | `ECDHE_ECDSA_WITH_AES_128_CBC_SHA -> Packet.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA | `ECDHE_ECDSA_WITH_AES_256_CBC_SHA -> Packet.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA | `ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 -> Packet.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | `ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 -> Packet.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | `ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -> Packet.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | `ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -> Packet.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | `ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 -> Packet.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (** [get_kex_privprot ciphersuite] is [(kex, privacy_protection)] where it dissects the [ciphersuite] into a pair containing the key exchange method [kex], and its [privacy_protection] *) let get_keytype_kex_privprot = function | `RSA_WITH_3DES_EDE_CBC_SHA -> (`RSA, `RSA, `Block (TRIPLE_DES_EDE_CBC, `SHA1)) | `DHE_RSA_WITH_3DES_EDE_CBC_SHA -> (`RSA, `FFDHE, `Block (TRIPLE_DES_EDE_CBC, `SHA1)) | `RSA_WITH_AES_128_CBC_SHA -> (`RSA, `RSA, `Block (AES_128_CBC, `SHA1)) | `DHE_RSA_WITH_AES_128_CBC_SHA -> (`RSA, `FFDHE, `Block (AES_128_CBC, `SHA1)) | `RSA_WITH_AES_256_CBC_SHA -> (`RSA, `RSA, `Block (AES_256_CBC, `SHA1)) | `DHE_RSA_WITH_AES_256_CBC_SHA -> (`RSA, `FFDHE, `Block (AES_256_CBC, `SHA1)) | `RSA_WITH_AES_128_CBC_SHA256 -> (`RSA, `RSA, `Block (AES_128_CBC, `SHA256)) | `RSA_WITH_AES_256_CBC_SHA256 -> (`RSA, `RSA, `Block (AES_256_CBC, `SHA256)) | `DHE_RSA_WITH_AES_128_CBC_SHA256 -> (`RSA, `FFDHE, `Block (AES_128_CBC, `SHA256)) | `DHE_RSA_WITH_AES_256_CBC_SHA256 -> (`RSA, `FFDHE, `Block (AES_256_CBC, `SHA256)) | `RSA_WITH_AES_128_CCM -> (`RSA, `RSA, `AEAD AES_128_CCM) | `RSA_WITH_AES_256_CCM -> (`RSA, `RSA, `AEAD AES_256_CCM) | `DHE_RSA_WITH_AES_128_CCM -> (`RSA, `FFDHE, `AEAD AES_128_CCM) | `DHE_RSA_WITH_AES_256_CCM -> (`RSA, `FFDHE, `AEAD AES_256_CCM) | `RSA_WITH_AES_128_GCM_SHA256 -> (`RSA, `RSA, `AEAD AES_128_GCM) | `RSA_WITH_AES_256_GCM_SHA384 -> (`RSA, `RSA, `AEAD AES_256_GCM) | `DHE_RSA_WITH_AES_128_GCM_SHA256 -> (`RSA, `FFDHE, `AEAD AES_128_GCM) | `DHE_RSA_WITH_AES_256_GCM_SHA384 -> (`RSA, `FFDHE, `AEAD AES_256_GCM) | `ECDHE_RSA_WITH_AES_128_GCM_SHA256 -> (`RSA, `ECDHE, `AEAD AES_128_GCM) | `ECDHE_RSA_WITH_AES_256_GCM_SHA384 -> (`RSA, `ECDHE, `AEAD AES_256_GCM) | `ECDHE_RSA_WITH_AES_256_CBC_SHA384 -> (`RSA, `ECDHE, `Block (AES_256_CBC, `SHA384)) | `ECDHE_RSA_WITH_AES_128_CBC_SHA256 -> (`RSA, `ECDHE, `Block (AES_128_CBC, `SHA256)) | `ECDHE_RSA_WITH_AES_256_CBC_SHA -> (`RSA, `ECDHE, `Block (AES_256_CBC, `SHA1)) | `ECDHE_RSA_WITH_AES_128_CBC_SHA -> (`RSA, `ECDHE, `Block (AES_128_CBC, `SHA1)) | `ECDHE_RSA_WITH_3DES_EDE_CBC_SHA -> (`RSA, `ECDHE, `Block (TRIPLE_DES_EDE_CBC, `SHA1)) | `DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -> (`RSA, `FFDHE, `AEAD CHACHA20_POLY1305) | `ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -> (`RSA, `ECDHE, `AEAD CHACHA20_POLY1305) | `ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA -> (`EC, `ECDHE, `Block (TRIPLE_DES_EDE_CBC, `SHA1)) | `ECDHE_ECDSA_WITH_AES_128_CBC_SHA -> (`EC, `ECDHE, `Block (AES_128_CBC, `SHA1)) | `ECDHE_ECDSA_WITH_AES_256_CBC_SHA -> (`EC, `ECDHE, `Block (AES_256_CBC, `SHA1)) | `ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 -> (`EC, `ECDHE, `Block (AES_128_CBC, `SHA256)) | `ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 -> (`EC, `ECDHE, `Block (AES_256_CBC, `SHA384)) | `ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -> (`EC, `ECDHE, `AEAD AES_128_GCM) | `ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -> (`EC, `ECDHE, `AEAD AES_256_GCM) | `ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 -> (`EC, `ECDHE, `AEAD CHACHA20_POLY1305) | #ciphersuite13 as cs13 -> (`RSA, `FFDHE, `AEAD (privprot13 cs13)) (* this is mostly wrong *) (** [ciphersuite_kex ciphersuite] is [kex], first projection of [get_kex_privprot] *) let ciphersuite_kex c = let _keytype, kex, _pp = get_keytype_kex_privprot c in kex (** [ciphersuite_privprot ciphersuite] is [privprot], second projection of [get_kex_privprot] *) let ciphersuite_privprot c = let _keytype, _kex, pp = get_keytype_kex_privprot c in pp let ciphersuite_keytype c = let keytype, _kex, _pp = get_keytype_kex_privprot c in keytype let pp_ciphersuite ppf cs = let keytype, kex, pp = get_keytype_kex_privprot cs in let pp_keytype ppf = function | `EC -> Fmt.string ppf "ECDSA" | `RSA -> Fmt.string ppf "RSA" in match cs with | #ciphersuite13 -> Fmt.pf ppf "%a" pp_payload_protection pp | _ -> Fmt.pf ppf "%a %a %a" pp_key_exchange_algorithm kex pp_keytype keytype pp_payload_protection pp let pp_any_ciphersuite ppf cs = match any_ciphersuite_to_ciphersuite cs with | Some cs -> pp_ciphersuite ppf cs | None -> Fmt.pf ppf "ciphersuite %04X" (Packet.any_ciphersuite_to_int cs) let ciphersuite_fs cs = match ciphersuite_kex cs with | #key_exchange_algorithm_dhe -> true | `RSA -> false let ecdhe_only = function | #ciphersuite13 -> false | cs -> match get_keytype_kex_privprot cs with | (_, `ECDHE, _) -> true | _ -> false let dhe_only = function | #ciphersuite13 -> false | cs -> match get_keytype_kex_privprot cs with | (_, `FFDHE, _) -> true | _ -> false let ecdhe = function | #ciphersuite13 -> true | cs -> match get_keytype_kex_privprot cs with | (_, `ECDHE, _) -> true | _ -> false let ciphersuite_tls12_only = function | `DHE_RSA_WITH_AES_256_CBC_SHA256 | `DHE_RSA_WITH_AES_128_CBC_SHA256 | `RSA_WITH_AES_256_CBC_SHA256 | `RSA_WITH_AES_128_CBC_SHA256 | `RSA_WITH_AES_128_CCM | `RSA_WITH_AES_256_CCM | `DHE_RSA_WITH_AES_128_CCM | `DHE_RSA_WITH_AES_256_CCM | `RSA_WITH_AES_128_GCM_SHA256 | `RSA_WITH_AES_256_GCM_SHA384 | `DHE_RSA_WITH_AES_128_GCM_SHA256 | `DHE_RSA_WITH_AES_256_GCM_SHA384 | `ECDHE_RSA_WITH_AES_128_GCM_SHA256 | `ECDHE_RSA_WITH_AES_256_GCM_SHA384 | `ECDHE_RSA_WITH_AES_256_CBC_SHA384 | `ECDHE_RSA_WITH_AES_128_CBC_SHA256 | `DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | `ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | `ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | `ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | `ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | `ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | `ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 -> true | _ -> false let ciphersuite_tls13 = function | #ciphersuite13 -> true | _ -> false