a
    Ç `ˆ  ã                   @   s„   d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZ dZe e¡G dd„ deƒƒZe e¡G d	d
„ d
eƒƒZdS )é    )Úabsolute_importÚdivisionÚprint_function)Úutils)Ú_evp_pkey_derive)Úserialization)ÚX25519PrivateKeyÚX25519PublicKeyé    c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_X25519PublicKeyc                 C   s   || _ || _d S ©N©Ú_backendÚ	_evp_pkey©ÚselfZbackendÚevp_pkey© r   úM/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/x25519.pyÚ__init__   s    z_X25519PublicKey.__init__c                 C   sV   |t jju s|t jju r@|t jjus0|t jjur8tdƒ‚|  ¡ S | j ||| | jd ¡S )Nz3When using Raw both encoding and format must be Raw)	r   ÚEncodingÚRawÚPublicFormatÚ
ValueErrorÚ_raw_public_bytesr   Z_public_key_bytesr   )r   ÚencodingÚformatr   r   r   Úpublic_bytes   s    
ÿ
þ
ÿ
þÿÿz_X25519PublicKey.public_bytesc                 C   s|   | j j d¡}| j j | j|¡}| j  |dk¡ | j  |d | j jjk¡ | j j |d | j jj	¡}| j j 
||¡d d … S )Nzunsigned char **r
   r   )r   Ú_ffiÚnewÚ_libZEVP_PKEY_get1_tls_encodedpointr   Úopenssl_assertÚNULLÚgcZOPENSSL_freeÚbuffer)r   ZucharppÚresÚdatar   r   r   r   ,   s    ÿÿz"_X25519PublicKey._raw_public_bytesN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r      s   r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú_X25519PrivateKeyc                 C   s   || _ || _d S r   r   r   r   r   r   r   ;   s    z_X25519PrivateKey.__init__c                 C   sz   | j  ¡ }| j j || j¡}| j  |dk¡ | j j || j jj¡}| j  || j jjk¡ | j j 	|| j jj
¡}t| j |ƒS )Né   )r   Ú_create_mem_bio_gcr    Zi2d_PUBKEY_bior   r!   Zd2i_PUBKEY_bior   r"   r#   ZEVP_PKEY_freer   )r   Úbior%   r   r   r   r   Ú
public_key?   s    

ÿ
ÿz_X25519PrivateKey.public_keyc                 C   s"   t |tƒstdƒ‚t| j| j|ƒS )Nz(peer_public_key must be X25519PublicKey.)Ú
isinstancer	   Ú	TypeErrorr   r   r   )r   Zpeer_public_keyr   r   r   ÚexchangeL   s    
z_X25519PrivateKey.exchangec                 C   sd   |t jju s|t jju rL|t jjus<|t jjus<t|t jƒsDtdƒ‚|  ¡ S | j	 
|||| | jd ¡S )NzcWhen using Raw both encoding and format must be Raw and encryption_algorithm must be NoEncryption())r   r   r   r   ZPrivateFormatr/   ZNoEncryptionr   Ú_raw_private_bytesr   Z_private_key_bytesr   )r   r   r   Zencryption_algorithmr   r   r   Úprivate_bytesR   s&    
ÿ
þ
ÿ
þÿýÿÿz_X25519PrivateKey.private_bytesc              	   C   s|   | j  ¡ }| j j || j| j jj| j jjd| j jj| j jj¡}| j  |dk¡ | j  |¡}| j  t	|ƒdk¡ |t
 d … S )Nr   r+   é0   )r   r,   r    Zi2d_PKCS8PrivateKey_bior   r   r"   r!   Z_read_mem_bioÚlenÚ_X25519_KEY_SIZE)r   r-   r%   Zpkcs8r   r   r   r2   i   s    
ù	z$_X25519PrivateKey._raw_private_bytesN)r'   r(   r)   r   r.   r1   r3   r2   r   r   r   r   r*   9   s
   r*   N)Z
__future__r   r   r   Zcryptographyr   Z*cryptography.hazmat.backends.openssl.utilsr   Zcryptography.hazmat.primitivesr   Z0cryptography.hazmat.primitives.asymmetric.x25519r   r	   r6   Zregister_interfaceÚobjectr   r*   r   r   r   r   Ú<module>   s   %