U
    ;g>                     @   sX  d Z ddlmZmZmZmZ ddlZddlmZ ddl	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mZmZ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(dS )"z
ASN.1 type classes for certificate revocation lists (CRL). Exports the
following items:

 - CertificateList()

Other type classes are defined that help compose the types listed above.
    )unicode_literalsdivisionabsolute_importprint_functionN   )SignedDigestAlgorithm)	Boolean
EnumeratedGeneralizedTimeIntegerObjectIdentifierOctetBitStringParsableOctetStringSequence
SequenceOf)AuthorityInfoAccessSyntaxAuthorityKeyIdentifierCRLDistributionPointsDistributionPointNameGeneralNamesNameReasonFlagsTimec                   @   s   e Zd ZddddZdS )Versionv1Zv2v3)r   r      N__name__
__module____qualname___map r"   r"   2/tmp/pip-unpacked-wheel-fr05hfkd/asn1crypto/crl.pyr   +   s   r   c                
   @   sd   e Zd Zdedddfdedddfd	ed
ddfdedddfdedddfdedddfgZdS )IssuingDistributionPointdistribution_pointr   Texplicitoptionalonly_contains_user_certsr   F)implicitdefaultonly_contains_ca_certsr   only_some_reasons   )r*   r(   indirect_crl   only_contains_attribute_certs   N)r   r   r    r   r   r   _fieldsr"   r"   r"   r#   r$   3   s   r$   c                   @   s    e Zd ZddddddddZd	S )
TBSCertListExtensionIdissuer_alt_name
crl_numberdelta_crl_indicatorissuing_distribution_pointauthority_key_identifierfreshest_crlauthority_information_access)z	2.5.29.18z	2.5.29.20z	2.5.29.27z	2.5.29.28z	2.5.29.35z	2.5.29.46z1.3.6.1.5.5.7.1.1Nr   r"   r"   r"   r#   r4   >   s   r4   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edZdS )	TBSCertListExtensionextn_idcriticalr+   F
extn_valuer=   r?   )r5   r6   r7   r8   r9   r:   r;   N)r   r   r    r4   r   r   r3   	_oid_pairr   r   r$   r   r   r   
_oid_specsr"   r"   r"   r#   r<   J   s   r<   c                   @   s   e Zd ZeZdS )TBSCertListExtensionsN)r   r   r    r<   _child_specr"   r"   r"   r#   rC   ]   s   rC   c                   @   s2   e Zd Zddddddddd	d
d
Zedd ZdS )	CRLReasonunspecifiedkey_compromiseca_compromiseaffiliation_changed
supersededcessation_of_operationcertificate_holdremove_from_crlprivilege_withdrawnaa_compromise)
r   r   r   r.   r0   r2         	   
   c                 C   s    ddddddddd	d
d
| j  S )a  
        :return:
            A unicode string with revocation description that is suitable to
            show to end-users. Starts with a lower case letter and phrased in
            such a way that it makes sense after the phrase "because of" or
            "due to".
        zan unspecified reasonza compromised keyzthe CA being compromisedzan affiliation changezcertificate supersessionza cessation of operationza certificate holdzremoval from the CRLzprivilege withdrawlzthe AA being compromised)
rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   nativeselfr"   r"   r#   human_friendlyo   s    zCRLReason.human_friendlyN)r   r   r    r!   propertyrX   r"   r"   r"   r#   rE   a   s   rE   c                   @   s   e Zd ZdddddZdS )CRLEntryExtensionId
crl_reasonhold_instruction_codeinvalidity_datecertificate_issuer)z	2.5.29.21z	2.5.29.23z	2.5.29.24z	2.5.29.29Nr   r"   r"   r"   r#   rZ      s
   rZ   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dZdS )	CRLEntryExtensionr=   r>   r+   Fr?   r@   )r[   r\   r]   r^   N)r   r   r    rZ   r   r   r3   rA   rE   r   r
   r   rB   r"   r"   r"   r#   r_      s   r_   c                   @   s   e Zd ZeZdS )CRLEntryExtensionsN)r   r   r    r_   rD   r"   r"   r"   r#   r`      s   r`   c                   @   s   e Zd Zdefdefdeddifg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dS )RevokedCertificateZuser_certificaterevocation_datecrl_entry_extensionsr(   TFNc                 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
        rc   r=   	_%s_valuer?   r>   TNset_critical_extensionsrU   hasattrsetattrparsedadd_processed_extensionsrW   	extensionnameZattribute_namer"   r"   r#   _set_extensions   s    


z"RevokedCertificate._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
        rm   rq   rh   rV   r"   r"   r#   critical_extensions   s    
z&RevokedCertificate.critical_extensionsc                 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)rm   rq   _crl_reason_valuerV   r"   r"   r#   crl_reason_value   s    	
z#RevokedCertificate.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)rm   rq   _invalidity_date_valuerV   r"   r"   r#   invalidity_date_value   s    
z(RevokedCertificate.invalidity_date_valuec                 C   s   | j dkr|   | jS )a  
        This extension indicates the issuer of the certificate in question,
        and is used in indirect CRLs. CRL entries without this extension are
        for certificates issued from the last seen issuer.

        :return:
            None or an x509.GeneralNames object
        F)rm   rq   _certificate_issuer_valuerV   r"   r"   r#   certificate_issuer_value   s    
z+RevokedCertificate.certificate_issuer_valuec                 C   s>   | j dkr8d| _ | jr8| jD ]}|jdkr|j| _  q8q| j S )zi
        :return:
            None, or an asn1crypto.x509.Name object for the issuer of the cert
        FNZdirectory_name)_issuer_namerz   rp   chosen)rW   general_namer"   r"   r#   issuer_name   s    


zRevokedCertificate.issuer_name)r   r   r    r   r   r`   r3   rm   rh   ru   rw   ry   r{   rq   rY   rt   rv   rx   rz   r~   r"   r"   r"   r#   ra      s*   



ra   c                   @   s   e Zd ZeZdS )RevokedCertificatesN)r   r   r    ra   rD   r"   r"   r"   r#   r     s   r   c                   @   sT   e Zd Zdeddifdefdefdefdeddifdeddifd	ed
ddfgZ	dS )TbsCertListversionr(   T	signatureissuerthis_updatenext_updaterevoked_certificatescrl_extensionsr   r&   N)
r   r   r    r   r   r   r   r   rC   r3   r"   r"   r"   r#   r     s   r   c                   @   s  e Zd ZdefdefdefgZdZdZdZ	dZ
dZd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e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"ed"d# Z#ed$d% Z$dS )&CertificateListtbs_cert_listsignature_algorithmr   FNc                 C   sh   t  | _| d d D ]H}|d j}d| }t| |rFt| ||d j |d jr| j| qd| _dS )	rd   r   r   r=   re   r?   r>   TNrf   rn   r"   r"   r#   rq   4  s    


zCertificateList._set_extensionsc                 C   s   | j s|   | jS rr   rs   rV   r"   r"   r#   rt   F  s    
z#CertificateList.critical_extensionsc                 C   s   | j dkr|   | jS )z
        This extension allows associating one or more alternative names with
        the issuer of the CRL.

        :return:
            None or an x509.GeneralNames object
        F)rm   rq   _issuer_alt_name_valuerV   r"   r"   r#   issuer_alt_name_valueT  s    

z%CertificateList.issuer_alt_name_valuec                 C   s   | j dkr|   | jS )z
        This extension adds a monotonically increasing number to the CRL and is
        used to distinguish different versions of the CRL.

        :return:
            None or an Integer object
        F)rm   rq   _crl_number_valuerV   r"   r"   r#   crl_number_valueb  s    

z CertificateList.crl_number_valuec                 C   s   | j dkr|   | jS )z
        This extension indicates a CRL is a delta CRL, and contains the CRL
        number of the base CRL that it is a delta from.

        :return:
            None or an Integer object
        F)rm   rq   _delta_crl_indicator_valuerV   r"   r"   r#   delta_crl_indicator_valuep  s    

z)CertificateList.delta_crl_indicator_valuec                 C   s   | j dkr|   | jS )z
        This extension includes information about what types of revocations
        and certificates are part of the CRL.

        :return:
            None or an IssuingDistributionPoint object
        F)rm   rq   !_issuing_distribution_point_valuerV   r"   r"   r#    issuing_distribution_point_value~  s    

z0CertificateList.issuing_distribution_point_valuec                 C   s   | j dkr|   | jS )z
        This extension helps in identifying the public key with which to
        validate the authenticity of the CRL.

        :return:
            None or an AuthorityKeyIdentifier object
        F)rm   rq   _authority_key_identifier_valuerV   r"   r"   r#   authority_key_identifier_value  s    

z.CertificateList.authority_key_identifier_valuec                 C   s   | j dkr|   | jS )z
        This extension is used in complete CRLs to indicate where a delta CRL
        may be located.

        :return:
            None or a CRLDistributionPoints object
        F)rm   rq   _freshest_crl_valuerV   r"   r"   r#   freshest_crl_value  s    

z"CertificateList.freshest_crl_valuec                 C   s   | j dkr|   | jS )z
        This extension is used to provide a URL with which to download the
        certificate used to sign this CRL.

        :return:
            None or an AuthorityInfoAccessSyntax object
        F)rm   rq   #_authority_information_access_valuerV   r"   r"   r#   "authority_information_access_value  s    

z2CertificateList.authority_information_access_valuec                 C   s   | d d S )z_
        :return:
            An asn1crypto.x509.Name object for the issuer of the CRL
        r   r   r"   rV   r"   r"   r#   r     s    zCertificateList.issuerc                 C   s   | j s
dS | j d jS )z
        :return:
            None or a byte string of the key_identifier from the authority key
            identifier extension
        Nkey_identifier)r   rU   rV   r"   r"   r#   r9     s    z(CertificateList.authority_key_identifierc                 C   sp   | j dkrjg | _ | jrj| jD ]L}|d jdkr|d }|jdkrBq|j}| dd dkr| j | q| j S )	z
        :return:
            A list of unicode strings that are URLs that should contain either
            an individual DER-encoded X.509 certificate, or a DER-encoded CMS
            message containing multiple certificates
        Naccess_methodZ
ca_issuersaccess_locationuniform_resource_identifierr      zhttp://)_issuer_cert_urlsr   rU   rp   lowerappend)rW   entrylocationurlr"   r"   r#   issuer_cert_urls  s    	


z CertificateList.issuer_cert_urlsc                 C   sb   | j dkr\g | _ | jdk	r\| jD ]:}|d }|jdkr8q |jD ]}|jdkr>| j | q>q | j S )z
        Returns delta CRL URLs - only applies to complete CRLs

        :return:
            A list of zero or more DistributionPoint objects
        Nr%   Zname_relative_to_crl_issuerr   )_delta_crl_distribution_pointsr   rp   r|   r   )rW   r%   Zdistribution_point_namer}   r"   r"   r#   delta_crl_distribution_points  s    	





z-CertificateList.delta_crl_distribution_pointsc                 C   s
   | d j S )zE
        :return:
            A byte string of the signature
        r   rT   rV   r"   r"   r#   r     s    zCertificateList.signaturec                 C   s$   | j dkrt|   | _ | j S )zf
        :return:
            The SHA1 hash of the DER-encoded bytes of this certificate list
        N)_sha1hashlibsha1dumpdigestrV   r"   r"   r#   r     s    
zCertificateList.sha1c                 C   s$   | j dkrt|   | _ | j S )zi
        :return:
            The SHA-256 hash of the DER-encoded bytes of this certificate list
        N)_sha256r   sha256r   r   rV   r"   r"   r#   r     s    
zCertificateList.sha256)%r   r   r    r   r   r   r3   rm   rh   r   r   r   r   r   r   r   r   r   r   r   rq   rY   rt   r   r   r   r   r   r   r   r   r9   r   r   r   r   r   r"   r"   r"   r#   r     s`   














r   ))__doc__
__future__r   r   r   r   r   Zalgosr   corer   r	   r
   r   r   r   r   r   r   x509r   r   r   r   r   r   r   r   r   r$   r4   r<   rC   rE   rZ   r_   r`   ra   r   r   r   r"   r"   r"   r#   <module>   s$   	,(&	k