a b @sddlZddlZddlmZmZddlmZmZddlm Z m Z m Z ddl m Z eje e e fZdeeejeejejeefeddd ZGd ddZdS) N)quote urlencode) constant_timehmac)SHA1SHA256SHA512) InvalidTokenHOTP)hotp type_name account_nameissuerextra_parametersreturncCsd|jfdt|jfd|jjfg}|dur>|d|f|||rbt |dt |nt |}d|d|dt |S) Ndigitssecret algorithmr:z otpauth:///?) _lengthbase64 b32encode_key _algorithmnameupperappendextendrr)r r r rr parameterslabelr"T/tmp/pip-target-98j97qn4/lib/python/cryptography/hazmat/primitives/twofactor/hotp.py _generate_uris r$c@steZdZdeeeejeddddZ eedddZ eedd d d Z eedd d Z e eeje e dddZdS)r NT)keylengthrbackendenforce_key_lengthrcCstt|dkr|durtdt|ts.td|dks>|dkrFtdt|tttfs^td||_||_ ||_ dS) NTz'Key length has to be at least 128 bits.z)Length parameter must be an integer type.z(Length of HOTP has to be between 6 to 8.z)Algorithm must be SHA1, SHA256 or SHA512.) len ValueError isinstanceint TypeErrorrrrrrr)selfr%r&rr'r(r"r"r#__init__-s z HOTP.__init__)counterrcCs*||}|d|j}d||jS)N z{0:0{1}})_dynamic_truncaterformatencode)r1r3Ztruncated_valuer r"r"r#generateEs z HOTP.generate)r r3rcCst|||stddS)Nz#Supplied HOTP value does not match.)rZbytes_eqr8r )r1r r3r"r"r#verifyJsz HOTP.verifycCsbt|j|j}||jddd|}|t|dd@}|||d}tj |ddd@S) Nr+big)r& byteorder)r;i) rHMACrrupdateto_bytesfinalizer,r/ from_bytes)r1r3ctxZ hmac_valueoffsetpr"r"r#r5Ns zHOTP._dynamic_truncate)r r3rrcCst|d||dt|fgS)Nr r3)r$r/)r1r r3rr"r"r#get_provisioning_uriWszHOTP.get_provisioning_uri)NT)__name__ __module__ __qualname__bytesr/_ALLOWED_HASH_TYPEStypingAnyboolr2r8r9r5strOptionalrGr"r"r"r#r ,s   )rrM urllib.parserrZcryptography.hazmat.primitivesrrZ%cryptography.hazmat.primitives.hashesrrrZ(cryptography.hazmat.primitives.twofactorr UnionrLrPrQListTupler/r$r r"r"r"r#s