�
�3Tf�, � �0 � d dl mZ d dlZd dlmZmZmZ d dlmZm Z d dl
mZ d dlm
Z
ej rd dlmZ dd�Zdd �Zdd
�Zdd�Zdd�Z dd�Z dd�Z G d� d
e
j0 � Z G d� de
j4 � Zy)� )�annotationsN)�InvalidSignature�UnsupportedAlgorithm�_Reasons)�_calculate_digest_and_algorithm�_evp_pkey_derive)�
serialization)�ec)�Backendc �l � t | t j � st dt j
� �y )Nz/Unsupported elliptic curve signature algorithm.)�
isinstancer
�ECDSAr r � UNSUPPORTED_PUBLIC_KEY_ALGORITHM)�signature_algorithms �I/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ec.py�_check_signature_algorithmr s1 � � �)�2�8�8�4�"�=��5�5�
�
� 5� c �b � | j j |� }| j || j j k7 � | j j |� }|| j j k( rt d� �| j j s)| j j |� dk( rt d� �| j j |� }| j || j j k7 � | j j |� j d� }|S )Nz@ECDSA keys with explicit parameters are unsupported at this timer �ascii)
�_lib�EC_KEY_get0_group�openssl_assert�_ffi�NULL�EC_GROUP_get_curve_name� NID_undef�
ValueError�CRYPTOGRAPHY_IS_LIBRESSL�EC_GROUP_get_asn1_flag�
OBJ_nid2sn�string�decode)�backend�ec_key�group�nid�
curve_name�sns r �_ec_key_curve_snr) # s� � ��L�L�*�*�6�2�E����5�G�L�L�$5�$5�5�6�
�,�,�
.�
.�u�
5�C� �g�l�l�$�$�$��N�
�
�
�L�L�1�1��L�L�/�/��6�!�;��N�
�
� ���(�(��-�J����:����):�):�:�;� ��� � �Z� (� /� /�� 8�B�
�Ir c �d � | j j || j j � y)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 �EC_KEY_set_asn1_flag�OPENSSL_EC_NAMED_CURVE)r# �ec_cdatas r �_mark_asn1_named_ec_curver. A s% � � �L�L�%�%��'�,�,�5�5�r c �^ � | j j |� }| j || j j k7 � | j j |� }| j || j j k7 � | j j
||� rt d� �y )Nz;Cannot load an EC public key where the point is at infinity)r �EC_KEY_get0_public_keyr r r r �EC_POINT_is_at_infinityr )r# r- �pointr% s r �_check_key_infinityr3 M s� � ��L�L�/�/��9�E����5�G�L�L�$5�$5�5�6��L�L�*�*�8�4�E����5�G�L�L�$5�$5�5�6��|�|�+�+�E�5�9��I�
�
� :r c � � t j | � S # t $ r t |� d�t j
� �w xY w)Nz" is not a supported elliptic curve)r
�_CURVE_TYPES�KeyErrorr r �UNSUPPORTED_ELLIPTIC_CURVE)r# r( s r �_sn_to_elliptic_curver8 X sI � �
����r�"�$�$���
�"��d�4�5��/�/�
�
�
�s � �'A �_EllipticCurvePrivateKeyc � � | j j |j � }| j |dkD � | j j d|� }| j j dd� }| j j
d|t |� |||j � }| j |dk( � | j j |� d |d S )Nr zunsigned char[]zunsigned int[]� ) r �
ECDSA_size�_ec_keyr r �new�
ECDSA_sign�len�buffer)r# �private_key�data�max_size�sigbuf�
siglen_ptr�ress r �_ecdsa_sig_signrH b s� � � �|�|�&�&�{�':�':�;�H����8�a�<�(�
�\�\�
�
�/��
:�F����!�!�"2�A�6�J�
�,�,�
!�
!� �4��T��F�J��0C�0C��C� ���3�!�8�$��<�<���v�&���A��7�7r �_EllipticCurvePublicKeyc � � | j j d|t |� |t |� |j � }|dk7 r| j � t
�y )Nr r; )r �ECDSA_verifyr@ r= �_consume_errorsr )r# �
public_key� signaturerC rG s r �_ecdsa_sig_verifyrO q sS � � �,�,�
#�
#� �4��T��I�s�9�~�z�7I�7I��C� �a�x����!��� r c � � e Zd Zd
d�Zedd�� Zedd�� Z d
d�Zdd�Zdd�Z dd�Z
dd�Zy )r9 c � � || _ || _ || _ t ||� }t ||� | _ t
||� t ||� y �N��_backendr= � _evp_pkeyr) r8 �_curver. r3 ��selfr# �ec_key_cdata�evp_pkeyr( s r �__init__z!_EllipticCurvePrivateKey.__init__� �E � ���
�#���!���
�g�|�
4��+�G�R�8���!�'�<�8��G�\�2r c � � | j S rR �rV �rX s r �curvez_EllipticCurvePrivateKey.curve� � � ��{�{�r c �. � | j j S rR �r` �key_sizer_ s r rd z!_EllipticCurvePrivateKey.key_size� � � ��z�z�"�"�"r c �4 � | j j || j � st dt j
� �|j j | j j k7 rt d� �t | j | j |� S )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve)
rT �+elliptic_curve_exchange_algorithm_supportedr` r r �UNSUPPORTED_EXCHANGE_ALGORITHM�namer r rU )rX � algorithm�peer_public_keys r �exchangez!_EllipticCurvePrivateKey.exchange� s� � �
�M�M�E�E��4�:�:�
� '�C��7�7��
�
� � �%�%������8��D��
� ��
�
�t�~�~��O�Or c � � | j j j | j � }| j j || j j
j k7 � | j j j |� }| j j |� }| j j j | j � }| j j || j j
j k7 � | j j j ||� }| j j |dk( � | j j |� }t | j ||� S �Nr; )
rT r r r= r r r r �_ec_key_new_by_curve_nidr0 �EC_KEY_set_public_key�_ec_cdata_to_evp_pkeyrI )rX r% � curve_nid�
public_ec_keyr2 rG rZ s r rM z#_EllipticCurvePrivateKey.public_key� s � ��
�
�"�"�4�4�T�\�\�B���
�
�$�$�U�d�m�m�.@�.@�.E�.E�%E�F��M�M�&�&�>�>�u�E� ��
�
�>�>�y�I�
��
�
�"�"�9�9�$�,�,�G���
�
�$�$�U�d�m�m�.@�.@�.E�.E�%E�F��m�m� � �6�6�}�e�L���
�
�$�$�S�A�X�.��=�=�6�6�}�E��&�t�}�}�m�X�N�Nr c � � | j j j | j � }| j j |� }t j || j � j � �� S )N)�
private_value�public_numbers) rT r �EC_KEY_get0_private_keyr= �
_bn_to_intr
�EllipticCurvePrivateNumbersrM rv )rX �bnru s r �private_numbersz(_EllipticCurvePrivateKey.private_numbers� s] � �
�]�]�
�
�
7�
7����
E���
�
�0�0��4�
��-�-�'��?�?�,�;�;�=�
�
r c �j � | j j |||| | j | j � S rR )rT �_private_key_bytesrU r= )rX �encoding�format�encryption_algorithms r �
private_bytesz&_EllipticCurvePrivateKey.private_bytes� s5 � � �}�}�/�/��� ���N�N��L�L�
�
r c �x � t |� t ||j � \ }}t | j | |� S rR )r r rj rH rT )rX rC r �_s r �signz_EllipticCurvePrivateKey.sign� s< |