U
    *”}ftT  ã                   @   s.  d dl mZmZmZ d dlZd dlZd dlmZm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mZ d dlmZmZmZ d d	lmZ e ej¡G d
d„ deƒƒZ e ej!¡G dd„ deƒƒZ"e ej#¡G dd„ deƒƒZ$e ej%¡G dd„ deƒƒZ&e ej'j(¡G dd„ deƒƒZ)dS )é    )Úabsolute_importÚdivisionÚprint_functionN)ÚutilsÚx509)ÚUnsupportedAlgorithm)Ú_asn1_integer_to_intÚ_asn1_string_to_bytesÚ_decode_x509_nameÚ_obj2txtÚ_parse_asn1_time)Ú_encode_asn1_int_gcÚ_txt2obj_gc)ÚhashesÚserialization)ÚdsaÚecÚrsa)Ú	_ASN1Typec                   @   sØ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
 d¡Zed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
jd d!„ ƒZed"d#„ ƒZed$d%„ ƒZd&d'„ Zd(S ))Ú_Certificatec                 C   sZ   || _ || _| j j | j¡}|dkr0tjj| _n&|dkrDtjj| _nt 	d 
|¡|¡‚d S )Nr   é   z{} is not a valid X509 version)Ú_backendÚ_x509Ú_libZX509_get_versionr   ÚVersionÚv1Ú_versionZv3ÚInvalidVersionÚformat)ÚselfÚbackendZ	x509_certÚversion© r"   úM/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/backends/openssl/x509.pyÚ__init__   s     ÿz_Certificate.__init__c                 C   s   d  | j¡S )Nz<Certificate(subject={}, ...)>)r   Úsubject©r   r"   r"   r#   Ú__repr__,   s    z_Certificate.__repr__c                 C   s,   t |tjƒstS | jj | j|j¡}|dkS ©Nr   )Ú
isinstancer   ÚCertificateÚNotImplementedr   r   ZX509_cmpr   ©r   ÚotherÚresr"   r"   r#   Ú__eq__/   s    z_Certificate.__eq__c                 C   s
   | |k S ©Nr"   ©r   r-   r"   r"   r#   Ú__ne__6   s    z_Certificate.__ne__c                 C   s   t |  tjj¡ƒS r0   ©ÚhashÚpublic_bytesr   ÚEncodingÚDERr&   r"   r"   r#   Ú__hash__9   s    z_Certificate.__hash__c                 C   s   | S r0   r"   )r   Úmemor"   r"   r#   Ú__deepcopy__<   s    z_Certificate.__deepcopy__c                 C   s*   t  || j¡}| |  tjj¡¡ | ¡ S r0   )	r   ÚHashr   Úupdater5   r   r6   r7   Úfinalize)r   Ú	algorithmÚhr"   r"   r#   Úfingerprint?   s    z_Certificate.fingerprintr   c                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_get_serialNumberr   Úopenssl_assertÚ_ffiÚNULLr   ©r   Úasn1_intr"   r"   r#   Úserial_numberF   s    z_Certificate.serial_numberc                 C   sR   | j j | j¡}|| j jjkr0| j  ¡  tdƒ‚| j j || j jj	¡}| j  
|¡S )Nz,Certificate public key is of an unknown type)r   r   ZX509_get_pubkeyr   rB   rC   Ú_consume_errorsÚ
ValueErrorÚgcÚEVP_PKEY_freeÚ_evp_pkey_to_public_key©r   Úpkeyr"   r"   r#   Ú
public_keyL   s    
z_Certificate.public_keyc                 C   s   | j j | j¡}t| j |ƒS r0   )r   r   ZX509_getm_notBeforer   r   ©r   Z	asn1_timer"   r"   r#   Únot_valid_beforeW   s    z_Certificate.not_valid_beforec                 C   s   | j j | j¡}t| j |ƒS r0   )r   r   ZX509_getm_notAfterr   r   rO   r"   r"   r#   Únot_valid_after\   s    z_Certificate.not_valid_afterc                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_get_issuer_namer   rA   rB   rC   r
   ©r   Úissuerr"   r"   r#   rS   a   s    z_Certificate.issuerc                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_get_subject_namer   rA   rB   rC   r
   ©r   r%   r"   r"   r#   r%   g   s    z_Certificate.subjectc                 C   s:   | j }ztj| W S  tk
r4   td |¡ƒ‚Y nX d S ©Nz)Signature algorithm OID:{} not recognized©Úsignature_algorithm_oidr   Z_SIG_OIDS_TO_HASHÚKeyErrorr   r   ©r   Úoidr"   r"   r#   Úsignature_hash_algorithmm   s    ÿz%_Certificate.signature_hash_algorithmc                 C   s^   | j j d¡}| j j | j jj|| j¡ | j  |d | j jjk¡ t| j |d j	ƒ}t
 |¡S ©NzX509_ALGOR **r   )r   rB   Únewr   ÚX509_get0_signaturerC   r   rA   r   r>   r   ÚObjectIdentifier©r   ZalgrZ   r"   r"   r#   rW   w   s      ÿz$_Certificate.signature_algorithm_oidc                 C   s   | j j | j¡S r0   )r   Z_certificate_extension_parserÚparser   r&   r"   r"   r#   Ú
extensions   s    z_Certificate.extensionsc                 C   sR   | j j d¡}| j j || j jj| j¡ | j  |d | j jjk¡ t| j |d ƒS ©NzASN1_BIT_STRING **r   )	r   rB   r]   r   r^   rC   r   rA   r	   ©r   Úsigr"   r"   r#   Ú	signature…   s      ÿz_Certificate.signaturec                    sd   ˆ j j d¡}ˆ j j ˆ j|¡}ˆ j  |dk¡ ˆ j j |‡ fdd„¡}ˆ j j |d |¡d d … S )Núunsigned char **r   c                    s   ˆ j j | d ¡S r(   ©r   r   ZOPENSSL_free©Úpointerr&   r"   r#   Ú<lambda>”   ó    z4_Certificate.tbs_certificate_bytes.<locals>.<lambda>)	r   rB   r]   r   Zi2d_re_X509_tbsr   rA   rI   Úbuffer©r   Úppr.   r"   r&   r#   Útbs_certificate_bytesŽ   s     
ÿz"_Certificate.tbs_certificate_bytesc                 C   sn   | j  ¡ }|tjjkr*| j j || j¡}n(|tjjkrJ| j j 	|| j¡}nt
dƒ‚| j  |dk¡ | j  |¡S ©Nz/encoding must be an item from the Encoding enumé   )r   Ú_create_mem_bio_gcr   r6   ÚPEMr   ZPEM_write_bio_X509r   r7   Zi2d_X509_bioÚ	TypeErrorrA   Ú_read_mem_bio©r   ÚencodingÚbior.   r"   r"   r#   r5   ˜   s    
z_Certificate.public_bytesN)Ú__name__Ú
__module__Ú__qualname__r$   r'   r/   r2   r8   r:   r@   r   Zread_only_propertyr!   ÚpropertyrF   rN   rP   rQ   rS   r%   r[   rW   Úcached_propertyrb   rf   rp   r5   r"   r"   r"   r#   r      s<   






	
	


	r   c                   @   s:   e Zd Zdd„ Zedd„ ƒZedd„ ƒZejdd„ ƒZ	d	S )
Ú_RevokedCertificatec                 C   s   || _ || _|| _d S r0   )r   Z_crlÚ_x509_revoked)r   r    ZcrlZx509_revokedr"   r"   r#   r$   §   s    z_RevokedCertificate.__init__c                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_REVOKED_get0_serialNumberr€   rA   rB   rC   r   rD   r"   r"   r#   rF   ³   s
    ÿz!_RevokedCertificate.serial_numberc                 C   s   t | j| jj | j¡ƒS r0   )r   r   r   Z X509_REVOKED_get0_revocationDater€   r&   r"   r"   r#   Úrevocation_date»   s    ÿþz#_RevokedCertificate.revocation_datec                 C   s   | j j | j¡S r0   )r   Z_revoked_cert_extension_parserra   r€   r&   r"   r"   r#   rb   Ä   s    ÿz_RevokedCertificate.extensionsN)
rz   r{   r|   r$   r}   rF   r   r   r~   rb   r"   r"   r"   r#   r   ¥   s   

r   c                   @   sÔ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zejd	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dd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zejd%d&„ ƒZd'd(„ Zd)S )*Ú_CertificateRevocationListc                 C   s   || _ || _d S r0   )r   Ú	_x509_crl)r   r    Zx509_crlr"   r"   r#   r$   Í   s    z#_CertificateRevocationList.__init__c                 C   s,   t |tjƒstS | jj | j|j¡}|dkS r(   )r)   r   ÚCertificateRevocationListr+   r   r   ZX509_CRL_cmprƒ   r,   r"   r"   r#   r/   Ñ   s    z!_CertificateRevocationList.__eq__c                 C   s
   | |k S r0   r"   r1   r"   r"   r#   r2   Ø   s    z!_CertificateRevocationList.__ne__c                 C   sX   t  || j¡}| j ¡ }| jj || j¡}| j |dk¡ | j |¡}| 	|¡ | 
¡ S )Nrr   )r   r;   r   rs   r   Úi2d_X509_CRL_biorƒ   rA   rv   r<   r=   )r   r>   r?   ry   r.   Zderr"   r"   r#   r@   Û   s    

z&_CertificateRevocationList.fingerprintc                 C   s@   | j j | j¡}| j  || j jjk¡ | j j || j jj¡}|S r0   )	r   r   ZX509_CRL_duprƒ   rA   rB   rC   rI   ZX509_CRL_free)r   Údupr"   r"   r#   Ú_sorted_crlä   s    z&_CertificateRevocationList._sorted_crlc                 C   sl   | j j d¡}t| j |ƒ}| j j | j||¡}|dkr:d S | j  |d | j jjk¡ t	| j | j|d ƒS d S )NzX509_REVOKED **r   )
r   rB   r]   r   r   ZX509_CRL_get0_by_serialr‡   rA   rC   r   )r   rF   ÚrevokedrE   r.   r"   r"   r#   Ú(get_revoked_certificate_by_serial_numberî   s      ÿ  ÿzC_CertificateRevocationList.get_revoked_certificate_by_serial_numberc                 C   s:   | j }ztj| W S  tk
r4   td |¡ƒ‚Y nX d S rU   rV   rY   r"   r"   r#   r[   ü   s    ÿz3_CertificateRevocationList.signature_hash_algorithmc                 C   s^   | j j d¡}| j j | j| j jj|¡ | j  |d | j jjk¡ t| j |d j	ƒ}t
 |¡S r\   )r   rB   r]   r   ÚX509_CRL_get0_signaturerƒ   rC   rA   r   r>   r   r_   r`   r"   r"   r#   rW     s      ÿz2_CertificateRevocationList.signature_algorithm_oidc                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_CRL_get_issuerrƒ   rA   rB   rC   r
   rR   r"   r"   r#   rS     s    z!_CertificateRevocationList.issuerc                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_CRL_get_nextUpdaterƒ   rA   rB   rC   r   )r   Únur"   r"   r#   Únext_update  s    z&_CertificateRevocationList.next_updatec                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_CRL_get_lastUpdaterƒ   rA   rB   rC   r   )r   Zlur"   r"   r#   Úlast_update  s    z&_CertificateRevocationList.last_updatec                 C   sR   | j j d¡}| j j | j|| j jj¡ | j  |d | j jjk¡ t| j |d ƒS rc   )	r   rB   r]   r   rŠ   rƒ   rC   rA   r	   rd   r"   r"   r#   rf   "  s      ÿz$_CertificateRevocationList.signaturec                    sd   ˆ j j d¡}ˆ j j ˆ j|¡}ˆ j  |dk¡ ˆ j j |‡ fdd„¡}ˆ j j |d |¡d d … S )Nrg   r   c                    s   ˆ j j | d ¡S r(   rh   ri   r&   r"   r#   rk   1  rl   z?_CertificateRevocationList.tbs_certlist_bytes.<locals>.<lambda>)	r   rB   r]   r   Zi2d_re_X509_CRL_tbsrƒ   rA   rI   rm   rn   r"   r&   r#   Útbs_certlist_bytes+  s     
ÿz-_CertificateRevocationList.tbs_certlist_bytesc                 C   sn   | j  ¡ }|tjjkr*| j j || j¡}n(|tjjkrJ| j j 	|| j¡}nt
dƒ‚| j  |dk¡ | j  |¡S rq   )r   rs   r   r6   rt   r   ZPEM_write_bio_X509_CRLrƒ   r7   r…   ru   rA   rv   rw   r"   r"   r#   r5   5  s    
 ÿz'_CertificateRevocationList.public_bytesc                 C   sD   | j j | j¡}| j j ||¡}| j  || j jjk¡ t| j | |ƒS r0   )	r   r   ÚX509_CRL_get_REVOKEDrƒ   Zsk_X509_REVOKED_valuerA   rB   rC   r   )r   Úidxrˆ   Úrr"   r"   r#   Ú_revoked_certC  s    z(_CertificateRevocationList._revoked_certc                 c   s"   t t| ƒƒD ]}|  |¡V  qd S r0   )ÚrangeÚlenr’   )r   Úir"   r"   r#   Ú__iter__I  s    z#_CertificateRevocationList.__iter__c                    s‚   t |tƒr8| tˆ ƒ¡\}}}‡ fdd„t|||ƒD ƒS t |¡}|dk rV|tˆ ƒ7 }d|  krntˆ ƒk stn t‚ˆ  |¡S d S )Nc                    s   g | ]}ˆ   |¡‘qS r"   )r’   )Ú.0r•   r&   r"   r#   Ú
<listcomp>P  s     z:_CertificateRevocationList.__getitem__.<locals>.<listcomp>r   )	r)   ÚsliceÚindicesr”   r“   ÚoperatorÚindexÚ
IndexErrorr’   )r   r   ÚstartÚstopÚstepr"   r&   r#   Ú__getitem__M  s    

z&_CertificateRevocationList.__getitem__c                 C   s4   | j j | j¡}|| j jjkr"dS | j j |¡S d S r(   )r   r   r   rƒ   rB   rC   Zsk_X509_REVOKED_num)r   rˆ   r"   r"   r#   Ú__len__Y  s    z"_CertificateRevocationList.__len__c                 C   s   | j j | j¡S r0   )r   Z_crl_extension_parserra   rƒ   r&   r"   r"   r#   rb   `  s    z%_CertificateRevocationList.extensionsc                 C   sL   t |tjtjtjfƒstdƒ‚| jj	 
| j|j¡}|dkrH| j ¡  dS dS )NzGExpecting one of DSAPublicKey, RSAPublicKey, or EllipticCurvePublicKey.rr   FT)r)   r   ZDSAPublicKeyr   ZRSAPublicKeyr   ZEllipticCurvePublicKeyru   r   r   ZX509_CRL_verifyrƒ   Z	_evp_pkeyrG   )r   rN   r.   r"   r"   r#   Úis_signature_validd  s    þÿ ÿ
z-_CertificateRevocationList.is_signature_validN)rz   r{   r|   r$   r/   r2   r@   r   r~   r‡   r‰   r}   r[   rW   rS   rŒ   r   rf   rŽ   r5   r’   r–   r¡   r¢   rb   r£   r"   r"   r"   r#   r‚   Ë   s:   	
	
	
	




	
r‚   c                   @   sš   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zedd„ ƒZ	edd„ ƒZ
edd„ ƒZejdd„ ƒZdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ ZdS )Ú_CertificateSigningRequestc                 C   s   || _ || _d S r0   )r   Ú	_x509_req)r   r    Zx509_reqr"   r"   r#   r$   z  s    z#_CertificateSigningRequest.__init__c                 C   s2   t |tƒstS |  tjj¡}| tjj¡}||kS r0   )r)   r¤   r+   r5   r   r6   r7   )r   r-   Z
self_bytesZother_bytesr"   r"   r#   r/   ~  s
    
z!_CertificateSigningRequest.__eq__c                 C   s
   | |k S r0   r"   r1   r"   r"   r#   r2   †  s    z!_CertificateSigningRequest.__ne__c                 C   s   t |  tjj¡ƒS r0   r3   r&   r"   r"   r#   r8   ‰  s    z#_CertificateSigningRequest.__hash__c                 C   sH   | j j | j¡}| j  || j jjk¡ | j j || j jj¡}| j  	|¡S r0   )
r   r   ÚX509_REQ_get_pubkeyr¥   rA   rB   rC   rI   rJ   rK   rL   r"   r"   r#   rN   Œ  s    z%_CertificateSigningRequest.public_keyc                 C   s2   | j j | j¡}| j  || j jjk¡ t| j |ƒS r0   )r   r   ZX509_REQ_get_subject_namer¥   rA   rB   rC   r
   rT   r"   r"   r#   r%   ’  s    z"_CertificateSigningRequest.subjectc                 C   s:   | j }ztj| W S  tk
r4   td |¡ƒ‚Y nX d S rU   rV   rY   r"   r"   r#   r[   ˜  s    ÿz3_CertificateSigningRequest.signature_hash_algorithmc                 C   s^   | j j d¡}| j j | j| j jj|¡ | j  |d | j jjk¡ t| j |d j	ƒ}t
 |¡S r\   )r   rB   r]   r   ÚX509_REQ_get0_signaturer¥   rC   rA   r   r>   r   r_   r`   r"   r"   r#   rW   ¢  s      ÿz2_CertificateSigningRequest.signature_algorithm_oidc                    s6   ˆ j j ˆ j¡}ˆ j j |‡ fdd„¡}ˆ j j |¡S )Nc                    s"   ˆ j j | ˆ j j ˆ j jjd¡¡S )NZX509_EXTENSION_free)r   r   Zsk_X509_EXTENSION_pop_freerB   Ú	addressofZ_original_lib)Úxr&   r"   r#   rk   ±  s    ÿþz7_CertificateSigningRequest.extensions.<locals>.<lambda>)r   r   ZX509_REQ_get_extensionsr¥   rB   rI   Z_csr_extension_parserra   )r   Z	x509_extsr"   r&   r#   rb   ¬  s    
þ	z%_CertificateSigningRequest.extensionsc                 C   sn   | j  ¡ }|tjjkr*| j j || j¡}n(|tjjkrJ| j j 	|| j¡}nt
dƒ‚| j  |dk¡ | j  |¡S rq   )r   rs   r   r6   rt   r   ZPEM_write_bio_X509_REQr¥   r7   Zi2d_X509_REQ_bioru   rA   rv   rw   r"   r"   r#   r5   º  s    
 ÿz'_CertificateSigningRequest.public_bytesc                    sd   ˆ j j d¡}ˆ j j ˆ j|¡}ˆ j  |dk¡ ˆ j j |‡ fdd„¡}ˆ j j |d |¡d d … S )Nrg   r   c                    s   ˆ j j | d ¡S r(   rh   ri   r&   r"   r#   rk   Î  rl   zB_CertificateSigningRequest.tbs_certrequest_bytes.<locals>.<lambda>)	r   rB   r]   r   Zi2d_re_X509_REQ_tbsr¥   rA   rI   rm   rn   r"   r&   r#   Útbs_certrequest_bytesÈ  s     
ÿz0_CertificateSigningRequest.tbs_certrequest_bytesc                 C   sR   | j j d¡}| j j | j|| j jj¡ | j  |d | j jjk¡ t| j |d ƒS rc   )	r   rB   r]   r   r§   r¥   rC   rA   r	   rd   r"   r"   r#   rf   Ò  s      ÿz$_CertificateSigningRequest.signaturec                 C   sh   | j j | j¡}| j  || j jjk¡ | j j || j jj¡}| j j 	| j|¡}|dkrd| j  
¡  dS dS )Nrr   FT)r   r   r¦   r¥   rA   rB   rC   rI   rJ   ZX509_REQ_verifyrG   )r   rM   r.   r"   r"   r#   r£   Û  s    
z-_CertificateSigningRequest.is_signature_validc                 C   s   t | j|jƒ}| jj | j|d¡}|dkr<t d |¡|¡‚| jj 	| j|¡}| j 
|| jjjk¡ | j 
| jj |¡dk¡ | jj |d¡}| j 
|| jjjk¡ |jtjjtjjtjjfkrÒtd ||j¡ƒ‚| jj |d|j| jjj¡}| j 
|| jjjk¡ | jj d|¡}t| j|ƒS )NéÿÿÿÿzNo {} attribute was foundrr   r   z&OID {} has a disallowed ASN.1 type: {}zASN1_STRING *)r   r   Zdotted_stringr   ZX509_REQ_get_attr_by_OBJr¥   r   ZAttributeNotFoundr   ZX509_REQ_get_attrrA   rB   rC   ZX509_ATTRIBUTE_countZX509_ATTRIBUTE_get0_typeÚtyper   Z
UTF8StringÚvalueZPrintableStringZ	IA5StringrH   ZX509_ATTRIBUTE_get0_dataÚcastr	   )r   rZ   ÚobjÚposÚattrZ	asn1_typeÚdatar"   r"   r#   Úget_attribute_for_oidè  sL      ÿ ÿÿý ÿÿ   ÿz0_CertificateSigningRequest.get_attribute_for_oidN)rz   r{   r|   r$   r/   r2   r8   rN   r}   r%   r[   rW   r   r~   rb   r5   rª   rf   r£   r³   r"   r"   r"   r#   r¤   x  s*   

	
	

	

r¤   c                   @   sh   e 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d„ Z
dd„ Zdd„ ZdS )Ú_SignedCertificateTimestampc                 C   s   || _ || _|| _d S r0   )r   Z	_sct_listÚ_sct)r   r    Zsct_listZsctr"   r"   r#   r$     s    z$_SignedCertificateTimestamp.__init__c                 C   s,   | j j | j¡}|| j jjks"t‚tjjj	S r0   )
r   r   ZSCT_get_versionrµ   ZSCT_VERSION_V1ÚAssertionErrorr   Úcertificate_transparencyr   r   )r   r!   r"   r"   r#   r!     s    z#_SignedCertificateTimestamp.versionc                 C   sH   | j j d¡}| j j | j|¡}|dks,t‚| j j |d |¡d d … S ©Nrg   r   )r   rB   r]   r   ZSCT_get0_log_idrµ   r¶   rm   )r   ÚoutZlog_id_lengthr"   r"   r#   Úlog_id"  s    z"_SignedCertificateTimestamp.log_idc                 C   s4   | j j | j¡}|d }tj |d ¡j|d dS )Niè  )Úmicrosecond)r   r   ZSCT_get_timestamprµ   ÚdatetimeÚutcfromtimestampÚreplace)r   Ú	timestampZmillisecondsr"   r"   r#   r¿   )  s
    ÿz%_SignedCertificateTimestamp.timestampc                 C   s,   | j j | j¡}|| j jjks"t‚tjjj	S r0   )
r   r   ZSCT_get_log_entry_typerµ   ZCT_LOG_ENTRY_TYPE_PRECERTr¶   r   r·   ZLogEntryTypeZPRE_CERTIFICATE)r   Ú
entry_typer"   r"   r#   rÀ   1  s    z&_SignedCertificateTimestamp.entry_typec                 C   sf   | j j d¡}| j j | j|¡}| j  |dk¡ | j  |d | j jjk¡ | j j |d |¡d d … S r¸   )	r   rB   r]   r   ZSCT_get0_signaturerµ   rA   rC   rm   )r   Zptrptrr.   r"   r"   r#   Ú
_signature9  s
    z&_SignedCertificateTimestamp._signaturec                 C   s
   t | jƒS r0   )r4   rÁ   r&   r"   r"   r#   r8   A  s    z$_SignedCertificateTimestamp.__hash__c                 C   s   t |tƒstS | j|jkS r0   )r)   r´   r+   rÁ   r1   r"   r"   r#   r/   D  s    
z"_SignedCertificateTimestamp.__eq__c                 C   s
   | |k S r0   r"   r1   r"   r"   r#   r2   J  s    z"_SignedCertificateTimestamp.__ne__N)rz   r{   r|   r$   r}   r!   rº   r¿   rÀ   rÁ   r8   r/   r2   r"   r"   r"   r#   r´     s   




r´   )*Ú
__future__r   r   r   r¼   r›   Zcryptographyr   r   Zcryptography.exceptionsr   Z0cryptography.hazmat.backends.openssl.decode_asn1r   r	   r
   r   r   Z0cryptography.hazmat.backends.openssl.encode_asn1r   r   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   Zcryptography.x509.namer   Zregister_interfacer*   Úobjectr   ZRevokedCertificater   r„   r‚   ZCertificateSigningRequestr¤   r·   ZSignedCertificateTimestampr´   r"   r"   r"   r#   Ú<module>   s0   
 	
%
 -
 ÿ