Current File : //usr/lib64/python3.6/site-packages/borg/testsuite/__pycache__/key.cpython-36.pyc
3

up�d�O�@s.ddlZddlZddlZddlZddlmZmZddlZddl	m
Z
mZmZddl	m
Z
mZmZmZmZmZmZmZddl	mZmZddl	mZmZmZmZddl	mZdd	l	mZdd
lmZmZddl m!Z!ddl m"Z"dd
l m#Z#ddl m$Z$ddl m%Z%Gdd�d�Z&Gdd�d�Z'Gdd�d�Z(dS)�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@seZdZGdd�d�Zdj�Zeejddd��Z	ed�Z
dj�Zej
d	�Zej
d
�Zejdd��Zejeeeeeeefd
�dd��ZGdd�d�Zdd�Zdd�Zdd�Zdd�Zdd�Z dd�Z!dd�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@seZdZeej�d�ZdS)zTestKey.MockArgs�N)�__name__�
__module__�__qualname__r�tempfileZmkstemp�location�r&r&�/usr/lib64/python3.6/key.py�MockArgssr(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@d8bc68e961c79f99be39061589e5179b2113cd9226e07b08ddd4a1fef7ce93fbcCs|jdt|��|S)NZ
BORG_KEYS_DIR)�setenv�str)�self�request�monkeypatch�tmpdirr&r&r'�keys_dirEszTestKey.keys_dir)ZparamscCs"|jdd�|jj|j�|j��S)N�BORG_PASSPHRASE�test)r*Zparam�create�MockRepositoryr()r,r-r.r&r&r'�keyJs
zTestKey.keyc@sPeZdZGdd�d�Ze�Zed�Zee�Zdd�Z	dd�Z
dd	�Zd
d�ZdS)
zTestKey.MockRepositoryc@seZdZdZZdd�ZdS)z TestKey.MockRepository._Locationz/some/placecCs|jS)N)�	processed)r,r&r&r'�canonical_path[sz/TestKey.MockRepository._Location.canonical_pathN)r!r"r#�rawr6r7r&r&r&r'�	_LocationXsr9� cCsdS)Nr&)r,r&r&r'�get_free_noncebsz%TestKey.MockRepository.get_free_noncecCsdS)Nr&)r,Znext_unreservedZstart_noncer&r&r'�commit_nonce_reservationesz/TestKey.MockRepository.commit_nonce_reservationcCs
||_dS)N)�key_data)r,�datar&r&r'�save_keyhszTestKey.MockRepository.save_keycCs|jS)N)r=)r,r&r&r'�load_keykszTestKey.MockRepository.load_keyN)
r!r"r#r9Z	_location�bytes�idr�id_strr;r<r?r@r&r&r&r'r4Wsr4cCsJtjdd�}d}t|j|��dks&t�||j|j|�|j|��ksFt�dS)Nsfoos@2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae)rr3r�id_hash�AssertionError�decrypt�encrypt)r,r5�chunkr&r&r'�test_plaintextnszTestKey.test_plaintextc	Cs.|jdd�tj|j�|j��}t|jjd�dks6t�|j	d�}|j
|�dksRt�|j	d�}||ksht�|jd|�|jd|�ks�t�|j
|�dks�t�|j
|�}tj|j�|�}t|jjd�|t
t|�tj�ks�t�t|j|j|jh�dks�t�|jdk�st�d}||j|j|�|j	|��k�s*t�dS)	Nr1r2�rsABCr �sfoo)r*rr3r4r(r�
enc_cipher�ivrErG�
extract_noncerF�detectr�len�PAYLOAD_OVERHEAD�id_key�enc_key�enc_hmac_key�
chunk_seedrD)	r,r.r0r5�manifest�	manifest2rM�key2rHr&r&r'�test_keyfilets 


(zTestKey.test_keyfilec
Cs�|jdd�|j�}ttjjt|j�d�d��}|jd�WdQRXt	j
||j��}|jd�}|j
|�dkspt�|jd|�dks�t�dS)Nr1r2Znonce�wZ0000000000002000sABCi )r*r4�open�os�path�joinrrC�writerr3r(rGrNrErF)r,r.r0�
repository�fdr5r>r&r&r'�&test_keyfile_nonce_rollback_protection�s
z.TestKey.test_keyfile_nonce_rollback_protectionc
Cs�|jd�}|jdt|��|jdd�|j�s4t�tj|j�|j��}|j�sTt�d}|j	|�}|j
|�}tj|j�|�}||j||�ks�t�|j
�tjt��tj|j�|�WdQRXdS)N�keyfile�
BORG_KEY_FILEr1ZtestkfsABC)r^r*r+�existsrErr3r4r(rDrGrOrF�remove�pytest�raises�FileNotFoundError)r,r/r.rcr5rHZchunk_idZchunk_cdatar&r&r'�test_keyfile_kfenv�s


zTestKey.test_keyfile_kfenvc
Csb|jd�jd��}|j|j�WdQRX|jdd�tj|j�|j�}|j	|j
|j�dks^t�dS)NrcrZr1�
passphrasespayload)r^r[r_�keyfile2_key_filer*rrOr4�keyfile2_cdatarF�keyfile2_idrE)r,r.r0rar5r&r&r'�
test_keyfile2�s
zTestKey.test_keyfile2cCsv|jd�}|jd��}|j|j�WdQRX|jdt|��|jdd�tj|j�|j	�}|j
|j|j	�dksrt�dS)NrcrZrdr1rkspayload)
r^r[r_rlr*r+rrOr4rmrFrnrE)r,r/r.rcrar5r&r&r'�test_keyfile2_kfenv�s
zTestKey.test_keyfile2_kfenvc
Csb|jd�jd��}|j|j�WdQRX|jdd�tj|j�|j�}|j	|j
|j�dks^t�dS)NrcrZr1rkspayload)r^r[r_�keyfile_blake2_key_filer*r
rOr4�keyfile_blake2_cdatarF�keyfile_blake2_idrE)r,r.r0rar5r&r&r'�test_keyfile_blake2�s
zTestKey.test_keyfile_blake2c	Cs�|jdd�tj|j�d�}t|jjd�dks2t�t|j	�dksDt�t|j
�dksVt�t|j�dksht�|jd
ksvt�|j
d	�}|j|�dks�t�|j
d	�}||ks�t�|jd|�|jd|�ks�t�|j|�d
ks�t�|j|�}tj|j�|�}t|jjd�|tt|�tj�k�st�|j	|j	k�s,t�|j
|j
k�s>t�|j|jk�sPt�|j|jk�sbt�d}t|j|��dk�s~t�||j|j|�|j
|��k�s�t�dS)Nr1r2rJrs@793b0717f9d8fb01c751a487e9b827897ceea62409870600013fbc6b4d8d7ca6s@b885a05d329a086627412a6142aaeb9f6c54ab7950f996dd65587251f6bc0901s@2ff3654c6daf7381dbbe718d2b20b4f1ea1e34caa6cc65f6bb3ac376b93fed2ai=�<.sABCr sfoos@818217cf07d37efad3860766dcdf1d21e401650fed2d76ed1d797d3aae925990i�#��)r*r	r3r4rrLrMrErrRrTrSrUrGrNrFrOrrPrQrD)	r,r0r.r5rVrWrMrXrHr&r&r'�test_passphrase�s.


*zTestKey.test_passphrasec
Cs>t|�}||dN<tjt��|jd|�WdQRXdS)Nr �)�	bytearrayrgrhrrF)r,r5r>�offsetr&r&r'�
_corrupt_byte�szTestKey._corrupt_bytecCs�|jd�jd��}|j|j�WdQRX|jdd�tj|j�|j�}|j}x"t	t
|��D]}|j|||�qZWtj
t��2t|j�}t|j|��}d|d<|j||�WdQRXdS)NrcrZr1rkr�)r^r[r_rlr*rrOr4rm�rangerPryrgrhrrwrDrF)r,r.r0rar5r>�irBr&r&r'�test_decrypt_integrity�s
zTestKey.test_decrypt_integritycCsR|j}d}|j|�}t|�}||jks*t�|j||�}|jd|�}||ksNt�dS)Nsfoo)r`rGr�	__class__rErOrF)r,r5r`�	plaintext�	encryptedZidentified_key_classZ
loaded_keyZ	decryptedr&r&r'�test_roundtrip�s
zTestKey.test_roundtripcCs>d}|j|�}|jd|dd�|ks&t�|jd|�|ks:t�dS)Ns	123456789F)Z
decompress)rGrFrE)r,r5rr�r&r&r'�test_decrypt_decompress�s
zTestKey.test_decrypt_decompresscCs�d}|j|�}|j||�t|�}|ddN<tjt��|j||�WdQRX|d}tjt��|j||�WdQRXdS)Ns	123456789rr �1)rDZ	assert_idrwrgrhr)r,r5rrBZ
id_changedZplaintext_changedr&r&r'�test_assert_id�s
zTestKey.test_assert_idcCsd|jdd�tj|j�|j��}tjtjks0t�t|j	�dksBt�d}|j
|�}|d|ks`t�dS)Nr1r2r:s	123456789s�)r*r
r3r4r(rDrrErPrRrG)r,r.r5r�
authenticatedr&r&r'�test_authenticated_encrypts
z"TestKey.test_authenticated_encryptcCsd|jdd�tj|j�|j��}tjtjks0t�t|j	�dksBt�d}|j
|�}|d|ks`t�dS)Nr1r2�s	123456789s�)r*rr3r4r(rDrrErPrRrG)r,r.r5rr�r&r&r'�!test_blake2_authenticated_encrypts
z)TestKey.test_blake2_authenticated_encryptN)+r!r"r#r(�striprlr�re�subrmrnrqrA�fromhexrrrsrg�fixturer0rr
rrr
rrr5r4rIrYrbrjrorprtruryr}r�r�r�r�r�r&r&r&r'rsB

	

	
rc@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�TestPassphrasecCs�|jtddd��|jdd�tj�|j�\}}d|ks>t�d|ksJt�|jdd�tj�}|j�\}}d|ksvt�d|ks�t�|d	ks�t�|jtdd
d��tj�|j�\}}d|ks�t�d|ks�t�dS)N�getpasscSsdS)Nu	12aöäür&)�promptr&r&r'�<lambda>szATestPassphrase.test_passphrase_new_verification.<locals>.<lambda>ZBORG_DISPLAY_PASSPHRASE�noZ12�yesZ313261c3b6c3a4c3bcu	12aöäücSsdS)Nz1234/@=r&)r�r&r&r'r�*sz1234/@=)�setattrr�r*r�new�
readouterrrE)r,�capsysr.�out�errrkr&r&r'� test_passphrase_new_verifications"z/TestPassphrase.test_passphrase_new_verificationc
Cs\|jdd�|jtddd��tjt��tjdd�WdQRX|j�\}}d|ksXt	�dS)Nr1Fr�cSsdS)Nr)r&)r�r&r&r'r�2sz:TestPassphrase.test_passphrase_new_empty.<locals>.<lambda>)Zallow_emptyzmust not be blank)
�delenvr�r�rgrhrrr�r�rE)r,r�r.r�r�r&r&r'�test_passphrase_new_empty0sz(TestPassphrase.test_passphrase_new_emptyc	sP|jdd�ttd���|jtd�fdd��tjt��tj	�WdQRXdS)Nr1F�r�cstt���S)N)r+�next)r�)�ascending_numbersr&r'r�;sz<TestPassphrase.test_passphrase_new_retries.<locals>.<lambda>)
r��iterr{r�r�rgrhrrr�)r,r.r&)r�r'�test_passphrase_new_retries8s
z*TestPassphrase.test_passphrase_new_retriescCsdttd��kst�dS)NZsecret)�reprrrE)r,r&r&r'�test_passphrase_repr?sz#TestPassphrase.test_passphrase_reprN)r!r"r#r�r�r�r�r&r&r&r'r�sr�c@s eZdZejdd��Zdd�Zdd�Zdd�Zd	d
�Z	dd�Z
ejjd
ie
fddie
fdefdeff�dd��Zejjd
ie
fddie
fdefdeff�dd��Zejjdied�fed�ifded�fed�dff�dd��Zdd�Zdd�Zejjdd%�d!d"��Zejjdd&�d#d$��ZdS)'�TestTAMcCs |jdd�tjtj�tj��S)Nr1r2)r*rr3rr4r()r,r.r&r&r'r5DszTestTAM.keycCsRd}tjt��|j|�WdQRXd}tjttjf��|j|�WdQRXdS)Ns
����foobars���)rgrhr�unpack_and_verify_manifest�
ValueErrorrZUnpackException)r,r5�blobr&r&r'�test_unpack_futureIszTestTAM.test_unpack_futurecCsNtji�}tjt��|j|�WdQRXtjt��|j|�WdQRXdS)N)r�packbrgrhrr��unpack_and_verify_archive)r,r5r�r&r&r'�test_missing_when_requiredRs

z"TestTAM.test_missing_when_requiredcCs^tji�}d|_|j|�\}}|iks*t�|s4t�|j|�\}}}|iksPt�|sZt�dS)NF)rr��tam_requiredr�rEr�)r,r5r��unpacked�verified�_r&r&r'�test_missingYs

zTestTAM.test_missingcCsVtjdddii�}tjt��|j|�WdQRXtjt��|j|�WdQRXdS)N�tam�type�HMAC_VOLLBIT)rr�rgrhrr�r�)r,r5r�r&r&r'�test_unknown_type_when_requiredcsz'TestTAM.test_unknown_type_when_requiredcCsftjdddii�}d|_|j|�\}}|iks2t�|s<t�|j|�\}}}|iksXt�|sbt�dS)Nr�r�r�F)rr�r�r�rEr�)r,r5r�r�r�r�r&r&r'�test_unknown_typens
zTestTAM.test_unknown_typeztam, excr���Ni�c	Cs2tjd|i�}tj|��|j|�WdQRXdS)Nr�)rr�rgrhr�)r,r5r��excr�r&r&r'�test_invalid_manifest|s
zTestTAM.test_invalid_manifestc	Cs2tjd|i�}tj|��|j|�WdQRXdS)Nr�)rr�rgrhr�)r,r5r�r�r�r&r&r'�test_invalid_archive�s
zTestTAM.test_invalid_archivez
hmac, salt�@cCs�dd||d�i}|d}|dkr&|d=|dkr4|d=tj|�}tjt��|j|�WdQRXtjt��|j|�WdQRXdS)Nr�ZHKDF_HMAC_SHA512)r��hmac�saltr�r�)rr�rgrhrr�rr�)r,r5r�r�r>r�r�r&r&r'�test_wrong_types�s

zTestTAM.test_wrong_typescCsxddi}|j|dd�}|jd�s$t�tj|�}|dddksBt�|j|�\}}|sXt�|d	d
ksht�d|kstt�dS)N�foo�barsmanifest)�context��stamstypesHKDF_HMAC_SHA512sfoosbar)�pack_and_authenticate_metadata�
startswithrEr�unpackbr�)r,r5r>r�r�r�r&r&r'�test_round_trip_manifest�s
z TestTAM.test_round_trip_manifestcCszddi}|j|dd�}|jd�s$t�tj|�}|dddksBt�|j|�\}}}|sZt�|d	d
ksjt�d|ksvt�dS)Nr�r�sarchive)r�r�stamstypesHKDF_HMAC_SHA512sfoosbar)r�r�rErr�r�)r,r5r>r�r�r�r�r&r&r'�test_round_trip_archive�s
zTestTAM.test_round_trip_archive�which�hmac�saltc	Cs�ddi}|j|dd�}|jd�s$t�tj|td�}t|d|�dksJt�|d|d	d
�td
�|d|<t|d|�dks�t�tj|�}t	j
t��|j|�WdQRXdS)Nr�r�smanifest)r�r�)�object_hookstamr�rr:)
r�r�rErr�rrPrAr�rgrhrr�)r,r5r�r>r�r�r&r&r'�test_tampered_manifest�s$
zTestTAM.test_tampered_manifestc	Cs�ddi}|j|dd�}|jd�s$t�tj|td�}t|d|�dksJt�|d|d	d
�td
�|d|<t|d|�dks�t�tj|�}t	j
t��|j|�WdQRXdS)Nr�r�sarchive)r�r�)r�stamr�rr:)
r�r�rErr�rrPrAr�rgrhrr�)r,r5r�r>r�r�r&r&r'�test_tampered_archive�s$
zTestTAM.test_tampered_archive)r�r�)r�r�)r!r"r#rgr�r5r�r�r�r�r�ZmarkZparametrizerrr�rr�rAr�r�r�r�r�r&r&r&r'r�Cs2	

	
	




r�))r�Zos.pathr\r�r$ZbinasciirrrgZ
crypto.keyrrrrr	r
rrr
rrrrrrrrrrZcrypto.low_levelrrZhelpersrrrrrrr�r�r&r&r&r'�<module>s,()