ó
Õ{PXc           @` sÓ   d  d l  m Z m Z m Z d  d l m Z d  d l m Z d „  Z e j	 e j
 ƒ d e f d „  ƒ  Yƒ Z d „  Z d „  Z e j	 e j ƒ d	 e f d
 „  ƒ  Yƒ Z e j	 e j ƒ d e f d „  ƒ  Yƒ Z d S(   i    (   t   absolute_importt   divisiont   print_function(   t   utils(   t   dhc         C` sY   | j  } | j } | j |  ƒ } | j | | j k ƒ | j | | j ƒ } t | | ƒ S(   N(   t   _libt   _ffit   DHparams_dupt   openssl_assertt   NULLt   gct   DH_freet   _DHParameters(   t   dh_cdatat   backendt   libt   ffit   param_cdata(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   _dh_cdata_to_parameters   s    		R   c           B` s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C` s   | |  _  | |  _ d  S(   N(   t   _backendt	   _dh_cdata(   t   selfR   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   __init__   s    	c         C` sÎ   |  j  j j d ƒ } |  j  j j d ƒ } |  j  j j |  j | |  j  j j | ƒ |  j  j | d |  j  j j k ƒ |  j  j | d |  j  j j k ƒ t j	 d |  j  j
 | d ƒ d |  j  j
 | d ƒ ƒ S(   Ns	   BIGNUM **i    t   pt   g(   R   R   t   newR   t   DH_get0_pqgR   R	   R   R   t   DHParameterNumberst
   _bn_to_int(   R   R   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   parameter_numbers   s    ##	c         C` s   |  j  j |  ƒ S(   N(   R   t   generate_dh_private_key(   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   generate_private_key(   s    (   t   __name__t
   __module__R   R   R   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyR      s   		c         C` sF   | j  } | j |  d d | j | j | j f k ƒ t d ƒ ‚ d  S(   Ni    i   s.   Public key value is invalid for this exchange.(   R   R   t
   ERR_LIB_DHt   DH_F_COMPUTE_KEYt   DH_R_INVALID_PUBKEYt
   ValueError(   t   errorsR   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   _handle_dh_compute_key_error,   s    	c         C` sh   |  j  j d ƒ } |  j j | | |  j  j |  j  j ƒ |  j | d |  j  j k ƒ |  j j | d ƒ S(   Ns	   BIGNUM **i    (   R   R   R   R   R	   R   t   BN_num_bits(   R   R   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   _get_dh_num_bits8   s    	t   _DHPrivateKeyc           B` sD   e  Z d  „  Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z RS(   c         C` s.   | |  _  | |  _ |  j  j j | ƒ |  _ d  S(   N(   R   R   R   t   DH_sizet   _key_size_bytes(   R   R   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyR   C   s    		c         C` s   t  |  j |  j ƒ S(   N(   R)   R   R   (   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   key_sizeH   s    c         C` sž  |  j  j j d ƒ } |  j  j j d ƒ } |  j  j j |  j | |  j  j j | ƒ |  j  j | d |  j  j j k ƒ |  j  j | d |  j  j j k ƒ |  j  j j d ƒ } |  j  j j d ƒ } |  j  j j |  j | | ƒ |  j  j | d |  j  j j k ƒ |  j  j | d |  j  j j k ƒ t	 j
 d t	 j d t	 j d |  j  j | d ƒ d |  j  j | d ƒ ƒ d |  j  j | d ƒ ƒ d |  j  j | d ƒ ƒ S(	   Ns	   BIGNUM **i    t   public_numbersR   R   R   t   yt   x(   R   R   R   R   R   R   R	   R   t   DH_get0_keyR   t   DHPrivateNumberst   DHPublicNumbersR   R   (   R   R   R   t   pub_keyt   priv_key(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   private_numbersL   s$    ####			c         C` s,  |  j  j j d |  j ƒ } |  j  j j d ƒ } |  j  j j | j | |  j  j j ƒ |  j  j | d |  j  j j k ƒ |  j  j j	 | | d |  j ƒ } | d k rÅ |  j  j
 ƒ  } t | |  j  ƒ S|  j  j | d k ƒ |  j  j j | ƒ |  } |  j t | ƒ } | d k r$d | | } n  | Sd  S(   Ns   unsigned char[]s	   BIGNUM **i    iÿÿÿÿi   t    (   R   R   R   R,   R   R1   R   R	   R   t   DH_compute_keyt   _consume_errorsR'   t   buffert   len(   R   t   peer_public_keyt   bufR4   t   resR&   t   keyt   pad(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   exchangec   s$    #c         C` s7  |  j  j j |  j ƒ } |  j  j | |  j  j j k ƒ |  j  j j | |  j  j j ƒ } |  j  j j	 d ƒ } |  j  j j
 |  j | |  j  j j ƒ |  j  j | d |  j  j j k ƒ |  j  j j | d ƒ } |  j  j | |  j  j j k ƒ |  j  j j | | |  j  j j ƒ } |  j  j | d k ƒ t |  j  | ƒ S(   Ns	   BIGNUM **i    i   (   R   R   R   R   R   R   R	   R
   R   R   R1   t   BN_dupt   DH_set0_keyt   _DHPublicKey(   R   R   R4   t   pub_key_dupR>   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt
   public_key~   s    #c         C` s   t  |  j |  j ƒ S(   N(   R   R   R   (   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt
   parameters“   s    (	   R    R!   R   t   propertyR-   R6   RA   RF   RG   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyR*   A   s   				RD   c           B` s2   e  Z d  „  Z e d „  ƒ Z d „  Z d „  Z RS(   c         C` s.   | |  _  | |  _ t |  j  |  j ƒ |  _ d  S(   N(   R   R   R)   t   _key_size_bits(   R   R   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyR   ™   s    		c         C` s   |  j  S(   N(   RI   (   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyR-   ž   s    c      	   C` sM  |  j  j j d ƒ } |  j  j j d ƒ } |  j  j j |  j | |  j  j j | ƒ |  j  j | d |  j  j j k ƒ |  j  j | d |  j  j j k ƒ |  j  j j d ƒ } |  j  j j |  j | |  j  j j ƒ |  j  j | d |  j  j j k ƒ t	 j
 d t	 j d |  j  j | d ƒ d |  j  j | d ƒ ƒ d |  j  j | d ƒ ƒ S(   Ns	   BIGNUM **i    R   R   R   R/   (   R   R   R   R   R   R   R	   R   R1   R   R3   R   R   (   R   R   R   R4   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyR.   ¢   s    ###		c         C` s   t  |  j |  j ƒ S(   N(   R   R   R   (   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyRG   µ   s    (   R    R!   R   RH   R-   R.   RG   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyRD   —   s   		N(   t
   __future__R    R   R   t   cryptographyR   t)   cryptography.hazmat.primitives.asymmetricR   R   t   register_interfacet   DHParametersWithSerializationt   objectR   R'   R)   t   DHPrivateKeyWithSerializationR*   t   DHPublicKeyWithSerializationRD   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dh.pyt   <module>   s   				U