U
    ;gPJ                     @   s  d Z ddlmZmZmZ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mZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZ dd	lmZm Z m!Z!m"Z" G d
d deZ#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G dd deZ(G dd deZ)G dd deZ*G dd deZ+G dd deZ,G dd deZ-G d d! d!eZ.G d"d# d#eZ/G d$d% d%eZ0G d&d' d'eZ1G d(d) d)eZ2G d*d+ d+eZ3G d,d- d-eZ4G d.d/ d/eZ5G d0d1 d1eZ6G d2d3 d3eZ7G d4d5 d5eZ8G d6d7 d7eZ9G d8d9 d9eZ:G d:d; d;eZ;G d<d= d=eZ<G d>d? d?eZ=G d@dA dAeZ>G dBdC dCeZ?G dDdE dEeZ@G dFdG dGeZAG dHdI dIeZBG dJdK dKeZCG dLdM dMeZDG dNdO dOeZEG dPdQ dQeZFG dRdS dSeZGG dTdU dUeZHdVS )Wz
ASN.1 type classes for the online certificate status protocol (OCSP). Exports
the following items:

 - OCSPRequest()
 - OCSPResponse()

Other type classes are defined that help compose the types listed above.
    )unicode_literalsdivisionabsolute_importprint_function   )unwrap)DigestAlgorithmSignedDigestAlgorithm)BooleanChoice
EnumeratedGeneralizedTime	IA5StringIntegerNullObjectIdentifierOctetBitStringOctetStringParsableOctetStringSequence
SequenceOf)AuthorityInfoAccessSyntax	CRLReason)PublicKeyAlgorithm)CertificateGeneralNameGeneralNamesNamec                   @   s   e Zd ZddiZdS )Versionr   v1N__name__
__module____qualname___map r%   r%   3/tmp/pip-unpacked-wheel-fr05hfkd/asn1crypto/ocsp.pyr   (   s    r   c                   @   s(   e Zd ZdefdefdefdefgZdS )CertIdhash_algorithmissuer_name_hashissuer_key_hashserial_numberN)r!   r"   r#   r   r   r   _fieldsr%   r%   r%   r&   r'   .   s
   r'   c                   @   s   e Zd ZdefdefgZdS )ServiceLocatorissuerlocatorN)r!   r"   r#   r   r   r,   r%   r%   r%   r&   r-   7   s   r-   c                   @   s   e Zd ZddiZdS )RequestExtensionIdz1.3.6.1.5.5.7.48.1.7service_locatorNr    r%   r%   r%   r&   r0   >   s    r0   c                   @   s4   e Zd ZdefdeddifdefgZdZdeiZ	dS )	RequestExtensionextn_idcriticaldefaultF
extn_valuer3   r6   r1   N)
r!   r"   r#   r0   r
   r   r,   	_oid_pairr-   
_oid_specsr%   r%   r%   r&   r2   D   s    r2   c                   @   s   e Zd ZeZdS )RequestExtensionsN)r!   r"   r#   r2   _child_specr%   r%   r%   r&   r:   Q   s   r:   c                   @   sP   e Zd ZdefdedddfgZdZdZdZdd	 Z	e
d
d Ze
dd ZdS )RequestZreq_certsingle_request_extensionsr   TexplicitoptionalFNc                 C   sd   t  | _| d D ]H}|d j}d| }t| |rBt| ||d j |d jr| j| qd| _dS )v
        Sets common named extensions to private attributes and creates a list
        of critical extensions
        r=   r3   	_%s_valuer6   r4   TNset_critical_extensionsnativehasattrsetattrparsedadd_processed_extensionsself	extensionnameZattribute_namer%   r%   r&   _set_extensions_   s    


zRequest._set_extensionsc                 C   s   | j s|   | jS z
        Returns a set of the names (or OID if not a known extension) of the
        extensions marked as critical

        :return:
            A set of unicode strings
        rK   rP   rE   rM   r%   r%   r&   critical_extensionsq   s    
zRequest.critical_extensionsc                 C   s   | j dkr|   | jS )z
        This extension is used when communicating with an OCSP responder that
        acts as a proxy for OCSP requests

        :return:
            None or a ServiceLocator object
        F)rK   rP   _service_locator_valuerS   r%   r%   r&   service_locator_value   s    

zRequest.service_locator_value)r!   r"   r#   r'   r:   r,   rK   rE   rU   rP   propertyrT   rV   r%   r%   r%   r&   r<   U   s   
r<   c                   @   s   e Zd ZeZdS )RequestsN)r!   r"   r#   r<   r;   r%   r%   r%   r&   rX      s   rX   c                   @   s   e Zd ZddiZdS )ResponseTypez1.3.6.1.5.5.7.48.1.1basic_ocsp_responseNr    r%   r%   r%   r&   rY      s    rY   c                   @   s   e Zd ZeZdS )AcceptableResponsesN)r!   r"   r#   rY   r;   r%   r%   r%   r&   r[      s   r[   c                   @   s"   e Zd ZdefdeddifgZdS )PreferredSignatureAlgorithmZsig_identifierZcert_identifierr@   TN)r!   r"   r#   r	   r   r,   r%   r%   r%   r&   r\      s   r\   c                   @   s   e Zd ZeZdS )PreferredSignatureAlgorithmsN)r!   r"   r#   r\   r;   r%   r%   r%   r&   r]      s   r]   c                   @   s   e Zd ZddddZdS )TBSRequestExtensionIdnonceacceptable_responsespreferred_signature_algorithms)1.3.6.1.5.5.7.48.1.2z1.3.6.1.5.5.7.48.1.4z1.3.6.1.5.5.7.48.1.8Nr    r%   r%   r%   r&   r^      s   r^   c                   @   s8   e Zd ZdefdeddifdefgZdZee	e
dZdS )	TBSRequestExtensionr3   r4   r5   Fr6   r7   )r_   r`   ra   N)r!   r"   r#   r^   r
   r   r,   r8   r   r[   r]   r9   r%   r%   r%   r&   rc      s   rc   c                   @   s   e Zd ZeZdS )TBSRequestExtensionsN)r!   r"   r#   rc   r;   r%   r%   r%   r&   rd      s   rd   c                   @   s@   e Zd Zdedddfdedddfd	efd
edddfgZdS )
TBSRequestversionr   r   r?   r5   Zrequestor_namer   Tr>   Zrequest_listrequest_extensions   N)r!   r"   r#   r   r   rX   rd   r,   r%   r%   r%   r&   re      s
   re   c                   @   s   e Zd ZeZdS )CertificatesN)r!   r"   r#   r   r;   r%   r%   r%   r&   rj      s   rj   c                   @   s*   e Zd ZdefdefdedddfgZdS )	Signaturesignature_algorithm	signaturecertsr   Tr>   N)r!   r"   r#   r	   r   rj   r,   r%   r%   r%   r&   rk      s   rk   c                   @   sp   e Zd ZdefdedddfgZdZdZdZdZ	dZ
dd	 Zed
d Zedd Zedd Zedd ZdS )OCSPRequesttbs_requestZoptional_signaturer   Tr>   FNc                 C   sh   t  | _| d d D ]H}|d j}d| }t| |rFt| ||d j |d jr| j| qd| _dS )	rA   rp   rh   r3   rB   r6   r4   TNrC   rL   r%   r%   r&   rP      s    


zOCSPRequest._set_extensionsc                 C   s   | j s|   | jS rQ   rR   rS   r%   r%   r&   rT      s    
zOCSPRequest.critical_extensionsc                 C   s   | j dkr|   | jS )z
        This extension is used to prevent replay attacks by including a unique,
        random value with each request/response pair

        :return:
            None or an OctetString object
        FrK   rP   _nonce_valuerS   r%   r%   r&   nonce_value  s    

zOCSPRequest.nonce_valuec                 C   s   | j dkr|   | jS )a(  
        This extension is used to allow the client and server to communicate
        with alternative response formats other than just basic_ocsp_response,
        although no other formats are defined in the standard.

        :return:
            None or an AcceptableResponses object
        F)rK   rP   _acceptable_responses_valuerS   r%   r%   r&   acceptable_responses_value  s    
z&OCSPRequest.acceptable_responses_valuec                 C   s   | j dkr|   | jS )aj  
        This extension is used by the client to define what signature algorithms
        are preferred, including both the hash algorithm and the public key
        algorithm, with a level of detail down to even the public key algorithm
        parameters, such as curve name.

        :return:
            None or a PreferredSignatureAlgorithms object
        F)rK   rP   %_preferred_signature_algorithms_valuerS   r%   r%   r&   $preferred_signature_algorithms_value   s    
z0OCSPRequest.preferred_signature_algorithms_value)r!   r"   r#   re   rk   r,   rK   rE   rr   rt   rv   rP   rW   rT   rs   ru   rw   r%   r%   r%   r&   ro      s"   


ro   c                   @   s   e Zd ZdddddddZdS )	OCSPResponseStatusZ
successfulZmalformed_requestZinternal_errorZ	try_laterZsign_requiredunauthorized)r   r   ri            Nr    r%   r%   r%   r&   rx   1  s   rx   c                   @   s(   e Zd ZdeddifdeddifgZdS )ResponderIdZby_namer?   r   by_keyri   N)r!   r"   r#   r   r   _alternativesr%   r%   r%   r&   r}   <  s   r}   c                   @   s    e Zd Zdd Zedd ZdS )
StatusGoodc                 C   s6   |dk	r,|dkr,t |ts,ttdt|d| _dS )z`
        Sets the value of the object

        :param value:
            None or 'good'
        NgoodzK
                value must be one of None, "good", not %s
                    
isinstancer   
ValueErrorr   reprcontentsrM   valuer%   r%   r&   rD   E  s    zStatusGood.setc                 C   s   dS )Nr   r%   rS   r%   r%   r&   rF   W  s    zStatusGood.nativeNr!   r"   r#   rD   rW   rF   r%   r%   r%   r&   r   D  s   r   c                   @   s    e Zd Zdd Zedd ZdS )StatusUnknownc                 C   s6   |dk	r,|dkr,t |ts,ttdt|d| _dS )zc
        Sets the value of the object

        :param value:
            None or 'unknown'
        NunknownzN
                value must be one of None, "unknown", not %s
                r   r   r   r%   r%   r&   rD   ^  s    zStatusUnknown.setc                 C   s   dS )Nr   r%   rS   r%   r%   r&   rF   p  s    zStatusUnknown.nativeNr   r%   r%   r%   r&   r   ]  s   r   c                   @   s$   e Zd ZdefdedddfgZdS )RevokedInforevocation_timerevocation_reasonr   Tr>   N)r!   r"   r#   r   r   r,   r%   r%   r%   r&   r   u  s   r   c                   @   s4   e Zd ZdeddifdeddifdeddifgZdS )	
CertStatusr   Zimplicitr   revokedr   r   ri   N)r!   r"   r#   r   r   r   r   r%   r%   r%   r&   r   |  s   r   c                   @   s:   e Zd ZdedddfdedddfdedddfgZd	S )
CrlIdZcrl_urlr   Tr>   Zcrl_numr   Zcrl_timeri   N)r!   r"   r#   r   r   r   r,   r%   r%   r%   r&   r     s   r   c                   @   s   e Zd ZdddddddZdS )	SingleResponseExtensionIdcrlarchive_cutoff
crl_reasoninvalidity_datecertificate_issuer!signed_certificate_timestamp_list)z1.3.6.1.5.5.7.48.1.3z1.3.6.1.5.5.7.48.1.6z	2.5.29.21z	2.5.29.24z	2.5.29.29z1.3.6.1.4.1.11129.2.4.5Nr    r%   r%   r%   r&   r     s   r   c                   @   s>   e Zd ZdefdeddifdefgZdZee	e
e	eedZdS )	SingleResponseExtensionr3   r4   r5   Fr6   r7   )r   r   r   r   r   r   N)r!   r"   r#   r   r
   r   r,   r8   r   r   r   r   r   r9   r%   r%   r%   r&   r     s   r   c                   @   s   e Zd ZeZdS )SingleResponseExtensionsN)r!   r"   r#   r   r;   r%   r%   r%   r&   r     s   r   c                	   @   s   e Zd Zdefdefdefdedddfded	ddfgZd
ZdZ	dZ
dZdZdZdZdd Zedd Zedd Zedd Zedd Zedd Zedd ZdS )SingleResponseZcert_idZcert_statusthis_updatenext_updater   Tr>   single_extensionsr   FNc                 C   sd   t  | _| d D ]H}|d j}d| }t| |rBt| ||d j |d jr| j| qd| _dS )rA   r   r3   rB   r6   r4   TNrC   rL   r%   r%   r&   rP     s    


zSingleResponse._set_extensionsc                 C   s   | j s|   | jS rQ   rR   rS   r%   r%   r&   rT     s    
z"SingleResponse.critical_extensionsc                 C   s   | j dkr|   | jS )z
        This extension is used to locate the CRL that a certificate's revocation
        is contained within.

        :return:
            None or a CrlId object
        F)rK   rP   
_crl_valuerS   r%   r%   r&   	crl_value  s    

zSingleResponse.crl_valuec                 C   s   | j dkr|   | jS )z
        This extension is used to indicate the date at which an archived
        (historical) certificate status entry will no longer be available.

        :return:
            None or a GeneralizedTime object
        F)rK   rP   _archive_cutoff_valuerS   r%   r%   r&   archive_cutoff_value  s    

z#SingleResponse.archive_cutoff_valuec                 C   s   | j dkr|   | jS )z
        This extension indicates the reason that a certificate was revoked.

        :return:
            None or a CRLReason object
        F)rK   rP   _crl_reason_valuerS   r%   r%   r&   crl_reason_value  s    	
zSingleResponse.crl_reason_valuec                 C   s   | j dkr|   | jS )a=  
        This extension indicates the suspected date/time the private key was
        compromised or the certificate became invalid. This would usually be
        before the revocation date, which is when the CA processed the
        revocation.

        :return:
            None or a GeneralizedTime object
        F)rK   rP   _invalidity_date_valuerS   r%   r%   r&   invalidity_date_value
  s    
z$SingleResponse.invalidity_date_valuec                 C   s   | j dkr|   | jS )z
        This extension indicates the issuer of the certificate in question.

        :return:
            None or an x509.GeneralNames object
        F)rK   rP   _certificate_issuer_valuerS   r%   r%   r&   certificate_issuer_value  s    	
z'SingleResponse.certificate_issuer_value)r!   r"   r#   r'   r   r   r   r,   rK   rE   r   r   r   r   r   rP   rW   rT   r   r   r   r   r   r%   r%   r%   r&   r     s4   




r   c                   @   s   e Zd ZeZdS )	ResponsesN)r!   r"   r#   r   r;   r%   r%   r%   r&   r   (  s   r   c                   @   s   e Zd ZdddZdS )ResponseDataExtensionIdr_   extended_revoke)rb   z1.3.6.1.5.5.7.48.1.9Nr    r%   r%   r%   r&   r   ,  s   r   c                   @   s6   e Zd ZdefdeddifdefgZdZee	dZ
dS )	ResponseDataExtensionr3   r4   r5   Fr6   r7   )r_   r   N)r!   r"   r#   r   r
   r   r,   r8   r   r   r9   r%   r%   r%   r&   r   3  s   r   c                   @   s   e Zd ZeZdS )ResponseDataExtensionsN)r!   r"   r#   r   r;   r%   r%   r%   r&   r   A  s   r   c                	   @   s>   e Zd Zdedddfdefdefdefded	d
dfgZdS )ResponseDatarf   r   r   rg   Zresponder_idproduced_at	responsesresponse_extensionsr   Tr>   N)	r!   r"   r#   r   r}   r   r   r   r,   r%   r%   r%   r&   r   E  s   r   c                   @   s0   e Zd ZdefdefdefdedddfgZdS )	BasicOCSPResponsetbs_response_datarl   rm   rn   r   Tr>   N)r!   r"   r#   r   r	   r   rj   r,   r%   r%   r%   r&   r   O  s
   r   c                   @   s(   e Zd ZdefdefgZdZdeiZdS )ResponseBytesresponse_typeresponse)r   r   rZ   N)	r!   r"   r#   rY   r   r,   r8   r   r9   r%   r%   r%   r&   r   X  s    r   c                   @   sx   e Zd ZdefdedddfgZdZdZdZdZ	dd	 Z
ed
d Zedd Zedd Zedd Zedd ZdS )OCSPResponseresponse_statusresponse_bytesr   Tr>   FNc                 C   sr   t  | _| d d jd d D ]H}|d j}d| }t| |rPt| ||d j |d jr| j| qd	| _d
S )rA   r   r   r   r   r3   rB   r6   r4   TN)rD   rE   rI   rF   rG   rH   rJ   rK   rL   r%   r%   r&   rP   o  s    


zOCSPResponse._set_extensionsc                 C   s   | j s|   | jS rQ   rR   rS   r%   r%   r&   rT     s    
z OCSPResponse.critical_extensionsc                 C   s   | j dkr|   | jS )z
        This extension is used to prevent replay attacks on the request/response
        exchange

        :return:
            None or an OctetString object
        Frq   rS   r%   r%   r&   rs     s    

zOCSPResponse.nonce_valuec                 C   s   | j dkr|   | jS )z
        This extension is used to signal that the responder will return a
        "revoked" status for non-issued certificates.

        :return:
            None or a Null object (if present)
        F)rK   rP   _extended_revoke_valuerS   r%   r%   r&   extended_revoke_value  s    

z"OCSPResponse.extended_revoke_valuec                 C   s   | d d j S )z
        A shortcut into the BasicOCSPResponse sequence

        :return:
            None or an asn1crypto.ocsp.BasicOCSPResponse object
        r   r   rI   rS   r%   r%   r&   rZ     s    	z OCSPResponse.basic_ocsp_responsec                 C   s   | d d j d S )z
        A shortcut into the parsed, ResponseData sequence

        :return:
            None or an asn1crypto.ocsp.ResponseData object
        r   r   r   r   rS   r%   r%   r&   response_data  s    	zOCSPResponse.response_data)r!   r"   r#   rx   r   r,   rK   rE   rr   r   rP   rW   rT   rs   r   rZ   r   r%   r%   r%   r&   r   d  s$   




r   N)I__doc__
__future__r   r   r   r   _errorsr   Zalgosr   r	   corer
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   keysr   x509r   r   r   r   r   r'   r-   r0   r2   r:   r<   rX   rY   r[   r\   r]   r^   rc   rd   re   rj   rk   ro   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r%   r%   r&   <module>   sZ   
<	9	Zx
	