3
K^]                 @   s  d dl mZmZmZ d dl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mZmZmZmZ d dlmZmZ d dlmZ ejdd	d	Zd
d Zdd ZG dd deZdd Zdd Zdd Zdd Zdd Zdd Z G dd de!Z"e	j#ej$G dd de%Z&e	j#ej$G d d! d!e%Z'e	j#ej$G d"d# d#e%Z(e	j#ej$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.d/ Z.dS )0    )absolute_importdivisionprint_functionN)Enum)utils)dsaeced25519ed448rsa)	ExtensionExtensionType)Namei     c             C   s&   x |D ]}|j | j krtdqW d S )Nz$This extension has already been set.)oid
ValueError)	extension
extensionse r   :/tmp/pip-unpacked-wheel-vvkwn1hz/cryptography/x509/base.py_reject_duplicate_extension   s    
r   c             C   s:   | j dk	r2| j }|r|ntj }| jdd| S | S dS )zNormalizes a datetime to a naive datetime in UTC.

    time -- datetime to normalize. Assumed to be in UTC if not timezone
            aware.
    N)tzinfo)r   	utcoffsetdatetime	timedeltareplace)timeoffsetr   r   r   _convert_to_naive_utc_time    s
    
r   c               @   s   e Zd ZdZdZdS )Versionr      N)__name__
__module____qualname__Zv1v3r   r   r   r   r    .   s   r    c             C   s
   |j | S )N)load_pem_x509_certificate)databackendr   r   r   r&   3   s    r&   c             C   s
   |j | S )N)load_der_x509_certificate)r'   r(   r   r   r   r)   7   s    r)   c             C   s
   |j | S )N)load_pem_x509_csr)r'   r(   r   r   r   r*   ;   s    r*   c             C   s
   |j | S )N)load_der_x509_csr)r'   r(   r   r   r   r+   ?   s    r+   c             C   s
   |j | S )N)load_pem_x509_crl)r'   r(   r   r   r   r,   C   s    r,   c             C   s
   |j | S )N)load_der_x509_crl)r'   r(   r   r   r   r-   G   s    r-   c                   s   e Zd Z fddZ  ZS )InvalidVersionc                s   t t| j| || _d S )N)superr.   __init__parsed_version)selfmsgr1   )	__class__r   r   r0   L   s    zInvalidVersion.__init__)r"   r#   r$   r0   __classcell__r   r   )r4   r   r.   K   s   r.   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d#S )$Certificatec             C   s   dS )z4
        Returns bytes using digest passed.
        Nr   )r2   	algorithmr   r   r   fingerprintS   s    zCertificate.fingerprintc             C   s   dS )z3
        Returns certificate serial number
        Nr   )r2   r   r   r   serial_numberY   s    zCertificate.serial_numberc             C   s   dS )z1
        Returns the certificate version
        Nr   )r2   r   r   r   version_   s    zCertificate.versionc             C   s   dS )z(
        Returns the public key
        Nr   )r2   r   r   r   
public_keye   s    zCertificate.public_keyc             C   s   dS )z?
        Not before time (represented as UTC datetime)
        Nr   )r2   r   r   r   not_valid_beforek   s    zCertificate.not_valid_beforec             C   s   dS )z>
        Not after time (represented as UTC datetime)
        Nr   )r2   r   r   r   not_valid_afterq   s    zCertificate.not_valid_afterc             C   s   dS )z1
        Returns the issuer name object.
        Nr   )r2   r   r   r   issuerw   s    zCertificate.issuerc             C   s   dS )z2
        Returns the subject name object.
        Nr   )r2   r   r   r   subject}   s    zCertificate.subjectc             C   s   dS )zt
        Returns a HashAlgorithm corresponding to the type of the digest signed
        in the certificate.
        Nr   )r2   r   r   r   signature_hash_algorithm   s    z$Certificate.signature_hash_algorithmc             C   s   dS )zJ
        Returns the ObjectIdentifier of the signature algorithm.
        Nr   )r2   r   r   r   signature_algorithm_oid   s    z#Certificate.signature_algorithm_oidc             C   s   dS )z/
        Returns an Extensions object.
        Nr   )r2   r   r   r   r      s    zCertificate.extensionsc             C   s   dS )z.
        Returns the signature bytes.
        Nr   )r2   r   r   r   	signature   s    zCertificate.signaturec             C   s   dS )zR
        Returns the tbsCertificate payload bytes as defined in RFC 5280.
        Nr   )r2   r   r   r   tbs_certificate_bytes   s    z!Certificate.tbs_certificate_bytesc             C   s   dS )z"
        Checks equality.
        Nr   )r2   otherr   r   r   __eq__   s    zCertificate.__eq__c             C   s   dS )z#
        Checks not equal.
        Nr   )r2   rD   r   r   r   __ne__   s    zCertificate.__ne__c             C   s   dS )z"
        Computes a hash.
        Nr   )r2   r   r   r   __hash__   s    zCertificate.__hash__c             C   s   dS )zB
        Serializes the certificate to PEM or DER format.
        Nr   )r2   encodingr   r   r   public_bytes   s    zCertificate.public_bytesN)r"   r#   r$   abcabstractmethodr8   abstractpropertyr9   r:   r;   r<   r=   r>   r?   r@   rA   r   rB   rC   rE   rF   rG   rI   r   r   r   r   r6   Q   s"   r6   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d#S )$CertificateRevocationListc             C   s   dS )z:
        Serializes the CRL to PEM or DER format.
        Nr   )r2   rH   r   r   r   rI      s    z&CertificateRevocationList.public_bytesc             C   s   dS )z4
        Returns bytes using digest passed.
        Nr   )r2   r7   r   r   r   r8      s    z%CertificateRevocationList.fingerprintc             C   s   dS )zs
        Returns an instance of RevokedCertificate or None if the serial_number
        is not in the CRL.
        Nr   )r2   r9   r   r   r   (get_revoked_certificate_by_serial_number   s    zBCertificateRevocationList.get_revoked_certificate_by_serial_numberc             C   s   dS )zt
        Returns a HashAlgorithm corresponding to the type of the digest signed
        in the certificate.
        Nr   )r2   r   r   r   r@      s    z2CertificateRevocationList.signature_hash_algorithmc             C   s   dS )zJ
        Returns the ObjectIdentifier of the signature algorithm.
        Nr   )r2   r   r   r   rA      s    z1CertificateRevocationList.signature_algorithm_oidc             C   s   dS )zC
        Returns the X509Name with the issuer of this CRL.
        Nr   )r2   r   r   r   r>      s    z CertificateRevocationList.issuerc             C   s   dS )z?
        Returns the date of next update for this CRL.
        Nr   )r2   r   r   r   next_update   s    z%CertificateRevocationList.next_updatec             C   s   dS )z?
        Returns the date of last update for this CRL.
        Nr   )r2   r   r   r   last_update   s    z%CertificateRevocationList.last_updatec             C   s   dS )zS
        Returns an Extensions object containing a list of CRL extensions.
        Nr   )r2   r   r   r   r      s    z$CertificateRevocationList.extensionsc             C   s   dS )z.
        Returns the signature bytes.
        Nr   )r2   r   r   r   rB      s    z#CertificateRevocationList.signaturec             C   s   dS )zO
        Returns the tbsCertList payload bytes as defined in RFC 5280.
        Nr   )r2   r   r   r   tbs_certlist_bytes   s    z,CertificateRevocationList.tbs_certlist_bytesc             C   s   dS )z"
        Checks equality.
        Nr   )r2   rD   r   r   r   rE     s    z CertificateRevocationList.__eq__c             C   s   dS )z#
        Checks not equal.
        Nr   )r2   rD   r   r   r   rF     s    z CertificateRevocationList.__ne__c             C   s   dS )z<
        Number of revoked certificates in the CRL.
        Nr   )r2   r   r   r   __len__  s    z!CertificateRevocationList.__len__c             C   s   dS )zS
        Returns a revoked certificate (or slice of revoked certificates).
        Nr   )r2   idxr   r   r   __getitem__  s    z%CertificateRevocationList.__getitem__c             C   s   dS )z8
        Iterator over the revoked certificates
        Nr   )r2   r   r   r   __iter__  s    z"CertificateRevocationList.__iter__c             C   s   dS )zQ
        Verifies signature of revocation list against given public key.
        Nr   )r2   r;   r   r   r   is_signature_valid  s    z,CertificateRevocationList.is_signature_validN)r"   r#   r$   rJ   rK   rI   r8   rN   rL   r@   rA   r>   rO   rP   r   rB   rQ   rE   rF   rR   rT   rU   rV   r   r   r   r   rM      s"   rM   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dS )CertificateSigningRequestc             C   s   dS )z"
        Checks equality.
        Nr   )r2   rD   r   r   r   rE   (  s    z CertificateSigningRequest.__eq__c             C   s   dS )z#
        Checks not equal.
        Nr   )r2   rD   r   r   r   rF   .  s    z CertificateSigningRequest.__ne__c             C   s   dS )z"
        Computes a hash.
        Nr   )r2   r   r   r   rG   4  s    z"CertificateSigningRequest.__hash__c             C   s   dS )z(
        Returns the public key
        Nr   )r2   r   r   r   r;   :  s    z$CertificateSigningRequest.public_keyc             C   s   dS )z2
        Returns the subject name object.
        Nr   )r2   r   r   r   r?   @  s    z!CertificateSigningRequest.subjectc             C   s   dS )zt
        Returns a HashAlgorithm corresponding to the type of the digest signed
        in the certificate.
        Nr   )r2   r   r   r   r@   F  s    z2CertificateSigningRequest.signature_hash_algorithmc             C   s   dS )zJ
        Returns the ObjectIdentifier of the signature algorithm.
        Nr   )r2   r   r   r   rA   M  s    z1CertificateSigningRequest.signature_algorithm_oidc             C   s   dS )z@
        Returns the extensions in the signing request.
        Nr   )r2   r   r   r   r   S  s    z$CertificateSigningRequest.extensionsc             C   s   dS )z;
        Encodes the request to PEM or DER format.
        Nr   )r2   rH   r   r   r   rI   Y  s    z&CertificateSigningRequest.public_bytesc             C   s   dS )z.
        Returns the signature bytes.
        Nr   )r2   r   r   r   rB   _  s    z#CertificateSigningRequest.signaturec             C   s   dS )zd
        Returns the PKCS#10 CertificationRequestInfo bytes as defined in RFC
        2986.
        Nr   )r2   r   r   r   tbs_certrequest_bytese  s    z/CertificateSigningRequest.tbs_certrequest_bytesc             C   s   dS )z8
        Verifies signature of signing request.
        Nr   )r2   r   r   r   rV   l  s    z,CertificateSigningRequest.is_signature_validN)r"   r#   r$   rJ   rK   rE   rF   rG   r;   rL   r?   r@   rA   r   rI   rB   rX   rV   r   r   r   r   rW   &  s   rW   c               @   s6   e Zd Zejdd Zejdd Zejdd ZdS )RevokedCertificatec             C   s   dS )zG
        Returns the serial number of the revoked certificate.
        Nr   )r2   r   r   r   r9   u  s    z RevokedCertificate.serial_numberc             C   s   dS )zH
        Returns the date of when this certificate was revoked.
        Nr   )r2   r   r   r   revocation_date{  s    z"RevokedCertificate.revocation_datec             C   s   dS )zW
        Returns an Extensions object containing a list of Revoked extensions.
        Nr   )r2   r   r   r   r     s    zRevokedCertificate.extensionsN)r"   r#   r$   rJ   rL   r9   rZ   r   r   r   r   r   rY   s  s   rY   c               @   s2   e Zd Zdg fddZdd Zdd Zdd	 ZdS )
 CertificateSigningRequestBuilderNc             C   s   || _ || _dS )zB
        Creates an empty X.509 certificate request (v1).
        N)_subject_name_extensions)r2   subject_namer   r   r   r   r0     s    z)CertificateSigningRequestBuilder.__init__c             C   s0   t |tstd| jdk	r$tdt|| jS )zF
        Sets the certificate requestor's distinguished name.
        zExpecting x509.Name object.Nz&The subject name may only be set once.)
isinstancer   	TypeErrorr\   r   r[   r]   )r2   namer   r   r   r^     s
    

z-CertificateSigningRequestBuilder.subject_namec             C   s@   t |tstdt|j||}t|| j t| j| j|g S )zE
        Adds an X.509 extension to the certificate request.
        z"extension must be an ExtensionType)	r_   r   r`   r   r   r   r]   r[   r\   )r2   r   criticalr   r   r   add_extension  s    
z.CertificateSigningRequestBuilder.add_extensionc             C   s    | j dkrtd|j| ||S )zF
        Signs the request using the requestor's private key.
        Nz/A CertificateSigningRequest must have a subject)r\   r   Zcreate_x509_csr)r2   private_keyr7   r(   r   r   r   sign  s    
z%CertificateSigningRequestBuilder.sign)r"   r#   r$   r0   r^   rc   re   r   r   r   r   r[     s   
r[   c               @   sd   e Zd Zddddddg fddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZdS )CertificateBuilderNc             C   s6   t j| _|| _|| _|| _|| _|| _|| _|| _	d S )N)
r    r%   _version_issuer_namer\   _public_key_serial_number_not_valid_before_not_valid_afterr]   )r2   issuer_namer^   r;   r9   r<   r=   r   r   r   r   r0     s    zCertificateBuilder.__init__c             C   sD   t |tstd| jdk	r$tdt|| j| j| j| j	| j
| jS )z3
        Sets the CA's distinguished name.
        zExpecting x509.Name object.Nz%The issuer name may only be set once.)r_   r   r`   rh   r   rf   r\   ri   rj   rk   rl   r]   )r2   ra   r   r   r   rm     s    


zCertificateBuilder.issuer_namec             C   sD   t |tstd| jdk	r$tdt| j|| j| j| j	| j
| jS )z:
        Sets the requestor's distinguished name.
        zExpecting x509.Name object.Nz&The subject name may only be set once.)r_   r   r`   r\   r   rf   rh   ri   rj   rk   rl   r]   )r2   ra   r   r   r   r^     s    


zCertificateBuilder.subject_namec             C   sX   t |tjtjtjtjt	j
fs&td| jdk	r8tdt| j| j|| j| j| j| jS )zT
        Sets the requestor's public key (as found in the signing request).
        zhExpecting one of DSAPublicKey, RSAPublicKey, EllipticCurvePublicKey, Ed25519PublicKey or Ed448PublicKey.Nz$The public key may only be set once.)r_   r   ZDSAPublicKeyr   ZRSAPublicKeyr   ZEllipticCurvePublicKeyr	   ZEd25519PublicKeyr
   ZEd448PublicKeyr`   ri   r   rf   rh   r\   rj   rk   rl   r]   )r2   keyr   r   r   r;     s    


zCertificateBuilder.public_keyc             C   sj   t |tjstd| jdk	r&td|dkr6td|j dkrJtdt| j| j	| j
|| j| j| jS )z5
        Sets the certificate serial number.
        z'Serial number must be of integral type.Nz'The serial number may only be set once.r   z%The serial number should be positive.   z3The serial number should not be more than 159 bits.)r_   sixinteger_typesr`   rj   r   
bit_lengthrf   rh   r\   ri   rk   rl   r]   )r2   numberr   r   r   r9     s    

z CertificateBuilder.serial_numberc             C   sz   t |tjstd| jdk	r&tdt|}|tk r>td| jdk	rZ|| jkrZtdt| j	| j
| j| j|| j| jS )z7
        Sets the certificate activation time.
        zExpecting datetime object.Nz*The not valid before may only be set once.z>The not valid before date must be on or after 1950 January 1).zBThe not valid before date must be before the not valid after date.)r_   r   r`   rk   r   r   _EARLIEST_UTC_TIMErl   rf   rh   r\   ri   rj   r]   )r2   r   r   r   r   r<     s    

z#CertificateBuilder.not_valid_beforec             C   sz   t |tjstd| jdk	r&tdt|}|tk r>td| jdk	rZ|| jk rZtdt| j	| j
| j| j| j|| jS )z7
        Sets the certificate expiration time.
        zExpecting datetime object.Nz)The not valid after may only be set once.z<The not valid after date must be on or after 1950 January 1.zAThe not valid after date must be after the not valid before date.)r_   r   r`   rl   r   r   rt   rk   rf   rh   r\   ri   rj   r]   )r2   r   r   r   r   r=     s    


z"CertificateBuilder.not_valid_afterc          	   C   sT   t |tstdt|j||}t|| j t| j| j	| j
| j| j| j| j|g S )z=
        Adds an X.509 extension to the certificate.
        z"extension must be an ExtensionType)r_   r   r`   r   r   r   r]   rf   rh   r\   ri   rj   rk   rl   )r2   r   rb   r   r   r   rc   2  s    
z CertificateBuilder.add_extensionc             C   sz   | j dkrtd| jdkr$td| jdkr6td| jdkrHtd| jdkrZtd| jdkrltd|j| ||S )zC
        Signs the certificate using the CA's private key.
        Nz&A certificate must have a subject namez&A certificate must have an issuer namez'A certificate must have a serial numberz/A certificate must have a not valid before timez.A certificate must have a not valid after timez$A certificate must have a public key)r\   r   rh   rj   rk   rl   ri   Zcreate_x509_certificate)r2   rd   r7   r(   r   r   r   re   B  s    





zCertificateBuilder.sign)r"   r#   r$   r0   rm   r^   r;   r9   r<   r=   rc   re   r   r   r   r   rf     s   
rf   c               @   sP   e Zd Zdddg g fddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS ) CertificateRevocationListBuilderNc             C   s"   || _ || _|| _|| _|| _d S )N)rh   _last_update_next_updater]   _revoked_certificates)r2   rm   rP   rO   r   Zrevoked_certificatesr   r   r   r0   \  s
    z)CertificateRevocationListBuilder.__init__c             C   s<   t |tstd| jd k	r$tdt|| j| j| j| j	S )NzExpecting x509.Name object.z%The issuer name may only be set once.)
r_   r   r`   rh   r   ru   rv   rw   r]   rx   )r2   rm   r   r   r   rm   d  s    


z,CertificateRevocationListBuilder.issuer_namec             C   sr   t |tjstd| jd k	r&tdt|}|tk r>td| jd k	rZ|| jkrZtdt| j	|| j| j
| jS )NzExpecting datetime object.z!Last update may only be set once.z8The last update date must be on or after 1950 January 1.z9The last update date must be before the next update date.)r_   r   r`   rv   r   r   rt   rw   ru   rh   r]   rx   )r2   rP   r   r   r   rP   n  s    

z,CertificateRevocationListBuilder.last_updatec             C   sr   t |tjstd| jd k	r&tdt|}|tk r>td| jd k	rZ|| jk rZtdt| j	| j|| j
| jS )NzExpecting datetime object.z!Last update may only be set once.z8The last update date must be on or after 1950 January 1.z8The next update date must be after the last update date.)r_   r   r`   rw   r   r   rt   rv   ru   rh   r]   rx   )r2   rO   r   r   r   rO     s    

z,CertificateRevocationListBuilder.next_updatec             C   sL   t |tstdt|j||}t|| j t| j| j	| j
| j|g | jS )zM
        Adds an X.509 extension to the certificate revocation list.
        z"extension must be an ExtensionType)r_   r   r`   r   r   r   r]   ru   rh   rv   rw   rx   )r2   r   rb   r   r   r   rc     s    
z.CertificateRevocationListBuilder.add_extensionc             C   s2   t |tstdt| j| j| j| j| j|g S )z8
        Adds a revoked certificate to the CRL.
        z)Must be an instance of RevokedCertificate)	r_   rY   r`   ru   rh   rv   rw   r]   rx   )r2   Zrevoked_certificater   r   r   add_revoked_certificate  s    
z8CertificateRevocationListBuilder.add_revoked_certificatec             C   sD   | j d krtd| jd kr$td| jd kr6td|j| ||S )NzA CRL must have an issuer namez"A CRL must have a last update timez"A CRL must have a next update time)rh   r   rv   rw   Zcreate_x509_crl)r2   rd   r7   r(   r   r   r   re     s    


z%CertificateRevocationListBuilder.sign)
r"   r#   r$   r0   rm   rP   rO   rc   ry   re   r   r   r   r   ru   [  s   
ru   c               @   s<   e Zd Zddg fddZdd Zdd Zdd	 Zd
d ZdS )RevokedCertificateBuilderNc             C   s   || _ || _|| _d S )N)rj   _revocation_dater]   )r2   r9   rZ   r   r   r   r   r0     s    z"RevokedCertificateBuilder.__init__c             C   sZ   t |tjstd| jd k	r&td|dkr6td|j dkrJtdt|| j| j	S )Nz'Serial number must be of integral type.z'The serial number may only be set once.r   z$The serial number should be positivero   z3The serial number should not be more than 159 bits.)
r_   rp   rq   r`   rj   r   rr   rz   r{   r]   )r2   rs   r   r   r   r9     s    
z'RevokedCertificateBuilder.serial_numberc             C   sN   t |tjstd| jd k	r&tdt|}|tk r>tdt| j|| j	S )NzExpecting datetime object.z)The revocation date may only be set once.z7The revocation date must be on or after 1950 January 1.)
r_   r   r`   r{   r   r   rt   rz   rj   r]   )r2   r   r   r   r   rZ     s    
z)RevokedCertificateBuilder.revocation_datec             C   sD   t |tstdt|j||}t|| j t| j| j	| j|g S )Nz"extension must be an ExtensionType)
r_   r   r`   r   r   r   r]   rz   rj   r{   )r2   r   rb   r   r   r   rc     s    
z'RevokedCertificateBuilder.add_extensionc             C   s.   | j d krtd| jd kr$td|j| S )Nz/A revoked certificate must have a serial numberz1A revoked certificate must have a revocation date)rj   r   r{   Zcreate_x509_revoked_certificate)r2   r(   r   r   r   build  s    

zRevokedCertificateBuilder.build)r"   r#   r$   r0   r9   rZ   rc   r|   r   r   r   r   rz     s   rz   c               C   s   t jtjddd? S )N   bigr   )r   Zint_from_bytesosurandomr   r   r   r   random_serial_number  s    r   )/
__future__r   r   r   rJ   r   r   enumr   rp   Zcryptographyr   Z)cryptography.hazmat.primitives.asymmetricr   r   r	   r
   r   Zcryptography.x509.extensionsr   r   Zcryptography.x509.namer   rt   r   r   r    r&   r)   r*   r+   r,   r-   	Exceptionr.   add_metaclassABCMetaobjectr6   rM   rW   rY   r[   rf   ru   rz   r   r   r   r   r   <module>   sD   ijL) +_;