U
    ˹h*                     @   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   ?./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   kZcandpqrr   r   r   _rsa_recover_prime_factors7   s,    
$

r#   PKCS8c                 C   s   t | tj}||S N)RSAKeyr   RS256to_pem)pemZ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    r0   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   r0   )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ktyr4   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   rN   rP   r   r   rR      s     z2Precomputed private key parameters are incomplete.)r   r   r   r    r!   )r   r   r   r    r!   )	r8   r
   r   r?   r@   anyallrA   r#   )rF   rQ   r   r   r   Zextra_paramsr    r!   r   rP   r   r=      s     zRSAKey._process_jwkc                 C   s   t || j| jS r%   )r?   signr>   r9   )rF   msgr   r   r   rU      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warnr?   verifyr>   Zpkcs1ZVerificationError)rF   rV   Zsigr   r   r   rZ      s    
zRSAKey.verifyc                 C   s   t | jtjS r%   )r;   r>   r?   r@   rF   r   r   r   rW      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?   r@   	__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 )Nr1   r2   r$   zPRIVATE KEY)Z
pem_markerZPKCS1zRSA PRIVATE KEYzInvalid pem format specified: z
PUBLIC KEYzRSA PUBLIC KEY)
r;   r>   r?   rA   Z
save_pkcs1r   rE   Zsave_pemr   r   )rF   Z
pem_formatrH   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 )Nr4   ASCII)ZalgrJ   r   r   )r   r    r!   rK   rL   rM   )rW   r]   r>   r:   r   r   decoder   updater   r    r!   Zexp1Zexp2Zcoef)rF   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.)rW   rX   rY   r?   Zencryptr>   )rF   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%   )r?   Zdecryptr>   r   r	   )rF   rc   Zunwrapped_keyr   r   r   r   
unwrap_key  s
    zRSAKey.unwrap_keyN)r$   )__name__
__module____qualname__r5   r6   r7   rI   r=   rU   rZ   rW   r]   r(   rb   rd   re   r   r   r   r   r&   x   s   2	
r&   )r$   )%ZbinasciirX   Zrsar?   Zrsa.pemr)   rE   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_OAEPZ	unhexlifyr-   r.   ZRSA_ENCRYPTION_ASN1_OIDr   r   r#   r+   r0   r&   r   r   r   r   <module>   s,   	
+
