U
    e]V5                     @   s   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	d
 Zdd Z dd Z!dd Z"dd Z#e$eG dd de%Z&e$eG dd de%Z'dS )    )absolute_importdivisionprint_functionN)utilsx509)UnsupportedAlgorithm)_CRL_ENTRY_REASON_CODE_TO_ENUM_OCSP_BASICRESP_EXT_PARSER_OCSP_REQ_EXT_PARSER_asn1_integer_to_int_asn1_string_to_bytes_decode_x509_name_obj2txt_parse_asn1_generalized_time)_Certificate)serialization)OCSPCertStatusOCSPRequestOCSPResponseOCSPResponseStatus_CERT_STATUS_TO_ENUM_OIDS_TO_HASH_RESPONSE_STATUS_TO_ENUMc                    s   t   fdd}|S )Nc                    s(   | j tjkrtdn | f| S d S )NzCOCSP response status is not successful so the property has no value)response_statusr   
SUCCESSFUL
ValueError)selfargsfunc K/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ocsp.pywrapper   s
    z._requires_successful_response.<locals>.wrapper)	functoolswraps)r   r"   r    r   r!   _requires_successful_response   s    	r%   c                 C   s^   | j d}| j| j j| j j|| j j|}| |dk | |d | j jk t| |d S NASN1_OCTET_STRING **   r   _ffinew_libOCSP_id_get0_infoNULLopenssl_assertr   )backendcert_idZkey_hashresr    r    r!   _issuer_key_hash'   s       r3   c                 C   s^   | j d}| j|| j j| j j| j j|}| |dk | |d | j jk t| |d S r&   r)   )r0   r1   Z	name_hashr2   r    r    r!   _issuer_name_hash2   s       r4   c                 C   s^   | j d}| j| j j| j j| j j||}| |dk | |d | j jk t| |d S )NzASN1_INTEGER **r(   r   )r*   r+   r,   r-   r.   r/   r   )r0   r1   numr2   r    r    r!   _serial_number=   s       r6   c                 C   s   | j d}| j| j j|| j j| j j|}| |dk | |d | j jk t| |d }z
t| W S  tk
r   t	d
|Y nX d S )NzASN1_OBJECT **r(   r   z*Signature algorithm OID: {} not recognized)r*   r+   r,   r-   r.   r/   r   r   KeyErrorr   format)r0   r1   Zasn1objr2   oidr    r    r!   _hash_algorithmH   s"       
r:   c                   @   sP  e Zd Zdd ZedZeedd Z	eedd Z
eedd	 Zeed
d Zeedd Zeedd Zeedd Zdd Zeedd Zeedd Zeedd Zeedd Zeedd Zeedd Zeed d! Zeed"d# Zeed$d% Zeed&d' Zejed(d) Zd*d+ Zd,S )-_OCSPResponsec                 C   s   || _ || _| j j| j}| j |tk t| | _| jtjkr| j j	| j}| j || j j
jk | j j
|| j jj| _| j | j j| jdk | j j| jd| _| j | j| j j
jk | j j| j| _| j | j| j j
jk d S )Nr(   r   )_backend_ocsp_responser,   ZOCSP_response_statusr/   r   _statusr   r   ZOCSP_response_get1_basicr*   r.   gcZOCSP_BASICRESP_free_basicZOCSP_resp_countZOCSP_resp_get0_singleZOCSP_SINGLERESP_get0_id_cert_id)r   r0   Zocsp_responsestatusZbasicr    r    r!   __init__[   s6    
 z_OCSPResponse.__init__r>   c                 C   s>   | j j| j}| j || j jjk t| j |j}t	
|S N)r<   r,   ZOCSP_resp_get0_tbs_sigalgr@   r/   r*   r.   r   	algorithmr   ZObjectIdentifier)r   Zalgr9   r    r    r!   signature_algorithm_oidy   s    z%_OCSPResponse.signature_algorithm_oidc                 C   s:   | j }ztj| W S  tk
r4   td|Y nX d S )Nz)Signature algorithm OID:{} not recognized)rG   r   Z_SIG_OIDS_TO_HASHr7   r   r8   )r   r9   r    r    r!   signature_hash_algorithm   s    z&_OCSPResponse.signature_hash_algorithmc                 C   s2   | j j| j}| j || j jjk t| j |S rE   )r<   r,   ZOCSP_resp_get0_signaturer@   r/   r*   r.   r   )r   Zsigr    r    r!   	signature   s    z_OCSPResponse.signaturec                    s    j j j} j | j jjk  j jd} j j||} j |d  j jjk  j j	| fdd} j |dk  j j
|d |d d  S )Nzunsigned char **r   c                    s    j j| d S )Nr   )r<   r,   ZOPENSSL_free)Zpointerr   r    r!   <lambda>       z2_OCSPResponse.tbs_response_bytes.<locals>.<lambda>)r<   r,   ZOCSP_resp_get0_respdatar@   r/   r*   r.   r+   Zi2d_OCSP_RESPDATAr?   buffer)r   ZrespdataZppr2   r    rJ   r!   tbs_response_bytes   s     
z _OCSPResponse.tbs_response_bytesc                 C   sv   | j j| j}| j j|}g }t|D ]F}| j j||}| j || j jj	k t
| j |}| |_|| q*|S rE   )r<   r,   ZOCSP_resp_get0_certsr@   Zsk_X509_numrangeZsk_X509_valuer/   r*   r.   r   Z
_ocsp_respappend)r   Zsk_x509r5   Zcertsir   Zcertr    r    r!   certificates   s    z_OCSPResponse.certificatesc                 C   s.   |   \}}|| jjjkrd S t| j|S d S rE   )_responder_key_namer<   r*   r.   r   )r   _asn1_stringr    r    r!   responder_key_hash   s    z _OCSPResponse.responder_key_hashc                 C   s.   |   \}}|| jjjkrd S t| j|S d S rE   )rS   r<   r*   r.   r   )r   	x509_namerT   r    r    r!   responder_name   s    z_OCSPResponse.responder_namec                 C   sP   | j jd}| j jd}| j j| j||}| j |dk |d |d fS )Nr'   zX509_NAME **r(   r   )r<   r*   r+   r,   ZOCSP_resp_get0_idr@   r/   )r   rU   rW   r2   r    r    r!   rS      s      z!_OCSPResponse._responder_key_namec                 C   s   | j j| j}t| j |S rE   )r<   r,   ZOCSP_resp_get0_produced_atr@   r   )r   produced_atr    r    r!   rY      s    z_OCSPResponse.produced_atc                 C   sH   | j j| j| j jj| j jj| j jj| j jj}| j |tk t| S rE   )r<   r,   OCSP_single_get0_statusrA   r*   r.   r/   r   )r   rC   r    r    r!   certificate_status   s    z _OCSPResponse.certificate_statusc                 C   sr   | j tjk	rd S | jjd}| jj| j| jjj	|| jjj	| jjj	 | j
|d | jjj	k t| j|d S NzASN1_GENERALIZEDTIME **r   )r[   r   REVOKEDr<   r*   r+   r,   rZ   rA   r.   r/   r   r   Z	asn1_timer    r    r!   revocation_time   s    z_OCSPResponse.revocation_timec                 C   s|   | j tjk	rd S | jjd}| jj| j|| jjj	| jjj	| jjj	 |d dkrXd S | j
|d tk t|d  S d S )Nzint *r   )r[   r   r]   r<   r*   r+   r,   rZ   rA   r.   r/   r   )r   Z
reason_ptrr    r    r!   revocation_reason   s     
z_OCSPResponse.revocation_reasonc                 C   sb   | j jd}| j j| j| j jj| j jj|| j jj | j |d | j jjk t| j |d S r\   )	r<   r*   r+   r,   rZ   rA   r.   r/   r   r^   r    r    r!   this_update  s    z_OCSPResponse.this_updatec                 C   sb   | j jd}| j j| j| j jj| j jj| j jj| |d | j jjkrZt| j |d S d S d S r\   )r<   r*   r+   r,   rZ   rA   r.   r   r^   r    r    r!   next_update  s    z_OCSPResponse.next_updatec                 C   s   t | j| jS rE   r3   r<   rB   rJ   r    r    r!   issuer_key_hash)  s    z_OCSPResponse.issuer_key_hashc                 C   s   t | j| jS rE   r4   r<   rB   rJ   r    r    r!   issuer_name_hash.  s    z_OCSPResponse.issuer_name_hashc                 C   s   t | j| jS rE   r:   r<   rB   rJ   r    r    r!   hash_algorithm3  s    z_OCSPResponse.hash_algorithmc                 C   s   t | j| jS rE   r6   r<   rB   rJ   r    r    r!   serial_number8  s    z_OCSPResponse.serial_numberc                 C   s   t | j| jS rE   )r	   parser<   r@   rJ   r    r    r!   
extensions=  s    z_OCSPResponse.extensionsc                 C   sL   |t jjk	rtd| j }| jj|| j}| j	|dk | j
|S Nz/The only allowed encoding value is Encoding.DERr   )r   EncodingDERr   r<   _create_mem_bio_gcr,   Zi2d_OCSP_RESPONSE_bior=   r/   _read_mem_bior   encodingZbior2   r    r    r!   public_bytesB  s    
 z_OCSPResponse.public_bytesN)__name__
__module____qualname__rD   r   Zread_only_propertyr   propertyr%   rG   rH   rI   rN   rR   rV   rX   rS   rY   r[   r_   ra   rb   rc   re   rg   ri   rk   cached_propertyrm   ru   r    r    r    r!   r;   Y   st   
		r;   c                   @   sZ   e Zd Zdd Zedd Zedd Zedd Zed	d
 Ze	j
dd Zdd ZdS )_OCSPRequestc                 C   s~   |j |dkrtd|| _|| _| jj | jd| _| j| j| jjj	k | jj 
| j| _| j| j| jjj	k d S )Nr(   z+OCSP request contains more than one requestr   )r,   ZOCSP_request_onereq_countNotImplementedErrorr<   _ocsp_requestZOCSP_request_onereq_get0Z_requestr/   r*   r.   ZOCSP_onereq_get0_idrB   )r   r0   Zocsp_requestr    r    r!   rD   R  s     z_OCSPRequest.__init__c                 C   s   t | j| jS rE   rd   rJ   r    r    r!   re   `  s    z_OCSPRequest.issuer_key_hashc                 C   s   t | j| jS rE   rf   rJ   r    r    r!   rg   d  s    z_OCSPRequest.issuer_name_hashc                 C   s   t | j| jS rE   rj   rJ   r    r    r!   rk   h  s    z_OCSPRequest.serial_numberc                 C   s   t | j| jS rE   rh   rJ   r    r    r!   ri   l  s    z_OCSPRequest.hash_algorithmc                 C   s   t | j| jS rE   )r
   rl   r<   r}   rJ   r    r    r!   rm   p  s    z_OCSPRequest.extensionsc                 C   sL   |t jjk	rtd| j }| jj|| j}| j	|dk | j
|S rn   )r   ro   rp   r   r<   rq   r,   Zi2d_OCSP_REQUEST_bior}   r/   rr   rs   r    r    r!   ru   t  s    
z_OCSPRequest.public_bytesN)rv   rw   rx   rD   ry   re   rg   rk   ri   r   rz   rm   ru   r    r    r    r!   r{   P  s   




r{   )(Z
__future__r   r   r   r#   Zcryptographyr   r   Zcryptography.exceptionsr   Z0cryptography.hazmat.backends.openssl.decode_asn1r   r	   r
   r   r   r   r   r   Z)cryptography.hazmat.backends.openssl.x509r   Zcryptography.hazmat.primitivesr   Zcryptography.x509.ocspr   r   r   r   r   r   r   r%   r3   r4   r6   r:   Zregister_interfaceobjectr;   r{   r    r    r    r!   <module>   s"   ($ w