σ
Υ{PXc           @` se  d  d l  m Z m Z m Z d  d l m Z d  d l 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 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 e j e j  d e f d     Y Z d S(   i    (   t   absolute_importt   divisiont   print_function(   t   utils(   t   InvalidSignature(   t   _calculate_digest_and_algorithmt   _truncate_digest(   t   hashest   serialization(   t   AsymmetricSignatureContextt   AsymmetricVerificationContextt   dsac         C` sw   | j  j d  } | j j |  | j  j | | j  j  | j | d | j  j k  | j j | d  } t | |  S(   sς   
    This function truncates digests that are longer than a given DS
    key's length so they can be signed. OpenSSL does this for us in
    1.0.0c+, leaving us with three releases (1.0.0, 1.0.0a, and 1.0.0b) where
    this is a problem.
    s	   BIGNUM **i    (   t   _ffit   newt   _libt   DSA_get0_pqgt   NULLt   openssl_assertt   BN_num_bitsR   (   t	   dsa_cdatat   digestt   backendt   qt
   order_bits(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   _truncate_digest_for_dsa   s    	c         C` s’   |  j  j | j  } |  j j d |  } |  j j d  } |  j  j d | t |  | | | j  } |  j | d k  |  j | d  |  j j |  | d  S(   Ns   unsigned char[]s   unsigned int *i    i   (	   R   t   DSA_sizet
   _dsa_cdataR   R   t   DSA_signt   lenR   t   buffer(   R   t   private_keyt   datat   sig_buf_lent   sig_buft   buflent   res(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   _dsa_sig_sign$   s    	!c         C` sS   |  j  j d | t |  | t |  | j  } | d k rO |  j   t  n  d  S(   Ni    i   (   R   t
   DSA_verifyR   R   t   _consume_errorsR   (   R   t
   public_keyt	   signatureR   R#   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   _dsa_sig_verify4   s
    	'
t   _DSAVerificationContextc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` sC   | |  _  | |  _ | |  _ | |  _ t j |  j |  j   |  _ d  S(   N(   t   _backendt   _public_keyt
   _signaturet
   _algorithmR   t   Hasht	   _hash_ctx(   t   selfR   R'   R(   t	   algorithm(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   __init__B   s
    				c         C` s   |  j  j |  d  S(   N(   R0   t   update(   R1   R   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR4   J   s    c         C` sJ   |  j  j   } t |  j j | |  j  } t |  j |  j |  j |  d  S(   N(   R0   t   finalizeR   R,   R   R+   R)   R-   (   R1   t   data_to_verify(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   verifyM   s
    (   t   __name__t
   __module__R3   R4   R7   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR*   @   s   		t   _DSASignatureContextc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s:   | |  _  | |  _ | |  _ t j |  j |  j   |  _ d  S(   N(   R+   t   _private_keyR.   R   R/   R0   (   R1   R   R   R2   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR3   Z   s    			c         C` s   |  j  j |  d  S(   N(   R0   R4   (   R1   R   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR4   `   s    c         C` s@   |  j  j   } t |  j j | |  j  } t |  j |  j |  S(   N(   R0   R5   R   R;   R   R+   R$   (   R1   t   data_to_sign(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR5   c   s    (   R8   R9   R3   R4   R5   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR:   X   s   		t   _DSAParametersc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s   | |  _  | |  _ d  S(   N(   R+   R   (   R1   R   R   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR3   m   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  |  j  j | d |  j  j j k  t j	 d |  j  j
 | d  d |  j  j
 | d  d |  j  j
 | d   S(   Ns	   BIGNUM **i    t   pR   t   g(   R+   R   R   R   R   R   R   R   R   t   DSAParameterNumberst
   _bn_to_int(   R1   R>   R   R?   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   parameter_numbersq   s    ###	c         C` s   |  j  j |   S(   N(   R+   t   generate_dsa_private_key(   R1   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   generate_private_key   s    (   R8   R9   R3   RB   RD   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR=   k   s   		t   _DSAPrivateKeyc           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` s   | |  _  | |  _ | |  _ |  j  j j d  } |  j  j j | | |  j  j j |  j  j j  |  j  j | d | j j k  |  j  j j	 | d  |  _
 d  S(   Ns	   BIGNUM **i    (   R+   R   t	   _evp_pkeyR   R   R   R   R   R   R   t	   _key_size(   R1   R   R   t   evp_pkeyR>   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR3      s    			" RG   c         C` s   t  |  j |  |  S(   N(   R:   R+   (   R1   t   signature_algorithm(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   signer   s    c         C` sγ  |  j  j j d  } |  j  j j d  } |  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  |  j  j | d |  j  j j k  |  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   d	 |  j  j | d   S(
   Ns	   BIGNUM **i    t   public_numbersRB   R>   R   R?   t   yt   x(   R+   R   R   R   R   R   R   R   t   DSA_get0_keyR   t   DSAPrivateNumberst   DSAPublicNumbersR@   RA   (   R1   R>   R   R?   t   pub_keyt   priv_key(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   private_numbers   s(    #####			c         C` s-  |  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 j  } |  j  j | d k  |  j  j |  } t |  j  | |  S(   Ns	   BIGNUM **i    i   (   R+   R   t   DSAparams_dupR   R   R   R   t   gct   DSA_freeR   RN   t   BN_dupt   DSA_set0_keyt   _dsa_cdata_to_evp_pkeyt   _DSAPublicKey(   R1   R   RQ   t   pub_key_dupR#   RH   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR'   ―   s    #c         C` sh   |  j  j j |  j  } |  j  j | |  j  j j k  |  j  j j | |  j  j j  } t	 |  j  |  S(   N(
   R+   R   RT   R   R   R   R   RU   RV   R=   (   R1   R   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt
   parametersΒ   s
    c         C` s"   |  j  j | | | |  j |  j  S(   N(   R+   t   _private_key_bytesRF   R   (   R1   t   encodingt   formatt   encryption_algorithm(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   private_bytesΚ   s    	c         C` sF   t  |  j | |  \ } } t |  j | |  j  } t |  j |  |  S(   N(   R   R+   R   R   R$   (   R1   R   R2   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   signΣ   s    (   R8   R9   R3   R   t   read_only_propertyt   key_sizeRJ   RS   R'   R\   Ra   Rb   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyRE      s   							RZ   c           B` sM   e  Z d    Z e j d  Z d   Z d   Z d   Z d   Z	 d   Z
 RS(   c         C` s   | |  _  | |  _ | |  _ |  j  j j d  } |  j  j j | | |  j  j j |  j  j j  |  j  j | d | j j k  |  j  j j	 | d  |  _
 d  S(   Ns	   BIGNUM **i    (   R+   R   RF   R   R   R   R   R   R   R   RG   (   R1   R   R   RH   R>   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR3   έ   s    			" RG   c         C` s4   t  | t  s t d   n  t |  j |  | |  S(   Ns   signature must be bytes.(   t
   isinstancet   bytest	   TypeErrorR*   R+   (   R1   R(   RI   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   verifierκ   s    c         C` s  |  j  j j d  } |  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  |  j  j | d |  j  j j k  |  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   d |  j  j | d   S(   Ns	   BIGNUM **i    RB   R>   R   R?   RL   (   R+   R   R   R   R   R   R   R   RN   R   RP   R@   RA   (   R1   R>   R   R?   RQ   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyRK   ς   s"    ####		c         C` sI   |  j  j j |  j  } |  j  j j | |  j  j j  } t |  j  |  S(   N(   R+   R   RT   R   R   RU   RV   R=   (   R1   R   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR\     s    c         C` s@   | t  j j k r! t d   n  |  j j | | |  |  j d   S(   Ns2   DSA public keys do not support PKCS1 serialization(   R   t   PublicFormatt   PKCS1t
   ValueErrorR+   t   _public_key_bytesRF   t   None(   R1   R^   R_   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   public_bytes  s    	c         C` sI   t  |  j | |  \ } } t |  j | |  j  } t |  j |  | |  S(   N(   R   R+   R   R   R)   (   R1   R(   R   R2   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyR7     s    (   R8   R9   R3   R   Rc   Rd   Rh   RK   R\   Rn   R7   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyRZ   Ϋ   s   					N(   t
   __future__R    R   R   t   cryptographyR   t   cryptography.exceptionsR   t*   cryptography.hazmat.backends.openssl.utilsR   R   t   cryptography.hazmat.primitivesR   R   t)   cryptography.hazmat.primitives.asymmetricR	   R
   R   R   R$   R)   t   register_interfacet   objectR*   R:   t   DSAParametersWithNumbersR=   t   DSAPrivateKeyWithSerializationRE   t   DSAPublicKeyWithSerializationRZ   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/dsa.pyt   <module>   s$   			W