
    e6                        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jB                  ejD                  
      Z#e#jH                   G d de#             Z%e#jH                   G d de#             Z&e#jH                   G d de#             Z'y)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j0                  f   defdZej8                  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 y)JWKr   ktyTYPES .cryptography_key_typesrequiredN),:T)indent
separators	sort_keys_thumbprint_json_dumps_paramskeyhash_functionreturnc           
      n   t        j                   |       t                     }|j                  t	        j
                  | j                         j                         D ci c]  \  }}|| j                  v s|| c}}fi | j                  j                                |j                         S c c}}w )zgCompute JWK Thumbprint.

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

        :returns: bytes

        )backend)r   Hashr   updatejsondumpsto_jsonitemsr   r!   encodefinalize)selfr#   digestkvs        ,/usr/lib/python3/dist-packages/josepy/jwk.py
thumbprintzJWK.thumbprint3   s     ]_o6GHJJ"&,,."6"6"8O$!QA<NAO44 fh		
   	 Ps    B17B1c                     t               )ziGenerate JWK with public key.

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

        )NotImplementedErrorr/   s    r3   
public_keyzJWK.public_keyF   s     "##    datapasswordr&   c                 .   |
t               n|}i }t        j                  t        j                  fD ]  }	  ||||      c S  t        j                  t        j                  fD ]  }	  |||      c S  t        j                  dj                  |            # t        t
        t        j                  j                  f$ r}||t        |      <   Y d }~d }~ww xY w# t        t        j                  j                  f$ r}||t        |      <   Y d }~d }~ww xY w)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&   rB   loader_privateerrorloader_publics           r3   _load_cryptography_keyzJWK._load_cryptography_keyO   s    (//#G

 ....
 	8N8%dHg>>	8 ,??AbAbc 	7M7$T733	7 ll;BB:NOO 	<+B+B+W+WX 827
3~./8  7 7 L LM 716
3}-.7s/   	B&C(C>CC#D<DDc                 L   	 | j                  |||      }| j                  t        urOt        || j                        s9t        j                  dj                  |j                  | j                              | j                  j                         D ]#  }t        ||j                        s ||      c S  t        j                  dj                  |j                              # t        j                  $ r,}t        j	                  d|       t        |      cY d}~S d}~ww xY w)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})rM   r   rG   loggerdebugJWKOcttypNotImplemented
isinstancer   rH   	__class__r   values)rI   r:   r;   r&   r"   rK   jwk_clss          r3   loadzJWK.loadl   s    $	$,,T8WEC
 77.(CA[A[1\,,4;;CMM3==Y  yy'') 	(G#w==>3''	( ll7>>s}}MNN || 	$LLGOd##	$s   C$ $D#7!DD#D#)r$   r   )NN)!__name__
__module____qualname____doc__type_field_namer   r   rD   r   __annotations__r   r
   r   rT   r   r	   r!   r   r   intboolr   SHA256r   HashAlgorithmbytesr4   abcabstractmethodr8   classmethodrM   rY   r   r9   r3   r   r      se   O$&E4T%[ !&46E$s)S.16%,Hhsm,P
   [!4U8C=(3-QU3U-V(V#W  
H CI--!%b&*>*>&>?!	!& 	$ $ UYPP$,UOPEMc]P	P P8 UYOO$,UOOEMc]O	O Or9   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y)rR   zSymmetric JWK.octrO   r1   r"   r$   c                 D    dt        j                  | j                        iS )Nr1   )r   encode_b64joser"   r7   s    r3   fields_to_partial_jsonzJWKOct.fields_to_partial_json   s    
 Y--dhh788r9   jobjc                 @     | t        j                  |d               S )Nr1   rO   )r   decode_b64jose)rI   rn   s     r3   fields_from_jsonzJWKOct.fields_from_json   s    y//S	:;;r9   c                     | S Nr   r7   s    r3   r8   zJWKOct.public_key   s    r9   N)r$   rR   )rZ   r[   r\   r]   rS   	__slots__r   r^   r   rd   r_   r   rD   rm   rg   r   r   rq   r8   r   r9   r3   rR   rR      sh    
CIS(()H	J9S#X 9 <GCH$5 <( < <r9   rR   c                   0    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`

    RSArO   enr"   argskwargsr$   Nc                     d|v r8t        |d   t        j                        st        j                  |d         |d<   t        |   |i | y Nr"   )rU   r   ComparableRSAKeysuper__init__r/   rz   r{   rV   s      r3   r   zJWKRSA.__init__   sG    F?:fUmT=R=R#S 11&-@F5M$)&)r9   r:   c                     t        |j                         d      }t        j                  |dz        }t	        j
                  |j                  d|            S )zOEncode Base64urlUInt.
        :type data: long
        :rtype: unicode
           big	byteorderlength)max
bit_lengthmathceilr   rl   to_bytesrI   r:   r   s      r3   _encode_paramzJWKRSA._encode_param   sG     T__&*6A:&''f(UVVr9   c                     	 t        j                  |      }|st        j                         t        j                  |d      S # t        $ r t        j                         w xY w)Decode Base64urlUInt.r   r   )r   rp   r   DeserializationErrorr`   
from_bytesr?   )rI   r:   binarys      r3   _decode_paramzJWKRSA._decode_param   sZ    	0--d3F1133>>&E>:: 	0--//	0s   AA A"c                 V     t        |       | j                  j                               S )NrO   )typer"   r8   r7   s    r3   r8   zJWKRSA.public_key   s     tDzdhh11344r9   rn   c           	           fddD        \  }}t        j                  ||      }dvr   |j                  t                           S  j	                  d         }dv sdv sdv sd	v sd
v sdv rmt        fddD              x\  }}}}	}
}t        d |D              r$t        j                  dj                  |            t         fd|D              \  }}}}	}
n\t        j                  |||      \  }}t        j                  ||      }t        j                  ||      }	t        j                  ||      }
t        j                  |||||	|
|      j                  t                     }  |      S )Nc              3   F   K   | ]  }j                  |           y wrs   r   ).0xrI   rn   s     r3   	<genexpr>z*JWKRSA.fields_from_json.<locals>.<genexpr>   s      ?q!!$q'*?s   !ry   rx   )rx   ry   drO   pqdpdqqiothc              3   @   K   | ]  }j                  |        y wrs   )get)r   r   rn   s     r3   r   z*JWKRSA.fields_from_json.<locals>.<genexpr>   s     "U1488A;"Us   )r   r   r   r   r   c              3   &   K   | ]	  }||  y wrs   r   )r   params     r3   r   z*JWKRSA.fields_from_json.<locals>.<genexpr>   s     DuemUDs   z(Some private parameters are missing: {0}c              3   R   K   | ]  }j                  t        |               y wrs   )r   rD   )r   r   rI   s     r3   r   z*JWKRSA.fields_from_json.<locals>.<genexpr>   s      $S1S%6%6s1v%>$Ss   $')r   RSAPublicNumbersr8   r   r   tupler   rG   rH   rsa_recover_prime_factorsrsa_crt_dmp1rsa_crt_dmq1rsa_crt_iqmpRSAPrivateNumbersprivate_key)rI   rn   ry   rx   public_numbersr   r   r   r   r   r   
all_paramsr"   s   ``           r3   rq   zJWKRSA.fields_from_json   s   ?J?1--Q7 d?>44_5FGHH d3i(4Kd{t|t|t|} #"U8T"UUV D
DDll#M#T#TU_#`aa$$S
$SSAq"b"
 00Aq9DAq!!!Q'B!!!Q'B!!!Q'B##Aq!RRHTT
 s|r9   c           	      r   t        | j                  j                  t        j                        r4| j                  j                         }|j                  |j                  d}n| j                  j                         }| j                  j                         j                         }|j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  d}|j!                         D ci c]  \  }}|| j#                  |       c}}S c c}}w )Nr   )ry   rx   r   r   r   r   r   r   )rU   r"   _wrappedr   RSAPublicKeyr   ry   rx   private_numbersr8   r   r   r   dmp1dmq1iqmpr,   r   )r/   numbersparamsprivatepublicr"   values          r3   rm   zJWKRSA.fields_to_partial_json  s    dhh'')9)9:hh--/GYYYYF
 hh..0GXX((*99;FXXXXYYYYYYllllll	F BHP:3T''..PPPs   D3)r$   rv   )rZ   r[   r\   r]   rS   r   r   RSAPrivateKeyr   rt   r   r^   r   josepyr   r~   r_   r   r   rg   r`   rD   r   r   r8   r   rq   r   rm   __classcell__rV   s   @r3   rv   rv      s     C!..0A0ABIS((#.H		%	%%*c *S *T *
 W W W W 0 0 0 05 .GCH$5 .( . .`QS#X Qr9   rv   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j2                  fd       Zedej2                  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`

    ECrO   crvr   yr"   rz   r{   r$   Nc                     d|v r8t        |d   t        j                        st        j                  |d         |d<   t        |   |i | y r}   )rU   r   ComparableECKeyr   r   r   s      r3   r   zJWKEC.__init__+  sG    F?:fUmT=Q=Q#R 00?F5M$)&)r9   r:   r   c                 N    t        j                  |j                  d|            S )zlEncode Base64urlUInt.
        :type data: long
        :type key_size: long
        :rtype: unicode
        r   r   )r   rl   r   r   s      r3   r   zJWKEC._encode_param0  s"     ''f(UVVr9   namevalid_lengthc           
      
   	 t        j                  |      }t        |      |k7  r(t        j                  d| d| dt        |       d      t
        j                  |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   rp   lenr   r   r`   r   r?   )rI   r:   r   r   r   s        r3   r   zJWKEC._decode_param9  s    		0--d3F6{l*11*4& G225f+nN  >>&E>:: 	0--//	0s   A!A$ $B
curve_namec                 N    |dk(  ry|dk(  ry|dk(  ryt        j                         )N	secp256r1P-256	secp384r1P-384	secp521r1P-521)r   SerializationError)rI   r   s     r3   _curve_name_to_crvzJWKEC._curve_name_to_crvG  s2    $$$''))r9   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   )rI   r   s     r3   _crv_to_curvezJWKEC._crv_to_curveQ  sL     '><<>!'><<>!'><<>!))++r9   curvec                     t        |t        j                        ryt        |t        j                        ryt        |t        j                        ryt        d|       )N    0   B   zUnexpected curve: )rU   r   r   r   r   r?   )rI   r   s     r3   expected_length_for_curvezJWKEC.expected_length_for_curve\  sH    eR\\*r||,r||,-eW566r9   c                    i }t        | j                  j                  t        j                        r| j                  j                         }nt        | j                  j                  t        j                        rR| j                  j                         }| j                  j                         j                         }|j                  |d<   nt        j                  d      |j                  |d<   |j                  |d<   |j                         D ci c]1  \  }}|| j                  || j!                  |j"                              3 }}}| j%                  |j"                  j&                        |d<   |S c c}}w )Nr   zRSupplied key is neither of type EllipticCurvePublicKey nor EllipticCurvePrivateKeyr   r   r   )rU   r"   r   r   EllipticCurvePublicKeyr   EllipticCurvePrivateKeyr   r8   private_valuer   r   r   r   r,   r   r   r   r   r   )r/   r   r   r   r"   r   s         r3   rm   zJWKEC.fields_to_partial_jsonf  s1   dhh'')B)BCXX,,.F))2+E+EFhh..0GXX((*99;F!//F3K++.  hhshhs %lln
U ##E4+I+I&,,+WXX
 
 //0A0ABu
s   6E5rn   c                      j                  d         } j                  |       fddD        \  }}t        j                  |||      }dvr   |j	                  t                           S  j                  d   d      }t        j                  ||      j                  t                     }  |      S )Nr   c              3   J   K   | ]  }j                  |   |        y wrs   r   )r   ry   rI   expected_lengthrn   s     r3   r   z)JWKEC.fields_from_json.<locals>.<genexpr>  s$     S1!!$q'1o>Ss    #)r   r   )r   r   r   r   rO   )	r   r   r   EllipticCurvePublicNumbersr8   r   r   EllipticCurvePrivateNumbersr   )	rI   rn   r   r   r   r   r   r"   r   s	   ``      @r3   rq   zJWKEC.fields_from_json|  s    !!$u+.77>S
S166auM d?>44_5FGHH d3io>,,Q?KKOL]^s|r9   c                     t        | j                  d      r| j                  j                         }n1| j                  j                         j                  t	                     } t        |       |      S )Nr8   rO   )hasattrr"   r8   r   r   r   )r/   r"   s     r3   r8   zJWKEC.public_key  sS    488\*((%%'C(())+667HICtDzc""r9   )r$   r   )"rZ   r[   r\   r]   rS   rt   r   r   r   r   r   r^   r   r   r   r   r_   r   r   rg   r`   rD   r   r   r   EllipticCurver   r   r   rm   r   rq   r8   r   r   s   @r3   r   r     s}    CI 779S9STs**C5H		$	$$*c *S *T *
 W Wc Wc W W 0 0C 0s 0s 0 0 *C *C * * , ,(8(8 , , 7b.>.> 73 7 7S#X , GCH$5 '  #r9   r   )(r]   re   r)   loggingr   typingr   r   r   r   r   r	   r
   r   r   cryptography.exceptionsrA   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   josepy.utilr   r   r   r   	getLoggerrZ   rP   TypedJSONObjectWithFieldsABCMetar   registerrR   rv   r   r   r9   r3   <module>r      s     
   
 
 
  8 @ =  * *			8	$nO)
-
- nOb S  . qQS qQ qQh v#C v# v#r9   