U
    ʹh]m                  	   @  s@  d dl mZ d dlZd dlZ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 d dlmZ d dl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mZmZm Z  d d
l!m"Z"m#Z# d dl$m%Z% edddZ&ej'ej(ej)ej*ej+ej,ej-ej.ej/f Z0G dd de1Z2ddddddZ3ddddddZ4dddddZ5G dd  d Z6G d!d" d"Z7G d#d$ d$e
j8Z9G d%d& d&e1Z:ej;Z;G d'd( d(ej<d)Z=e=>ej= G d*d+ d+e=Z?ej@Z@ejAZAejBZBejCZCejDZDejEZEejFZFejGZGejHZHG d,d- d-ZIG d.d/ d/ZJG d0d1 d1ZKG d2d3 d3ZLd4d5d6d7ZMdS )8    )annotationsN)Iterable)utils)x509)hashes)dsaeced448ed25519paddingrsax448x25519) CertificateIssuerPrivateKeyTypesCertificatePublicKeyTypes)	Extension
ExtensionsExtensionType_make_sequence_methods)Name	_ASN1Type)ObjectIdentifieri     c                      s&   e Zd Zdddd fddZ  ZS )AttributeNotFoundstrr   None)msgoidreturnc                   s   t  | || _d S N)super__init__r   )selfr   r   	__class__ <./venv/lib/python3.8/site-packages/cryptography/x509/base.pyr!   9   s    zAttributeNotFound.__init____name__
__module____qualname__r!   __classcell__r%   r%   r#   r&   r   8   s   r   zExtension[ExtensionType]list[Extension[ExtensionType]]r   )	extension
extensionsr   c                 C  s"   |D ]}|j | j krtdqd S )Nz$This extension has already been set.)r   
ValueError)r-   r.   er%   r%   r&   _reject_duplicate_extension>   s    r1   r   0list[tuple[ObjectIdentifier, bytes, int | None]])r   
attributesr   c                 C  s$   |D ]\}}}|| krt dqd S )Nz$This attribute has already been set.)r/   )r   r3   Zattr_oid_r%   r%   r&   _reject_duplicate_attributeH   s    r5   datetime.datetimetimer   c                 C  s:   | j dk	r2|  }|r|nt }| 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:   Z	utcoffsetdatetimeZ	timedeltareplace)r8   offsetr%   r%   r&   _convert_to_naive_utc_timeR   s
    
r>   c                   @  sx   e Zd ZejjfdddddddZeddd	d
ZeddddZddddZ	dddddZ
ddddZdS )	Attributer   bytesintr   )r   value_typer   c                 C  s   || _ || _|| _d S r   )_oid_valuerC   )r"   r   rB   rC   r%   r%   r&   r!   a   s    zAttribute.__init__r   c                 C  s   | j S r   )rD   r"   r%   r%   r&   r   k   s    zAttribute.oidc                 C  s   | j S r   )rE   rG   r%   r%   r&   rB   o   s    zAttribute.valuer   c                 C  s   d| j  d| jdS )Nz<Attribute(oid=z, value=)>)r   rB   rG   r%   r%   r&   __repr__s   s    zAttribute.__repr__objectbool)otherr   c                 C  s2   t |tstS | j|jko0| j|jko0| j|jkS r   )
isinstancer?   NotImplementedr   rB   rC   )r"   rL   r%   r%   r&   __eq__v   s    


zAttribute.__eq__c                 C  s   t | j| j| jfS r   )hashr   rB   rC   rG   r%   r%   r&   __hash__   s    zAttribute.__hash__N)r(   r)   r*   r   Z
UTF8StringrB   r!   propertyr   rI   rO   rQ   r%   r%   r%   r&   r?   `   s   

r?   c                   @  sH   e Zd ZdddddZed\ZZZddd	d
ZdddddZ	dS )
AttributeszIterable[Attribute]r   )r3   r   c                 C  s   t || _d S r   )list_attributes)r"   r3   r%   r%   r&   r!      s    zAttributes.__init__rU   r   rF   c                 C  s   d| j  dS )Nz<Attributes(rH   )rU   rG   r%   r%   r&   rI      s    zAttributes.__repr__r   r?   )r   r   c                 C  s2   | D ]}|j |kr|  S qtd| d|d S )NzNo z attribute was found)r   r   )r"   r   attrr%   r%   r&   get_attribute_for_oid   s    

z Attributes.get_attribute_for_oidN)
r(   r)   r*   r!   r   __len____iter____getitem__rI   rW   r%   r%   r%   r&   rS      s   rS   c                   @  s   e Zd ZdZdZdS )Versionr      N)r(   r)   r*   Zv1v3r%   r%   r%   r&   r[      s   r[   c                      s&   e Zd Zdddd fddZ  ZS )InvalidVersionr   rA   r   )r   parsed_versionr   c                   s   t  | || _d S r   )r    r!   r_   )r"   r   r_   r#   r%   r&   r!      s    zInvalidVersion.__init__r'   r%   r%   r#   r&   r^      s   r^   c                   @  sl   e Zd ZeejddddZeejddddZeejdddd	Zeejd
dddZ	dS )RevokedCertificaterA   rF   c                 C  s   dS )zG
        Returns the serial number of the revoked certificate.
        Nr%   rG   r%   r%   r&   serial_number   s    z RevokedCertificate.serial_numberr6   c                 C  s   dS )zH
        Returns the date of when this certificate was revoked.
        Nr%   rG   r%   r%   r&   revocation_date   s    z"RevokedCertificate.revocation_datec                 C  s   dS )zl
        Returns the date of when this certificate was revoked as a non-naive
        UTC datetime.
        Nr%   rG   r%   r%   r&   revocation_date_utc   s    z&RevokedCertificate.revocation_date_utcr   c                 C  s   dS )zW
        Returns an Extensions object containing a list of Revoked extensions.
        Nr%   rG   r%   r%   r&   r.      s    zRevokedCertificate.extensionsN)
r(   r)   r*   rR   abcabstractmethodra   rb   rc   r.   r%   r%   r%   r&   r`      s   r`   )	metaclassc                   @  sf   e Zd ZddddddZedddd	Zeddd
dZeddddZeddddZdS )_RawRevokedCertificaterA   r6   r   ra   rb   r.   c                 C  s   || _ || _|| _d S r   _serial_number_revocation_date_extensionsr"   ra   rb   r.   r%   r%   r&   r!      s    z_RawRevokedCertificate.__init__rF   c                 C  s   | j S r   )rj   rG   r%   r%   r&   ra      s    z$_RawRevokedCertificate.serial_numberc                 C  s   t jdtjdd | jS )Nuk   Properties that return a naïve datetime object have been deprecated. Please switch to revocation_date_utc.r\   )
stacklevel)warningswarnr   ZDeprecatedIn42rk   rG   r%   r%   r&   rb      s    z&_RawRevokedCertificate.revocation_datec                 C  s   | j jtjjdS )Nr9   )rk   r<   r;   timezoneZutcrG   r%   r%   r&   rc      s    z*_RawRevokedCertificate.revocation_date_utcc                 C  s   | j S r   )rl   rG   r%   r%   r&   r.      s    z!_RawRevokedCertificate.extensionsN)	r(   r)   r*   r!   rR   ra   rb   rc   r.   r%   r%   r%   r&   rg      s   
	rg   c                	   @  s   e Zd Zdg g fddddddZdd d	d
dZddd dddZdddddd dddZd"ddddddddddd d!ZdS )# CertificateSigningRequestBuilderNName | Noner,   r2   )subject_namer.   r3   c                 C  s   || _ || _|| _dS )zB
        Creates an empty X.509 certificate request (v1).
        N)_subject_namerl   rU   )r"   rt   r.   r3   r%   r%   r&   r!      s    	z)CertificateSigningRequestBuilder.__init__r   namer   c                 C  s4   t |tstd| jdk	r$tdt|| j| jS )zF
        Sets the certificate requestor's distinguished name.
        Expecting x509.Name object.N&The subject name may only be set once.)rM   r   	TypeErrorru   r/   rr   rl   rU   r"   rw   r%   r%   r&   rt   	  s    

  z-CertificateSigningRequestBuilder.subject_namer   rK   extvalcriticalr   c                 C  sD   t |tstdt|j||}t|| j t| j| j|f| j	S )zE
        Adds an X.509 extension to the certificate request.
        "extension must be an ExtensionType)
rM   r   rz   r   r   r1   rl   rr   ru   rU   r"   r}   r~   r-   r%   r%   r&   add_extension  s    

z.CertificateSigningRequestBuilder.add_extension)_tagr   r@   z_ASN1Type | None)r   rB   r   r   c                C  s|   t |tstdt |ts$td|dk	r>t |ts>tdt|| j |dk	rZ|j}nd}t| j	| j
| j|||ffS )zK
        Adds an X.509 attribute with an OID and associated value.
        zoid must be an ObjectIdentifierzvalue must be bytesNztag must be _ASN1Type)rM   r   rz   r@   r   r5   rU   rB   rr   ru   rl   )r"   r   rB   r   tagr%   r%   r&   add_attribute'  s    


z.CertificateSigningRequestBuilder.add_attributersa_paddingecdsa_deterministicr   _AllowedHashTypes | None
typing.Any%padding.PSS | padding.PKCS1v15 | Nonebool | NoneCertificateSigningRequestprivate_key	algorithmbackendr   r   r   c                C  sv   | j dkrtd|dk	rHt|tjtjfs4tdt|tjsHtd|dk	rdt|t	j
sdtdt| ||||S )zF
        Signs the request using the requestor's private key.
        Nz/A CertificateSigningRequest must have a subjectPadding must be PSS or PKCS1v15&Padding is only supported for RSA keys1Deterministic ECDSA is only supported for EC keys)ru   r/   rM   r   PSSPKCS1v15rz   r   RSAPrivateKeyr   EllipticCurvePrivateKey	rust_x509Zcreate_x509_csrr"   r   r   r   r   r   r%   r%   r&   signG  s&    
z%CertificateSigningRequestBuilder.sign)N)r(   r)   r*   r!   rt   r   r   r   r%   r%   r%   r&   rr      s   $ rr   c                
   @  s   e Zd ZU ded< ddddddg fddddddddd	d
dZdd dddZdd dddZdd dddZdd dddZdd dddZ	dd dddZ
d d!d d"d#d$Zd/ddd%d&d'd(d)d*d+d,d-d.ZdS )0CertificateBuilderr,   rl   Nrs   z CertificatePublicKeyTypes | None
int | Nonedatetime.datetime | Noner   )issuer_namert   
public_keyra   not_valid_beforenot_valid_afterr.   r   c                 C  s6   t j| _|| _|| _|| _|| _|| _|| _|| _	d S r   )
r[   r]   Z_version_issuer_nameru   _public_keyrj   _not_valid_before_not_valid_afterrl   )r"   r   rt   r   ra   r   r   r.   r%   r%   r&   r!   n  s    
zCertificateBuilder.__init__r   rv   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.
        rx   N%The issuer name may only be set once.)rM   r   rz   r   r/   r   ru   r   rj   r   r   rl   r{   r%   r%   r&   r     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.
        rx   Nry   )rM   r   rz   ru   r/   r   r   r   rj   r   r   rl   r{   r%   r%   r&   rt     s    

zCertificateBuilder.subject_namer   )keyr   c              	   C  s`   t |tjtjtjtjt	j
tjtjfs.td| jdk	r@tdt| j| j|| j| j| j| jS )zT
        Sets the requestor's public key (as found in the signing request).
        zExpecting one of DSAPublicKey, RSAPublicKey, EllipticCurvePublicKey, Ed25519PublicKey, Ed448PublicKey, X25519PublicKey, or X448PublicKey.Nz$The public key may only be set once.)rM   r   ZDSAPublicKeyr   ZRSAPublicKeyr   ZEllipticCurvePublicKeyr
   ZEd25519PublicKeyr	   ZEd448PublicKeyr   ZX25519PublicKeyr   ZX448PublicKeyrz   r   r/   r   r   ru   rj   r   r   rl   )r"   r   r%   r%   r&   r     s2    
zCertificateBuilder.public_keyrA   numberr   c                 C  sh   t |tstd| jdk	r$td|dkr4td| dkrHtdt| j| j| j	|| j
| j| jS )z5
        Sets the certificate serial number.
        'Serial number must be of integral type.N'The serial number may only be set once.r   z%The serial number should be positive.   3The serial number should not be more than 159 bits.)rM   rA   rz   rj   r/   
bit_lengthr   r   ru   r   r   r   rl   r"   r   r%   r%   r&   ra     s&    

z CertificateBuilder.serial_numberr6   r7   c                 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.
        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.)rM   r;   rz   r   r/   r>   _EARLIEST_UTC_TIMEr   r   r   ru   r   rj   rl   r"   r8   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.
        r   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.)rM   r;   rz   r   r/   r>   r   r   r   r   ru   r   rj   rl   r   r%   r%   r&   r     s2    
z"CertificateBuilder.not_valid_afterr   rK   r|   c              	   C  sT   t |tstdt|j||}t|| j t| j| j	| j
| j| j| j| j|fS )z=
        Adds an X.509 extension to the certificate.
        r   )rM   r   rz   r   r   r1   rl   r   r   ru   r   rj   r   r   r   r%   r%   r&   r   !  s    

z CertificateBuilder.add_extensionr   r   r   r   r   r   Certificater   c                C  s   | 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|dk	rt|tj	tj
fstdt|tjstd	|dk	rt|tjstd
t| ||||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 keyr   r   r   )ru   r/   r   rj   r   r   r   rM   r   r   r   rz   r   r   r   r   r   Zcreate_x509_certificater   r%   r%   r&   r   7  s:    





zCertificateBuilder.sign)N)r(   r)   r*   __annotations__r!   r   rt   r   ra   r   r   r   r   r%   r%   r%   r&   r   k  s*   
% r   c                	   @  s   e Zd ZU ded< ded< dddg g fddddddd	d
Zdd dddZdd dddZdd dddZddd dddZdd dddZ	d)dddd d!d"d#d$d%d&d'd(Z
dS )* CertificateRevocationListBuilderr,   rl   zlist[RevokedCertificate]_revoked_certificatesNrs   r   )r   last_updatenext_updater.   revoked_certificatesc                 C  s"   || _ || _|| _|| _|| _d S r   )r   _last_update_next_updaterl   r   )r"   r   r   r   r.   r   r%   r%   r&   r!   n  s
    z)CertificateRevocationListBuilder.__init__r   )r   r   c                 C  s<   t |tstd| jd k	r$tdt|| j| j| j| j	S )Nrx   r   )
rM   r   rz   r   r/   r   r   r   rl   r   )r"   r   r%   r%   r&   r   |  s    

z,CertificateRevocationListBuilder.issuer_namer6   )r   r   c                 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 )Nr   !Last update may only be set once.8The last update date must be on or after 1950 January 1.z9The last update date must be before the next update date.)rM   r;   rz   r   r/   r>   r   r   r   r   rl   r   )r"   r   r%   r%   r&   r     s(    
z,CertificateRevocationListBuilder.last_update)r   r   c                 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 )Nr   r   r   z8The next update date must be after the last update date.)rM   r;   rz   r   r/   r>   r   r   r   r   rl   r   )r"   r   r%   r%   r&   r     s(    
z,CertificateRevocationListBuilder.next_updater   rK   r|   c                 C  sL   t |tstdt|j||}t|| j t| j| j	| j
| j|f| jS )zM
        Adds an X.509 extension to the certificate revocation list.
        r   )rM   r   rz   r   r   r1   rl   r   r   r   r   r   r   r%   r%   r&   r     s    

z.CertificateRevocationListBuilder.add_extensionr`   )revoked_certificater   c                 C  s2   t |tstdt| j| j| j| j| j|fS )z8
        Adds a revoked certificate to the CRL.
        z)Must be an instance of RevokedCertificate)	rM   r`   rz   r   r   r   r   rl   r   )r"   r   r%   r%   r&   add_revoked_certificate  s    

z8CertificateRevocationListBuilder.add_revoked_certificater   r   r   r   r   r   CertificateRevocationListr   c                C  s   | j d krtd| jd kr$td| jd kr6td|d k	rlt|tjtjfsXtdt|t	j
sltd|d k	rt|tjstdt| ||||S )NzA CRL must have an issuer namez"A CRL must have a last update timez"A CRL must have a next update timer   r   r   )r   r/   r   r   rM   r   r   r   rz   r   r   r   r   r   Zcreate_x509_crlr   r%   r%   r&   r     s.    	


z%CertificateRevocationListBuilder.sign)N)r(   r)   r*   r   r!   r   r   r   r   r   r   r%   r%   r%   r&   r   j  s$   
 r   c                   @  sj   e Zd Zddg fddddddZdd d	d
dZdd dddZddd dddZddddddZdS )RevokedCertificateBuilderNr   r   r,   rh   c                 C  s   || _ || _|| _d S r   ri   rm   r%   r%   r&   r!     s    z"RevokedCertificateBuilder.__init__rA   r   c                 C  sX   t |tstd| jd k	r$td|dkr4td| dkrHtdt|| j| jS )Nr   r   r   z$The serial number should be positiver   r   )	rM   rA   rz   rj   r/   r   r   rk   rl   r   r%   r%   r&   ra     s    

  z'RevokedCertificateBuilder.serial_numberr6   r7   c                 C  sN   t |tjstd| jd k	r&tdt|}|tk r>tdt| j|| j	S )Nr   z)The revocation date may only be set once.z7The revocation date must be on or after 1950 January 1.)
rM   r;   rz   rk   r/   r>   r   r   rj   rl   r   r%   r%   r&   rb   #  s    
  z)RevokedCertificateBuilder.revocation_dater   rK   r|   c                 C  sD   t |tstdt|j||}t|| j t| j| j	| j|fS )Nr   )
rM   r   rz   r   r   r1   rl   r   rj   rk   r   r%   r%   r&   r   3  s    

z'RevokedCertificateBuilder.add_extensionr   r`   )r   r   c                 C  s:   | j d krtd| jd kr$tdt| j | jt| jS )Nz/A revoked certificate must have a serial numberz1A revoked certificate must have a revocation date)rj   r/   rk   rg   r   rl   )r"   r   r%   r%   r&   buildA  s    

zRevokedCertificateBuilder.build)N)r(   r)   r*   r!   ra   rb   r   r   r%   r%   r%   r&   r     s   
r   rA   rF   c                   C  s   t tddd? S )N   Zbigr   )rA   
from_bytesosurandomr%   r%   r%   r&   random_serial_numberO  s    r   )NZ
__future__r   rd   r;   r   typingro   Zcollections.abcr   Zcryptographyr   Z"cryptography.hazmat.bindings._rustr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r   r	   r
   r   r   r   r   Z/cryptography.hazmat.primitives.asymmetric.typesr   r   Zcryptography.x509.extensionsr   r   r   r   Zcryptography.x509.namer   r   Zcryptography.x509.oidr   r   ZUnionZSHA224ZSHA256ZSHA384ZSHA512ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512Z_AllowedHashTypes	Exceptionr   r1   r5   r>   r?   rS   Enumr[   r^   r   ABCMetar`   registerrg   r   r   Zload_pem_x509_certificateZload_der_x509_certificateZload_pem_x509_certificatesZload_pem_x509_csrZload_der_x509_csrZload_pem_x509_crlZload_der_x509_crlrr   r   r   r   r   r%   r%   r%   r&   <module>   sn   (


$ "p   I