Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file handshake_crypto13.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179let(<+>)=Utils.Cs.(<+>)letcdiv(x:int)(y:int)=ifx>0&&y>0then(x+y-1)/yelseifx<0&&y<0then(x+y+1)/yelsex/yletleft_pad_dhgroupmsg=letbytes=cdiv(Mirage_crypto_pk.Dh.modulus_sizegroup)8inletpadding=Cstruct.create(bytes-Cstruct.lenmsg)inpadding<+>msgletnot_all_zero=function|None->None|Somecs->letall_zero=Cstruct.create(Cstruct.lencs)inifCstruct.equalall_zerocsthenNoneelseSomecsletshare_appropriate_lengthgroupshare=matchCore.group_to_implgroupwith|`Hacl`X25519->Ok()(* already checked by hacl_x25519.key_exchange *)|`Fiat`P256->Ok()(* already checked by fiat_p256.key_exchange *)|`Mirage_cryptogroup->letbits=Mirage_crypto_pk.Dh.modulus_sizegroupinifCstruct.lenshare=cdivbits8thenOk()else(* truncated share, better reject this *)Error(`Fatal`InvalidDH)letdh_sharedgroupsecretshare=(* RFC 8556, Section 7.4.1 - we need zero-padding on the left *)not_all_zero(matchCore.group_to_implgroup,secretwith|`Mirage_cryptomc_group,`Mirage_cryptosecret->beginmatchMirage_crypto_pk.Dh.sharedsecretsharewith|None->None|Someshared->Some(left_pad_dhmc_groupshared)end|`Hacl`X25519,`Haclpriv->beginmatchHacl_x25519.key_exchangeprivsharewith|Error_->None|Okshared->Somesharedend|`Fiat`P256,`Fiatpriv->beginmatchFiat_p256.key_exchangeprivsharewith|Error_->None|Okshared->Somesharedend|_->None)letdh_gen_keygroup=(* RFC 8556, Section 4.2.8.1 - we need zero-padding on the left *)matchCore.group_to_implgroupwith|`Mirage_cryptomc_group->letsec,shared=Mirage_crypto_pk.Dh.gen_keymc_groupin`Mirage_cryptosec,left_pad_dhmc_groupshared|`Hacl`X25519->letsecret,shared=Hacl_x25519.gen_key~rng:Mirage_crypto_rng.generatein`Haclsecret,shared|`Fiat`P256->letsecret,shared=Fiat_p256.gen_key~rng:Mirage_crypto_rng.generatein`Fiatsecret,sharedlettracetagcs=Tracing.cs~tag:("crypto "^tag)csletpp_hash_k_nciphersuite=letopenCiphersuiteinletpp=privprot13ciphersuiteandhash=hash13ciphersuiteinletk,n=kn_13ppin(pp,hash,k,n)lethkdflabellabelcontextlength=letlen=letb=Cstruct.create2inCstruct.BE.set_uint16b0length;bandlabel=letlbl=Cstruct.of_string("tls13 "^label)inletl=Cstruct.create1inCstruct.set_uint8l0(Cstruct.lenlbl);l<+>lblandcontext=letl=Cstruct.create1inCstruct.set_uint8l0(Cstruct.lencontext);l<+>contextinletlbl=len<+>label<+>contextintrace"hkdflabel"lbl;lblletderive_secret_no_hashhashprk?length?(ctx=Cstruct.empty)label=letlength=matchlengthwith|None->Mirage_crypto.Hash.digest_sizehash|Somex->xinletinfo=hkdflabellabelctxlengthintrace"prk"prk;letkey=Hkdf.expand~hash~prk~infolengthintrace("derive_secret: "^label)key;keyletderive_secrettlabellog=letctx=Mirage_crypto.Hash.digestt.State.hashlogintrace"derive secret ctx"ctx;derive_secret_no_hasht.State.hasht.State.secret~ctxlabelletemptycipher={State.secret=Cstruct.empty;cipher;hash=Ciphersuite.hash13cipher}letderivetsecret_ikm=letsalt=ifCstruct.equalt.State.secretCstruct.emptythenCstruct.emptyelsederive_secrett"derived"Cstruct.emptyintrace"derive: secret_ikm"secret_ikm;trace"derive: salt"salt;letsecret=Hkdf.extract~hash:t.State.hash~saltsecret_ikmintrace"derive (extracted secret)"secret;{twithState.secret}lettraffic_keycipherprk=let_,hash,key_len,iv_len=pp_hash_k_ncipherinletkey_info=hkdflabel"key"Cstruct.emptykey_leninletkey=Hkdf.expand~hash~prk~info:key_infokey_leninletiv_info=hkdflabel"iv"Cstruct.emptyiv_leninletiv=Hkdf.expand~hash~prk~info:iv_infoiv_lenin(key,iv)letctxtlabelsecret=letsecret,nonce=traffic_keyt.State.ciphersecretintrace(label^" secret")secret;trace(label^" nonce")nonce;letpp=Ciphersuite.privprot13t.State.cipherin{State.sequence=0L;cipher_st=Crypto.Ciphers.get_aead~secret~noncepp}letearly_traffictlog=letsecret=derive_secrett"c e traffic"login(secret,ctxt"client early traffic"secret)leths_ctxtlog=Tracing.cs~tag:"hs ctx with sec"t.State.secret;Tracing.cs~tag:"log is"log;letserver_handshake_traffic_secret=derive_secrett"s hs traffic"logandclient_handshake_traffic_secret=derive_secrett"c hs traffic"login(server_handshake_traffic_secret,ctxt"server handshake traffic"server_handshake_traffic_secret,client_handshake_traffic_secret,ctxt"client handshake traffic"client_handshake_traffic_secret)letapp_ctxtlog=letserver_application_traffic_secret=derive_secrett"s ap traffic"logandclient_application_traffic_secret=derive_secrett"c ap traffic"login(server_application_traffic_secret,ctxt"server application traffic"server_application_traffic_secret,client_application_traffic_secret,ctxt"client application traffic"client_application_traffic_secret)letapp_secret_n_1tapp_secret=letsecret=derive_secret_no_hasht.State.hashapp_secret"traffic upd"insecret,ctxt"traffic update"secretletexportertlog=derive_secrett"exp master"logletresumptiontlog=derive_secrett"res master"logletres_secrethashsecretnonce=derive_secret_no_hashhashsecret~ctx:nonce"resumption"letfinishedhashsecretdata=letkey=derive_secret_no_hashhashsecret"finished"inMirage_crypto.Hash.machash~key(Mirage_crypto.Hash.digesthashdata)