3
K^.1                 @   s  d dl mZmZmZ d dlmZ d dlmZmZm	Z	 d dl
mZmZmZ d dlmZmZ d dlmZmZmZ dd Zd	d
 Zdd Zdd Zdd Zdd ZejeG dd deZejeG dd deZejejG dd deZ ejej!G dd deZ"dS )    )absolute_importdivisionprint_function)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashesserialization)AsymmetricSignatureContextAsymmetricVerificationContextecc             C   s   t | tjstdtjd S )Nz/Unsupported elliptic curve signature algorithm.)
isinstancer   ZECDSAr   r   Z UNSUPPORTED_PUBLIC_KEY_ALGORITHM)signature_algorithm r   K/tmp/pip-unpacked-wheel-vvkwn1hz/cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithm   s    r   c             C   s   | j j|}| j|| jjk | j j|}|| j jkr>td| j jr^| j j	|dkr^td| j j
|}| j|| jjk | jj|jd}|S )Nz;ECDSA keys with unnamed curves are unsupported at this timer   ascii)_libEC_KEY_get0_groupopenssl_assert_ffiNULLEC_GROUP_get_curve_nameZ	NID_undefNotImplementedErrorZ#CRYPTOGRAPHY_OPENSSL_110_OR_GREATERZEC_GROUP_get_asn1_flagZ
OBJ_nid2snstringdecode)backendZec_keygroupnidZ
curve_namesnr   r   r   _ec_key_curve_sn   s    r$   c             C   s   | j j|| j j dS )z
    Set the named curve flag on the EC_KEY. This causes OpenSSL to
    serialize EC keys along with their curve OID which makes
    deserialization easier.
    N)r   ZEC_KEY_set_asn1_flagZOPENSSL_EC_NAMED_CURVE)r    Zec_cdatar   r   r   _mark_asn1_named_ec_curve<   s    r%   c             C   s8   yt j|  S  tk
r2   tdj|tjY nX d S )Nz${} is not a supported elliptic curve)r   Z_CURVE_TYPESKeyErrorr   formatr   ZUNSUPPORTED_ELLIPTIC_CURVE)r    r#   r   r   r   _sn_to_elliptic_curveH   s    r(   c             C   sz   | j j|j}| j|dk | jjd|}| jjdd}| j jd|t||||j}| j|dk | jj|d |d  S )Nr   zunsigned char[]zunsigned int[]   )	r   Z
ECDSA_size_ec_keyr   r   newZ
ECDSA_signlenbuffer)r    private_keydatamax_sizeZsigbufZ
siglen_ptrresr   r   r   _ecdsa_sig_signR   s    r2   c             C   s8   | j jd|t||t||j}|dkr4| j  td S )Nr   r)   )r   ZECDSA_verifyr,   r*   Z_consume_errorsr   )r    
public_key	signaturer/   r1   r   r   r   _ecdsa_sig_verify_   s
    r5   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_ECDSASignatureContextc             C   s   || _ || _tj||| _d S )N)_backend_private_keyr   Hash_digest)selfr    r.   	algorithmr   r   r   __init__j   s    z_ECDSASignatureContext.__init__c             C   s   | j j| d S )N)r:   update)r;   r/   r   r   r   r>   o   s    z_ECDSASignatureContext.updatec             C   s   | j j }t| j| j|S )N)r:   finalizer2   r7   r8   )r;   digestr   r   r   r?   r   s    
z_ECDSASignatureContext.finalizeN)__name__
__module____qualname__r=   r>   r?   r   r   r   r   r6   h   s   r6   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_ECDSAVerificationContextc             C   s$   || _ || _|| _tj||| _d S )N)r7   _public_key
_signaturer   r9   r:   )r;   r    r3   r4   r<   r   r   r   r=   z   s    z"_ECDSAVerificationContext.__init__c             C   s   | j j| d S )N)r:   r>   )r;   r/   r   r   r   r>      s    z _ECDSAVerificationContext.updatec             C   s"   | j j }t| j| j| j| d S )N)r:   r?   r5   r7   rE   rF   )r;   r@   r   r   r   verify   s    
z _ECDSAVerificationContext.verifyN)rA   rB   rC   r=   r>   rG   r   r   r   r   rD   x   s   rD   c               @   sZ   e Zd Zdd ZejdZedd Zdd Z	dd	 Z
d
d Zdd Zdd Zdd ZdS )_EllipticCurvePrivateKeyc             C   s6   || _ || _|| _t||}t||| _t|| d S )N)r7   r*   	_evp_pkeyr$   r(   _curver%   )r;   r    ec_key_cdataevp_pkeyr#   r   r   r   r=      s    
z!_EllipticCurvePrivateKey.__init__rJ   c             C   s   | j jS )N)curvekey_size)r;   r   r   r   rN      s    z!_EllipticCurvePrivateKey.key_sizec             C   s(   t   t| t|j t| j| |jS )N)r   r   r
   r<   r6   r7   )r;   r   r   r   r   signer   s
    
z_EllipticCurvePrivateKey.signerc             C   s   | j j|| jstdtj|jj| jjkr4td| j jj	| j
}| j jj|d d }| j j|dk | j jjd|}| j jj|j
}| j jj|||| j
| j jj}| j j|dk | j jj|d | S )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve      r   z	uint8_t[])r7   Z+elliptic_curve_exchange_algorithm_supportedrM   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMname
ValueErrorr   r   r*   ZEC_GROUP_get_degreer   r   r+   EC_KEY_get0_public_keyZECDH_compute_keyr   r-   )r;   r<   Zpeer_public_keyr!   Zz_lenZz_bufZpeer_keyrr   r   r   exchange   s$    
z!_EllipticCurvePrivateKey.exchangec             C   s   | j jj| j}| j j|| j jjk | j jj|}| j jj|}| j j|| j jjk | j jj	|| j jj
}| j jj| j}| j j|| j jjk | j jj||}| j j|dk | j j|}t| j ||S )Nr)   )r7   r   r   r*   r   r   r   r   ZEC_KEY_new_by_curve_namegcZEC_KEY_freerT   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)r;   r!   Z	curve_nidZpublic_ec_keypointr1   rL   r   r   r   r3      s    z#_EllipticCurvePrivateKey.public_keyc             C   s2   | j jj| j}| j j|}tj|| j j dS )N)private_valuepublic_numbers)	r7   r   ZEC_KEY_get0_private_keyr*   
_bn_to_intr   ZEllipticCurvePrivateNumbersr3   r[   )r;   ZbnrZ   r   r   r   private_numbers   s
    z(_EllipticCurvePrivateKey.private_numbersc             C   s   | j j|||| j| jS )N)r7   Z_private_key_bytesrI   r*   )r;   encodingr'   Zencryption_algorithmr   r   r   private_bytes   s    z&_EllipticCurvePrivateKey.private_bytesc             C   s*   t | t| j||j\}}t| j| |S )N)r   r	   r7   
_algorithmr2   )r;   r/   r   r<   r   r   r   sign   s    z_EllipticCurvePrivateKey.signN)rA   rB   rC   r=   r   read_only_propertyrM   propertyrN   rO   rV   r3   r]   r_   ra   r   r   r   r   rH      s   	
	rH   c               @   sR   e Zd Zdd ZejdZedd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )rX   c             C   s6   || _ || _|| _t||}t||| _t|| d S )N)r7   r*   rI   r$   r(   rJ   r%   )r;   r    rK   rL   r#   r   r   r   r=      s    
z _EllipticCurvePublicKey.__init__rJ   c             C   s   | j jS )N)rM   rN   )r;   r   r   r   rN      s    z _EllipticCurvePublicKey.key_sizec             C   s6   t   tjd| t| t|j t| j| ||jS )Nr4   )r   r   _check_bytesr   r
   r<   rD   r7   )r;   r4   r   r   r   r   verifier  s    
z _EllipticCurvePublicKey.verifierc       
      C   s   | j j| j\}}| j jj| j}| j j|| j jjk | j j Z}| j jj	|}| j jj	|}||||||}| j j|dk | j j
|}| j j
|}	W d Q R X tj||	| jdS )Nr)   )xyrM   )r7   Z _ec_key_determine_group_get_funcr*   r   rT   r   r   r   _tmp_bn_ctxZ
BN_CTX_getr\   r   ZEllipticCurvePublicNumbersrJ   )
r;   Zget_funcr!   rY   bn_ctxZbn_xZbn_yr1   rf   rg   r   r   r   r[     s    z&_EllipticCurvePublicKey.public_numbersc       	      C   s  |t jjkr| jjj}n|t jjks(t| jjj}| jjj	| j
}| jj|| jjjk | jjj| j
}| jj|| jjjk | jj l}| jjj|||| jjjd|}| jj|dk | jjjd|}| jjj||||||}| jj||k W d Q R X | jjj|d d  S )Nr   zchar[])r   PublicFormatCompressedPointr7   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointAssertionErrorZPOINT_CONVERSION_UNCOMPRESSEDr   r*   r   r   r   rT   rh   ZEC_POINT_point2octr+   r-   )	r;   r'   
conversionr!   rY   ri   buflenbufr1   r   r   r   _encode_point"  s"    
z%_EllipticCurvePublicKey._encode_pointc             C   s   |t jjkrtd|t jjks8|t jjks8|t jjkrj|t jjk	sX|t jjt jjfkr`td| j|S | j	j
||| | jd S d S )Nz1EC public keys do not support PKCS1 serializationzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r   rj   ZPKCS1rS   EncodingZX962rk   rl   rq   r7   Z_public_key_bytesrI   )r;   r^   r'   r   r   r   public_bytes:  s&    
z$_EllipticCurvePublicKey.public_bytesc             C   s0   t | t| j||j\}}t| j| || d S )N)r   r	   r7   r`   r5   )r;   r4   r/   r   r<   r   r   r   rG   [  s    z_EllipticCurvePublicKey.verifyN)rA   rB   rC   r=   r   rb   rM   rc   rN   re   r[   rq   rs   rG   r   r   r   r   rX      s   	

!rX   N)#
__future__r   r   r   Zcryptographyr   Zcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr	   r
   r   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r$   r%   r(   r2   r5   Zregister_interfaceobjectr6   rD   Z(EllipticCurvePrivateKeyWithSerializationrH   Z'EllipticCurvePublicKeyWithSerializationrX   r   r   r   r   <module>   s&    
	e