a
    |f^k                     @   sJ  d dl mZmZ d dl mZmZ d dl mZmZ d dl mZmZ d dl	m
Z
 d dlmZmZ eddd	d
edddd
edddd
eddd	d
edddd
edddd
edddd
edddd
eddd	d
eddd	d
edd	d	d
edd	d	d
dZg dZG dd deZG dd deZG dd deZG dd dZG d d! d!Zd
S )"    )JWExceptionJWKeyNotFound)JWSEHeaderParameterJWSEHeaderRegistry)base64url_decodebase64url_encode)json_decodejson_encode)JWA)JWKJWKSetZ	AlgorithmFTNzJWK Set URLzJSON Web KeyzKey IDz	X.509 URLzX.509 Certificate Chainz"X.509 Certificate SHA-1 Thumbprintz$X.509 Certificate SHA-256 ThumbprintTypezContent TypeZCriticalzBase64url-Encode Payload)algZjkuZjwkkidZx5uZx5cZx5tzx5t#S256typZctycritb64)ZHS256ZHS384ZHS512ZRS256ZRS384ZRS512ZES256ZES384ZES512ZPS256ZPS384ZPS512ZEdDSAZES256Kc                       s"   e Zd ZdZd fdd	Z  ZS )InvalidJWSSignaturez_Invalid JWS Signature.

    This exception is raised when a signature cannot be validated.
    Nc                    s>   d }|rt |}nd}|r*|dt | 7 }tt| | d S )Nz&Unknown Signature Verification Failure {%s})strsuperr   __init__selfmessage	exceptionmsg	__class__ FD:\Projects\storyit_web\backend\venv\Lib\site-packages\jwcrypto/jws.pyr   +   s    
zInvalidJWSSignature.__init__)NN__name__
__module____qualname____doc__r   __classcell__r   r   r   r    r   %   s   r   c                       s"   e Zd ZdZd fdd	Z  ZS )InvalidJWSObjectzvInvalid JWS Object.

    This exception is raised when the JWS Object is invalid and/or
    improperly formatted.
    Nc                    s<   d}|r|d| 7 }|r(|dt | 7 }tt| | d S )NzInvalid JWS Objectz [%s]r   )r   r   r'   r   r   r   r   r    r   =   s    zInvalidJWSObject.__init__)NNr!   r   r   r   r    r'   6   s   r'   c                       s"   e Zd ZdZd fdd	Z  ZS )InvalidJWSOperationzInvalid JWS Object.

    This exception is raised when a requested operation cannot
    be execute due to unsatisfied conditions.
    Nc                    s:   d }|r|}nd}|r&|dt | 7 }tt| | d S )NzUnknown Operation Failurer   )r   r   r(   r   r   r   r   r    r   M   s    zInvalidJWSOperation.__init__)NNr!   r   r   r   r    r(   F   s   r(   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )JWSCorezThe inner JWS Core object.

    This object SHOULD NOT be used directly, the JWS object should be
    used instead as JWS perform necessary checks on the validity of
    the object and requested operations.

    Nc                 C   sl   || _ | ||| _|| _|durPt|tr4t|}t|| _t	|
d| _ni | _d| _| || _dS )a  Core JWS token handling.

        :param alg: The algorithm used to produce the signature.
            See RFC 7518
        :param key: A (:class:`jwcrypto.jwk.JWK`) verification or
         a (:class:`jwcrypto.jwk.JWKSet`) that contains a key indexed by the
         'kid' header. A JWKSet is allowed only for verification operations.
        :param header: A JSON string representing the protected header.
        :param payload(bytes): An arbitrary value
        :param algs: An optional list of allowed algorithms

        :raises ValueError: if the key is not a (:class:`jwcrypto.jwk.JWK`)
        :raises InvalidJWAAlgorithm: if the algorithm is not valid, is
            unknown or otherwise not yet implemented.
        :raises InvalidJWSOperation: if the algorithm is not allowed.
        Nutf-8 )r   _jwaenginekey
isinstancedictr	   r   headerr   encode	protected_payloadpayload)r   r   r.   r1   r5   algsr   r   r    r   a   s    

zJWSCore.__init__c                 C   s&   |d u rt }||vrtdt|S )NzAlgorithm not allowed)default_allowed_algsr(   r
   Zsigning_alg)r   nameallowedr   r   r    r,      s
    zJWSCore._jwac                 C   s8   | j ddrt|dS t|tr*|S |dS d S )Nr   Tr*   )r1   getr   r2   r/   bytesr   r5   r   r   r    r4      s
    
zJWSCore._payloadc                 C   sP   t | jtstdd| jd| jg}| j	| j|}| j| jt
|dS )zGenerates a signaturezkey is not a JWK object   .r*   )r3   r5   	signature)r/   r.   r   
ValueErrorjoinr3   r2   r5   r-   signr   )r   siginr>   r   r   r    rA      s    zJWSCore.signc              
   C   sb   z.d | jd| jg}| j| j|| W n. ty\ } ztd|W Y d}~n
d}~0 0 dS )zVerifies a signature

        :raises InvalidJWSSignature: if the verification fails.

        :return: Returns True or an Exception
        :rtype: `bool`
        r=   r*   zVerification failedNT)	r@   r3   r2   r5   r-   verifyr.   	Exceptionr   )r   r>   rB   er   r   r    rC      s     zJWSCore.verify)N)	r"   r#   r$   r%   r   r,   r4   rA   rC   r   r   r   r    r)   X   s   
!	r)   c                   @   s   e Zd ZdZd+ddZedd Zej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 Zd.ddZd/ddZd0ddZedd Zdd  Zed!d" Zed#d$ Zd%d& Zd'd( Zd)d* ZdS )1JWSzFJSON Web Signature object

    This object represent a JWS token.
    Nc                 C   s:   i | _ || j d< d| _d| _tt| _|r6| j| dS )zCreates a JWS object.

        :param payload(bytes): An arbitrary value (optional).
        :param header_registry: Optional additions to the header registry
        r5   N)objects	verifylog_allowed_algsr   JWSHeaderRegistryheader_registryupdate)r   r5   rK   r   r   r    r      s    

zJWS.__init__c                 C   s   | j r| j S tS dS )zAllowed algorithms.

        The list of allowed algorithms.
        Can be changed by setting a list of algorithm names.
        N)rI   r7   r   r   r   r    allowed_algs   s    zJWS.allowed_algsc                 C   s   t |tstd|| _d S )NzAllowed Algs must be a list)r/   list	TypeErrorrI   )r   r6   r   r   r    rN      s    
c                 C   s   | j ddS )NvalidF)rG   r:   rM   r   r   r    is_valid   s    zJWS.is_validc                 G   s  d }g }|d ur|d|v rZ|d }|D ]4}|| j vr@td| q$| j | js$td| q$|}d|v r|t|d ts|td|D ]l}|d u rq|d u ri }t| D ]:}|| j v r| j | jrtd| ||v rtd| q|| q|D ]}||vrtd| q|S )	Nr   zUnknown critical header: "%s"z!Unsupported critical header: "%s"r   zb64 header must be a booleanz"%s" must be protectedzDuplicate header: "%s"zMissing critical header "%s")	rK   r'   	supportedr/   boolrO   keysZmustprotectrL   )r   r3   headersr1   r   kZhnhr   r   r    _merge_check_headers   sD    

zJWS._merge_check_headersc                 C   s  i }|d ur&t |}t|ts&td|r<t|ts<td| ||}|D ]$}	|	| jv rL| j|	| sLtdqL|d u rd|vrtd|rd|v r||d krtd| d|d  d|}
n|d }
t|trt|
|||| j	}|
| | jd	 nt|tr|}d
| jv rH|| jd
 }|sDtd| jd
 |}|D ]}z4t|
|||| j	}|
| | jd	 W  qW nN ty } z4|d
| }| jd|t| W Y d }~n
d }~0 0 qLd	| jvrtdntdd S )NzInvalid Protected headerzInvalid Unprotected headerzFailed header checkr   zNo "alg" in headersz"alg" mismatch, requested "z
", found ""ZSuccessr   zKey ID {} not in key setzKey [{}] failed: [{}]No working key found in key setzUnrecognized key type)r   r/   r0   r   rY   rK   Zcheck_headerr   r)   rI   rC   rH   appendr   jose_headerZget_keysr   formatrD   r:   Z
thumbprintreprr?   )r   r   r.   r5   r>   r3   r1   pZchk_hdrshdrZresulting_algZsignerrU   Zkid_keysrW   Zsigner2rE   Zkeyidr   r   r    _verify  st    







 
zJWS._verifyc                 C   s6   | d}|d ur2|d u s&t|dkr*|S td|S )Nr5   r   z4Object Payload present but Detached Payload provided)r:   lenr(   )r   objZdpopr   r   r    _get_obj_payloadE  s    
zJWS._get_obj_payloadc           	      C   s  g | _ d| jd< | j}d}d|v r| ||}z4| ||||d |dd|dd d|d< W nF ty } z.t|trd}| j dt	|  W Y d}~n
d}~0 0 nd	|v rR| ||}|d	 D ]}z4| ||||d |dd|dd d|d< W q tyL } z0t|tr$d}| j dt	|  W Y d}~qd}~0 0 qnt
d
| js|rptdt
dt	| j  dS )a
  Verifies a JWS token.

        :param key: A (:class:`jwcrypto.jwk.JWK`) verification or
         a (:class:`jwcrypto.jwk.JWKSet`) that contains a key indexed by the
         'kid' header.
        :param alg: The signing algorithm (optional). Usually the algorithm
            is known as it is provided with the JOSE Headers of the token.
        :param detached_payload: A detached payload to verify the signature
            against. Only valid for tokens that are not carrying a payload.

        :raises InvalidJWSSignature: if the verification fails.
        :raises InvalidJWSOperation: if a detached_payload is provided but
                                     an object payload exists
        :raises JWKeyNotFound: if key is a JWKSet and the key is not found.
        FrQ   r>   r3   Nr1   TzFailed: [%s]
signatureszNo signatures availabler[   z&Verification failed for all signatures)rH   rG   rf   rb   r:   rD   r/   r   r\   r_   r   rR   )	r   r.   r   Zdetached_payloadrd   Z
missingkeyr5   rE   or   r   r    rC   O  sP    



,


.z
JWS.verifyc                 C   sR   dt t|d i}d|v r:t t|d }|d|d< d|v rN|d |d< |S )Nr>   r3   r*   r1   )r   r   decode)r   srh   r`   r   r   r    _deserialize_signature  s    zJWS._deserialize_signaturec                 C   sn   |d u rd }n,t |}|d}|d ur:t|ts:td|d}||krPd S |d u rb||d< ntdd S )Nr   zb64 header must be booleanzconflicting b64 values)r   r:   r/   rT   r'   )r   rh   r3   Zb64nr`   r   r   r   r    _deserialize_b64  s    



zJWS._deserialize_b64c              
   C   s  i | _ i }zLzt|}d|v rbg |d< |d D ].}| |}|d | | ||d q0n| |}| ||d d|v r|ddrtt|d |d< n|d |d< W n tyN   |	d}t
|dkrtdd	tt|d
 }	t
|	d
kr"|	d|d< | ||d  tt|d |d< tt|d |d< Y n0 || _ W n0 ty }
 ztd|
W Y d	}
~
n
d	}
~
0 0 |r| || d	S )aw  Deserialize a JWS token.

        NOTE: Destroys any current status and tries to import the raw
        JWS provided.

        If a key is provided a verification step will be attempted after
        the object is successfully deserialized.

        :param raw_jws: a 'raw' JWS token (JSON Encoded or Compact
         notation) string.
        :param key: A (:class:`jwcrypto.jwk.JWK`) verification or
         a (:class:`jwcrypto.jwk.JWKSet`) that contains a key indexed by the
         'kid' header (optional).
        :param alg: The signing algorithm (optional). Usually the algorithm
         is known as it is provided with the JOSE Headers of the token.

        :raises InvalidJWSObject: if the raw object is an invalid JWS token.
        :raises InvalidJWSSignature: if the verification fails.
        :raises JWKeyNotFound: if key is a JWKSet and the key is not found.
        rg   r3   r5   r   T.   zUnrecognized representationNr   r*         r>   zInvalid format)rG   r   rk   r\   rl   r:   r   r   r?   splitrc   r'   ri   rD   rC   )r   Zraw_jwsr.   r   rh   Zdjwsrj   osdatar`   rE   r   r   r    deserialize  sD    



 zJWS.deserializec                 C   s  d}|r$t |trt|}t|}nt }dt| v r^|dg }d|vrVtd|d }d| jv r~|| jd kr~tdd}|rt |trt|}t|}| 	||}d|v r|du r|d }n||d krt
d|du rt
d	t|||| jd
| j}	|	 }
t|
d dd}|r,||d< |r:||d< d| jv rX| jd | nd| jv rg | jd< d| jdi}d| jv r| jd|d< d| jv r| jd|d< d| jv r| jd|d< | jd | | jd | n| j| || jd< dS )a   Adds a new signature to the object.

        :param key: A (:class:`jwcrypto.jwk.JWK`) key of appropriate for
         the "alg" provided.
        :param alg: An optional algorithm name. If already provided as an
         element of the protected or unprotected header it can be safely
         omitted.
        :param protected: The Protected Header (optional)
        :param header: The Unprotected Header (optional)

        :raises InvalidJWSObject: if invalid headers are provided.
        :raises ValueError: if the key is not a (:class:`jwcrypto.jwk.JWK`)
        :raises ValueError: if the algorithm is missing or is not provided
         by one of the headers.
        :raises InvalidJWAAlgorithm: if the algorithm is not valid, is
         unknown or otherwise not yet implemented.
        Tr   r   z"b64 header must always be criticalzMixed b64 headers on signaturesNr   zF"alg" value mismatch, specified "alg" does not match JOSE header valuez"alg" not specifiedr5   r>   )r>   rQ   r3   r1   rg   rQ   )r/   r0   r	   r   rO   rU   r:   r'   rG   rY   r?   r)   rN   rA   r   r\   poprL   )r   r.   r   r3   r1   r   r`   r   rX   csigrh   nr   r   r    add_signature  sl    






zJWS.add_signatureFc           	      C   sX  |rd| j v rtdd| j vr*td| j dds@tdd| j v rxt| j d }d	|vrhtd
t| j d }ntd| j dr| j ddrt| j d }qt| j d tr| j d d}n
| j d }d|v rtdnd}d	||t| j d gS | j }i }| j dd}| j ddr<t||d< n||d< d|v r|ddsdtdt|d |d< d|v rt|d |d< d|v rL|d |d< nd|v rDg |d< |d D ]f}|dds֐qdt|d i}d|v r t|d |d< d|v r|d |d< |d 
| qt|d dkrLtdntdt|S dS )a  Serializes the object into a JWS token.

        :param compact(boolean): if True generates the compact
         representation, otherwise generates a standard JSON format.

        :raises InvalidJWSOperation: if the object cannot serialized
         with the compact representation and `compact` is True.
        :raises InvalidJWSSignature: if no signature has been added
         to the object, or no valid signature can be found.

        :return: A json formatted string or a compact representation string
        :rtype: `str`
        rg   z3Can't use compact encoding with multiple signaturesr>   zNo available signaturerQ   FzNo valid signature foundr3   r   z5Compact encoding must carry 'alg' in protected headerz3Can't use compact encoding without protected headerr5   r   Tr*   rm   zKCan't use compact encoding with unencoded payload that uses the . characterr+   r1   r   N)rG   r(   r   r:   r   r   r/   r;   ri   r@   r\   rc   r	   )	r   compactr`   r3   r5   rd   rw   rh   rj   r   r   r    	serialize=  sp    










zJWS.serializec                 C   s   | j std| jdS )NzPayload not verifiedr5   )rR   r(   rG   r:   rM   r   r   r    r5     s    zJWS.payloadc                 C   s   | j dd  d S )Nr5   )rG   ru   rM   r   r   r    detach_payload  s    zJWS.detach_payloadc                 C   s   | j }d|v r<d|v r$t|d }nd }| ||di S d| j v rg }|d D ]@}i }d|v rpt|d }nd }| ||di }|| qR|S tdd S )Nr>   r3   r1   rg   zJOSE Header(s) not available)rG   r   rY   r:   r\   r(   )r   rd   r`   Zjhlrh   Zjhr   r   r    r]     s"    
zJWS.jose_headerc                 C   s   |  }| | |S )a  Creates a JWS object from a serialized JWS token.

        :param token: A string with the json or compat representation
         of the token.

        :raises InvalidJWSObject: if the raw object is an invalid JWS token.

        :return: A JWS token
        :rtype: JWS
        )rt   )clstokenrd   r   r   r    from_jose_token  s    
zJWS.from_jose_tokenc                 C   sD   t |tsdS z|  | kW S  ty>   | j|jk Y S 0 d S )NF)r/   rF   r{   rD   rG   )r   otherr   r   r    __eq__  s    
z
JWS.__eq__c                 C   s*   z
|   W S  ty$   |   Y S 0 d S )N)r{   rD   __repr__rM   r   r   r    __str__  s    
zJWS.__str__c                 C   sF   zd|    dW S  ty@   | jd d}d| d Y S 0 d S )NzJWS.from_json_token("z")r5   r*   zJWS(payload=))r{   rD   rG   ri   r<   r   r   r    r     s
    zJWS.__repr__)NN)N)NN)NN)NNN)F)r"   r#   r$   r%   r   propertyrN   setterrR   rY   rb   rf   rC   rk   rl   rt   ry   r{   r5   r|   r]   classmethodr   r   r   r   r   r   r   r    rF      s6   



'
C

;	
>
[
P


rF   )Zjwcrypto.commonr   r   r   r   r   r   r   r	   Zjwcrypto.jwar
   Zjwcrypto.jwkr   r   rJ   r7   r   r'   r(   r)   rF   r   r   r   r    <module>   s8   	V