
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    tJ`S                     @   s  d dl Z 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
mZmZ zd dlZd dlmZ d dl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mZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ dZ,W n e-k
r   dZ,Y nX ddddddddddddhZ.dd Z/G dd dZ0G dd de0Z1G d d! d!e0Z2e,rG d"d# d#e0Z3G d$d% d%e0Z4G d&d' d'e3Z5G d(d) d)e0Z6dS )*    N   InvalidKeyError)base64url_decodebase64url_encodeder_to_raw_signatureforce_bytesfrom_base64url_uintraw_to_der_signatureto_base64url_uint)InvalidSignature)hashes)ecpadding)EllipticCurvePrivateKeyEllipticCurvePublicKey)Ed25519PrivateKeyEd25519PublicKey)RSAPrivateKeyRSAPrivateNumbersRSAPublicKeyRSAPublicNumbersrsa_crt_dmp1rsa_crt_dmq1rsa_crt_iqmprsa_recover_prime_factors)EncodingNoEncryptionPrivateFormatPublicFormatload_pem_private_keyload_pem_public_keyload_ssh_public_keyTFRS256RS384RS512ES256ES256KES384ES521ES512PS256PS384PS512EdDSAc                  C   s   t  ttjttjttjd} tr| ttjttjttjttjttjttjttjttjt	t	jt	t	jt	t	jt
 d | S )zE
    Returns the algorithms that are implemented by the library.
    )ZnoneZHS256ZHS384ZHS512)r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   )NoneAlgorithmHMACAlgorithmSHA256SHA384SHA512
has_cryptoupdateRSAAlgorithmECAlgorithmRSAPSSAlgorithmEd25519Algorithm)Zdefault_algorithms r:   ?/opt/alt/python38/lib/python3.8/site-packages/jwt/algorithms.pyget_default_algorithmsE   s0    r<   c                   @   s@   e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	dS )	AlgorithmzH
    The interface for an algorithm used to sign and verify tokens.
    c                 C   s   t dS )z
        Performs necessary validation and conversions on the key and returns
        the key value in the proper format for sign() and verify().
        NNotImplementedErrorselfkeyr:   r:   r;   prepare_keyl   s    zAlgorithm.prepare_keyc                 C   s   t dS )zn
        Returns a digital signature for the specified message
        using the specified key value.
        Nr>   rA   msgrB   r:   r:   r;   signs   s    zAlgorithm.signc                 C   s   t dS )zz
        Verifies that the specified digital signature is valid
        for the specified message and key values.
        Nr>   rA   rE   rB   sigr:   r:   r;   verifyz   s    zAlgorithm.verifyc                 C   s   t dS )z7
        Serializes a given RSA key into a JWK
        Nr>   key_objr:   r:   r;   to_jwk   s    zAlgorithm.to_jwkc                 C   s   t dS )zb
        Deserializes a given RSA key from JWK back into a PublicKey or PrivateKey object
        Nr>   )jwkr:   r:   r;   from_jwk   s    zAlgorithm.from_jwkN)
__name__
__module____qualname____doc__rC   rF   rI   staticmethodrL   rN   r:   r:   r:   r;   r=   g   s   
r=   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r/   zZ
    Placeholder for use when no signing or verification
    operations are required.
    c                 C   s    |dkrd }|d k	rt d|S )N z*When alg = "none", key value must be None.r   r@   r:   r:   r;   rC      s
    zNoneAlgorithm.prepare_keyc                 C   s   dS )N    r:   rD   r:   r:   r;   rF      s    zNoneAlgorithm.signc                 C   s   dS )NFr:   rG   r:   r:   r;   rI      s    zNoneAlgorithm.verifyN)rO   rP   rQ   rR   rC   rF   rI   r:   r:   r:   r;   r/      s   	r/   c                   @   sZ   e Zd ZdZejZejZej	Z
dd Zdd Zedd Zedd	 Zd
d Zdd ZdS )r0   zf
    Performs signing and verification operations using HMAC
    and the specified hash function.
    c                 C   s
   || _ d S Nhash_algrA   rX   r:   r:   r;   __init__   s    zHMACAlgorithm.__init__c                    s6   t   ddddg}t fdd|D r2td S )Ns   -----BEGIN PUBLIC KEY-----s   -----BEGIN CERTIFICATE-----s   -----BEGIN RSA PUBLIC KEY-----   ssh-rsac                 3   s   | ]}| kV  qd S rV   r:   ).0Zstring_valuerB   r:   r;   	<genexpr>   s     z,HMACAlgorithm.prepare_key.<locals>.<genexpr>zdThe specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.)r   anyr   )rA   rB   Zinvalid_stringsr:   r]   r;   rC      s    zHMACAlgorithm.prepare_keyc                 C   s   t tt|  ddS )Noct)kkty)jsondumpsr   r   decoderJ   r:   r:   r;   rL      s
    zHMACAlgorithm.to_jwkc                 C   sn   z.t | trt| }nt | tr(| }ntW n tk
rJ   tdY nX |ddkrbtdt|d S )NKey is not valid JSONrb   r`   zNot an HMAC keyra   )	
isinstancestrrc   loadsdict
ValueErrorr   getr   )rM   objr:   r:   r;   rN      s    

zHMACAlgorithm.from_jwkc                 C   s   t ||| j S rV   )hmacnewrX   digestrD   r:   r:   r;   rF      s    zHMACAlgorithm.signc                 C   s   t || ||S rV   )rn   Zcompare_digestrF   rG   r:   r:   r;   rI      s    zHMACAlgorithm.verifyN)rO   rP   rQ   rR   hashlibZsha256r1   sha384r2   sha512r3   rZ   rC   rS   rL   rN   rF   rI   r:   r:   r:   r;   r0      s   

r0   c                   @   sZ   e Zd ZdZejZejZejZdd Zdd Z	e
dd Ze
dd	 Zd
d Zdd ZdS )r6   z~
        Performs signing and verification operations using
        RSASSA-PKCS-v1_5 and the specified hash function.
        c                 C   s
   || _ d S rV   rW   rY   r:   r:   r;   rZ      s    zRSAAlgorithm.__init__c                 C   s~   t |tst |tr|S t |ttfrrt|}z$|drDt|}nt|d d}W qz t	k
rn   t
|}Y qzX ntd|S )Nr[   passwordExpecting a PEM-formatted key.)rg   r   r   bytesrh   r   
startswithr"   r    rk   r!   	TypeErrorr@   r:   r:   r;   rC      s    

zRSAAlgorithm.prepare_keyc                 C   s   d }t | dd r|  }ddgt|jj t|jj t|j t|j t|j	 t|j
 t|j t|j d
}nBt | dd r|  }ddgt|j t|j d}ntdt|S )Nprivate_numbersRSArF   )
rb   key_opsnedpqdpdqqirI   )rb   r|   r}   r~   Not a public or private key)getattrrz   r   public_numbersr}   re   r~   r   r   r   dmp1dmq1iqmpr   rc   rd   )rK   rm   numbersr:   r:   r;   rL     s.    zRSAAlgorithm.to_jwkc           	   	      s  z.t | trt|  nt | tr(|  ntW n tk
rJ   tdY nX  ddkrbtdd krd krd krd krtd	d
ddddg} fdd|D }t|}|rt	|stdt
t d t d }|r4tt d t d
 t d t d t d t d |d}nHt d }t|j||j\}}t|||t||t||t|||d}| S d krd krt
t d t d }| S tdd S )Nrf   rb   r{   zNot an RSA keyr   r~   r}   Zothz5Unsupported RSA private key: > 2 primes not supportedr   r   r   r   r   c                    s   g | ]}| kqS r:   r:   )r\   Zproprm   r:   r;   
<listcomp>C  s     z)RSAAlgorithm.from_jwk.<locals>.<listcomp>z@RSA key must include all parameters if any are present besides d)r   r   r   r   r   r   r   r   )rg   rh   rc   ri   rj   rk   r   rl   r_   allr   r	   r   r   r}   r~   r   r   r   private_key
public_key)	rM   Zother_propsZprops_foundZany_props_foundr   r   r   r   r   r:   r   r;   rN   ,  sv    










  


zRSAAlgorithm.from_jwkc                 C   s   | |t |  S rV   )rF   r   PKCS1v15rX   rD   r:   r:   r;   rF   v  s    zRSAAlgorithm.signc                 C   s:   z| ||t |   W dS  tk
r4   Y dS X d S )NTF)rI   r   r   rX   r   rG   r:   r:   r;   rI   y  s
    zRSAAlgorithm.verifyN)rO   rP   rQ   rR   r   r1   r2   r3   rZ   rC   rS   rL   rN   rF   rI   r:   r:   r:   r;   r6      s   
#
Ir6   c                   @   sN   e Zd ZdZejZejZejZdd Zdd Z	dd Z
dd	 Zed
d ZdS )r7   zr
        Performs signing and verification operations using
        ECDSA and the specified hash function
        c                 C   s
   || _ d S rV   rW   rY   r:   r:   r;   rZ     s    zECAlgorithm.__init__c                 C   s~   t |tst |tr|S t |ttfrrt|}z |drDt|}nt|}W qz t	k
rn   t
|d d}Y qzX ntd|S )Ns   ecdsa-sha2-rt   rv   )rg   r   r   rw   rh   r   rx   r"   r!   rk   r    ry   r@   r:   r:   r;   rC     s     

zECAlgorithm.prepare_keyc                 C   s"   | |t|  }t||jS rV   )rF   r   ECDSArX   r   curve)rA   rE   rB   der_sigr:   r:   r;   rF     s    zECAlgorithm.signc                 C   st   zt ||j}W n tk
r&   Y dS X z0t|tr<| }|||t| 	  W dS  t
k
rn   Y dS X d S )NFT)r
   r   rk   rg   r   r   rI   r   r   rX   r   )rA   rE   rB   rH   r   r:   r:   r;   rI     s    
zECAlgorithm.verifyc                 C   s0  z.t | trt| }nt | tr(| }ntW n tk
rJ   tdY nX |ddkrbtdd|ksrd|krztdt|d}t|d}|d}|dkrt	|t	|  krd	krn n
t
 }ntd
n|dkrt	|t	|  krdkrn n
t
 }ntdn|dkr`t	|t	|  krHdkrVn n
t
 }ntdnP|dkrt	|t	|  krd	krn n
t
 }ntdntd| t
jtj|ddtj|dd|d}d|kr| S t|d}t	|t	|krtdt	||t
tj|dd| S )Nrf   rb   ZECzNot an Elliptic curve keyxycrvzP-256    z)Coords should be 32 bytes for curve P-256zP-3840   z)Coords should be 48 bytes for curve P-384zP-521B   z)Coords should be 66 bytes for curve P-521Z	secp256k1z-Coords should be 32 bytes for curve secp256k1Invalid curve: big)	byteorder)r   r   r   r   z!D should be {} bytes for curve {})rg   rh   rc   ri   rj   rk   r   rl   r   lenr   Z	SECP256R1Z	SECP384R1Z	SECP521R1Z	SECP256K1ZEllipticCurvePublicNumbersint
from_bytesr   ZEllipticCurvePrivateNumbersr   )rM   rm   r   r   r   Z	curve_objr   r   r:   r:   r;   rN     sh    


 


$


$


$

   zECAlgorithm.from_jwkN)rO   rP   rQ   rR   r   r1   r2   r3   rZ   rC   rF   rI   rS   rN   r:   r:   r:   r;   r7     s   r7   c                   @   s    e Zd ZdZdd Zdd ZdS )r8   zA
        Performs a signature using RSASSA-PSS with MGF1
        c                 C   s*   | |tjt|  | jjd|  S )NZmgfZsalt_length)rF   r   PSSMGF1rX   digest_sizerD   r:   r:   r;   rF      s    zRSAPSSAlgorithm.signc              	   C   sN   z2| ||tjt|  | jjd|   W dS  tk
rH   Y dS X d S )Nr   TF)rI   r   r   r   rX   r   r   rG   r:   r:   r;   rI   
  s    	zRSAPSSAlgorithm.verifyN)rO   rP   rQ   rR   rF   rI   r:   r:   r:   r;   r8     s   
r8   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	edd Z
dS )r9   z
        Performs signing and verification operations using Ed25519

        This class requires ``cryptography>=2.6`` to be installed.
        c                 K   s   d S rV   r:   )rA   kwargsr:   r:   r;   rZ      s    zEd25519Algorithm.__init__c                 C   s   t |ttfr|S t |ttfrzt |tr4|d}|d}d|krNt|S d|krbt|d dS |dd dkrzt	|S t
dd S )	Nutf-8z-----BEGIN PUBLICz-----BEGIN PRIVATErt   r      zssh-z)Expecting a PEM-formatted or OpenSSH key.)rg   r   r   rw   rh   encodere   r!   r    r"   ry   )rA   rB   Zstr_keyr:   r:   r;   rC   #  s    


zEd25519Algorithm.prepare_keyc                 C   s$   t |tk	rt|dn|}||S )a  
            Sign a message ``msg`` using the Ed25519 private key ``key``
            :param str|bytes msg: Message to sign
            :param Ed25519PrivateKey key: A :class:`.Ed25519PrivateKey` instance
            :return bytes signature: The signature, as bytes
            r   )typerw   rF   rD   r:   r:   r;   rF   6  s    zEd25519Algorithm.signc                 C   sx   zXt |tk	rt|dn|}t |tk	r2t|dn|}t|trH| }||| W dS  tjjk
rr   Y dS X dS )a  
            Verify a given ``msg`` against a signature ``sig`` using the Ed25519 key ``key``

            :param str|bytes sig: Ed25519 signature to check ``msg`` against
            :param str|bytes msg: Message to sign
            :param Ed25519PrivateKey|Ed25519PublicKey key: A private or public Ed25519 key instance
            :return bool verified: True if signature is valid, False if not.
            r   TFN)	r   rw   rg   r   r   rI   cryptography
exceptionsr   rG   r:   r:   r;   rI   @  s    	
zEd25519Algorithm.verifyc                 C   s   t | tr:| jtjtjd}ttt	|
 dddS t | tr| jtjtjt d}|  jtjtjd}ttt	|
 tt	|
 dddS tdd S )N)encodingformatOKPEd25519)r   rb   r   )r   r   Zencryption_algorithm)r   r   rb   r   r   )rg   r   Zpublic_bytesr   ZRawr   rc   rd   r   r   re   r   Zprivate_bytesr   r   r   r   )rB   r   r   r:   r:   r;   rL   T  s:    

	zEd25519Algorithm.to_jwkc              
   C   s   z.t | trt| }nt | tr(| }ntW n tk
rJ   tdY nX |ddkrbtd|d}|dkrtd| d|krtd	t|d}z.d
|krt	
|W S t|d
}t|W S  tk
r } ztd|W 5 d }~X Y nX d S )Nrf   rb   r   zNot an Octet Key Pairr   r   r   r   zOKP should have "x" parameterr   zInvalid key parameter)rg   rh   rc   ri   rj   rk   r   rl   r   r   Zfrom_public_bytesr   Zfrom_private_bytes)rM   rm   r   r   r   errr:   r:   r;   rN   {  s.    


zEd25519Algorithm.from_jwkN)rO   rP   rQ   rR   rZ   rC   rF   rI   rS   rL   rN   r:   r:   r:   r;   r9     s   

&r9   )7rq   rn   rc   r   r   utilsr   r   r   r   r	   r
   r   Zcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r   Z,cryptography.hazmat.primitives.asymmetric.ecr   r   Z1cryptography.hazmat.primitives.asymmetric.ed25519r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   r   r   r   Z,cryptography.hazmat.primitives.serializationr   r   r   r   r    r!   r"   r4   ModuleNotFoundErrorZrequires_cryptographyr<   r=   r/   r0   r6   r7   r8   r9   r:   r:   r:   r;   <module>   sN   $
(
$

")@ {