
    ~ht-                         d dl mZ d dl mZ d dl mZ d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d d	lm
Z
 d d
lmZ d dlmZ d dlmZ ddlmZ ddlmZ  G d d      Zd Zd Zd Zy)    )json_b64encode)to_bytes)
to_unicode)urlsafe_b64encode)BadSignatureError)DecodeError)InvalidHeaderParameterNameError)MissingAlgorithmError)UnsupportedAlgorithmError)ensure_dict)extract_header)extract_segment   )	JWSHeader)	JWSObjectc                   x    e Zd Z eg d      Zi ZddZed        Zd Z	ddZ
d ZddZd	 Zdd
Zd Zd Zd Zy)JsonWebSignature)algjkujwkkidx5ux5cx5tzx5t#S256typctycritNc                      || _         || _        y N)_private_headers_algorithms)self
algorithmsprivate_headerss      T/opt/mcp/mcp-sentiment/venv/lib/python3.12/site-packages/authlib/jose/rfc7515/jws.py__init__zJsonWebSignature.__init__'   s     /%    c                 t    |r|j                   dk7  rt        d|      || j                  |j                  <   y )NJWSzInvalid algorithm for JWS, )algorithm_type
ValueErrorALGORITHMS_REGISTRYname)cls	algorithms     r%   register_algorithmz#JsonWebSignature.register_algorithm+   s9    I44=:9-HII2;	/r'   c                 >   t        |d      }| j                  |       | j                  |||      \  }}t        |j                        }t        t        |            }dj                  ||g      }t        |j                  ||            }	dj                  |||	g      S )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_prepare_algorithm_keyr   	protectedr   r   joinsign)
r"   r5   payloadkey
jws_headerr/   protected_segmentpayload_segmentsigning_input	signatures
             r%   serialize_compactz"JsonWebSignature.serialize_compact1   s      y$/
&&y144YM	3*:+?+?@+HW,=> 		#4o"FG%inn]C&HI	yy+_iHIIr'   c                    	 t        |      }|j                  dd      \  }}|j                  dd      \  }}t        |      }	t        |	d      }
t        |      }|r ||      }t        |      }t        |
|d      }| j                  |
||      \  }}|j                  |||      r|S t        |      # t        $ r}t	        d      |d}~ww xY w)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
        r2   r   zNot enough segmentsNcompact)r   rsplitsplitr+   r   _extract_headerr   _extract_payload_extract_signaturer   r4   verifyr   )r"   sr9   decoder=   signature_segmentr;   r<   excr5   r:   r8   r>   rvr/   s                  r%   deserialize_compactz$JsonWebSignature.deserialize_compactM   s    	>A/0xxa/@,M,1>1D1DT11M. $$56	y$/
"?3WoG&'89	z7I644Z#N	3M9c:I##  	>34#=	>s   5B1 1	C:CCc                     t               fd}t        |t              r+ |t        j                  |            }t              |d<   |S |D cg c]  } |t        j                  |             }}t              |dS c c}w )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                 @   
j                  |        
j                  |       \  }}t        | j                        }dj	                  |	g      }t        |j                  ||            }t        |      t        |      d}| j                  | j                  |d<   |S )Nr2   )r5   r>   header)	r3   r4   r   r5   r6   r   r7   r   rP   )r:   _alg_keyr;   r=   r>   rL   r9   r8   r<   r"   s          r%   _signz.JsonWebSignature.serialize_json.<locals>._sign   s    **:644Z#NJD$ .z/C/C D II'8/&JKM)$))M4*HII ((9:'	2B   ,)008Ir'   r8   )r8   
signatures)r   
isinstancedictr   	from_dictr   )	r"   
header_objr8   r9   rS   datahrT   r<   s	   ` ``    @r%   serialize_jsonzJsonWebSignature.serialize_jsono   s    ( )1	  j$',,Z89D(9DOK=GHeI//23H
H%o6jQQ Is   "B	c                    t        |d      }|j                  d      }|t        d      t        |      }t	        |      }|r ||      }d|vr3| j                  ||||      \  }}t        ||d      }|r|S t        |      g }	d}
|d   D ]/  }| j                  ||||      \  }}|	j                  |       |r.d}
1 t        |	|d      }|
r|S t        |      )	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)   r8   zMissing "payload" valuerT   flatTFjson)	r   getr   r   rE   _validate_json_jwsr   r   append)r"   objr9   rI   r<   r8   r:   validrL   headersis_validrX   s               r%   deserialize_jsonz!JsonWebSignature.deserialize_json   s    #u%''),"788"?3"?3WoGs" $ 7 7#s!J :w7B	#B''l+ 	!J $ 7 7*c!J NN:& 	! w0I##r'   c                     t        |t        t        f      r| j                  |||      S d|v r| j                  |||      S | j	                  |||      S )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
        r5   )rU   listtupler[   r?   )r"   rP   r8   r9   s       r%   	serializezJsonWebSignature.serialize   sY     ftUm,&&vw<<& &&vw<<%%fgs;;r'   c                     t        |t              r| j                  |||      S t        |      }|j	                  d      r$|j                  d      r| j                  |||      S | j                  |||      S )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.
           {   })rU   rV   rf   r   
startswithendswithrM   )r"   rH   r9   rI   s       r%   deserializezJsonWebSignature.deserialize   sm     a((C88QK<<!**T"2((C88''377r'   c                 (   d|vr
t               |d   }| j                  || j                  vr
t               || j                  vr
t               | j                  |   }t	        |      r
 |||      }n|	d|v r|d   }|j                  |      }||fS )Nr   r   )r
   r!   r   r,   callableprepare_key)r"   rP   r8   r9   r   r/   s         r%   r4   z'JsonWebSignature._prepare_algorithm_key   s    '))Um'Ct7G7G,G+--d...+--,,S1	C=fg&C[Uf_-C##C(#~r'   c                     | j                   L| j                  j                         }|j                  | j                         }|D ]  }||vst	        |       y y r   )r    !REGISTERED_HEADER_PARAMETER_NAMEScopyunionr	   )r"   rP   namesks       r%   r3   z*JsonWebSignature._validate_private_headers  s^       ,::??AEKK 5 56E =E>9!<<=	 -r'   c                    |j                  d      }|st        d      |j                  d      }|st        d      t        |      }t        |      }|j                  d      }|rt	        |t
              st        d      t        ||      }	| j                  |	||      \  }
}dj                  ||g      }t        t        |            }|
j                  |||      r|	dfS |	d	fS )
Nr5   zMissing "protected" valuer>   zMissing "signature" valuerP   zInvalid "header" valuer2   TF)r_   r   r   rD   rU   rV   r   r4   r6   rF   rG   )r"   r<   r8   rX   r9   r;   rJ   r5   rP   r:   r/   r=   r>   s                r%   r`   z#JsonWebSignature._validate_json_jws  s    &NN;7 9::&NN;7 9::$%67#$56	)*VT2677y&1
44Z#N	3		#4o"FG&x0A'BC	M9c:t##5  r'   )NNr   )__name__
__module____qualname__	frozensetru   r,   r&   classmethodr0   r?   rM   r[   rf   rj   rp   r4   r3   r`    r'   r%   r   r      se    (1	
)%" & < <
J8 $D,R\0$d<$8*$	=!r'   r   c                 "    t        | t              S r   )r   r   )header_segments    r%   rD   rD   +  s    .+66r'   c                 $    t        | t        d      S )Nr>   r   r   )rJ   s    r%   rF   rF   /  s    ,k;GGr'   c                 $    t        | t        d      S )Nr8   r   )r<   s    r%   rE   rE   3  s    ?KCCr'   N)authlib.common.encodingr   r   r   r   authlib.jose.errorsr   r   r	   r
   r   authlib.jose.utilr   r   r   modelsr   r   r   rD   rF   rE   r   r'   r%   <module>r      sM    2 , . 5 1 + ? 5 9 ) , -  V! V!r7HDr'   