o
    ge0n                     @   sJ  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mZ d dl	m
Z
 d dlmZmZ d dlmZmZmZmZmZ d dlmZmZmZ d dlmZ d d	lmZ ed
ddZG dd deZdedeje fddZ dedejej!ee"f  fddZ#dejdejfddZ$G dd dej%Z&G dd deZ'G dd de j(d Z)G d!d" d"e j(d Z*G d#d$ d$e j(d Z+G d%d& d&e j(d Z,d>d'e"de)fd(d)Z-d>d'e"de)fd*d+Z.d>d'e"de,fd,d-Z/d>d'e"de,fd.d/Z0d>d'e"de+fd0d1Z1d>d'e"de+fd2d3Z2G d4d5 d5e3Z4G d6d7 d7e3Z5G d8d9 d9e3Z6G d:d; d;e3Z7de8fd<d=Z9dS )?    N)utils)_PRIVATE_KEY_TYPES_PUBLIC_KEY_TYPES)_get_backend)hashesserialization)dsaeced25519ed448rsa)	ExtensionExtensionType
Extensions)Name)ObjectIdentifieri     c                          e Zd Z fddZ  ZS )AttributeNotFoundc                       t t| | || _d S N)superr   __init__oid)selfmsgr   	__class__ 8/usr/lib/python3/dist-packages/cryptography/x509/base.pyr         
zAttributeNotFound.__init____name__
__module____qualname__r   __classcell__r   r   r   r   r          r   	extension
extensionsc                 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
   r+   r   
attributesc                 C   s"   |D ]\}}|| krt dqd S )Nz$This attribute has already been set.)r)   )r   r,   attr_oid_r   r   r   _reject_duplicate_attribute-   s
   r/   timereturnc                 C   s6   | j dur|  }|r|nt }| jdd| S | 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)r2   	utcoffsetdatetime	timedeltareplace)r0   offsetr   r   r   _convert_to_naive_utc_time7   s
   
r8   c                   @   s   e Zd ZdZdZdS )Versionr      N)r"   r#   r$   v1v3r   r   r   r   r9   E   s    r9   c                       r   )InvalidVersionc                    r   r   )r   r=   r   parsed_version)r   r   r>   r   r   r   r   K   r    zInvalidVersion.__init__r!   r   r   r   r   r=   J   r&   r=   c                   @   s  e Zd ZejdejdefddZej	de
fddZej	defddZejdefd	d
Zej	dejfddZej	dejfddZej	defddZej	defddZej	dejej fddZej	defddZej	defddZej	defddZej	defddZejdede fddZ!ejdede fd d!Z"ejde
fd"d#Z#ejd$e$j%defd%d&Z&d'S )(Certificate	algorithmr1   c                 C      dS z4
        Returns bytes using digest passed.
        Nr   r   r@   r   r   r   fingerprintQ       zCertificate.fingerprintc                 C   rA   )z3
        Returns certificate serial number
        Nr   r   r   r   r   serial_numberW   rE   zCertificate.serial_numberc                 C   rA   )z1
        Returns the certificate version
        Nr   rF   r   r   r   version]   rE   zCertificate.versionc                 C   rA   z(
        Returns the public key
        Nr   rF   r   r   r   
public_keyc   rE   zCertificate.public_keyc                 C   rA   )z?
        Not before time (represented as UTC datetime)
        Nr   rF   r   r   r   not_valid_beforei   rE   zCertificate.not_valid_beforec                 C   rA   )z>
        Not after time (represented as UTC datetime)
        Nr   rF   r   r   r   not_valid_aftero   rE   zCertificate.not_valid_afterc                 C   rA   )z1
        Returns the issuer name object.
        Nr   rF   r   r   r   issueru   rE   zCertificate.issuerc                 C   rA   z2
        Returns the subject name object.
        Nr   rF   r   r   r   subject{   rE   zCertificate.subjectc                 C   rA   zt
        Returns a HashAlgorithm corresponding to the type of the digest signed
        in the certificate.
        Nr   rF   r   r   r   signature_hash_algorithm   rE   z$Certificate.signature_hash_algorithmc                 C   rA   zJ
        Returns the ObjectIdentifier of the signature algorithm.
        Nr   rF   r   r   r   signature_algorithm_oid   rE   z#Certificate.signature_algorithm_oidc                 C   rA   )z/
        Returns an Extensions object.
        Nr   rF   r   r   r   r(      rE   zCertificate.extensionsc                 C   rA   z.
        Returns the signature bytes.
        Nr   rF   r   r   r   	signature   rE   zCertificate.signaturec                 C   rA   )zR
        Returns the tbsCertificate payload bytes as defined in RFC 5280.
        Nr   rF   r   r   r   tbs_certificate_bytes   rE   z!Certificate.tbs_certificate_bytesotherc                 C   rA   z"
        Checks equality.
        Nr   r   rW   r   r   r   __eq__   rE   zCertificate.__eq__c                 C   rA   z#
        Checks not equal.
        Nr   rY   r   r   r   __ne__   rE   zCertificate.__ne__c                 C   rA   z"
        Computes a hash.
        Nr   rF   r   r   r   __hash__   rE   zCertificate.__hash__encodingc                 C   rA   )zB
        Serializes the certificate to PEM or DER format.
        Nr   r   r_   r   r   r   public_bytes   rE   zCertificate.public_bytesN)'r"   r#   r$   abcabstractmethodr   HashAlgorithmbytesrD   abstractpropertyintrG   r9   rH   r   rJ   r4   rK   rL   r   rM   rO   typingOptionalrQ   r   rS   r   r(   rU   rV   objectboolrZ   r\   r^   r   Encodingra   r   r   r   r   r?   P   sJ    
r?   )	metaclassc                   @   sJ   e Zd ZejdefddZejdejfddZejde	fddZ
dS )	RevokedCertificater1   c                 C   rA   )zG
        Returns the serial number of the revoked certificate.
        Nr   rF   r   r   r   rG      rE   z RevokedCertificate.serial_numberc                 C   rA   )zH
        Returns the date of when this certificate was revoked.
        Nr   rF   r   r   r   revocation_date   rE   z"RevokedCertificate.revocation_datec                 C   rA   )zW
        Returns an Extensions object containing a list of Revoked extensions.
        Nr   rF   r   r   r   r(      rE   zRevokedCertificate.extensionsN)r"   r#   r$   rb   rf   rg   rG   r4   ro   r   r(   r   r   r   r   rn      s    rn   c                   @   s|  e Zd ZejdejdefddZejde	j
defddZejdedeje fd	d
Zejde	j
fddZejdefddZejdefddZejdejfddZejdejfddZejdefddZejdefddZejdefddZejdedefddZ ejdedefddZ!ejdefd d!Z"ejd"d# Z#ejd$d% Z$ejd&e%defd'd(Z&d)S )*CertificateRevocationListr_   r1   c                 C   rA   )z:
        Serializes the CRL to PEM or DER format.
        Nr   r`   r   r   r   ra      rE   z&CertificateRevocationList.public_bytesr@   c                 C   rA   rB   r   rC   r   r   r   rD      rE   z%CertificateRevocationList.fingerprintrG   c                 C   rA   )zs
        Returns an instance of RevokedCertificate or None if the serial_number
        is not in the CRL.
        Nr   )r   rG   r   r   r   (get_revoked_certificate_by_serial_number   rE   zBCertificateRevocationList.get_revoked_certificate_by_serial_numberc                 C   rA   rP   r   rF   r   r   r   rQ      rE   z2CertificateRevocationList.signature_hash_algorithmc                 C   rA   rR   r   rF   r   r   r   rS      rE   z1CertificateRevocationList.signature_algorithm_oidc                 C   rA   )zC
        Returns the X509Name with the issuer of this CRL.
        Nr   rF   r   r   r   rM      rE   z CertificateRevocationList.issuerc                 C   rA   )z?
        Returns the date of next update for this CRL.
        Nr   rF   r   r   r   next_update   rE   z%CertificateRevocationList.next_updatec                 C   rA   )z?
        Returns the date of last update for this CRL.
        Nr   rF   r   r   r   last_update   rE   z%CertificateRevocationList.last_updatec                 C   rA   )zS
        Returns an Extensions object containing a list of CRL extensions.
        Nr   rF   r   r   r   r(     rE   z$CertificateRevocationList.extensionsc                 C   rA   rT   r   rF   r   r   r   rU   
  rE   z#CertificateRevocationList.signaturec                 C   rA   )zO
        Returns the tbsCertList payload bytes as defined in RFC 5280.
        Nr   rF   r   r   r   tbs_certlist_bytes  rE   z,CertificateRevocationList.tbs_certlist_bytesrW   c                 C   rA   rX   r   rY   r   r   r   rZ     rE   z CertificateRevocationList.__eq__c                 C   rA   r[   r   rY   r   r   r   r\     rE   z CertificateRevocationList.__ne__c                 C   rA   )z<
        Number of revoked certificates in the CRL.
        Nr   rF   r   r   r   __len__"  rE   z!CertificateRevocationList.__len__c                 C   rA   )zS
        Returns a revoked certificate (or slice of revoked certificates).
        Nr   )r   idxr   r   r   __getitem__(  rE   z%CertificateRevocationList.__getitem__c                 C   rA   )z8
        Iterator over the revoked certificates
        Nr   rF   r   r   r   __iter__.  rE   z"CertificateRevocationList.__iter__rJ   c                 C   rA   )zQ
        Verifies signature of revocation list against given public key.
        Nr   )r   rJ   r   r   r   is_signature_valid4  rE   z,CertificateRevocationList.is_signature_validN)'r"   r#   r$   rb   rc   r   rl   re   ra   r   rd   rD   rg   rh   ri   rn   rq   rf   rQ   r   rS   r   rM   r4   rr   rs   r   r(   rU   rt   rj   rk   rZ   r\   ru   rw   rx   r   ry   r   r   r   r   rp      sN    

rp   c                   @   s$  e Zd ZejdedefddZejdedefddZejde	fddZ
ejdefd	d
ZejdefddZejdejfddZejdefddZejdefddZejdejdefddZejdefddZejdefddZejdefddZejdedefddZdS ) CertificateSigningRequestrW   r1   c                 C   rA   rX   r   rY   r   r   r   rZ   <  rE   z CertificateSigningRequest.__eq__c                 C   rA   r[   r   rY   r   r   r   r\   B  rE   z CertificateSigningRequest.__ne__c                 C   rA   r]   r   rF   r   r   r   r^   H  rE   z"CertificateSigningRequest.__hash__c                 C   rA   rI   r   rF   r   r   r   rJ   N  rE   z$CertificateSigningRequest.public_keyc                 C   rA   rN   r   rF   r   r   r   rO   T  rE   z!CertificateSigningRequest.subjectc                 C   rA   rP   r   rF   r   r   r   rQ   Z  rE   z2CertificateSigningRequest.signature_hash_algorithmc                 C   rA   rR   r   rF   r   r   r   rS   a  rE   z1CertificateSigningRequest.signature_algorithm_oidc                 C   rA   )z@
        Returns the extensions in the signing request.
        Nr   rF   r   r   r   r(   g  rE   z$CertificateSigningRequest.extensionsr_   c                 C   rA   )z;
        Encodes the request to PEM or DER format.
        Nr   r`   r   r   r   ra   m  rE   z&CertificateSigningRequest.public_bytesc                 C   rA   rT   r   rF   r   r   r   rU   s  rE   z#CertificateSigningRequest.signaturec                 C   rA   )zd
        Returns the PKCS#10 CertificationRequestInfo bytes as defined in RFC
        2986.
        Nr   rF   r   r   r   tbs_certrequest_bytesy  rE   z/CertificateSigningRequest.tbs_certrequest_bytesc                 C   rA   )z8
        Verifies signature of signing request.
        Nr   rF   r   r   r   ry     rE   z,CertificateSigningRequest.is_signature_validr   c                 C   rA   )z:
        Get the attribute value for a given OID.
        Nr   )r   r   r   r   r   get_attribute_for_oid  rE   z/CertificateSigningRequest.get_attribute_for_oidN)r"   r#   r$   rb   rc   rj   rk   rZ   r\   rg   r^   r   rJ   rf   r   rO   r   rd   rQ   r   rS   r   r(   r   rl   re   ra   rU   r{   ry   r|   r   r   r   r   rz   ;  s6    rz   datac                 C      t |}|| S r   )r   load_pem_x509_certificater}   backendr   r   r   r        
r   c                 C   r~   r   )r   load_der_x509_certificater   r   r   r   r     r   r   c                 C   r~   r   )r   load_pem_x509_csrr   r   r   r   r     r   r   c                 C   r~   r   )r   load_der_x509_csrr   r   r   r   r     r   r   c                 C   r~   r   )r   load_pem_x509_crlr   r   r   r   r     r   r   c                 C   r~   r   )r   load_der_x509_crlr   r   r   r   r     r   r   c                   @   sj   e Zd Zdg g fddZdefddZdedefd	d
Zde	de
fddZ	ddedejdefddZdS ) CertificateSigningRequestBuilderNc                 C   s   || _ || _|| _dS )zB
        Creates an empty X.509 certificate request (v1).
        N)_subject_name_extensions_attributes)r   subject_namer(   r,   r   r   r   r     s   
z)CertificateSigningRequestBuilder.__init__namec                 C   s4   t |ts	td| jdu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.)
isinstancer   	TypeErrorr   r)   r   r   r   r   r   r   r   r   r     s   


z-CertificateSigningRequestBuilder.subject_nameextvalcriticalc                 C   sD   t |ts	tdt|j||}t|| j t| j| j|g | j	S )zE
        Adds an X.509 extension to the certificate request.
        "extension must be an ExtensionType)
r   r   r   r   r   r+   r   r   r   r   r   r   r   r'   r   r   r   add_extension  s   

z.CertificateSigningRequestBuilder.add_extensionr   valuec                 C   sL   t |ts	tdt |tstdt|| j t| j| j| j||fg S )zK
        Adds an X.509 attribute with an OID and associated value.
        zoid must be an ObjectIdentifierzvalue must be bytes)	r   r   r   re   r/   r   r   r   r   )r   r   r   r   r   r   add_attribute  s   

z.CertificateSigningRequestBuilder.add_attributeprivate_keyr@   r1   c                 C   s(   t |}| jdu rtd|| ||S )zF
        Signs the request using the requestor's private key.
        Nz/A CertificateSigningRequest must have a subject)r   r   r)   create_x509_csrr   r   r@   r   r   r   r   sign  s   	
z%CertificateSigningRequestBuilder.signr   )r"   r#   r$   r   r   r   r   rk   r   r   re   r   r   r   rd   rz   r   r   r   r   r   r     s    r   c                   @   s   e Zd Zddddddg fddZdefddZdefddZd	efd
dZde	fddZ
dejfddZdejfddZdedefddZ	ddedejdefddZdS )CertificateBuilderNc                 C   s6   t j| _|| _|| _|| _|| _|| _|| _|| _	d S r   )
r9   r<   _version_issuer_namer   _public_key_serial_number_not_valid_before_not_valid_afterr   )r   issuer_namer   rJ   rG   rK   rL   r(   r   r   r   r     s   

zCertificateBuilder.__init__r   c                 C   sD   t |ts	td| jdurtdt|| j| j| j| j	| j
| jS )z3
        Sets the CA's distinguished name.
        r   N%The issuer name may only be set once.)r   r   r   r   r)   r   r   r   r   r   r   r   r   r   r   r   r     s   

zCertificateBuilder.issuer_namec                 C   sD   t |ts	td| jdurtdt| j|| j| j| j	| j
| jS )z:
        Sets the requestor's distinguished name.
        r   Nr   )r   r   r   r   r)   r   r   r   r   r   r   r   r   r   r   r   r     s   

zCertificateBuilder.subject_namekeyc                 C   sX   t |tjtjtjtjt	j
fstd| jdurt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   DSAPublicKeyr   RSAPublicKeyr	   EllipticCurvePublicKeyr
   Ed25519PublicKeyr   Ed448PublicKeyr   r   r)   r   r   r   r   r   r   r   )r   r   r   r   r   rJ   )  s.   

zCertificateBuilder.public_keynumberc                 C   sh   t |ts	td| jdurtd|dkrtd| dkr$t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.)r   rg   r   r   r)   
bit_lengthr   r   r   r   r   r   r   r   r   r   r   r   rG   K  s&   

z CertificateBuilder.serial_numberr0   c                 C   sz   t |tjs
td| jdurtdt|}|tk rtd| jdur-|| jkr-t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.)r   r4   r   r   r)   r8   _EARLIEST_UTC_TIMEr   r   r   r   r   r   r   r   r0   r   r   r   rK   f  s,   
z#CertificateBuilder.not_valid_beforec                 C   sz   t |tjs
td| jdurtdt|}|tk rtd| jdur-|| jk r-t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.)r   r4   r   r   r)   r8   r   r   r   r   r   r   r   r   r   r   r   r   rL     s.   


z"CertificateBuilder.not_valid_afterr   r   c              	   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.
        r   )r   r   r   r   r   r+   r   r   r   r   r   r   r   r   r   r   r   r   r     s   

z CertificateBuilder.add_extensionr   r@   r1   c                 C   s   t |}| jdu rtd| jdu rtd| jdu rtd| jdu r(td| jdu r1td| jdu r:td|| ||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   r)   r   r   r   r   r   create_x509_certificater   r   r   r   r     s   	





zCertificateBuilder.signr   )r"   r#   r$   r   r   r   r   r   rJ   rg   rG   r4   rK   rL   r   rk   r   r   r   rd   r?   r   r   r   r   r   r     s4    

" r   c                   @   s   e Zd Zdddg g fddZdefddZdejfdd	Zd
ejfddZde	de
fddZdefddZ	ddedejdefddZdS ) CertificateRevocationListBuilderNc                 C   s"   || _ || _|| _|| _|| _d S r   )r   _last_update_next_updater   _revoked_certificates)r   r   rs   rr   r(   revoked_certificatesr   r   r   r     s
   
z)CertificateRevocationListBuilder.__init__r   c                 C   s<   t |ts	td| jd urtdt|| j| j| j| j	S )Nr   r   )
r   r   r   r   r)   r   r   r   r   r   )r   r   r   r   r   r     s   

z,CertificateRevocationListBuilder.issuer_namers   c                 C   sr   t |tjs
td| jd urtdt|}|tk rtd| jd ur-|| jkr-t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.)r   r4   r   r   r)   r8   r   r   r   r   r   r   )r   rs   r   r   r   rs     s(   
z,CertificateRevocationListBuilder.last_updaterr   c                 C   sr   t |tjs
td| jd urtdt|}|tk rtd| jd ur-|| jk r-tdt| j	| j|| j
| jS )Nr   r   r   z8The next update date must be after the last update date.)r   r4   r   r   r)   r8   r   r   r   r   r   r   )r   rr   r   r   r   rr     s(   
z,CertificateRevocationListBuilder.next_updater   r   c                 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.
        r   )r   r   r   r   r   r+   r   r   r   r   r   r   r   r   r   r   r     s   

z.CertificateRevocationListBuilder.add_extensionrevoked_certificatec                 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   rn   r   r   r   r   r   r   r   )r   r   r   r   r   add_revoked_certificate/  s   

z8CertificateRevocationListBuilder.add_revoked_certificater   r@   r1   c                 C   sL   t |}| jd u rtd| jd u rtd| jd u rtd|| ||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)r   r   r)   r   r   create_x509_crlr   r   r   r   r   >  s   


z%CertificateRevocationListBuilder.signr   )r"   r#   r$   r   r   r   r4   rs   rr   r   rk   r   rn   r   r   r   rd   rp   r   r   r   r   r   r     s(    
r   c                   @   s\   e Zd Zddg fddZdefddZdejfdd	Zd
ede	fddZ
ddefddZdS )RevokedCertificateBuilderNc                 C   s   || _ || _|| _d S r   )r   _revocation_dater   )r   rG   ro   r(   r   r   r   r   R  s   
z"RevokedCertificateBuilder.__init__r   c                 C   sX   t |ts	td| jd urtd|dkrtd| dkr$tdt|| j| jS )Nr   r   r   z$The serial number should be positiver   r   )	r   rg   r   r   r)   r   r   r   r   r   r   r   r   rG   Y  s   


z'RevokedCertificateBuilder.serial_numberr0   c                 C   sN   t |tjs
td| jd u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.)
r   r4   r   r   r)   r8   r   r   r   r   r   r   r   r   ro   k  s   

z)RevokedCertificateBuilder.revocation_dater   r   c                 C   sD   t |ts	tdt|j||}t|| j t| j| j	| j|g S )Nr   )
r   r   r   r   r   r+   r   r   r   r   r   r   r   r   r   y  s   

z'RevokedCertificateBuilder.add_extensionr1   c                 C   s6   t |}| jd u rtd| jd u rtd|| S )Nz/A revoked certificate must have a serial numberz1A revoked certificate must have a revocation date)r   r   r)   r   create_x509_revoked_certificate)r   r   r   r   r   build  s   


zRevokedCertificateBuilder.buildr   )r"   r#   r$   r   rg   rG   r4   ro   r   rk   r   rn   r   r   r   r   r   r   Q  s    
r   c                   C   s   t tddd? S )N   bigr   )rg   
from_bytesosurandomr   r   r   r   random_serial_number  s   r   r   ):rb   r4   r   rh   cryptographyr   cryptography.hazmat._typesr   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r	   r
   r   r   cryptography.x509.extensionsr   r   r   cryptography.x509.namer   cryptography.x509.oidr   r   	Exceptionr   Listr+   Tuplere   r/   r8   Enumr9   r=   ABCMetar?   rn   rp   rz   r   r   r   r   r   r   rj   r   r   r   r   rg   r   r   r   r   r   <module>   sV   
	

klRF f{@