o
    
þðc‘  ã                   @   sj   d dl Z d dlmZ d dlmZ d dlmZmZ e jr!d dl	m
Z
 dZG dd„ deƒZG d	d
„ d
eƒZdS )é    N)Ú_evp_pkey_derive)Úserialization)ÚX25519PrivateKeyÚX25519PublicKey)ÚBackendé    c                   @   s>   e Zd Zddd„Zdejdejdefdd	„Zdefd
d„Z	dS )Ú_X25519PublicKeyÚbackendr   c                 C   ó   || _ || _d S ©N©Ú_backendÚ	_evp_pkey©Úselfr	   Úevp_pkey© r   úX/opt/certbot/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/x25519.pyÚ__init__   ó   
z_X25519PublicKey.__init__ÚencodingÚformatÚreturnc                 C   sV   |t jju s|t jju r |t jjus|t jjurtdƒ‚|  ¡ S | j ||| | jd ¡S )Nz3When using Raw both encoding and format must be Raw)	r   ÚEncodingÚRawÚPublicFormatÚ
ValueErrorÚ_raw_public_bytesr   Ú_public_key_bytesr   )r   r   r   r   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Ú_libÚEVP_PKEY_get1_tls_encodedpointr   Úopenssl_assertÚNULLÚgcÚOPENSSL_freeÚbuffer)r   ÚucharppÚresÚdatar   r   r   r   1   s   ÿÿz"_X25519PublicKey._raw_public_bytesN©r	   r   )
Ú__name__Ú
__module__Ú__qualname__r   r   r   r   Úbytesr   r   r   r   r   r   r      s    
þý
ür   c                   @   sd   e Zd Zddd„Zdefdd„Zdedefd	d
„Zdej	dej
dejdefdd„Zdefdd„ZdS )Ú_X25519PrivateKeyr	   r   c                 C   r
   r   r   r   r   r   r   r   ?   r   z_X25519PrivateKey.__init__r   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"   Úi2d_PUBKEY_bior   r$   Úd2i_PUBKEY_bior    r%   r&   ÚEVP_PKEY_freer   )r   Úbior*   r   r   r   r   Ú
public_keyC   s   

ÿ
ÿz_X25519PrivateKey.public_keyÚpeer_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   r9   r   r   r   ÚexchangeP   s   
z_X25519PrivateKey.exchanger   r   Úencryption_algorithmc                 C   sd   |t jju s|t jju r&|t jjus|t jjust|t jƒs"t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   ÚPrivateFormatr:   ÚNoEncryptionr   Ú_raw_private_bytesr   Ú_private_key_bytesr   )r   r   r   r=   r   r   r   Úprivate_bytesV   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   r2   é0   )r   r3   r"   Úi2d_PKCS8PrivateKey_bior   r    r%   r$   Ú_read_mem_bioÚlenÚ_X25519_KEY_SIZE)r   r7   r*   Úpkcs8r   r   r   r@   r   s   
ù	z$_X25519PrivateKey._raw_private_bytesNr,   )r-   r.   r/   r   r   r8   r0   r<   r   r   r>   ÚKeySerializationEncryptionrB   r@   r   r   r   r   r1   >   s    
þýü
ûr1   )ÚtypingÚ*cryptography.hazmat.backends.openssl.utilsr   Úcryptography.hazmat.primitivesr   Ú0cryptography.hazmat.primitives.asymmetric.x25519r   r   ÚTYPE_CHECKINGÚ,cryptography.hazmat.backends.openssl.backendr   rG   r   r1   r   r   r   r   Ú<module>   s   )