123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283(** Ciphersuite definitions and some helper functions. *)(** sum type of all possible key exchange methods *)typekey_exchange_algorithm13=[`DHE_RSA][@@derivingsexp]typekey_exchange_algorithm=[key_exchange_algorithm13|`RSA][@@derivingsexp](** [required_keytype_and_usage kex] is [(keytype, usage)] which a certificate must have if it is used in the given [kex] method *)letrequired_keytype_and_usage=function|`RSA->(`RSA,`Key_encipherment)|`DHE_RSA->(`RSA,`Digital_signature)(* signing with the signature scheme and hash algorithm that will be employed in the server key exchange message. *)typeblock_cipher=|TRIPLE_DES_EDE_CBC|AES_128_CBC|AES_256_CBC[@@derivingsexp]typeaead_cipher=|AES_128_CCM|AES_256_CCM|AES_128_GCM|AES_256_GCM|CHACHA20_POLY1305[@@derivingsexp]moduleH=structtypet=Mirage_crypto.Hash.hashleths=[(`MD5,"md5");(`SHA1,"sha1");(`SHA224,"sha224");(`SHA256,"sha256");(`SHA384,"sha384");(`SHA512,"sha512")]letsexp_of_th=Sexplib.Sexp.Atom(List.assochhs)letinv_hs=List.map(fun(a,b)->(b,a))hslett_of_sexp=function|Sexplib.Sexp.Atomh->List.assoc(String.lowercase_asciih)inv_hs|_->failwith"can't convert sexp to hash"endtypepayload_protection13=[`AEADofaead_cipher][@@derivingsexp]typepayload_protection=[payload_protection13|`Blockofblock_cipher*H.t][@@derivingsexp](* 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][@@derivingsexp]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][@@derivingsexp]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|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_SHA256letciphersuite_to_stringx=Packet.any_ciphersuite_to_string(ciphersuite_to_any_ciphersuitex)(** [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_kex_privprot=function|`RSA_WITH_3DES_EDE_CBC_SHA->(`RSA,`Block(TRIPLE_DES_EDE_CBC,`SHA1))|`DHE_RSA_WITH_3DES_EDE_CBC_SHA->(`DHE_RSA,`Block(TRIPLE_DES_EDE_CBC,`SHA1))|`RSA_WITH_AES_128_CBC_SHA->(`RSA,`Block(AES_128_CBC,`SHA1))|`DHE_RSA_WITH_AES_128_CBC_SHA->(`DHE_RSA,`Block(AES_128_CBC,`SHA1))|`RSA_WITH_AES_256_CBC_SHA->(`RSA,`Block(AES_256_CBC,`SHA1))|`DHE_RSA_WITH_AES_256_CBC_SHA->(`DHE_RSA,`Block(AES_256_CBC,`SHA1))|`RSA_WITH_AES_128_CBC_SHA256->(`RSA,`Block(AES_128_CBC,`SHA256))|`RSA_WITH_AES_256_CBC_SHA256->(`RSA,`Block(AES_256_CBC,`SHA256))|`DHE_RSA_WITH_AES_128_CBC_SHA256->(`DHE_RSA,`Block(AES_128_CBC,`SHA256))|`DHE_RSA_WITH_AES_256_CBC_SHA256->(`DHE_RSA,`Block(AES_256_CBC,`SHA256))|`RSA_WITH_AES_128_CCM->(`RSA,`AEADAES_128_CCM)|`RSA_WITH_AES_256_CCM->(`RSA,`AEADAES_256_CCM)|`DHE_RSA_WITH_AES_128_CCM->(`DHE_RSA,`AEADAES_128_CCM)|`DHE_RSA_WITH_AES_256_CCM->(`DHE_RSA,`AEADAES_256_CCM)|`RSA_WITH_AES_128_GCM_SHA256->(`RSA,`AEADAES_128_GCM)|`RSA_WITH_AES_256_GCM_SHA384->(`RSA,`AEADAES_256_GCM)|`DHE_RSA_WITH_AES_128_GCM_SHA256->(`DHE_RSA,`AEADAES_128_GCM)|`DHE_RSA_WITH_AES_256_GCM_SHA384->(`DHE_RSA,`AEADAES_256_GCM)|`ECDHE_RSA_WITH_AES_128_GCM_SHA256->(`DHE_RSA,`AEADAES_128_GCM)|`ECDHE_RSA_WITH_AES_256_GCM_SHA384->(`DHE_RSA,`AEADAES_256_GCM)|`ECDHE_RSA_WITH_AES_256_CBC_SHA384->(`DHE_RSA,`Block(AES_256_CBC,`SHA384))|`ECDHE_RSA_WITH_AES_128_CBC_SHA256->(`DHE_RSA,`Block(AES_128_CBC,`SHA256))|`ECDHE_RSA_WITH_AES_256_CBC_SHA->(`DHE_RSA,`Block(AES_256_CBC,`SHA1))|`ECDHE_RSA_WITH_AES_128_CBC_SHA->(`DHE_RSA,`Block(AES_128_CBC,`SHA1))|`ECDHE_RSA_WITH_3DES_EDE_CBC_SHA->(`DHE_RSA,`Block(TRIPLE_DES_EDE_CBC,`SHA1))|`DHE_RSA_WITH_CHACHA20_POLY1305_SHA256->(`DHE_RSA,`AEADCHACHA20_POLY1305)|`ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256->(`DHE_RSA,`AEADCHACHA20_POLY1305)|#ciphersuite13ascs13->(`DHE_RSA,`AEAD(privprot13cs13))(** [ciphersuite_kex ciphersuite] is [kex], first projection of [get_kex_privprot] *)letciphersuite_kexc=fst(get_kex_privprotc)(** [ciphersuite_privprot ciphersuite] is [privprot], second projection of [get_kex_privprot] *)letciphersuite_privprotc=snd(get_kex_privprotc)letciphersuite_fscs=matchciphersuite_kexcswith|`DHE_RSA->true|`RSA->falseletecc=function|`ECDHE_RSA_WITH_AES_256_CBC_SHA|`ECDHE_RSA_WITH_AES_128_CBC_SHA|`ECDHE_RSA_WITH_3DES_EDE_CBC_SHA|`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|`ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256->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->true|_->falseletciphersuite_tls13=function|`AES_128_GCM_SHA256|`AES_256_GCM_SHA384|`CHACHA20_POLY1305_SHA256|`AES_128_CCM_SHA256->true|_->false