
    CjA                       S SK Jr  S SKrS SKrS SKrS SKJr  S SKJrJ	r	  SSK
JrJrJrJr  SSKJr  SSKJrJrJrJrJr  SS	KJrJr  SS
KJrJr  \(       a  SSK
JrJr  SSKJr  \ " 5       r! " S S5      r"\"" 5       r#\#RH                  r$\#RJ                  r%\#RL                  r&\#RN                  r'\#RP                  r(\#RR                  r)\#RT                  r*g)    )annotationsN)Sequence)TYPE_CHECKINGAny   )	Algorithmget_default_algorithms
has_cryptorequires_cryptography)PyJWK)DecodeErrorInvalidAlgorithmErrorInvalidKeyErrorInvalidSignatureErrorInvalidTokenError)base64url_decodebase64url_encode)InsecureKeyLengthWarningRemovedInPyjwt3Warning)AllowedPrivateKeysAllowedPublicKeys)
SigOptionsc                     \ rS rSr% Sr  S     SS jjr\SS j5       rSS jrSS jr	SS jr
S S	 jr\SSS
S4               S!S jjr    S"             S#S jjr    S"             S$S jjrS%S jrS&S jr   S'             S(S jjrS1rS\S'   S
S.     S)S jjrS*S jrS+S jrSrg),PyJWS!   JWTNc                ^   [        5       U l        Ub  [        U5      O[        U R                  5      U l        [	        U R                  R                  5       5       H!  nX0R                  ;  d  M  U R                  U	 M#     U R                  5       U l        Ub  0 U R                  EUEU l        g g )N)r	   _algorithmsset_valid_algslistkeys_get_default_optionsoptions)self
algorithmsr$   keys       ]/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/jwt/api_jws.py__init__PyJWS.__init__$   s    
 23)5C
O3t?O?O;P 	
 ((--/0C***$$S) 1 $(#<#<#>6dll6g6DL     c                     SSS.$ )NTF)verify_signatureenforce_minimum_key_length r/   r+   r(   r#   PyJWS._get_default_options7   s    $(NNr+   c                    XR                   ;   a  [        S5      e[        U[        5      (       d  [	        S5      eX R                   U'   U R
                  R                  U5        g)z
Registers a new Algorithm for use when creating and verifying tokens.

:param str alg_id: the ID of the Algorithm
:param alg_obj: the Algorithm object
:type alg_obj: Algorithm
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_algorithmPyJWS.register_algorithm;   sW     %%%?@@'9--?@@#* V$r+   c                    XR                   ;  a  [        S5      eU R                   U	 U R                  R                  U5        g)z
Unregisters an Algorithm for use when creating and verifying tokens
:param str alg_id: the ID of the Algorithm
:raises KeyError: if algorithm is not registered.
zJThe specified algorithm could not be removed because it is not registered.N)r   KeyErrorr    remove)r%   r6   s     r(   unregister_algorithmPyJWS.unregister_algorithmL   sF     )))1 
 V$'r+   c                ,    [        U R                  5      $ )zP
Returns a list of supported values for the `alg` parameter.

:rtype: list[str]
)r!   r    )r%   s    r(   get_algorithmsPyJWS.get_algorithms[   s     D$$%%r+   c                     U R                   U   $ ! [         a6  n[        (       d  U[        ;   a  [	        SU S35      Ue[	        S5      UeSnAff = f)z
For a given string name, return the matching Algorithm object.

Example usage:
>>> jws_obj = PyJWS()
>>> jws_obj.get_algorithm_by_name("RS256")

:param alg_name: The name of the algorithm to retrieve
:type alg_name: str
:rtype: Algorithm
zAlgorithm 'z9' could not be found. Do you have cryptography installed?Algorithm not supportedN)r   r;   r
   r   NotImplementedError)r%   alg_namees      r(   get_algorithm_by_namePyJWS.get_algorithm_by_namec   se    	H##H-- 	H:(.C"C)!(+de &&?@aG	Hs    
A1AAFTc                D   / nU[         L a%  [        U[        5      (       a  UR                  n	O-Sn	O*Uc%  [        U[        5      (       a  UR                  n	OSn	OUn	U(       a5  UR	                  S5      n
U
(       a  US   n	UR	                  S5      nUSL a  SnU R
                  U	S.nU(       a!  U R                  USS9  UR                  U5        US	   (       d  US		 U(       aG  SUS'   UR	                  S
/ 5      n[        U[        5      (       d  [        S5      eSU;  a	  / UQSPUS
'   O	SU;   a  US	 [        R                  " USXWS9R                  5       nUR                  [        U5      5        U(       a  UnO[        U5      nUR                  U5        SR                  U5      nU R!                  U	5      n[        U[        5      (       a  UR"                  nUR%                  U5      nUR'                  U5      nU(       aF  U R(                  R	                  SS5      (       a  [+        U5      e[,        R.                  " U[0        SS9  UR3                  UU5      nUR                  [        U5      5        U(       a  SUS'   SR                  U5      nUR5                  S5      $ )NHS256nonealgb64FT)typrL   encodingrN   critz%Invalid 'crit' header: must be a list),:)
separatorscls	sort_keys   .r.      
stacklevelr+   r   utf-8)_ALGORITHM_UNSETr3   r   algorithm_nameget
header_typ_validate_headersupdater!   r   jsondumpsencodeappendr   joinrG   r'   prepare_keycheck_key_lengthr$   r   warningswarnr   signdecode)r%   payloadr'   	algorithmheadersjson_encoderis_payload_detachedsort_headerssegments
algorithm_headers_algheaders_b64headerexisting_critjson_headermsg_payloadsigning_inputr7   key_length_msg	signatureencoded_strings                        r(   rd   PyJWS.encodex   sc    !# ((#u%% //
$
#u%% //
#
"J !++e,K$U^
!++e,Ke#&*# *.!L""7T":MM'"e}u!F5M
 #JJvr2MmT22'(OPPM)!8=!8%!8vf_ujjz|

&( 	 	(56!K*73K$ 		(+,,Z8c5!!''C!!#& 11#6|| <eDD%n55n.FSTULL4	(34 HQK8,$$W--r+   c           	        U(       a4  [         R                  " S[        UR                  5       5       3[        SS9  Uc  U R
                  nO0 U R
                  EUEnUS   nU(       a'  U(       d   [        U[        5      (       d  [        S5      eU R                  U5      u  ppU R                  U5        UR                  SS5      SL av  UR                  S	5      =(       d    / n[        U[        5      (       a  SU;  a  [        S
5      eUc  [        S5      eUn	SR                  U
R                  SS5      S   U	/5      n
U(       a  U R!                  U
UUUUUS9  U	UUS.$ )Nzypassing additional kwargs to decode_complete() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rX   rY   r-   z\It is required that you pass in a value for the "algorithms" argument when calling decode().rM   TFrQ   zAThe 'b64' header parameter requires 'b64' to be listed in 'crit'.zIt is required that you pass in a value for the "detached_payload" argument to decode a message having the b64 header set to false.rW   r   r   )r$   )rm   rw   r}   )ri   rj   tupler"   r   r$   r3   r   r   _loadr`   r^   r!   r   rf   rsplit_verify_signature)r%   jwtr'   r&   r$   detached_payloadkwargsmerged_optionsr-   rm   r{   rw   r}   rQ   s                 r(   decode_completePyJWS.decode_complete   sx    MM'',V[[]';&<> ' ?!\\N888N)*<=Jz#u7M7Mn  59JJsO1v&::eT"e+ ::f%+DdD))U$->'W   '! Z  'G II}';';D!'DQ'G&QRM""& #  "
 	
r+   c                    U(       a4  [         R                  " S[        UR                  5       5       3[        SS9  U R                  XX4US9nUS   $ )Nzppassing additional kwargs to decode() is deprecated and will be removed in pyjwt version 3. Unsupported kwargs: rX   rY   )r   rm   )ri   rj   r   r"   r   r   )r%   r   r'   r&   r$   r   r   decodeds           r(   rl   PyJWS.decode  sb     MM'',V[[]';&<> ' &&j<L ' 
 y!!r+   c                P    U R                  U5      S   nU R                  U5        U$ )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
rX   )r   r`   )r%   r   ro   s      r(   get_unverified_headerPyJWS.get_unverified_header3  s)     **S/!$w'r+   c                   [        U[        5      (       a  UR                  S5      n[        U[        5      (       d  [	        S[         35      e UR                  SS5      u  p#UR                  SS5      u  pE [        U5      n [        R                  " U5      n[        U[        5      (       d  [	        S5      eUR                  S	S
5      SL a  U(       a  [	        S5      eSn
O [        U5      n
 [        U5      nXX4$ ! [         a  n[	        S5      UeS nAff = f! [        [        R                  4 a  n[	        S5      UeS nAff = f! [         a  n	[	        SU	 35      U	eS n	A	ff = f! [        [        R                  4 a  n[	        S5      UeS nAff = f! [        [        R                  4 a  n[	        S5      UeS nAff = f)Nr[   z$Invalid token type. Token must be a rW   r   zNot enough segmentszInvalid header paddingzInvalid header string: z,Invalid header string: must be a json objectrM   TFz2Payload segment must be empty when 'b64' is false.r+   zInvalid payload paddingzInvalid crypto padding)r3   strrd   bytesr   r   splitr2   r   r4   binasciiErrorrb   loadsdictr^   )r%   r   r{   crypto_segmentheader_segmentpayload_segmenterrheader_datarw   rF   rm   r}   s               r(   r   PyJWS._load>  s   c3**W%C#u%% DUGLMM	>,/JJtQ,?)M.;.A.A$.J+N	A*>:K	D%)ZZ%<F &$''LMM::eT"e+ !"VWWGF*?;	A(8I ::M  	>34#=	>
 8>>* 	A67S@	A
  	D 7s;<!C	D( x~~. F!";<#EF
 8>>* 	A67S@	Asx   (D  8D E %E- 1F  
D
DDE	8EE	
E*E%%E*-FFFG5GGc                   Ub  UOU R                   nUc"  [        U[        5      (       a  UR                  /n US   nU(       a  Ub  X;  a  [        S5      e[        U[        5      (       aE  XR                  :w  a  [        SU< SUR                  < 35      eUR                  n	UR                  n
O# U R                  U5      n	U	R                  U5      n
U	R                  U
5      nU(       a<  UR                  SS5      (       a  [        U5      e[        R                  " U[         S	S
9  U	R#                  XU5      (       d  [%        S5      eg ! [         a    [        S5      S ef = f! [         a  n[        S5      UeS nAff = f)NrL   zAlgorithm not specifiedz&The specified alg value is not allowedzToken algorithm z$ does not match the key's algorithm rC   r.   F   rY   zSignature verification failed)r$   r3   r   r]   r;   r   r   r'   rG   rD   rg   rh   r^   r   ri   rj   r   verifyr   )r%   r{   rw   r}   r'   r&   r$   effective_optionsrL   r7   prepared_keyrF   r|   s                r(   r   PyJWS._verify_signaturep  s    (/':G*S%"8"8,,-J	M-C z-#2G'(PQQc5!! (((+&sg .!!$!3!3 68  mmG77LN44S9 #..s3L 11,? $$%A5II%n55n.FSTU~~m9EE'(GHH FC  	M'(ABL	M, ' N+,EFAMNs#   E 2E% E"%
F /E;;F rM   zset[str]_supported_critrO   c               x    SU;   a  U R                  US   5        U(       d  SU;   a  U R                  U5        g g g )NkidrQ   )_validate_kid_validate_crit)r%   ro   rP   s      r(   r`   PyJWS._validate_headers  s=     Gwu~.Fg-( .xr+   c                D    [        U[        5      (       d  [        S5      eg )Nz(Key ID header parameter must be a string)r3   r   r   )r%   r   s     r(   r   PyJWS._validate_kid  s     #s###$NOO $r+   c                    US   n[        U[        5      (       a  [        U5      S:X  a  [        S5      eU HT  n[        U[        5      (       d  [        S5      eX0R
                  ;  a  [        SU 35      eX1;  d  MG  [        SU S35      e   g )NrQ   r   z/Invalid 'crit' header: must be a non-empty listz-Invalid 'crit' header: values must be stringsz Unsupported critical extension: zCritical extension 'z' is missing from headers)r3   r!   lenr   r   r   )r%   ro   rQ   exts       r(   r   PyJWS._validate_crit  s    v$%%Ta#$UVVCc3'''(WXX...'*J3%(PQQ!'*3%/HI  r+   )r   r    r$   )NN)r&   Sequence[str] | Noner$   SigOptions | NonereturnNone)r   r   )r6   r   r7   r   r   r   )r6   r   r   r   )r   z	list[str])rE   r   r   r   )rm   r   r'   z(AllowedPrivateKeys | PyJWK | str | bytesrn   z
str | Nonero   zdict[str, Any] | Nonerp   ztype[json.JSONEncoder] | Nonerq   boolrr   r   r   r   ) NNN)r   str | bytesr'   'AllowedPublicKeys | PyJWK | str | bytesr&   r   r$   r   r   bytes | Noner   dict[str, Any]r   r   )r   r   r'   r   r&   r   r$   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   z*tuple[bytes, bytes, dict[str, Any], bytes])r   NN)r{   r   rw   r   r}   r   r'   r   r&   r   r$   r   r   r   )ro   r   rP   r   r   r   )r   r   r   r   )ro   r   r   r   )__name__
__module____qualname____firstlineno__r_   r)   staticmethodr#   r8   r=   r@   rG   r\   rd   r   rl   r   r   r   r   __annotations__r`   r   r   __static_attributes__r/   r+   r(   r   r   !   s$   J ,0%)7(7 #7 
	7& O O%"(&H2 !1)-6:$)!a.a. 6a. 	a.
 'a. 4a. "a. a. 
a.L 8:+/%))-@
@
 5@
 )	@

 #@
 '@
 !@
 
@
J 8:+/%))-"" 5" )	"
 #" '" !" 
",	0;n 8:+/%)1I1I 1I 	1I
 51I )1I #1I 
1Ih "'OX' <A)%)48)	)Pr+   r   )+
__future__r   r   rb   ri   collections.abcr   typingr   r   r&   r   r	   r
   r   api_jwkr   
exceptionsr   r   r   r   r   utilsr   r   r   r   r   r   typesr   objectr\   r   _jws_global_objrd   r   rl   r8   r=   rG   r   r/   r+   r(   <module>r      s    "    $ %    6 FA!8 ] ]@ '			!11			$77 &;; '== '== r+   