o
    6d*                     @   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|| | } }|s| 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   pC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\jose/backends/rsa_backend.py_gcd&   s   r   i  c                 C   s   || d }|}|d dkr|d }|d dksd}d}|s\|t k r\|}||k rRt||| }|dkrJ|| d krJt|d| dkrJt|d | }	d}n|d9 }||k s(|d7 }|s\|t k s"|sbtdt| |	\}
}|dksoJ 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   s2   $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 r|t jkrtd| t j| jt j| jt j	| j
i|| _|| _t|tr=| || _d S t|tjtjfrK|| _d S t|trU|d}t|trz
tj|| _W d S  ty   ztj|| _W Y d S  ty   z	tj|| _W n? ty   z%t|d}zt|}W n ty   t|}Y nw tjj|dd| _W n ty } zt|d }~ww Y nw Y Y d S Y Y d S w w td| )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__}   sh   




zRSAKey.__init__c                    s     ddkstd  d t  d}t  d}d vr)tj||dS t  d}g d}t fd	d
|D rdt fdd
|D sNtdt d }t d }tj|||||dS t|||\}}tj|||||dS )Nktyr5   z1Incorrect key type. Expected: 'RSA', Received: %sr   r   r   )r   r   )r    r!   dpdqqic                 3       | ]}| v V  qd S r%   r   .0r   jwk_dictr   r   	<genexpr>       z&RSAKey._process_jwk.<locals>.<genexpr>c                 3   rO   r%   r   rP   rR   r   r   rT      rU   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   rS   r   r   r   Zextra_paramsr    r!   r   rR   r   r>      s    zRSAKey._process_jwkc                 C   s   t || j| jS r%   )r@   signr?   r:   )rG   msgr   r   r   rX      s   zRSAKey.signc                 C   sB   |   s	td zt||| j W dS  tjjy    Y dS w )NzKAttempting to verify a message with a private key. This is not recommended.TF)	is_publicwarningswarnr@   verifyr?   Zpkcs1ZVerificationError)rG   rY   sigr   r   r   r]      s   
zRSAKey.verifyc                 C   s   t | jtjS r%   )r<   r?   r@   rA   rG   r   r   r   rZ      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r3| jjdd}|dkrt|}tj|dd}|S |dkr,tj|dd}|S td||dkrK| jjdd}t	|}tj|d	d}|S |dkr_| jjdd}tj|d
d}|S td|)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   )rZ   ra   r?   r;   r   r   decoder   updater   r    r!   Zexp1Zexp2Zcoef)rG   ra   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.)rZ   r[   r\   r@   Zencryptr?   )rG   Zkey_datawrapped_keyr   r   r   wrap_key  s   
zRSAKey.wrap_keyc              
   C   s6   z
t || j}W |S  ty } zt|d }~ww r%   )r@   Zdecryptr?   r   r	   )rG   rh   Zunwrapped_keyr   r   r   r   
unwrap_key  s   zRSAKey.unwrap_keyNr$   )__name__
__module____qualname__r6   r7   r8   rJ   r>   rX   r]   rZ   ra   r(   rg   ri   rj   r   r   r   r   r&   x   s    2	
r&   rk   )%binasciir[   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.    
	
+