
    U-f6                        d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
mZmZmZmZ ddlZddlmZ ddlmZmZ ddlmZmZ ddlZddlmZmZmZ  ej        e          Z  G d d	ej!        ej"        
          Z#e#j$         G d de#                      Z%e#j$         G d de#                      Z&e#j$         G d de#                      Z'dS )JSON Web Key.    N)	AnyCallableDictMappingOptionalSequenceTupleTypeUnion)default_backend)hashesserialization)ecrsa)errors	json_utilutilc            
          e Zd ZU dZdZi Zeeed          f         e	d<   dZ
eee         df         e	d<   	 eZee         e	d<   	 dd	d
dZeeeee         ee         ef         f         e	d<   ee	d<   ej        fdeg ej        f         defdZej        dd            Ze	 ddedee         dee         defd            Ze	 ddedee         dee         dd fd            Z dS )JWKr   ktyTYPES .cryptography_key_typesrequiredN),:T)indent
separators	sort_keys_thumbprint_json_dumps_paramskeyhash_functionreturnc                 X    t          j         |            t                                }|                    t	          j         fd                                                                 D             fi  j        	                                           |
                                S )zgCompute JWK Thumbprint.

        https://tools.ietf.org/html/rfc7638

        :returns: bytes

        )backendc                 .    i | ]\  }}|j         v ||S r   )r   ).0kvselfs      Y/home/cdr/domains/dharristours.com/map/certbot/lib/python3.11/site-packages/josepy/jwk.py
<dictcomp>z"JWK.thumbprint.<locals>.<dictcomp>@   s+    OOO$!QA<N<NA<N<N<N    )r   Hashr   updatejsondumpsto_jsonitemsr!   encodefinalize)r+   r#   digests   `  r,   
thumbprintzJWK.thumbprint3   s     ]]__o6G6GHHHJOOOO$,,.."6"6"8"8OOO 4  fhh		
 	
 	
    r.   c                     t                      )ziGenerate JWK with public key.

        For symmetric cryptosystems, this would return ``self``.

        )NotImplementedErrorr+   s    r,   
public_keyzJWK.public_keyF   s     "###r.   datapasswordr&   c                    |t                      n|}i }t          j        t          j        fD ]Q}	  ||||          c S # t          t
          t          j        j        f$ r}||t          |          <   Y d }~Jd }~ww xY wt          j
        t          j        fD ]J}	  |||          c S # t          t          j        j        f$ r}||t          |          <   Y d }~Cd }~ww xY wt          j        d                    |                    )NzUnable to deserialize key: {0})r   r   load_pem_private_keyload_der_private_key
ValueError	TypeErrorcryptography
exceptionsUnsupportedAlgorithmstrload_pem_public_keyload_der_public_keyr   Errorformat)clsr=   r>   r&   rE   loader_privateerrorloader_publics           r,   _load_cryptography_keyzJWK._load_cryptography_keyO   sM    (//###G

 ..
 	8 	8N8%~dHg>>>>>	<+B+WX 8 8 827
3~..//////8
 ,?Abc 	7 	7M7$}T733333 7 LM 7 7 716
3}--......7 l;BB:NNOOOs-   ?!A< A77A<B((CCCc                 B   	 |                      |||          }nG# t          j        $ r5}t                              d|           t          |          cY d}~S d}~ww xY w| j        t          urGt          || j	                  s2t          j        d
                    |j        | j                            | j                                        D ]%}t          ||j	                  r ||          c S &t          j        d
                    |j                            )a  Load serialized key as JWK.

        :param str data: Public or private key serialized as PEM or DER.
        :param str password: Optional password.
        :param backend: A `.PEMSerializationBackend` and
            `.DERSerializationBackend` provider.

        :raises errors.Error: if unable to deserialize, or unsupported
            JWK algorithm

        :returns: JWK of an appropriate type.
        :rtype: `JWK`

        z,Loading symmetric key, asymmetric failed: %sr"   Nz"Unable to deserialize {0} into {1}zUnsupported algorithm: {0})rP   r   rJ   loggerdebugJWKOcttypNotImplemented
isinstancer   rK   	__class__r   values)rL   r=   r>   r&   r"   rN   jwk_clss          r,   loadzJWK.loadl   s5   $	$,,T8WEECC| 	$ 	$ 	$LLGOOOd#########	$ 7.((CA[1\1\(,4;;CM3=YY   y'')) 	( 	(G#w=>> (w3''''''(l7>>s}MMNNNs    A*AAA)r$   r   )NN)!__name__
__module____qualname____doc__type_field_namer   r   rG   r   __annotations__r   r
   r   rW   r   r	   r!   r   r   intboolr   SHA256r   HashAlgorithmbytesr8   abcabstractmethodr<   classmethodrP   r\   r   r.   r,   r   r      s        O$&E4T%[ !&&&46E$s)S.1666%,Hhsm,,,P
   [ [!4U8C=(3-QU3U-V(V#W    
HHH CI-! !%b&*>&>?!	! ! ! !& 	$ $ $ $ UYP PP$,UOPEMc]P	P P P [P8 UYO OO$,UOOEMc]O	O O O [O O Or.   r   )	metaclassc                       e Zd ZU dZdZdZdej        fZe	e
d<   deeef         fdZedeeef         dd fd	            Zdd
ZdS )rU   zSymmetric JWK.octrR   r)   r"   r$   c                 8    dt          j        | j                  iS )Nr)   )r   encode_b64joser"   r;   s    r,   fields_to_partial_jsonzJWKOct.fields_to_partial_json   s    
 Y-dh7788r.   jobjc                 J     | t          j        |d                             S )Nr)   rR   )r   decode_b64jose)rL   rq   s     r,   fields_from_jsonzJWKOct.fields_from_json   s$    sy/S	::;;;;r.   c                     | S Nr   r;   s    r,   r<   zJWKOct.public_key   s    r.   N)r$   rU   )r]   r^   r_   r`   rV   	__slots__r   ra   r   rg   rb   r   rG   rp   rj   r   r   rt   r<   r   r.   r,   rU   rU      s         
CIS()H	JJJ9S#X 9 9 9 9 <GCH$5 <( < < < [<     r.   rU   c                       e Zd ZU dZdZej        ej        fZdZ	de
j        dfZej        j        ed<   deded	d
f fdZeded	efd            Zeded	efd            ZddZedeeef         d	d fd            Zd	eeef         fdZ xZS )JWKRSAzRSA JWK.

    :ivar key: :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey`
        or :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey` wrapped
        in :class:`~josepy.util.ComparableRSAKey`

    RSArR   enr"   argskwargsr$   Nc                     d|v r=t          |d         t          j                  st          j        |d                   |d<    t                      j        |i | d S Nr"   )rX   r   ComparableRSAKeysuper__init__r+   r}   r~   rY   s      r,   r   zJWKRSA.__init__   s[    F??:fUmT=R#S#S? 1&-@@F5M$)&)))))r.   r=   c                     t          |                                d          }t          j        |dz            }t	          j        |                    d|                    S )zOEncode Base64urlUInt.
        :type data: long
        :rtype: unicode
           big	byteorderlength)max
bit_lengthmathceilr   ro   to_bytesrL   r=   r   s      r,   _encode_paramzJWKRSA._encode_param   sQ     T__&&**6A:&&'f(U(UVVVr.   c                     	 t          j        |          }|st          j                    t                              |d          S # t          $ r t          j                    w xY w)Decode Base64urlUInt.r   r   )r   rs   r   DeserializationErrorrc   
from_bytesrB   )rL   r=   binarys      r,   _decode_paramzJWKRSA._decode_param   sn    	0-d33F 41333>>&E>::: 	0 	0 	0-///	0s   AA A%c                 b     t          |           | j                                                  S )NrR   )typer"   r<   r;   s    r,   r<   zJWKRSA.public_key   s)    tDzzdh11334444r.   rq   c           	      ^     fddD             \  }}t          j        ||          }dvr+  |                    t                                          S                      d                   }dv sdv sdv sd	v sd
v sdv rt          fddD                       x\  }}}}	}
}t          d |D                       r't          j        d                    |                    t           fd|D                       \  }}}}	}
nXt          j	        |||          \  }}t          j
        ||          }t          j        ||          }	t          j        ||          }
t          j        |||||	|
|                              t                                }  |          S )Nc              3   N   K   | ]}                     |                   V   d S rv   r   )r(   xrL   rq   s     r,   	<genexpr>z*JWKRSA.fields_from_json.<locals>.<genexpr>   s5      ??q!!$q'**??????r.   r|   r{   )r{   r|   drR   pqdpdqqiothc              3   B   K   | ]}                     |          V  d S rv   )get)r(   r   rq   s     r,   r   z*JWKRSA.fields_from_json.<locals>.<genexpr>   s-      "U"U1488A;;"U"U"U"U"U"Ur.   )r   r   r   r   r   c              3      K   | ]}||V  	d S rv   r   )r(   params     r,   r   z*JWKRSA.fields_from_json.<locals>.<genexpr>   s"      DDuemUmmmmDDr.   z(Some private parameters are missing: {0}c              3   \   K   | ]&}                     t          |                    V  'd S rv   )r   rG   )r(   r   rL   s     r,   r   z*JWKRSA.fields_from_json.<locals>.<genexpr>   s7      $S$S1S%6%6s1vv%>%>$S$S$S$S$S$Sr.   )r   RSAPublicNumbersr<   r   r   tupler   rJ   rK   rsa_recover_prime_factorsrsa_crt_dmp1rsa_crt_dmq1rsa_crt_iqmpRSAPrivateNumbersprivate_key)rL   rq   r|   r{   public_numbersr   r   r   r   r   r   
all_paramsr"   s   ``           r,   rt   zJWKRSA.fields_from_json   s    ?????J???1-Q777 d??3>44_5F5FGGHHHH d3i((4KKd{{t||t||t||}} #"U"U"U"U8T"U"U"UUUV DD
DDDDD bl#M#T#TU_#`#`aaa$$S$S$S$S
$S$S$SSSAq"b""
 0Aq99DAq!!Q''B!!Q''B!!Q''B#Aq!RRHHTT
 
 ss|||r.   c           	          t           j        j        t          j                  r) j                                        }|j        |j        d}nw j                                        } j        	                                                                }|j        |j        |j
        |j        |j        |j        |j        |j        d} fd|                                D             S )Nr   )r|   r{   r   r   r   r   r   r   c                 B    i | ]\  }}|                     |          S r   )r   )r(   r"   valuer+   s      r,   r-   z1JWKRSA.fields_to_partial_json.<locals>.<dictcomp>  s-    PPP:3T''..PPPr.   )rX   r"   _wrappedr   RSAPublicKeyr   r|   r{   private_numbersr<   r   r   r   dmp1dmq1iqmpr4   )r+   numbersparamsprivatepublics   `    r,   rp   zJWKRSA.fields_to_partial_json  s    dh')9:: 	h--//GYY FF
 h..00GX((**99;;FXXYYYlll	 	F QPPPPPPPr.   )r$   ry   )r]   r^   r_   r`   rV   r   r   RSAPrivateKeyr   rw   r   ra   r   josepyr   r   rb   r   r   rj   rc   rG   r   r   r<   r   rt   r   rp   __classcell__rY   s   @r,   ry   ry      su          C!.0ABIS(#.H		%%%%*c *S *T * * * * * *
 W W W W W [W 0 0 0 0 0 [05 5 5 5 .GCH$5 .( . . . [.`QS#X Q Q Q Q Q Q Q Qr.   ry   c            	           e Zd ZU dZdZdZej        ej        fZ	de
j        ddfZej        j        ed<   ded	ed
df fdZededed
efd            Zedededed
efd            Zeded
efd            Zeded
ej        fd            Zedej        d
efd            Zd
eeef         fdZedeeef         d
d fd            ZddZ  xZ!S )JWKECzEC JWK.

    :ivar key: :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePrivateKey`
        or :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicKey` wrapped
        in :class:`~josepy.util.ComparableECKey`

    ECrR   crvr   yr"   r}   r~   r$   Nc                     d|v r=t          |d         t          j                  st          j        |d                   |d<    t                      j        |i | d S r   )rX   r   ComparableECKeyr   r   r   s      r,   r   zJWKEC.__init__+  s[    F??:fUmT=Q#R#R? 0??F5M$)&)))))r.   r=   r   c                 T    t          j        |                    d|                    S )zlEncode Base64urlUInt.
        :type data: long
        :type key_size: long
        :rtype: unicode
        r   r   )r   ro   r   r   s      r,   r   zJWKEC._encode_param0  s%     'f(U(UVVVr.   namevalid_lengthc           
      "   	 t          j        |          }t          |          |k    r+t          j        d| d| dt          |           d          t
                              |d          S # t          $ r t          j                    w xY w)r   zExpected parameter "z" to be z" bytes after base64-decoding; got z bytes insteadr   r   )r   rs   lenr   r   rc   r   rB   )rL   r=   r   r   r   s        r,   r   zJWKEC._decode_param9  s    		0-d33F6{{l**1N4 N N N N25f++N N N   >>&E>::: 	0 	0 	0-///	0s   A-A0 0B
curve_namec                 X    |dk    rdS |dk    rdS |dk    rdS t          j                    )N	secp256r1P-256	secp384r1P-384	secp521r1P-521)r   SerializationError)rL   r   s     r,   _curve_name_to_crvzJWKEC._curve_name_to_crvG  sA    $$7$$7$$7')))r.   c                     |dk    rt          j                    S |dk    rt          j                    S |dk    rt          j                    S t	          j                    )Nr   r   r   )r   	SECP256R1	SECP384R1	SECP521R1r   r   )rL   r   s     r,   _crv_to_curvezJWKEC._crv_to_curveQ  sR     '>><>>!'>><>>!'>><>>!)+++r.   curvec                     t          |t          j                  rdS t          |t          j                  rdS t          |t          j                  rdS t          d|           )N    0   B   zUnexpected curve: )rX   r   r   r   r   rB   )rL   r   s     r,   expected_length_for_curvezJWKEC.expected_length_for_curve\  sd    eR\** 	2r|,, 	2r|,, 	25e55666r.   c                 F    i }t           j        j        t          j                  r j                                        nt           j        j        t          j                  rO j                                        } j                                                                        |j	        |d<   nt          j        d          j        |d<   j        |d<    fd|                                D             }                     j        j                  |d<   |S )Nr   zRSupplied key is neither of type EllipticCurvePublicKey nor EllipticCurvePrivateKeyr   r   c           	      t    i | ]4\  }}|                     |                    j                            5S r   )r   r   r   )r(   r"   r   r   r+   s      r,   r-   z0JWKEC.fields_to_partial_json.<locals>.<dictcomp>u  sO     
 
 
U ##E4+I+I&,+W+WXX
 
 
r.   r   )rX   r"   r   r   EllipticCurvePublicKeyr   EllipticCurvePrivateKeyr   r<   private_valuer   r   r   r   r4   r   r   r   )r+   r   r   r   s   `  @r,   rp   zJWKEC.fields_to_partial_jsonf  s   dh')BCC 
	X,,..FF)2+EFF 	h..00GX((**99;;F!/F3KK+.   hshs
 
 
 
 
$llnn
 
 
 //0ABBur.   rq   c                                           d                   }                     |           fddD             \  }}t          j        |||          }dvr+  |                    t                                          S                      d         d          }t          j        ||                              t                                }  |          S )Nr   c              3   R   K   | ]!}                     |         |          V  "d S rv   r   )r(   r|   rL   expected_lengthrq   s     r,   r   z)JWKEC.fields_from_json.<locals>.<genexpr>  s9      SS1!!$q'1o>>SSSSSSr.   )r   r   )r   r   r   r   rR   )	r   r   r   EllipticCurvePublicNumbersr<   r   r   EllipticCurvePrivateNumbersr   )	rL   rq   r   r   r   r   r   r"   r   s	   ``      @r,   rt   zJWKEC.fields_from_json|  s    !!$u+..77>>SSSSSS
SSS16auMMM d??3>44_5F5FGGHHHH d3io>>,Q??KKOL]L]^^ss|||r.   c                    t          | j        d          r| j                                        }n8| j                                                            t	                                } t          |           |          S )Nr<   rR   )hasattrr"   r<   r   r   r   )r+   r"   s     r,   r<   zJWKEC.public_key  sl    48\** 	J(%%''CC())++667H7HIICtDzzc""""r.   )r$   r   )"r]   r^   r_   r`   rV   rw   r   r   r   r   r   ra   r   r   r   r   rb   r   r   rj   rc   rG   r   r   r   EllipticCurver   r   r   rp   r   rt   r<   r   r   s   @r,   r   r     s          CI 79STs*C5H		$$$$*c *S *T * * * * * *
 W Wc Wc W W W [W 0 0C 0s 0s 0 0 0 [0 *C *C * * * [* , ,(8 , , , [, 7b.> 73 7 7 7 [7S#X    , GCH$5 '    [# # # # # # # #r.   r   )(r`   rh   r1   loggingr   typingr   r   r   r   r   r	   r
   r   r   cryptography.exceptionsrD   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   josepy.utilr   r   r   r   	getLoggerr]   rS   TypedJSONObjectWithFieldsABCMetar   registerrU   ry   r   r   r.   r,   <module>r     s?     



   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     8 8 8 8 8 8 @ @ @ @ @ @ @ @ = = = = = = = =     * * * * * * * * * *		8	$	$nO nO nO nO nO)
- nO nO nO nOb     S   . qQ qQ qQ qQ qQS qQ qQ qQh v# v# v# v# v#C v# v# v# v# v#r.   