
    [c#                         d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 ddl
mZmZmZmZ ddlmZmZmZmZ ddlmZmZ  G d d	          Z e            Zej        Zej        Zej        Zej        Zej        Zej        ZdS )
    N)Mapping)AnyDictListOptionalType   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)DecodeErrorInvalidAlgorithmErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encodec                      e Zd ZdZddZed             Zd Zd Zd Z		 	 	 	 dd
e
dedee         dee         deeej                          dedefdZ	 	 	 	 d dededeee                  dee         dee
         deeef         fdZ	 	 	 d!dededeee                  dee         def
dZd Zd Z	 	 d"dZd Zd ZdS )#PyJWSJWTNc                 6   t                      | _        |t          |          nt          | j                  | _        t	          | j                                                  D ]}|| j        vr| j        |= |i }i |                                 || _        d S )N)r   _algorithmsset_valid_algslistkeys_get_default_optionsoptions)self
algorithmsr   keys       +lib/python3.11/site-packages/jwt/api_jws.py__init__zPyJWS.__init__   s    133)PC
OOO3t?O;P;P 	
 (--//00 	* 	*C$** *$S) 	GA$3355AA    c                  
    ddiS )Nverify_signatureT r'   r$   r"   r   zPyJWS._get_default_options'   s    "D))r$   c                     || j         v rt          d          t          |t                    st	          d          || j         |<   | j                            |           dS )zW
        Registers a new Algorithm for use when creating and verifying tokens.
        z Algorithm already has a handler.z!Object is not of type `Algorithm`N)r   
ValueError
isinstancer
   	TypeErrorr   add)r   alg_idalg_objs      r"   register_algorithmzPyJWS.register_algorithm+   sp     T%% 	A?@@@'9-- 	A?@@@#* V$$$$$r$   c                 z    || j         vrt          d          | j         |= | j                            |           dS )z
        Unregisters an Algorithm for use when creating and verifying tokens
        Throws KeyError if algorithm is not registered.
        zJThe specified algorithm could not be removed because it is not registered.N)r   KeyErrorr   remove)r   r-   s     r"   unregister_algorithmzPyJWS.unregister_algorithm8   sU    
 )) 	1  
 V$'''''r$   c                 *    t          | j                  S )zM
        Returns a list of supported values for the 'alg' parameter.
        )r   r   )r   s    r"   get_algorithmszPyJWS.get_algorithmsF   s     D$%%%r$   HS256Fpayloadr!   	algorithmheadersjson_encoderis_payload_detachedreturnc                    g }|d}|r:|                     d          }|r|d         }|                     d          }	|	du rd}| j        |d}
|r*|                     |           |
                    |           |
d         s|
d= |rd|
d<   nd|
v r|
d= t	          j        |
d|	                                          }|                    t          |                     |r|}nt          |          }|                    |           d
	                    |          }	 | j
        |         }|                    |          }|                    ||          }nF# t          $ r9}t          s|t          v rt!          d| d          |t!          d          |d }~ww xY w|                    t          |                     |rd|d<   d
	                    |          }|                    d          S )Nnonealgb64FT)typr?   rA   ),:)
separatorscls   .zAlgorithm 'z9' could not be found. Do you have cryptography installed?Algorithm not supportedr$   r	   utf-8)get
header_typ_validate_headersupdatejsondumpsencodeappendr   joinr   prepare_keysignr1   r   r   NotImplementedErrordecode)r   r7   r!   r8   r9   r:   r;   segmentsheaders_algheaders_b64headerjson_headermsg_payloadsigning_inputr.   	signatureeencoded_strings                     r"   rO   zPyJWS.encodeL   sc     	I  	+!++e,,K +#EN	!++e,,Ke# +&*# ;; 	#""7+++MM'"""e} 	u 	!F5MMf_ 	ujz|
 
 

&(( 	 	(55666 	4!KK*733K$$$ 		(++
	H&y1G%%c**C]C88II 	H 	H 	H )/D"D )f)fff  &&?@@aG	H 	(33444  	HQK8,,$$W---s   8E 
F 4FF jwtr    r   detached_payloadc                    |i }i | j         |}|d         }|r|st          d          |                     |          \  }	}
}}|                    dd          du rD|t          d          |}	d                    |
                    dd          d	         |	g          }
|r|                     |
||||           |	||d
S )Nr&   z\It is required that you pass in a value for the "algorithms" argument when calling decode().r@   TFzIt is required that you pass in a value for the "detached_payload" argument to decode a message having the b64 header set to false.rF   r	   r   )r7   rY   r]   )r   r   _loadrI   rQ   rsplit_verify_signature)r   ra   r!   r    r   rb   kwargsmerged_optionsr&   r7   r\   rY   r]   s                r"   decode_completezPyJWS.decode_complete   s     	G4DL4G4)*<= 	J 	n   59JJsOO1	::eT""e+ 	S ! Z   'G II}';';D!'D'DQ'G&QRRM 	V""=&)S*UUU "
 
 	
r$   c                 4     | j         ||||fi |}|d         S )Nr7   )ri   )r   ra   r!   r    r   rg   decodeds          r"   rU   zPyJWS.decode   s/     '$&sCWOOOOy!!r$   c                 f    |                      |          d         }|                     |           |S )zReturns back the JWT header parameters as a dict()

        Note: The signature is not verified so the header parameters
        should not be fully trusted until signature verification is complete
           )rd   rK   )r   ra   r9   s      r"   get_unverified_headerzPyJWS.get_unverified_header   s1     **S//!$w'''r$   c                    t          |t                    r|                    d          }t          |t                    st	          dt                     	 |                    dd          \  }}|                    dd          \  }}n"# t          $ r}t	          d          |d }~ww xY w	 t          |          }n.# t          t          j        f$ r}t	          d          |d }~ww xY w	 t          j        |          }n%# t          $ r}	t	          d|	           |	d }	~	ww xY wt          |t                    st	          d          	 t          |          }
n.# t          t          j        f$ r}t	          d	          |d }~ww xY w	 t          |          }n.# t          t          j        f$ r}t	          d
          |d }~ww xY w|
|||fS )NrH   z$Invalid token type. Token must be a rF   r	   zNot enough segmentszInvalid header paddingzInvalid header string: z,Invalid header string: must be a json objectzInvalid payload paddingzInvalid crypto padding)r*   strrO   bytesr   re   splitr)   r   r+   binasciiErrorrM   loadsr   )r   ra   r\   crypto_segmentheader_segmentpayload_segmenterrheader_datarY   r^   r7   r]   s               r"   rd   zPyJWS._load   s0   c3 	&**W%%C#u%% 	NLULLMMM	>,/JJtQ,?,?)M>.;.A.A$.J.J+NOO 	> 	> 	>344#=	>	A*>::KK8>* 	A 	A 	A677S@	A	DZ,,FF 	D 	D 	D;;;<<!C	D &'** 	NLMMM	B&77GG8>* 	B 	B 	B788cA	B	A(88II8>* 	A 	A 	A677S@	A 	::sx   2B 
B*B%%B*.B> >C)C$$C)-D 
D$DD$E F2FFF G1GGc                 0   |                     d          }|||vrt          d          	 | j        |         }|                    |          }|                    |||          st          d          d S # t          $ r}t          d          |d }~ww xY w)Nr?   z&The specified alg value is not allowedzSignature verification failedrG   )rI   r   r   rR   verifyr   r1   )	r   r\   rY   r]   r!   r    r?   r.   r^   s	            r"   rf   zPyJWS._verify_signature   s     jj 	Rc&; 	R'(PQQQ	J&s+G%%c**C>>-i@@ M+,KLLLM M  	J 	J 	J'(ABBI	Js   AA6 6
B BBc                 H    d|v r|                      |d                    d S d S )Nkid)_validate_kid)r   r9   s     r"   rK   zPyJWS._validate_headers  s7    G 	/wu~.....	/ 	/r$   c                 N    t          |t                    st          d          d S )Nz(Key ID header parameter must be a string)r*   rp   r   )r   r~   s     r"   r   zPyJWS._validate_kid  s0    #s## 	P#$NOOO	P 	Pr$   )NN)r6   NNF)r`   NNN)r`   NN)r`   N)__name__
__module____qualname__rJ   r#   staticmethodr   r/   r3   r5   rq   rp   r   r   r   rM   JSONEncoderboolrO   r   r   ri   rU   rn   rd   rf   rK   r   r'   r$   r"   r   r      sD       JB B B B * * \*% % %( ( (& & & $+"&9=$)J. J.J. J. C=	J.
 $J. tD$456J. "J. 
J. J. J. J.^ *."&,0$
 $
$
 $
 T#Y'	$

 $$
 #5/$
 
c3h$
 $
 $
 $
R *."&	" 	"	" 	" T#Y'		"
 $	" 
	" 	" 	" 	"	 	 	$; $; $;V J J J J0/ / /P P P P Pr$   r   )rs   rM   collections.abcr   typingr   r   r   r   r   r    r
   r   r   r   
exceptionsr   r   r   r   utilsr   r   r   _jws_global_objrO   ri   rU   r/   r3   rn   r'   r$   r"   <module>r      sd     # # # # # # 2 2 2 2 2 2 2 2 2 2 2 2 2 2                       6 5 5 5 5 5 5 5CP CP CP CP CP CP CP CPL %''		!1		$7 &; '=   r$   