o
    Df#N                     @  sb  d dl mZ d dlZ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 d dlmZ d dlmZmZmZ G dd	 d	ejZG d
d dejZejejejejejfZd!ddZG dd dejZG dd dZG dd dejdZ G dd dejdZ!G dd dejdZ"e #e	j  e"#e	j" e!#e	j! G dd dZ$G dd  d Z%e	j&Z&e	j'Z'dS )"    )annotationsN)utilsx509)ocsp)hashesserialization) CertificateIssuerPrivateKeyTypes)_EARLIEST_UTC_TIME_convert_to_naive_utc_time_reject_duplicate_extensionc                   @  s   e Zd ZdZdZdS )OCSPResponderEncodingzBy HashzBy NameN)__name__
__module____qualname__HASHNAME r   r   O/home/ubuntu/webapp/venv/lib/python3.10/site-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   
SUCCESSFULMALFORMED_REQUESTINTERNAL_ERROR	TRY_LATERSIG_REQUIREDUNAUTHORIZEDr   r   r   r   r      s    r   	algorithmhashes.HashAlgorithmreturnNonec                 C  s   t | ts	tdd S )Nz9Algorithm must be SHA1, SHA224, SHA256, SHA384, or SHA512)
isinstance_ALLOWED_HASHES
ValueError)r    r   r   r   _verify_algorithm/   s
   
r'   c                   @  s   e Zd ZdZdZdZdS )OCSPCertStatusr   r   r   N)r   r   r   GOODREVOKEDUNKNOWNr   r   r   r   r(   6   s    r(   c                   @  s   e Zd ZdddZdS )_SingleResponsecertx509.Certificateissuerr    r!   cert_statusr(   this_updatedatetime.datetimenext_updatedatetime.datetime | Nonerevocation_timerevocation_reasonx509.ReasonFlags | Nonec	           	      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'   datetime_cert_issuer
_algorithm_this_update_next_updater(   r*   r&   r
   r	   ReasonFlags_cert_status_revocation_time_revocation_reason)	selfr-   r/   r    r0   r1   r3   r5   r6   r   r   r   __init__=   s\   




z_SingleResponse.__init__N)r-   r.   r/   r.   r    r!   r0   r(   r1   r2   r3   r4   r5   r4   r6   r7   )r   r   r   rF   r   r   r   r   r,   <   s    r,   c                   @  s   e Zd ZeejdddZeejdddZeejddd	ZeejdddZ	ejdddZ
eejdddZdS )OCSPRequestr"   bytesc                 C     dS z3
        The hash of the issuer public key
        Nr   rE   r   r   r   issuer_key_hash       zOCSPRequest.issuer_key_hashc                 C  rI   z-
        The hash of the issuer name
        Nr   rK   r   r   r   issuer_name_hash   rM   zOCSPRequest.issuer_name_hashr!   c                 C  rI   zK
        The hash algorithm used in the issuer name and key hashes
        Nr   rK   r   r   r   hash_algorithm   rM   zOCSPRequest.hash_algorithmintc                 C  rI   zM
        The serial number of the cert whose status is being checked
        Nr   rK   r   r   r   serial_number   rM   zOCSPRequest.serial_numberencodingserialization.Encodingc                 C  rI   )z/
        Serializes the request to DER
        Nr   rE   rU   r   r   r   public_bytes   rM   zOCSPRequest.public_bytesx509.Extensionsc                 C  rI   )zP
        The list of request extensions. Not single request extensions.
        Nr   rK   r   r   r   
extensions   rM   zOCSPRequest.extensionsNr"   rH   r"   r!   r"   rR   rU   rV   r"   rH   r"   rY   )r   r   r   propertyabcabstractmethodrL   rO   rQ   rT   rX   rZ   r   r   r   r   rG      s$    rG   )	metaclassc                   @  s   e Zd Zeejd"ddZeejd#ddZeejd#dd	Zeejd$ddZ	eejd%ddZ
eejd%ddZeejd#ddZeejd#ddZeejd&ddZeejd&ddZeejd'ddZeejd(dd Zd!S ))OCSPSingleResponser"   r(   c                 C  rI   zY
        The status of the certificate (an element from the OCSPCertStatus enum)
        Nr   rK   r   r   r   certificate_status   rM   z%OCSPSingleResponse.certificate_statusr4   c                 C  rI   z^
        The date of when the certificate was revoked or None if not
        revoked.
        Nr   rK   r   r   r   r5      rM   z"OCSPSingleResponse.revocation_timec                 C  rI   z
        The date of when the certificate was revoked or None if not
        revoked. Represented as a non-naive UTC datetime.
        Nr   rK   r   r   r   revocation_time_utc   rM   z&OCSPSingleResponse.revocation_time_utcr7   c                 C  rI   zi
        The reason the certificate was revoked or None if not specified or
        not revoked.
        Nr   rK   r   r   r   r6      rM   z$OCSPSingleResponse.revocation_reasonr2   c                 C  rI   z
        The most recent time at which the status being indicated is known by
        the responder to have been correct
        Nr   rK   r   r   r   r1      rM   zOCSPSingleResponse.this_updatec                 C  rI   z
        The most recent time at which the status being indicated is known by
        the responder to have been correct. Represented as a non-naive UTC
        datetime.
        Nr   rK   r   r   r   this_update_utc   rM   z"OCSPSingleResponse.this_update_utcc                 C  rI   zC
        The time when newer information will be available
        Nr   rK   r   r   r   r3      rM   zOCSPSingleResponse.next_updatec                 C  rI   zu
        The time when newer information will be available. Represented as a
        non-naive UTC datetime.
        Nr   rK   r   r   r   next_update_utc   rM   z"OCSPSingleResponse.next_update_utcrH   c                 C  rI   rJ   r   rK   r   r   r   rL      rM   z"OCSPSingleResponse.issuer_key_hashc                 C  rI   rN   r   rK   r   r   r   rO      rM   z#OCSPSingleResponse.issuer_name_hashr!   c                 C  rI   rP   r   rK   r   r   r   rQ      rM   z!OCSPSingleResponse.hash_algorithmrR   c                 C  rI   rS   r   rK   r   r   r   rT     rM   z OCSPSingleResponse.serial_numberNr"   r(   r"   r4   r"   r7   r"   r2   r[   r\   r]   )r   r   r   r`   ra   rb   rf   r5   ri   r6   r1   rm   r3   rp   rL   rO   rQ   rT   r   r   r   r   rd      sJ    rd   c                   @  s  e Zd ZeejdHddZeejdIddZeejdJd	d
ZeejdKddZ	eejdLddZ
eejdLddZeejdMddZeejdNddZeejdOddZeejdPddZeejdPdd ZeejdQd"d#ZeejdRd%d&ZeejdRd'd(ZeejdSd*d+ZeejdPd,d-ZeejdPd.d/ZeejdRd0d1ZeejdRd2d3ZeejdLd4d5ZeejdLd6d7ZeejdTd9d:ZeejdUd<d=ZeejdVd?d@ZeejdVdAdBZejdWdEdFZdGS )XOCSPResponser"   #typing.Iterator[OCSPSingleResponse]c                 C  rI   )z_
        An iterator over the individual SINGLERESP structures in the
        response
        Nr   rK   r   r   r   	responses  rM   zOCSPResponse.responsesr   c                 C  rI   )zm
        The status of the response. This is a value from the OCSPResponseStatus
        enumeration
        Nr   rK   r   r   r   response_status  rM   zOCSPResponse.response_statusx509.ObjectIdentifierc                 C  rI   )zA
        The ObjectIdentifier of the signature algorithm
        Nr   rK   r   r   r   signature_algorithm_oid  rM   z$OCSPResponse.signature_algorithm_oidhashes.HashAlgorithm | Nonec                 C  rI   )zX
        Returns a HashAlgorithm corresponding to the type of the digest signed
        Nr   rK   r   r   r   signature_hash_algorithm"  rM   z%OCSPResponse.signature_hash_algorithmrH   c                 C  rI   )z%
        The signature bytes
        Nr   rK   r   r   r   	signature+  rM   zOCSPResponse.signaturec                 C  rI   )z+
        The tbsResponseData bytes
        Nr   rK   r   r   r   tbs_response_bytes2  rM   zOCSPResponse.tbs_response_byteslist[x509.Certificate]c                 C  rI   )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   rK   r   r   r   certificates9  rM   zOCSPResponse.certificatesbytes | Nonec                 C  rI   )z2
        The responder's key hash or None
        Nr   rK   r   r   r   responder_key_hashB  rM   zOCSPResponse.responder_key_hashx509.Name | Nonec                 C  rI   )z.
        The responder's Name or None
        Nr   rK   r   r   r   responder_nameI  rM   zOCSPResponse.responder_namer2   c                 C  rI   )z4
        The time the response was produced
        Nr   rK   r   r   r   produced_atP  rM   zOCSPResponse.produced_atc                 C  rI   )zf
        The time the response was produced. Represented as a non-naive UTC
        datetime.
        Nr   rK   r   r   r   produced_at_utcW  rM   zOCSPResponse.produced_at_utcr(   c                 C  rI   re   r   rK   r   r   r   rf   _  rM   zOCSPResponse.certificate_statusr4   c                 C  rI   rg   r   rK   r   r   r   r5   f  rM   zOCSPResponse.revocation_timec                 C  rI   rh   r   rK   r   r   r   ri   n  rM   z OCSPResponse.revocation_time_utcr7   c                 C  rI   rj   r   rK   r   r   r   r6   v  rM   zOCSPResponse.revocation_reasonc                 C  rI   rk   r   rK   r   r   r   r1   ~  rM   zOCSPResponse.this_updatec                 C  rI   rl   r   rK   r   r   r   rm     rM   zOCSPResponse.this_update_utcc                 C  rI   rn   r   rK   r   r   r   r3     rM   zOCSPResponse.next_updatec                 C  rI   ro   r   rK   r   r   r   rp     rM   zOCSPResponse.next_update_utcc                 C  rI   rJ   r   rK   r   r   r   rL     rM   zOCSPResponse.issuer_key_hashc                 C  rI   rN   r   rK   r   r   r   rO     rM   zOCSPResponse.issuer_name_hashr!   c                 C  rI   rP   r   rK   r   r   r   rQ     rM   zOCSPResponse.hash_algorithmrR   c                 C  rI   rS   r   rK   r   r   r   rT     rM   zOCSPResponse.serial_numberrY   c                 C  rI   )zR
        The list of response extensions. Not single response extensions.
        Nr   rK   r   r   r   rZ     rM   zOCSPResponse.extensionsc                 C  rI   )zR
        The list of single response extensions. Not response extensions.
        Nr   rK   r   r   r   single_extensions  rM   zOCSPResponse.single_extensionsrU   rV   c                 C  rI   )z0
        Serializes the response to DER
        Nr   rW   r   r   r   rX     rM   zOCSPResponse.public_bytesN)r"   rv   )r"   r   )r"   ry   )r"   r{   r[   )r"   r   )r"   r   )r"   r   rt   rq   rr   rs   r\   r]   r_   r^   ) r   r   r   r`   ra   rb   rw   rx   rz   r|   r}   r~   r   r   r   r   r   rf   r5   ri   r6   r1   rm   r3   rp   rL   rO   rQ   rT   rZ   r   rX   r   r   r   r   ru   
  s    ru   c                   @  sF   e Zd Zddg fd#d
dZd$ddZd%ddZd&ddZd'd!d"ZdS )(OCSPRequestBuilderNrequestFtuple[x509.Certificate, x509.Certificate, hashes.HashAlgorithm] | Nonerequest_hash5tuple[bytes, bytes, int, hashes.HashAlgorithm] | NonerZ   (list[x509.Extension[x509.ExtensionType]]r"   r#   c                 C  s   || _ || _|| _d S N)_request_request_hash_extensions)rE   r   r   rZ   r   r   r   rF     s   

zOCSPRequestBuilder.__init__r-   r.   r/   r    r!   c                 C  sZ   | j d us
| jd urtdt| t|tjrt|tjs"tdt|||f| j| j	S )N.Only one certificate can be added to a requestr8   )
r   r   r&   r'   r$   r   r9   r:   r   r   )rE   r-   r/   r    r   r   r   add_certificate  s   z"OCSPRequestBuilder.add_certificaterO   rH   rL   rT   rR   c                 C  s   | j d us
| jd urtdt|tstdt| td| td| |j	t
|ks5|j	t
|kr9tdt| j ||||f| jS )Nr   z serial_number must be an integerrO   rL   z`issuer_name_hash and issuer_key_hash must be the same length as the digest size of the algorithm)r   r   r&   r$   rR   r:   r'   r   _check_bytesdigest_sizelenr   r   )rE   rO   rL   rT   r    r   r   r   add_certificate_by_hash  s&   

z*OCSPRequestBuilder.add_certificate_by_hashextvalx509.ExtensionTypecriticalboolc                 C  sJ   t |tjs
tdt|j||}t|| j t| j	| j
g | j|S Nz"extension must be an ExtensionType)r$   r   ExtensionTyper:   	Extensionoidr   r   r   r   r   rE   r   r   	extensionr   r   r   add_extension  s   z OCSPRequestBuilder.add_extensionrG   c                 C  s&   | j d u r| jd u rtdt| S )Nz*You must add a certificate before building)r   r   r&   r   create_ocsp_requestrK   r   r   r   build!  s   
zOCSPRequestBuilder.build)r   r   r   r   rZ   r   r"   r#   )r-   r.   r/   r.   r    r!   r"   r   )
rO   rH   rL   rH   rT   rR   r    r!   r"   r   )r   r   r   r   r"   r   )r"   rG   )r   r   r   rF   r   r   r   r   r   r   r   r   r     s    


r   c                   @  s`   e Zd Zdddg fd5d
dZd6ddZd7d d!Zd8d#d$Zd9d)d*Zd:d/d0Ze	d;d3d4Z
dS )<OCSPResponseBuilderNresponse_SingleResponse | Noneresponder_id5tuple[x509.Certificate, OCSPResponderEncoding] | Nonecertslist[x509.Certificate] | NonerZ   r   c                 C  s   || _ || _|| _|| _d S r   )	_response_responder_id_certsr   )rE   r   r   r   rZ   r   r   r   rF   )  s   
zOCSPResponseBuilder.__init__r-   r.   r/   r    r!   r0   r(   r1   r2   r3   r4   r5   r6   r7   r"   c	           
   	   C  s<   | j d ur	tdt||||||||}	t|	| j| j| jS )Nz#Only one response per OCSPResponse.)r   r&   r,   r   r   r   r   )
rE   r-   r/   r    r0   r1   r3   r5   r6   
singlerespr   r   r   add_response6  s$   

z OCSPResponseBuilder.add_responserU   r   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)r   r&   r$   r   r9   r:   r   r   r   r   r   )rE   rU   r   r   r   r   r   U  s   

z OCSPResponseBuilder.responder_id!typing.Iterable[x509.Certificate]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   r9   ).0xr   r   r   	<genexpr>p  s    z3OCSPResponseBuilder.certificates.<locals>.<genexpr>z$certs must be a list of Certificates)
r   r&   listr   allr:   r   r   r   r   )rE   r   r   r   r   r   h  s   
z OCSPResponseBuilder.certificatesr   r   r   r   c                 C  sN   t |tjs
tdt|j||}t|| j t| j	| j
| jg | j|S r   )r$   r   r   r:   r   r   r   r   r   r   r   r   r   r   r   r   r   y  s   z!OCSPResponseBuilder.add_extensionprivate_keyr   r{   ru   c                 C  s6   | j d u r	td| jd u rtdttj| ||S )Nz&You must add a response before signingz*You must add a responder_id before signing)r   r&   r   r   create_ocsp_responser   r   )rE   r   r    r   r   r   sign  s   


zOCSPResponseBuilder.signrx   r   c                 C  s4   t |ts	td|tju rtdt|d d d S )Nz7response_status must be an item from OCSPResponseStatusz$response_status cannot be SUCCESSFUL)r$   r   r:   r   r&   r   r   )clsrx   r   r   r   build_unsuccessful  s   

z&OCSPResponseBuilder.build_unsuccessful)r   r   r   r   r   r   rZ   r   )r-   r.   r/   r.   r    r!   r0   r(   r1   r2   r3   r4   r5   r4   r6   r7   r"   r   )rU   r   r   r.   r"   r   )r   r   r"   r   )r   r   r   r   r"   r   )r   r   r    r{   r"   ru   )rx   r   r"   ru   )r   r   r   rF   r   r   r   r   r   classmethodr   r   r   r   r   r   (  s    




r   )r    r!   r"   r#   )(
__future__r   ra   r;   typingcryptographyr   r   "cryptography.hazmat.bindings._rustr   cryptography.hazmat.primitivesr   r   /cryptography.hazmat.primitives.asymmetric.typesr   cryptography.x509.baser	   r
   r   Enumr   r   SHA1SHA224SHA256SHA384SHA512r%   r'   r(   r,   ABCMetarG   rd   ru   registerr   r   load_der_ocsp_requestload_der_ocsp_responser   r   r   r   <module>   s>   

	F+] FT}
