U
    *}f(                     @   sT  d dl mZmZmZ d dlZzd dlmZ W n  ek
rL   d dlmZ Y nX d dl	Z	d dl
mZ d dlmZmZ d dlmZ d dlmZ e	ejG dd	 d	eZe	ejG d
d deZe	ejG dd deZeZd%ddZdd Zdd Zdd Zdd Zdd Zdd Z dd Z!dZ"dd  Z#G d!d" d"eZ$G d#d$ d$eZ%dS )&    )absolute_importdivisionprint_functionN)gcd)utils)UnsupportedAlgorithm_Reasons)_get_backend)
RSABackendc                   @   sR   e Zd Zejdd Zejdd Zejdd Zejdd Z	ejd	d
 Z
dS )RSAPrivateKeyc                 C   s   dS )zN
        Returns an AsymmetricSignatureContext used for signing data.
        N )selfpadding	algorithmr   r   Q/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/primitives/asymmetric/rsa.pysigner   s    zRSAPrivateKey.signerc                 C   s   dS )z3
        Decrypts the provided ciphertext.
        Nr   )r   Z
ciphertextr   r   r   r   decrypt   s    zRSAPrivateKey.decryptc                 C   s   dS z7
        The bit length of the public modulus.
        Nr   r   r   r   r   key_size%   s    zRSAPrivateKey.key_sizec                 C   s   dS )zD
        The RSAPublicKey associated with this private key.
        Nr   r   r   r   r   
public_key+   s    zRSAPrivateKey.public_keyc                 C   s   dS )z!
        Signs the data.
        Nr   )r   datar   r   r   r   r   sign1   s    zRSAPrivateKey.signN)__name__
__module____qualname__abcabstractmethodr   r   abstractpropertyr   r   r   r   r   r   r   r      s   



r   c                   @   s(   e Zd Zejdd Zejdd ZdS )RSAPrivateKeyWithSerializationc                 C   s   dS )z/
        Returns an RSAPrivateNumbers.
        Nr   r   r   r   r   private_numbers:   s    z.RSAPrivateKeyWithSerialization.private_numbersc                 C   s   dS z6
        Returns the key serialized as bytes.
        Nr   )r   encodingformatZencryption_algorithmr   r   r   private_bytes@   s    z,RSAPrivateKeyWithSerialization.private_bytesN)r   r   r   r   r   r    r$   r   r   r   r   r   8   s   
r   c                   @   s`   e Zd Zejdd Zejdd Zejdd Zejdd Z	ejd	d
 Z
ejdd ZdS )RSAPublicKeyc                 C   s   dS )zY
        Returns an AsymmetricVerificationContext used for verifying signatures.
        Nr   )r   	signaturer   r   r   r   r   verifierI   s    zRSAPublicKey.verifierc                 C   s   dS )z/
        Encrypts the given plaintext.
        Nr   )r   	plaintextr   r   r   r   encryptO   s    zRSAPublicKey.encryptc                 C   s   dS r   r   r   r   r   r   r   U   s    zRSAPublicKey.key_sizec                 C   s   dS )z-
        Returns an RSAPublicNumbers
        Nr   r   r   r   r   public_numbers[   s    zRSAPublicKey.public_numbersc                 C   s   dS r!   r   )r   r"   r#   r   r   r   public_bytesa   s    zRSAPublicKey.public_bytesc                 C   s   dS )z5
        Verifies the signature of the data.
        Nr   )r   r&   r   r   r   r   r   r   verifyg   s    zRSAPublicKey.verifyN)r   r   r   r   r   r'   r)   r   r   r*   r+   r,   r   r   r   r   r%   G   s   




r%   c                 C   s4   t |}t|tstdtjt| | || |S )Nz-Backend object does not implement RSABackend.)r	   
isinstancer
   r   r   ZBACKEND_MISSING_INTERFACE_verify_rsa_parametersZgenerate_rsa_private_key)public_exponentr   backendr   r   r   generate_private_keyq   s    

r1   c                 C   s$   | dkrt d|dk r t dd S )N)   i  zopublic_exponent must be either 3 (for legacy compatibility) or 65537. Almost everyone should choose 65537 here!i   z#key_size must be at least 512-bits.
ValueError)r/   r   r   r   r   r.   }   s    r.   c                 C   s   |dk rt d| |kr t d||kr0t d||kr@t d||krPt d||kr`t d||krpt d|dk s||krt d	|d
@ dkrt d|d
@ dkrt d|d
@ dkrt d| | |krt dd S )Nr2   zmodulus must be >= 3.zp must be < modulus.zq must be < modulus.zdmp1 must be < modulus.zdmq1 must be < modulus.ziqmp must be < modulus.z#private_exponent must be < modulus.z+public_exponent must be >= 3 and < modulus.   r   zpublic_exponent must be odd.zdmp1 must be odd.zdmq1 must be odd.zp*q must equal modulus.r3   )pqprivate_exponentdmp1dmq1iqmpr/   modulusr   r   r   _check_private_key_components   s0    r=   c                 C   s@   |dk rt d| dk s | |kr(t d| d@ dkr<t dd S )Nr2   zn must be >= 3.ze must be >= 3 and < n.r5   r   ze must be odd.r3   )enr   r   r   _check_public_key_components   s    r@   c           	      C   sR   d\}}| | }}|dkrJt ||\}}|||  }||||f\}}}}q|| S )zO
    Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1
    )r5   r   r   )divmod)	r>   mx1Zx2abr7   rZxnr   r   r   _modinv   s    
rG   c                 C   s
   t || S )zF
    Compute the CRT (q ** -1) % p value from RSA primes p and q.
    )rG   )r6   r7   r   r   r   rsa_crt_iqmp   s    rH   c                 C   s   | |d  S )zg
    Compute the CRT private_exponent % (p - 1) value from the RSA
    private_exponent (d) and p.
    r5   r   )r8   r6   r   r   r   rsa_crt_dmp1   s    rI   c                 C   s   | |d  S )zg
    Compute the CRT private_exponent % (q - 1) value from the RSA
    private_exponent (d) and q.
    r5   r   )r8   r7   r   r   r   rsa_crt_dmq1   s    rJ   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.
    r5      r   FTz2Unable to compute factors p and q from exponent d.)reverse)_MAX_RECOVERY_ATTEMPTSpowr   r4   rA   AssertionErrorsorted)r?   r>   dZktottZspottedrD   kZcandr6   r7   rF   r   r   r   rsa_recover_prime_factors   s,    
$

rT   c                   @   s|   e Zd Zdd ZedZedZedZedZ	edZ
edZed	ZdddZdd Zdd Zdd Zd
S )RSAPrivateNumbersc                 C   s   t |tjrHt |tjrHt |tjrHt |tjrHt |tjrHt |tjsPtdt |tsbtd|| _|| _|| _|| _|| _	|| _
|| _d S )NzNRSAPrivateNumbers p, q, d, dmp1, dmq1, iqmp arguments must all be an integers.zFRSAPrivateNumbers public_numbers must be an RSAPublicNumbers instance.)r-   sixinteger_types	TypeErrorRSAPublicNumbers_p_q_d_dmp1_dmq1_iqmp_public_numbers)r   r6   r7   rQ   r9   r:   r;   r*   r   r   r   __init__  s4    






zRSAPrivateNumbers.__init__rZ   r[   r\   r]   r^   r_   r`   Nc                 C   s   t |}|| S N)r	   Zload_rsa_private_numbersr   r0   r   r   r   private_key5  s    zRSAPrivateNumbers.private_keyc                 C   sb   t |tstS | j|jko`| j|jko`| j|jko`| j|jko`| j|jko`| j|jko`| j	|j	kS rb   )
r-   rU   NotImplementedr6   r7   rQ   r9   r:   r;   r*   r   otherr   r   r   __eq__9  s    






zRSAPrivateNumbers.__eq__c                 C   s
   | |k S rb   r   rf   r   r   r   __ne__G  s    zRSAPrivateNumbers.__ne__c                 C   s$   t | j| j| j| j| j| j| jfS rb   )hashr6   r7   rQ   r9   r:   r;   r*   r   r   r   r   __hash__J  s    zRSAPrivateNumbers.__hash__)N)r   r   r   ra   r   read_only_propertyr6   r7   rQ   r9   r:   r;   r*   rd   rh   ri   rk   r   r   r   r   rU     s   







rU   c                   @   sR   e Zd Zdd ZedZedZdddZdd	 Z	d
d Z
dd Zdd ZdS )rY   c                 C   s0   t |tjrt |tjs td|| _|| _d S )Nz,RSAPublicNumbers arguments must be integers.)r-   rV   rW   rX   _e_n)r   r>   r?   r   r   r   ra   Y  s     zRSAPublicNumbers.__init__rm   rn   Nc                 C   s   t |}|| S rb   )r	   Zload_rsa_public_numbersrc   r   r   r   r   e  s    zRSAPublicNumbers.public_keyc                 C   s
   d | S )Nz$<RSAPublicNumbers(e={0.e}, n={0.n})>)r#   r   r   r   r   __repr__i  s    zRSAPublicNumbers.__repr__c                 C   s&   t |tstS | j|jko$| j|jkS rb   )r-   rY   re   r>   r?   rf   r   r   r   rh   l  s    
zRSAPublicNumbers.__eq__c                 C   s
   | |k S rb   r   rf   r   r   r   ri   r  s    zRSAPublicNumbers.__ne__c                 C   s   t | j| jfS rb   )rj   r>   r?   r   r   r   r   rk   u  s    zRSAPublicNumbers.__hash__)N)r   r   r   ra   r   rl   r>   r?   r   ro   rh   ri   rk   r   r   r   r   rY   X  s   	


rY   )N)&
__future__r   r   r   r   mathr   ImportErrorZ	fractionsrV   Zcryptographyr   Zcryptography.exceptionsr   r   Zcryptography.hazmat.backendsr	   Z'cryptography.hazmat.backends.interfacesr
   add_metaclassABCMetaobjectr   r   r%   ZRSAPublicKeyWithSerializationr1   r.   r=   r@   rG   rH   rI   rJ   rM   rT   rU   rY   r   r   r   r   <module>   s:   
 

&
(+H