
    ]f*                     J   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 j        d	          Z e j        d
          ZdZd ZdZ d Z!ddZ"d Z# G 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                     |r	|| |z  }} |	| 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bs     K/var/www/html/env/lib/python3.11/site-packages/jose/backends/rsa_backend.py_gcdr   &   s(      1q51  H    i  c                    ||z  dz
  }|}|dz  dk    r|dz  }|dz  dk    d}d}|s{|t           k     rp|}||k     rVt          |||           }|dk    r4|| dz
  k    r+t          |d|           dk    rt          |dz   |           }	d}n|dz  }||k     V|dz  }|s|t           k     p|st          d          t	          | |	          \  }
}|dk    sJ t          |	|
f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rs               r   _rsa_recover_prime_factorsr+   7   sN    q519D 	A
a%1**F a%1** G	A !444$hhq!Q<<DqyyTa!e__T1aA1E1E 1%%FA $hh 	
Q  !444  OMNNN!Q<<DAq66661a&$'''DAqq6Mr   PKCS8c                 `    t          | t          j                  }|                    |          S N)RSAKeyr	   RS256to_pem)pemfmtkeys      r   pem_to_spkir5   b   s$    
j&
'
'C::c??r   c                     |                      t          t          z             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_keys    r   "_legacy_private_key_pkcs8_to_pkcs1r<   g   sJ      ?BR RSS 97888S899;;<<r   c                   X    e Zd ZdZdZdZd Zd Zd Zd Z	d Z
d	 ZddZd Zd Zd ZdS )r/   zSHA-256zSHA-384zSHA-512c                    |t           j        vrt          d|z            |t           j        v r"|t           j        k    rt          d|z            t           j        | j        t           j        | j        t           j	        | j
        i                    |          | _        || _        t          |t                    r|                     |          | _        d S t          |t$          j        t$          j        f          r	|| _        d S t          |t*                    r|                    d          }t          |t.                    r3	 t$          j                            |          | _        n
# t2          $ r 	 t$          j                            |          | _        n# t2          $ r 	 t$          j                            |          | _        n# t2          $ r 	 t7          j        |d          }	 t;          |          }n# t<          $ r t?          |          }Y nw xY wt$          j                            |d          | _        n!# t2          $ r}t          |          d }~ww xY wY nw xY wY nw xY wY nw xY wd S t          d|z            )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_5r0   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   r<   )selfr4   	algorithmder	pkcs1_keyr!   s         r   __init__zRSAKey.__init__}   s   JN**G)STTT
)))i:;L.L.LH9TUUU dkdkdk
 #i..	 	
 $c4   	!%!2!23!7!7DFcEOU-=>?? 	!$DFc3 	&**W%%Cc5!! 	.%*_%?%?%D%D"" . . ..).)O)OPS)T)TD&&! . . ..-2-=-H-H-M-M**% . . .."+"4S."I"ICT,J3,O,O		#. T T T -Os,S,S				T
 271A1L1LY_d1L1e1eD..) . . ."*1++-. /....& F@3FGGGs   $E, ,
I37$FI3
I-'$GI-
I'I-G=<I=H	IH	)II'
I!	I	I!	!I'$I-&I''I-*I3,I--I32I3c                                         d          dk    s%t          d                     d          z            t                               d                    }t                               d                    }dvrt          j        ||          S t                               d                    }g d}t          fd	|D                       rmt          fd
|D                       st          d          t          d                   }t          d                   }t          j        |||||          S t          |||          \  }}t          j        |||||          S )NktyrB   z1Incorrect key type. Expected: 'RSA', Received: %sr!   r    r"   )r!   r    )r(   r)   dpdqqic              3       K   | ]}|v V  	d S r.   r   .0r&   jwk_dicts     r   	<genexpr>z&RSAKey._process_jwk.<locals>.<genexpr>   s'      77Q1=777777r   c              3       K   | ]}|v V  	d S r.   r   rf   s     r   ri   z&RSAKey._process_jwk.<locals>.<genexpr>   s'      ??Q1=??????r   z2Precomputed private key parameters are incomplete.r(   r)   )r!   r    r"   r(   r)   )r    r!   r"   r(   r)   )	rJ   r   r   rQ   rR   anyallrS   r+   )r[   rh   r!   r    r"   extra_paramsr(   r)   s    `      r   rO   zRSAKey._process_jwk   s   ||E""e++NQYQ]Q]^cQdQddeee8<<,,--8<<,,--h?Q!,,,,x||C0011A777L7777,77777 A????,????? Y ##WXXX"8C=11"8C=11'!qAa@@@@1!Q::1'!qAa@@@@r   c                 B    t          j        || j        | j                  S r.   )rQ   signrP   rK   )r[   msgs     r   ro   zRSAKey.sign   s    z#t14=AAAr   c                     |                                  st          j        d           	 t          j        ||| j                   dS # t          j        j        $ r Y dS w xY w)NzKAttempting to verify a message with a private key. This is not recommended.TF)	is_publicwarningswarnrQ   verifyrP   pkcs1VerificationError)r[   rp   sigs      r   ru   zRSAKey.verify   sn    ~~ 	lMjkkk	Lc4#56664{, 	 	 	55	s   A AAc                 @    t          | j        t          j                  S r.   )rM   rP   rQ   rR   r[   s    r   rr   zRSAKey.is_public   s    $,eo>>>r   c                     t          | j        t          j                  r| S |                     t          j        | j        j        | j        j                  | j                  S )N)r    r!   )rM   rP   rQ   rR   	__class__r    r!   rL   rz   s    r   
public_keyzRSAKey.public_key   sQ    d(%/:: 	K~~eo0B0DHZH\]]]_c_nooor   r,   c                 R   t          | j        t          j                  rv| j                            d          }|dk    r&t          |          }t          j        |d          }n|dk    rt          j        |d          }nt          d|          |dk    rA| j                            d          }t          |          }t          j        |d	          }nJ|dk    r2| j                            d          }t          j        |d
          }nt          d|          |S )Nr?   r@   r,   zPRIVATE KEY)
pem_markerPKCS1zRSA PRIVATE KEYzInvalid pem format specified: z
PUBLIC KEYzRSA PUBLIC KEY)
rM   rP   rQ   rS   
save_pkcs1r   rY   save_pemr   r   )r[   
pem_formatr]   	pkcs8_derr2   	pkcs1_ders         r   r1   zRSAKey.to_pem   s=   d(%*:;; 	R$//u/==CW$$:3??	(}MMMw&&(9JKKK !P*!P!PQQQW$$ .999GG	9)DD	(|LLLw&&(3353AA(9IJJJ !P*!P!PQQQ
r   c           
      v   |                                  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 )NrB   ASCII)algra   r    r!   )r"   r(   r)   rb   rc   rd   )rr   r}   rP   rL   r   r    decoder!   updater"   r(   r)   exp1exp2coef)r[   r}   datas      r   to_dictzRSAKey.to_dict   sq   ~~ 	,**8JJ+J ?
--44W==
--44W==	
 
 ~~ 
	KK'(:(<==DDWMM'(:(<==DDWMM'(:(<==DDWMM();)@AAHHQQ();)@AAHHQQ();)@AAHHQQ 	 	 	 r   c                     |                                  st          j        d           t          j        || j                  }|S )NzLAttempting to encrypt a message with a private key. This is not recommended.)rr   rs   rt   rQ   encryptrP   )r[   key_datawrapped_keys      r   wrap_keyzRSAKey.wrap_key  s@    ~~ 	mMklllmHd.@AAr   c                     	 t          j        || j                  }n!# t          $ r}t	          |          d }~ww xY w|S r.   )rQ   decryptrP   r   r
   )r[   r   unwrapped_keyr!   s       r   
unwrap_keyzRSAKey.unwrap_key  sN    	!M+t7IJJMM 	 	 	1++	s    
;6;Nr,   )__name__
__module____qualname__rE   rG   rI   r_   rO   ro   ru   rr   r}   r1   r   r   r   r   r   r   r/   r/   x   s        FFF0H 0H 0HdA A A8B B B  ? ? ?p p p
   .  6      r   r/   r   )%binasciirs   rsarQ   rsa.pemr2   rY   pyasn1.errorr   r   jose.backends._asn1r   r   r   jose.backends.baser   jose.constantsr	   jose.exceptionsr
   r   
jose.utilsr   r   	SUPPORTEDremoveRSA_OAEP	unhexlifyr8   r9   RSA_ENCRYPTION_ASN1_OIDr   r   r+   r5   r<   r/   r   r   r   <module>r      s               $ $ $ $ $ $               
 # " " " " " % % % % % % . . . . . . . . 5 5 5 5 5 5 5 5 
   J/ 0 0 0"4("4# #  &8%d++ 0     ( ( (V   
= = ="d d d d dS d d d d dr   