ó
/<õ\c           @` s  d  d l  m Z m Z m Z d  d l m Z d  d l m Z m Z d  d l	 m
 Z
 d  d l m Z d „  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   UnsupportedAlgorithmt   _Reasons(   t   serialization(   t   dhc         C` sË   | j  } | j } | j |  ƒ } | j | | j k ƒ | j | | j ƒ } | j rÇ | j d ƒ } | j	 |  | j | | j ƒ | j
 | d ƒ } | j | | j | | j ƒ } | j | d k ƒ n  | S(   Ns	   BIGNUM **i    i   (   t   _libt   _ffit   DHparams_dupt   openssl_assertt   NULLt   gct   DH_freet"   CRYPTOGRAPHY_OPENSSL_LESS_THAN_102t   newt   DH_get0_pqgt   BN_dupt   DH_set0_pqg(   t   dh_cdatat   backendt   libt   ffit   param_cdatat   qt   q_dupt   res(    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   _dh_params_dup   s    			c         C` s   t  |  | ƒ } t | | ƒ S(   N(   R   t   _DHParameters(   R   R   R   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   _dh_cdata_to_parameters   s    R   c           B` s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C` s   | |  _  | |  _ d  S(   N(   t   _backendt	   _dh_cdata(   t   selfR   R   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   __init__&   s    	c         C` s  |  j  j j d ƒ } |  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 ƒ | d |  j  j j k rÆ d  } n |  j  j	 | d ƒ } t
 j d |  j  j	 | d ƒ d |  j  j	 | d ƒ d | ƒ S(   Ns	   BIGNUM **i    t   pt   gR   (   R   R	   R   R   R   R    R   R   t   Nonet
   _bn_to_intR   t   DHParameterNumbers(   R!   R#   R$   R   t   q_val(    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   parameter_numbers*   s    ##		c         C` s   |  j  j |  ƒ S(   N(   R   t   generate_dh_private_key(   R!   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   generate_private_key;   s    c         C` sÀ   | t  j j k	 r! t d ƒ ‚ n  |  j j j s§ |  j j j d ƒ } |  j j j	 |  j
 |  j j j | |  j j j ƒ | d |  j j j k r§ t d t j ƒ ‚ q§ n  |  j j | | |  j
 ƒ S(   Ns%   Only PKCS3 serialization is supporteds	   BIGNUM **i    s'   DH X9.42 serialization is not supported(   R   t   ParameterFormatt   PKCS3t
   ValueErrorR   R   t   Cryptography_HAS_EVP_PKEY_DHXR	   R   R   R    R   R   R   t   UNSUPPORTED_SERIALIZATIONt   _parameter_bytes(   R!   t   encodingt   formatR   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   parameter_bytes>   s"    	(   t   __name__t
   __module__R"   R)   R+   R4   (    (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyR   $   s   			c         C` s<   | j  } | j |  d j | j | j ƒ ƒ t d ƒ ‚ d  S(   Ni    s.   Public key value is invalid for this exchange.(   R   R   t   _lib_reason_matcht
   ERR_LIB_DHt   DH_R_INVALID_PUBKEYR.   (   t   errorsR   R   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   _handle_dh_compute_key_errorU   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#   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   _get_dh_num_bitsa   s    	t   _DHPrivateKeyc           B` sM   e  Z d  „  Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C` s7   | |  _  | |  _ | |  _ |  j  j j | ƒ |  _ d  S(   N(   R   R    t	   _evp_pkeyR   t   DH_sizet   _key_size_bytes(   R!   R   R   t   evp_pkey(    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyR"   l   s    			c         C` s   t  |  j |  j ƒ S(   N(   R=   R   R    (   R!   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   key_sizer   s    c         C` sè  |  j  j j d ƒ } |  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 ƒ | d |  j  j j k rÆ d  } n |  j  j	 | d ƒ } |  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 | ƒ d |  j  j	 | d ƒ ƒ d	 |  j  j	 | d ƒ ƒ S(
   Ns	   BIGNUM **i    t   public_numbersR)   R#   R$   R   t   yt   x(   R   R	   R   R   R   R    R   R   R%   R&   t   DH_get0_keyR   t   DHPrivateNumberst   DHPublicNumbersR'   (   R!   R#   R$   R   R(   t   pub_keyt   priv_key(    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   private_numbersv   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   s    (   R   R	   R   RA   R   RG   R    R   R   t   DH_compute_keyt   _consume_errorsR;   t   buffert   len(   R!   t   peer_public_keyt   bufRJ   R   R:   t   keyt   pad(    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   exchange’   s$    #c         C` s	  t  |  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 ƒ |  j j | ƒ } t |  j | | ƒ S(   Ns	   BIGNUM **i    i   (   R   R    R   R	   R   R   RG   R   R   R   t   DH_set0_keyt   _dh_cdata_to_evp_pkeyt   _DHPublicKey(   R!   R   RJ   t   pub_key_dupR   RB   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt
   public_key­   s    #c         C` s   t  |  j |  j ƒ S(   N(   R   R    R   (   R!   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt
   parameters½   s    c         C` sÉ   | t  j j k	 r! t d ƒ ‚ n  |  j j j s§ |  j j j d ƒ } |  j j j	 |  j
 |  j j j | |  j j j ƒ | d |  j j j k r§ t d t j ƒ ‚ q§ n  |  j j | | | |  j |  j
 ƒ S(   Ns0   DH private keys support only PKCS8 serializations	   BIGNUM **i    s'   DH X9.42 serialization is not supported(   R   t   PrivateFormatt   PKCS8R.   R   R   R/   R	   R   R   R    R   R   R   R0   t   _private_key_bytesR?   (   R!   R2   R3   t   encryption_algorithmR   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   private_bytesÀ   s&    	(
   R5   R6   R"   t   propertyRC   RL   RU   RZ   R[   R`   (    (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyR>   j   s   					RX   c           B` s;   e  Z d  „  Z e d „  ƒ Z d „  Z d „  Z d „  Z RS(   c         C` s7   | |  _  | |  _ | |  _ t |  j  |  j ƒ |  _ d  S(   N(   R   R    R?   R=   t   _key_size_bits(   R!   R   R   RB   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyR"   Û   s    			c         C` s   |  j  S(   N(   Rb   (   R!   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyRC   á   s    c      	   C` s—  |  j  j j d ƒ } |  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 ƒ | d |  j  j j k rÆ d  } n |  j  j	 | d ƒ } |  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 | ƒ d |  j  j	 | d ƒ ƒ S(   Ns	   BIGNUM **i    R)   R#   R$   R   RE   (   R   R	   R   R   R   R    R   R   R%   R&   RG   R   RI   R'   (   R!   R#   R$   R   R(   RJ   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyRD   å   s&    ##	#			c         C` s   t  |  j |  j ƒ S(   N(   R   R    R   (   R!   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyR[   ý   s    c         C` sÆ   | t  j j k	 r! t d ƒ ‚ n  |  j j j s§ |  j j j d ƒ } |  j j j	 |  j
 |  j j j | |  j j j ƒ | d |  j j j k r§ t d t j ƒ ‚ q§ n  |  j j | | |  |  j d  ƒ S(   Ns>   DH public keys support only SubjectPublicKeyInfo serializations	   BIGNUM **i    s'   DH X9.42 serialization is not supported(   R   t   PublicFormatt   SubjectPublicKeyInfoR.   R   R   R/   R	   R   R   R    R   R   R   R0   t   _public_key_bytesR?   R%   (   R!   R2   R3   R   (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   public_bytes   s&    	(   R5   R6   R"   Ra   RC   RD   R[   Rf   (    (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyRX   Ù   s
   			N(   t
   __future__R    R   R   t   cryptographyR   t   cryptography.exceptionsR   R   t   cryptography.hazmat.primitivesR   t)   cryptography.hazmat.primitives.asymmetricR   R   R   t   register_interfacet   DHParametersWithSerializationt   objectR   R;   R=   t   DHPrivateKeyWithSerializationR>   t   DHPublicKeyWithSerializationRX   (    (    (    sF   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/dh.pyt   <module>   s   		0			n