a ‚oe�<ã@södZddlZddlZddlZddlmZmZmZmZm Z m Z m Z m Z m Z ddlmZddlZddlmZmZmZmZddlmZddlmZGdd „d ƒZGd d „d ejƒZGd d „d ejƒZGdd„dejƒZGdd„dƒZedkròee  ¡ƒdS)zJSON Web Signature.éN) ÚAnyÚDictÚ FrozenSetÚListÚMappingÚOptionalÚTupleÚTypeÚcast)Úcrypto)Úb64ÚerrorsÚ json_utilÚjwa)Újwk)Úutilc@s<eZdZdZdZeeedœdd„ƒZeeedœdd„ƒZdS) Ú MediaTypez MediaType field encoder/decoder.z application/©ÚvalueÚreturncCs(d|vr$d|vrt d¡‚|j|S|S)zDecoder.ú/ú;zUnexpected semi-colon)r ÚDeserializationErrorÚPREFIX©Úclsr©rú+C:\Program Files\Certbot\pkgs\josepy\jws.pyÚdecodes   zMediaType.decodecCs.d|vr*| |j¡sJ‚|t|jƒd…S|S)zEncoder.rN)Ú startswithrÚlenrrrrÚencode)szMediaType.encodeN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚ classmethodÚstrrr!rrrrrs  rc@sâeZdZUdZejdejjdd�Z e eje d<ejddd�Z e e e d<ejdejjdd�Ze eje d<ejddd�Ze ee d<ejd dd�Ze e e d <ejd dd d �Zeejd fe d <ejdejdd�Ze e e d<ejdejdd�Ze e e d<ejdejejdd�Ze ee d<ejdejejdd�Ze ee d<ejddd d �Z ee!d fe d<e"eej#fe d<e"eej#fdœdd„Z$e!ddœdd„Z%e&jdœdd„Z'e j(e!e!dœdd „ƒZ ej)d!d"„ƒZej(d#d"„ƒZd$S)%ÚHeadera6JOSE Header. .. warning:: This class supports **only** Registered Header Parameter Names (as defined in section 4.1 of the protocol). If you need Public Header Parameter Names (4.2) or Private Header Parameter Names (4.3), you must subclass and override :meth:`from_json` and :meth:`to_partial_json` appropriately. .. warning:: This class does not support any extensions through the "crit" (Critical) Header Parameter (4.1.11) and as a conforming implementation, :meth:`from_json` treats its occurrence as an error. Please subclass if you seek for a different behaviour. :ivar x5tS256: "x5t#S256" :ivar str typ: MIME Media Type, inc. :const:`MediaType.PREFIX`. :ivar str cty: Content-Type, inc. :const:`MediaType.PREFIX`. ÚalgT)ÚdecoderÚ omitemptyÚjku)r+rÚkidÚx5uÚx5cr©r+Údefault.Úx5tzx5t#S256Úx5tS256Útyp)Úencoderr*r+ÚctyÚcritÚ_fields©rcs‡fdd„ˆj ¡DƒS)z4Fields that would not be omitted in the JSON object.cs,i|]$\}}| tˆ|ƒ¡s|tˆ|ƒ“qSr)ZomitÚgetattr)Ú.0ÚnameÚfield©ÚselfrrÚ bsþz&Header.not_omitted..)r8Úitemsr>rr>rÚ not_omitted`s þzHeader.not_omitted)ÚotherrcCsbt|t|ƒƒs td t|ƒ¡ƒ‚| ¡}| ¡}t|ƒ |¡rFtdƒ‚| |¡t|ƒfi|¤ŽS)NzHeader cannot be added to: {0}z+Addition of overlapping headers not defined)Ú isinstanceÚtypeÚ TypeErrorÚformatrBÚsetÚ intersectionÚupdate)r?rCZnot_omitted_selfZnot_omitted_otherrrrÚ__add__hs zHeader.__add__cCs|jdurt d¡‚|jS)zíFind key based on header. .. todo:: Supports only "jwk" header parameter lookup. :returns: (Public) key found in the header. :rtype: .JWK :raises josepy.errors.Error: if key could not be found Nz No key found)rr ÚErrorr>rrrÚfind_keyus  zHeader.find_key)Ú unused_valuercCst d¡‚dS)Nz("crit" is not supported, please subclass)r r)rNrrrr7„sz Header.critcCsdd„|DƒS)NcSs"g|]}t t tj|j¡¡‘qSr)Úbase64Ú b64encoder Zdump_certificateÚ FILETYPE_ASN1Úwrapped©r;ZcertrrrÚ ŒsÿzHeader.x5c..r©rrrrr/Šsþz Header.x5cc CsJztdd„|DƒƒWStjyD}zt |¡‚WYd}~n d}~00dS)Nc ss(|] }t t tjt |¡¡¡VqdS©N)rÚComparableX509r Zload_certificaterQrOÚ b64decoderSrrrÚ ”sýÿzHeader.x5c..)Útupler rLr r)rÚerrorrrrr/‘s ü N)*r"r#r$r%rr=rÚ JWASignatureÚ from_jsonr)rÚ__annotations__r,ÚbytesÚjwk_modÚJWKrr-r'r.r/rrrWÚdecode_b64joser2r3rr!rr4r6r7rrZFieldrBrKÚjosepyrMr*r5rrrrr(3s@  ÿ ÿ"ÿ ÿ ÿ   r(c speZdZUdZeZeed<dZej dddd�Z e ed<ej ddeƒej d �Z eed<ej d ejejd �Zeed <e je e d œd d„ƒZ e je e d œdd„ƒZ eddœ‡fdd„ Zeeee efdœdd„ƒZee eedœdd„ƒZd%eeejedœdd„Zedeƒfeejej ee!eddœdd„ƒZ"ee efdœ‡fd d!„ Z#ee$e efee efd"œ‡fd#d$„ ƒZ%‡Z&S)&Ú SignatureaJWS Signature. :ivar combined: Combined Header (protected and unprotected, :class:`Header`). :ivar unicode protected: JWS protected header (Jose Base-64 decoded). :ivar header: JWS Unprotected Header (:class:`Header`). :ivar str signature: The signature. Úcombined)reÚ protectedTÚr0Úheader)r+r1r*Ú signature)r*r5rcCst | d¡¡S©Núutf-8)rÚencode_b64joser!rUrrrrfµszSignature.protectedcCst |¡ d¡Srj)rrbrrUrrrrfºsN)Úkwargsrc s8d|vr| |¡}tƒjfi|¤Ž|jjdus4J‚dS)Nre)Ú_with_combinedÚsuperÚ__init__rer))r?rm©Ú __class__rrrp¾s zSignature.__init__cCsZd|vs J‚| d|jdj¡}| d|jdj¡}|rJ||j |¡}n|}||d<|S)Nrerhrf)Úgetr8r1Ú header_clsÚ json_loads)rrmrhrfrerrrrnÄs zSignature._with_combined)rfÚpayloadrcCst | d¡¡dt |¡S)Nrkó.)r rPr!)rrfrvrrrÚ_msgÒszSignature._msg)rvÚkeyrcCsJ|dur|j ¡n|}|jjs(t d¡‚|jjj|j|j| |j |¡d�S)zvVerify. :param bytes payload: Payload to verify. :param JWK key: Key used for verification. Nz Not signature algorithm defined.)ryÚsigÚmsg) rerMr)rcrLÚverifyryrirxrf)r?rvryZ actual_keyrrrr|Ös  ÿzSignature.verify)rvryr)Ú include_jwkÚprotectrmrc KsÊt||jƒsJ‚|}||d<|r,| ¡|d<t|ƒ |jj¡sBJ‚| |jj¡sTJ‚i}|D]} | |vr\| | ¡|| <q\|r’|jfi|¤Ž ¡} nd} |jfi|¤Ž} |  |j |  | |¡¡} || | | d�S)aDSign. :param bytes payload: Payload to sign. :param JWK key: Key for signature. :param JWASignature alg: Signature algorithm to use to sign. :param bool include_jwk: If True, insert the JWK inside the signature headers. :param FrozenSet protect: List of headers to protect. r)rrg)rfrhri) rDÚktyÚ public_keyrHÚissubsetrtr8ÚpopZ json_dumpsÚsignryrx) rrvryr)r}r~rmZ header_paramsZprotected_paramsrhrfrirrrrƒäs" zSignature.signr9cs tƒ ¡}|d ¡s|d=|S)Nrh)roÚfields_to_partial_jsonrB)r?Úfieldsrqrrr„s  z Signature.fields_to_partial_json©Újobjrcs4tƒ |¡}| |¡}d|d ¡vr0t d¡‚|S)Nr)rezalg not present)roÚfields_from_jsonrnrBr r)rr‡r…Zfields_with_combinedrqrrrˆs    zSignature.fields_from_json)N)'r"r#r$r%r(rtr^Ú __slots__rr=rfr'r]rhrbrlrir_r5r*rrpr&rrnrxrrcraÚboolr|Ú frozensetr\rrƒr„rrˆÚ __classcell__rrrqrrdžsH   ÿ ÿ úø*rdc@sÆeZdZUdZdZeed<eeed<eZ de e j e dœdd„Zeeedd œd d „ƒZeed œd d„ƒZed œdd„Zeeddœdd„ƒZde eeefdœdd„Zeeeefddœdd„ƒZdS)ÚJWSzgJSON Web Signature. :ivar str payload: JWS Payload. :ivar str signature: JWS Signatures. ©rvÚ signaturesrvr�N)ryrcst‡‡fdd„ˆjDƒƒS)úVerify.c3s|]}| ˆjˆ¡VqdSrV)r|rv©r;rz©ryr?rrrY.ózJWS.verify..)Úallr�)r?ryrr’rr|,sz JWS.verify)rvrmrcKs |||jjfd|i|¤Žfd�S)úSign.rvrŽ)Ú signature_clsrƒ)rrvrmrrrrƒ0szJWS.signr9cCst|jƒdksJ‚|jdS)zPGet a singleton signature. :rtype: :class:`JWS.signature_cls` ér)r r�r>rrrri5sz JWS.signaturecCs\t|jƒdksJ‚d|jj ¡vs&J‚t |jj d¡¡dt |j ¡dt |jj¡S)z7Compact serialization. :rtype: bytes r—r)rkrw) r r�rirhrBr rPrfr!rvr>rrrÚ to_compact?sÿ þý üÿzJWS.to_compact)ÚcompactrcCsfz| d¡\}}}Wnty0t d¡‚Yn0|jt |¡ d¡t |¡d�}|t |¡|fd�S)zACompact deserialization. :param bytes compact: rwzOCompact JWS serialization should comprise of exactly 3 dot-separated componentsrk)rfrirŽ)ÚsplitÚ ValueErrorr rr–r rXr)rr™rfrvrirzrrrÚ from_compactRs ÿ ÿzJWS.from_compactT)ÚflatrcCsR|js J‚t |j¡}|rBt|jƒdkrB|jd ¡}||d<|S||jdœSdS)Nr—rrvrŽ)r�rrlrvr Úto_partial_json)r?r�rvÚretrrrržes  þzJWS.to_partial_jsonr†cs†d|vrd|vrt d¡‚nfd|vrVdd„| ¡Dƒ}ˆt |d¡ˆj |¡fd�Sˆt |d¡t‡fdd „|dDƒƒd�SdS) Nrir�zFlat mixed with non-flatcSsi|]\}}|dkr||“qS)rvr)r;ryrrrrr@xr“z!JWS.from_json..rvrŽc3s|]}ˆj |¡VqdSrV)r–r]r‘©rrrrY€r“z JWS.from_json..)r rrArrbr–r]rZ)rr‡Zfilteredrr rr]ss   þ þz JWS.from_json)N)T)r"r#r$r%r‰r_r^rrdr–rrcrarŠr|r&rrƒÚpropertyrir˜rœrr'ržrr]rrrrr�s   r�c@s¢eZdZdZeejddœdd„ƒZeejedœdd„ƒZ ee e j dœd d „ƒZ ee e dœd d „ƒZee eejdœd d„ƒZedeeeeedœdd„ƒZdS)ÚCLIzJWS CLI.N)ÚargsrcCsŽ|jj |j ¡¡}|j ¡|jdur.g|_|jr@|j d¡t j t j  ¡  ¡||jt|jƒd�}|jr~t| ¡ d¡ƒn t| ¡ƒdS)r•Nr))rvryr)r~rk)r)rÚloadryÚreadÚcloser~r™Úappendr�rƒÚsysÚstdinr!rHÚprintr˜rZjson_dumps_pretty)rr£ryrzrrrrƒ‡s   ÿzCLI.signc CsÆ|jrt tj ¡ ¡¡}nLzttt tj ¡¡ƒ}Wn0t j yf}zt |ƒWYd}~dSd}~00|j dur¢|j dus€J‚|j  |j  ¡¡ ¡}|j  ¡nd}tj |j ¡¡|j|d� S)r�NF)ry)r™r�rœr¨r©r¥r!r rur rLrªryrr¤r€r¦ÚstdoutÚwritervrr|)rr£rzr[ryrrrr|šs  z CLI.verify)ÚargrcCs tj |¡SrV)rr\r]©rr­rrrÚ _alg_type°sz CLI._alg_typecCs|tjjvsJ‚|SrV)rdrtr8r®rrrÚ _header_type´szCLI._header_typecCs|tjjvsJ‚tjj|SrV)r`raZTYPESr®rrrÚ _kty_type¹sz CLI._kty_typecCsä|durtjdd…}t ¡}|jddd�| ¡}| d¡}|j|jd�|jdd t  d ¡d d �|jd d|j t j d�|jddd|j d�| d¡}|j|jd�|jdd t  d ¡dd �|jd|jdd �| |¡}| |¡S)z Parse arguments and sign/verify.Nr—z --compactÚ store_true)Úactionrƒ)Úfuncz-kz--keyÚrbT)rEÚrequiredz-az--alg)rEr1z-pz --protectr§)r³rEr|Fz--kty)r¨ÚargvÚargparseÚArgumentParserÚ add_argumentÚadd_subparsersÚ add_parserÚ set_defaultsrƒÚFileTyper¯rZRS256r°r|r±Ú parse_argsr´)rr£ÚparserZ subparsersZ parser_signZ parser_verifyÚparsedrrrÚrun¾s    zCLI.run)N)r"r#r$r%r&r¸Ú NamespacerƒrŠr|rrr\r¯r°r r`rar±rrr'rÂrrrrr¢„sr¢Ú__main__)!r%r¸rOr¨Útypingrrrrrrrr r ZOpenSSLr rcr r rrrr`rrZJSONObjectWithFieldsr(rdr�r¢r"ÚexitrÂrrrrÚs",   kfR