|
7 | 7 | """
|
8 | 8 | import attr
|
9 | 9 | import six
|
10 |
| -from aws_encryption_sdk.exceptions import IncorrectMasterKeyError, InvalidKeyIdError |
| 10 | +from aws_encryption_sdk.exceptions import InvalidKeyIdError |
11 | 11 | from aws_encryption_sdk.identifiers import EncryptionKeyType, WrappingAlgorithm
|
12 |
| -from aws_encryption_sdk.key_providers.base import MasterKeyProvider, MasterKeyProviderConfig # noqa pylint: disable=unused-import |
| 12 | +from aws_encryption_sdk.key_providers.base import MasterKeyProvider, MasterKeyProviderConfig |
13 | 13 | from aws_encryption_sdk.key_providers.kms import ( # noqa pylint: disable=unused-import
|
14 | 14 | DiscoveryFilter,
|
15 | 15 | KMSMasterKey,
|
|
63 | 63 | "public": EncryptionKeyType.PUBLIC,
|
64 | 64 | }
|
65 | 65 |
|
66 |
| -class TestVectorsMultiMasterKeyProvider(MasterKeyProvider): |
67 |
| - """ |
68 |
| - Provider for other MasterKeyProviders. |
69 |
| - Allows a "multi" MasterKeyProvider for use in test vectors. |
70 |
| -
|
71 |
| - In Python ESDK, MasterKey extends MasterKeyProvider. |
72 |
| - However, MasterKey overrides MasterKeyProvider's `decrypt_data_key` method. |
73 |
| - From AWS ESDK specification: |
74 |
| - "A master key MUST supply itself and MUST NOT supply any other master keys." |
75 |
| - https://github.com/awslabs/aws-encryption-sdk-specification/blob/master/framework/master-key-interface.md#get-master-key |
76 |
| - |
77 |
| -
|
78 |
| - """ |
79 |
| - |
80 |
| - _config_class = MasterKeyProviderConfig |
81 |
| - provider_id = "aws-test-vectors-multi-master-key-provider" |
82 |
| - |
83 |
| - def __init__(self): |
84 |
| - self.key_provider_for_key_id = {} |
85 |
| - |
86 |
| - def add_key(self, key_provider): |
87 |
| - self._members.append(key_provider) |
88 |
| - |
89 |
| - def _new_master_key(self, key_id): |
90 |
| - raise InvalidKeyIdError() |
91 | 66 |
|
92 | 67 | @attr.s
|
93 | 68 | class MasterKeySpec(object): # pylint: disable=too-many-instance-attributes
|
@@ -316,6 +291,44 @@ def scenario_spec(self):
|
316 | 291 | return spec
|
317 | 292 |
|
318 | 293 |
|
| 294 | +class TestVectorsMultiMasterKeyProvider(MasterKeyProvider): |
| 295 | + """ |
| 296 | + Provider for other MasterKeyProviders. |
| 297 | + Acts as a "multi" MasterKeyProvider for use in test vectors. |
| 298 | +
|
| 299 | + There is some disagreement between the spec |
| 300 | + and how Python ESDK implements MasterKey; |
| 301 | + this class fills that gap. |
| 302 | +
|
| 303 | + In the ESDK-Python, MasterKey extends MasterKeyProvider; |
| 304 | + i.e. MasterKey "is a" MasterKeyProvider; isinstance(some_master_key, MasterKeyProvider) == True. |
| 305 | +
|
| 306 | + From AWS ESDK specification: |
| 307 | + "A master key MUST supply itself and MUST NOT supply any other master keys." |
| 308 | + https://github.com/awslabs/aws-encryption-sdk-specification/blob/master/framework/master-key-interface.md#get-master-key |
| 309 | +
|
| 310 | + The MasterKey class overrides MasterKeyProvider's `decrypt_data_key` method to correct this gap. |
| 311 | + However, this modification suggests that this "is a" relationship is not entirely true. |
| 312 | +
|
| 313 | + master_key_provider_from_master_key_specs expects to return a MasterKeyProvider, not a MasterKey. |
| 314 | + master_key_provider_from_master_key_specs uses this class to always return a MasterKeyProvider |
| 315 | + that wraps any MasterKeyProvider or MasterKey loaded from a spec. |
| 316 | + """ |
| 317 | + |
| 318 | + _config_class = MasterKeyProviderConfig |
| 319 | + provider_id = "aws-test-vectors-multi-master-key-provider" |
| 320 | + _members = [] |
| 321 | + |
| 322 | + def add_key(self, key_provider): |
| 323 | + """Add a MKP to the list of configured MKPs.""" |
| 324 | + self._members.append(key_provider) |
| 325 | + |
| 326 | + def _new_master_key(self, key_id): |
| 327 | + # This MKP does not have a key associated with it. |
| 328 | + # ESDK-Python will find keys in _members. |
| 329 | + raise InvalidKeyIdError() |
| 330 | + |
| 331 | + |
319 | 332 | def master_key_provider_from_master_key_specs(keys, master_key_specs):
|
320 | 333 | # type: (KeysManifest, Iterable[MasterKeySpec]) -> MasterKeyProvider
|
321 | 334 | """Build and combine all master key providers identified by the provided specs and
|
|
0 commit comments