
­­­­­­­­­­­­­­­­­­
<!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   s   t jd d }d}d S )Ns   foo)r   r3   )r,   r5   chunkr&   r&   r'   test_plaintextn   s    zTestKey.test_plaintextc       	      C   sV   |j dd tj| j | j }|jd}|jd}|j|}tj| j |}d}d S )Nr1   r2   s   ABCs   foo)r*   r   r3   r4   r(   encryptextract_noncedetect)	r,   r.   r0   r5   manifest	manifest2ivkey2rD   r&   r&   r'   test_keyfilet   s    


zTestKey.test_keyfilec          
   C   sb   |j dd | j }ttjjt|jdd}|jd W d Q R X t	j
|| j }|jd}d S )Nr1   r2   ZnoncewZ0000000000002000s   ABC)r*   r4   openospathjoinr   rC   writer   r3   r(   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 tj| j | j }d}|j|}|j|}tj	| j |}|j
  tjt tj	| j | W d Q R X d S )NkeyfileBORG_KEY_FILEr1   Ztestkfs   ABC)rR   r*   r+   r   r3   r4   r(   id_hashrF   rH   removepytestraisesFileNotFoundError)r,   r/   r.   rW   r5   rD   Zchunk_idZchunk_cdatar&   r&   r'   test_keyfile_kfenv   s    


zTestKey.test_keyfile_kfenvc          
   C   sJ   |j djd}|j| j W d Q R X |jdd tj| j | j}d S )NrW   rN   r1   
passphrase)	rR   rO   rS   keyfile2_key_filer*   r   rH   r4   keyfile2_cdata)r,   r.   r0   rU   r5   r&   r&   r'   test_keyfile2   s
    zTestKey.test_keyfile2c             C   s^   |j d}|jd}|j| j W d Q R X |jdt| |jdd tj| j | j	}d S )NrW   rN   rX   r1   r_   )
rR   rO   rS   r`   r*   r+   r   rH   r4   ra   )r,   r/   r.   rW   rU   r5   r&   r&   r'   test_keyfile2_kfenv   s    
zTestKey.test_keyfile2_kfenvc          
   C   sJ   |j djd}|j| j W d Q R X |jdd tj| j | j}d S )NrW   rN   r1   r_   )	rR   rO   rS   keyfile_blake2_key_filer*   r   rH   r4   keyfile_blake2_cdata)r,   r.   r0   rU   r5   r&   r&   r'   test_keyfile_blake2   s
    zTestKey.test_keyfile_blake2c       	      C   sR   |j dd tj| j d }|jd}|jd}|j|}tj| j |}d}d S )Nr1   r2   s   ABCs   foo)r*   r	   r3   r4   rF   rG   rH   )	r,   r0   r.   r5   rI   rJ   rK   rL   rD   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        )	bytearrayr[   r\   r   decrypt)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 )NrW   rN   r1   r_   r      )rR   rO   rS   r`   r*   r   rH   r4   ra   rangelenrl   r[   r\   r   ri   rY   rj   )r,   r.   r0   rU   r5   r>   irB   r&   r&   r'   test_decrypt_integrity   s    
zTestKey.test_decrypt_integrityc             C   s8   |j }d}|j|}t|}|j||}|jd |}d S )Ns   foo)rT   rF   r   rH   rj   )r,   r5   rT   	plaintext	encryptedZidentified_key_classZ
loaded_keyZ	decryptedr&   r&   r'   test_roundtrip   s    
zTestKey.test_roundtripc             C   s   d}|j |}d S )Ns	   123456789)rF   )r,   r5   rr   rs   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)rY   Z	assert_idri   r[   r\   r   )r,   r5   rr   rB   Z
id_changedZplaintext_changedr&   r&   r'   test_assert_id   s    
zTestKey.test_assert_idc             C   s2   |j dd tj| j | j }d}|j|}d S )Nr1   r2   s	   123456789)r*   r
   r3   r4   r(   rF   )r,   r.   r5   rr   authenticatedr&   r&   r'   test_authenticated_encrypt  s
    
z"TestKey.test_authenticated_encryptc             C   s2   |j dd tj| j | j }d}|j|}d S )Nr1   r2   s	   123456789)r*   r   r3   r4   r(   rF   )r,   r.   r5   rr   rx   r&   r&   r'   !test_blake2_authenticated_encrypt  s
    
z)TestKey.test_blake2_authenticated_encryptN)+r!   r"   r#   r(   stripr`   r   resubra   Zkeyfile2_idrd   rA   fromhexre   Zkeyfile_blake2_idr[   fixturer0   r   r
   r   r   r   r   r   r5   r4   rE   rM   rV   r^   rb   rc   rf   rg   rl   rq   rt   ru   rw   ry   rz   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 \}}|jdd tj }|j \}}|j tddd  tj  |j \}}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noyesc             S   s   dS )Nz1234/@=r&   )r   r&   r&   r'   r   *  s    )setattrr   r*   r   new
readouterr)r,   capsysr.   outerrr_   r&   r&   r'    test_passphrase_new_verification  s    z/TestPassphrase.test_passphrase_new_verificationc          
   C   sP   |j dd |jtddd  tjt tjdd W d Q R X |j \}}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_empty)	delenvr   r   r[   r\   r   r   r   r   )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   iterrn   r   r   r[   r\   r   r   r   )r,   r.   r&   )r   r'   test_passphrase_new_retries8  s
    z*TestPassphrase.test_passphrase_new_retriesc             C   s   d S )Nr&   )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   )r[   r\   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   packbr[   r\   r   r   unpack_and_verify_archive)r,   r5   r   r&   r&   r'   test_missing_when_requiredR  s
    
z"TestTAM.test_missing_when_requiredc             C   s2   t ji }d|_|j|\}}|j|\}}}d S )NF)r   r   tam_requiredr   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   r[   r\   r   r   r   )r,   r5   r   r&   r&   r'   test_unknown_type_when_requiredc  s    z'TestTAM.test_unknown_type_when_requiredc             C   s:   t jdddii}d|_|j|\}}|j|\}}}d S )Nr   r   r   F)r   r   r   r   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   r[   r\   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   r[   r\   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   r[   r\   r   r   r   r   )r,   r5   r   r   r>   r   r   r&   r&   r'   test_wrong_types  s    

zTestTAM.test_wrong_typesc             C   s2   ddi}|j |dd}tj|}|j|\}}d S )Nfoobars   manifest)context)pack_and_authenticate_metadatar   unpackbr   )r,   r5   r>   r   r   r   r&   r&   r'   test_round_trip_manifest  s
    
z TestTAM.test_round_trip_manifestc             C   s4   ddi}|j |dd}tj|}|j|\}}}d S )Nr   r   s   archive)r   )r   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   sv   ddi}|j |dd}tj|td}|d | dd td |d |< tj|}tjt |j	| W d Q R X d S )	Nr   r   s   manifest)r   )object_hooks   tamr   r:   )
r   r   r   r   rA   r   r[   r\   r   r   )r,   r5   r   r>   r   r   r&   r&   r'   test_tampered_manifest  s    $
zTestTAM.test_tampered_manifestc          	   C   sv   ddi}|j |dd}tj|td}|d | dd td |d |< tj|}tjt |j	| W d Q R X d S )	Nr   r   s   archive)r   )r   s   tamr   r:   )
r   r   r   r   rA   r   r[   r\   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#   r[   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.pathrP   r|   r$   Zbinasciir   r   r[   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,   (  )