o
    6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_base64,308204BD020100300D06092A864886F70D0101010500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   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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dktott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   
r0   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)	pkcs8_keyr   r   r   "_legacy_private_key_pkcs8_to_pkcs1g   s   r6   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
   RSA_KWRSA1_5r+   SHA256RS384SHA384RS512SHA512gethash_alg
_algorithm
isinstancedict_process_jwk_prepared_keypyrsa	PublicKey
PrivateKeystrencodebytes
load_pkcs1r   load_pkcs1_openssl_pem	pyrsa_pemload_pemr   r   r6   )selfr/   	algorithmder	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ktyr:   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   r\   r)   r   r]   r_   r   r   ra      rb   z2Precomputed private key parameters are incomplete.r$   r%   )r   r   r   r$   r%   )r   r   r   r$   r%   )	rB   r
   r   rI   rJ   anyallrK   r'   )rS   r`   r   r   r   extra_paramsr$   r%   r   r_   r   rG      s    zRSAKey._process_jwkc                 C   s   t || j| jS r)   )rI   signrH   rC   )rS   msgr   r   r   rf      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warnrI   verifyrH   pkcs1VerificationError)rS   rg   sigr   r   r   rk      s   
zRSAKey.verifyc                 C   s   t | jtjS r)   )rE   rH   rI   rJ   rS   r   r   r   rh      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   )rE   rH   rI   rJ   	__class__r   r   rD   ro   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|)Nr7   r8   r(   zPRIVATE KEY)
pem_markerPKCS1zRSA PRIVATE KEYzInvalid pem format specified: z
PUBLIC KEYzRSA PUBLIC KEY)
rE   rH   rI   rK   
save_pkcs1r   rQ   save_pemr   r   )rS   
pem_formatrU   	pkcs8_derr-   	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 )Nr:   ASCII)algrX   r   r   )r   r$   r%   rY   rZ   r[   )rh   rq   rH   rD   r   r   decoder   updater   r$   r%   exp1exp2coef)rS   rq   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.)rh   ri   rj   rI   encryptrH   )rS   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)   )rI   decryptrH   r   r	   )rS   r   unwrapped_keyr   r   r   r   
unwrap_key  s   zRSAKey.unwrap_keyNr(   )__name__
__module____qualname__r=   r?   rA   rW   rG   rf   rk   rh   rq   r,   r   r   r   r   r   r   r   r*   x   s    2	
r*   r   )%binasciiri   rsarI   rsa.pemr-   rQ   pyasn1.errorr   r   jose.backends._asn1r   r   r   jose.backends.baser   jose.constantsr   jose.exceptionsr	   r
   
jose.utilsr   r   	SUPPORTEDremoveRSA_OAEP	unhexlifyr2   r3   RSA_ENCRYPTION_ASN1_OIDr   r   r'   r0   r6   r*   r   r   r   r   <module>   s.    
	
+