
    uZh*                     V   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j0                  j3                  ej4                          e j6                  d	      Z e j6                  d
      ZdZd ZdZ d Z!ddZ"d Z# G d de      Z$y)    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  }} |r
| 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     u/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/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(  rd}d}|sh|t         k  r_|}||k  rGt        |||       }|dk7  r*|| dz
  k7  r"t        |d|       dk(  rt        |dz   |       }	d}n|dz  }||k  rG|dz  }|s
|t         k  r_|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   s    q519D 	A
a%1*F a%1* G	A!44$hq!Q<DqyTa!e_T1aA1E 1%FA $h 	
Q !44 MNN!Q<DAq6M61a&$'DAqq6Mr   c                 X    t        | t        j                        }|j                  |      S N)RSAKeyr	   RS256to_pem)pemfmtkeys      r   pem_to_spkir4   b   s"    
j&&
'C::c?r   c                 t    | j                  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   s9      ?BR RS788S89;<<r   c                   V    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y)r.   zSHA-256zSHA-384zSHA-512c                    |t         j                  vrt        d|z        |t         j                  v r!|t         j                  k7  rt        d|z        t         j
                  | j                  t         j                  | j                  t         j                  | j                  ij                  |      | _        || _        t        |t              r| j!                  |      | _        y t        |t$        j&                  t$        j(                  f      r|| _        y t        |t*              r|j-                  d      }t        |t.              r&	 t$        j&                  j1                  |      | _        y t        d|z        # t2        $ r 	 t$        j&                  j5                  |      | _        Y y # t2        $ r 	 t$        j(                  j1                  |      | _        n# t2        $ r 	 t7        j8                  |d      }	 t;        |      }n# t<        $ r t?        |      }Y nw xY wt$        j(                  j1                  |d      | _        n# t2        $ r}t        |      d }~ww xY wY nw xY wY Y y w xY ww xY w)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   r;   )selfr3   	algorithmder	pkcs1_keyr!   s         r   __init__zRSAKey.__init__}   s-   JNN*G)STT
)))i:;L;L.LH9TUU dkkdkkdkk
 #i.	 	
 $c4 !%!2!23!7DcEOOU-=-=>?!$Dc3**W%Cc5!.%*__%?%?%D"( @3FGG)  ..).)O)OPS)TD&" ! " ..-2-=-=-H-H-M*% .."+"4"4S."ICT,J3,O	#. T -Os,S		T
 271A1A1L1LY_d1L1eD.) ."*1+-. /. !..s   
$E= =	I4$F--	I07$GI0	I)&I
=H	I
	H 	I
H 	 )I
	I)
	I#	I	I#	#I)&I0(I))I0,I4/I00I4c                 f   j                  d      dk(  st        dj                  d      z        t        j                  d            }t        j                  d            }dvrt        j                  ||      S t        j                  d            }g d}t        fd	|D              rUt        fd
|D              st        d      t        d         }t        d         }t        j                  |||||      S t        |||      \  }}t        j                  |||||      S )NktyrA   z1Incorrect key type. Expected: 'RSA', Received: %sr!   r    r"   )r!   r    )r(   r)   dpdqqic              3   &   K   | ]  }|v  
 y wr-   r   .0r&   jwk_dicts     r   	<genexpr>z&RSAKey._process_jwk.<locals>.<genexpr>   s     7Q1=7   c              3   &   K   | ]  }|v  
 y wr-   r   re   s     r   rh   z&RSAKey._process_jwk.<locals>.<genexpr>   s     ?Q1=?ri   z2Precomputed private key parameters are incomplete.r(   r)   )r!   r    r"   r(   r)   )r    r!   r"   r(   r)   )	rI   r   r   rP   rQ   anyallrR   r+   )rZ   rg   r!   r    r"   extra_paramsr(   r)   s    `      r   rN   zRSAKey._process_jwk   s   ||E"e+NQYQ]Q]^cQddee8<<,-8<<,-h??Q!,,x||C01A7L7,77?,?? ##WXX"8C=1"8C=1''!qAa@@1!Q:1''!qAa@@r   c                 X    t        j                  || j                  | j                        S r-   )rP   signrO   rJ   )rZ   msgs     r   ro   zRSAKey.sign   s    zz#t114==AAr   c                     | j                         st        j                  d       	 t        j                  ||| j
                         y# t        j                  j                  $ r Y yw xY w)NzKAttempting to verify a message with a private key. This is not recommended.TF)	is_publicwarningswarnrP   verifyrO   pkcs1VerificationError)rZ   rp   sigs      r   ru   zRSAKey.verify   sS    ~~MMjk	LLc4#5#56{{,, 		s   !A	 	A)(A)c                 J    t        | j                  t        j                        S r-   )rL   rO   rP   rQ   rZ   s    r   rr   zRSAKey.is_public   s    $,,eoo>>r   c                     t        | j                  t        j                        r| S | j	                  t        j                  | j                  j
                  | j                  j                        | j                        S )N)r    r!   )rL   rO   rP   rQ   	__class__r    r!   rK   rz   s    r   
public_keyzRSAKey.public_key   sV    d((%//:K~~eoo0B0B0D0DHZHZH\H\]_c_n_noor   c                 F   t        | j                  t        j                        rq| j                  j	                  d      }|dk(  r$t        |      }t        j                  |d      }|S |dk(  rt        j                  |d      }|S t        d|      |dk(  r@| j                  j	                  d      }t        |      }t        j                  |d	      }|S |dk(  r5| j                  j	                  d      }t        j                  |d
      }|S t        d|      )Nr>   r?   PKCS8zPRIVATE KEY)
pem_markerPKCS1zRSA PRIVATE KEYzInvalid pem format specified: z
PUBLIC KEYzRSA PUBLIC KEY)
rL   rO   rP   rR   
save_pkcs1r   rX   save_pemr   r   )rZ   
pem_formatr\   	pkcs8_derr1   	pkcs1_ders         r   r0   zRSAKey.to_pem   s+   d((%*:*:;$$//u/=CW$:3?	((}M 
 w&((9JK 
 !#A*!PQQW$ ..999G	9)D	((|L 
 w&((3353A((9IJ 
 !#A*!PQQr   c           
         | j                         s| j                         j                  }n| j                  }| j                  dt	        |j
                        j                  d      t	        |j                        j                  d      d}| j                         s |j                  t	        | j                  j                        j                  d      t	        | j                  j                        j                  d      t	        | j                  j                        j                  d      t	        | j                  j                        j                  d      t	        | j                  j                        j                  d      t	        | j                  j                        j                  d      d       |S )NrA   ASCII)algr`   r    r!   )r"   r(   r)   ra   rb   rc   )rr   r}   rO   rK   r   r    decoder!   updater"   r(   r)   exp1exp2coef)rZ   r}   datas      r   to_dictzRSAKey.to_dict   sH   ~~*88J++J ??
-44W=
-44W=	
 ~~KK'(:(:(<(<=DDWM'(:(:(<(<=DDWM'(:(:(<(<=DDWM(););)@)@AHHQ(););)@)@AHHQ(););)@)@AHHQ	 r   c                     | j                         st        j                  d       t        j                  || j
                        }|S )NzLAttempting to encrypt a message with a private key. This is not recommended.)rr   rs   rt   rP   encryptrO   )rZ   key_datawrapped_keys      r   wrap_keyzRSAKey.wrap_key  s5    ~~MMklmmHd.@.@Ar   c                     	 t        j                  || j                        }|S # t        $ r}t	        |      d }~ww xY wr-   )rP   decryptrO   r   r
   )rZ   r   unwrapped_keyr!   s       r   
unwrap_keyzRSAKey.unwrap_key  sA    	!MM+t7I7IJM   	1+	s    $ 	=8=Nr   )__name__
__module____qualname__rD   rF   rH   r^   rN   ro   ru   rr   r}   r0   r   r   r   r   r   r   r.   r.   x   sH    FFF0HdA8B?p
.6r   r.   r   )%binasciirs   rsarP   rsa.pemr1   rX   pyasn1.errorr   r   jose.backends._asn1r   r   r   jose.backends.baser   jose.constantsr	   jose.exceptionsr
   r   
jose.utilsr   r   	SUPPORTEDremoveRSA_OAEP	unhexlifyr7   r8   RSA_ENCRYPTION_ASN1_OIDr   r   r+   r4   r;   r.   r   r   r   <module>r      s        $  
 # % . 5 
    J// 0"4("4"4#  &8%%d+ 0   (V
="dS dr   