o
    îRµi­9  ã                   @   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__Ú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   Ú
SUCCESSFULÚMALFORMED_REQUESTÚINTERNAL_ERRORÚ	TRY_LATERÚSIG_REQUIREDÚ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   ÚGOODÚREVOKEDÚ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*   ÚdatetimeÚ_certÚ_issuerÚ
_algorithmÚ_this_updateÚ_next_updater+   r-   r(   r   r   ÚReasonFlagsÚ_cert_statusÚ_revocation_timeÚ_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   rE   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   rH   ©z-
        The hash of the issuer name
        Nr   rJ   r   r   r   Úissuer_name_hash“   rL   zOCSPRequest.issuer_name_hashc                 C   rH   ©zK
        The hash algorithm used in the issuer name and key hashes
        Nr   rJ   r   r   r   Úhash_algorithm™   rL   zOCSPRequest.hash_algorithmc                 C   rH   ©zM
        The serial number of the cert whose status is being checked
        Nr   rJ   r   r   r   Úserial_numberŸ   rL   zOCSPRequest.serial_numberÚencodingc                 C   rH   )z/
        Serializes the request to DER
        Nr   ©r=   rS   r   r   r   Úpublic_bytes¥   rL   zOCSPRequest.public_bytesc                 C   rH   )zP
        The list of request extensions. Not single request extensions.
        Nr   rJ   r   r   r   Ú
extensions«   rL   zOCSPRequest.extensionsN)r   r   r   ÚabcÚabstractpropertyÚbytesrK   rN   r   ÚHashAlgorithmrP   ÚintrR   Úabstractmethodr   ÚEncodingrU   r   Ú
ExtensionsrV   r   r   r   r   rF   Œ   s    rF   )Ú	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 ).ÚOCSPResponserG   c                 C   rH   )zm
        The status of the response. This is a value from the OCSPResponseStatus
        enumeration
        Nr   rJ   r   r   r   Úresponse_status³   rL   zOCSPResponse.response_statusc                 C   rH   )zA
        The ObjectIdentifier of the signature algorithm
        Nr   rJ   r   r   r   Úsignature_algorithm_oidº   rL   z$OCSPResponse.signature_algorithm_oidc                 C   rH   )zX
        Returns a HashAlgorithm corresponding to the type of the digest signed
        Nr   rJ   r   r   r   Úsignature_hash_algorithmÀ   rL   z%OCSPResponse.signature_hash_algorithmc                 C   rH   )z%
        The signature bytes
        Nr   rJ   r   r   r   Ú	signatureÈ   rL   zOCSPResponse.signaturec                 C   rH   )z+
        The tbsResponseData bytes
        Nr   rJ   r   r   r   Útbs_response_bytesÎ   rL   zOCSPResponse.tbs_response_bytesc                 C   rH   )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   rJ   r   r   r   ÚcertificatesÔ   rL   zOCSPResponse.certificatesc                 C   rH   )z2
        The responder's key hash or None
        Nr   rJ   r   r   r   Úresponder_key_hashÜ   rL   zOCSPResponse.responder_key_hashc                 C   rH   )z.
        The responder's Name or None
        Nr   rJ   r   r   r   Úresponder_nameâ   rL   zOCSPResponse.responder_namec                 C   rH   )z4
        The time the response was produced
        Nr   rJ   r   r   r   Úproduced_atè   rL   zOCSPResponse.produced_atc                 C   rH   )zY
        The status of the certificate (an element from the OCSPCertStatus enum)
        Nr   rJ   r   r   r   Úcertificate_statusî   rL   zOCSPResponse.certificate_statusc                 C   rH   )z^
        The date of when the certificate was revoked or None if not
        revoked.
        Nr   rJ   r   r   r   rC   ô   rL   zOCSPResponse.revocation_timec                 C   rH   )zi
        The reason the certificate was revoked or None if not specified or
        not revoked.
        Nr   rJ   r   r   r   rD   û   rL   zOCSPResponse.revocation_reasonc                 C   rH   )z�
        The most recent time at which the status being indicated is known by
        the responder to have been correct
        Nr   rJ   r   r   r   rA     rL   zOCSPResponse.this_updatec                 C   rH   )zC
        The time when newer information will be available
        Nr   rJ   r   r   r   rB   	  rL   zOCSPResponse.next_updatec                 C   rH   rI   r   rJ   r   r   r   rK     rL   zOCSPResponse.issuer_key_hashc                 C   rH   rM   r   rJ   r   r   r   rN     rL   zOCSPResponse.issuer_name_hashc                 C   rH   rO   r   rJ   r   r   r   rP     rL   zOCSPResponse.hash_algorithmc                 C   rH   rQ   r   rJ   r   r   r   rR   !  rL   zOCSPResponse.serial_numberc                 C   rH   )zR
        The list of response extensions. Not single response extensions.
        Nr   rJ   r   r   r   rV   '  rL   zOCSPResponse.extensionsc                 C   rH   )zR
        The list of single response extensions. Not response extensions.
        Nr   rJ   r   r   r   Úsingle_extensions-  rL   zOCSPResponse.single_extensionsrS   c                 C   rH   )z0
        Serializes the response to DER
        Nr   rT   r   r   r   rU   3  rL   zOCSPResponse.public_bytesN)-r   r   r   rW   rX   r   ra   r   ÚObjectIdentifierrb   ÚtypingÚOptionalr   rZ   rc   rY   rd   re   ÚListr1   rf   rg   ÚNamerh   r3   ri   r+   rj   rC   r9   rD   rA   rB   rK   rN   rP   r[   rR   r^   rV   rk   r\   r   r]   rU   r   r   r   r   r`   ²   sZ    
þr`   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=   ÚrequestrV   r   r   r   rE   ;  s   
zOCSPRequestBuilder.__init__r>   r?   r)   rG   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 requestr0   )	rs   r(   r*   r&   r   r1   r2   rq   rt   )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   ÚExtensionTyper2   Ú	ExtensionÚoidr	   rt   rq   rs   ©r=   rw   rx   Ú	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.backendr�   rs   r(   Úcreate_ocsp_request)r=   r�   r   r   r   Úbuild]  s   

zOCSPRequestBuilder.build)r   r   r   rE   r   r1   r   rZ   rv   rz   Úboolr   rF   r„   r   r   r   r   rq   :  s&    þýü
ûÿÿ
þrq   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 rr   )Ú	_responseÚ_responder_idÚ_certsrt   )r=   ÚresponseÚresponder_idÚcertsrV   r   r   r   rE   g  s   
zOCSPResponseBuilder.__init__r>   r?   r)   r@   rA   rB   rC   rD   rG   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‰   rt   )
r=   r>   r?   r)   r@   rA   rB   rC   rD   Ú
singlerespr   r   r   Úadd_responseo  s$   
ø
üz OCSPResponseBuilder.add_responserS   Ú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   r1   r2   r
   r†   r‡   r‰   rt   )r=   rS   r�   r   r   r   r‹   Ž  s   

ÿüz OCSPResponseBuilder.responder_idrŒ   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 rr   )r&   r   r1   r!   r   r   r   Ú	<genexpr>©  s   € z3OCSPResponseBuilder.certificates.<locals>.<genexpr>z$certs must be a list of Certificates)
r‰   r(   ÚlistÚlenÚallr2   r†   r‡   rˆ   rt   )r=   rŒ   r   r   r   rf   ¡  s   
üz OCSPResponseBuilder.certificatesrw   rx   c                 C   sL   t |tjƒs
tdƒ‚t |j||¡}t|| jƒ t| j	| j
| j| j|g ƒS ry   )r&   r   rz   r2   r{   r|   r	   rt   r†   r‡   rˆ   r‰   r}   r   r   r   r   ²  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   r€   z&You must add a response before signingz*You must add a responder_id before signing)r‚   r�   r‡   r(   rˆ   Úcreate_ocsp_responser   r   )r=   r”   r)   r�   r   r   r   ÚsignÂ  s   


ÿzOCSPResponseBuilder.signra   c                 C   s@   ddl m} t|tƒstdƒ‚|tju rtdƒ‚| |d d d ¡S )Nr   r€   z7response_status must be an item from OCSPResponseStatusz$response_status cannot be SUCCESSFUL)r‚   r�   r&   r   r2   r   r(   r•   )Úclsra   r�   r   r   r   Úbuild_unsuccessfulÒ  s   
ÿ
z&OCSPResponseBuilder.build_unsuccessful)r   r   r   rE   r   r1   r   rZ   r+   r3   rm   rn   r9   rŽ   r
   r‹   ÚIterablerf   rz   r…   r   r   r`   r–   Úclassmethodr   r˜   r   r   r   r   r†   f  sl    
ÿþýüûú
ù
ø
	÷

öÿÿ
þ
ÿ
þÿÿ
þþ
ý
üÿþr†   ÚdatarG   c                 C   ó   ddl m} | | ¡S ©Nr   r€   )r‚   r�   Úload_der_ocsp_request©r›   r�   r   r   r   rž   â  ó   
rž   c                 C   rœ   r�   )r‚   r�   Úload_der_ocsp_responserŸ   r   r   r   r¡   è  r    r¡   )&rW   r3   rm   Úcryptographyr   r   Úcryptography.hazmat.primitivesr   r   Úcryptography.x509.baser   r   r   r	   ÚSHA1ÚSHA224ÚSHA256ÚSHA384ÚSHA512Ú_OIDS_TO_HASHÚEnumr
   r   Ú_RESPONSE_STATUS_TO_ENUMr'   r*   r+   Ú_CERT_STATUS_TO_ENUMÚobjectr/   ÚABCMetarF   r`   rq   r†   rY   rž   r¡   r   r   r   r   Ú<module>   sB   	û		û	F& 	,|