o
    h4                     @   s|  d dl Z d dlZd dlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ zDd dlmZ d dlmZ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" d d
l#m$Z$m%Z% d dl&m'Z' d dl(m)Z) dZ*W n e+y}   dZ*Y nw e,g dZ-dd Z.G dd de/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Z5dS dS )    N   )constant_time_comparestring_typesInvalidKeyError)base64url_decodebase64url_encodeder_to_raw_signatureforce_bytesforce_unicodefrom_base64url_uintraw_to_der_signatureto_base64url_uint)hashes)load_pem_private_keyload_pem_public_keyload_ssh_public_key)RSAPrivateKeyRSAPublicKeyRSAPrivateNumbersRSAPublicNumbersrsa_recover_prime_factorsrsa_crt_dmp1rsa_crt_dmq1rsa_crt_iqmp)EllipticCurvePrivateKeyEllipticCurvePublicKey)ecpadding)default_backend)InvalidSignatureTF
ZRS256ZRS384ZRS512ZES256ZES384ZES521ZES512ZPS256ZPS384ZPS512c                  C   s   t  ttjttjttjd} trA| 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d
 | S )zE
    Returns the algorithms that are implemented by the library.
    )noneZHS256ZHS384ZHS512r!   )
NoneAlgorithmHMACAlgorithmSHA256SHA384SHA512
has_cryptoupdateRSAAlgorithmECAlgorithmRSAPSSAlgorithm)Zdefault_algorithms r-   V/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/jwt/algorithms.pyget_default_algorithms&   s&   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      t )z
        Performs necessary validation and conversions on the key and returns
        the key value in the proper format for sign() and verify().
        NotImplementedErrorselfkeyr-   r-   r.   prepare_keyF      zAlgorithm.prepare_keyc                 C   r1   )zn
        Returns a digital signature for the specified message
        using the specified key value.
        r2   r5   msgr6   r-   r-   r.   signM   r8   zAlgorithm.signc                 C   r1   )zz
        Verifies that the specified digital signature is valid
        for the specified message and key values.
        r2   r5   r:   r6   sigr-   r-   r.   verifyT   r8   zAlgorithm.verifyc                 C   r1   )z7
        Serializes a given RSA key into a JWK
        r2   key_objr-   r-   r.   to_jwk[   r8   zAlgorithm.to_jwkc                 C   r1   )zb
        Deserializes a given RSA key from JWK back into a PublicKey or PrivateKey object
        r2   )jwkr-   r-   r.   from_jwkb   r8   zAlgorithm.from_jwkN)
__name__
__module____qualname____doc__r7   r;   r>   staticmethodrA   rC   r-   r-   r-   r.   r0   B   s    
r0   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 urt d|S )N z*When alg = "none", key value must be None.r   r4   r-   r-   r.   r7   o   s
   zNoneAlgorithm.prepare_keyc                 C      dS )N    r-   r9   r-   r-   r.   r;   x      zNoneAlgorithm.signc                 C   rJ   )NFr-   r<   r-   r-   r.   r>   {   rL   zNoneAlgorithm.verifyN)rD   rE   rF   rG   r7   r;   r>   r-   r-   r-   r.   r#   j   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 )r$   zf
    Performs signing and verification operations using HMAC
    and the specified hash function.
    c                 C   
   || _ d S Nhash_algr5   rP   r-   r-   r.   __init__      
zHMACAlgorithm.__init__c                    s2   t   g d}t fdd|D rtd S )N)s   -----BEGIN PUBLIC KEY-----s   -----BEGIN CERTIFICATE-----s   -----BEGIN RSA PUBLIC KEY-----   ssh-rsac                       g | ]}| v qS r-   r-   ).0Zstring_valuer6   r-   r.   
<listcomp>       z-HMACAlgorithm.prepare_key.<locals>.<listcomp>zdThe specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.)r
   anyr   )r5   r6   Zinvalid_stringsr-   rW   r.   r7      s   zHMACAlgorithm.prepare_keyc                 C   s   t ttt| ddS )Noct)kkty)jsondumpsr   r   r
   r?   r-   r-   r.   rA      s   zHMACAlgorithm.to_jwkc                 C   s,   t | }|ddkrtdt|d S )Nr]   r[   zNot an HMAC keyr\   )r^   loadsgetr   r   )rB   objr-   r-   r.   rC      s   
zHMACAlgorithm.from_jwkc                 C   s   t ||| j S rN   )hmacnewrP   digestr9   r-   r-   r.   r;      s   zHMACAlgorithm.signc                 C   s   t || ||S rN   )r   r;   r<   r-   r-   r.   r>      s   zHMACAlgorithm.verifyN)rD   rE   rF   rG   hashlibsha256r%   sha384r&   sha512r'   rR   r7   rH   rA   rC   r;   r>   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 )r*   z~
        Performs signing and verification operations using
        RSASSA-PKCS-v1_5 and the specified hash function.
        c                 C   rM   rN   rO   rQ   r-   r-   r.   rR      rS   zRSAAlgorithm.__init__c                 C   s   t |ts
t |tr|S t |trBt|}z|dr#t|t d}nt|d t d}W |S W |S  t	yA   t
|t d}Y |S w td)NrT   backendpasswordrk   Expecting a PEM-formatted key.)
isinstancer   r   r   r
   
startswithr   r   r   
ValueErrorr   	TypeErrorr4   r-   r-   r.   r7      s$   


zRSAAlgorithm.prepare_keyc                 C   s   d }t | dd rE|  }ddgtt|jjtt|jjtt|jtt|jtt|j	tt|j
tt|jtt|jd
}n!t | dd rb|  }ddgtt|jtt|jd}ntdt|S )Nprivate_numbersRSAr;   )
r]   key_opsnedpqdpdqqir>   )r]   ru   rv   rw   Not a public or private key)getattrrs   r   r   public_numbersrv   rw   rx   ry   rz   dmp1dmq1iqmpr   r^   r_   )r@   rb   numbersr-   r-   r.   rA      s.   
zRSAAlgorithm.to_jwkc           	   	      s  zt |  W n ty   tdw  ddkrtdd v rd v rd v rd v r2td	g d
} fdd|D }t|}|rMt|sMtdtt d t d }|rt	t d t d t d t d t d t d |d}n$t d }t
|j||j\}}t	|||t||t||t|||d}|t S d v rd v rtt d t d }|t S td)NzKey is not valid JSONr]   rt   zNot an RSA keyrx   rw   rv   Zothz5Unsupported RSA private key: > 2 primes not supported)ry   rz   r{   r|   r}   c                    rU   r-   r-   )rV   proprb   r-   r.   rX   	  rY   z)RSAAlgorithm.from_jwk.<locals>.<listcomp>z@RSA key must include all parameters if any are present besides dry   rz   r{   r|   r}   )rx   ry   rz   r   r   r   r   r~   )r^   r`   rq   r   ra   rZ   allr   r   r   r   rv   rw   r   r   r   Zprivate_keyr   Z
public_key)	rB   Zother_propsZprops_foundZany_props_foundr   r   rx   ry   rz   r-   r   r.   rC      s`   








zRSAAlgorithm.from_jwkc                 C   s   | |t |  S rN   )r;   r   PKCS1v15rP   r9   r-   r-   r.   r;   8  s   zRSAAlgorithm.signc                 C   s4   z| ||t |   W dS  ty   Y dS w )NTF)r>   r   r   rP   r    r<   r-   r-   r.   r>   ;  s   zRSAAlgorithm.verifyN)rD   rE   rF   rG   r   r%   r&   r'   rR   r7   rH   rA   rC   r;   r>   r-   r-   r-   r.   r*      s    
#
>r*   c                   @   sB   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d
S )r+   zr
        Performs signing and verification operations using
        ECDSA and the specified hash function
        c                 C   rM   rN   rO   rQ   r-   r-   r.   rR   K  rS   zECAlgorithm.__init__c                 C   s   t |ts
t |tr|S t |trBt|}z|dr#t|t d}n
t|t d}W |S W |S  t	yA   t
|d t d}Y |S w td)Ns   ecdsa-sha2-rj   rl   rn   )ro   r   r   r   r
   rp   r   r   r   rq   r   rr   r4   r-   r-   r.   r7   N  s$   


	zECAlgorithm.prepare_keyc                 C   s"   | |t|  }t||jS rN   )r;   r   ECDSArP   r	   curve)r5   r:   r6   der_sigr-   r-   r.   r;   f  s   zECAlgorithm.signc                 C   sZ   zt ||j}W n
 ty   Y dS w z|||t|   W dS  ty,   Y dS w )NFT)r   r   rq   r>   r   r   rP   r    )r5   r:   r6   r=   r   r-   r-   r.   r>   k  s   zECAlgorithm.verifyN)rD   rE   rF   rG   r   r%   r&   r'   rR   r7   r;   r>   r-   r-   r-   r.   r+   B  s    r+   c                   @   s    e Zd ZdZdd Zdd ZdS )r,   zA
        Performs a signature using RSASSA-PSS with MGF1
        c                 C   s*   | |tjt|  | jjd|  S )NZmgfZsalt_length)r;   r   PSSMGF1rP   digest_sizer9   r-   r-   r.   r;   |  s   zRSAPSSAlgorithm.signc              	   C   sH   z| ||tjt|  | jjd|   W dS  ty#   Y dS w )Nr   TF)r>   r   r   r   rP   r   r    r<   r-   r-   r.   r>     s   	zRSAPSSAlgorithm.verifyN)rD   rE   rF   rG   r;   r>   r-   r-   r-   r.   r,   w  s    
r,   )6rf   rc   r^   compatr   r   
exceptionsr   utilsr   r   r	   r
   r   r   r   r   Zcryptography.hazmat.primitivesr   Z,cryptography.hazmat.primitives.serializationr   r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   r   r   r   Z,cryptography.hazmat.primitives.asymmetric.ecr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   Zcryptography.hazmat.backendsr   Zcryptography.exceptionsr    r(   ImportErrorsetZrequires_cryptographyr/   objectr0   r#   r$   r*   r+   r,   r-   r-   r-   r.   <module>   s<    (((4 5 