|
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