Skip to content
This repository was archived by the owner on May 9, 2020. It is now read-only.

Commit e3d863e

Browse files
committed
Add specs for EncryptedDataBagItem class
1 parent 25b29dc commit e3d863e

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

chef/tests/encryption_key

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1FNnCAvhritIPDerwUYKFNFZ8NaAIWyCXV43hqSVDeGk5pDt253E+RlUHlL7H/3HEFo/gnZWsk9Y5bEyOP7tUQSnT8enCbFqtvyBpiVep+4BYHss2aWBqqsm7aiPXa+BQHagmVHySleU+sFdLcNOASNMLiUB6azk8Xme1Gris8Awavrn/s5vRB7Bsl7xl84nSmu7Lg3C6Vezyye6K4ZmJOA1p0QPSMVGEJC5RkwAmA+W6G5MilBDMdxxN7mxy49WRSFLT35xFQNJOJ+Rvk53FJrhOCmiHkVNumF2MuhIpLsbrqpcdsU5UIxibjd2Dt+yz7/qytCsGSyZkVws09MgAH5icjZYV6DL8Y9CRa39KEyHl5DjHmWiRiuoFTc6oiUa0QAh08X64jz8OvcTWCJD9Fi5PdNkJblDMp9g6vvn/UPTos2s0KjzkLKdRbLrJovCSs52kkhTzfYXOYt4rmi5mQbdtcr2vsXFs+CT68Yfs56RFA2BA/+KLdaNzHFeH/Wl3h/hrciQfpAW62jnttBGr7sMV0pevXQTr2npPWq0fZHWO4gxkrL729najiDPOEeA2TeHV6+h6znZNYvfpNIRPIOMDLG7bdq2+/G7OvuE7u15qHYzWlJpvouhLA55upDK6CK1ONQw14JIK4+s9Dt2gYpV//G7MqnFMsnq3Y9ptt4=
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from chef import DataBag, EncryptedDataBagItem
2+
from chef.exceptions import ChefError, ChefUnsupportedEncryptionVersionError, ChefDecryptionError
3+
from chef.tests import ChefTestCase
4+
from chef.api import ChefAPI
5+
6+
import copy
7+
8+
class EncryptedDataBagItemTestCase(ChefTestCase):
9+
def setUp(self):
10+
super(EncryptedDataBagItemTestCase, self).setUp()
11+
12+
"""
13+
This is data encoded using knife, it contains two examples of
14+
encryption methods versions: 1 and 2.
15+
"""
16+
self.knife_examples = {
17+
'id': 'test',
18+
"pychef_test_ver1": {
19+
"encrypted_data": "Ym5T8umtSd0wgjDYq1ZDK5dAh6OjgrTxlloGNf2xYhg=\n",
20+
"iv": "GLVikZLxG0SWYnb68Pr8Ag==\n",
21+
"version": 1,
22+
"cipher": "aes-256-cbc"
23+
},
24+
"pychef_test_ver2": {
25+
"encrypted_data": "m2UCN7TYqRJhGfeGFCWtdlF8qtz15W8EmCRqQ4TI4nJpGm/Bqe1WgnzekJus\n7aM0\n",
26+
"hmac": "mzhfGpf/7rkkIQOSbK22zUv1X+bTCNI2l3FgMBgVOAY=\n",
27+
"iv": "EKNLqsxNfiFFDZPDnyXRfw==\n",
28+
"version": 2,
29+
"cipher": "aes-256-cbc"
30+
}
31+
}
32+
33+
def test_get_version(self):
34+
self.assertEqual(EncryptedDataBagItem.get_version({"version": "1"}), '1')
35+
self.assertEqual(EncryptedDataBagItem.get_version({"version": 1}), 1)
36+
self.assertEqual(EncryptedDataBagItem.get_version({"version": "2"}), '2')
37+
self.assertEqual(EncryptedDataBagItem.get_version({"version": 2}), 2)
38+
self.assertRaises(ChefUnsupportedEncryptionVersionError, EncryptedDataBagItem.get_version, {"version": 0})
39+
self.assertRaises(ChefUnsupportedEncryptionVersionError, EncryptedDataBagItem.get_version, {"version": "not a number"})
40+
41+
def test__getitem__(self):
42+
api = ChefAPI('https://chef_test:3000', 'client.pem', 'admin', secret_file='encryption_key')
43+
bag = DataBag('test_1')
44+
item = EncryptedDataBagItem(bag, 'test', api, True)
45+
item.raw_data = copy.deepcopy(self.knife_examples)
46+
47+
self.assertEqual(item['id'], 'test')
48+
self.assertEqual(item['pychef_test_ver1'], 'secr3t c0d3')
49+
self.assertEqual(item['pychef_test_ver2'], '3ncrypt3d d@t@ b@g')
50+
51+
# Incorrect IV should raise a decryption error
52+
item.raw_data['pychef_test_ver1']['iv'] = 'ZTM1MjY3OTc4ZjAwOTBlNw=='
53+
self.assertRaises(ChefDecryptionError, item.__getitem__, 'pychef_test_ver1')
54+
55+
# Invalid HMAC should raise a decryption error
56+
item.raw_data['pychef_test_ver2']['hmac'] = 'v0lMrOmi1ZgA/vtfE2NZO2mO62LagIM2KCZSrWiO/8M='
57+
self.assertRaises(ChefDecryptionError, item.__getitem__, 'pychef_test_ver2')
58+
59+
def test__set_item__(self):
60+
api = ChefAPI('https://chef_test:3000', 'client.pem', 'admin', secret_file='encryption_key')
61+
bag = DataBag('test_1')
62+
item = EncryptedDataBagItem(bag, 'test', api, True)
63+
item['id'] = 'test'
64+
api.encryption_version = 1
65+
item['pychef_test_ver1'] = 'secr3t c0d3'
66+
api.encryption_version = 2
67+
item['pychef_test_ver2'] = '3ncrypt3d d@t@ b@g'
68+
69+
self.assertEqual(item['id'], 'test')
70+
71+
self.assertIsInstance(item.raw_data['pychef_test_ver1'], dict)
72+
self.assertEqual(item.raw_data['pychef_test_ver1']['version'], 1)
73+
self.assertEqual(item.raw_data['pychef_test_ver1']['cipher'], 'aes-256-cbc')
74+
self.assertIsNotNone(item.raw_data['pychef_test_ver1']['iv'])
75+
self.assertIsNotNone(item.raw_data['pychef_test_ver1']['encrypted_data'])
76+
77+
self.assertIsInstance(item.raw_data['pychef_test_ver2'], dict)
78+
self.assertEqual(item.raw_data['pychef_test_ver2']['version'], 2)
79+
self.assertEqual(item.raw_data['pychef_test_ver2']['cipher'], 'aes-256-cbc')
80+
self.assertIsNotNone(item.raw_data['pychef_test_ver2']['iv'])
81+
self.assertIsNotNone(item.raw_data['pychef_test_ver2']['hmac'])
82+
self.assertIsNotNone(item.raw_data['pychef_test_ver2']['encrypted_data'])

0 commit comments

Comments
 (0)