o
    ¥i˜5  ã                   @   sÞ   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 ddlmZ G dd„ dƒZdd„ Zdd„ Zdd„ ZdS )é    )Újson_b64encode)Úto_bytes)Ú
to_unicode)Úurlsafe_b64encode)ÚBadSignatureError)ÚDecodeError)Ú#InvalidCritHeaderParameterNameError©ÚInvalidHeaderParameterNameError)ÚMissingAlgorithmError)ÚUnsupportedAlgorithmError)Úensure_dict)Úextract_header)Úextract_segmenté   )Ú	JWSHeader)Ú	JWSObjectc                   @   sž   e Zd ZU eg d¢ƒZdZeed< i Zddd„Z	e
dd„ ƒZd	d
„ Zd dd„Zdd„ Zd dd„Zdd„ Zd dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!ÚJsonWebSignature)ÚalgÚjkuÚjwkÚkidÚx5uÚx5cÚx5tzx5t#S256ÚtypÚctyÚcriti è ÚMAX_CONTENT_LENGTHNc                 C   s   || _ || _d S ©N)Ú_private_headersÚ_algorithms)ÚselfÚ
algorithmsÚprivate_headers© r%   ú^/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/authlib/jose/rfc7515/jws.pyÚ__init__*   s   
zJsonWebSignature.__init__c                 C   s,   |r|j dkrtd|›ƒ‚|| j|j< d S )NÚJWSzInvalid algorithm for JWS, )Úalgorithm_typeÚ
ValueErrorÚALGORITHMS_REGISTRYÚname)ÚclsÚ	algorithmr%   r%   r&   Úregister_algorithm.   s   z#JsonWebSignature.register_algorithmc           
      C   st   t |dƒ}|  |¡ |  |¡ |  |||¡\}}t|jƒ}tt|ƒƒ}d ||g¡}t| 	||¡ƒ}	d |||	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Ú_validate_crit_headersÚ_prepare_algorithm_keyr   Ú	protectedr   r   ÚjoinÚsign)
r"   r4   ÚpayloadÚkeyÚ
jws_headerr.   Úprotected_segmentÚpayload_segmentÚsigning_inputÚ	signaturer%   r%   r&   Úserialize_compact4   s   



z"JsonWebSignature.serialize_compactc              
   C   sÖ   t |ƒ| jkrtdƒ‚zt|ƒ}| dd¡\}}| dd¡\}}W n ty2 } ztdƒ|‚d}~ww t|ƒ}	|  |	¡ t	|	dƒ}
t
|ƒ}|rK||ƒ}t|ƒ}t|
|dƒ}|  |
||¡\}}| |||¡rg|S t|ƒ‚)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.r0   r   zNot enough segmentsNÚcompact)Úlenr   r*   r   ÚrsplitÚsplitr   Ú_extract_headerr2   r   Ú_extract_payloadÚ_extract_signaturer   r3   Úverifyr   )r"   Úsr8   Údecoder<   Úsignature_segmentr:   r;   Úexcr4   r9   r7   r=   Úrvr.   r%   r%   r&   Údeserialize_compactQ   s,   
€ÿ

z$JsonWebSignature.deserialize_compactc                    sb   t ˆƒ‰‡‡‡‡fdd„‰ t|tƒr!ˆ t |¡ƒ}tˆƒ|d< |S ‡ fdd„|D ƒ}tˆƒ|dœS )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                    s†   ˆ  | ¡ ˆ | j¡ ˆ | j¡ ˆ | ˆˆ ¡\}}t| jƒ}d |ˆg¡}t| 	||¡ƒ}t
|ƒt
|ƒdœ}| jd urA| j|d< |S )Nr0   )r4   r=   Úheader)r1   Ú_reject_unprotected_critrM   r2   r4   r3   r   r5   r   r6   r   )r9   Ú_algÚ_keyr:   r<   r=   rK   )r8   r7   r;   r"   r%   r&   Ú_sign   s   

þ

z.JsonWebSignature.serialize_json.<locals>._signr7   c                    s   g | ]	}ˆ t  |¡ƒ‘qS r%   )r   Ú	from_dict)Ú.0Úh)rQ   r%   r&   Ú
<listcomp>§   s    z3JsonWebSignature.serialize_json.<locals>.<listcomp>)r7   Ú
signatures)r   Ú
isinstanceÚdictr   rR   r   )r"   Ú
header_objr7   r8   ÚdatarV   r%   )rQ   r8   r7   r;   r"   r&   Úserialize_jsonw   s   
zJsonWebSignature.serialize_jsonc                 C   sÐ   t |dƒ}| d¡}|du rtdƒ‚t|ƒ}t|ƒ}|r ||ƒ}d|vr<|  ||||¡\}}t||dƒ}|r8|S t|ƒ‚g }	d}
|d D ]}|  ||||¡\}}|	 |¡ |sYd}
qDt|	|d	ƒ}|
rd|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(   r7   NzMissing "payload" valuerV   ÚflatTFÚjson)	r   Úgetr   r   rD   Ú_validate_json_jwsr   r   Úappend)r"   Úobjr8   rH   r;   r7   r9   ÚvalidrK   ÚheadersÚis_validrY   r%   r%   r&   Údeserialize_jsonª   s<   

ÿÿ
€z!JsonWebSignature.deserialize_jsonc                 C   s@   t |ttfƒr|  |||¡S d|v r|  |||¡S |  |||¡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
        r4   )rW   ÚlistÚtupler[   r>   )r"   rM   r7   r8   r%   r%   r&   Ú	serializeÜ   s
   zJsonWebSignature.serializec                 C   sP   t |tƒr|  |||¡S t|ƒ}| d¡r!| d¡r!|  |||¡S |  |||¡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.
        ó   {ó   })rW   rX   re   r   Ú
startswithÚendswithrL   )r"   rG   r8   rH   r%   r%   r&   Údeserializeî   s   
zJsonWebSignature.deserializec                 C   sˆ   d|vrt ƒ ‚|d }| jd ur|| jvrtƒ ‚|| jvr tƒ ‚| j| }t|ƒr/|||ƒ}n|d u r;d|v r;|d }| |¡}||fS )Nr   r   )r   r!   r   r+   ÚcallableÚprepare_key)r"   rM   r7   r8   r   r.   r%   r%   r&   r3     s   


z'JsonWebSignature._prepare_algorithm_keyc                 C   sB   | j d ur| j ¡ }| | j ¡}|D ]}||vrt|ƒ‚qd S d S r   )r    Ú!REGISTERED_HEADER_PARAMETER_NAMESÚcopyÚunionr
   )r"   rM   ÚnamesÚkr%   r%   r&   r1     s   

ÿûz*JsonWebSignature._validate_private_headersc                 C   s   |r
d|v rt dƒ‚dS dS )uG   Reject 'crit' when found in the unprotected header (RFC 7515 Â§4.1.11).r   Nr	   )r"   Úunprotected_headerr%   r%   r&   rN      s   ÿz)JsonWebSignature._reject_unprotected_critc                 C   s‚   d|v r=|d }t |tƒrtdd„ |D ƒƒstdƒ‚| j ¡ }| jr(| | j¡}|D ]}||vr4t|ƒ‚||vr<t|ƒ‚q*d S d S )Nr   c                 s   s    | ]}t |tƒV  qd S r   )rW   Ústr)rS   Úxr%   r%   r&   Ú	<genexpr>)  s   € 

ÿz:JsonWebSignature._validate_crit_headers.<locals>.<genexpr>)	rW   rf   Úallr
   rp   rq   r    rr   r   )r"   rM   Úcrit_headersrs   rt   r%   r%   r&   r2   %  s"   ÿ
ÿó
z'JsonWebSignature._validate_crit_headersc                 C   sÄ   |  d¡}|stdƒ‚|  d¡}|stdƒ‚t|ƒ}t|ƒ}|  d¡}|r.t|tƒs.tdƒ‚|  |¡ |  |¡ t||ƒ}	|  	|	||¡\}
}d 
||g¡}tt|ƒƒ}|
 |||¡r^|	dfS |	d	fS )
Nr4   zMissing "protected" valuer=   zMissing "signature" valuerM   zInvalid "header" valuer0   TF)r^   r   r   rC   rW   rX   rN   r2   r   r3   r5   rE   rF   )r"   r;   r7   rY   r8   r:   rI   r4   rM   r9   r.   r<   r=   r%   r%   r&   r_   6  s(   





z#JsonWebSignature._validate_json_jws)NNr   )Ú__name__Ú
__module__Ú__qualname__Ú	frozensetrp   r   ÚintÚ__annotations__r+   r'   Úclassmethodr/   r>   rL   r[   re   rh   rm   r3   r1   rN   r2   r_   r%   r%   r%   r&   r      s(   
 ÿ


&
32
r   c                 C   s
   t | tƒS r   )r   r   )Úheader_segmentr%   r%   r&   rC   U  s   
rC   c                 C   ó   t | tdƒS )Nr=   ©r   r   )rI   r%   r%   r&   rE   Y  ó   rE   c                 C   rƒ   )Nr7   r„   )r;   r%   r%   r&   rD   ]  r…   rD   N)Úauthlib.common.encodingr   r   r   r   Úauthlib.jose.errorsr   r   r   r
   r   r   Úauthlib.jose.utilr   r   r   Úmodelsr   r   r   rC   rE   rD   r%   r%   r%   r&   Ú<module>   s*      D