U
    [e9                     @   s   d dl 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 d dlmZ d dlmZ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G dd deZG dd deZ dS )    N)utilsx509)UnsupportedAlgorithm)_CRL_ENTRY_REASON_CODE_TO_ENUM_asn1_integer_to_int_asn1_string_to_bytes_decode_x509_name_obj2txt_parse_asn1_generalized_time)_Certificate)hashesserialization)OCSPCertStatusOCSPRequestOCSPResponseOCSPResponseStatus_CERT_STATUS_TO_ENUM_OIDS_TO_HASH_RESPONSE_STATUS_TO_ENUMc                 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res r"   k/var/www/html/services/stratfitenv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/ocsp.py_issuer_key_hash   s    r$   c                 C   s^   | j d}| j|| j j| j j| j j|}| |dk | |d | j jk t| |d S r   r   )r   r    Z	name_hashr!   r"   r"   r#   _issuer_name_hash-   s    r%   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   )r   r    numr!   r"   r"   r#   _serial_number;   s        r'   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)r   r    Zasn1objr!   oidr"   r"   r#   _hash_algorithmE   s"    
r+   c                   @   s  e Zd Zdd ZedZddddZee	j
ddd	Zeejej dd
dZeedddZeedddZeeje	j dddZeeje dddZeeje	j dddZdd ZeejdddZeedddZeejej dddZeeje	j  dddZ!eejdd d!Z"eejej dd"d#Z#eedd$d%Z$eedd&d'Z%eejdd(d)Z&ee'dd*d+Z(ej)e	j*dd,d-Z+ej)e	j*dd.d/Z,e-j.ed0d1d2Z/dS )3_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}|dkrtd|| j j| jd| _| j | j| j j
jk | j j| j| _| j | j| j j
jk d S )Nr   zhOCSP response contains more than one SINGLERESP structure, which this library does not support. {} foundr   )_backend_ocsp_responser   ZOCSP_response_statusr   r   _statusr   
SUCCESSFULZOCSP_response_get1_basicr   r   gcZOCSP_BASICRESP_free_basicZOCSP_resp_count
ValueErrorr)   ZOCSP_resp_get0_singleZOCSP_SINGLERESP_get0_id_cert_id)selfr   Zocsp_responsestatusbasicZnum_respr"   r"   r#   __init__Z   s>    
 z_OCSPResponse.__init__r/   Nreturnc                 C   s   | j tjkrtdd S )NzCOCSP response status is not successful so the property has no value)response_statusr   r0   r3   r6   r"   r"   r#   _requires_successful_response|   s    z+_OCSPResponse._requires_successful_responsec                 C   sF   |    | jj| j}| j|| jjjk t| j|j	}t
|S N)r>   r-   r   ZOCSP_resp_get0_tbs_sigalgr2   r   r   r   r	   	algorithmr   ObjectIdentifier)r6   algr*   r"   r"   r#   signature_algorithm_oid   s
    z%_OCSPResponse.signature_algorithm_oidc                 C   sB   |    | j}ztj| W S  tk
r<   td|Y nX d S )Nz)Signature algorithm OID:{} not recognized)r>   rC   r   Z_SIG_OIDS_TO_HASHr(   r   r)   )r6   r*   r"   r"   r#   signature_hash_algorithm   s    z&_OCSPResponse.signature_hash_algorithmc                 C   s:   |    | jj| j}| j|| jjjk t| j|S r?   )	r>   r-   r   ZOCSP_resp_get0_signaturer2   r   r   r   r   )r6   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pointerr=   r"   r#   <lambda>       z2_OCSPResponse.tbs_response_bytes.<locals>.<lambda>)r>   r-   r   ZOCSP_resp_get0_respdatar2   r   r   r   r   Zi2d_OCSP_RESPDATAr1   buffer)r6   Zrespdatappr!   r"   r=   r#   tbs_response_bytes   s     
z _OCSPResponse.tbs_response_bytesc                 C   s~   |    | jj| j}| jj|}g }t|D ]F}| jj||}| j|| jj	j
k t| j|}| |_|| q2|S r?   )r>   r-   r   ZOCSP_resp_get0_certsr2   Zsk_X509_numrangeZsk_X509_valuer   r   r   r   Z_ocsp_resp_refappend)r6   Zsk_x509r&   certsiZx509_ptrcertr"   r"   r#   certificates   s    z_OCSPResponse.certificatesc                 C   s6   |    |  \}}|| jjjkr&d S t| j|S d S r?   )r>   _responder_key_namer-   r   r   r   )r6   _asn1_stringr"   r"   r#   responder_key_hash   s
    z _OCSPResponse.responder_key_hashc                 C   s6   |    |  \}}|| jjjkr&d S t| j|S d S r?   )r>   rR   r-   r   r   r   )r6   	x509_namerS   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_idr2   r   )r6   rT   rV   r!   r"   r"   r#   rR      s      z!_OCSPResponse._responder_key_namec                 C   s$   |    | jj| j}t| j|S r?   )r>   r-   r   ZOCSP_resp_get0_produced_atr2   r
   )r6   produced_atr"   r"   r#   rX      s
    z_OCSPResponse.produced_atc                 C   sP   |    | jj| j| jjj| jjj| jjj| jjj}| j|tk t| S r?   )	r>   r-   r   OCSP_single_get0_statusr4   r   r   r   r   )r6   r7   r"   r"   r#   certificate_status   s    z _OCSPResponse.certificate_statusc                 C   sz   |    | 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>   rZ   r   REVOKEDr-   r   r   r   rY   r4   r   r   r
   r6   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r`d S | j|d tk t|d  S d S )Nzint *r   )r>   rZ   r   r\   r-   r   r   r   rY   r4   r   r   r   )r6   Z
reason_ptrr"   r"   r#   revocation_reason   s"    
z_OCSPResponse.revocation_reasonc                 C   sj   |    | 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   r   rY   r4   r   r   r
   r]   r"   r"   r#   this_update  s    z_OCSPResponse.this_updatec                 C   sj   |    | jjd}| jj| j| jjj| jjj| jjj| |d | jjjkrbt| j|d S d S d S r[   )	r>   r-   r   r   r   rY   r4   r   r
   r]   r"   r"   r#   next_update%  s    z_OCSPResponse.next_updatec                 C   s   |    t| j| jS r?   )r>   r$   r-   r5   r=   r"   r"   r#   issuer_key_hash5  s    z_OCSPResponse.issuer_key_hashc                 C   s   |    t| j| jS r?   )r>   r%   r-   r5   r=   r"   r"   r#   issuer_name_hash:  s    z_OCSPResponse.issuer_name_hashc                 C   s   |    t| j| jS r?   )r>   r+   r-   r5   r=   r"   r"   r#   hash_algorithm?  s    z_OCSPResponse.hash_algorithmc                 C   s   |    t| j| jS r?   )r>   r'   r-   r5   r=   r"   r"   r#   serial_numberD  s    z_OCSPResponse.serial_numberc                 C   s   |    | jj| jS r?   )r>   r-   Z_ocsp_basicresp_ext_parserparser2   r=   r"   r"   r#   
extensionsI  s    z_OCSPResponse.extensionsc                 C   s   |    | jj| jS r?   )r>   r-   Z_ocsp_singleresp_ext_parserrg   r4   r=   r"   r"   r#   single_extensionsN  s    z_OCSPResponse.single_extensionsencodingr;   c                 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DERr3   r-   _create_mem_bio_gcr   Zi2d_OCSP_RESPONSE_bior.   r   _read_mem_bior6   rk   Zbior!   r"   r"   r#   public_bytesS  s    
 z_OCSPResponse.public_bytes)0__name__
__module____qualname__r9   r   Zread_only_propertyr<   r>   propertyr   rA   rC   typingOptionalr   HashAlgorithmrD   bytesrF   rK   ListZCertificaterQ   rU   NamerW   rR   datetimerX   r   rZ   r^   ZReasonFlagsr`   ra   rb   rc   rd   re   intrf   cached_property
Extensionsrh   ri   r   rm   rr   r"   r"   r"   r#   r,   Y   sX    

	r,   c                   @   s   e Zd Zdd ZeedddZeedddZeeddd	Z	ee
jdd
dZejejdddZejed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_get0_requestr   r   r   ZOCSP_onereq_get0_idr5   )r6   r   Zocsp_requestr"   r"   r#   r9   `  s     z_OCSPRequest.__init__r:   c                 C   s   t | j| jS r?   )r$   r-   r5   r=   r"   r"   r#   rc   n  s    z_OCSPRequest.issuer_key_hashc                 C   s   t | j| jS r?   )r%   r-   r5   r=   r"   r"   r#   rd   r  s    z_OCSPRequest.issuer_name_hashc                 C   s   t | j| jS r?   )r'   r-   r5   r=   r"   r"   r#   rf   v  s    z_OCSPRequest.serial_numberc                 C   s   t | j| jS r?   )r+   r-   r5   r=   r"   r"   r#   re   z  s    z_OCSPRequest.hash_algorithmc                 C   s   | j j| jS r?   )r-   Z_ocsp_req_ext_parserrg   r   r=   r"   r"   r#   rh   ~  s    z_OCSPRequest.extensionsrj   c                 C   sL   |t jjk	rtd| j }| jj|| j}| j	|dk | j
|S rl   )r   rm   rn   r3   r-   ro   r   Zi2d_OCSP_REQUEST_bior   r   rp   rq   r"   r"   r#   rr     s    
z_OCSPRequest.public_bytesN)rs   rt   ru   r9   rv   rz   rc   rd   r~   rf   r   ry   re   r   r   r   r   rh   r   rm   rr   r"   r"   r"   r#   r   _  s   r   )!r}   rw   Zcryptographyr   r   Zcryptography.exceptionsr   Z0cryptography.hazmat.backends.openssl.decode_asn1r   r   r   r   r	   r
   Z)cryptography.hazmat.backends.openssl.x509r   Zcryptography.hazmat.primitivesr   r   Zcryptography.x509.ocspr   r   r   r   r   r   r   r$   r%   r'   r+   r,   r   r"   r"   r"   r#   <module>   s    $
  