3 y�_5/ � @ s d dl mZmZmZ d dlmZ d dlmZmZm Z d dl mZmZm Z d dlmZmZ d dlmZmZmZ dd� Zd d � Zdd� Zd d� Zdd� Zdd� Zeje�G dd� de��Zeje�G dd� de��Zejej�G dd� de��Z ejej!�G dd� de��Z"dS )� )�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 | tj�stdtj��d S )Nz/Unsupported elliptic curve signature algorithm.)� isinstancer ZECDSAr r Z UNSUPPORTED_PUBLIC_KEY_ALGORITHM)�signature_algorithm� r �/usr/lib64/python3.6/ec.py�_check_signature_algorithm s r c C s� | j j|�}| j|| jjk� | j j|�}|| j jkr>td��| j jr^| j j |�dkr^td��| j j |�}| j|| jjk� | jj|�jd�}|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_102U_OR_GREATERZEC_GROUP_get_asn1_flagZ OBJ_nid2sn�string�decode)�backendZec_key�groupZnidZ curve_name�snr r r �_ec_key_curve_sn" s r# c C s | j j|| j j� dS )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 ZEC_KEY_set_asn1_flagZOPENSSL_EC_NAMED_CURVE)r Zec_cdatar r r �_mark_asn1_named_ec_curve@ s r$ c C s8 yt j| � S tk r2 tdj|�tj��Y nX d S )Nz${} is not a supported elliptic curve)r Z_CURVE_TYPES�KeyErrorr �formatr ZUNSUPPORTED_ELLIPTIC_CURVE)r r" r r r �_sn_to_elliptic_curveL s r' c C sz | j j|j�}| j|dk� | jjd|�}| jjdd�}| j jd|t|�|||j�}| j|dk� | jj|�d |d � S )Nr zunsigned char[]zunsigned int[]� ) r Z ECDSA_size�_ec_keyr r �newZ ECDSA_sign�len�buffer)r �private_key�dataZmax_sizeZsigbufZ siglen_ptr�resr r r �_ecdsa_sig_signV s r0 c C s8 | j jd|t|�|t|�|j�}|dkr4| j� t�d S )Nr r( )r ZECDSA_verifyr+ r) Z_consume_errorsr )r � public_key� signaturer. r/ r r r �_ecdsa_sig_verifyc s r3 c @ s$ e Zd Zdd� Zdd� Zdd� ZdS )�_ECDSASignatureContextc C s || _ || _tj||�| _d S )N)�_backend�_private_keyr �Hash�_digest)�selfr r- � algorithmr r r �__init__n s z_ECDSASignatureContext.__init__c C s | j j|� d S )N)r8 �update)r9 r. r r r r<