U
    ÝÁ]µ5  ã                   @   sL  d 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  m	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 e
 d¡Ze
 d¡Ze
 d	¡Ze
 d
¡Ze
 d¡Ze
 d¡Ze
 d¡Ze
 d¡Ze
 d¡Ze
 d¡Ze
 d¡ZG dd„ de
jƒZG dd„ de
jƒZ G dd„ dej!ƒZ"G dd„ dej!ƒZ#G dd„ dej!ƒZ$G dd„ dej!ƒZ%G dd„ dej!ƒ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*G d%d&„ d&ej!ƒZ+G d'd(„ d(ej!ƒZ,G d)d*„ d*ej!ƒZ-G d+d,„ d,ej!ƒZ.G d-d.„ d.ej!ƒZ/G d/d0„ d0ej!ƒZ0G d1d2„ d2ej!ƒZ1G d3d4„ d4ej!ƒZ2e3d5krHe 4¡  dS )6zTests for certbot.crypto_util.é    N)Úerrors)Ú
interfaces)Úutil)Úos)Ú
filesystemzrsa256_key.pemzrsa512_key.pemzrsa2048_key.pemúcert_512.pemzcert_2048.pemznistp256_key.pemzcert-nosans_nistp256.pemc                       s\   e Zd ZdZ‡ fdd„Z‡ fdd„Zedd„ ƒZe 	d¡d	d
„ ƒZ
e 	d¡dd„ ƒZ‡  ZS )ÚInitSaveKeyTestz,Tests for certbot.crypto_util.init_save_key.c                    sX   t t| ƒ ¡  tj | jd¡| _tj	| jdd t
 t
j¡ tj tjddtj¡ d S )NÚworkdiriÀ  )ÚmodeT©Zstrict_permissions)Úsuperr   ÚsetUpr   ÚpathÚjoinÚtempdirr	   r   ÚmkdirÚloggingÚdisableZCRITICALÚzopeÚ	componentÚprovideUtilityÚmockÚMockr   ÚIConfig©Úself©Ú	__class__© ú@/usr/lib/python3/dist-packages/certbot/tests/crypto_util_test.pyr      s    
 ÿzInitSaveKeyTest.setUpc                    s   t t| ƒ ¡  t tj¡ d S ©N)r   r   ÚtearDownr   r   ZNOTSETr   r   r   r   r!   (   s    zInitSaveKeyTest.tearDownc                 C   s   ddl m} |||dƒS )Nr   )Úinit_save_keyúkey-certbot.pem)Úcertbot.crypto_utilr"   )ÚclsZkey_sizeZkey_dirr"   r   r   r   Ú_call-   s    zInitSaveKeyTest._callzcertbot.crypto_util.make_keyc                 C   sV   d|_ |  d| j¡}|  |jd¡ |  d|jk¡ |  tj 	tj 
| j|j¡¡¡ d S )Ns   key_pemé   r#   )Úreturn_valuer&   r	   ÚassertEqualÚpemÚ
assertTrueÚfiler   r   Úexistsr   )r   Ú	mock_makeÚkeyr   r   r   Útest_success2   s
    zInitSaveKeyTest.test_successc                 C   s   t |_|  t | jd| j¡ d S )Ni¯  )Ú
ValueErrorÚside_effectÚassertRaisesr&   r	   )r   r.   r   r   r   Útest_key_failure:   s    z InitSaveKeyTest.test_key_failure)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   Úclassmethodr&   r   Úpatchr0   r4   Ú__classcell__r   r   r   r   r      s   


r   c                       s<   e Zd ZdZ‡ fdd„Ze d¡e d¡dd„ ƒƒZ‡  ZS )ÚInitSaveCSRTestz,Tests for certbot.crypto_util.init_save_csr.c                    s*   t t| ƒ ¡  tj tjddtj	¡ d S )NTr   )
r   r<   r   r   r   r   r   r   r   r   r   r   r   r   r   C   s
    
 ÿzInitSaveCSRTest.setUpzacme.crypto_util.make_csrz+certbot.crypto_util.util.make_or_verify_dirc                 C   sJ   ddl m} d|_|tjddd| jƒ}|  |jd¡ |  d|j	k¡ d S )Nr   )Úinit_save_csrs   csr_pemZ	dummy_key)r*   úexample.comzcsr-certbot.pem)
r$   r=   r(   r   r   r   r)   Údatar+   r,   )r   Zunused_mock_verifyZmock_csrr=   Úcsrr   r   r   Útest_itI   s    
  ÿzInitSaveCSRTest.test_it)	r5   r6   r7   r8   r   r   r:   rA   r;   r   r   r   r   r<   @   s
   r<   c                   @   sD   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )ÚValidCSRTestz(Tests for certbot.crypto_util.valid_csr.c                 C   s   ddl m} ||ƒS )Nr   )Ú	valid_csr)r$   rC   )r%   r@   rC   r   r   r   r&   Z   s    zValidCSRTest._callc                 C   s   |   |  t d¡¡¡ d S ©Núcsr_512.pem©r+   r&   Ú	test_utilÚload_vectorr   r   r   r   Útest_valid_pem_true_   s    z ValidCSRTest.test_valid_pem_truec                 C   s   |   |  t d¡¡¡ d S )Nzcsr-san_512.pemrF   r   r   r   r   Útest_valid_pem_san_trueb   s    z$ValidCSRTest.test_valid_pem_san_truec                 C   s   |   |  t d¡¡¡ d S )Núcsr_512.der)ÚassertFalser&   rG   rH   r   r   r   r   Útest_valid_der_falsee   s    z!ValidCSRTest.test_valid_der_falsec                 C   s   |   |  d¡¡ d S ©NÚ ©rL   r&   r   r   r   r   Útest_empty_falseh   s    zValidCSRTest.test_empty_falsec                 C   s   |   |  d¡¡ d S ©Nzfoo barrP   r   r   r   r   Útest_random_falsek   s    zValidCSRTest.test_random_falseN)r5   r6   r7   r8   r9   r&   rI   rJ   rM   rQ   rS   r   r   r   r   rB   W   s   
rB   c                   @   s,   e Zd ZdZedd„ ƒZdd„ Zdd„ ZdS )	ÚCSRMatchesPubkeyTestz1Tests for certbot.crypto_util.csr_matches_pubkey.c                 O   s   ddl m} |||ŽS )Nr   )Úcsr_matches_pubkey)r$   rU   )r%   ÚargsÚkwargsrU   r   r   r   r&   r   s    zCSRMatchesPubkeyTest._callc                 C   s   |   |  t d¡t¡¡ d S rD   )r+   r&   rG   rH   Ú
RSA512_KEYr   r   r   r   Útest_valid_truew   s     ÿz$CSRMatchesPubkeyTest.test_valid_truec                 C   s   |   |  t d¡t¡¡ d S rD   )rL   r&   rG   rH   Ú
RSA256_KEYr   r   r   r   Útest_invalid_false{   s     ÿz'CSRMatchesPubkeyTest.test_invalid_falseN)r5   r6   r7   r8   r9   r&   rY   r[   r   r   r   r   rT   o   s
   
rT   c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )ÚImportCSRFileTestz/Tests for certbot.certbot_util.import_csr_file.c                 O   s   ddl m} |||ŽS )Nr   )Úimport_csr_file)r$   r]   )r%   rV   rW   r]   r   r   r   r&   ƒ   s    zImportCSRFileTest._callc                 C   sN   t  d¡}t  d¡}t  d¡}|  tjjtj||dddgf|  	||¡¡ d S )NrK   rE   r*   ©r,   r?   ZformúExample.com©
rG   Úvector_pathrH   r)   ÚOpenSSLÚcryptoÚFILETYPE_PEMr   ZCSRr&   )r   Úcsrfiler?   Zdata_pemr   r   r   Útest_der_csrˆ   s    


þü
úzImportCSRFileTest.test_der_csrc                 C   sD   t  d¡}t  d¡}|  tjjtj||dddgf|  	||¡¡ d S )NrE   r*   r^   r_   r`   )r   re   r?   r   r   r   Útest_pem_csr•   s    

þü
úzImportCSRFileTest.test_pem_csrc                 C   s$   |   tj| jt d¡t d¡¡ d S ©Nr   )r3   r   ÚErrorr&   rG   ra   rH   r   r   r   r   Útest_bad_csr¡   s    þzImportCSRFileTest.test_bad_csrN)	r5   r6   r7   r8   r9   r&   rf   rg   rj   r   r   r   r   r\   €   s   
r\   c                   @   s   e Zd ZdZdd„ ZdS )ÚMakeKeyTestz'Tests for certbot.crypto_util.make_key.c                 C   s&   ddl m} tj tjj|dƒ¡ d S )Nr   )Úmake_keyr'   )r$   rl   rb   rc   Zload_privatekeyrd   )r   rl   r   r   r   rA   ª   s
     ÿzMakeKeyTest.test_itN)r5   r6   r7   r8   rA   r   r   r   r   rk   §   s   rk   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚVerifyCertSetupz#Refactoring for verification tests.c                    sd   t t| ƒ ¡  t ¡ | _t| j_t| j_t	| j_
t d¡| j_t ¡ | _t| j_t| j_t| j_d S )Nzcert_fullchain_2048.pem)r   rm   r   r   Ú	MagicMockÚrenewable_certÚSS_CERT_PATHÚcertÚchainÚRSA2048_KEY_PATHÚprivkeyrG   ra   Ú	fullchainÚbad_renewable_certr   r   r   r   r   ´   s    

zVerifyCertSetup.setUp)r5   r6   r7   r8   r   r;   r   r   r   r   rm   ±   s   rm   c                   @   s<   e Zd ZdZdd„ Zdd„ Zejde 	d¡dd	d
„ ƒZ
dS )ÚVerifyRenewableCertTestú4Tests for certbot.crypto_util.verify_renewable_cert.c                 C   s   ddl m} ||ƒS )Nr   )Úverify_renewable_cert)r$   ry   )r   ro   ry   r   r   r   r&   Æ   s    zVerifyRenewableCertTest._callc                 C   s   |   d |  | j¡¡ d S r    ©r)   r&   ro   r   r   r   r   Útest_verify_renewable_certÊ   s    z2VerifyRenewableCertTest.test_verify_renewable_certz-certbot.crypto_util.verify_renewable_cert_sigrO   )r2   c                 C   s   |   tj| j| j¡ d S r    ©r3   r   ri   r&   rv   )r   Z!unused_verify_renewable_cert_signr   r   r   Ú"test_verify_renewable_cert_failureÍ   s    z:VerifyRenewableCertTest.test_verify_renewable_cert_failureN)r5   r6   r7   r8   r&   r{   r   r:   r   ri   r}   r   r   r   r   rw   Ã   s
   rw   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚVerifyRenewableCertSigTestrx   c                 C   s   ddl m} ||ƒS )Nr   )Úverify_renewable_cert_sig)r$   r   )r   ro   r   r   r   r   r&   Õ   s    z VerifyRenewableCertSigTest._callc                 C   s   |   d |  | j¡¡ d S r    rz   r   r   r   r   Útest_cert_sig_matchÙ   s    z.VerifyRenewableCertSigTest.test_cert_sig_matchc                 C   s0   t  ¡ }t|_t|_t|_|  d |  |¡¡ d S r    )	r   rn   ÚP256_CERT_PATHrq   rr   ÚP256_KEYrt   r)   r&   )r   ro   r   r   r   Útest_cert_sig_match_ecÜ   s
    z1VerifyRenewableCertSigTest.test_cert_sig_match_ecc                 C   s&   t  d¡| j_|  tj| j| j¡ d S )Nzcert_512_bad.pem)rG   ra   rv   rq   r3   r   ri   r&   r   r   r   r   Útest_cert_sig_mismatchã   s    z1VerifyRenewableCertSigTest.test_cert_sig_mismatchN)r5   r6   r7   r8   r&   r€   rƒ   r„   r   r   r   r   r~   Ò   s
   r~   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚVerifyFullchainTestz/Tests for certbot.crypto_util.verify_fullchain.c                 C   s   ddl m} ||ƒS )Nr   )Úverify_fullchain)r$   r†   )r   ro   r†   r   r   r   r&   ë   s    zVerifyFullchainTest._callc                 C   s   |   d |  | j¡¡ d S r    rz   r   r   r   r   Útest_fullchain_matchesï   s    z*VerifyFullchainTest.test_fullchain_matchesc                 C   s   |   tj| j| j¡ d S r    r|   r   r   r   r   Útest_fullchain_mismatchò   s    z+VerifyFullchainTest.test_fullchain_mismatchc                 C   s    d| j _|  tj| j| j ¡ d S )NZdog)rv   rr   r3   r   ri   r&   r   r   r   r   Útest_fullchain_ioerrorõ   s    z*VerifyFullchainTest.test_fullchain_ioerrorN)r5   r6   r7   r8   r&   r‡   rˆ   r‰   r   r   r   r   r…   è   s
   r…   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚVerifyCertMatchesPrivKeyTestz;Tests for certbot.crypto_util.verify_cert_matches_priv_key.c                 C   s   ddl m} ||j|jƒS )Nr   )Úverify_cert_matches_priv_key)r$   r‹   rq   rt   )r   ro   r‹   r   r   r   r&   ý   s    z"VerifyCertMatchesPrivKeyTest._callc                 C   s(   t | j_t| j_|  d |  | j¡¡ d S r    )rp   ro   rq   rs   rt   r)   r&   r   r   r   r   Útest_cert_priv_key_match  s    z5VerifyCertMatchesPrivKeyTest.test_cert_priv_key_matchc                 C   s(   t | j_t| j_|  tj| j| j¡ d S r    )	ÚRSA256_KEY_PATHrv   rt   rp   rq   r3   r   ri   r&   r   r   r   r   Útest_cert_priv_key_mismatch  s    z8VerifyCertMatchesPrivKeyTest.test_cert_priv_key_mismatchN)r5   r6   r7   r8   r&   rŒ   rŽ   r   r   r   r   rŠ   ú   s   rŠ   c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )ÚValidPrivkeyTestz,Tests for certbot.crypto_util.valid_privkey.c                 C   s   ddl m} ||ƒS )Nr   )Úvalid_privkey)r$   r   )r%   rt   r   r   r   r   r&     s    zValidPrivkeyTest._callc                 C   s   |   |  t¡¡ d S r    )r+   r&   rX   r   r   r   r   rY     s    z ValidPrivkeyTest.test_valid_truec                 C   s   |   |  d¡¡ d S rN   rP   r   r   r   r   rQ     s    z!ValidPrivkeyTest.test_empty_falsec                 C   s   |   |  d¡¡ d S rR   rP   r   r   r   r   rS     s    z"ValidPrivkeyTest.test_random_falseN)	r5   r6   r7   r8   r9   r&   rY   rQ   rS   r   r   r   r   r     s   
r   c                   @   s,   e Zd ZdZedd„ ƒZdd„ Zdd„ ZdS )	ÚGetSANsFromCertTestz1Tests for certbot.crypto_util.get_sans_from_cert.c                 O   s   ddl m} |||ŽS )Nr   )Úget_sans_from_cert)r$   r’   )r%   rV   rW   r’   r   r   r   r&   "  s    zGetSANsFromCertTest._callc                 C   s   |   g |  t d¡¡¡ d S rh   ©r)   r&   rG   rH   r   r   r   r   Útest_single'  s    zGetSANsFromCertTest.test_singlec                 C   s    |   ddg|  t d¡¡¡ d S ©Nr>   zwww.example.comzcert-san_512.pemr“   r   r   r   r   Útest_san*  s    þzGetSANsFromCertTest.test_sanN)r5   r6   r7   r8   r9   r&   r”   r–   r   r   r   r   r‘     s
   
r‘   c                   @   s<   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )ÚGetNamesFromCertTestz2Tests for certbot.crypto_util.get_names_from_cert.c                 O   s   ddl m} |||ŽS )Nr   )Úget_names_from_cert)r$   r˜   )r%   rV   rW   r˜   r   r   r   r&   3  s    zGetNamesFromCertTest._callc                 C   s   |   dg|  t d¡¡¡ d S )Nr>   r   r“   r   r   r   r   r”   8  s    þz GetNamesFromCertTest.test_singlec                 C   s    |   ddg|  t d¡¡¡ d S r•   r“   r   r   r   r   r–   =  s    þzGetNamesFromCertTest.test_sanc                 C   s,   |   dgdd„ dD ƒ |  t d¡¡¡ d S )Nr>   c                 S   s   g | ]}d   |¡‘qS )z{0}.example.com)Úformat)Ú.0Úcr   r   r   Ú
<listcomp>F  s     zDGetNamesFromCertTest.test_common_name_sans_order.<locals>.<listcomp>Zabcdzcert-5sans_512.pemr“   r   r   r   r   Útest_common_name_sans_orderB  s    þz0GetNamesFromCertTest.test_common_name_sans_orderc                 C   s   |   tjj| jd¡ d S )Nzhello there)r3   rb   rc   ri   r&   r   r   r   r   Útest_parse_non_certI  s    z(GetNamesFromCertTest.test_parse_non_certN)
r5   r6   r7   r8   r9   r&   r”   r–   r   rž   r   r   r   r   r—   0  s   
r—   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚCertLoaderTestz8Tests for certbot.crypto_util.pyopenssl_load_certificatec                 C   s>   ddl m} |tƒ\}}|  | d¡tj |t¡ d¡¡ d S )Nr   ©Úpyopenssl_load_certificateZsha256)r$   r¡   ÚCERTr)   Zdigestrb   rc   Zload_certificate)r   r¡   rq   Z	file_typer   r   r   Útest_load_valid_certP  s
    ÿz#CertLoaderTest.test_load_valid_certc                 C   s,   ddl m} t dd¡}|  tj||¡ d S )Nr   r    s   BEGIN CERTIFICATEs   ASDFASDFASDF!!!)r$   r¡   r¢   Úreplacer3   r   ri   )r   r¡   Zbad_cert_datar   r   r   Útest_load_invalid_certW  s      ÿz%CertLoaderTest.test_load_invalid_certN)r5   r6   r7   r8   r£   r¥   r   r   r   r   rŸ   M  s   rŸ   c                   @   s   e Zd ZdZdd„ ZdS )ÚNotBeforeTestz'Tests for certbot.crypto_util.notBeforec                 C   s$   ddl m} |  |tƒ ¡ d¡ d S )Nr   )Ú	notBeforez2014-12-11T22:34:45+00:00)r$   r§   r)   Ú	CERT_PATHÚ	isoformat)r   r§   r   r   r   Útest_notBeforea  s    ÿzNotBeforeTest.test_notBeforeN)r5   r6   r7   r8   rª   r   r   r   r   r¦   ^  s   r¦   c                   @   s   e Zd ZdZdd„ ZdS )ÚNotAfterTestú&Tests for certbot.crypto_util.notAfterc                 C   s$   ddl m} |  |tƒ ¡ d¡ d S )Nr   )ÚnotAfterz2014-12-18T22:34:45+00:00)r$   r­   r)   r¨   r©   )r   r­   r   r   r   Útest_notAfterj  s    ÿzNotAfterTest.test_notAfterN)r5   r6   r7   r8   r®   r   r   r   r   r«   g  s   r«   c                   @   s   e Zd ZdZdd„ ZdS )ÚSha256sumTestr¬   c                 C   s    ddl m} |  |tƒd¡ d S )Nr   )Ú	sha256sumZ@914ffed8daf9e2c99d90ac95c77d54f32cbd556672facac380f0c063498df84e)r$   r°   r)   r¨   )r   r°   r   r   r   Útest_sha256sumr  s    
ÿzSha256sumTest.test_sha256sumN)r5   r6   r7   r8   r±   r   r   r   r   r¯   p  s   r¯   c                   @   s   e Zd ZdZdd„ ZdS )ÚCertAndChainFromFullchainTestz;Tests for certbot.crypto_util.cert_and_chain_from_fullchainc           	      C   sj   t  ¡ }|t ¡  }|| }|d | }ddlm} ||fD ](}||ƒ\}}|  ||¡ |  ||¡ q<d S )NÚ
r   )Úcert_and_chain_from_fullchain)r¢   ÚdecodeÚSS_CERTr$   r´   r)   )	r   Zcert_pemZ	chain_pemZfullchain_pemZspacey_fullchain_pemr´   ru   Zcert_outZ	chain_outr   r   r   Ú"test_cert_and_chain_from_fullchain{  s    z@CertAndChainFromFullchainTest.test_cert_and_chain_from_fullchainN)r5   r6   r7   r8   r·   r   r   r   r   r²   x  s   r²   Ú__main__)5r8   r   Zunittestrb   r   Zzope.componentr   Zcertbot.tests.utilZtestsr   rG   Zcertbotr   r   Zcertbot.compatr   r   rH   rZ   ra   r   rX   rs   r¨   r¢   rp   r¶   r‚   r   Z	P256_CERTZTempDirTestCaser   r<   ZTestCaserB   rT   r\   rk   rm   rw   r~   r…   rŠ   r   r‘   r—   rŸ   r¦   r«   r¯   r²   r5   Úmainr   r   r   r   Ú<module>   sV   










$'
		
