๓
KึVc           @` sL  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 d  d l m Z m Z d  d l m Z m Z m Z d   Z d   Z d	   Z d
   Z e j e  d e f d     Y Z e j e  d e f d     Y 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   InvalidSignaturet   UnsupportedAlgorithmt   _Reasons(   t   _truncate_digest(   t   hashest   serialization(   t   AsymmetricSignatureContextt   AsymmetricVerificationContextt   ecc   
      C` s   | j  } | j } | j |   } | j   c } | j |  } | j | | j k  | j | | |  } | j | d k  | j |  }	 Wd QXt	 | |	  S(   s๒   
    This function truncates digests that are longer than a given elliptic
    curve key's length so they can be signed. Since elliptic curve keys are
    much shorter than RSA keys many digests (e.g. SHA-512) may require
    truncation.
    i   N(
   t   _libt   _ffit   EC_KEY_get0_groupt   _tmp_bn_ctxt
   BN_CTX_gett   openssl_assertt   NULLt   EC_GROUP_get_ordert   BN_num_bitsR   (
   t   ec_key_cdatat   digestt   backendR   R   t   groupt   bn_ctxt   ordert   rest
   order_bits(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   _truncate_digest_for_ecdsa   s    		c         C` sจ   |  j  j |  } |  j | |  j j k  |  j  j |  } | |  j  j k r^ t d   n  |  j  j |  } |  j | |  j j k  |  j j	 |  j
 d  } | S(   NsC   ECDSA certificates with unnamed curves are unsupported at this timet   ascii(   R   R   R   R   R   t   EC_GROUP_get_curve_namet	   NID_undeft   NotImplementedErrort
   OBJ_nid2snt   stringt   decode(   R   t   ec_keyR   t   nidt
   curve_namet   sn(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   _ec_key_curve_sn+   s    c         C` s   |  j  j | |  j  j  d S(   sก   
    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   t   EC_KEY_set_asn1_flagt   OPENSSL_EC_NAMED_CURVE(   R   t   ec_cdata(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   _mark_asn1_named_ec_curve?   s    	c         C` sE   y t  j |   SWn, t k
 r@ t d j |  t j   n Xd  S(   Ns%   {0} is not a supported elliptic curve(   R   t   _CURVE_TYPESt   KeyErrorR   t   formatR   t   UNSUPPORTED_ELLIPTIC_CURVE(   R   R)   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   _sn_to_elliptic_curveK   s    t   _ECDSASignatureContextc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s+   | |  _  | |  _ t j | |  |  _ d  S(   N(   t   _backendt   _private_keyR   t   Hasht   _digest(   t   selfR   t   private_keyt	   algorithm(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   __init__W   s    		c         C` s   |  j  j |  d  S(   N(   R8   t   update(   R9   t   data(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR=   \   s    c         C` sๆ   |  j  j } |  j j   } t | | |  j  } |  j j j |  } |  j j | d k  |  j j	 j
 d |  } |  j j	 j
 d d  } |  j j j d | t |  | | |  } |  j j | d k  |  j j	 j |  | d  S(   Ni    s   char[]s   unsigned int[]i   (   R6   t   _ec_keyR8   t   finalizeR   R5   R   t
   ECDSA_sizeR   R   t   newt
   ECDSA_signt   lent   buffer(   R9   R&   R   t   max_sizet   sigbuft
   siglen_ptrR   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR@   _   s     		(   t   __name__t
   __module__R<   R=   R@   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR4   U   s   		t   _ECDSAVerificationContextc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s4   | |  _  | |  _ | |  _ t j | |  |  _ d  S(   N(   R5   t   _public_keyt
   _signatureR   R7   R8   (   R9   R   t
   public_keyt	   signatureR;   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR<   y   s    			c         C` s   |  j  j |  d  S(   N(   R8   R=   (   R9   R>   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR=      s    c         C` s   |  j  j } |  j j   } t | | |  j  } |  j j j d | t |  |  j	 t |  j	  |  } | d k r |  j j
   t  n  t S(   Ni    i   (   RL   R?   R8   R@   R   R5   R   t   ECDSA_verifyRD   RM   t   _consume_errorsR   t   True(   R9   R&   R   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   verify   s    			(   RI   RJ   R<   R=   RS   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRK   w   s   		t   _EllipticCurvePrivateKeyc           B` sM   e  Z d    Z e j d  Z d   Z d   Z d   Z d   Z	 d   Z
 RS(   c         C` sM   | |  _  t | |  | |  _ | |  _ t | |  } t | |  |  _ d  S(   N(   R5   R.   R?   t	   _evp_pkeyR*   R3   t   _curve(   R9   R   R   t   evp_pkeyR)   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR<      s    			RV   c         C` s>   t  | t j  r( t |  j |  | j  St d t j   d  S(   Ns/   Unsupported elliptic curve signature algorithm.(	   t
   isinstanceR   t   ECDSAR4   R5   R;   R   R   t    UNSUPPORTED_PUBLIC_KEY_ALGORITHM(   R9   t   signature_algorithm(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   signerค   s    c         C` s)  |  j  j | |  j  s- t d t j   n  | j j |  j j k rT t d   n  |  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 |  |  S(   Ns1   This backend does not support the ECDH algorithm.s2   peer_public_key and self are not on the same curvei   i   i    s	   uint8_t[](   R5   t+   elliptic_curve_exchange_algorithm_supportedt   curveR   R   t   UNSUPPORTED_EXCHANGE_ALGORITHMt   namet
   ValueErrorR   R   R?   t   EC_GROUP_get_degreeR   R   RB   t   EC_KEY_get0_public_keyt   ECDH_compute_keyR   RE   (   R9   R;   t   peer_public_keyR   t   z_lent   z_buft   peer_keyt   r(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   exchangeฎ   s$    	!c         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(   Ni   (   R5   R   R   R?   R   R   R   R    t   EC_KEY_new_by_curve_namet   gct   EC_KEY_freeRc   t   EC_KEY_set_public_keyt   _ec_cdata_to_evp_pkeyt   _EllipticCurvePublicKey(   R9   R   t	   curve_nidt   public_ec_keyt   pointR   RW   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRN   ฬ   s    c         C` sL   |  j  j j |  j  } |  j  j |  } t j d | d |  j   j    S(   Nt   private_valuet   public_numbers(	   R5   R   t   EC_KEY_get0_private_keyR?   t
   _bn_to_intR   t   EllipticCurvePrivateNumbersRN   Ru   (   R9   t   bnRt   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   private_numbersโ   s
    	c         C` s"   |  j  j | | | |  j |  j  S(   N(   R5   t   _private_key_bytesRU   R?   (   R9   t   encodingR1   t   encryption_algorithm(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   private_bytes๊   s    	(   RI   RJ   R<   R   t   read_only_propertyR^   R\   Rj   RN   Rz   R~   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRT      s   			
			Rp   c           B` s;   e  Z d    Z e j d  Z d   Z d   Z d   Z RS(   c         C` sM   | |  _  t | |  | |  _ | |  _ t | |  } t | |  |  _ d  S(   N(   R5   R.   R?   RU   R*   R3   RV   (   R9   R   R   RW   R)   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR<   ๖   s    			RV   c         C` s_   t  | t  s t d   n  t  | t j  rI t |  j |  | | j  St d t	 j
   d  S(   Ns   signature must be bytes.s/   Unsupported elliptic curve signature algorithm.(   RX   t   bytest	   TypeErrorR   RY   RK   R5   R;   R   R   RZ   (   R9   RO   R[   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   verifier  s    c      
   C` s  |  j  j |  j  \ } } } |  j  j j |  j  } |  j  j | |  j  j j k  |  j  j    } |  j  j j	 |  } |  j  j j	 |  } | | | | | |  } |  j  j | d k  |  j  j
 |  }	 |  j  j
 |  }
 Wd  QXt j d |	 d |
 d |  j  S(   Ni   t   xt   yR^   (   R5   t%   _ec_key_determine_group_get_set_funcsR?   R   Rc   R   R   R   R   R   Rw   R   t   EllipticCurvePublicNumbersRV   (   R9   t   set_funct   get_funcR   Rs   R   t   bn_xt   bn_yR   R   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRu     s    	c         C` s=   | t  j j k r! t d   n  |  j j | | |  j d   S(   Ns1   EC public keys do not support PKCS1 serialization(   R	   t   PublicFormatt   PKCS1Ra   R5   t   _public_key_bytesRU   t   None(   R9   R|   R1   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   public_bytes%  s    	(	   RI   RJ   R<   R   R   R^   R   Ru   R   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRp   ๔   s
   				N(   t
   __future__R    R   R   t   cryptographyR   t   cryptography.exceptionsR   R   R   t*   cryptography.hazmat.backends.openssl.utilsR   t   cryptography.hazmat.primitivesR   R	   t)   cryptography.hazmat.primitives.asymmetricR
   R   R   R   R*   R.   R3   t   register_interfacet   objectR4   RK   t(   EllipticCurvePrivateKeyWithSerializationRT   t'   EllipticCurvePublicKeyWithSerializationRp   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   <module>   s"   				
!\