
    k7i5                         S SK Jr  S SK Jr  S SK Jr  S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S S	KJ
r
  S S
KJr  S SKJr  S SKJr  S SKJr  SSKJr  SSKJr   " S S5      rS rS rS rg)    )json_b64encode)to_bytes)
to_unicode)urlsafe_b64encode)BadSignatureError)DecodeError)#InvalidCritHeaderParameterNameErrorInvalidHeaderParameterNameError)MissingAlgorithmError)UnsupportedAlgorithmError)ensure_dict)extract_header)extract_segment   )	JWSHeader)	JWSObjectc                       \ rS rSr% \" / SQ5      rSr\\S'   0 r	SS jr
\S 5       rS rSS	 jrS
 rSS jrS rSS jrS rS rS rS rS rSrg)JsonWebSignature   )algjkujwkkidx5ux5cx5tzx5t#S256typctycriti  MAX_CONTENT_LENGTHNc                     X l         Xl        g N)_private_headers_algorithms)self
algorithmsprivate_headerss      R/home/james-whalen/.local/lib/python3.13/site-packages/authlib/jose/rfc7515/jws.py__init__JsonWebSignature.__init__*   s     /%    c                     U(       a  UR                   S:w  a  [        SU< 35      eXR                  UR                  '   g )NJWSzInvalid algorithm for JWS, )algorithm_type
ValueErrorALGORITHMS_REGISTRYname)cls	algorithms     r)   register_algorithm#JsonWebSignature.register_algorithm.   s7    I44=:9-HII2;	/r,   c                 V   [        US5      nU R                  U5        U R                  U5        U R                  XU5      u  pS[	        UR
                  5      n[        [        U5      5      nSR                  Xg/5      n[        UR                  X5      5      n	SR                  XgU	/5      $ )a  Generate a JWS Compact Serialization. The JWS Compact Serialization
represents digitally signed or MACed content as a compact, URL-safe
string, per `Section 7.1`_.

.. code-block:: text

    BASE64URL(UTF8(JWS Protected Header)) || '.' ||
    BASE64URL(JWS Payload) || '.' ||
    BASE64URL(JWS Signature)

:param protected: A dict of protected header
:param payload: A bytes/string of payload
:param key: Private key used to generate signature
:return: byte
N   .)
r   _validate_private_headers_validate_crit_headers_prepare_algorithm_keyr   	protectedr   r   joinsign)
r&   r<   payloadkey
jws_headerr4   protected_segmentpayload_segmentsigning_input	signatures
             r)   serialize_compact"JsonWebSignature.serialize_compact4   s      y$/
&&y1##I.44YM	*:+?+?@+HW,=> 		#4"FG%inn]&HI	yy+iHIIr,   c                    [        U5      U R                  :  a  [        S5      e [        U5      nUR	                  SS5      u  pEUR                  SS5      u  pg[        U5      n	U R                  U	5        [        U	S5      n
[        U5      nU(       a  U" U5      n[        U5      n[        XS5      nU R                  XU5      u  pUR                  XLU5      (       a  U$ [        U5      e! [         a  n[        S5      UeSnAff = f)a  Exact JWS Compact Serialization, and validate with the given key.
If key is not provided, the returned dict will contain the signature,
and signing input values. Via `Section 7.1`_.

:param s: text of JWS Compact Serialization
:param key: key used to verify the signature
:param decode: a function to decode payload data
:return: JWSObject
:raise: BadSignatureError

.. _`Section 7.1`: https://tools.ietf.org/html/rfc7515#section-7.1
zSerialization is too long.r8   r   zNot enough segmentsNcompact)lenr!   r0   r   rsplitsplitr   _extract_headerr:   r   _extract_payload_extract_signaturer   r;   verifyr   )r&   sr@   decoderD   signature_segmentrB   rC   excr<   rA   r?   rE   rvr4   s                  r)   deserialize_compact$JsonWebSignature.deserialize_compactQ   s    q6D+++9::	>A/0xxa/@,M1>1D1DT11M. $$56	##I.y$/
"?3WoG&'89	zI644Z#N	Mc::I##!  	>34#=	>s   3C* *
D4D  Dc                 0  ^ ^^^ [        T5      mUUUU 4S jn[        U[        5      (       a,  U" [        R                  " U5      5      n[        T5      US'   U$ U Vs/ s H  od" [        R                  " U5      5      PM      nn[        T5      US.$ s  snf )a.  Generate a JWS JSON Serialization. The JWS JSON Serialization
represents digitally signed or MACed content as a JSON object,
per `Section 7.2`_.

:param header_obj: A dict/list of header
:param payload: A string/dict of payload
:param key: Private key used to generate signature
:return: JWSObject

Example ``header_obj`` of JWS JSON Serialization::

    {
        "protected: {"alg": "HS256"},
        "header": {"kid": "jose"}
    }

Pass a dict to generate flattened JSON Serialization, pass a list of
header dict to generate standard JSON Serialization.
c                   > T
R                  U 5        T
R                  U R                  5        T
R                  U R                  5        T
R                  U TT5      u  p[        U R                  5      nSR                  UT	/5      n[        UR                  XB5      5      n[        U5      [        U5      S.nU R                  b  U R                  US'   U$ )Nr8   )r<   rE   header)r9   _reject_unprotected_critrZ   r:   r<   r;   r   r=   r   r>   r   )rA   _alg_keyrB   rD   rE   rU   r@   r?   rC   r&   s          r)   _sign.JsonWebSignature.serialize_json.<locals>._sign   s    **:6 ))**;*;<''
(<(<=44Z#NJD .z/C/C D II'8/&JKM)$))M*HII ((9:'	2B   ,)008Ir,   r?   )r?   
signatures)r   
isinstancedictr   	from_dictr   )	r&   
header_objr?   r@   r^   datahr`   rC   s	   ` ``    @r)   serialize_jsonJsonWebSignature.serialize_jsonw   s    ( )1	 	* j$'',,Z89D(9DOK=GHZeI//23Z
H%o6jQQ Is   %Bc                    [        US5      nUR                  S5      nUc  [        S5      e[        U5      n[	        U5      nU(       a  U" U5      nSU;  a4  U R                  XEX5      u  pg[        XeS5      nU(       a  U$ [        U5      e/ n	Sn
US    H3  nU R                  XEX5      u  pgU	R                  U5        U(       a  M1  Sn
M5     [        XS5      nU
(       a  U$ [        U5      e)	a  Exact JWS JSON Serialization, and validate with the given key.
If key is not provided, it will return a dict without signature
verification. Header will still be validated. Via `Section 7.2`_.

:param obj: text of JWS JSON Serialization
:param key: key used to verify the signature
:param decode: a function to decode payload data
:return: JWSObject
:raise: BadSignatureError

.. _`Section 7.2`: https://tools.ietf.org/html/rfc7515#section-7.2
r.   r?   zMissing "payload" valuer`   flatTFjson)	r   getr   r   rN   _validate_json_jwsr   r   append)r&   objr@   rR   rC   r?   rA   validrU   headersis_validrd   s               r)   deserialize_json!JsonWebSignature.deserialize_json   s     #u%''),"788"?3"?3WoGs" $ 7 7#!J :7B	#B''l+J $ 7 7*!J NN:&5  , w0I##r,   c                     [        U[        [        45      (       a  U R                  XU5      $ SU;   a  U R                  XU5      $ U R	                  XU5      $ )a  Generate a JWS Serialization. It will automatically generate a
Compact or JSON Serialization depending on the given header. If a
header is in a JSON header format, it will call
:meth:`serialize_json`, otherwise it will call
:meth:`serialize_compact`.

:param header: A dict/list of header
:param payload: A string/dict of payload
:param key: Private key used to generate signature
:return: byte/dict
r<   )ra   listtuplerg   rF   )r&   rZ   r?   r@   s       r)   	serializeJsonWebSignature.serialize   sV     ftUm,,&&v<<& &&v<<%%fs;;r,   c                    [        U[        5      (       a  U R                  XU5      $ [        U5      nUR	                  S5      (       a(  UR                  S5      (       a  U R                  XU5      $ U R                  XU5      $ )a  Deserialize JWS Serialization, both compact and JSON format.
It will automatically deserialize depending on the given JWS.

:param s: text of JWS Compact/JSON Serialization
:param key: key used to verify the signature
:param decode: a function to decode payload data
:return: dict
:raise: BadSignatureError

If key is not provided, it will still deserialize the serialization
without verification.
   {   })ra   rb   rs   r   
startswithendswithrV   )r&   rQ   r@   rR   s       r)   deserializeJsonWebSignature.deserialize   sp     a((88QK<<!**T"2"2((88''77r,   c                 >   SU;  a
  [        5       eUS   nU R                  b  X@R                  ;  a
  [        5       eX@R                  ;  a
  [        5       eU R                  U   n[	        U5      (       a	  U" X5      nOUc  SU;   a  US   nUR                  U5      nXS4$ )Nr   r   )r   r%   r   r1   callableprepare_key)r&   rZ   r?   r@   r   r4   s         r)   r;   'JsonWebSignature._prepare_algorithm_key  s    '))Um'C7G7G,G+--...+--,,S1	C==f&C[Uf_-C##C(~r,   c                     U R                   bO  U R                  R                  5       nUR                  U R                   5      nU H  nX2;  d  M
  [	        U5      e   g g r#   )r$   !REGISTERED_HEADER_PARAMETER_NAMEScopyunionr   )r&   rZ   namesks       r)   r9   *JsonWebSignature._validate_private_headers  sW       ,::??AEKK 5 56E>9!<< 	 -r,   c                 6    U(       a  SU;   a  [        S5      egg)uG   Reject 'crit' when found in the unprotected header (RFC 7515 §4.1.11).r    Nr
   )r&   unprotected_headers     r)   r[   )JsonWebSignature._reject_unprotected_crit   s     &,>">1&99 #?r,   c                 h   SU;   a  US   n[        U[        5      (       a  [        S U 5       5      (       d  [        S5      eU R                  R                  5       nU R                  (       a  UR                  U R                  5      nU H#  nXC;  a  [        U5      eXA;  d  M  [        U5      e   g g )Nr    c              3   B   #    U  H  n[        U[        5      v   M     g 7fr#   )ra   str).0xs     r)   	<genexpr>:JsonWebSignature._validate_crit_headers.<locals>.<genexpr>)  s      =,8q
1c""Ls   )	ra   rv   allr   r   r   r$   r   r	   )r&   rZ   crit_headersr   r   s        r)   r:   'JsonWebSignature._validate_crit_headers%  s    V!&>LlD11 =,8= : : 6f==::??AE$$D$9$9:!>=a@@_=a@@	 " r,   c                 6   UR                  S5      nU(       d  [        S5      eUR                  S5      nU(       d  [        S5      e[        U5      n[        U5      nUR                  S5      nU(       a   [	        U[
        5      (       d  [        S5      eU R                  U5        U R                  U5        [        Xx5      n	U R                  XU5      u  pSR                  XQ/5      n[        [        U5      5      nU
R                  XU5      (       a  U	S4$ U	S	4$ )
Nr<   zMissing "protected" valuerE   zMissing "signature" valuerZ   zInvalid "header" valuer8   TF)rl   r   r   rM   ra   rb   r[   r:   r   r;   r=   rO   rP   )r&   rC   r?   rd   r@   rB   rS   r<   rZ   rA   r4   rD   rE   s                r)   rm   #JsonWebSignature._validate_json_jws6  s   &NN;7 9::&NN;7 9::$%67#$56	)*VT22677 	%%f-
 	##I.y1
44Z#N			#4"FG&x0A'BC	Mc::t##5  r,   )r%   r$   )NNr#   )__name__
__module____qualname____firstlineno__	frozensetr   r!   int__annotations__r1   r*   classmethodr5   rF   rV   rg   rs   rx   r   r;   r9   r[   r:   rm   __static_attributes__ r,   r)   r   r      s}    (1	
)%  %$ & < <
J:$$L1Rf0$d<$8*$	=:
A"!r,   r   c                 "    [        U [        5      $ r#   )r   r   )header_segments    r)   rM   rM   U  s    .+66r,   c                 $    [        U [        S5      $ )NrE   r   r   )rS   s    r)   rO   rO   Y  s    ,k;GGr,   c                 $    [        U [        S5      $ )Nr?   r   )rC   s    r)   rN   rN   ]  s    ?KCCr,   N)authlib.common.encodingr   r   r   r   authlib.jose.errorsr   r   r	   r   r   r   authlib.jose.utilr   r   r   modelsr   r   r   rM   rO   rN   r   r,   r)   <module>r      sP    2 , . 5 1 + C ? 5 9 ) , -  ! !D
7HDr,   