123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326(** Ciphersuite definitions and some helper functions. *)(** sum type of all possible key exchange methods *)typekey_exchange_algorithm_dhe=[`FFDHE|`ECDHE][@@derivingsexp_of]typekey_exchange_algorithm=[key_exchange_algorithm_dhe|`RSA][@@derivingsexp_of](** [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_CBC[@@derivingsexp_of]typeaead_cipher=|AES_128_CCM|AES_256_CCM|AES_128_GCM|AES_256_GCM|CHACHA20_POLY1305[@@derivingsexp_of]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)endtypepayload_protection13=[`AEADofaead_cipher][@@derivingsexp_of]typepayload_protection=[payload_protection13|`Blockofblock_cipher*H.t][@@derivingsexp_of](* 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_of]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][@@derivingsexp_of]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_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_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_privprotcinkeytypeletciphersuite_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