U
    *”}fÌ6  ã                   @   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 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Ú_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© úM/tmp/pip-unpacked-wheel-x36vw73o/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    ûr1   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_hashr0   r   r   r   Ú_issuer_name_hash<   s    ûr2   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/   Únumr0   r   r   r   Ú_serial_numberJ   s        ÿr4   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asn1objr0   Úoidr   r   r   Ú_hash_algorithmT   s"    û
ÿr8   c                   @   sb  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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¡}|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&   zhOCSP response contains more than one SINGLERESP structure, which this library does not support. {} foundr   )Ú_backendÚ_ocsp_responser*   ZOCSP_response_statusr-   r   Ú_statusr   r   ZOCSP_response_get1_basicr(   r,   ÚgcZOCSP_BASICRESP_freeÚ_basicZOCSP_resp_countr   r6   ZOCSP_resp_get0Ú_singleZOCSP_SINGLERESP_get0_idÚ_cert_id)r   r.   Zocsp_responseÚstatusÚbasicZnum_respr   r   r   Ú__init__j   s>    
ÿ ÿþÿÿÿÿ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algr7   r   r   r   Úsignature_algorithm_oidŒ   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)rF   r   Z_SIG_OIDS_TO_HASHr5   r   r6   )r   r7   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 rD   )r:   r*   ZOCSP_resp_get0_signaturer>   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*   ZOPENSSL_free)Ú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respdataÚppr0   r   rK   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 rD   )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_x509r3   ÚcertsÚir   Úcertr   r   r   Úcertificates´   s    z_OCSPResponse.certificatesc                 C   s.   |   ¡ \}}|| jjjkrd S t| j|ƒS d S rD   )Ú_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 rD   )rW   r:   r(   r,   r   )r   Ú	x509_namerX   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   rY   r[   r0   r   r   r   rW   Ø   s      ÿz!_OCSPResponse._responder_key_namec                 C   s   | j j | j¡}t| j |ƒS rD   )r:   r*   ZOCSP_resp_get0_produced_atr>   r   )r   Úproduced_atr   r   r   r]   á   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 rD   )r:   r*   ÚOCSP_single_get0_statusr?   r(   r,   r-   r   )r   rA   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*   r^   r?   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   ra   r:   r(   r)   r*   r^   r?   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*   r^   r?   r,   r-   r   rb   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*   r^   r?   r,   r   rb   r   r   r   Únext_update,  s    ûz_OCSPResponse.next_updatec                 C   s   t | j| jƒS rD   ©r1   r:   r@   rK   r   r   r   Úissuer_key_hash<  s    z_OCSPResponse.issuer_key_hashc                 C   s   t | j| jƒS rD   ©r2   r:   r@   rK   r   r   r   Úissuer_name_hashA  s    z_OCSPResponse.issuer_name_hashc                 C   s   t | j| jƒS rD   ©r8   r:   r@   rK   r   r   r   Úhash_algorithmF  s    z_OCSPResponse.hash_algorithmc                 C   s   t | j| jƒS rD   ©r4   r:   r@   rK   r   r   r   Úserial_numberK  s    z_OCSPResponse.serial_numberc                 C   s   | j j | j¡S rD   )r:   Z_ocsp_basicresp_ext_parserÚparser>   rK   r   r   r   Ú
extensionsP  s    z_OCSPResponse.extensionsc                 C   s   | j j | j¡S rD   )r:   Z_ocsp_singleresp_ext_parserrp   r?   rK   r   r   r   Úsingle_extensionsU  s    z_OCSPResponse.single_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bior0   r   r   r   Úpublic_bytesZ  s    
 ÿz_OCSPResponse.public_bytesN)Ú__name__Ú
__module__Ú__qualname__rC   r   Zread_only_propertyr   Úpropertyr#   rF   rG   rI   rP   rV   rZ   r\   rW   r]   r_   rc   re   rf   rg   ri   rk   rm   ro   Úcached_propertyrq   rr   rz   r   r   r   r   r9   h   sz    
		r9   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_get0Ú_requestr-   r(   r,   ZOCSP_onereq_get0_idr@   )r   r.   Zocsp_requestr   r   r   rC   h  s    ÿ ÿz_OCSPRequest.__init__c                 C   s   t | j| jƒS rD   rh   rK   r   r   r   ri   v  s    z_OCSPRequest.issuer_key_hashc                 C   s   t | j| jƒS rD   rj   rK   r   r   r   rk   z  s    z_OCSPRequest.issuer_name_hashc                 C   s   t | j| jƒS rD   rn   rK   r   r   r   ro   ~  s    z_OCSPRequest.serial_numberc                 C   s   t | j| jƒS rD   rl   rK   r   r   r   rm   ‚  s    z_OCSPRequest.hash_algorithmc                 C   s   | j j | j¡S rD   )r:   Z_ocsp_req_ext_parserrp   r‚   rK   r   r   r   rq   †  s    z_OCSPRequest.extensionsc                 C   sL   |t jjk	rtdƒ‚| j ¡ }| jj || j¡}| j 	|dk¡ | j 
|¡S rs   )r   rt   ru   r   r:   rv   r*   Zi2d_OCSP_REQUEST_bior‚   r-   rw   rx   r   r   r   rz   Š  s    
z_OCSPRequest.public_bytesN)r{   r|   r}   rC   r~   ri   rk   ro   rm   r   r   rq   rz   r   r   r   r   r€   f  s   




r€   )&Ú
__future__r   r   r   r!   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   Zcryptography.x509.ocspr   r   r   r   r   r   r   r#   r1   r2   r4   r8   Zregister_interfaceÚobjectr9   r€   r   r   r   r   Ú<module>   s"    $
 ~