3
ãdeš/  ã               @   s¨   d dl Z d dlmZmZ d dlmZ d dlmZ e jrBd dl	m
Z
 ddœdd	„Zdd
dœdd„ZG dd
„ d
ejƒZedœdd„ZG dd„ dejƒZG dd„ dejƒZdS )é    N)ÚUnsupportedAlgorithmÚ_Reasons)Úserialization)Údh)ÚBackendr   )Úbackendc             C   sŒ   |j }|j}|j| ƒ}|j||jkƒ |j||jƒ}|jrˆ|jdƒ}|j	| |j||jƒ |j
|d ƒ}|j||j||jƒ}|j|dkƒ |S )Nz	BIGNUM **r   é   )Ú_libÚ_ffiZDHparams_dupÚopenssl_assertÚNULLÚgcZDH_freeZCRYPTOGRAPHY_IS_LIBRESSLÚnewÚDH_get0_pqgÚBN_dupZDH_set0_pqg)Údh_cdatar   ÚlibÚffiÚparam_cdataÚqZq_dupÚres© r   ú^/var/www/agendate/envp3/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/dh.pyÚ_dh_params_dup   s    

r   Ú_DHParameters)r   Úreturnc             C   s   t | |ƒ}t||ƒS )N)r   r   )r   r   r   r   r   r   Ú_dh_cdata_to_parameters!   s    
r   c               @   sP   e Zd Zddœdd„Zejdœdd„Zejdœdd	„Ze	j
e	jed
œdd„ZdS )r   r   )r   c             C   s   || _ || _d S )N)Ú_backendÚ	_dh_cdata)Úselfr   r   r   r   r   Ú__init__'   s    z_DHParameters.__init__)r   c             C   sÄ   | j jjdƒ}| j jjdƒ}| j jjdƒ}| j jj| j|||ƒ | j j|d | j jjkƒ | j j|d | j jjkƒ |d | j jjkrŒd }n| j j|d ƒ}t	j
| j j|d ƒ| j j|d ƒ|d�S )Nz	BIGNUM **r   )ÚpÚgr   )r   r
   r   r	   r   r   r   r   Ú
_bn_to_intr   ÚDHParameterNumbers)r   r!   r"   r   Úq_valr   r   r   Úparameter_numbers+   s    z_DHParameters.parameter_numbersc             C   s   | j j| ƒS )N)r   Zgenerate_dh_private_key)r   r   r   r   Úgenerate_private_key=   s    z"_DHParameters.generate_private_key)ÚencodingÚformatr   c             C   s(  |t jjkrtdƒ‚|t jjk	r(tdƒ‚| jjj	dƒ}| jj
j| j| jjj|| jjjƒ |d | jjjkr‚| jj
j r‚tdtjƒ‚|t jjkr¸|d | jjjkr¬| jj
j}qö| jj
j}n>|t jjkrî|d | jjjkrâ| jj
j}qö| jj
j}ntdƒ‚| jjƒ }||| jƒ}| jj|dkƒ | jj|ƒS )Nz!OpenSSH encoding is not supportedz%Only PKCS3 serialization is supportedz	BIGNUM **r   z'DH X9.42 serialization is not supportedz/encoding must be an item from the Encoding enumr   )r   ÚEncodingZOpenSSHÚ	TypeErrorÚParameterFormatZPKCS3Ú
ValueErrorr   r
   r   r	   r   r   r   ÚCryptography_HAS_EVP_PKEY_DHXr   r   ÚUNSUPPORTED_SERIALIZATIONZPEMZPEM_write_bio_DHxparamsZPEM_write_bio_DHparamsZDERZi2d_DHxparams_bioZi2d_DHparams_bioZ_create_mem_bio_gcr   Z_read_mem_bio)r   r(   r)   r   Z	write_bioZbior   r   r   r   Úparameter_bytes@   s2    
z_DHParameters.parameter_bytesN)Ú__name__Ú
__module__Ú__qualname__r    r   r$   r&   ÚDHPrivateKeyr'   r   r*   r,   Úbytesr0   r   r   r   r   r   &   s   )r   c             C   sL   | j jdƒ}| jj||| j j| j jƒ | j|d | j jkƒ | jj|d ƒS )Nz	BIGNUM **r   )r
   r   r	   r   r   r   ZBN_num_bits)r   r   r!   r   r   r   Ú_get_dh_num_bitsk   s    r6   c               @   s˜   e Zd Zddœdd„Zeedœdd„ƒZejdœdd	„Z	ej
ed
œdd„Zeddœdd„Zej
dœdd„Zejdœdd„Zejejejedœdd„ZdS )Ú_DHPrivateKeyr   )r   c             C   s&   || _ || _|| _| j jj|ƒ| _d S )N)r   r   Ú	_evp_pkeyr	   ZDH_sizeÚ_key_size_bytes)r   r   r   Úevp_pkeyr   r   r   r    s   s    z_DHPrivateKey.__init__)r   c             C   s   t | j| jƒS )N)r6   r   r   )r   r   r   r   Úkey_sizey   s    z_DHPrivateKey.key_sizec             C   sT  | j jjdƒ}| j jjdƒ}| j jjdƒ}| j jj| j|||ƒ | j j|d | j jjkƒ | j j|d | j jjkƒ |d | j jjkrŒd }n| j j|d ƒ}| j jjdƒ}| j jjdƒ}| j jj	| j||ƒ | j j|d | j jjkƒ | j j|d | j jjkƒ t
jt
jt
j| j j|d ƒ| j j|d ƒ|d�| j j|d ƒd�| j j|d ƒd�S )Nz	BIGNUM **r   )r!   r"   r   )r&   Úy)Úpublic_numbersÚx)r   r
   r   r	   r   r   r   r   r#   ÚDH_get0_keyr   ÚDHPrivateNumbersÚDHPublicNumbersr$   )r   r!   r"   r   r%   Úpub_keyZpriv_keyr   r   r   Úprivate_numbers}   s,    z_DHPrivateKey.private_numbers)Úpeer_public_keyr   c             C   sV  t |tƒstdƒ‚| jjj| j| jjjƒ}| jj	|| jjjkƒ | jjj
|| jjjƒ}| jjj|ƒ}| jj	|dkƒ | jjj||jƒ}| j|dkƒ | jjjdƒ}| jjj|| jjj|ƒ}| j|dkƒ | jj	|d dkƒ | jjjd|d ƒ}| jjj|||ƒ}| jj	|dkƒ | jjj||d ƒd d … }| jt|ƒ }|dk�rRd| | }|S )Nz%peer_public_key must be a DHPublicKeyr   zsize_t *r   zunsigned char[]ó    )Ú
isinstanceÚ_DHPublicKeyr+   r   r	   ZEVP_PKEY_CTX_newr8   r
   r   r   r   ZEVP_PKEY_CTX_freeZEVP_PKEY_derive_initZEVP_PKEY_derive_set_peerÚ_exchange_assertr   ZEVP_PKEY_deriveÚbufferr9   Úlen)r   rD   Úctxr   ZkeylenÚbufÚkeyÚpadr   r   r   Úexchange™   s0    


z_DHPrivateKey.exchangeN)Úokr   c             C   s   |s| j jƒ }td|ƒ‚d S )NzError computing shared key.)r   Z_consume_errorsr-   )r   rP   Úerrorsr   r   r   rH   ½   s
    
z_DHPrivateKey._exchange_assertc             C   sº   t | j| jƒ}| jjjdƒ}| jjj| j|| jjjƒ | jj|d | jjjkƒ | jjj	|d ƒ}| jj|| jjjkƒ | jjj
||| jjjƒ}| jj|dkƒ | jj|ƒ}t| j||ƒS )Nz	BIGNUM **r   r   )r   r   r   r
   r   r	   r?   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkeyrG   )r   r   rB   Zpub_key_dupr   r:   r   r   r   Ú
public_keyÅ   s    z_DHPrivateKey.public_keyc             C   s   t | j| jƒS )N)r   r   r   )r   r   r   r   Ú
parametersÖ   s    z_DHPrivateKey.parameters)r(   r)   Úencryption_algorithmr   c             C   s†   |t jjk	rtdƒ‚| jjjsl| jjjdƒ}| jjj	| j
| jjj|| jjjƒ |d | jjjkrltdtjƒ‚| jj|||| | j| j
ƒS )Nz0DH private keys support only PKCS8 serializationz	BIGNUM **r   z'DH X9.42 serialization is not supported)r   ÚPrivateFormatZPKCS8r-   r   r	   r.   r
   r   r   r   r   r   r   r/   Z_private_key_bytesr8   )r   r(   r)   rT   r   r   r   r   Úprivate_bytesÙ   s*    
z_DHPrivateKey.private_bytes)r1   r2   r3   r    ÚpropertyÚintr;   r   r@   rC   ÚDHPublicKeyr5   rO   ÚboolrH   rR   ÚDHParametersrS   r   r*   rU   ZKeySerializationEncryptionrV   r   r   r   r   r7   r   s   $r7   c               @   sb   e Zd Zddœdd„Zeedœdd„ƒZejdœdd	„Z	ej
dœd
d„Zejejedœdd„ZdS )rG   r   )r   c             C   s&   || _ || _|| _t| j | jƒ| _d S )N)r   r   r8   r6   Ú_key_size_bits)r   r   r   r:   r   r   r   r    ü   s    z_DHPublicKey.__init__)r   c             C   s   | j S )N)r\   )r   r   r   r   r;     s    z_DHPublicKey.key_sizec             C   s  | j jjdƒ}| j jjdƒ}| j jjdƒ}| j jj| j|||ƒ | j j|d | j jjkƒ | j j|d | j jjkƒ |d | j jjkrŒd }n| j j|d ƒ}| j jjdƒ}| j jj	| j|| j jjƒ | j j|d | j jjkƒ t
jt
j| j j|d ƒ| j j|d ƒ|d�| j j|d ƒd�S )Nz	BIGNUM **r   )r!   r"   r   )r&   r<   )r   r
   r   r	   r   r   r   r   r#   r?   r   rA   r$   )r   r!   r"   r   r%   rB   r   r   r   r=     s&    z_DHPublicKey.public_numbersc             C   s   t | j| jƒS )N)r   r   r   )r   r   r   r   rS     s    z_DHPublicKey.parameters)r(   r)   r   c             C   s‚   |t jjk	rtdƒ‚| jjjsl| jjjdƒ}| jjj	| j
| jjj|| jjjƒ |d | jjjkrltdtjƒ‚| jj||| | jd ƒS )Nz>DH public keys support only SubjectPublicKeyInfo serializationz	BIGNUM **r   z'DH X9.42 serialization is not supported)r   ÚPublicFormatZSubjectPublicKeyInfor-   r   r	   r.   r
   r   r   r   r   r   r   r/   Z_public_key_bytesr8   )r   r(   r)   r   r   r   r   Úpublic_bytes"  s     
z_DHPublicKey.public_bytesN)r1   r2   r3   r    rW   rX   r;   r   rA   r=   r[   rS   r   r*   r]   r5   r^   r   r   r   r   rG   û   s   rG   )ÚtypingZcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   ÚTYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r   r   r[   r   rX   r6   r4   r7   rY   rG   r   r   r   r   Ú<module>   s   E 
