ó
Õ{PXc           @` s¢   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 m Z e j e j ƒ 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   constant_timet   hashest
   interfacest   _HMACContextc           B` sG   e  Z d d  „ Z e j d ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 RS(   c         C` s&  | |  _  | |  _ | d  k r|  j j j ƒ  } |  j j | |  j j j k ƒ |  j j j | |  j j j	 ƒ } |  j j j
 | j j d ƒ ƒ } | |  j j j k rÇ t d j | j ƒ t j ƒ ‚ n  |  j j j | | t | ƒ | |  j j j ƒ } |  j j | d k ƒ n  | |  _ | |  _ d  S(   Nt   asciis,   {0} is not a supported hash on this backend.i    (   t
   _algorithmt   _backendt   Nonet   _libt   Cryptography_HMAC_CTX_newt   openssl_assertt   _ffit   NULLt   gct   Cryptography_HMAC_CTX_freet   EVP_get_digestbynamet   namet   encodeR   t   formatR   t   UNSUPPORTED_HASHt   HMAC_Init_ext   lent   _ctxt   _key(   t   selft   backendt   keyt	   algorithmt   ctxt   evp_mdt   res(    (    sM   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/hmac.pyt   __init__   s&    			$	R   c         C` s¢   |  j  j j ƒ  } |  j  j | |  j  j j k ƒ |  j  j j | |  j  j j ƒ } |  j  j j | |  j	 ƒ } |  j  j | d k ƒ t
 |  j  |  j |  j d | ƒS(   Ni    R#   (   R   R   R   R   R   R   R   R   t   HMAC_CTX_copyR   R
   R   R"   (   R   t
   copied_ctxR%   (    (    sM   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/hmac.pyt   copy.   s    c         C` s>   |  j  j j |  j | t | ƒ ƒ } |  j  j | d k ƒ d  S(   Ni    (   R   R   t   HMAC_UpdateR   R   R   (   R   t   dataR%   (    (    sM   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/hmac.pyt   update:   s    $c         C` s¥   |  j  j j d |  j  j j ƒ } |  j  j j d ƒ } |  j  j j |  j | | ƒ } |  j  j | d k ƒ |  j  j | d |  j j	 k ƒ |  j  j j
 | ƒ | d  S(   Ns   unsigned char[]s   unsigned int *i    (   R   R   t   newR   t   EVP_MAX_MD_SIZEt
   HMAC_FinalR   R   R"   t   digest_sizet   buffer(   R   t   buft   outlenR%   (    (    sM   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/hmac.pyt   finalize>   s     c         C` s1   |  j  ƒ  } t j | | ƒ s- t d ƒ ‚ n  d  S(   Ns   Signature did not match digest.(   R4   R   t   bytes_eqR   (   R   t	   signaturet   digest(    (    sM   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/hmac.pyt   verifyG   s    N(   t   __name__t
   __module__R   R&   R   t   read_only_propertyR"   R)   R,   R4   R8   (    (    (    sM   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/hmac.pyR
      s   				N(   t
   __future__R    R   R   t   cryptographyR   t   cryptography.exceptionsR   R   R   t   cryptography.hazmat.primitivesR   R   R	   t   register_interfacet
   MACContextt   HashContextt   objectR
   (    (    (    sM   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/hmac.pyt   <module>   s   