U
    *”}f½3  ã                   @   sp  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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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__ÚHASHÚNAME© r   r   ú:/tmp/pip-unpacked-wheel-x36vw73o/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_REQUESTÚINTERNAL_ERRORZ	TRY_LATERZSIG_REQUIREDÚUNAUTHORIZEDr   r   r   r   r   $   s   r   c                 C   s   i | ]}|j |“qS r   ©Úvalue©Ú.0Úxr   r   r   Ú
<dictcomp>-   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_algorithm7   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ÚREVOKEDÚUNKNOWNr   r   r   r   r'   >   s   r'   c                 C   s   i | ]}|j |“qS r   r   r   r   r   r   r!   D   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.   G   s    r.   c                 C   s   ddl m} | | ¡S r*   )r-   r,   Úload_der_ocsp_responser/   r   r   r   r1   M   s    r1   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)ÚselfÚrequestÚ
extensionsr   r   r   Ú__init__T   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)	r4   r$   r&   r"   r   ÚCertificateÚ	TypeErrorr2   r5   )r6   ÚcertÚissuerr%   r   r   r   Úadd_certificateX   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   ÚExtensionTyper<   Ú	ExtensionÚoidr
   r5   r2   r4   ©r6   Ú	extensionÚcriticalr   r   r   Úadd_extensiond   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,   r4   r$   Zcreate_ocsp_request)r6   r,   r   r   r   Úbuildo   s    
zOCSPRequestBuilder.build)r   r   r   r9   r?   rG   rH   r   r   r   r   r2   S   s   r2   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ƒsˆtdƒ‚|tjk	r´|d k	r¢tdƒ‚|d k	rütdƒ‚nHt |tjƒsÈtdƒ‚t|ƒ}|tk ràtdƒ‚|d k	rüt |tjƒsütd	ƒ‚|| _|| _|| _d S )
Nr:   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   r;   r<   r&   ÚdatetimeZ_certZ_issuerÚ
_algorithmZ_this_updateZ_next_updater'   r(   r$   r	   r   ZReasonFlagsZ_cert_statusZ_revocation_timeZ_revocation_reason)	r6   r=   r>   r%   Úcert_statusÚthis_updateÚnext_updateÚrevocation_timeÚrevocation_reasonr   r   r   r9   y   s`     ÿ
 ÿ
ÿ
ÿÿÿ
 ÿÿz_SingleResponse.__init__N)r   r   r   r9   r   r   r   r   rI   x   s   rI   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 r3   )Ú	_responseÚ_responder_idÚ_certsr5   )r6   ÚresponseÚresponder_idÚcertsr8   r   r   r   r9   ¿   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.)rR   r$   rI   rQ   rS   rT   r5   )
r6   r=   r>   r%   rL   rM   rN   rO   rP   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)rS   r$   r"   r   r;   r<   r   rQ   rR   rT   r5   )r6   ÚencodingZresponder_certr   r   r   rV   æ   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 r3   )r"   r   r;   r   r   r   r   Ú	<genexpr>ý   s     z3OCSPResponseBuilder.certificates.<locals>.<genexpr>z$certs must be a list of Certificates)
rT   r$   ÚlistÚlenÚallr<   rQ   rR   rS   r5   )r6   rW   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   rA   r<   rB   rC   r
   r5   rQ   rR   rS   rT   rD   r   r   r   rG     s    
üz!OCSPResponseBuilder.add_extensionc                 C   sB   ddl m} | jd krtdƒ‚| jd kr0tdƒ‚| tj| ||¡S )Nr   r+   z&You must add a response before signingz*You must add a responder_id before signing)r-   r,   rR   r$   rS   Úcreate_ocsp_responser   r   )r6   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   r<   r   r$   r_   )ÚclsÚresponse_statusr,   r   r   r   Úbuild_unsuccessful   s    
ÿ
z&OCSPResponseBuilder.build_unsuccessful)r   r   r   r9   rX   rV   r^   rG   r`   Úclassmethodrc   r   r   r   r   rQ   ¾   s      ÿ
rQ   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   ©r6   r   r   r   Úissuer_key_hash0  s    zOCSPRequest.issuer_key_hashc                 C   s   dS ©z-
        The hash of the issuer name
        Nr   rg   r   r   r   Úissuer_name_hash6  s    zOCSPRequest.issuer_name_hashc                 C   s   dS ©zK
        The hash algorithm used in the issuer name and key hashes
        Nr   rg   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   rg   r   r   r   Úserial_numberB  s    zOCSPRequest.serial_numberc                 C   s   dS )z/
        Serializes the request to DER
        Nr   )r6   rY   r   r   r   Úpublic_bytesH  s    zOCSPRequest.public_bytesc                 C   s   dS )zP
        The list of request extensions. Not single request extensions.
        Nr   rg   r   r   r   r8   N  s    zOCSPRequest.extensionsN)r   r   r   ÚabcÚabstractpropertyrh   rj   rl   rn   Úabstractmethodro   r8   r   r   r   r   re   .  s   




re   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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   rg   r   r   r   rb   W  s    zOCSPResponse.response_statusc                 C   s   dS )zA
        The ObjectIdentifier of the signature algorithm
        Nr   rg   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   rg   r   r   r   Úsignature_hash_algorithmd  s    z%OCSPResponse.signature_hash_algorithmc                 C   s   dS )z%
        The signature bytes
        Nr   rg   r   r   r   Ú	signaturej  s    zOCSPResponse.signaturec                 C   s   dS )z+
        The tbsResponseData bytes
        Nr   rg   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   rg   r   r   r   r^   v  s    zOCSPResponse.certificatesc                 C   s   dS )z2
        The responder's key hash or None
        Nr   rg   r   r   r   Úresponder_key_hash~  s    zOCSPResponse.responder_key_hashc                 C   s   dS )z.
        The responder's Name or None
        Nr   rg   r   r   r   Úresponder_name„  s    zOCSPResponse.responder_namec                 C   s   dS )z4
        The time the response was produced
        Nr   rg   r   r   r   Úproduced_atŠ  s    zOCSPResponse.produced_atc                 C   s   dS )zY
        The status of the certificate (an element from the OCSPCertStatus enum)
        Nr   rg   r   r   r   Úcertificate_status  s    zOCSPResponse.certificate_statusc                 C   s   dS )z^
        The date of when the certificate was revoked or None if not
        revoked.
        Nr   rg   r   r   r   rO   –  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   rg   r   r   r   rP     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   rg   r   r   r   rM   ¤  s    zOCSPResponse.this_updatec                 C   s   dS )zC
        The time when newer information will be available
        Nr   rg   r   r   r   rN   «  s    zOCSPResponse.next_updatec                 C   s   dS rf   r   rg   r   r   r   rh   ±  s    zOCSPResponse.issuer_key_hashc                 C   s   dS ri   r   rg   r   r   r   rj   ·  s    zOCSPResponse.issuer_name_hashc                 C   s   dS rk   r   rg   r   r   r   rl   ½  s    zOCSPResponse.hash_algorithmc                 C   s   dS rm   r   rg   r   r   r   rn   Ã  s    zOCSPResponse.serial_numberc                 C   s   dS )zR
        The list of response extensions. Not single response extensions.
        Nr   rg   r   r   r   r8   É  s    zOCSPResponse.extensionsc                 C   s   dS )zR
        The list of single response extensions. Not response extensions.
        Nr   rg   r   r   r   Úsingle_extensionsÏ  s    zOCSPResponse.single_extensionsN)r   r   r   rp   rq   rb   rt   ru   rv   rw   r^   rx   ry   rz   r{   rO   rP   rM   rN   rh   rj   rl   rn   r8   r|   r   r   r   r   rs   U  sP   


















rs   )(Ú
__future__r   r   r   rp   rJ   Úenumr   ÚsixZcryptographyr   Zcryptography.hazmat.primitivesr   Zcryptography.x509.baser   r	   r
   ÚSHA1ÚSHA224ÚSHA256ÚSHA384ÚSHA512Z_OIDS_TO_HASHr   r   Z_RESPONSE_STATUS_TO_ENUMr#   r&   r'   Z_CERT_STATUS_TO_ENUMr.   r1   Úobjectr2   rI   rQ   Úadd_metaclassÚABCMetare   rs   r   r   r   r   Ú<module>   sD   û		û	%Fp
&
