ó
/<õ\c           @` sW  d  d l  m Z m Z m Z d  d l Z d  d l m Z m Z d  d l m	 Z	 d  d l
 m Z m Z m Z m Z m Z m Z m Z m Z d  d l m Z d  d l m Z d  d l m Z m Z m Z m Z m Z m Z m 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' d S(   i    (   t   absolute_importt   divisiont   print_functionN(   t   utilst   x509(   t   UnsupportedAlgorithm(   t   _CRL_ENTRY_REASON_CODE_TO_ENUMt   _OCSP_BASICRESP_EXT_PARSERt   _OCSP_REQ_EXT_PARSERt   _asn1_integer_to_intt   _asn1_string_to_bytest   _decode_x509_namet   _obj2txtt   _parse_asn1_generalized_time(   t   _Certificate(   t   serialization(   t   OCSPCertStatust   OCSPRequestt   OCSPResponset   OCSPResponseStatust   _CERT_STATUS_TO_ENUMt   _OIDS_TO_HASHt   _RESPONSE_STATUS_TO_ENUMc         ` s"   t  j ˆ  ƒ ‡  f d †  ƒ } | S(   Nc         ` s2   |  j  t j k r! t d ƒ ‚ n ˆ  |  | Œ Sd  S(   NsC   OCSP response status is not successful so the property has no value(   t   response_statusR   t
   SUCCESSFULt
   ValueError(   t   selft   args(   t   func(    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   wrapper   s    (   t	   functoolst   wraps(   R   R   (    (   R   sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   _requires_successful_response   s    
c         C` sƒ   |  j  j d ƒ } |  j j |  j  j |  j  j | |  j  j | ƒ } |  j | d k ƒ |  j | d |  j  j k ƒ t |  | d ƒ S(   Ns   ASN1_OCTET_STRING **i   i    (   t   _ffit   newt   _libt   OCSP_id_get0_infot   NULLt   openssl_assertR
   (   t   backendt   cert_idt   key_hasht   res(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   _issuer_key_hash'   s    	c         C` sƒ   |  j  j d ƒ } |  j j | |  j  j |  j  j |  j  j | ƒ } |  j | d k ƒ |  j | d |  j  j k ƒ t |  | d ƒ S(   Ns   ASN1_OCTET_STRING **i   i    (   R!   R"   R#   R$   R%   R&   R
   (   R'   R(   t	   name_hashR*   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   _issuer_name_hash2   s    	c         C` sƒ   |  j  j d ƒ } |  j j |  j  j |  j  j |  j  j | | ƒ } |  j | d k ƒ |  j | d |  j  j k ƒ t |  | d ƒ S(   Ns   ASN1_INTEGER **i   i    (   R!   R"   R#   R$   R%   R&   R	   (   R'   R(   t   numR*   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   _serial_number=   s    	c         C` s¾   |  j  j d ƒ } |  j j |  j  j | |  j  j |  j  j | ƒ } |  j | d k ƒ |  j | d |  j  j k ƒ t |  | d ƒ } y t | SWn& t k
 r¹ t	 d j
 | ƒ ƒ ‚ n Xd  S(   Ns   ASN1_OBJECT **i   i    s*   Signature algorithm OID: {} not recognized(   R!   R"   R#   R$   R%   R&   R   R   t   KeyErrorR   t   format(   R'   R(   t   asn1objR*   t   oid(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   _hash_algorithmH   s    	t   _OCSPResponsec           B` s¯  e  Z d  „  Z e j d ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z	 e e d „  ƒ ƒ Z
 e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z d	 „  Z e e d
 „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e e d „  ƒ ƒ Z e j e d „  ƒ ƒ Z d „  Z RS(   c         C` sf  | |  _  | |  _ |  j  j j |  j ƒ } |  j  j | t k ƒ t | |  _ |  j t j k rb|  j  j j	 |  j ƒ } |  j  j | |  j  j
 j k ƒ |  j  j
 j | |  j  j j ƒ |  _ |  j  j |  j  j j |  j ƒ d k ƒ |  j  j j |  j d ƒ |  _ |  j  j |  j |  j  j
 j k ƒ |  j  j j |  j ƒ |  _ |  j  j |  j |  j  j
 j k ƒ n  d  S(   Ni   i    (   t   _backendt   _ocsp_responseR#   t   OCSP_response_statusR&   R   t   _statusR   R   t   OCSP_response_get1_basicR!   R%   t   gct   OCSP_BASICRESP_freet   _basict   OCSP_resp_countt   OCSP_resp_get0t   _singlet   OCSP_SINGLERESP_get0_idt   _cert_id(   R   R'   t   ocsp_responset   statust   basic(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   __init__[   s(    					R9   c         C` sY   |  j  j j |  j ƒ } |  j  j | |  j  j j k ƒ t |  j  | j ƒ } t	 j
 | ƒ S(   N(   R6   R#   t   OCSP_resp_get0_tbs_sigalgR=   R&   R!   R%   R   t	   algorithmR   t   ObjectIdentifier(   R   t   algR3   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   signature_algorithm_oidy   s    c         C` sE   |  j  } y t j | SWn& t k
 r@ t d j | ƒ ƒ ‚ n Xd  S(   Ns)   Signature algorithm OID:{} not recognized(   RK   R   t   _SIG_OIDS_TO_HASHR0   R   R1   (   R   R3   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   signature_hash_algorithm   s    	c         C` sG   |  j  j j |  j ƒ } |  j  j | |  j  j j k ƒ t |  j  | ƒ S(   N(   R6   R#   t   OCSP_resp_get0_signatureR=   R&   R!   R%   R
   (   R   t   sig(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt	   signatureŒ   s    c         ` sÙ   ˆ  j  j j ˆ  j ƒ } ˆ  j  j | ˆ  j  j j k ƒ ˆ  j  j j d ƒ } ˆ  j  j j | | ƒ } ˆ  j  j | d ˆ  j  j j k ƒ ˆ  j  j j	 | ‡  f d †  ƒ } ˆ  j  j | d k ƒ ˆ  j  j j
 | d | ƒ S(   Ns   unsigned char **i    c         ` s   ˆ  j  j j |  d ƒ S(   Ni    (   R6   R#   t   OPENSSL_free(   t   pointer(   R   (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   <lambda>œ   t    (   R6   R#   t   OCSP_resp_get0_respdataR=   R&   R!   R%   R"   t   i2d_OCSP_RESPDATAR;   t   buffer(   R   t   respdatat   ppR*   (    (   R   sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   tbs_response_bytes“   s    #c         C` s­   |  j  j j |  j ƒ } |  j  j j | ƒ } g  } xs t | ƒ D]e } |  j  j j | | ƒ } |  j  j | |  j  j j	 k ƒ t
 |  j  | ƒ } |  | _ | j | ƒ q@ W| S(   N(   R6   R#   t   OCSP_resp_get0_certsR=   t   sk_X509_numt   ranget   sk_X509_valueR&   R!   R%   R   t
   _ocsp_respt   append(   R   t   sk_x509R.   t   certst   iR   t   cert(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   certificates¡   s    	c         C` s?   |  j  ƒ  \ } } | |  j j j k r+ d  St |  j | ƒ Sd  S(   N(   t   _responder_key_nameR6   R!   R%   t   NoneR
   (   R   t   _t   asn1_string(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   responder_key_hash³   s    c         C` s?   |  j  ƒ  \ } } | |  j j j k r+ d  St |  j | ƒ Sd  S(   N(   Rf   R6   R!   R%   Rg   R   (   R   t	   x509_nameRh   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   responder_name¼   s    c         C` sp   |  j  j j d ƒ } |  j  j j d ƒ } |  j  j j |  j | | ƒ } |  j  j | d k ƒ | d | d f S(   Ns   ASN1_OCTET_STRING **s   X509_NAME **i   i    (   R6   R!   R"   R#   t   OCSP_resp_get0_idR=   R&   (   R   Ri   Rk   R*   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyRf   Å   s    c         C` s(   |  j  j j |  j ƒ } t |  j  | ƒ S(   N(   R6   R#   t   OCSP_resp_get0_produced_atR=   R   (   R   t   produced_at(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyRo   Î   s    c         C` sf   |  j  j j |  j |  j  j j |  j  j j |  j  j j |  j  j j ƒ } |  j  j | t k ƒ t | S(   N(   R6   R#   t   OCSP_single_get0_statusR@   R!   R%   R&   R   (   R   RD   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   certificate_statusÖ   s    c         C` sŸ   |  j  t j k	 r d  S|  j j j d ƒ } |  j j j |  j	 |  j j j
 | |  j j j
 |  j j j
 ƒ |  j j | d |  j j j
 k ƒ t |  j | d ƒ S(   Ns   ASN1_GENERALIZEDTIME **i    (   Rq   R   t   REVOKEDRg   R6   R!   R"   R#   Rp   R@   R%   R&   R   (   R   t	   asn1_time(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   revocation_timeã   s    #c         C` s¦   |  j  t j k	 r d  S|  j j j d ƒ } |  j j j |  j	 | |  j j j
 |  j j j
 |  j j j
 ƒ | d d k r| d  S|  j j | d t k ƒ t | d Sd  S(   Ns   int *i    iÿÿÿÿ(   Rq   R   Rr   Rg   R6   R!   R"   R#   Rp   R@   R%   R&   R   (   R   t
   reason_ptr(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   revocation_reasonô   s    	c         C` s‰   |  j  j j d ƒ } |  j  j j |  j |  j  j j |  j  j j | |  j  j j ƒ |  j  j | d |  j  j j k ƒ t |  j  | d ƒ S(   Ns   ASN1_GENERALIZEDTIME **i    (	   R6   R!   R"   R#   Rp   R@   R%   R&   R   (   R   Rs   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   this_update  s    #c         C` s‡   |  j  j j d ƒ } |  j  j j |  j |  j  j j |  j  j j |  j  j j | ƒ | d |  j  j j k r t |  j  | d ƒ Sd  Sd  S(   Ns   ASN1_GENERALIZEDTIME **i    (	   R6   R!   R"   R#   Rp   R@   R%   R   Rg   (   R   Rs   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   next_update  s    c         C` s   t  |  j |  j ƒ S(   N(   R+   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   issuer_key_hash)  s    c         C` s   t  |  j |  j ƒ S(   N(   R-   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   issuer_name_hash.  s    c         C` s   t  |  j |  j ƒ S(   N(   R4   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   hash_algorithm3  s    c         C` s   t  |  j |  j ƒ S(   N(   R/   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   serial_number8  s    c         C` s   t  j |  j |  j ƒ S(   N(   R   t   parseR6   R=   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt
   extensions=  s    c         C` sq   | t  j j k	 r! t d ƒ ‚ n  |  j j ƒ  } |  j j j | |  j ƒ } |  j j	 | d k ƒ |  j j
 | ƒ S(   Ns/   The only allowed encoding value is Encoding.DERi    (   R   t   Encodingt   DERR   R6   t   _create_mem_bio_gcR#   t   i2d_OCSP_RESPONSE_bioR7   R&   t   _read_mem_bio(   R   t   encodingt   bioR*   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   public_bytesB  s    (   t   __name__t
   __module__RF   R   t   read_only_propertyR   t   propertyR    RK   RM   RP   RZ   Re   Rj   Rl   Rf   Ro   Rq   Rt   Rv   Rw   Rx   Ry   Rz   R{   R|   t   cached_propertyR~   R†   (    (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyR5   Y   sP   	
		t   _OCSPRequestc           B` sh   e  Z d  „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e j	 d „  ƒ Z
 d „  Z RS(   c         C` sº   | j  j | ƒ d k r' t d ƒ ‚ n  | |  _ | |  _ |  j j  j |  j d ƒ |  _ |  j j |  j |  j j j	 k ƒ |  j j  j
 |  j ƒ |  _ |  j j |  j |  j j j	 k ƒ d  S(   Ni   s+   OCSP request contains more than one requesti    (   R#   t   OCSP_request_onereq_countt   NotImplementedErrorR6   t   _ocsp_requestt   OCSP_request_onereq_get0t   _requestR&   R!   R%   t   OCSP_onereq_get0_idRB   (   R   R'   t   ocsp_request(    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyRF   R  s    		"c         C` s   t  |  j |  j ƒ S(   N(   R+   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyRy   `  s    c         C` s   t  |  j |  j ƒ S(   N(   R-   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyRz   d  s    c         C` s   t  |  j |  j ƒ S(   N(   R/   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyR|   h  s    c         C` s   t  |  j |  j ƒ S(   N(   R4   R6   RB   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyR{   l  s    c         C` s   t  j |  j |  j ƒ S(   N(   R   R}   R6   R   (   R   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyR~   p  s    c         C` sq   | t  j j k	 r! t d ƒ ‚ n  |  j j ƒ  } |  j j j | |  j ƒ } |  j j	 | d k ƒ |  j j
 | ƒ S(   Ns/   The only allowed encoding value is Encoding.DERi    (   R   R   R€   R   R6   R   R#   t   i2d_OCSP_REQUEST_bioR   R&   Rƒ   (   R   R„   R…   R*   (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyR†   t  s    (   R‡   Rˆ   RF   RŠ   Ry   Rz   R|   R{   R   R‹   R~   R†   (    (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyRŒ   P  s   	((   t
   __future__R    R   R   R   t   cryptographyR   R   t   cryptography.exceptionsR   t0   cryptography.hazmat.backends.openssl.decode_asn1R   R   R   R	   R
   R   R   R   t)   cryptography.hazmat.backends.openssl.x509R   t   cryptography.hazmat.primitivesR   t   cryptography.x509.ocspR   R   R   R   R   R   R   R    R+   R-   R/   R4   t   register_interfacet   objectR5   RŒ   (    (    (    sH   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/ocsp.pyt   <module>   s    :4					ö