o
    ™¨Êhÿ3  ã                   @   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ƒ‚ˆ | g|¢R Ž S )NzCOCSP response status is not successful so the property has no value)Úresponse_statusr   Ú
SUCCESSFULÚ
ValueError)ÚselfÚargs©Úfunc© ú[/var/www/html/env/lib/python3.10/site-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_idÚkey_hashÚresr    r    r!   Ú_issuer_key_hash'   ó   
þr4   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   Ú	name_hashr3   r    r    r!   Ú_issuer_name_hash2   s   þr7   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   Únumr3   r    r    r!   Ú_serial_number=   r5   r9   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yB   t	d 
|¡ƒ‚w )NzASN1_OBJECT **r(   r   z+Signature algorithm OID: {0} not recognized)r*   r+   r,   r-   r.   r/   r   r   ÚKeyErrorr   Úformat)r0   r1   Úasn1objr3   Úoidr    r    r!   Ú_hash_algorithmH   s   þ
ÿÿr>   c                   @   s@  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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v ¡ t| | _| jtju 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 d S )Nr(   r   )Ú_backendÚ_ocsp_responser,   ÚOCSP_response_statusr/   r   Ú_statusr   r   ÚOCSP_response_get1_basicr*   r.   ÚgcÚOCSP_BASICRESP_freeÚ_basicÚOCSP_resp_countÚOCSP_resp_get0Ú_singleÚOCSP_SINGLERESP_get0_idÚ_cert_id)r   r0   Úocsp_responseÚstatusÚbasicr    r    r!   Ú__init__[   s6   
ÿ
ÿÿÿÿÿîz_OCSPResponse.__init__rC   c                 C   s>   | j j | j¡}| j  || j jjk¡ t| j |jƒ}t	 
|¡S ©N)r@   r,   ÚOCSP_resp_get0_tbs_sigalgrG   r/   r*   r.   r   Ú	algorithmr   ÚObjectIdentifier)r   Úalgr=   r    r    r!   Úsignature_algorithm_oidy   s   
z%_OCSPResponse.signature_algorithm_oidc                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS rQ   )r@   r,   ÚOCSP_resp_get0_signaturerG   r/   r*   r.   r   )r   Ú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,   ÚOPENSSL_free)Úpointer©r   r    r!   Ú<lambda>‘   s    z2_OCSPResponse.tbs_response_bytes.<locals>.<lambda>)r@   r,   ÚOCSP_resp_get0_respdatarG   r/   r*   r.   r+   Úi2d_OCSP_RESPDATArE   Úbuffer)r   ÚrespdataÚppr3   r    r\   r!   Útbs_response_bytesˆ   s   ÿz _OCSPResponse.tbs_response_bytesc                 C   sv   | j j | j¡}| j j |¡}g }t|ƒD ]#}| j j ||¡}| j  || j jj	k¡ t
| j |ƒ}| |_| |¡ q|S rQ   )r@   r,   ÚOCSP_resp_get0_certsrG   Úsk_X509_numÚrangeÚsk_X509_valuer/   r*   r.   r   Ú
_ocsp_respÚappend)r   Úsk_x509r8   ÚcertsÚir   Úcertr    r    r!   Úcertificates–   s   z_OCSPResponse.certificatesc                 C   s*   |   ¡ \}}|| jjjkrd S t| j|ƒS rQ   )Ú_responder_key_namer@   r*   r.   r   )r   Ú_Úasn1_stringr    r    r!   Úresponder_key_hash¨   ó   z _OCSPResponse.responder_key_hashc                 C   s*   |   ¡ \}}|| jjjkrd S t| j|ƒS rQ   )ro   r@   r*   r.   r   )r   Ú	x509_namerp   r    r    r!   Úresponder_name±   rs   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,   ÚOCSP_resp_get0_idrG   r/   )r   rq   rt   r3   r    r    r!   ro   º   s   ÿz!_OCSPResponse._responder_key_namec                 C   s   | j j | j¡}t| j |ƒS rQ   )r@   r,   ÚOCSP_resp_get0_produced_atrG   r   )r   Úproduced_atr    r    r!   rx   Ã   s   ÿz_OCSPResponse.produced_atc                 C   sH   | j j | j| j jj| j jj| j jj| j jj¡}| j  |tv ¡ t| S rQ   )r@   r,   ÚOCSP_single_get0_statusrJ   r*   r.   r/   r   )r   rN   r    r    r!   Úcertificate_statusË   s   ûz _OCSPResponse.certificate_statusc                 C   sr   | j tju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   )rz   r   ÚREVOKEDr@   r*   r+   r,   ry   rJ   r.   r/   r   ©r   Ú	asn1_timer    r    r!   Úrevocation_timeØ   s   ûz_OCSPResponse.revocation_timec                 C   sx   | j tju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v ¡ t|d  S )Nzint *r   éÿÿÿÿ)rz   r   r|   r@   r*   r+   r,   ry   rJ   r.   r/   r   )r   Ú
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,   ry   rJ   r.   r/   r   r}   r    r    r!   Úthis_update   s   ûz_OCSPResponse.this_updatec                 C   s^   | j j d¡}| j j | j| j jj| j jj| j jj|¡ |d | j jjkr-t| j |d ƒS d S r{   )r@   r*   r+   r,   ry   rJ   r.   r   r}   r    r    r!   Únext_update  s   ûz_OCSPResponse.next_updatec                 C   ó   t | j| jƒS rQ   ©r4   r@   rL   r\   r    r    r!   Úissuer_key_hash  ó   z_OCSPResponse.issuer_key_hashc                 C   r…   rQ   ©r7   r@   rL   r\   r    r    r!   Úissuer_name_hash#  rˆ   z_OCSPResponse.issuer_name_hashc                 C   r…   rQ   ©r>   r@   rL   r\   r    r    r!   Úhash_algorithm(  rˆ   z_OCSPResponse.hash_algorithmc                 C   r…   rQ   ©r9   r@   rL   r\   r    r    r!   Úserial_number-  rˆ   z_OCSPResponse.serial_numberc                 C   ó   t  | j| j¡S rQ   )r	   Úparser@   rG   r\   r    r    r!   Ú
extensions2  s   z_OCSPResponse.extensionsc                 C   óL   |t jju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,   Úi2d_OCSP_RESPONSE_biorA   r/   Ú_read_mem_bio©r   ÚencodingÚbior3   r    r    r!   Úpublic_bytes7  s   ÿ
ÿz_OCSPResponse.public_bytesN)Ú__name__Ú
__module__Ú__qualname__rP   r   Úread_only_propertyr   Úpropertyr%   rV   rY   rc   rn   rr   ru   ro   rx   rz   r   r‚   rƒ   r„   r‡   rŠ   rŒ   rŽ   Úcached_propertyr‘   rœ   r    r    r    r!   r?   Y   sp    
	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,   ÚOCSP_request_onereq_countÚNotImplementedErrorr@   Ú_ocsp_requestÚOCSP_request_onereq_get0Ú_requestr/   r*   r.   ÚOCSP_onereq_get0_idrL   )r   r0   Úocsp_requestr    r    r!   rP   G  s   ÿÿz_OCSPRequest.__init__c                 C   r…   rQ   r†   r\   r    r    r!   r‡   U  ó   z_OCSPRequest.issuer_key_hashc                 C   r…   rQ   r‰   r\   r    r    r!   rŠ   Y  r«   z_OCSPRequest.issuer_name_hashc                 C   r…   rQ   r�   r\   r    r    r!   rŽ   ]  r«   z_OCSPRequest.serial_numberc                 C   r…   rQ   r‹   r\   r    r    r!   rŒ   a  r«   z_OCSPRequest.hash_algorithmc                 C   r�   rQ   )r
   r�   r@   r¦   r\   r    r    r!   r‘   e  s   z_OCSPRequest.extensionsc                 C   r’   r“   )r   r”   r•   r   r@   r–   r,   Úi2d_OCSP_REQUEST_bior¦   r/   r˜   r™   r    r    r!   rœ   i  s   ÿ
z_OCSPRequest.public_bytesN)r�   rž   rŸ   rP   r¡   r‡   rŠ   rŽ   rŒ   r   r¢   r‘   rœ   r    r    r    r!   r£   E  s    




r£   )(Ú
__future__r   r   r   r#   Úcryptographyr   r   Úcryptography.exceptionsr   Ú0cryptography.hazmat.backends.openssl.decode_asn1r   r	   r
   r   r   r   r   r   Ú)cryptography.hazmat.backends.openssl.x509r   Úcryptography.hazmat.primitivesr   Úcryptography.x509.ocspr   r   r   r   r   r   r   r%   r4   r7   r9   r>   Úregister_interfaceÚobjectr?   r£   r    r    r    r!   Ú<module>   s$   ($ l