B
    \2                 @   sx  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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)_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   5lib/python3.7/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   
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_algorithm2   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"   9   s   r"   c             c   s   | ]}|j |fV  qd S )N)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&   B   s    r&   c             C   s   ddl m} || S )Nr   )r$   )r%   r$   load_der_ocsp_response)r'   r$   r   r   r   r(   G   s    r(   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 )N)_request_extensions)selfZrequest
extensionsr   r   r   __init__M   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 requestz%cert and issuer must be a Certificate)	r*   r   r!   r   r   Certificate	TypeErrorr)   r+   )r,   certissuerr    r   r   r   add_certificateQ   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   ExtensionTyper0   	Extensionoidr
   r+   r)   r*   )r,   	extension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$   r*   r   Zcreate_ocsp_request)r,   r$   r   r   r   buildi   s    
zOCSPRequestBuilder.build)r   r   r   r.   r3   r9   r:   r   r   r   r   r)   L   s   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 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 )
Nz%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   r/   r0   r!   datetimeZ_certZ_issuerZ
_algorithmZ_this_updateZ_next_updater"   r#   r   r	   r   ZReasonFlagsZ_cert_statusZ_revocation_timeZ_revocation_reason)	r,   r1   r2   r    cert_statusthis_updatenext_updaterevocation_timerevocation_reasonr   r   r   r.   r   sH    

z_SingleResponse.__init__N)r   r   r   r.   r   r   r   r   r;   q   s   r;   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 )N)	_response_responder_id_certsr+   )r,   Zresponseresponder_idcertsr-   r   r   r   r.      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.)rC   r   r;   rB   rD   rE   r+   )
r,   r1   r2   r    r=   r>   r?   r@   rA   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)rD   r   r   r   r/   r0   r   rB   rC   rE   r+   )r,   encodingZresponder_certr   r   r   rF      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 )N)r   r   r/   )r   r   r   r   r   r      s    z3OCSPResponseBuilder.certificates.<locals>.<genexpr>z$certs must be a list of Certificates)
rE   r   listlenallr0   rB   rC   rD   r+   )r,   rG   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 )Nz"extension must be an ExtensionType)r   r   r4   r0   r5   r6   r
   r+   rB   rC   rD   rE   )r,   r7   r8   r   r   r   r9      s    z!OCSPResponseBuilder.add_extensionc             C   sV   ddl m} | jd krtd| jd kr0tdt|tjsDtd|	t
j| ||S )Nr   )r$   z&You must add a response before signingz*You must add a responder_id before signingz.Algorithm must be a registered hash algorithm.)r%   r$   rC   r   rD   r   r   ZHashAlgorithmr0   create_ocsp_responser   r   )r,   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   r0   r   r   rN   )clsresponse_statusr$   r   r   r   build_unsuccessful   s    

z&OCSPResponseBuilder.build_unsuccessful)r   r   r   r.   rH   rF   rM   r9   rO   classmethodrR   r   r   r   r   rB      s   rB   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   )r,   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   )r,   rI   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   r-   '  s    zOCSPRequest.extensionsN)r   r   r   abcabstractpropertyrU   rV   rW   rX   abstractmethodrY   r-   r   r   r   r   rT     s   rT   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   rQ   0  s    zOCSPResponse.response_statusc             C   s   dS )zA
        The ObjectIdentifier of the signature algorithm
        Nr   )r,   r   r   r   signature_algorithm_oid7  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_algorithm=  s    z%OCSPResponse.signature_hash_algorithmc             C   s   dS )z%
        The signature bytes
        Nr   )r,   r   r   r   	signatureC  s    zOCSPResponse.signaturec             C   s   dS )z+
        The tbsResponseData bytes
        Nr   )r,   r   r   r   tbs_response_bytesI  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   rM   O  s    zOCSPResponse.certificatesc             C   s   dS )z2
        The responder's key hash or None
        Nr   )r,   r   r   r   responder_key_hashW  s    zOCSPResponse.responder_key_hashc             C   s   dS )z.
        The responder's Name or None
        Nr   )r,   r   r   r   responder_name]  s    zOCSPResponse.responder_namec             C   s   dS )z4
        The time the response was produced
        Nr   )r,   r   r   r   produced_atc  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_statusi  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   r@   o  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   rA   v  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   r>   }  s    zOCSPResponse.this_updatec             C   s   dS )zC
        The time when newer information will be available
        Nr   )r,   r   r   r   r?     s    zOCSPResponse.next_updatec             C   s   dS )z3
        The hash of the issuer public key
        Nr   )r,   r   r   r   rU     s    zOCSPResponse.issuer_key_hashc             C   s   dS )z-
        The hash of the issuer name
        Nr   )r,   r   r   r   rV     s    zOCSPResponse.issuer_name_hashc             C   s   dS )zK
        The hash algorithm used in the issuer name and key hashes
        Nr   )r,   r   r   r   rW     s    zOCSPResponse.hash_algorithmc             C   s   dS )zM
        The serial number of the cert whose status is being checked
        Nr   )r,   r   r   r   rX     s    zOCSPResponse.serial_numberc             C   s   dS )zR
        The list of response extensions. Not single response extensions.
        Nr   )r,   r   r   r   r-     s    zOCSPResponse.extensionsN)r   r   r   rZ   r[   rQ   r^   r_   r`   ra   rM   rb   rc   rd   re   r@   rA   r>   r?   rU   rV   rW   rX   r-   r   r   r   r   r]   .  s&   r]   ))Z
__future__r   r   r   rZ   r<   enumr   ZsixZcryptographyr   Zcryptography.hazmat.primitivesr   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&   r(   objectr)   r;   rB   Zadd_metaclassABCMetarT   r]   r   r   r   r   <module>   s:   	%>Y%