
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
iO                 @   s.  d dl Z d dlZd dlZd dlZd dlmZmZ d dlZddl	m
Z
mZ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 dd	l	mZ dd
lmZ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% G dd dZ&G dd dZ'G dd dZ(dS )    N)hexlify	unhexlify   )
PassphrasePasswordRetriesExceeded
bin_to_hex)PlaintextKeyPassphraseKeyAuthenticatedKeyRepoKey
KeyfileKeyBlake2KeyfileKeyBlake2RepoKeyBlake2AuthenticatedKey)ID_HMAC_SHA_256ID_BLAKE2b_256)TAMRequiredError
TAMInvalidTAMUnsupportedSuiteErrorUnsupportedManifestError)ArchiveTAMInvalid)identify_key)bytes_to_longnum_aes_blocks)IntegrityError)Location)
StableDict)get_security_dir)msgpackc               @   s  e Zd ZG dd dZdj ZeejdddZ	edZ
dj Zejd	Zejd
Zejdd Zejeeeeeeefddd ZG dd dZdd Zdd Zdd Zdd Zdd Z dd Z!dd Z"d d! Z#d"d# Z$d$d% Z%d&d' Z&d(d) Z'd*d+ Z(d,d- Z)d.d/ Z*d0S )1TestKeyc               @   s   e Zd Zeej d ZdS )zTestKey.MockArgs   N)__name__
__module____qualname__r   tempfileZmkstemplocation r&   r&   /usr/lib64/python3.6/key.pyMockArgs   s   r(   aU  
        BORG_KEY 0000000000000000000000000000000000000000000000000000000000000000
        hqppdGVyYXRpb25zzgABhqCkaGFzaNoAIMyonNI+7Cjv0qHi0AOBM6bLGxACJhfgzVD2oq
        bIS9SFqWFsZ29yaXRobaZzaGEyNTakc2FsdNoAINNK5qqJc1JWSUjACwFEWGTdM7Nd0a5l
        1uBGPEb+9XM9p3ZlcnNpb24BpGRhdGHaANAYDT5yfPpU099oBJwMomsxouKyx/OG4QIXK2
        hQCG2L2L/9PUu4WIuKvGrsXoP7syemujNfcZws5jLp2UPva4PkQhQsrF1RYDEMLh2eF9Ol
        rwtkThq1tnh7KjWMG9Ijt7/aoQtq0zDYP/xaFF8XXSJxiyP5zjH5+spB6RL0oQHvbsliSh
        /cXJq7jrqmrJ1phd6dg4SHAM/i+hubadZoS6m25OQzYAW09wZD/phG8OVa698Z5ed3HTaT
        SmrtgJL3EoOKgUI9d6BLE4dJdBqntifoz\W z
        0055f161493fcfc16276e8c31493c4641e1eb19a79d0326fad0291e5a9c98e5933
        00000000000003e8d21eaf9b86c297a8cd56432e1915bb
        Z@c3fbf14bc001ebcc3cd86e696c13482ed071740927cd7cbe1b01b4bfcee49314ay  
        BORG_KEY 0000000000000000000000000000000000000000000000000000000000000000
        hqlhbGdvcml0aG2mc2hhMjU2pGRhdGHaAZBu680Do3CmfWzeMCwe48KJi3Vps9mEDy7MKF
        TastsEhiAd1RQMuxfZpklkLeddMMWk+aPtFiURRFb02JLXV5cKRC1o2ZDdiNa0nao+o6+i
        gUjjsea9TAu25t3vxh8uQWs5BuKRLBRr0nUgrSd0IYMUgn+iVbLJRzCCssvxsklkwQxN3F
        Y+MvBnn8kUXSeoSoQ2l0fBHzq94Y7LMOm/owMam5URnE8/UEc6ZXBrbyX4EXxDtUqJcs+D
        i451thtlGdigDLpvf9nyK66mjiCpPCTCgtlzq0Pe1jcdhnsUYLg+qWzXZ7e2opEZoC6XxS
        3DIuBOxG3Odqj9IKB+6/kl94vz98awPWFSpYcLZVWu7sIP38ZkUK+ad5MHTo/LvTuZdFnd
        iqKzZIDUJl3Zl1WGmP/0xVOmfIlznkCZy4d3SMuujwIcqQ5kDvwDRPpdhBBk+UWQY5vFXk
        kR1NBNLSTyhAzu3fiUmFl0qZ+UWPRkGAEBy/NuoEibrWwab8BX97cATyvnmOqYkU9PT0C6
        l2l9E4bPpGhhc2jaACDnIa8KgKv84/b5sjaMgSZeIVkuKSLJy2NN8zoH8lnd36ppdGVyYX
        Rpb25zzgABhqCkc2FsdNoAIEJLlLh7q74j3q53856H5GgzA1HH+aW5bA/as544+PGkp3Zl
        cnNpb24BZd04fdf9475cf2323c0ba7a99ddc011064f2e7d039f539f2e4480e6f5fc6ff9993d604040404040404098c8cee1c6db8c28947Z@d8bc68e961c79f99be39061589e5179b2113cd9226e07b08ddd4a1fef7ce93fbc             C   s   |j dt| |S )NZBORG_KEYS_DIR)setenvstr)selfrequestmonkeypatchtmpdirr&   r&   r'   keys_dirE   s    zTestKey.keys_dir)Zparamsc             C   s"   |j dd |jj| j | j S )NBORG_PASSPHRASEtest)r*   ZparamcreateMockRepositoryr(   )r,   r-   r.   r&   r&   r'   keyJ   s    
zTestKey.keyc               @   sP   e Zd ZG dd dZe ZedZeeZdd Z	dd Z
dd	 Zd
d ZdS )zTestKey.MockRepositoryc               @   s   e Zd Zd ZZdd ZdS )z TestKey.MockRepository._Locationz/some/placec             C   s   | j S )N)	processed)r,   r&   r&   r'   canonical_path[   s    z/TestKey.MockRepository._Location.canonical_pathN)r!   r"   r#   rawr6   r7   r&   r&   r&   r'   	_LocationX   s   r9       c             C   s   d S )Nr&   )r,   r&   r&   r'   get_free_nonceb   s    z%TestKey.MockRepository.get_free_noncec             C   s   d S )Nr&   )r,   Znext_unreservedZstart_noncer&   r&   r'   commit_nonce_reservatione   s    z/TestKey.MockRepository.commit_nonce_reservationc             C   s
   || _ d S )N)key_data)r,   datar&   r&   r'   save_keyh   s    zTestKey.MockRepository.save_keyc             C   s   | j S )N)r=   )r,   r&   r&   r'   load_keyk   s    zTestKey.MockRepository.load_keyN)r!   r"   r#   r9   Z	_locationbytesidr   id_strr;   r<   r?   r@   r&   r&   r&   r'   r4   W   s   r4   c             C   sJ   t jd d }d}t|j|dks&t||j|j||j|ksFtd S )Ns   foos@   2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae)r   r3   r   id_hashAssertionErrordecryptencrypt)r,   r5   chunkr&   r&   r'   test_plaintextn   s    zTestKey.test_plaintextc       	      C   s.  |j dd tj| j | j }t|jjddks6t|j	d}|j
|dksRt|j	d}||ksht|jd ||jd |kst|j
|dkst|j
|}tj| j |}t|jjd|tt|tj  kstt|j|j|jhdkst|jdkstd}||j|j||j	|ks*td S )	Nr1   r2      r   s   ABCr       s   foo)r*   r   r3   r4   r(   r   
enc_cipherivrE   rG   extract_noncerF   detectr   lenPAYLOAD_OVERHEADid_keyenc_keyenc_hmac_key
chunk_seedrD   )	r,   r.   r0   r5   manifest	manifest2rM   key2rH   r&   r&   r'   test_keyfilet   s     


(zTestKey.test_keyfilec          
   C   s   |j dd | j }ttjjt|jdd}|jd W d Q R X t	j
|| j }|jd}|j|dkspt|jd |dkstd S )Nr1   r2   ZnoncewZ0000000000002000s   ABCi    )r*   r4   openospathjoinr   rC   writer   r3   r(   rG   rN   rE   rF   )r,   r.   r0   
repositoryfdr5   r>   r&   r&   r'   &test_keyfile_nonce_rollback_protection   s    
z.TestKey.test_keyfile_nonce_rollback_protectionc          
   C   s   |j d}|jdt| |jdd |j  s4ttj| j | j }|j sTtd}|j	|}|j
|}tj| j |}||j||kst|j  tjt tj| j | W d Q R X d S )NkeyfileBORG_KEY_FILEr1   Ztestkfs   ABC)r^   r*   r+   existsrE   r   r3   r4   r(   rD   rG   rO   rF   removepytestraisesFileNotFoundError)r,   r/   r.   rc   r5   rH   Zchunk_idZchunk_cdatar&   r&   r'   test_keyfile_kfenv   s    


zTestKey.test_keyfile_kfenvc          
   C   sb   |j djd}|j| j W d Q R X |jdd tj| j | j}|j	| j
| jdks^td S )Nrc   rZ   r1   
passphrases   payload)r^   r[   r_   keyfile2_key_filer*   r   rO   r4   keyfile2_cdatarF   keyfile2_idrE   )r,   r.   r0   ra   r5   r&   r&   r'   test_keyfile2   s
    zTestKey.test_keyfile2c             C   sv   |j d}|jd}|j| j W d Q R X |jdt| |jdd tj| j | j	}|j
| j| j	dksrtd S )Nrc   rZ   rd   r1   rk   s   payload)r^   r[   r_   rl   r*   r+   r   rO   r4   rm   rF   rn   rE   )r,   r/   r.   rc   ra   r5   r&   r&   r'   test_keyfile2_kfenv   s    
zTestKey.test_keyfile2_kfenvc          
   C   sb   |j djd}|j| j W d Q R X |jdd tj| j | j}|j	| j
| jdks^td S )Nrc   rZ   r1   rk   s   payload)r^   r[   r_   keyfile_blake2_key_filer*   r   rO   r4   keyfile_blake2_cdatarF   keyfile_blake2_idrE   )r,   r.   r0   ra   r5   r&   r&   r'   test_keyfile_blake2   s
    zTestKey.test_keyfile_blake2c       	      C   s  |j dd tj| j d }t|jjddks2tt|j	dksDtt|j
dksVtt|jdksht|jdksvt|jd	}|j|dkst|jd	}||kst|jd ||jd |kst|j|d
kst|j|}tj| j |}t|jjd|tt|tj  kst|j	|j	ks,t|j
|j
ks>t|j|jksPt|j|jksbtd}t|j|dks~t||j|j||j|kstd S )Nr1   r2   rJ   r   s@   793b0717f9d8fb01c751a487e9b827897ceea62409870600013fbc6b4d8d7ca6s@   b885a05d329a086627412a6142aaeb9f6c54ab7950f996dd65587251f6bc0901s@   2ff3654c6daf7381dbbe718d2b20b4f1ea1e34caa6cc65f6bb3ac376b93fed2ai=<.s   ABCr    s   foos@   818217cf07d37efad3860766dcdf1d21e401650fed2d76ed1d797d3aae925990i#)r*   r	   r3   r4   r   rL   rM   rE   r   rR   rT   rS   rU   rG   rN   rF   rO   r   rP   rQ   rD   )	r,   r0   r.   r5   rV   rW   rM   rX   rH   r&   r&   r'   test_passphrase   s.    


*zTestKey.test_passphrasec          
   C   s>   t |}||  dN  < tjt |jd| W d Q R X d S )Nr        )	bytearrayrg   rh   r   rF   )r,   r5   r>   offsetr&   r&   r'   _corrupt_byte   s    zTestKey._corrupt_bytec             C   s   |j djd}|j| j W d Q R X |jdd tj| j | j}| j}x"t	t
|D ]}| j||| qZW tjt2 t| j}t|j|}d|d< |j|| W d Q R X d S )Nrc   rZ   r1   rk   r      )r^   r[   r_   rl   r*   r   rO   r4   rm   rangerP   ry   rg   rh   r   rw   rD   rF   )r,   r.   r0   ra   r5   r>   irB   r&   r&   r'   test_decrypt_integrity   s    
zTestKey.test_decrypt_integrityc             C   sR   |j }d}|j|}t|}||jks*t|j||}|jd |}||ksNtd S )Ns   foo)r`   rG   r   	__class__rE   rO   rF   )r,   r5   r`   	plaintext	encryptedZidentified_key_classZ
loaded_keyZ	decryptedr&   r&   r'   test_roundtrip   s    
zTestKey.test_roundtripc             C   s>   d}|j |}|jd |dd|ks&t|jd ||ks:td S )Ns	   123456789F)Z
decompress)rG   rF   rE   )r,   r5   r   r   r&   r&   r'   test_decrypt_decompress   s    
zTestKey.test_decrypt_decompressc             C   s   d}|j |}|j|| t|}|d  dN  < tjt |j|| W d Q R X |d }tjt |j|| W d Q R X d S )Ns	   123456789r   r       1)rD   Z	assert_idrw   rg   rh   r   )r,   r5   r   rB   Z
id_changedZplaintext_changedr&   r&   r'   test_assert_id   s    
zTestKey.test_assert_idc             C   sd   |j dd tj| j | j }tjtjks0tt|j	dksBtd}|j
|}|d| ks`td S )Nr1   r2   r:   s	   123456789s    )r*   r
   r3   r4   r(   rD   r   rE   rP   rR   rG   )r,   r.   r5   r   authenticatedr&   r&   r'   test_authenticated_encrypt  s    
z"TestKey.test_authenticated_encryptc             C   sd   |j dd tj| j | j }tjtjks0tt|j	dksBtd}|j
|}|d| ks`td S )Nr1   r2      s	   123456789s    )r*   r   r3   r4   r(   rD   r   rE   rP   rR   rG   )r,   r.   r5   r   r   r&   r&   r'   !test_blake2_authenticated_encrypt  s    
z)TestKey.test_blake2_authenticated_encryptN)+r!   r"   r#   r(   striprl   r   resubrm   rn   rq   rA   fromhexrr   rs   rg   fixturer0   r   r
   r   r   r   r   r   r5   r4   rI   rY   rb   rj   ro   rp   rt   ru   ry   r}   r   r   r   r   r   r&   r&   r&   r'   r      sB   

	

	
r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestPassphrasec             C   s   |j tddd  |jdd tj  |j \}}d|ks>td|ksJt|jdd tj }|j \}}d|ksvtd|kst|d	kst|j tdd
d  tj  |j \}}d|kstd|kstd S )Ngetpassc             S   s   dS )Nu	   12aöäür&   )promptr&   r&   r'   <lambda>  s    zATestPassphrase.test_passphrase_new_verification.<locals>.<lambda>ZBORG_DISPLAY_PASSPHRASEnoZ12yesZ313261c3b6c3a4c3bcu	   12aöäüc             S   s   dS )Nz1234/@=r&   )r   r&   r&   r'   r   *  s    z1234/@=)setattrr   r*   r   new
readouterrrE   )r,   capsysr.   outerrrk   r&   r&   r'    test_passphrase_new_verification  s"    z/TestPassphrase.test_passphrase_new_verificationc          
   C   s\   |j dd |jtddd  tjt tjdd W d Q R X |j \}}d|ksXt	d S )Nr1   Fr   c             S   s   dS )Nr)   r&   )r   r&   r&   r'   r   2  s    z:TestPassphrase.test_passphrase_new_empty.<locals>.<lambda>)Zallow_emptyzmust not be blank)
delenvr   r   rg   rh   r   r   r   r   rE   )r,   r   r.   r   r   r&   r&   r'   test_passphrase_new_empty0  s    z(TestPassphrase.test_passphrase_new_emptyc          	      sP   |j dd ttd |jtd fdd tjt tj	  W d Q R X d S )Nr1   F   r   c                s   t t S )N)r+   next)r   )ascending_numbersr&   r'   r   ;  s    z<TestPassphrase.test_passphrase_new_retries.<locals>.<lambda>)
r   iterr{   r   r   rg   rh   r   r   r   )r,   r.   r&   )r   r'   test_passphrase_new_retries8  s
    z*TestPassphrase.test_passphrase_new_retriesc             C   s   dt tdkstd S )NZsecret)reprr   rE   )r,   r&   r&   r'   test_passphrase_repr?  s    z#TestPassphrase.test_passphrase_reprN)r!   r"   r#   r   r   r   r   r&   r&   r&   r'   r     s   r   c               @   s   e Zd Zejdd Zdd Zdd Zdd Zd	d
 Z	dd Z
ejjdi efddiefdefdeffdd Zejjdi efddiefdefdeffdd Zejjdi edfedi fdedfeddffdd Zdd Zdd Zejjdd%d!d" Zejjdd&d#d$ ZdS )'TestTAMc             C   s    |j dd tjtj tj S )Nr1   r2   )r*   r   r3   r   r4   r(   )r,   r.   r&   r&   r'   r5   D  s    zTestTAM.keyc             C   sR   d}t jt |j| W d Q R X d}t jttjf |j| W d Q R X d S )Ns
   foobars   )rg   rh   r   unpack_and_verify_manifest
ValueErrorr   ZUnpackException)r,   r5   blobr&   r&   r'   test_unpack_futureI  s    zTestTAM.test_unpack_futurec             C   sN   t ji }tjt |j| W d Q R X tjt |j| W d Q R X d S )N)r   packbrg   rh   r   r   unpack_and_verify_archive)r,   r5   r   r&   r&   r'   test_missing_when_requiredR  s
    
z"TestTAM.test_missing_when_requiredc             C   s^   t ji }d|_|j|\}}|i ks*t| s4t|j|\}}}|i ksPt| sZtd S )NF)r   r   tam_requiredr   rE   r   )r,   r5   r   unpackedverified_r&   r&   r'   test_missingY  s    

zTestTAM.test_missingc             C   sV   t jdddii}tjt |j| W d Q R X tjt |j| W d Q R X d S )NtamtypeHMAC_VOLLBIT)r   r   rg   rh   r   r   r   )r,   r5   r   r&   r&   r'   test_unknown_type_when_requiredc  s    z'TestTAM.test_unknown_type_when_requiredc             C   sf   t jdddii}d|_|j|\}}|i ks2t| s<t|j|\}}}|i ksXt| sbtd S )Nr   r   r   F)r   r   r   r   rE   r   )r,   r5   r   r   r   r   r&   r&   r'   test_unknown_typen  s    
zTestTAM.test_unknown_typeztam, excr      Ni  c          	   C   s2   t jd|i}tj| |j| W d Q R X d S )Nr   )r   r   rg   rh   r   )r,   r5   r   excr   r&   r&   r'   test_invalid_manifest|  s    
zTestTAM.test_invalid_manifestc          	   C   s2   t jd|i}tj| |j| W d Q R X d S )Nr   )r   r   rg   rh   r   )r,   r5   r   r   r   r&   r&   r'   test_invalid_archive  s    
zTestTAM.test_invalid_archivez
hmac, salt@   c             C   s   dd||di}|d }|d kr&|d= |d kr4|d= t j|}tjt |j| W d Q R X tjt |j| W d Q R X d S )Nr   ZHKDF_HMAC_SHA512)r   hmacsaltr   r   )r   r   rg   rh   r   r   r   r   )r,   r5   r   r   r>   r   r   r&   r&   r'   test_wrong_types  s    

zTestTAM.test_wrong_typesc             C   sx   ddi}|j |dd}|jds$ttj|}|d d dksBt|j|\}}|sXt|d	 d
kshtd|ksttd S )Nfoobars   manifest)context   s   tams   types   HKDF_HMAC_SHA512s   foos   bar)pack_and_authenticate_metadata
startswithrE   r   unpackbr   )r,   r5   r>   r   r   r   r&   r&   r'   test_round_trip_manifest  s    
z TestTAM.test_round_trip_manifestc             C   sz   ddi}|j |dd}|jds$ttj|}|d d dksBt|j|\}}}|sZt|d	 d
ksjtd|ksvtd S )Nr   r   s   archive)r   r   s   tams   types   HKDF_HMAC_SHA512s   foos   bar)r   r   rE   r   r   r   )r,   r5   r>   r   r   r   r   r&   r&   r'   test_round_trip_archive  s    
zTestTAM.test_round_trip_archivewhich   hmac   saltc          	   C   s   ddi}|j |dd}|jds$ttj|td}t|d | dksJt|d | d	d
 td
 |d |< t|d | dksttj|}t	j
t |j| W d Q R X d S )Nr   r   s   manifest)r   r   )object_hooks   tamr   r   r:   )r   r   rE   r   r   r   rP   rA   r   rg   rh   r   r   )r,   r5   r   r>   r   r   r&   r&   r'   test_tampered_manifest  s    $
zTestTAM.test_tampered_manifestc          	   C   s   ddi}|j |dd}|jds$ttj|td}t|d | dksJt|d | d	d
 td
 |d |< t|d | dksttj|}t	j
t |j| W d Q R X d S )Nr   r   s   archive)r   r   )r   s   tamr   r   r:   )r   r   rE   r   r   r   rP   rA   r   rg   rh   r   r   )r,   r5   r   r>   r   r   r&   r&   r'   test_tampered_archive  s    $
zTestTAM.test_tampered_archive)r   r   )r   r   )r!   r"   r#   rg   r   r5   r   r   r   r   r   ZmarkZparametrizer   r   r   r   r   rA   r   r   r   r   r   r&   r&   r&   r'   r   C  s2   	

	
	


r   ))r   Zos.pathr\   r   r$   Zbinasciir   r   rg   Z
crypto.keyr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zcrypto.low_levelr   r   Zhelpersr   r   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s,   (  )