U
    çe¨]Ì  ã                   @   sŒ   d dl mZmZm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 dZe e¡G dd	„ d	eƒƒZe e¡G d
d„ deƒƒZdS )é    )Úabsolute_importÚdivisionÚprint_functionN)Úutils)Ú_evp_pkey_derive)Úserialization)ÚX25519PrivateKeyÚX25519PublicKeyé    c                   @   s&   e Zd Zdd„ Zd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__Nc                 C   s¼   |d ks|d krH|d k	s |d k	r*t dƒ‚nt dtj¡ tjj}tjj}|tjjks`|tjjkrˆ|tjjk	sx|tjjk	r€t dƒ‚|  	¡ S |tj
kr¦|tjjk	r¦t dƒ‚| j ||| | jd ¡S )Nz%Both encoding and format are requiredz‚public_bytes now requires encoding and format arguments. Support for calling without arguments will be removed in cryptography 2.7z3When using Raw both encoding and format must be Rawz?format must be SubjectPublicKeyInfo when encoding is PEM or DER)Ú
ValueErrorÚwarningsÚwarnr   ZDeprecatedIn25r   ÚEncodingÚRawÚPublicFormatÚ_raw_public_bytesÚ_PEM_DERZSubjectPublicKeyInfor   Z_public_key_bytesr   )r   ÚencodingÚformatr   r   r   Úpublic_bytes   sF    
ü
ÿ
þ
ÿ
þÿÿ
þÿ    ÿ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   B   s     ÿ ÿz"_X25519PublicKey._raw_public_bytes)NN)Ú__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   Q   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_keyU   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   Úexchangeb   s    
  ÿz_X25519PrivateKey.exchangec                 C   s€   |t jjks|t jjkrL|t jjk	s<|t jjk	s<t|t jƒsDtdƒ‚|  ¡ S |t j	krj|t jj
k	rjtdƒ‚| j |||| jd ¡S )NzcWhen using Raw both encoding and format must be Raw and encryption_algorithm must be NoEncryption()z0format must be PKCS8 when encoding is PEM or DER)r   r   r   r   ZPrivateFormatr2   ZNoEncryptionr   Ú_raw_private_bytesr   ZPKCS8r   Z_private_key_bytesr   )r   r   r   Zencryption_algorithmr   r   r   Úprivate_bytesj   s8    
ÿ
þ
ÿ
þ
ýÿÿ
þÿ    ÿ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   r0   r(   Zpkcs8r   r   r   r5   ‡   s    
    ýz$_X25519PrivateKey._raw_private_bytesN)r*   r+   r,   r   r1   r4   r6   r5   r   r   r   r   r-   O   s
   r-   )Z
__future__r   r   r   r   Zcryptographyr   Z*cryptography.hazmat.backends.openssl.utilsr   Zcryptography.hazmat.primitivesr   Z0cryptography.hazmat.primitives.asymmetric.x25519r   r	   r9   Zregister_interfaceÚobjectr   r-   r   r   r   r   Ú<module>   s   :