a
    `mg*                     @   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   P/var/www/html/idle/venv/lib/python3.9/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sJ 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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    r1   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vrtd| |t jv 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y   ztj|| _W n ty   ztj|| _W n ty   zLt|d}zt|}W n tyR   t|}Y n0 tjj|dd| _W n. ty } zt|W Y d }~n
d }~0 0 Y n0 Y n0 Y n0 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   r1   )selfr+   	algorithmderZ	pkcs1_keyr   r   r   r   __init__}   sP    



0zRSAKey.__init__c                    s     ddks td  d t  d}t  d}d vrRtj||dS t  d}g d}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ktyr5   z1Incorrect key type. Expected: 'RSA', Received: %sr   r   r   )r   r   )r    r!   dpdqqic                 3   s   | ]}| v V  qd S r%   r   .0r   jwk_dictr   r   	<genexpr>       z&RSAKey._process_jwk.<locals>.<genexpr>c                 3   s   | ]}| v V  qd S r%   r   rO   rQ   r   r   rS      rT   z2Precomputed private key parameters are incomplete.r    r!   )r   r   r   r    r!   )r   r   r   r    r!   )	r9   r
   r   r@   rA   anyallrB   r#   )rG   rR   r   r   r   Zextra_paramsr    r!   r   rQ   r   r>      s     zRSAKey._process_jwkc                 C   s   t || j| jS r%   )r@   signr?   r:   )rG   msgr   r   r   rW      s    zRSAKey.signc                 C   sF   |   std zt||| j W dS  tjjy@   Y dS 0 d S )NzKAttempting to verify a message with a private key. This is not recommended.TF)	is_publicwarningswarnr@   verifyr?   Zpkcs1ZVerificationError)rG   rX   sigr   r   r   r\      s    
zRSAKey.verifyc                 C   s   t | jtjS r%   )r<   r?   r@   rA   rG   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?   r@   rA   	__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 )Nr2   r3   r$   zPRIVATE KEY)Z
pem_markerZPKCS1zRSA PRIVATE KEYzInvalid pem format specified: z
PUBLIC KEYzRSA PUBLIC KEY)
r<   r?   r@   rB   Z
save_pkcs1r   rF   Zsave_pemr   r   )rG   Z
pem_formatrI   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 )Nr5   ASCII)algrK   r   r   )r   r    r!   rL   rM   rN   )rY   r`   r?   r;   r   r   decoder   updater   r    r!   Zexp1Zexp2Zcoef)rG   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[   r@   Zencryptr?   )rG   Zkey_datawrapped_keyr   r   r   wrap_key  s    
zRSAKey.wrap_keyc              
   C   sD   zt || j}W n, ty> } zt|W Y d }~n
d }~0 0 |S r%   )r@   Zdecryptr?   r   r	   )rG   rg   Zunwrapped_keyr   r   r   r   
unwrap_key  s
    zRSAKey.unwrap_keyN)r$   )__name__
__module____qualname__r6   r7   r8   rJ   r>   rW   r\   rY   r`   r(   rf   rh   ri   r   r   r   r   r&   x   s   2	
r&   )r$   )%binasciirZ   rsar@   Zrsa.pemr)   rF   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.   r/   ZRSA_ENCRYPTION_ASN1_OIDr   r   r#   r,   r1   r&   r   r   r   r   <module>   s,   	
+
