123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263openCtypesopenUnsignedopenSharedDefsopenSharedFunctorsmoduleC=CBytestypebytes=CBytes.tmoduleHacl_Spec=Hacl_Spec_bindings.Bindings(Hacl_Spec_stubs)moduleEverCrypt_AEAD =EverCrypt_AEAD_bindings.Bindings(EverCrypt_AEAD_stubs)moduleEverCrypt_Chacha20Poly1305 =EverCrypt_Chacha20Poly1305_bindings.Bindings(EverCrypt_Chacha20Poly1305_stubs)moduleEverCrypt_Curve25519 =EverCrypt_Curve25519_bindings.Bindings(EverCrypt_Curve25519_stubs)moduleEverCrypt_Hash =EverCrypt_Hash_bindings.Bindings(EverCrypt_Hash_stubs)moduleEverCrypt_HMAC =EverCrypt_HMAC_bindings.Bindings(EverCrypt_HMAC_stubs)moduleEverCrypt_Poly1305 =EverCrypt_Poly1305_bindings.Bindings(EverCrypt_Poly1305_stubs)moduleEverCrypt_HKDF =EverCrypt_HKDF_bindings.Bindings(EverCrypt_HKDF_stubs)moduleEverCrypt_DRBG =EverCrypt_DRBG_bindings.Bindings(EverCrypt_DRBG_stubs)moduleEverCrypt_Ed25519 =EverCrypt_Ed25519_bindings.Bindings(EverCrypt_Ed25519_stubs)moduleError=structtypeerror_code=|UnsupportedAlgorithm|InvalidKey|AuthenticationFailure|InvalidIVLength|DecodeError|MaximumLengthExceededtype'aresult=|Successof'a|Erroroferror_codeleterrorn=leterr=matchnwith|1->UnsupportedAlgorithm|2->InvalidKey|3->AuthenticationFailure|4->InvalidIVLength|5->DecodeError|6->MaximumLengthExceeded|_->failwith"Impossible"inErrorerrletget_resultr=matchUInt8.to_intrwith|0->Success()|n->errornendletat_exit_full_major =lazy(at_exitGc.full_major)moduleAEAD=structopenErroropenSharedDefs.AEADDefsopenEverCrypt_AEADtypet=alg*(everCrypt_AEAD_state_sptr)ptrletinit~alg~key:tresult=Lazy.forceat_exit_full_major;assert(C.sizekey=key_lengthalg);letst=allocate~finalise:(funst->everCrypt_AEAD_free(!@st))(ptreverCrypt_AEAD_state_s)(from_voidpeverCrypt_AEAD_state_snull)inmatchUInt8.to_int(everCrypt_AEAD_create_in(alg_definitionalg)st(C.ctypes_buf key))with|0->Success(alg,st)|n->error nmoduleNoalloc=structletencrypt~st:(alg,st)~iv~ad~pt~ct~tag:unitresult=(* providers/EverCrypt.AEAD.encrypt_pre *)check_sizes~alg~iv_len:(C.sizeiv)~tag_len:(C.sizetag)~ad_len:(C.sizead)~pt_len:(C.sizept)~ct_len:(C.sizect);assert(C.disjointcttag);assert(C.disjointivct);assert(C.disjointivtag);assert(C.disjointpttag);assert(C.disjointptad);assert(C.disjointadct);assert(C.disjointadtag);get_result(everCrypt_AEAD_encrypt(!@st)(C.ctypes_bufiv)(C.size_uint32iv)(C.ctypes_bufad)(C.size_uint32ad)(C.ctypes_bufpt)(C.size_uint32pt)(C.ctypes_bufct)(C.ctypes_buftag))letdecrypt~st:(alg,st)~iv~ad~ct~tag~pt:unitresult=(* EverCrypt.AEAD.decrypt_st *)check_sizes~alg~iv_len:(C.sizeiv)~tag_len:(C.sizetag)~ad_len:(C.sizead)~pt_len:(C.sizept)~ct_len:(C.sizect);assert(C.disjointtagpt);assert(C.disjointtagct);assert(C.disjointtagad);assert(C.disjointctad);assert(C.disjointptad);get_result(everCrypt_AEAD_decrypt(!@st)(C.ctypes_bufiv)(C.size_uint32iv)(C.ctypes_bufad)(C.size_uint32ad)(C.ctypes_bufct)(C.size_uint32ct)(C.ctypes_buftag)(C.ctypes_bufpt))endletencrypt~st:(alg,st)~iv~ad~pt=letct=C.make (C.sizept)inlettag=C.make(tag_lengthalg)inmatchNoalloc.encrypt~st:(alg,st)~iv~ad~pt~ct~tagwith|Success()->Success(ct,tag)|Errorn->Errornletdecrypt~st:(alg,st)~iv~ad~ct~tag=letpt=C.make (C.sizect)inmatchNoalloc.decrypt~st:(alg,st)~iv~ad~ct~tag~ptwith|Success()->Successpt|Errorn->Error nendmoduleChacha20_Poly1305:Chacha20_Poly1305=Make_Chacha20_Poly1305 (struct(* EverCrypt already performs these runtime checks so all `reqs` attributes in
* this file are empty since there is no need to do them here. *)letreqs=[]letencrypt=EverCrypt_Chacha20Poly1305.everCrypt_Chacha20Poly1305_aead_encryptletdecrypt=EverCrypt_Chacha20Poly1305.everCrypt_Chacha20Poly1305_aead_decryptend)moduleCurve25519:Curve25519=Make_Curve25519(structletreqs=[]letsecret_to_public=EverCrypt_Curve25519.everCrypt_Curve25519_secret_to_publicletscalarmult=EverCrypt_Curve25519.everCrypt_Curve25519_scalarmultletecdh=EverCrypt_Curve25519.everCrypt_Curve25519_ecdhend)moduleEd25519:EdDSA=Make_EdDSA(structletsecret_to_public =EverCrypt_Ed25519.everCrypt_Ed25519_secret_to_publicletsign=EverCrypt_Ed25519.everCrypt_Ed25519_signletverify=EverCrypt_Ed25519.everCrypt_Ed25519_verifyletexpand_keys=EverCrypt_Ed25519.everCrypt_Ed25519_expand_keysletsign_expanded=EverCrypt_Ed25519.everCrypt_Ed25519_sign_expandedend)moduleHash=structopenHashDefsopenEverCrypt_HashmoduleNoalloc=structlethash~alg~msg~digest=check_max_buffer_len (C.sizemsg);assert(C.sizedigest=digest_lenalg);assert(C.disjointdigestmsg);everCrypt_Hash_Incremental_hash(alg_definitionalg)(C.ctypes_bufdigest)(C.ctypes_bufmsg)(C.size_uint32msg)letfinish~st:(alg,t)~digest =assert(C.sizedigest=digest_lenalg);everCrypt_Hash_Incremental_finish t(C.ctypes_bufdigest)end(* TODO: get rid of the `alg` here by using `alg_of_state` *)typet=alg*everCrypt_Hash_Incremental_hash_stateCtypes_static.ptrletinit~alg=Lazy.forceat_exit_full_major;letalg_spec=alg_definitionalginletst=everCrypt_Hash_Incremental_create_in alg_specineverCrypt_Hash_Incremental_initst;Gc.finaliseeverCrypt_Hash_Incremental_free st;alg,stletupdate~st:(_alg,t)~msg=check_max_buffer_len (C.sizemsg);lete=everCrypt_Hash_Incremental_updatet(C.ctypes_bufmsg)(C.size_uint32msg)in(* can return `MaximumLengthExceeded` if total length exceeds limit, as defined
* in Spec.Hash.Definitions.max_input_length *)assert(Error.get_resulte=Error.Success())letfinish~st:(alg,t)=letdigest=C.make(digest_lenalg)inNoalloc.finish ~st:(alg,t)~digest;digestlethash~alg~msg =let digest=C.make(digest_lenalg)inNoalloc.hash ~alg~msg~digest;digestendmodule HMAC=structopenEverCrypt_HMACletis_supported_alg~alg=everCrypt_HMAC_is_supported_alg(HashDefs.alg_definitionalg)moduleNoalloc=structletmac~alg~key~msg~tag=(* Hacl.HMAC.compute_st *)assert(C.sizetag=HashDefs.digest_lenalg);assert(C.disjointmsgtag);check_max_buffer_len(C.sizekey);check_max_buffer_len(C.sizemsg);everCrypt_HMAC_compute(HashDefs.alg_definitionalg)(C.ctypes_buftag)(C.ctypes_bufkey)(C.size_uint32key)(C.ctypes_bufmsg)(C.size_uint32msg)endletmac~alg~key~msg=let tag=C.make(HashDefs.digest_lenalg)inNoalloc.mac ~alg~key~msg~tag;tagendmodulePoly1305:MAC=Make_Poly1305(structletreqs=[]letmacdstdata_lendatakey=EverCrypt_Poly1305.everCrypt_Poly1305_poly1305dstdatadata_lenkeyend)moduleHKDF =structopenEverCrypt_HKDFmoduleNoalloc=structletextract~alg~salt~ikm~prk=(* Hacl.HKDF.extract_st *)assert(C.sizeprk=HashDefs.digest_lenalg);assert(C.disjointsaltprk);assert(C.disjointikmprk);check_max_buffer_len(C.sizesalt);check_max_buffer_len(C.sizeikm);everCrypt_HKDF_extract(HashDefs.alg_definitionalg)(C.ctypes_bufprk)(C.ctypes_bufsalt)(C.size_uint32salt)(C.ctypes_bufikm)(C.size_uint32ikm)letexpand~alg ~prk~info~okm=(* Hacl.HKDF.expand_st *)assert(C.sizeokm<=255*HashDefs.digest_lenalg);assert(C.disjointokmprk);assert(HashDefs.digest_lenalg<=C.sizeprk);check_max_buffer_len(C.sizeinfo);check_max_buffer_len(C.sizeprk);everCrypt_HKDF_expand(HashDefs.alg_definitionalg)(C.ctypes_bufokm)(C.ctypes_bufprk)(C.size_uint32prk)(C.ctypes_bufinfo)(C.size_uint32info)(C.size_uint32okm)endletextract~alg~salt~ikm=letprk=C.make(HashDefs.digest_lenalg)inNoalloc.extract ~alg~salt~ikm~prk;prklet expand~alg~prk~info~size=letokm=C.makesizeinNoalloc.expand ~alg~prk~info~okm;okmendmoduleDRBG=structopenEverCrypt_DRBGtypet=everCrypt_DRBG_state_sptrmoduleNoalloc=structletgenerate?(additional_input=Bytes.empty)stoutput=(* EverCrypt.DRBG.generate_st *)assert(C.disjointoutputadditional_input);everCrypt_DRBG_generate (C.ctypes_bufoutput)st(C.size_uint32output)(C.ctypes_bufadditional_input)(C.size_uint32additional_input)endletis_supported_alg alg=(* as defined in Spec.HMAC_DRBG, excluding SHA-1 *)alg=HashDefs.SHA2_256||alg=HashDefs.SHA2_384||alg=HashDefs.SHA2_512letinstantiate?(personalization_string=Bytes.empty)alg=(* EverCrypt.DRBG.instantiate_st *)ifis_supported_algalgthenletst=everCrypt_DRBG_create(HashDefs.alg_definitionalg)inifeverCrypt_DRBG_instantiatest(C.ctypes_bufpersonalization_string)(C.size_uint32personalization_string)thenbeginGc.finaliseeverCrypt_DRBG_uninstantiatest;SomestendelseNoneelseNoneletgenerate?(additional_input=Bytes.empty)stsize=letoutput=C.makesizeinifNoalloc.generate~additional_inputstoutputthenSomeoutputelseNoneletreseed?(additional_input=Bytes.empty)st=(* EverCrypt.DRBG.reseed_st *)everCrypt_DRBG_reseedst(C.ctypes_bufadditional_input)(C.size_uint32additional_input)end