o
    )%a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_idÚkey_hashÚres© r#   úK/usr/lib/python3/dist-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    Ú	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yB   t	d 
|¡ƒ‚w )NzASN1_OBJECT **r   r   z*Signature algorithm OID: {} not recognized)r   r   r   r   r   r   r	   r   ÚKeyErrorr   Úformat)r   r    Úasn1objr"   Úoidr#   r#   r$   Ú_hash_algorithmE   s$   û
ÿÿr.   c                   @   sà  e Zd Zdd„ Ze d¡Zd3dd„Zede	j
fdd	„ƒZedejej fd
d„ƒZedefdd„ƒZedefdd„ƒZedeje	j fdd„ƒZedeje fdd„ƒZedeje	j fdd„ƒZdd„ Zedejfdd„ƒZedefdd„ƒZedejej fdd„ƒZedeje	j  fdd„ƒZ!edejfd d!„ƒZ"edejej fd"d#„ƒZ#edefd$d%„ƒZ$edefd&d'„ƒZ%edejfd(d)„ƒZ&ede'fd*d+„ƒZ(ej)de	j*fd,d-„ƒZ+ej)de	j*fd.d/„ƒZ,d0e-j.defd1d2„Z/dS )4Ú_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¡}|dkrStd |¡ƒ‚| j j | jd¡| _| j  | j| j j
jk¡ | j j | j¡| _| j  | j| j j
jk¡ d S d S )Nr   zhOCSP response contains more than one SINGLERESP structure, which this library does not support. {} foundr   )Ú_backendÚ_ocsp_responser   ÚOCSP_response_statusr   r   Ú_statusr   Ú
SUCCESSFULÚOCSP_response_get1_basicr   r   ÚgcÚOCSP_BASICRESP_freeÚ_basicÚOCSP_resp_countÚ
ValueErrorr+   ÚOCSP_resp_get0Ú_singleÚOCSP_SINGLERESP_get0_idÚ_cert_id)Úselfr   Úocsp_responseÚstatusÚbasicÚnum_respr#   r#   r$   Ú__init__Z   s<   
ÿ
ÿýÿÿÿêz_OCSPResponse.__init__r3   ÚreturnNc                 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   r4   r:   ©r?   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)rH   r0   r   ÚOCSP_resp_get0_tbs_sigalgr8   r   r   r   r	   Ú	algorithmr   ÚObjectIdentifier)r?   Úalgr-   r#   r#   r$   Úsignature_algorithm_oidƒ   s
   
z%_OCSPResponse.signature_algorithm_oidc                 C   s8   |   ¡  | j}ztj| W S  ty   td |¡ƒ‚w )Nz)Signature algorithm OID:{} not recognized)rH   rN   r   Ú_SIG_OIDS_TO_HASHr*   r   r+   )r?   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 rI   )	rH   r0   r   ÚOCSP_resp_get0_signaturer8   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   )r0   r   ÚOPENSSL_free)ÚpointerrG   r#   r$   Ú<lambda>¨   s    z2_OCSPResponse.tbs_response_bytes.<locals>.<lambda>)rH   r0   r   ÚOCSP_resp_get0_respdatar8   r   r   r   r   Úi2d_OCSP_RESPDATAr6   Úbuffer)r?   ÚrespdataÚppr"   r#   rG   r$   Útbs_response_bytesŸ   s   ÿz _OCSPResponse.tbs_response_bytesc                 C   s~   |   ¡  | jj | j¡}| jj |¡}g }t|ƒD ]#}| jj ||¡}| j || jj	j
k¡ t| j|ƒ}| |_| |¡ q|S rI   )rH   r0   r   ÚOCSP_resp_get0_certsr8   Úsk_X509_numÚrangeÚsk_X509_valuer   r   r   r   Ú_ocsp_resp_refÚappend)r?   Úsk_x509r(   ÚcertsÚiÚx509_ptrÚcertr#   r#   r$   Úcertificates­   s   z_OCSPResponse.certificatesc                 C   s2   |   ¡  |  ¡ \}}|| jjjkrd S t| j|ƒS rI   )rH   Ú_responder_key_namer0   r   r   r   )r?   Ú_Úasn1_stringr#   r#   r$   Úresponder_key_hash¿   ó
   z _OCSPResponse.responder_key_hashc                 C   s2   |   ¡  |  ¡ \}}|| jjjkrd S t| j|ƒS rI   )rH   ri   r0   r   r   r   )r?   Ú	x509_namerj   r#   r#   r$   Úresponder_nameÈ   rm   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   )r0   r   r   r   ÚOCSP_resp_get0_idr8   r   )r?   rk   rn   r"   r#   r#   r$   ri   Ñ   s   ÿz!_OCSPResponse._responder_key_namec                 C   s$   |   ¡  | jj | j¡}t| j|ƒS rI   )rH   r0   r   ÚOCSP_resp_get0_produced_atr8   r
   )r?   Úproduced_atr#   r#   r$   rr   Ú   s
   ÿz_OCSPResponse.produced_atc                 C   sP   |   ¡  | jj | j| jjj| jjj| jjj| jjj¡}| j |tv ¡ t| S rI   )	rH   r0   r   ÚOCSP_single_get0_statusr<   r   r   r   r   )r?   rA   r#   r#   r$   Úcertificate_statusâ   s   ûz _OCSPResponse.certificate_statusc                 C   sz   |   ¡  | 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   )rH   rt   r   ÚREVOKEDr0   r   r   r   rs   r<   r   r   r
   ©r?   Ú	asn1_timer#   r#   r$   Úrevocation_timeï   s   ûz_OCSPResponse.revocation_timec                 C   s€   |   ¡  | 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r0d S | j |d tv ¡ t|d  S )Nzint *r   éÿÿÿÿ)rH   rt   r   rv   r0   r   r   r   rs   r<   r   r   r   )r?   Ú
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 ru   )
rH   r0   r   r   r   rs   r<   r   r   r
   rw   r#   r#   r$   Úthis_update  s   ûz_OCSPResponse.this_updatec                 C   sf   |   ¡  | jj d¡}| jj | j| jjj| jjj| jjj|¡ |d | jjjkr1t| j|d ƒS d S ru   )	rH   r0   r   r   r   rs   r<   r   r
   rw   r#   r#   r$   Únext_update%  s   ûz_OCSPResponse.next_updatec                 C   ó   |   ¡  t| j| jƒS rI   )rH   r%   r0   r>   rG   r#   r#   r$   Úissuer_key_hash5  ó   z_OCSPResponse.issuer_key_hashc                 C   r   rI   )rH   r'   r0   r>   rG   r#   r#   r$   Úissuer_name_hash:  r   z_OCSPResponse.issuer_name_hashc                 C   r   rI   )rH   r.   r0   r>   rG   r#   r#   r$   Úhash_algorithm?  r   z_OCSPResponse.hash_algorithmc                 C   r   rI   )rH   r)   r0   r>   rG   r#   r#   r$   Úserial_numberD  r   z_OCSPResponse.serial_numberc                 C   ó   |   ¡  | jj | j¡S rI   )rH   r0   Ú_ocsp_basicresp_ext_parserÚparser8   rG   r#   r#   r$   Ú
extensionsI  ó   z_OCSPResponse.extensionsc                 C   r…   rI   )rH   r0   Ú_ocsp_singleresp_ext_parserr‡   r<   rG   r#   r#   r$   Úsingle_extensionsN  r‰   z_OCSPResponse.single_extensionsÚencodingc                 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:   r0   Ú_create_mem_bio_gcr   Úi2d_OCSP_RESPONSE_bior1   r   Ú_read_mem_bio©r?   rŒ   Úbior"   r#   r#   r$   Úpublic_bytesS  s   
ÿz_OCSPResponse.public_bytes)rE   N)0Ú__name__Ú
__module__Ú__qualname__rD   r   Úread_only_propertyrF   rH   Úpropertyr   rL   rN   ÚtypingÚOptionalr   ÚHashAlgorithmrP   ÚbytesrS   r\   ÚListÚCertificaterh   rl   ÚNamero   ri   Údatetimerr   r   rt   ry   ÚReasonFlagsr|   r}   r~   r€   r‚   rƒ   Úintr„   Úcached_propertyÚ
Extensionsrˆ   r‹   r   r   r–   r#   r#   r#   r$   r/   Y   s\    
 

þ	r/   c                   @   sˆ   e Zd Zdd„ Zedefdd„ƒZedefdd„ƒZedefdd	„ƒZ	ede
jfd
d„ƒZejdejfdd„ƒZdejdef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ÚNotImplementedErrorr0   Ú_ocsp_requestÚOCSP_request_onereq_get0Ú_requestr   r   r   ÚOCSP_onereq_get0_idr>   )r?   r   Úocsp_requestr#   r#   r$   rD   `  s   ÿÿz_OCSPRequest.__init__rE   c                 C   ó   t | j| jƒS rI   )r%   r0   r>   rG   r#   r#   r$   r€   n  ó   z_OCSPRequest.issuer_key_hashc                 C   r°   rI   )r'   r0   r>   rG   r#   r#   r$   r‚   r  r±   z_OCSPRequest.issuer_name_hashc                 C   r°   rI   )r)   r0   r>   rG   r#   r#   r$   r„   v  r±   z_OCSPRequest.serial_numberc                 C   r°   rI   )r.   r0   r>   rG   r#   r#   r$   rƒ   z  r±   z_OCSPRequest.hash_algorithmc                 C   s   | j j | j¡S rI   )r0   Ú_ocsp_req_ext_parserr‡   r«   rG   r#   r#   r$   rˆ   ~  s   z_OCSPRequest.extensionsrŒ   c                 C   r   rŽ   )r   r   r   r:   r0   r‘   r   Úi2d_OCSP_REQUEST_bior«   r   r“   r”   r#   r#   r$   r–   ‚  s   
z_OCSPRequest.public_bytesN)r—   r˜   r™   rD   r›   rŸ   r€   r‚   r¥   r„   r   rž   rƒ   r   r¦   r   r§   rˆ   r   r   r–   r#   r#   r#   r$   r¨   _  s    r¨   )!r£   rœ   Úcryptographyr   r   Úcryptography.exceptionsr   Ú0cryptography.hazmat.backends.openssl.decode_asn1r   r   r   r   r	   r
   Ú)cryptography.hazmat.backends.openssl.x509r   Úcryptography.hazmat.primitivesr   r   Úcryptography.x509.ocspr   r   r   r   r   r   r   r%   r'   r)   r.   r/   r¨   r#   r#   r#   r$   Ú<module>   s     $
  