Skip to content

Commit 91a35f3

Browse files
committed
update key manifest to v3 and master key manifest to v2
* awslabs/aws-crypto-tools-test-vector-framework#13
1 parent f095f12 commit 91a35f3

File tree

2 files changed

+26
-39
lines changed

2 files changed

+26
-39
lines changed

test_vector_handlers/src/awses_test_vectors/manifests/keys.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
from awses_test_vectors.internal.defaults import ENCODING
2525
from awses_test_vectors.internal.util import (
2626
dictionary_validator,
27-
iterable_validator,
2827
membership_validator,
2928
validate_manifest_type,
3029
)
@@ -60,14 +59,16 @@ class KeySpec(object):
6059

6160
encrypt = attr.ib(validator=attr.validators.instance_of(bool))
6261
decrypt = attr.ib(validator=attr.validators.instance_of(bool))
62+
key_id = attr.ib(validator=attr.validators.instance_of(six.string_types))
6363

64-
def __init__(self, encrypt, decrypt): # noqa=D107
65-
# type: (bool, bool) -> None
64+
def __init__(self, encrypt, decrypt, key_id): # noqa=D107
65+
# type: (bool, bool, str) -> None
6666
# Workaround pending resolution of attrs/mypy interaction.
6767
# https://github.com/python/mypy/issues/2088
6868
# https://github.com/python-attrs/attrs/issues/215
6969
self.encrypt = encrypt
7070
self.decrypt = decrypt
71+
self.key_id = key_id
7172
attr.validate(self)
7273

7374

@@ -84,16 +85,14 @@ class AwsKmsKeySpec(KeySpec):
8485
# pylint: disable=too-few-public-methods
8586

8687
type_name = attr.ib(validator=membership_validator(("aws-kms",)))
87-
key_id = attr.ib(validator=attr.validators.instance_of(six.string_types))
8888

8989
def __init__(self, encrypt, decrypt, type_name, key_id): # noqa=D107
9090
# type: (bool, bool, str, str) -> None
9191
# Workaround pending resolution of attrs/mypy interaction.
9292
# https://github.com/python/mypy/issues/2088
9393
# https://github.com/python-attrs/attrs/issues/215
9494
self.type_name = type_name
95-
self.key_id = key_id
96-
super(AwsKmsKeySpec, self).__init__(encrypt, decrypt)
95+
super(AwsKmsKeySpec, self).__init__(encrypt, decrypt, key_id)
9796

9897
@property
9998
def manifest_spec(self):
@@ -117,6 +116,7 @@ class ManualKeySpec(KeySpec):
117116
118117
Allowed values described in AWS Crypto Tools Test Vector Framework feature #0002 Keys Manifest.
119118
119+
:param str key_id: Master key ID
120120
:param bool encrypt: Key can be used to encrypt
121121
:param bool decrypt: Key can be used to decrypt
122122
:param str algorithm: Algorithm to use with key
@@ -134,6 +134,7 @@ class ManualKeySpec(KeySpec):
134134

135135
def __init__(
136136
self,
137+
key_id, # type: str
137138
encrypt, # type: bool
138139
decrypt, # type: bool
139140
algorithm, # type: str
@@ -151,7 +152,7 @@ def __init__(
151152
self.bits = bits
152153
self.encoding = encoding
153154
self.material = material
154-
super(ManualKeySpec, self).__init__(encrypt, decrypt)
155+
super(ManualKeySpec, self).__init__(encrypt, decrypt, key_id)
155156

156157
@property
157158
def raw_material(self):
@@ -183,6 +184,7 @@ def manifest_spec(self):
183184
"bits": self.bits,
184185
"encoding": self.encoding,
185186
"material": self.material,
187+
"key-id": self.key_id
186188
}
187189

188190

@@ -194,6 +196,7 @@ def key_from_manifest_spec(key_spec):
194196
:return: Loaded key
195197
:rtype: KeySpec
196198
"""
199+
key_id = key_spec["key-id"] # type: str
197200
decrypt = key_spec["decrypt"] # type: bool
198201
encrypt = key_spec["encrypt"] # type: bool
199202
type_name = key_spec["type"] # type: str
@@ -206,6 +209,7 @@ def key_from_manifest_spec(key_spec):
206209
encoding = key_spec["encoding"] # type: str
207210
material = key_spec["material"] # type: str
208211
return ManualKeySpec(
212+
key_id=key_id,
209213
encrypt=encrypt,
210214
decrypt=decrypt,
211215
type_name=type_name,

test_vector_handlers/src/awses_test_vectors/manifests/master_key.py

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,15 @@
5050
"rsa/pkcs1": WrappingAlgorithm.RSA_PKCS1,
5151
"rsa/oaep-mgf1/sha1": WrappingAlgorithm.RSA_OAEP_SHA1_MGF1,
5252
"rsa/oaep-mgf1/sha256": WrappingAlgorithm.RSA_OAEP_SHA256_MGF1,
53-
# \/ not yet implemented \/
54-
# 'rsa/oaep-mgf1/sha384': WrappingAlgorithm.RSA_OAEP_SHA384_MGF1,
55-
# 'rsa/oaep-mgf1/sha512': WrappingAlgorithm.RSA_OAEP_SHA512_MGF1,
5653
}
57-
_NOT_YET_IMPLEMENTED = {"rsa/oaep-mgf1/sha384", "rsa/oaep-mgf1/sha512"}
54+
try:
55+
_RAW_WRAPPING_KEY_ALGORITHMS.update({
56+
'rsa/oaep-mgf1/sha384': WrappingAlgorithm.RSA_OAEP_SHA384_MGF1,
57+
'rsa/oaep-mgf1/sha512': WrappingAlgorithm.RSA_OAEP_SHA512_MGF1,
58+
})
59+
_NOT_YET_IMPLEMENTED = {}
60+
except AttributeError:
61+
_NOT_YET_IMPLEMENTED = {"rsa/oaep-mgf1/sha384", "rsa/oaep-mgf1/sha512"}
5862
_RAW_ENCRYPTION_KEY_TYPE = {
5963
"symmetric": EncryptionKeyType.SYMMETRIC,
6064
"private": EncryptionKeyType.PRIVATE,
@@ -68,18 +72,16 @@ class MasterKeySpec(object):
6872
6973
Described in AWS Crypto Tools Test Vector Framework features #0003 and #0004.
7074
71-
:param str type_name:
72-
:param str key_name:
73-
:param str key_id:
74-
:param str provider_id:
75-
:param str encryption_algorithm:
76-
:param str padding_algorithm:
77-
:param str padding_hash:
75+
:param str type_name: Master key type name
76+
:param str key_name: Name of key in keys spec
77+
:param str provider_id: Master key provider ID
78+
:param str encryption_algorithm: Wrapping key encryption algorithm (required for raw master keys)
79+
:param str padding_algorithm: Wrapping key padding algorithm (required for raw master keys)
80+
:param str padding_hash: Wrapping key padding hash (required for raw master keys)
7881
"""
7982

8083
type_name = attr.ib(validator=membership_validator(KNOWN_TYPES))
8184
key_name = attr.ib(validator=attr.validators.instance_of(six.string_types))
82-
key_id = attr.ib(validator=attr.validators.optional(attr.validators.instance_of(six.string_types)))
8385
provider_id = attr.ib(validator=attr.validators.optional(attr.validators.instance_of(six.string_types)))
8486
encryption_algorithm = attr.ib(validator=attr.validators.optional(membership_validator(KNOWN_ALGORITHMS)))
8587
padding_algorithm = attr.ib(validator=attr.validators.optional(membership_validator(KNOWN_PADDING)))
@@ -113,7 +115,6 @@ def from_scenario(cls, spec):
113115
return cls(
114116
type_name=spec["type"],
115117
key_name=spec["key"],
116-
key_id=spec.get("key-id"),
117118
provider_id=spec.get("provider-id"),
118119
encryption_algorithm=spec.get("encryption-algorithm"),
119120
padding_algorithm=spec.get("padding-algorithm"),
@@ -166,19 +167,6 @@ def _wrapping_key(self, key_spec):
166167
key_type = _RAW_ENCRYPTION_KEY_TYPE[key_spec.type_name]
167168
return WrappingKey(wrapping_algorithm=algorithm, wrapping_key=material, wrapping_key_type=key_type)
168169

169-
def _raw_key_id(self):
170-
# type: () -> str
171-
"""Determine the key ID value if this is a raw master key.
172-
173-
:returns: Correct key ID
174-
:rtype: str
175-
:raises TypeError: if this is not a raw master key specification
176-
"""
177-
if not self.type_name == "raw":
178-
raise TypeError("This is not a raw master key")
179-
180-
return self.key_id if self.key_id is not None else self.key_name
181-
182170
def _raw_master_key_from_spec(self, key_spec):
183171
# type: (KeySpec) -> RawMasterKey
184172
"""Build a raw master key using this specification.
@@ -192,8 +180,7 @@ def _raw_master_key_from_spec(self, key_spec):
192180
raise TypeError("This is not a raw master key")
193181

194182
wrapping_key = self._wrapping_key(key_spec)
195-
key_id = self._raw_key_id()
196-
return RawMasterKey(provider_id=self.provider_id, key_id=key_id, wrapping_key=wrapping_key)
183+
return RawMasterKey(provider_id=self.provider_id, key_id=key_spec.key_id, wrapping_key=wrapping_key)
197184

198185
def _kms_master_key_from_spec(self, key_spec):
199186
# type: (KeySpec) -> KMSMasterKey
@@ -207,9 +194,6 @@ def _kms_master_key_from_spec(self, key_spec):
207194
if not self.type_name == "aws-kms":
208195
raise TypeError("This is not an AWS KMS master key")
209196

210-
if self.key_id is not None and self.key_id != key_spec.key_id:
211-
raise ValueError("AWS KMS key IDs must match between master key spec and key spec")
212-
213197
return KMS_MASTER_KEY_PROVIDER.master_key(key_id=key_spec.key_id)
214198

215199
_MASTER_KEY_LOADERS = {"aws-kms": _kms_master_key_from_spec, "raw": _raw_master_key_from_spec}
@@ -237,7 +221,6 @@ def scenario_spec(self):
237221
if self.type_name != "aws-kms":
238222
spec.update(
239223
{
240-
"key-id": self.key_id,
241224
"provider-id": self.provider_id,
242225
"encryption-algorithm": self.encryption_algorithm,
243226
"padding-algorithm": self.padding_algorithm,

0 commit comments

Comments
 (0)