U
    e]                     @   s   d dl mZmZmZ d dlmZmZ d dlmZ d dl	m
Z
mZmZmZ eeG dd deZee
G dd deZd	S )
    )absolute_importdivisionprint_function)
exceptionsutils)serialization)Ed25519PrivateKeyEd25519PublicKey_ED25519_KEY_SIZE_ED25519_SIG_SIZEc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_Ed25519PublicKeyc                 C   s   || _ || _d S N_backend	_evp_pkeyselfZbackendZevp_pkey r   N/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ed25519.py__init__   s    z_Ed25519PublicKey.__init__c                 C   st   |t jjks|t jjkr@|t jjk	s0|t jjk	r8td|  S |t jkr^|t jjk	r^td| j	||| | j
d S )Nz3When using Raw both encoding and format must be Rawz?format must be SubjectPublicKeyInfo when encoding is PEM or DER)r   EncodingRawPublicFormat
ValueError_raw_public_bytes_PEM_DERZSubjectPublicKeyInfor   Z_public_key_bytesr   )r   encodingformatr   r   r   public_bytes   s4    




    z_Ed25519PublicKey.public_bytesc                 C   sp   | j jdt}| j jdt}| j j| j||}| j |dk | j |d tk | j j|td d  S Nzunsigned char []size_t *   r   )	r   _ffinewr
   _libEVP_PKEY_get_raw_public_keyr   openssl_assertbufferr   bufbuflenresr   r   r   r   0   s      z#_Ed25519PublicKey._raw_public_bytesc                 C   s   | j j }| j || j jjk | j j|| j jj}| j j|| j jj| j jj| j jj| j	}| j |dk | j j
||t||t|}|dkr| j   tjd S )Nr!   )r   r$   Cryptography_EVP_MD_CTX_newr&   r"   NULLgcCryptography_EVP_MD_CTX_freeZEVP_DigestVerifyInitr   ZEVP_DigestVerifylenZ_consume_errorsr   ZInvalidSignature)r   Z	signaturedata
evp_md_ctxr+   r   r   r   verify:   s0            
z_Ed25519PublicKey.verifyN)__name__
__module____qualname__r   r   r   r3   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 )_Ed25519PrivateKeyc                 C   s   || _ || _d S r   r   r   r   r   r   r   O   s    z_Ed25519PrivateKey.__init__c                 C   sz   | j jdt}| j jdt}| j j| j||}| j |dk | j |d tk | j j|d d  }| j 	|S r   )
r   r"   r#   r
   r$   r%   r   r&   r'   Zed25519_load_public_bytes)r   r)   r*   r+   r   r   r   r   
public_keyS   s      z_Ed25519PrivateKey.public_keyc                 C   s   | j j }| j || j jjk | j j|| j jj}| j j|| j jj| j jj| j jj| j	}| j |dk | j j
dt}| j j
dt|}| j j||||t|}| j |dk | j |d tk | j j||d d d  S )Nr!   zunsigned char[]r    r   )r   r$   r,   r&   r"   r-   r.   r/   ZEVP_DigestSignInitr   r#   r   r0   ZEVP_DigestSignr'   )r   r1   r2   r+   r)   r*   r   r   r   sign^   s4            z_Ed25519PrivateKey.signc                 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PrivateFormat
isinstanceZNoEncryptionr   _raw_private_bytesr   ZPKCS8r   Z_private_key_bytesr   )r   r   r   Zencryption_algorithmr   r   r   private_bytesr   s8    





    z _Ed25519PrivateKey.private_bytesc                 C   sp   | j jdt}| j jdt}| j j| j||}| j |dk | j |d tk | j j|td d  S r   )	r   r"   r#   r
   r$   ZEVP_PKEY_get_raw_private_keyr   r&   r'   r(   r   r   r   r;      s      z%_Ed25519PrivateKey._raw_private_bytesN)r4   r5   r6   r   r8   r9   r<   r;   r   r   r   r   r7   M   s
   r7   N)Z
__future__r   r   r   Zcryptographyr   r   Zcryptography.hazmat.primitivesr   Z1cryptography.hazmat.primitives.asymmetric.ed25519r   r	   r
   r   Zregister_interfaceobjectr   r7   r   r   r   r   <module>   s   >