-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy pathtest_encryption_context.py
192 lines (172 loc) · 8.64 KB
/
test_encryption_context.py
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
"""Unit test suite for aws_encryption_sdk.internal.formatting.encryption_context"""
import pytest
import aws_encryption_sdk.internal.defaults
import aws_encryption_sdk.internal.formatting.encryption_context
from aws_encryption_sdk.exceptions import SerializationError
from aws_encryption_sdk.identifiers import ContentAADString
from ...vectors import VALUES
pytestmark = [pytest.mark.unit, pytest.mark.local]
class TestEncryptionContext(object):
def test_assemble_content_aad(self):
"""Validate that the assemble_content_aad function
behaves as expected.
"""
test = aws_encryption_sdk.internal.formatting.encryption_context.assemble_content_aad(
message_id=VALUES["message_id"],
aad_content_string=ContentAADString.NON_FRAMED_STRING_ID,
seq_num=1,
length=VALUES["content_len"],
)
assert test == VALUES["non_framed_aac"]
def test_assemble_content_aad_unknown_type(self):
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.assemble_content_aad(
message_id=VALUES["message_id"], aad_content_string=None, seq_num=1, length=VALUES["content_len"]
)
excinfo.match("Unknown aad_content_string")
def test_serialize_encryption_context_no_encryption_context(self):
"""Validate that the serialize_encryption_context
function behaves as expected when presented
with an empty encryption context.
"""
test = aws_encryption_sdk.internal.formatting.encryption_context.serialize_encryption_context({})
assert test == bytes()
def test_serialize_encryption_context_too_many_elements(self):
"""Validate that the serialize_encryption_context
function behaves as expected when presented
with an encryption context with too many
elements.
"""
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.serialize_encryption_context(
VALUES["encryption_context_too_many_elements"]
)
excinfo.match("The encryption context contains too many elements.")
def test_serialize_encryption_context_too_large(self):
"""Validate that the serialize_encryption_context
function behaves as expected when presented
with an encryption context which is too large.
"""
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.serialize_encryption_context(
VALUES["encryption_context_too_large"]
)
excinfo.match("The serialized context is too large")
def test_serialize_encryption_context_unencodable(self):
"""Validate that the serialize_encryption_context
function behaves as expected when presented
with an encryption context which contains
unencodable elements.
"""
for encryption_context in [{"a": b"\xc4"}, {b"\xc4": "a"}, {b"\xc4": b"\xc4"}]:
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.serialize_encryption_context(
encryption_context
)
excinfo.match("Cannot encode dictionary key or value using *")
def test_serialize_encryption_context_valid(self):
"""Validate that the serialize_encryption_context
function behaves as expected for a valid
encryption context.
"""
test = aws_encryption_sdk.internal.formatting.encryption_context.serialize_encryption_context(
VALUES["updated_encryption_context"]
)
assert test == VALUES["serialized_encryption_context"]
def test_read_short_too_short(self):
"""Validate that the read_short function behaves
as expected when it encounters a struct error.
"""
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.read_short(b"d", 0)
excinfo.match("Bad format of serialized context.")
def test_read_short_valid(self):
"""Validate that the read_short function behaves
as expected with a valid call.
"""
test_value, test_offset = aws_encryption_sdk.internal.formatting.encryption_context.read_short(b"\x00\x05df", 0)
assert test_value == 5
assert test_offset == 2
def test_read_string_encoding_error(self):
"""Validate that the read_string function behaves
as expected when it encounters an encoding
error.
"""
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.read_string(b"\xc4", 0, 1)
excinfo.match("Bad format of serialized context.")
def test_read_string_valid(self):
"""Validate that the read_string function behaves
as expected with a valid call.
"""
test_value, test_offset = aws_encryption_sdk.internal.formatting.encryption_context.read_string(b"asdf", 0, 2)
assert test_value == "as"
assert test_offset == 2
def test_deserialize_encryption_context_too_large(self):
"""Validate that the deserialize_encryption_context
function behaves as expected when it encounters
a serialized encryption context which is too
large.
"""
data = ""
for i in range(aws_encryption_sdk.internal.defaults.MAX_BYTE_ARRAY_SIZE + 1):
data += str(i)
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.deserialize_encryption_context(
serialized_encryption_context=data
)
excinfo.match("Serialized context is too long.")
def test_deserialize_encryption_context_duplicate_key(self):
"""Validate that the deserialize_encryption_context
function behaves as expected when it encounters
a serialized encryption context which contains
duplicate keys.
"""
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.deserialize_encryption_context(
serialized_encryption_context=VALUES["serialized_encryption_context_duplicate_key"]
)
excinfo.match("Duplicate key in serialized context.")
def test_deserialize_encryption_context_extra_data(self):
"""Validate that the deserialize_encryption_context
function behaves as expected when it encounters
a serialized encryption context which contains
extra data after processing the encoded number
of pairs (formatting error).
"""
data = VALUES["serialized_encryption_context"] + b"jhofguijhsuskldfh"
with pytest.raises(SerializationError) as excinfo:
aws_encryption_sdk.internal.formatting.encryption_context.deserialize_encryption_context(
serialized_encryption_context=data
)
excinfo.match("Formatting error: Extra data in serialized context.")
def test_deserialize_encryption_context_valid(self):
"""Validate that the deserialize_encryption_context
function behaves as expected for a valid
encryption context.
"""
test = aws_encryption_sdk.internal.formatting.encryption_context.deserialize_encryption_context(
serialized_encryption_context=VALUES["serialized_encryption_context"]
)
assert test == VALUES["updated_encryption_context"]
def test_deserialize_encryption_context_empty(self):
"""Validate that the deserialize_encryption_context
function behaves as expected for an empty
encryption context.
"""
test = aws_encryption_sdk.internal.formatting.encryption_context.deserialize_encryption_context(
serialized_encryption_context=b""
)
assert test == {}