o
    >b9                     @   sn  d dl Z d dlZd dlZd dl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 e e e e e dZG dd dejZG d	d
 d
ejZdd eD ZejejejejejfZdd ZG dd dejZdd eD ZG dd deZG dd de jdZG dd de jdZ G dd deZ!G dd deZ"de#defdd Z$de#de fd!d"Z%dS )#    N)utils)x509)hashesserialization)_EARLIEST_UTC_TIME_PRIVATE_KEY_TYPES_convert_to_naive_utc_time_reject_duplicate_extension)z1.3.14.3.2.26z2.16.840.1.101.3.4.2.4z2.16.840.1.101.3.4.2.1z2.16.840.1.101.3.4.2.2z2.16.840.1.101.3.4.2.3c                   @   s   e Zd ZdZdZdS )OCSPResponderEncodingzBy HashzBy NameN)__name__
__module____qualname__ZHASHNAME r   r   8/usr/lib/python3/dist-packages/cryptography/x509/ocsp.pyr
      s    r
   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )OCSPResponseStatusr                  N)	r   r   r   
SUCCESSFULZMALFORMED_REQUESTZINTERNAL_ERRORZ	TRY_LATERZSIG_REQUIREDZUNAUTHORIZEDr   r   r   r   r   #   s    r   c                 C      i | ]}|j |qS r   value.0xr   r   r   
<dictcomp>,       r   c                 C   s   t | ts	tdd S )Nz9Algorithm must be SHA1, SHA224, SHA256, SHA384, or SHA512)
isinstance_ALLOWED_HASHES
ValueError)	algorithmr   r   r   _verify_algorithm6   s
   
r$   c                   @   s   e Zd ZdZdZdZdS )OCSPCertStatusr   r   r   N)r   r   r   ZGOODREVOKEDZUNKNOWNr   r   r   r   r%   =   s    r%   c                 C   r   r   r   r   r   r   r   r   C   r   c                   @   s   e Zd Zdd ZdS )_SingleResponsec	           	      C   s  t |tjrt |tjstdt| t |tjstd|d ur,t |tjs,td|| _|| _|| _|| _	|| _
t |tsDtd|tjurZ|d urQtd|d urYtdn$t |tjsdtdt|}|tk rptd|d ur~t |tjs~td	|| _|| _|| _d S )
N%cert and issuer must be a Certificatez%this_update must be a datetime objectz-next_update must be a datetime object or Nonez8cert_status must be an item from the OCSPCertStatus enumzBrevocation_time can only be provided if the certificate is revokedzDrevocation_reason can only be provided if the certificate is revokedz)revocation_time must be a datetime objectz7The revocation_time must be on or after 1950 January 1.zCrevocation_reason must be an item from the ReasonFlags enum or None)r    r   Certificate	TypeErrorr$   datetimeZ_certZ_issuerZ
_algorithmZ_this_updateZ_next_updater%   r&   r"   r   r   ReasonFlagsZ_cert_statusZ_revocation_timeZ_revocation_reason)	selfcertissuerr#   cert_statusthis_updatenext_updaterevocation_timerevocation_reasonr   r   r   __init__G   s\   




z_SingleResponse.__init__N)r   r   r   r5   r   r   r   r   r'   F   s    r'   c                   @   s   e Zd ZejdefddZejdefddZejdej	fddZ
ejdefdd	Zejd
ejdefddZejdejfddZdS )OCSPRequestreturnc                 C      dS z3
        The hash of the issuer public key
        Nr   r-   r   r   r   issuer_key_hash       zOCSPRequest.issuer_key_hashc                 C   r8   z-
        The hash of the issuer name
        Nr   r:   r   r   r   issuer_name_hash   r<   zOCSPRequest.issuer_name_hashc                 C   r8   zK
        The hash algorithm used in the issuer name and key hashes
        Nr   r:   r   r   r   hash_algorithm   r<   zOCSPRequest.hash_algorithmc                 C   r8   zM
        The serial number of the cert whose status is being checked
        Nr   r:   r   r   r   serial_number   r<   zOCSPRequest.serial_numberencodingc                 C   r8   )z/
        Serializes the request to DER
        Nr   r-   rC   r   r   r   public_bytes   r<   zOCSPRequest.public_bytesc                 C   r8   )zP
        The list of request extensions. Not single request extensions.
        Nr   r:   r   r   r   
extensions   r<   zOCSPRequest.extensionsN)r   r   r   abcabstractpropertybytesr;   r>   r   HashAlgorithmr@   intrB   abstractmethodr   EncodingrE   r   
ExtensionsrF   r   r   r   r   r6      s    r6   )	metaclassc                   @   s  e Zd ZejdefddZejdejfddZ	ejde
jej fddZejdefdd	Zejdefd
dZejde
jej fddZejde
je fddZejde
jej fddZejdejfddZejdefddZejde
jej fddZejde
jej fddZejdejfddZejde
jej fddZ ejdefddZ!ejdefd d!Z"ejdejfd"d#Z#ejde$fd$d%Z%ejdej&fd&d'Z'ejdej&fd(d)Z(ej)d*e*j+defd+d,Z,d-S ).OCSPResponser7   c                 C   r8   )zm
        The status of the response. This is a value from the OCSPResponseStatus
        enumeration
        Nr   r:   r   r   r   response_status   r<   zOCSPResponse.response_statusc                 C   r8   )zA
        The ObjectIdentifier of the signature algorithm
        Nr   r:   r   r   r   signature_algorithm_oid   r<   z$OCSPResponse.signature_algorithm_oidc                 C   r8   )zX
        Returns a HashAlgorithm corresponding to the type of the digest signed
        Nr   r:   r   r   r   signature_hash_algorithm   r<   z%OCSPResponse.signature_hash_algorithmc                 C   r8   )z%
        The signature bytes
        Nr   r:   r   r   r   	signature   r<   zOCSPResponse.signaturec                 C   r8   )z+
        The tbsResponseData bytes
        Nr   r:   r   r   r   tbs_response_bytes   r<   zOCSPResponse.tbs_response_bytesc                 C   r8   )z
        A list of certificates used to help build a chain to verify the OCSP
        response. This situation occurs when the OCSP responder uses a delegate
        certificate.
        Nr   r:   r   r   r   certificates   r<   zOCSPResponse.certificatesc                 C   r8   )z2
        The responder's key hash or None
        Nr   r:   r   r   r   responder_key_hash   r<   zOCSPResponse.responder_key_hashc                 C   r8   )z.
        The responder's Name or None
        Nr   r:   r   r   r   responder_name   r<   zOCSPResponse.responder_namec                 C   r8   )z4
        The time the response was produced
        Nr   r:   r   r   r   produced_at   r<   zOCSPResponse.produced_atc                 C   r8   )zY
        The status of the certificate (an element from the OCSPCertStatus enum)
        Nr   r:   r   r   r   certificate_status   r<   zOCSPResponse.certificate_statusc                 C   r8   )z^
        The date of when the certificate was revoked or None if not
        revoked.
        Nr   r:   r   r   r   r3      r<   zOCSPResponse.revocation_timec                 C   r8   )zi
        The reason the certificate was revoked or None if not specified or
        not revoked.
        Nr   r:   r   r   r   r4      r<   zOCSPResponse.revocation_reasonc                 C   r8   )z
        The most recent time at which the status being indicated is known by
        the responder to have been correct
        Nr   r:   r   r   r   r1     r<   zOCSPResponse.this_updatec                 C   r8   )zC
        The time when newer information will be available
        Nr   r:   r   r   r   r2   	  r<   zOCSPResponse.next_updatec                 C   r8   r9   r   r:   r   r   r   r;     r<   zOCSPResponse.issuer_key_hashc                 C   r8   r=   r   r:   r   r   r   r>     r<   zOCSPResponse.issuer_name_hashc                 C   r8   r?   r   r:   r   r   r   r@     r<   zOCSPResponse.hash_algorithmc                 C   r8   rA   r   r:   r   r   r   rB   !  r<   zOCSPResponse.serial_numberc                 C   r8   )zR
        The list of response extensions. Not single response extensions.
        Nr   r:   r   r   r   rF   '  r<   zOCSPResponse.extensionsc                 C   r8   )zR
        The list of single response extensions. Not response extensions.
        Nr   r:   r   r   r   single_extensions-  r<   zOCSPResponse.single_extensionsrC   c                 C   r8   )z0
        Serializes the response to DER
        Nr   rD   r   r   r   rE   3  r<   zOCSPResponse.public_bytesN)-r   r   r   rG   rH   r   rQ   r   ZObjectIdentifierrR   typingOptionalr   rJ   rS   rI   rT   rU   ZListr)   rV   rW   NamerX   r+   rY   r%   rZ   r3   r,   r4   r1   r2   r;   r>   r@   rK   rB   rN   rF   r[   rL   r   rM   rE   r   r   r   r   rP      sZ    
rP   c                   @   s`   e Zd Zdg fddZdejdejdejdd fdd	Zd
ej	de
dd fddZdefddZdS )OCSPRequestBuilderNc                 C   s   || _ || _d S N)_request_extensions)r-   ZrequestrF   r   r   r   r5   ;  s   
zOCSPRequestBuilder.__init__r.   r/   r#   r7   c                 C   sL   | j d ur	tdt| t|tjrt|tjstdt|||f| jS )Nz.Only one certificate can be added to a requestr(   )	ra   r"   r$   r    r   r)   r*   r_   rb   )r-   r.   r/   r#   r   r   r   add_certificate?  s   
z"OCSPRequestBuilder.add_certificateextvalcriticalc                 C   sD   t |tjs
tdt|j||}t|| j t| j	| j|g S Nz"extension must be an ExtensionType)
r    r   ExtensionTyper*   	Extensionoidr	   rb   r_   ra   r-   rd   re   	extensionr   r   r   add_extensionP  s   z OCSPRequestBuilder.add_extensionc                 C   s(   ddl m} | jd u rtd|| S )Nr   backendz*You must add a certificate before building),cryptography.hazmat.backends.openssl.backendrn   ra   r"   Zcreate_ocsp_request)r-   rn   r   r   r   build]  s   

zOCSPRequestBuilder.build)r   r   r   r5   r   r)   r   rJ   rc   rg   boolrl   r6   rp   r   r   r   r   r_   :  s&    

r_   c                   @   s   e Zd Zdddg fddZdejdejdejdede	j	d	e
je	j	 d
e
je	j	 de
jej dd fddZdedejdd fddZde
jej dd fddZdejdedd fddZdede
jej defddZededefddZdS ) OCSPResponseBuilderNc                 C   s   || _ || _|| _|| _d S r`   )	_response_responder_id_certsrb   )r-   Zresponseresponder_idcertsrF   r   r   r   r5   g  s   
zOCSPResponseBuilder.__init__r.   r/   r#   r0   r1   r2   r3   r4   r7   c	           
   	   C   s<   | j d ur	tdt||||||||}	t|	| j| j| jS )Nz#Only one response per OCSPResponse.)rs   r"   r'   rr   rt   ru   rb   )
r-   r.   r/   r#   r0   r1   r2   r3   r4   Z
singlerespr   r   r   add_responseo  s$   

z OCSPResponseBuilder.add_responserC   responder_certc                 C   sP   | j d ur	tdt|tjstdt|tstdt| j||f| j	| j
S )Nz!responder_id can only be set oncez$responder_cert must be a Certificatez6encoding must be an element from OCSPResponderEncoding)rt   r"   r    r   r)   r*   r
   rr   rs   ru   rb   )r-   rC   ry   r   r   r   rv     s   

z OCSPResponseBuilder.responder_idrw   c                 C   s\   | j d ur	tdt|}t|dkrtdtdd |D s$tdt| j| j|| j	S )Nz!certificates may only be set oncer   zcerts must not be an empty listc                 s   s    | ]	}t |tjV  qd S r`   )r    r   r)   r   r   r   r   	<genexpr>  s    z3OCSPResponseBuilder.certificates.<locals>.<genexpr>z$certs must be a list of Certificates)
ru   r"   listlenallr*   rr   rs   rt   rb   )r-   rw   r   r   r   rV     s   
z OCSPResponseBuilder.certificatesrd   re   c                 C   sL   t |tjs
tdt|j||}t|| j t| j	| j
| j| j|g S rf   )r    r   rg   r*   rh   ri   r	   rb   rr   rs   rt   ru   rj   r   r   r   rl     s   
z!OCSPResponseBuilder.add_extensionprivate_keyc                 C   sB   ddl m} | jd u rtd| jd u rtd|tj| ||S )Nr   rm   z&You must add a response before signingz*You must add a responder_id before signing)ro   rn   rs   r"   rt   create_ocsp_responser   r   )r-   r~   r#   rn   r   r   r   sign  s   


zOCSPResponseBuilder.signrQ   c                 C   s@   ddl m} t|tstd|tju rtd||d d d S )Nr   rm   z7response_status must be an item from OCSPResponseStatusz$response_status cannot be SUCCESSFUL)ro   rn   r    r   r*   r   r"   r   )clsrQ   rn   r   r   r   build_unsuccessful  s   

z&OCSPResponseBuilder.build_unsuccessful)r   r   r   r5   r   r)   r   rJ   r%   r+   r\   r]   r,   rx   r
   rv   IterablerV   rg   rq   rl   r   rP   r   classmethodr   r   r   r   r   r   rr   f  sl    



	







rr   datar7   c                 C      ddl m} || S Nr   rm   )ro   rn   load_der_ocsp_requestr   rn   r   r   r   r        
r   c                 C   r   r   )ro   rn   load_der_ocsp_responser   r   r   r   r     r   r   )&rG   r+   r\   Zcryptographyr   r   Zcryptography.hazmat.primitivesr   r   Zcryptography.x509.baser   r   r   r	   ZSHA1ZSHA224ZSHA256ZSHA384ZSHA512Z_OIDS_TO_HASHEnumr
   r   Z_RESPONSE_STATUS_TO_ENUMr!   r$   r%   Z_CERT_STATUS_TO_ENUMobjectr'   ABCMetar6   rP   r_   rr   rI   r   r   r   r   r   r   <module>   sB   				F& 	,|