Skip to content

Commit 9130c87

Browse files
authored
feat(key_manager): add new methods ImportKeyMaterial and DeleteKeyMaterial (#628)
1 parent dcd9362 commit 9130c87

File tree

8 files changed

+402
-60
lines changed

8 files changed

+402
-60
lines changed

scaleway-async/scaleway_async/key_manager/v1alpha1/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# If you have any remark or suggestion do not hesitate to open an issue.
33
from .types import DataKeyAlgorithmSymmetricEncryption
44
from .types import KeyAlgorithmSymmetricEncryption
5+
from .types import KeyOrigin
56
from .types import KeyState
67
from .types import ListKeysRequestOrderBy
78
from .types import KeyRotationPolicy
@@ -11,13 +12,15 @@
1112
from .types import DataKey
1213
from .types import DecryptRequest
1314
from .types import DecryptResponse
15+
from .types import DeleteKeyMaterialRequest
1416
from .types import DeleteKeyRequest
1517
from .types import DisableKeyRequest
1618
from .types import EnableKeyRequest
1719
from .types import EncryptRequest
1820
from .types import EncryptResponse
1921
from .types import GenerateDataKeyRequest
2022
from .types import GetKeyRequest
23+
from .types import ImportKeyMaterialRequest
2124
from .types import ListKeysRequest
2225
from .types import ListKeysResponse
2326
from .types import ProtectKeyRequest
@@ -29,6 +32,7 @@
2932
__all__ = [
3033
"DataKeyAlgorithmSymmetricEncryption",
3134
"KeyAlgorithmSymmetricEncryption",
35+
"KeyOrigin",
3236
"KeyState",
3337
"ListKeysRequestOrderBy",
3438
"KeyRotationPolicy",
@@ -38,13 +42,15 @@
3842
"DataKey",
3943
"DecryptRequest",
4044
"DecryptResponse",
45+
"DeleteKeyMaterialRequest",
4146
"DeleteKeyRequest",
4247
"DisableKeyRequest",
4348
"EnableKeyRequest",
4449
"EncryptRequest",
4550
"EncryptResponse",
4651
"GenerateDataKeyRequest",
4752
"GetKeyRequest",
53+
"ImportKeyMaterialRequest",
4854
"ListKeysRequest",
4955
"ListKeysResponse",
5056
"ProtectKeyRequest",

scaleway-async/scaleway_async/key_manager/v1alpha1/api.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
)
1414
from .types import (
1515
DataKeyAlgorithmSymmetricEncryption,
16+
KeyOrigin,
1617
ListKeysRequestOrderBy,
1718
CreateKeyRequest,
1819
DataKey,
@@ -21,6 +22,7 @@
2122
EncryptRequest,
2223
EncryptResponse,
2324
GenerateDataKeyRequest,
25+
ImportKeyMaterialRequest,
2426
Key,
2527
KeyRotationPolicy,
2628
KeyUsage,
@@ -37,6 +39,7 @@
3739
marshal_DecryptRequest,
3840
marshal_EncryptRequest,
3941
marshal_GenerateDataKeyRequest,
42+
marshal_ImportKeyMaterialRequest,
4043
marshal_UpdateKeyRequest,
4144
)
4245

@@ -57,6 +60,7 @@ async def create_key(
5760
description: Optional[str] = None,
5861
tags: Optional[List[str]] = None,
5962
rotation_policy: Optional[KeyRotationPolicy] = None,
63+
origin: Optional[KeyOrigin] = None,
6064
) -> Key:
6165
"""
6266
Create a key.
@@ -69,6 +73,7 @@ async def create_key(
6973
:param description: (Optional) Description of the key.
7074
:param tags: (Optional) List of the key's tags.
7175
:param rotation_policy: If not specified, no rotation policy will be applied to the key.
76+
:param origin: Refer to the `Key.Origin` enum for a description of values.
7277
:return: :class:`Key <Key>`
7378
7479
Usage:
@@ -96,6 +101,7 @@ async def create_key(
96101
description=description,
97102
tags=tags,
98103
rotation_policy=rotation_policy,
104+
origin=origin,
99105
),
100106
self.client,
101107
),
@@ -644,3 +650,84 @@ async def decrypt(
644650

645651
self._throw_on_error(res)
646652
return unmarshal_DecryptResponse(res.json())
653+
654+
async def import_key_material(
655+
self,
656+
*,
657+
key_id: str,
658+
key_material: str,
659+
region: Optional[Region] = None,
660+
salt: Optional[str] = None,
661+
) -> Key:
662+
"""
663+
Import key material.
664+
Import key material to use to derive a new cryptographic key. The key's origin must be `external`.
665+
:param key_id: The key's origin must be 'external'.
666+
:param key_material: The key material The key material is a random sequence of bytes used to derive a cryptographic key.
667+
:param region: Region to target. If none is passed will use default region from the config.
668+
:param salt: A salt can be used to improve the quality of randomness when the key material is generated from a low entropy source.
669+
:return: :class:`Key <Key>`
670+
671+
Usage:
672+
::
673+
674+
result = await api.import_key_material(
675+
key_id="example",
676+
key_material="example",
677+
)
678+
"""
679+
680+
param_region = validate_path_param(
681+
"region", region or self.client.default_region
682+
)
683+
param_key_id = validate_path_param("key_id", key_id)
684+
685+
res = self._request(
686+
"POST",
687+
f"/key-manager/v1alpha1/regions/{param_region}/keys/{param_key_id}/import-key-material",
688+
body=marshal_ImportKeyMaterialRequest(
689+
ImportKeyMaterialRequest(
690+
key_id=key_id,
691+
key_material=key_material,
692+
region=region,
693+
salt=salt,
694+
),
695+
self.client,
696+
),
697+
)
698+
699+
self._throw_on_error(res)
700+
return unmarshal_Key(res.json())
701+
702+
async def delete_key_material(
703+
self,
704+
*,
705+
key_id: str,
706+
region: Optional[Region] = None,
707+
) -> None:
708+
"""
709+
Delete key material.
710+
Delete previously imported key material. This renders the associated cryptographic key unusable for any operation. The key's origin must be `external`.
711+
:param key_id: ID of the key of which to delete the key material.
712+
:param region: Region to target. If none is passed will use default region from the config.
713+
714+
Usage:
715+
::
716+
717+
result = await api.delete_key_material(
718+
key_id="example",
719+
)
720+
"""
721+
722+
param_region = validate_path_param(
723+
"region", region or self.client.default_region
724+
)
725+
param_key_id = validate_path_param("key_id", key_id)
726+
727+
res = self._request(
728+
"POST",
729+
f"/key-manager/v1alpha1/regions/{param_region}/keys/{param_key_id}/delete-key-material",
730+
body={},
731+
)
732+
733+
self._throw_on_error(res)

scaleway-async/scaleway_async/key_manager/v1alpha1/marshalling.py

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
DecryptRequest,
2222
EncryptRequest,
2323
GenerateDataKeyRequest,
24+
ImportKeyMaterialRequest,
2425
UpdateKeyRequest,
2526
)
2627

@@ -95,22 +96,6 @@ def unmarshal_Key(data: Any) -> Key:
9596
if field is not None:
9697
args["rotation_count"] = field
9798

98-
field = data.get("protected", None)
99-
if field is not None:
100-
args["protected"] = field
101-
102-
field = data.get("locked", None)
103-
if field is not None:
104-
args["locked"] = field
105-
106-
field = data.get("tags", None)
107-
if field is not None:
108-
args["tags"] = field
109-
110-
field = data.get("region", None)
111-
if field is not None:
112-
args["region"] = field
113-
11499
field = data.get("usage", None)
115100
if field is not None:
116101
args["usage"] = unmarshal_KeyUsage(field)
@@ -129,6 +114,26 @@ def unmarshal_Key(data: Any) -> Key:
129114
else:
130115
args["updated_at"] = None
131116

117+
field = data.get("protected", None)
118+
if field is not None:
119+
args["protected"] = field
120+
121+
field = data.get("locked", None)
122+
if field is not None:
123+
args["locked"] = field
124+
125+
field = data.get("tags", None)
126+
if field is not None:
127+
args["tags"] = field
128+
129+
field = data.get("origin", None)
130+
if field is not None:
131+
args["origin"] = field
132+
133+
field = data.get("region", None)
134+
if field is not None:
135+
args["region"] = field
136+
132137
field = data.get("description", None)
133138
if field is not None:
134139
args["description"] = field
@@ -308,6 +313,9 @@ def marshal_CreateKeyRequest(
308313
request.rotation_policy, defaults
309314
)
310315

316+
if request.origin is not None:
317+
output["origin"] = str(request.origin)
318+
311319
return output
312320

313321

@@ -356,6 +364,21 @@ def marshal_GenerateDataKeyRequest(
356364
return output
357365

358366

367+
def marshal_ImportKeyMaterialRequest(
368+
request: ImportKeyMaterialRequest,
369+
defaults: ProfileDefaults,
370+
) -> Dict[str, Any]:
371+
output: Dict[str, Any] = {}
372+
373+
if request.key_material is not None:
374+
output["key_material"] = request.key_material
375+
376+
if request.salt is not None:
377+
output["salt"] = request.salt
378+
379+
return output
380+
381+
359382
def marshal_UpdateKeyRequest(
360383
request: UpdateKeyRequest,
361384
defaults: ProfileDefaults,

0 commit comments

Comments
 (0)