a ‚oe¡6ã@sdZddlZddlZddlZddlZddlmZmZmZm Z m Z m Z m Z m Z mZddlZddlmZddlmZmZddlmZmZddlZddlmZmZmZe e¡Z Gdd „d ej!ej"d �Z#e#j$Gd d „d e#ƒƒZ%e#j$Gd d„de#ƒƒZ&e#j$Gdd„de#ƒƒZ'dS)ú JSON Web Key.éN) ÚAnyÚCallableÚDictÚMappingÚOptionalÚSequenceÚTupleÚTypeÚUnion)Údefault_backend)ÚhashesÚ serialization)ÚecÚrsa)ÚerrorsÚ json_utilÚutilc@seZdZUdZdZiZeeedfe d<dZ e ee dfe d<e Zeee d<dd d d œZeeeeeeeeffe d <e e d <ejfegejfedœdd„Zejddœdd„ƒZedeeeee e dœdd„ƒZedeeeee ddœdd„ƒZ dS)ÚJWKrZktyÚTYPES©.Úcryptography_key_typesÚrequiredN)ú,ú:T)ÚindentZ separatorsZ sort_keysÚ_thumbprint_json_dumps_paramsÚkey)Ú hash_functionÚreturncsNtj|ƒtƒd�}| tj‡fdd„ˆ ¡ ¡Dƒfiˆj¤Ž  ¡¡|  ¡S)zgCompute JWK Thumbprint. https://tools.ietf.org/html/rfc7638 :returns: bytes )Úbackendcs i|]\}}|ˆjvr||“qSr)r)Ú.0ÚkÚv©Úselfrú+C:\Program Files\Certbot\pkgs\josepy\jwk.pyÚ @óz"JWK.thumbprint..) r ZHashr ÚupdateÚjsonÚdumpsZto_jsonÚitemsrÚencodeÚfinalize)r%rZdigestrr$r&Ú thumbprint3s ÿþÿzJWK.thumbprint©rcCs tƒ‚dS)ziGenerate JWK with public key. For symmetric cryptosystems, this would return ``self``. N)ÚNotImplementedErrorr$rrr&Ú public_keyFszJWK.public_key)ÚdataÚpasswordr rc Csæ|durtƒn|}i}tjtjfD]R}z||||ƒWStttjjfyr}z||t |ƒ<WYd}~q"d}~00q"tj tj fD]N}z|||ƒWSttjjfyÎ}z||t |ƒ<WYd}~q‚d}~00q‚t   d |¡¡‚dS)NzUnable to deserialize key: {0})r rZload_pem_private_keyZload_der_private_keyÚ ValueErrorÚ TypeErrorÚ cryptographyÚ exceptionsZUnsupportedAlgorithmÚstrZload_pem_public_keyZload_der_public_keyrÚErrorÚformat)Úclsr3r4r r8Zloader_privateÚerrorZ loader_publicrrr&Ú_load_cryptography_keyOsþ$$zJWK._load_cryptography_keyc Cs¼z| |||¡}Wn<tjyN}z"t d|¡t|d�WYd}~Sd}~00|jtur|t||j ƒs|t d  |j |j ¡¡‚|j   ¡D]}t||j ƒr†||d�Sq†t d  |j ¡¡‚dS)a°Load serialized key as JWK. :param str data: Public or private key serialized as PEM or DER. :param str password: Optional password. :param backend: A `.PEMSerializationBackend` and `.DERSerializationBackend` provider. :raises errors.Error: if unable to deserialize, or unsupported JWK algorithm :returns: JWK of an appropriate type. :rtype: `JWK` z,Loading symmetric key, asymmetric failed: %s©rNz"Unable to deserialize {0} into {1}zUnsupported algorithm: {0})r>rr:ÚloggerÚdebugÚJWKOctÚtypÚNotImplementedÚ isinstancerr;Ú __class__rÚvalues)r<r3r4r rr=Zjwk_clsrrr&Úloadls  ÿ zJWK.load)NN)NN)!Ú__name__Ú __module__Ú __qualname__Ú__doc__Útype_field_namerrr9r Ú__annotations__rr rrDrrrr rÚintÚboolr ZSHA256rZ HashAlgorithmÚbytesr/ÚabcÚabstractmethodr2Ú classmethodr>rHrrrr&rs: ù( ÿ þ ÿþÿþr)Ú metaclassc@sleZdZUdZdZdZdejfZe e d<e e e fdœdd„Z eee efdd œd d „ƒZddœd d „ZdS)rBzSymmetric JWK.Úoctr?r"rr0cCsdt |j¡iS)Nr")rÚencode_b64joserr$rrr&Úfields_to_partial_json—szJWKOct.fields_to_partial_json©ÚjobjrcCs|t |d¡d�S)Nr"r?)rÚdecode_b64jose©r<rZrrr&Úfields_from_jsonžszJWKOct.fields_from_jsoncCs|S©Nrr$rrr&r2¢szJWKOct.public_keyN)rIrJrKrLrCÚ __slots__rrMrrQrNrr9rXrTrrr]r2rrrr&rBŽs  rBcsÀeZdZUdZdZejejfZdZ de j dfZ e jjed<eeddœ‡fd d „ Zeeed œd d „ƒZeeed œdd„ƒZddœdd„Zeeeefddœdd„ƒZeeefdœdd„Z‡ZS)ÚJWKRSAzîRSA JWK. :ivar key: :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey` or :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey` wrapped in :class:`~josepy.util.ComparableRSAKey` ZRSAr?ÚeÚnrN©ÚargsÚkwargsrcs@d|vr*t|dtjƒs*t |d¡|d<tƒj|i|¤ŽdS©Nr)rErÚComparableRSAKeyÚsuperÚ__init__©r%rdre©rFrr&ri¶szJWKRSA.__init__)r3rcCs0t| ¡dƒ}t |d¡}t |jd|d�¡S)zOEncode Base64urlUInt. :type data: long :rtype: unicode éÚbig©Ú byteorderÚlength)ÚmaxÚ bit_lengthÚmathZceilrrWÚto_bytes©r<r3rprrr&Ú _encode_param»szJWKRSA._encode_paramcCsFz&t |¡}|st ¡‚tj|dd�WSty@t ¡‚Yn0dS)úDecode Base64urlUInt.rm©roN)rr[rÚDeserializationErrorrOÚ from_bytesr5)r<r3Úbinaryrrr&Ú _decode_paramÅs  zJWKRSA._decode_paramr0cCst|ƒ|j ¡d�S)Nr?)Útyperr2r$rrr&r2ÐszJWKRSA.public_keyrYc sD‡‡fdd„dDƒ\}}tj||d�}dˆvr@ˆ| tƒ¡d�Sˆ ˆd¡}dˆvs~dˆvs~d ˆvs~d ˆvs~d ˆvs~d ˆvræt‡fd d„dDƒƒ\}}}} } } tdd„| DƒƒrÄt d | ¡¡‚t‡fdd„| Dƒƒ\}}}} } n6t  |||¡\}}t  ||¡}t  ||¡} t  ||¡} t  ||||| | |¡ tƒ¡} ˆ| d�S)Nc3s|]}ˆ ˆ|¡VqdSr^©r|©r!Úxr\rr&Ú Õr(z*JWKRSA.fields_from_json..©rbra)rarbÚdr?ÚpÚqÚdpÚdqÚqiZothc3s|]}ˆ |¡VqdSr^)Úgetr)rZrr&r�ñr()r„r…r†r‡rˆcss|]}|dur|VqdSr^r)r!Zparamrrr&r�òr(z(Some private parameters are missing: {0}c3s|]}ˆ t|ƒ¡VqdSr^)r|r9r)r<rr&r�ôr()rZRSAPublicNumbersr2r r|Útuplerr:r;Zrsa_recover_prime_factorsZ rsa_crt_dmp1Z rsa_crt_dmq1Z rsa_crt_iqmpZRSAPrivateNumbersÚ private_key) r<rZrbraÚpublic_numbersrƒr„r…r†r‡rˆÚ all_paramsrrr\r&r]ÓsHÿþýüûúú"   ÿzJWKRSA.fields_from_jsonc s~tˆjjtjƒr*ˆj ¡}|j|jdœ}n>ˆj ¡}ˆj  ¡ ¡}|j|j|j |j |j |j |j|jdœ}‡fdd„| ¡DƒS)Nr‚)rbrarƒr„r…r†r‡rˆcsi|]\}}|ˆ |¡“qSr)rv©r!rÚvaluer$rr&r'r(z1JWKRSA.fields_to_partial_json..)rErÚ_wrappedrÚ RSAPublicKeyrŒrbraÚprivate_numbersr2rƒr„r…Zdmp1Zdmq1Ziqmpr,)r%ZnumbersÚparamsÚprivateÚpublicrr$r&rXs" þ ø zJWKRSA.fields_to_partial_json)rIrJrKrLrCrr‘Z RSAPrivateKeyrr_rrMrÚjosepyrrgrNrrirTrOr9rvr|r2rr]rrXÚ __classcell__rrrkr&r`¦s      0r`cseZdZUdZdZdZejejfZ de j ddfZ e jjed<eedd œ‡fd d „ Zeeeed œd d„ƒZeeeeedœdd„ƒZeeedœdd„ƒZeeejdœdd„ƒZeejedœdd„ƒZeeefdœdd„Zeeeefddœdd „ƒZddœd!d"„Z ‡Z!S)#ÚJWKECzþEC JWK. :ivar key: :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePrivateKey` or :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicKey` wrapped in :class:`~josepy.util.ComparableECKey` ZECr?Úcrvr€ÚyrNrccs@d|vr*t|dtjƒs*t |d¡|d<tƒj|i|¤ŽdSrf)rErÚComparableECKeyrhrirjrkrr&ri+szJWKEC.__init__)r3rprcCst |jd|d�¡S)zlEncode Base64urlUInt. :type data: long :type key_size: long :rtype: unicode rmrn)rrWrtrurrr&rv0szJWKEC._encode_param)r3ÚnameÚ valid_lengthrc CshzHt |¡}t|ƒ|kr:t d|›d|›dt|ƒ›d�¡‚tj|dd�WStybt ¡‚Yn0dS)rwzExpected parameter "z" to be z" bytes after base64-decoding; got z bytes insteadrmrxN)rr[ÚlenrryrOrzr5)r<r3rœr�r{rrr&r|9s  ÿÿ zJWKEC._decode_param)Ú curve_namercCs0|dkr dS|dkrdS|dkr$dSt ¡‚dS)NZ secp256r1úP-256Z secp384r1úP-384Z secp521r1úP-521)rÚSerializationError)r<rŸrrr&Ú_curve_name_to_crvGszJWKEC._curve_name_to_crv)r™rcCs<|dkrt ¡S|dkr t ¡S|dkr0t ¡St ¡‚dS)Nr r¡r¢)rÚ SECP256R1Ú SECP384R1Ú SECP521R1rry)r<r™rrr&Ú _crv_to_curveQszJWKEC._crv_to_curve)ÚcurvercCsBt|tjƒrdSt|tjƒr dSt|tjƒr0dStd|›�ƒ‚dS)Né é0éBzUnexpected curve: )rErr¥r¦r§r5)r<r©rrr&Úexpected_length_for_curve\s   zJWKEC.expected_length_for_curver0cs i}tˆjjtjƒr ˆj ¡‰n>tˆjjtjƒrTˆj ¡}ˆj ¡ ¡‰|j |d<n t   d¡‚ˆj |d<ˆj |d<‡‡fdd„| ¡Dƒ}ˆ ˆjj¡|d<|S)NrƒzRSupplied key is neither of type EllipticCurvePublicKey nor EllipticCurvePrivateKeyr€ršc s&i|]\}}|ˆ |ˆ ˆj¡¡“qSr)rvr­r©rŽ©r•r%rr&r'usÿz0JWKEC.fields_to_partial_json..r™)rErr�rÚEllipticCurvePublicKeyrŒÚEllipticCurvePrivateKeyr’r2Z private_valuerr£r€ršr,r¤r©rœ)r%r“r”rr®r&rXfs"   ÿ   þzJWKEC.fields_to_partial_jsonrYcsŒˆ ˆd¡}ˆ |¡‰‡‡‡fdd„dDƒ\}}tj|||d�}dˆvr\ˆ| tƒ¡d�Sˆ ˆddˆ¡}t ||¡ tƒ¡}ˆ|d�S)Nr™c3s |]}ˆ ˆ||ˆ¡VqdSr^r~)r!rb©r<Zexpected_lengthrZrr&r�€r(z)JWKEC.fields_from_json..)r€rš)r€ršr©rƒr?) r¨r­rZEllipticCurvePublicNumbersr2r r|ZEllipticCurvePrivateNumbersr‹)r<rZr©r€ršrŒrƒrrr±r&r]|s zJWKEC.fields_from_jsoncCs8t|jdƒr|j ¡}n|j ¡ tƒ¡}t|ƒ|d�S)Nr2r?)Úhasattrrr2rŒr r})r%rrrr&r2Œs  zJWKEC.public_key)"rIrJrKrLrCr_rr¯r°rrrMrr–rr›rNrrirTrOr9rvr|r¤Z EllipticCurver¨r­rrXrr]r2r—rrrkr&r˜s*       r˜)(rLrRr*ZloggingrsÚtypingrrrrrrr r r Zcryptography.exceptionsr7Zcryptography.hazmat.backendsr Zcryptography.hazmat.primitivesr rZ)cryptography.hazmat.primitives.asymmetricrrZ josepy.utilr–rrrZ getLoggerrIr@ZTypedJSONObjectWithFieldsÚABCMetarÚregisterrBr`r˜rrrr&Ús&,   qt