U
    e]3                     @   s  d dl mZmZmZ d dlZd dlZd dlm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 e e e e e dZG d	d
 d
eZG dd deZe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Z edd e D Z!dd Z"dd Z#G dd de$Z%G dd de$Z&G dd de$Z'e(ej)G dd de$Z*e(ej)G d d! d!e$Z+dS )"    )absolute_importdivisionprint_functionN)Enum)x509)hashes)ed25519ed448)_EARLIEST_UTC_TIME_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   s   | ]}|j |fV  qd S Nvalue.0xr   r   r   	<genexpr>,   s     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_algorithm3   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   s   | ]}|j |fV  qd S r   r   r   r   r   r   r!   @   s     c                 C   s   ddl m} || S Nr   backend),cryptography.hazmat.backends.openssl.backendr+   load_der_ocsp_requestdatar+   r   r   r   r-   C   s    r-   c                 C   s   ddl m} || S r)   )r,   r+   load_der_ocsp_responser.   r   r   r   r0   H   s    r0   c                   @   s2   e Zd Zdg fddZdd Zdd Zdd	 ZdS )
OCSPRequestBuilderNc                 C   s   || _ || _d S r   )_request_extensions)selfZrequest
extensionsr   r   r   __init__N   s    zOCSPRequestBuilder.__init__c                 C   sL   | j d k	rtdt| t|tjr2t|tjs:tdt|||f| jS )Nz.Only one certificate can be added to a request%cert and issuer must be a Certificate)	r2   r$   r&   r"   r   Certificate	TypeErrorr1   r3   )r4   certissuerr%   r   r   r   add_certificateR   s    


z"OCSPRequestBuilder.add_certificatec                 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   ExtensionTyper9   	Extensionoidr   r3   r1   r2   r4   	extensionZcriticalr   r   r   add_extension_   s     
z OCSPRequestBuilder.add_extensionc                 C   s(   ddl m} | jd krtd|| S )Nr   r*   z*You must add a certificate before building)r,   r+   r2   r$   Zcreate_ocsp_request)r4   r+   r   r   r   buildj   s    
zOCSPRequestBuilder.build)r   r   r   r6   r<   rC   rD   r   r   r   r   r1   M   s   r1   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 k	rXt |tjsXtd|| _|| _|| _|| _	|| _
t |tstd|tjk	r|d k	rtd|d k	rtdnHt |tjstdt|}|tk rtd|d k	rt |tjstd	|| _|| _|| _d S )
Nr7   z%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   r8   r9   r&   datetimeZ_certZ_issuerZ
_algorithmZ_this_updateZ_next_updater'   r(   r$   r   r
   ZReasonFlagsZ_cert_statusZ_revocation_timeZ_revocation_reason)	r4   r:   r;   r%   cert_statusthis_updatenext_updaterevocation_timerevocation_reasonr   r   r   r6   s   s\    





z_SingleResponse.__init__N)r   r   r   r6   r   r   r   r   rE   r   s   rE   c                   @   sR   e Zd Zdddg fddZdd Zdd Zdd	 Zd
d Zdd Ze	dd Z
dS )OCSPResponseBuilderNc                 C   s   || _ || _|| _|| _d S r   )	_response_responder_id_certsr3   )r4   Zresponseresponder_idcertsr5   r   r   r   r6      s    zOCSPResponseBuilder.__init__c	           
   	   C   s<   | j d k	rtdt||||||||}	t|	| j| j| jS )Nz#Only one response per OCSPResponse.)rM   r$   rE   rL   rN   rO   r3   )
r4   r:   r;   r%   rG   rH   rI   rJ   rK   Z
singlerespr   r   r   add_response   s$    
        z OCSPResponseBuilder.add_responsec                 C   sP   | j d k	rtdt|tjs&tdt|ts8t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)rN   r$   r"   r   r8   r9   r   rL   rM   rO   r3   )r4   encodingZresponder_certr   r   r   rP      s    

  z OCSPResponseBuilder.responder_idc                 C   s\   | j d k	rtdt|}t|dkr.tdtdd |D sHt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   r8   r   r   r   r   r!      s     z3OCSPResponseBuilder.certificates.<locals>.<genexpr>z$certs must be a list of Certificates)
rO   r$   listlenallr9   rL   rM   rN   r3   )r4   rQ   r   r   r   certificates   s    
  z OCSPResponseBuilder.certificatesc                 C   sL   t |tjstdt|j||}t|| j t| j	| j
| j| j|g S r=   )r"   r   r>   r9   r?   r@   r   r3   rL   rM   rN   rO   rA   r   r   r   rC      s      
z!OCSPResponseBuilder.add_extensionc                 C   sz   ddl m} | jd krtd| jd kr0tdt|tjtj	frT|d k	rhtdnt|t
jshtd|tj| ||S )Nr   r*   z&You must add a response before signingz*You must add a responder_id before signingz8algorithm must be None when signing via ed25519 or ed448z.Algorithm must be a registered hash algorithm.)r,   r+   rM   r$   rN   r"   r   ZEd25519PrivateKeyr	   ZEd448PrivateKeyr   ZHashAlgorithmr9   create_ocsp_responser   r   )r4   Zprivate_keyr%   r+   r   r   r   sign   s(    


   zOCSPResponseBuilder.signc                 C   s@   ddl m} t|tstd|tjkr0td||d d d S )Nr   r*   z7response_status must be an item from OCSPResponseStatusz$response_status cannot be SUCCESSFUL)r,   r+   r"   r   r9   r   r$   rX   )clsresponse_statusr+   r   r   r   build_unsuccessful  s    

z&OCSPResponseBuilder.build_unsuccessful)r   r   r   r6   rR   rP   rW   rC   rY   classmethodr\   r   r   r   r   rL      s   
rL   c                   @   s`   e Zd Zejdd Zejdd Zejdd Zejdd Zej	d	d
 Z
ejdd ZdS )OCSPRequestc                 C   s   dS z3
        The hash of the issuer public key
        Nr   r4   r   r   r   issuer_key_hash  s    zOCSPRequest.issuer_key_hashc                 C   s   dS z-
        The hash of the issuer name
        Nr   r`   r   r   r   issuer_name_hash  s    zOCSPRequest.issuer_name_hashc                 C   s   dS zK
        The hash algorithm used in the issuer name and key hashes
        Nr   r`   r   r   r   hash_algorithm  s    zOCSPRequest.hash_algorithmc                 C   s   dS zM
        The serial number of the cert whose status is being checked
        Nr   r`   r   r   r   serial_number#  s    zOCSPRequest.serial_numberc                 C   s   dS )z/
        Serializes the request to DER
        Nr   )r4   rS   r   r   r   public_bytes(  s    zOCSPRequest.public_bytesc                 C   s   dS )zP
        The list of request extensions. Not single request extensions.
        Nr   r`   r   r   r   r5   .  s    zOCSPRequest.extensionsN)r   r   r   abcabstractpropertyra   rc   re   rg   abstractmethodrh   r5   r   r   r   r   r^     s   




r^   c                   @   s  e Zd Zejdd Zejdd Zejdd Zejdd Zejd	d
 Z	ejdd Z
ejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd  Zejd!d" Zejd#d$ Zejd%d& Zd'S )(OCSPResponsec                 C   s   dS )zm
        The status of the response. This is a value from the OCSPResponseStatus
        enumeration
        Nr   r`   r   r   r   r[   7  s    zOCSPResponse.response_statusc                 C   s   dS )zA
        The ObjectIdentifier of the signature algorithm
        Nr   r`   r   r   r   signature_algorithm_oid>  s    z$OCSPResponse.signature_algorithm_oidc                 C   s   dS )zX
        Returns a HashAlgorithm corresponding to the type of the digest signed
        Nr   r`   r   r   r   signature_hash_algorithmD  s    z%OCSPResponse.signature_hash_algorithmc                 C   s   dS )z%
        The signature bytes
        Nr   r`   r   r   r   	signatureJ  s    zOCSPResponse.signaturec                 C   s   dS )z+
        The tbsResponseData bytes
        Nr   r`   r   r   r   tbs_response_bytesP  s    zOCSPResponse.tbs_response_bytesc                 C   s   dS )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   rW   V  s    zOCSPResponse.certificatesc                 C   s   dS )z2
        The responder's key hash or None
        Nr   r`   r   r   r   responder_key_hash^  s    zOCSPResponse.responder_key_hashc                 C   s   dS )z.
        The responder's Name or None
        Nr   r`   r   r   r   responder_named  s    zOCSPResponse.responder_namec                 C   s   dS )z4
        The time the response was produced
        Nr   r`   r   r   r   produced_atj  s    zOCSPResponse.produced_atc                 C   s   dS )zY
        The status of the certificate (an element from the OCSPCertStatus enum)
        Nr   r`   r   r   r   certificate_statusp  s    zOCSPResponse.certificate_statusc                 C   s   dS )z^
        The date of when the certificate was revoked or None if not
        revoked.
        Nr   r`   r   r   r   rJ   v  s    zOCSPResponse.revocation_timec                 C   s   dS )zi
        The reason the certificate was revoked or None if not specified or
        not revoked.
        Nr   r`   r   r   r   rK   }  s    zOCSPResponse.revocation_reasonc                 C   s   dS )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   rH     s    zOCSPResponse.this_updatec                 C   s   dS )zC
        The time when newer information will be available
        Nr   r`   r   r   r   rI     s    zOCSPResponse.next_updatec                 C   s   dS r_   r   r`   r   r   r   ra     s    zOCSPResponse.issuer_key_hashc                 C   s   dS rb   r   r`   r   r   r   rc     s    zOCSPResponse.issuer_name_hashc                 C   s   dS rd   r   r`   r   r   r   re     s    zOCSPResponse.hash_algorithmc                 C   s   dS rf   r   r`   r   r   r   rg     s    zOCSPResponse.serial_numberc                 C   s   dS )zR
        The list of response extensions. Not single response extensions.
        Nr   r`   r   r   r   r5     s    zOCSPResponse.extensionsN)r   r   r   ri   rj   r[   rm   rn   ro   rp   rW   rq   rr   rs   rt   rJ   rK   rH   rI   ra   rc   re   rg   r5   r   r   r   r   rl   5  sL   

















rl   ),Z
__future__r   r   r   ri   rF   enumr   ZsixZcryptographyr   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r	   Zcryptography.x509.baser
   r   r   ZSHA1ZSHA224ZSHA256ZSHA384ZSHA512Z_OIDS_TO_HASHr   r   dictZ_RESPONSE_STATUS_TO_ENUMr#   r&   r'   Z_CERT_STATUS_TO_ENUMr-   r0   objectr1   rE   rL   Zadd_metaclassABCMetar^   rl   r   r   r   r   <module>   sF   		   %>_
%
