File: test_kms_mac.py

package info (click to toggle)
python-moto 5.1.18-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 116,520 kB
  • sloc: python: 636,725; javascript: 181; makefile: 39; sh: 3
file content (135 lines) | stat: -rw-r--r-- 3,609 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""Unit tests for kms-supported APIs."""

import base64

import boto3
import pytest

from moto import mock_aws

# See our Development Tips on writing tests for hints on how to write good tests:
# http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html


def create_hmac_key() -> str:
    client = boto3.client("kms", region_name="eu-central-1")

    key_id = client.create_key(
        KeyUsage="GENERATE_VERIFY_MAC", KeySpec="HMAC_512", Policy="My Policy"
    )["KeyMetadata"]["KeyId"]

    return key_id


@mock_aws
def test_generate_mac():
    # Arrange
    key_id = create_hmac_key()
    client = boto3.client("kms", region_name="eu-central-1")

    # Act
    resp = client.generate_mac(
        KeyId=key_id,
        MacAlgorithm="HMAC_SHA_512",
        Message=base64.b64encode(b"Hello World"),
    )

    # Assert
    assert "Mac" in resp
    assert resp["KeyId"] == key_id
    assert resp["MacAlgorithm"] == "HMAC_SHA_512"


@mock_aws
def test_generate_fails_for_non_existent_key():
    # Arrange
    client = boto3.client("kms", region_name="eu-central-1")

    # Act + Assert
    with pytest.raises(client.exceptions.NotFoundException):
        client.generate_mac(
            KeyId="some-key",
            MacAlgorithm="HMAC_SHA_512",
            Message=base64.b64encode(b"Hello World"),
        )


@mock_aws
def test_generate_fails_for_invalid_key_usage():
    # Arrange
    client = boto3.client("kms", region_name="eu-central-1")
    key_id = client.create_key(
        KeyUsage="ENCRYPT_DECRYPT", KeySpec="HMAC_512", Policy="My Policy"
    )["KeyMetadata"]["KeyId"]

    # Act + Assert
    with pytest.raises(client.exceptions.InvalidKeyUsageException):
        client.generate_mac(
            KeyId=key_id,
            MacAlgorithm="HMAC_SHA_512",
            Message=base64.b64encode(b"Hello World"),
        )


@mock_aws
def test_generate_fails_for_invalid_key_spec():
    # Arrange
    client = boto3.client("kms", region_name="eu-central-1")
    key_id = client.create_key(
        KeyUsage="GENERATE_VERIFY_MAC", KeySpec="RSA_2048", Policy="My Policy"
    )["KeyMetadata"]["KeyId"]

    # Act + Assert
    with pytest.raises(client.exceptions.InvalidKeyUsageException):
        client.generate_mac(
            KeyId=key_id,
            MacAlgorithm="HMAC_SHA_512",
            Message=base64.b64encode(b"Hello World"),
        )


@mock_aws
def test_verify_mac():
    # Arrange
    key_id = create_hmac_key()
    client = boto3.client("kms", region_name="eu-central-1")
    mac = client.generate_mac(
        KeyId=key_id,
        MacAlgorithm="HMAC_SHA_512",
        Message=base64.b64encode(b"Hello World"),
    )["Mac"]

    # Act
    resp = client.verify_mac(
        KeyId=key_id,
        MacAlgorithm="HMAC_SHA_512",
        Message=base64.b64encode(b"Hello World"),
        Mac=mac,
    )

    # Assert
    assert resp["KeyId"] == key_id
    assert resp["MacAlgorithm"] == "HMAC_SHA_512"
    assert resp["MacValid"] is True


@mock_aws
def test_verify_mac_fails_for_another_key_id():
    # Arrange
    key_id = create_hmac_key()
    other_key_id = create_hmac_key()
    client = boto3.client("kms", region_name="eu-central-1")
    mac = client.generate_mac(
        KeyId=key_id,
        MacAlgorithm="HMAC_SHA_512",
        Message=base64.b64encode(b"Hello World"),
    )["Mac"]

    # Act + Assert
    with pytest.raises(client.exceptions.KMSInvalidMacException):
        client.verify_mac(
            KeyId=other_key_id,
            MacAlgorithm="HMAC_SHA_512",
            Message=base64.b64encode(b"Hello World"),
            Mac=mac,
        )