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 )VersionZv1Zv2Zv3)r   r      N__name__
__module____qualname___map r    r    2/tmp/pip-unpacked-wheel-etcy_95o/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optionalZonly_contains_user_certsr   F)implicitdefaultZonly_contains_ca_certsr   Zonly_some_reasons   )r'   r&   Zindirect_crl   Z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!   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edZdS )	TBSCertListExtensionextn_idcriticalr(   F
extn_valuer6   r8   )r.   r/   r0   r1   r2   r3   r4   N)r   r   r   r-   r   r   r,   	_oid_pairr   r   r"   r   r   r   
_oid_specsr    r    r    r!   r5   J   s   r5   c                   @   s   e Zd ZeZdS )TBSCertListExtensionsN)r   r   r   r5   _child_specr    r    r    r!   r<   ]   s   r<   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)   r*   r+         	   
   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)
r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   nativeselfr    r    r!   human_friendlyo   s    zCRLReason.human_friendlyN)r   r   r   r   propertyrQ   r    r    r    r!   r>   a   s   r>   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!   rS      s
   rS   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 )	CRLEntryExtensionr6   r7   r(   Fr8   r9   )rT   rU   rV   rW   N)r   r   r   rS   r   r   r,   r:   r>   r   r
   r   r;   r    r    r    r!   rX      s   rX   c                   @   s   e Zd ZeZdS )CRLEntryExtensionsN)r   r   r   rX   r=   r    r    r    r!   rY      s   rY   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_certificateZ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
        r[   r6   	_%s_valuer8   r7   TNset_critical_extensionsrN   hasattrsetattrparsedadd_processed_extensionsrP   	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
        re   ri   r`   rO   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)re   ri   _crl_reason_valuerO   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)re   ri   _invalidity_date_valuerO   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)re   ri   _certificate_issuer_valuerO   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_namerr   rh   chosen)rP   general_namer    r    r!   issuer_name   s    


zRevokedCertificate.issuer_name)r   r   r   r   r   rY   r,   re   r`   rm   ro   rq   rs   ri   rR   rl   rn   rp   rr   rv   r    r    r    r!   rZ      s*   



rZ   c                   @   s   e Zd ZeZdS )RevokedCertificatesN)r   r   r   rZ   r=   r    r    r    r!   rw     s   rw   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issuerZthis_updateZnext_updateZrevoked_certificatescrl_extensionsr   r$   N)
r   r   r   r   r   r   r   rw   r<   r,   r    r    r    r!   rx     s   rx   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_listZsignature_algorithmrz   FNc                 C   sh   t  | _| d d D ]H}|d j}d| }t| |rFt| ||d j |d jr| j| qd| _dS )	r\   r~   r|   r6   r]   r8   r7   TNr^   rf   r    r    r!   ri   4  s    


zCertificateList._set_extensionsc                 C   s   | j s|   | jS rj   rk   rO   r    r    r!   rl   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)re   ri   _issuer_alt_name_valuerO   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)re   ri   _crl_number_valuerO   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)re   ri   _delta_crl_indicator_valuerO   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)re   ri   !_issuing_distribution_point_valuerO   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)re   ri   _authority_key_identifier_valuerO   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)re   ri   _freshest_crl_valuerO   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)re   ri   #_authority_information_access_valuerO   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    rO   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
        NZkey_identifier)r   rN   rO   r    r    r!   r2     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
        NZaccess_methodZ
ca_issuersZaccess_locationuniform_resource_identifierr      zhttp://)_issuer_cert_urlsr   rN   rh   lowerappend)rP   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   rh   rt   r   )rP   r#   Zdistribution_point_nameru   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
        rz   rM   rO   r    r    r!   rz     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digestrO   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   rO   r    r    r!   r     s    
zCertificateList.sha256)%r   r   r   rx   r   r   r,   re   r`   r   r   r   r   r   r   r   r   r   r   r   ri   rR   rl   r   r   r   r   r   r   r   r{   r2   r   r   rz   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"   r-   r5   r<   r>   rS   rX   rY   rZ   rw   rx   r}   r    r    r    r!   <module>   s$   	,(&	k