|
32 | 32 | from create_key_for_import import create_key_for_import
|
33 | 33 | from create_key_hsm import create_key_hsm
|
34 | 34 | from create_key_labels import create_key_labels
|
| 35 | +from create_key_mac import create_key_mac |
35 | 36 | from create_key_ring import create_key_ring
|
36 | 37 | from create_key_rotation_schedule import create_key_rotation_schedule
|
37 | 38 | from create_key_symmetric_encrypt_decrypt import create_key_symmetric_encrypt_decrypt
|
|
43 | 44 | from enable_key_version import enable_key_version
|
44 | 45 | from encrypt_asymmetric import encrypt_asymmetric
|
45 | 46 | from encrypt_symmetric import encrypt_symmetric
|
| 47 | +from generate_random_bytes import generate_random_bytes |
46 | 48 | from get_key_labels import get_key_labels
|
47 | 49 | from get_key_version_attestation import get_key_version_attestation
|
48 | 50 | from get_public_key import get_public_key
|
|
53 | 55 | from quickstart import quickstart
|
54 | 56 | from restore_key_version import restore_key_version
|
55 | 57 | from sign_asymmetric import sign_asymmetric
|
| 58 | +from sign_mac import sign_mac |
56 | 59 | from update_key_add_rotation import update_key_add_rotation
|
57 | 60 | from update_key_remove_labels import update_key_remove_labels
|
58 | 61 | from update_key_remove_rotation import update_key_remove_rotation
|
59 | 62 | from update_key_set_primary import update_key_set_primary
|
60 | 63 | from update_key_update_labels import update_key_update_labels
|
61 | 64 | from verify_asymmetric_ec import verify_asymmetric_ec
|
62 | 65 | from verify_asymmetric_rsa import verify_asymmetric_rsa
|
| 66 | +from verify_mac import verify_mac |
63 | 67 |
|
64 | 68 |
|
65 | 69 | @pytest.fixture(scope="module")
|
@@ -167,6 +171,22 @@ def hsm_key_id(client, project_id, location_id, key_ring_id):
|
167 | 171 | return key_id
|
168 | 172 |
|
169 | 173 |
|
| 174 | +@pytest.fixture(scope="module") |
| 175 | +def hmac_key_id(client, project_id, location_id, key_ring_id): |
| 176 | + key_ring_name = client.key_ring_path(project_id, location_id, key_ring_id) |
| 177 | + key_id = '{}'.format(uuid.uuid4()) |
| 178 | + key = client.create_crypto_key(request={'parent': key_ring_name, 'crypto_key_id': key_id, 'crypto_key': { |
| 179 | + 'purpose': kms.CryptoKey.CryptoKeyPurpose.MAC, |
| 180 | + 'version_template': { |
| 181 | + 'algorithm': kms.CryptoKeyVersion.CryptoKeyVersionAlgorithm.HMAC_SHA256, |
| 182 | + 'protection_level': kms.ProtectionLevel.HSM |
| 183 | + }, |
| 184 | + 'labels': {'foo': 'bar', 'zip': 'zap'} |
| 185 | + }}) |
| 186 | + wait_for_ready(client, '{}/cryptoKeyVersions/1'.format(key.name)) |
| 187 | + return key_id |
| 188 | + |
| 189 | + |
170 | 190 | @pytest.fixture(scope="module")
|
171 | 191 | def symmetric_key_id(client, project_id, location_id, key_ring_id):
|
172 | 192 | key_ring_name = client.key_ring_path(project_id, location_id, key_ring_id)
|
@@ -245,6 +265,13 @@ def test_create_key_labels(project_id, location_id, key_ring_id):
|
245 | 265 | assert key.labels == {'team': 'alpha', 'cost_center': 'cc1234'}
|
246 | 266 |
|
247 | 267 |
|
| 268 | +def test_create_key_mac(project_id, location_id, key_ring_id): |
| 269 | + key_id = '{}'.format(uuid.uuid4()) |
| 270 | + key = create_key_mac(project_id, location_id, key_ring_id, key_id) |
| 271 | + assert key.purpose == kms.CryptoKey.CryptoKeyPurpose.MAC |
| 272 | + assert key.version_template.algorithm == kms.CryptoKeyVersion.CryptoKeyVersionAlgorithm.HMAC_SHA256 |
| 273 | + |
| 274 | + |
248 | 275 | def test_create_key_ring(project_id, location_id):
|
249 | 276 | key_ring_id = '{}'.format(uuid.uuid4())
|
250 | 277 | key_ring = create_key_ring(project_id, location_id, key_ring_id)
|
@@ -345,6 +372,11 @@ def test_encrypt_symmetric(client, project_id, location_id, key_ring_id, symmetr
|
345 | 372 | assert decrypt_response.plaintext == plaintext.encode('utf-8')
|
346 | 373 |
|
347 | 374 |
|
| 375 | +def test_generate_random_bytes(client, project_id, location_id): |
| 376 | + generate_random_bytes_response = generate_random_bytes(project_id, location_id, 256) |
| 377 | + assert len(generate_random_bytes_response.data) == 256 |
| 378 | + |
| 379 | + |
348 | 380 | def test_get_key_labels(project_id, location_id, key_ring_id, symmetric_key_id):
|
349 | 381 | key = get_key_labels(project_id, location_id, key_ring_id, symmetric_key_id)
|
350 | 382 | assert key.labels == {'foo': 'bar', 'zip': 'zap'}
|
@@ -412,6 +444,18 @@ def test_sign_asymmetric(client, project_id, location_id, key_ring_id, asymmetri
|
412 | 444 | pytest.fail('invalid signature')
|
413 | 445 |
|
414 | 446 |
|
| 447 | +def test_sign_mac(client, project_id, location_id, key_ring_id, hmac_key_id): |
| 448 | + data = 'my data' |
| 449 | + |
| 450 | + sign_response = sign_mac(project_id, location_id, key_ring_id, hmac_key_id, '1', data) |
| 451 | + assert sign_response.mac |
| 452 | + |
| 453 | + key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, hmac_key_id, '1') |
| 454 | + verify_response = client.mac_verify(request={'name': key_version_name, 'data': data.encode('utf-8'), 'mac': sign_response.mac}) |
| 455 | + |
| 456 | + assert verify_response.success |
| 457 | + |
| 458 | + |
415 | 459 | def test_update_key_add_rotation(project_id, location_id, key_ring_id, symmetric_key_id):
|
416 | 460 | key = update_key_add_rotation(project_id, location_id, key_ring_id, symmetric_key_id)
|
417 | 461 | assert key.rotation_period == datetime.timedelta(seconds=60*60*24*30)
|
@@ -461,6 +505,16 @@ def test_verify_asymmetric_rsa(client, project_id, location_id, key_ring_id, asy
|
461 | 505 | assert verified
|
462 | 506 |
|
463 | 507 |
|
| 508 | +def test_verify_mac(client, project_id, location_id, key_ring_id, hmac_key_id): |
| 509 | + data = 'my data' |
| 510 | + |
| 511 | + key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, hmac_key_id, '1') |
| 512 | + sign_response = client.mac_sign(request={'name': key_version_name, 'data': data.encode('utf-8')}) |
| 513 | + |
| 514 | + verify_response = verify_mac(project_id, location_id, key_ring_id, hmac_key_id, '1', data, sign_response.mac) |
| 515 | + assert verify_response.success |
| 516 | + |
| 517 | + |
464 | 518 | def test_quickstart(project_id, location_id):
|
465 | 519 | key_rings = quickstart(project_id, location_id)
|
466 | 520 | assert key_rings
|
0 commit comments