U
    ˆjŽe  ã                	   @  s  d dl m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 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 Z-G dd„ de.ƒZ/ddddœdd„Z0ddddœdd„Z1dddœdd„Z2G dd „ d ƒZ3G d!d"„ d"ƒZ4G d#d$„ d$ej5ƒZ6G d%d&„ d&e.ƒZ7ej8Z8ej9Z9ej:Z:ej;Z;ej<Z<ej=Z=ej>Z>ej?Z?ej@Z@ejAZAejBZBG d'd(„ d(ƒZCG d)d*„ d*ƒZDG d+d,„ d,ƒZEG d-d.„ d.ƒZFd/d0œd1d2„ZGdS )3é    )ÚannotationsN)ÚIterable)Úutils)Úx509)Úhashes)ÚdsaÚecÚed448Úed25519ÚpaddingÚrsaÚx448Úx25519)Ú CertificateIssuerPrivateKeyTypesÚCertificatePublicKeyTypes)Ú	ExtensionÚ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__© ú:/tmp/pip-unpacked-wheel-cr19813o/cryptography/x509/base.pyr    6   s    zAttributeNotFound.__init__©Ú__name__Ú
__module__Ú__qualname__r    Ú__classcell__r$   r$   r"   r%   r   5   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    r0   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   r2   Zattr_oidÚ_r$   r$   r%   Ú_reject_duplicate_attributeE   s    r4   údatetime.datetime©Útimer   c                 C  s:   | j dk	r2|  ¡ }|r|nt ¡ }| jdd�| S | S dS )z’Normalizes a datetime to a naive datetime in UTC.

    time -- datetime to normalize. Assumed to be in UTC if not timezone
            aware.
    N)Útzinfo)r8   Ú	utcoffsetÚdatetimeÚ	timedeltaÚreplace)r7   Úoffsetr$   r$   r%   Ú_convert_to_naive_utc_timeO   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    ^   s    zAttribute.__init__©r   c                 C  s   | j S r   )rD   ©r!   r$   r$   r%   r   h   s    zAttribute.oidc                 C  s   | j S r   )rE   rG   r$   r$   r%   rB   l   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__p   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__s   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   )r2   r   c                 C  s   t |ƒ| _d S r   )ÚlistÚ_attributes)r!   r2   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                	   @  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+   r1   )Úsubject_namer-   r2   c                 C  s   || _ || _|| _dS )zB
        Creates an empty X.509 certificate request (v1).
        N)Ú_subject_nameÚ_extensionsrU   )r!   rb   r-   r2   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   Ú	TypeErrorrc   r.   r`   rd   rU   ©r!   rf   r$   r$   r%   rb   Â   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   ri   r   r   r0   rd   r`   rc   rU   ©r!   rl   rm   r,   r$   r$   r%   Úadd_extensionÎ   s    

ýz.CertificateSigningRequestBuilder.add_extension)Ú_tagr   r@   z_ASN1Type | None)r   rB   rq   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   ri   r@   r   r4   rU   rB   r`   rc   rd   )r!   r   rB   rq   Ú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Úbackendru   rv   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 keysú1Deterministic ECDSA is only supported for EC keys)rc   r.   rM   r   ÚPSSÚPKCS1v15ri   r   ÚRSAPrivateKeyr   ÚEllipticCurvePrivateKeyÚ	rust_x509Zcreate_x509_csr©r!   r}   r~   r   ru   rv   r$   r$   r%   Úsign   s&    
ÿûz%CertificateSigningRequestBuilder.sign)N)r'   r(   r)   r    rb   rp   rs   r‰   r$   r$   r$   r%   r`   ´   s   üû$ üùr`   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+   rd   Nra   z CertificatePublicKeyTypes | Noneú
int | Noneúdatetime.datetime | Noner   )Úissuer_namerb   Ú
public_keyÚserial_numberÚnot_valid_beforeÚnot_valid_afterr-   r   c                 C  s6   t j| _|| _|| _|| _|| _|| _|| _|| _	d S r   )
r[   r]   Ú_versionÚ_issuer_namerc   Ú_public_keyÚ_serial_numberÚ_not_valid_beforeÚ_not_valid_afterrd   )r!   r�   rb   rŽ   r�   r�   r‘   r-   r$   r$   r%   r    '  s    
zCertificateBuilder.__init__r   re   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.
        rg   Nú%The issuer name may only be set once.)rM   r   ri   r“   r.   rŠ   rc   r”   r•   r–   r—   rd   rj   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.
        rg   Nrh   )rM   r   ri   rc   r.   rŠ   r“   r”   r•   r–   r—   rd   rj   r$   r$   r%   rb   L  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).
        z‰Expecting 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X448PublicKeyri   r”   r.   rŠ   r“   rc   r•   r–   r—   rd   )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   ri   r•   r.   Ú
bit_lengthrŠ   r“   rc   r”   r–   r—   rd   ©r!   r›   r$   r$   r%   r�   ƒ  s&    

ÿùz CertificateBuilder.serial_numberr5   r6   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:   ri   r–   r.   r>   Ú_EARLIEST_UTC_TIMEr—   rŠ   r“   rc   r”   r•   rd   ©r!   r7   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:   ri   r—   r.   r>   r£   r–   rŠ   r“   rc   r”   r•   rd   r¤   r$   r$   r%   r‘   »  s2    
ÿÿþÿùz"CertificateBuilder.not_valid_afterr   rK   rk   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.
        rn   )rM   r   ri   r   r   r0   rd   rŠ   r“   rc   r”   r•   r–   r—   ro   r$   r$   r%   rp   Ú  s    

ùz CertificateBuilder.add_extensionrt   r   rw   rx   ry   rz   Ú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	r¢t|tj	tj
fƒsŽtdƒ‚t|tjƒs¢td	ƒ‚|dk	r¾t|tjƒs¾t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‚   )rc   r.   r“   r•   r–   r—   r”   rM   r   rƒ   r„   ri   r   r…   r   r†   r‡   Zcreate_x509_certificaterˆ   r$   r$   r%   r‰   ð  s:    





ÿûzCertificateBuilder.sign)N)r'   r(   r)   Ú__annotations__r    r�   rb   rŽ   r�   r�   r‘   rp   r‰   r$   r$   r$   r%   rŠ   $  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+   rd   zlist[RevokedCertificate]Ú_revoked_certificatesNra   rŒ   )r�   Úlast_updateÚnext_updater-   Úrevoked_certificatesc                 C  s"   || _ || _|| _|| _|| _d S r   )r“   Ú_last_updateÚ_next_updaterd   r¨   )r!   r�   r©   rª   r-   r«   r$   r$   r%   r    '  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 )Nrg   r˜   )
rM   r   ri   r“   r.   r§   r¬   r­   rd   r¨   )r!   r�   r$   r$   r%   r�   5  s    

ûz,CertificateRevocationListBuilder.issuer_namer5   )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:   ri   r¬   r.   r>   r£   r­   r§   r“   rd   r¨   )r!   r©   r$   r$   r%   r©   D  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:   ri   r­   r.   r>   r£   r¬   r§   r“   rd   r¨   )r!   rª   r$   r$   r%   rª   \  s(    
ÿÿûz,CertificateRevocationListBuilder.next_updater   rK   rk   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.
        rn   )rM   r   ri   r   r   r0   rd   r§   r“   r¬   r­   r¨   ro   r$   r$   r%   rp   t  s    

ûz.CertificateRevocationListBuilder.add_extensionÚRevokedCertificate)Ú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°   ri   r§   r“   r¬   r­   rd   r¨   )r!   r±   r$   r$   r%   Úadd_revoked_certificate‡  s    

ûz8CertificateRevocationListBuilder.add_revoked_certificatert   r   rw   rx   ry   rz   Ú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	rˆt|tjƒsˆt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„   ri   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ª   rp   r²   r‰   r$   r$   r$   r%   r§   #  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+   )r�   Úrevocation_dater-   c                 C  s   || _ || _|| _d S r   )r•   Ú_revocation_daterd   )r!   r�   rµ   r-   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   ri   r•   r.   r    r´   r¶   rd   r¡   r$   r$   r%   r�   Ê  s    

ÿ  ÿz'RevokedCertificateBuilder.serial_numberr5   r6   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:   ri   r¶   r.   r>   r£   r´   r•   rd   r¤   r$   r$   r%   rµ   Ü  s    
ÿ  ÿz)RevokedCertificateBuilder.revocation_dater   rK   rk   c                 C  sD   t |tƒstdƒ‚t|j||ƒ}t|| jƒ t| j| j	| j|f•ƒS )Nrn   )
rM   r   ri   r   r   r0   rd   r´   r•   r¶   ro   r$   r$   r%   rp   ì  s    

ýz'RevokedCertificateBuilder.add_extensionrx   r°   )r   r   c                 C  s.   | j d krtdƒ‚| jd kr$tdƒ‚t | ¡S )Nz/A revoked certificate must have a serial numberz1A revoked certificate must have a revocation date)r•   r.   r¶   r‡   Zcreate_revoked_certificate)r!   r   r$   r$   r%   Úbuildú  s    

ÿzRevokedCertificateBuilder.build)N)r'   r(   r)   r    r�   rµ   rp   r·   r$   r$   r$   r%   r´   ¿  s   ü
r´   rA   rF   c                   C  s   t  t d¡d¡d? S )Né   Úbigr   )rA   Ú
from_bytesÚosÚurandomr$   r$   r$   r%   Úrandom_serial_number  s    r½   )HÚ
__future__r   r:   r»   ÚtypingÚ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   Zcryptography.x509.namer   r   Zcryptography.x509.oidr   r£   ÚUnionÚSHA224ÚSHA256ÚSHA384ÚSHA512ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512Z_AllowedHashTypesÚ	Exceptionr   r0   r4   r>   r?   rS   ÚEnumr[   r^   r¥   r°   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_crlr`   rŠ   r§   r´   r½   r$   r$   r$   r%   Ú<module>   sf   (
ùÿ

$p   E