U
    #i*                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZm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 ejej e d	Ze d
ZdZdd ZdZ dd Z!dddZ"dd Z#G dd deZ$dS )    N)PyAsn1Error)DecryptionError)rsa_private_key_pkcs1_to_pkcs8rsa_private_key_pkcs8_to_pkcs1rsa_public_key_pkcs1_to_pkcs8)Key)
ALGORITHMS)JWEErrorJWKError)base64_to_longlong_to_base64Z,308204BD020100300D06092A864886F70D0101010500Z30z1.2.840.113549.1.1.1c                 C   s   |r|| |  } }q | S )zCalculate the Greatest Common Divisor of a and b.

    Unless b==0, the result will have the same sign as b (so that when
    b is divided by it, the result comes out positive).
     )abr   r   a/var/www/html/me.goteku.com/backend/venv/lib/python3.8/site-packages/jose/backends/rsa_backend.py_gcd&   s    r   i  c                 C   s   || d }|}|d dkr&|d }qd}d}|s|t k r|}||k rt||| }|dkr|| d krt|d| dkrt|d | }	d}q|d9 }q>|d7 }q.|stdt| |	\}
}|dkstt|	|
fdd\}	}
|	|
fS )z
    Compute factors p and q from the private exponent d. We assume that n has
    no more than two factors. This function is adapted from code in PyCrypto.
          r   FTz2Unable to compute factors p and q from exponent d.)reverse)_MAX_RECOVERY_ATTEMPTSpowr   
ValueErrordivmodAssertionErrorsorted)nedZktottZspottedr   kcandpqrr   r   r   _rsa_recover_prime_factors7   s,    
$

r$   PKCS8c                 C   s   t | tj}||S N)RSAKeyr   RS256to_pem)pemfmtkeyr   r   r   pem_to_spkib   s    r-   c                 C   s&   |  tt std| ttd S )zLegacy RSA private key PKCS8-to-PKCS1 conversion.

    .. warning::

        This is incorrect parsing and only works because the legacy PKCS1-to-PKCS8
        encoding was also incorrect.
    zInvalid private key encodingN)
startswithLEGACY_INVALID_PKCS8_RSA_HEADERASN1_SEQUENCE_IDr   len)Z	pkcs8_keyr   r   r   "_legacy_private_key_pkcs8_to_pkcs1g   s    r2   c                   @   sj   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd ZdddZdd Zdd Zdd ZdS )r'   zSHA-256zSHA-384zSHA-512c                 C   s  |t jkrtd| |t jkr6|t jkr6td| t j| jt j| jt j	| j
i|| _|| _t|trz| || _d S t|tjtjfr|| _d S t|tr|d}t|trztj|| _W n tk
r   ztj|| _W n tk
r   ztj|| _W n tk
r   zNt|d}zt|}W n tk
rZ   t|}Y nX tjj|dd| _W n, tk
r } zt|W 5 d }~X Y nX Y nX Y nX Y nX d S td| d S )Nz*hash_alg: %s is not a valid hash algorithmz+alg: %s is not supported by the RSA backendzutf-8s   PRIVATE KEYDERformatz'Unable to parse an RSA_JWK from key: %s) r   RSAr
   ZRSA_KWZRSA1_5r(   SHA256ZRS384SHA384ZRS512SHA512gethash_alg
_algorithm
isinstancedict_process_jwk_prepared_keypyrsa	PublicKey
PrivateKeystrencodebytesZ
load_pkcs1r   Zload_pkcs1_openssl_pem	pyrsa_pemZload_pemr   r   r2   )selfr,   	algorithmderZ	pkcs1_keyr   r   r   r   __init__}   sV    
   


,zRSAKey.__init__c                    s     ddks td  d t  d}t  d}d krRtj||dS t  d}dd	d
ddg}t fdd|D rt fdd|D stdt d }t d	 }tj|||||dS t|||\}}tj|||||dS d S )Nktyr6   z1Incorrect key type. Expected: 'RSA', Received: %sr   r   r   )r   r   r!   r"   dpdqqic                 3   s   | ]}| kV  qd S r&   r   .0r   jwk_dictr   r   	<genexpr>   s     z&RSAKey._process_jwk.<locals>.<genexpr>c                 3   s   | ]}| kV  qd S r&   r   rP   rR   r   r   rT      s     z2Precomputed private key parameters are incomplete.)r   r   r   r!   r"   )r   r   r   r!   r"   )	r:   r
   r   rA   rB   anyallrC   r$   )rH   rS   r   r   r   Zextra_paramsr!   r"   r   rR   r   r?      s     zRSAKey._process_jwkc                 C   s   t || j| jS r&   )rA   signr@   r;   )rH   msgr   r   r   rW      s    zRSAKey.signc                 C   sH   |   std zt||| j W dS  tjjk
rB   Y dS X d S )NzKAttempting to verify a message with a private key. This is not recommended.TF)	is_publicwarningswarnrA   verifyr@   Zpkcs1ZVerificationError)rH   rX   sigr   r   r   r\      s    
zRSAKey.verifyc                 C   s   t | jtjS r&   )r=   r@   rA   rB   rH   r   r   r   rY      s    zRSAKey.is_publicc                 C   s2   t | jtjr| S | tj| jj| jjd| jS )N)r   r   )r=   r@   rA   rB   	__class__r   r   r<   r^   r   r   r   
public_key   s    zRSAKey.public_keyr%   c                 C   s   t | jtjrd| jjdd}|dkr<t|}tj|dd}q|dkrTtj|dd}qtd|nb|dkr| jjdd}t	|}tj|d	d}n4|dkr| jjdd}tj|d
d}ntd||S )Nr3   r4   r%   zPRIVATE KEY)Z
pem_markerZPKCS1zRSA PRIVATE KEYzInvalid pem format specified: z
PUBLIC KEYzRSA PUBLIC KEY)
r=   r@   rA   rC   Z
save_pkcs1r   rG   Zsave_pemr   r   )rH   Z
pem_formatrJ   Z	pkcs8_derr*   Z	pkcs1_derr   r   r   r)      s"    zRSAKey.to_pemc              
   C   s   |   s|  j}n| j}| jdt|jdt|jdd}|   s|t| jj	dt| jj
dt| jjdt| jjdt| jjdt| jjdd |S )Nr6   ASCII)algrL   r   r   )r   r!   r"   rM   rN   rO   )rY   r`   r@   r<   r   r   decoder   updater   r!   r"   Zexp1Zexp2Zcoef)rH   r`   datar   r   r   to_dict   s&    zRSAKey.to_dictc                 C   s$   |   std t|| j}|S )NzLAttempting to encrypt a message with a private key. This is not recommended.)rY   rZ   r[   rA   Zencryptr@   )rH   Zkey_datawrapped_keyr   r   r   wrap_key  s    
zRSAKey.wrap_keyc              
   C   sB   zt || j}W n* tk
r< } zt|W 5 d }~X Y nX |S r&   )rA   Zdecryptr@   r   r	   )rH   rg   Zunwrapped_keyr   r   r   r   
unwrap_key  s
    zRSAKey.unwrap_keyN)r%   )__name__
__module____qualname__r7   r8   r9   rK   r?   rW   r\   rY   r`   r)   rf   rh   ri   r   r   r   r   r'   x   s   2	
r'   )r%   )%binasciirZ   rsarA   Zrsa.pemr*   rG   Zpyasn1.errorr   r   Zjose.backends._asn1r   r   r   Zjose.backends.baser   Zjose.constantsr   Zjose.exceptionsr	   r
   Z
jose.utilsr   r   Z	SUPPORTEDremoveZRSA_OAEP	unhexlifyr/   r0   ZRSA_ENCRYPTION_ASN1_OIDr   r   r$   r-   r2   r'   r   r   r   r   <module>   s,   	
+
