123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363(** Ciphersuite definitions and some helper functions. *)(** sum type of all possible key exchange methods *)typekey_exchange_algorithm_dhe=[`FFDHE|`ECDHE]typekey_exchange_algorithm=[key_exchange_algorithm_dhe|`RSA]letpp_key_exchange_algorithm_dheppf=function|`FFDHE->Fmt.stringppf"FFDHE"|`ECDHE->Fmt.stringppf"ECDHE"letpp_key_exchange_algorithmppf=function|#key_exchange_algorithm_dheasd->pp_key_exchange_algorithm_dheppfd|`RSA->Fmt.stringppf"RSA"(** [required_usage kex] is [usage] which a certificate must have if it is used in the given [kex] method *)letrequired_usage=function|#key_exchange_algorithm_dhe->`Digital_signature|`RSA->`Key_enciphermenttypeblock_cipher=|TRIPLE_DES_EDE_CBC|AES_128_CBC|AES_256_CBCletpp_block_cipherppf=function|TRIPLE_DES_EDE_CBC->Fmt.stringppf"3DES EDE CBC"|AES_128_CBC->Fmt.stringppf"AES128 CBC"|AES_256_CBC->Fmt.stringppf"AES256 CBC"typeaead_cipher=|AES_128_CCM|AES_256_CCM|AES_128_GCM|AES_256_GCM|CHACHA20_POLY1305letpp_aead_cipherppf=function|AES_128_CCM->Fmt.stringppf"AES128 CCM"|AES_256_CCM->Fmt.stringppf"AES256 CCM"|AES_128_GCM->Fmt.stringppf"AES128 GCM"|AES_256_GCM->Fmt.stringppf"AES256 GCM"|CHACHA20_POLY1305->Fmt.stringppf"CHACHA20 POLY1305"typepayload_protection13=[`AEADofaead_cipher]letpp_payload_protection13ppf=function|`AEADa->Fmt.pfppf"AEAD %a"pp_aead_cipheratypepayload_protection=[payload_protection13|`Blockofblock_cipher*Mirage_crypto.Hash.hash]letpp_hashppf=function|`MD5->Fmt.stringppf"MD5"|`SHA1->Fmt.stringppf"SHA1"|`SHA224->Fmt.stringppf"SHA224"|`SHA256->Fmt.stringppf"SHA256"|`SHA384->Fmt.stringppf"SHA384"|`SHA512->Fmt.stringppf"SHA512"letpp_payload_protectionppf=function|#payload_protection13asp->pp_payload_protection13ppfp|`Block(b,h)->Fmt.pfppf"BLOCK %a %a"pp_block_cipherbpp_hashh(* 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 *)letkn_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 *)letkey_lengthivpp=letmac_size=Mirage_crypto.Hash.digest_sizeinmatchppwith|`AEADAES_128_CCM->(16,4,0)|`AEADAES_256_CCM->(32,4,0)|`AEADAES_128_GCM->(16,4,0)|`AEADAES_256_GCM->(32,4,0)|`AEADCHACHA20_POLY1305->(32,12,0)|`Block(bc,mac)->letkeylen,ivlen=matchbcwith|TRIPLE_DES_EDE_CBC->(24,8)|AES_128_CBC->(16,16)|AES_256_CBC->(32,16)andmaclen=mac_sizemacinmatchivwith|None->(keylen,0,maclen)|Some()->(keylen,ivlen,maclen)typeciphersuite13=[|`AES_128_GCM_SHA256|`AES_256_GCM_SHA384|`CHACHA20_POLY1305_SHA256|`AES_128_CCM_SHA256]letprivprot13=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_CCMlethash13=function|`AES_128_GCM_SHA256->`SHA256|`AES_256_GCM_SHA384->`SHA384|`CHACHA20_POLY1305_SHA256->`SHA256|`AES_128_CCM_SHA256->`SHA256letany_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|_->Nonetypeciphersuite=[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]letciphersuite_to_ciphersuite13:ciphersuite->ciphersuite13option=function|#ciphersuite13ascs->Somecs|_->Noneletany_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_ciphersuite13xletciphersuite_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] *)letget_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,`AEADAES_128_CCM)|`RSA_WITH_AES_256_CCM->(`RSA,`RSA,`AEADAES_256_CCM)|`DHE_RSA_WITH_AES_128_CCM->(`RSA,`FFDHE,`AEADAES_128_CCM)|`DHE_RSA_WITH_AES_256_CCM->(`RSA,`FFDHE,`AEADAES_256_CCM)|`RSA_WITH_AES_128_GCM_SHA256->(`RSA,`RSA,`AEADAES_128_GCM)|`RSA_WITH_AES_256_GCM_SHA384->(`RSA,`RSA,`AEADAES_256_GCM)|`DHE_RSA_WITH_AES_128_GCM_SHA256->(`RSA,`FFDHE,`AEADAES_128_GCM)|`DHE_RSA_WITH_AES_256_GCM_SHA384->(`RSA,`FFDHE,`AEADAES_256_GCM)|`ECDHE_RSA_WITH_AES_128_GCM_SHA256->(`RSA,`ECDHE,`AEADAES_128_GCM)|`ECDHE_RSA_WITH_AES_256_GCM_SHA384->(`RSA,`ECDHE,`AEADAES_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,`AEADCHACHA20_POLY1305)|`ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256->(`RSA,`ECDHE,`AEADCHACHA20_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,`AEADAES_128_GCM)|`ECDHE_ECDSA_WITH_AES_256_GCM_SHA384->(`EC,`ECDHE,`AEADAES_256_GCM)|`ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256->(`EC,`ECDHE,`AEADCHACHA20_POLY1305)|#ciphersuite13ascs13->(`RSA,`FFDHE,`AEAD(privprot13cs13))(* this is mostly wrong *)(** [ciphersuite_kex ciphersuite] is [kex], first projection of [get_kex_privprot] *)letciphersuite_kexc=let_keytype,kex,_pp=get_keytype_kex_privprotcinkex(** [ciphersuite_privprot ciphersuite] is [privprot], second projection of [get_kex_privprot] *)letciphersuite_privprotc=let_keytype,_kex,pp=get_keytype_kex_privprotcinppletciphersuite_keytypec=letkeytype,_kex,_pp=get_keytype_kex_privprotcinkeytypeletpp_ciphersuiteppfcs=letkeytype,kex,pp=get_keytype_kex_privprotcsinletpp_keytypeppf=function|`EC->Fmt.stringppf"ECDSA"|`RSA->Fmt.stringppf"RSA"inmatchcswith|#ciphersuite13->Fmt.pfppf"%a"pp_payload_protectionpp|_->Fmt.pfppf"%a %a %a"pp_key_exchange_algorithmkexpp_keytypekeytypepp_payload_protectionppletpp_any_ciphersuiteppfcs=matchany_ciphersuite_to_ciphersuitecswith|Somecs->pp_ciphersuiteppfcs|None->Fmt.pfppf"ciphersuite %04X"(Packet.any_ciphersuite_to_intcs)letciphersuite_fscs=matchciphersuite_kexcswith|#key_exchange_algorithm_dhe->true|`RSA->falseletecdhe_only=function|#ciphersuite13->false|cs->matchget_keytype_kex_privprotcswith|(_,`ECDHE,_)->true|_->falseletdhe_only=function|#ciphersuite13->false|cs->matchget_keytype_kex_privprotcswith|(_,`FFDHE,_)->true|_->falseletecdhe=function|#ciphersuite13->true|cs->matchget_keytype_kex_privprotcswith|(_,`ECDHE,_)->true|_->falseletciphersuite_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|_->falseletciphersuite_tls13=function|#ciphersuite13->true|_->false