σ
Υ{PXc           @` sm  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 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 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   _calculate_digest_and_algorithmt   _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+   t  |  t j  s' t d t j   n  d  S(   Ns/   Unsupported elliptic curve signature algorithm.(   t
   isinstanceR   t   ECDSAR   R   t    UNSUPPORTED_PUBLIC_KEY_ALGORITHM(   t   signature_algorithm(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   _check_signature_algorithm-   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_sn4   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_curveH   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_curveT   s    c         C` s§   |  j  j | j  } |  j | d k  |  j j d |  } |  j j d d  } |  j  j d | t |  | | | j  } |  j | d k  |  j j |  | d  S(   Ni    s   unsigned char[]s   unsigned int[]i   (	   R   t
   ECDSA_sizet   _ec_keyR   R   t   newt
   ECDSA_signt   lent   buffer(   R   t   private_keyt   datat   max_sizet   sigbuft
   siglen_ptrR   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   _ecdsa_sig_sign^   s    	!c         C` sS   |  j  j d | t |  | t |  | j  } | d k rO |  j   t  n  t S(   Ni    i   (   R   t   ECDSA_verifyR>   R;   t   _consume_errorsR   t   True(   R   t
   public_keyt	   signatureRA   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   _ecdsa_sig_verifyk   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   R@   t	   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(   RP   t   update(   RQ   RA   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRT   |   s    c         C` s@   |  j  j   } t |  j j | |  j  } t |  j |  j |  S(   N(   RP   t   finalizeR   RN   R;   RM   RE   (   RQ   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRU      s    (   t   __name__t
   __module__RS   RT   RU   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRL   u   s   		t   _ECDSAVerificationContextc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s4   | |  _  | |  _ | |  _ t j | |  |  _ d  S(   N(   RM   t   _public_keyt
   _signatureR	   RO   RP   (   RQ   R   RI   RJ   RR   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRS      s    			c         C` s   |  j  j |  d  S(   N(   RP   RT   (   RQ   RA   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRT      s    c         C` sF   |  j  j   } t |  j j | |  j  } t |  j |  j |  j |  S(   N(   RP   RU   R   RY   R;   RM   RK   RZ   (   RQ   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   verify   s
    (   RV   RW   RS   RT   R[   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRX      s   		t   _EllipticCurvePrivateKeyc           B` sV   e  Z d    Z e j d  Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z RS(   c         C` sM   | |  _  t | |  | |  _ | |  _ t | |  } t | |  |  _ d  S(   N(   RM   R4   R;   t	   _evp_pkeyR0   R9   t   _curve(   RQ   R   R   t   evp_pkeyR/   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRS      s    			R^   c         C` s    t  |  t |  j |  | j  S(   N(   R$   RL   RM   RR   (   RQ   R#   (    (    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[](   RM   t+   elliptic_curve_exchange_algorithm_supportedt   curveR   R   t   UNSUPPORTED_EXCHANGE_ALGORITHMt   namet
   ValueErrorR   R   R;   t   EC_GROUP_get_degreeR   R   R<   t   EC_KEY_get0_public_keyt   ECDH_compute_keyR   R?   (   RQ   RR   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   (   RM   R   R   R;   R   R   R   R&   t   EC_KEY_new_by_curve_namet   gct   EC_KEY_freeRg   t   EC_KEY_set_public_keyt   _ec_cdata_to_evp_pkeyt   _EllipticCurvePublicKey(   RQ   R   t	   curve_nidt   public_ec_keyt   pointR   R_   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRI   Ξ   s    c         C` sL   |  j  j j |  j  } |  j  j |  } t j d | d |  j   j    S(   Nt   private_valuet   public_numbers(	   RM   R   t   EC_KEY_get0_private_keyR;   t
   _bn_to_intR   t   EllipticCurvePrivateNumbersRI   Ry   (   RQ   t   bnRx   (    (    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(   RM   t   _private_key_bytesR]   R;   (   RQ   t   encodingR7   t   encryption_algorithm(    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   private_bytesμ   s    	c         C` sS   t  |  t |  j | | j  \ } } t |  j | |  j  } t |  j |  |  S(   N(   R$   R   RM   t
   _algorithmR   R;   RE   (   RQ   RA   R#   RR   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   signυ   s    
(   RV   RW   RS   R   t   read_only_propertyRb   R`   Rn   RI   R~   R   R   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR\      s   								Rt   c           B` sD   e  Z d    Z e j d  Z d   Z d   Z d   Z d   Z	 RS(   c         C` sM   | |  _  t | |  | |  _ | |  _ t | |  } t | |  |  _ d  S(   N(   RM   R4   R;   R]   R0   R9   R^   (   RQ   R   R   R_   R/   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRS     s    			R^   c         C` sA   t  | t  s t d   n  t |  t |  j |  | | j  S(   Ns   signature must be bytes.(   R    t   bytest	   TypeErrorR$   RX   RM   RR   (   RQ   RJ   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   yRb   (   RM   t%   _ec_key_determine_group_get_set_funcsR;   R   Rg   R   R   R   R   R   R{   R   t   EllipticCurvePublicNumbersR^   (   RQ   t   set_funct   get_funcR   Rw   R   t   bn_xt   bn_yR   R   R   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRy     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   PKCS1Re   RM   t   _public_key_bytesR]   t   None(   RQ   R   R7   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   public_bytes-  s    	c         C` sV   t  |  t |  j | | j  \ } } t |  j | |  j  } t |  j |  | |  S(   N(   R$   R   RM   R   R   R;   RK   (   RQ   RJ   RA   R#   RR   (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyR[   ;  s    
(
   RV   RW   RS   R   R   Rb   R   Ry   R   R[   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyRt      s   						N(#   t
   __future__R    R   R   t   cryptographyR   t   cryptography.exceptionsR   R   R   t*   cryptography.hazmat.backends.openssl.utilsR   R   t   cryptography.hazmat.primitivesR	   R
   t)   cryptography.hazmat.primitives.asymmetricR   R   R   R   R$   R0   R4   R9   RE   RK   t   register_interfacet   objectRL   RX   t(   EllipticCurvePrivateKeyWithSerializationR\   t'   EllipticCurvePublicKeyWithSerializationRt   (    (    (    sK   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/ec.pyt   <module>   s(   					
		
b