Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/boto/kms/layer1.py @ 2:6af9afd405e9 draft
"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author | shellac |
---|---|
date | Thu, 14 May 2020 14:56:58 -0400 |
parents | 26e78fe6e8c4 |
children |
comparison
equal
deleted
inserted
replaced
1:75ca89e9b81c | 2:6af9afd405e9 |
---|---|
1 # Copyright (c) 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved | |
2 # | |
3 # Permission is hereby granted, free of charge, to any person obtaining a | |
4 # copy of this software and associated documentation files (the | |
5 # "Software"), to deal in the Software without restriction, including | |
6 # without limitation the rights to use, copy, modify, merge, publish, dis- | |
7 # tribute, sublicense, and/or sell copies of the Software, and to permit | |
8 # persons to whom the Software is furnished to do so, subject to the fol- | |
9 # lowing conditions: | |
10 # | |
11 # The above copyright notice and this permission notice shall be included | |
12 # in all copies or substantial portions of the Software. | |
13 # | |
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | |
16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | |
17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
20 # IN THE SOFTWARE. | |
21 # | |
22 | |
23 import boto | |
24 from boto.compat import json | |
25 from boto.connection import AWSQueryConnection | |
26 from boto.regioninfo import RegionInfo | |
27 from boto.exception import JSONResponseError | |
28 from boto.kms import exceptions | |
29 from boto.compat import six | |
30 import base64 | |
31 | |
32 | |
33 class KMSConnection(AWSQueryConnection): | |
34 """ | |
35 AWS Key Management Service | |
36 AWS Key Management Service (KMS) is an encryption and key | |
37 management web service. This guide describes the KMS actions that | |
38 you can call programmatically. For general information about KMS, | |
39 see (need an address here). For the KMS developer guide, see (need | |
40 address here). | |
41 | |
42 AWS provides SDKs that consist of libraries and sample code for | |
43 various programming languages and platforms (Java, Ruby, .Net, | |
44 iOS, Android, etc.). The SDKs provide a convenient way to create | |
45 programmatic access to KMS and AWS. For example, the SDKs take | |
46 care of tasks such as signing requests (see below), managing | |
47 errors, and retrying requests automatically. For more information | |
48 about the AWS SDKs, including how to download and install them, | |
49 see `Tools for Amazon Web Services`_. | |
50 | |
51 We recommend that you use the AWS SDKs to make programmatic API | |
52 calls to KMS. However, you can also use the KMS Query API to make | |
53 to make direct calls to the KMS web service. | |
54 | |
55 **Signing Requests** | |
56 | |
57 Requests must be signed by using an access key ID and a secret | |
58 access key. We strongly recommend that you do not use your AWS | |
59 account access key ID and secret key for everyday work with KMS. | |
60 Instead, use the access key ID and secret access key for an IAM | |
61 user, or you can use the AWS Security Token Service to generate | |
62 temporary security credentials that you can use to sign requests. | |
63 | |
64 All KMS operations require `Signature Version 4`_. | |
65 | |
66 **Recording API Requests** | |
67 | |
68 KMS supports AWS CloudTrail, a service that records AWS API calls | |
69 and related events for your AWS account and delivers them to an | |
70 Amazon S3 bucket that you specify. By using the information | |
71 collected by CloudTrail, you can determine what requests were made | |
72 to KMS, who made the request, when it was made, and so on. To | |
73 learn more about CloudTrail, including how to turn it on and find | |
74 your log files, see the `AWS CloudTrail User Guide`_ | |
75 | |
76 **Additional Resources** | |
77 | |
78 For more information about credentials and request signing, see | |
79 the following: | |
80 | |
81 | |
82 + `AWS Security Credentials`_. This topic provides general | |
83 information about the types of credentials used for accessing AWS. | |
84 + `AWS Security Token Service`_. This guide describes how to | |
85 create and use temporary security credentials. | |
86 + `Signing AWS API Requests`_. This set of topics walks you | |
87 through the process of signing a request using an access key ID | |
88 and a secret access key. | |
89 """ | |
90 APIVersion = "2014-11-01" | |
91 DefaultRegionName = "us-east-1" | |
92 DefaultRegionEndpoint = "kms.us-east-1.amazonaws.com" | |
93 ServiceName = "KMS" | |
94 TargetPrefix = "TrentService" | |
95 ResponseError = JSONResponseError | |
96 | |
97 _faults = { | |
98 "InvalidGrantTokenException": exceptions.InvalidGrantTokenException, | |
99 "DisabledException": exceptions.DisabledException, | |
100 "LimitExceededException": exceptions.LimitExceededException, | |
101 "DependencyTimeoutException": exceptions.DependencyTimeoutException, | |
102 "InvalidMarkerException": exceptions.InvalidMarkerException, | |
103 "AlreadyExistsException": exceptions.AlreadyExistsException, | |
104 "InvalidCiphertextException": exceptions.InvalidCiphertextException, | |
105 "KeyUnavailableException": exceptions.KeyUnavailableException, | |
106 "InvalidAliasNameException": exceptions.InvalidAliasNameException, | |
107 "UnsupportedOperationException": exceptions.UnsupportedOperationException, | |
108 "InvalidArnException": exceptions.InvalidArnException, | |
109 "KMSInternalException": exceptions.KMSInternalException, | |
110 "InvalidKeyUsageException": exceptions.InvalidKeyUsageException, | |
111 "MalformedPolicyDocumentException": exceptions.MalformedPolicyDocumentException, | |
112 "NotFoundException": exceptions.NotFoundException, | |
113 } | |
114 | |
115 | |
116 def __init__(self, **kwargs): | |
117 region = kwargs.pop('region', None) | |
118 if not region: | |
119 region = RegionInfo(self, self.DefaultRegionName, | |
120 self.DefaultRegionEndpoint) | |
121 | |
122 if 'host' not in kwargs or kwargs['host'] is None: | |
123 kwargs['host'] = region.endpoint | |
124 | |
125 super(KMSConnection, self).__init__(**kwargs) | |
126 self.region = region | |
127 | |
128 def _required_auth_capability(self): | |
129 return ['hmac-v4'] | |
130 | |
131 def create_alias(self, alias_name, target_key_id): | |
132 """ | |
133 Creates a display name for a customer master key. An alias can | |
134 be used to identify a key and should be unique. The console | |
135 enforces a one-to-one mapping between the alias and a key. An | |
136 alias name can contain only alphanumeric characters, forward | |
137 slashes (/), underscores (_), and dashes (-). An alias must | |
138 start with the word "alias" followed by a forward slash | |
139 (alias/). An alias that begins with "aws" after the forward | |
140 slash (alias/aws...) is reserved by Amazon Web Services (AWS). | |
141 | |
142 :type alias_name: string | |
143 :param alias_name: String that contains the display name. Aliases that | |
144 begin with AWS are reserved. | |
145 | |
146 :type target_key_id: string | |
147 :param target_key_id: An identifier of the key for which you are | |
148 creating the alias. This value cannot be another alias. | |
149 | |
150 """ | |
151 params = { | |
152 'AliasName': alias_name, | |
153 'TargetKeyId': target_key_id, | |
154 } | |
155 return self.make_request(action='CreateAlias', | |
156 body=json.dumps(params)) | |
157 | |
158 def create_grant(self, key_id, grantee_principal, | |
159 retiring_principal=None, operations=None, | |
160 constraints=None, grant_tokens=None): | |
161 """ | |
162 Adds a grant to a key to specify who can access the key and | |
163 under what conditions. Grants are alternate permission | |
164 mechanisms to key policies. If absent, access to the key is | |
165 evaluated based on IAM policies attached to the user. By | |
166 default, grants do not expire. Grants can be listed, retired, | |
167 or revoked as indicated by the following APIs. Typically, when | |
168 you are finished using a grant, you retire it. When you want | |
169 to end a grant immediately, revoke it. For more information | |
170 about grants, see `Grants`_. | |
171 | |
172 #. ListGrants | |
173 #. RetireGrant | |
174 #. RevokeGrant | |
175 | |
176 :type key_id: string | |
177 :param key_id: A unique key identifier for a customer master key. This | |
178 value can be a globally unique identifier, an ARN, or an alias. | |
179 | |
180 :type grantee_principal: string | |
181 :param grantee_principal: Principal given permission by the grant to | |
182 use the key identified by the `keyId` parameter. | |
183 | |
184 :type retiring_principal: string | |
185 :param retiring_principal: Principal given permission to retire the | |
186 grant. For more information, see RetireGrant. | |
187 | |
188 :type operations: list | |
189 :param operations: List of operations permitted by the grant. This can | |
190 be any combination of one or more of the following values: | |
191 | |
192 #. Decrypt | |
193 #. Encrypt | |
194 #. GenerateDataKey | |
195 #. GenerateDataKeyWithoutPlaintext | |
196 #. ReEncryptFrom | |
197 #. ReEncryptTo | |
198 #. CreateGrant | |
199 | |
200 :type constraints: dict | |
201 :param constraints: Specifies the conditions under which the actions | |
202 specified by the `Operations` parameter are allowed. | |
203 | |
204 :type grant_tokens: list | |
205 :param grant_tokens: List of grant tokens. | |
206 | |
207 """ | |
208 params = { | |
209 'KeyId': key_id, | |
210 'GranteePrincipal': grantee_principal, | |
211 } | |
212 if retiring_principal is not None: | |
213 params['RetiringPrincipal'] = retiring_principal | |
214 if operations is not None: | |
215 params['Operations'] = operations | |
216 if constraints is not None: | |
217 params['Constraints'] = constraints | |
218 if grant_tokens is not None: | |
219 params['GrantTokens'] = grant_tokens | |
220 return self.make_request(action='CreateGrant', | |
221 body=json.dumps(params)) | |
222 | |
223 def create_key(self, policy=None, description=None, key_usage=None): | |
224 """ | |
225 Creates a customer master key. Customer master keys can be | |
226 used to encrypt small amounts of data (less than 4K) directly, | |
227 but they are most commonly used to encrypt or envelope data | |
228 keys that are then used to encrypt customer data. For more | |
229 information about data keys, see GenerateDataKey and | |
230 GenerateDataKeyWithoutPlaintext. | |
231 | |
232 :type policy: string | |
233 :param policy: Policy to be attached to the key. This is required and | |
234 delegates back to the account. The key is the root of trust. | |
235 | |
236 :type description: string | |
237 :param description: Description of the key. We recommend that you | |
238 choose a description that helps your customer decide whether the | |
239 key is appropriate for a task. | |
240 | |
241 :type key_usage: string | |
242 :param key_usage: Specifies the intended use of the key. Currently this | |
243 defaults to ENCRYPT/DECRYPT, and only symmetric encryption and | |
244 decryption are supported. | |
245 | |
246 """ | |
247 params = {} | |
248 if policy is not None: | |
249 params['Policy'] = policy | |
250 if description is not None: | |
251 params['Description'] = description | |
252 if key_usage is not None: | |
253 params['KeyUsage'] = key_usage | |
254 return self.make_request(action='CreateKey', | |
255 body=json.dumps(params)) | |
256 | |
257 def decrypt(self, ciphertext_blob, encryption_context=None, | |
258 grant_tokens=None): | |
259 """ | |
260 Decrypts ciphertext. Ciphertext is plaintext that has been | |
261 previously encrypted by using the Encrypt function. | |
262 | |
263 :type ciphertext_blob: blob | |
264 :param ciphertext_blob: Ciphertext including metadata. | |
265 | |
266 :type encryption_context: map | |
267 :param encryption_context: The encryption context. If this was | |
268 specified in the Encrypt function, it must be specified here or the | |
269 decryption operation will fail. For more information, see | |
270 `Encryption Context`_. | |
271 | |
272 :type grant_tokens: list | |
273 :param grant_tokens: A list of grant tokens that represent grants which | |
274 can be used to provide long term permissions to perform decryption. | |
275 | |
276 """ | |
277 if not isinstance(ciphertext_blob, six.binary_type): | |
278 raise TypeError( | |
279 "Value of argument ``ciphertext_blob`` " | |
280 "must be of type %s." % six.binary_type) | |
281 ciphertext_blob = base64.b64encode(ciphertext_blob) | |
282 params = {'CiphertextBlob': ciphertext_blob.decode('utf-8'), } | |
283 if encryption_context is not None: | |
284 params['EncryptionContext'] = encryption_context | |
285 if grant_tokens is not None: | |
286 params['GrantTokens'] = grant_tokens | |
287 response = self.make_request(action='Decrypt', | |
288 body=json.dumps(params)) | |
289 if response.get('Plaintext') is not None: | |
290 response['Plaintext'] = base64.b64decode( | |
291 response['Plaintext'].encode('utf-8')) | |
292 return response | |
293 | |
294 def delete_alias(self, alias_name): | |
295 """ | |
296 Deletes the specified alias. | |
297 | |
298 :type alias_name: string | |
299 :param alias_name: The alias to be deleted. | |
300 | |
301 """ | |
302 params = {'AliasName': alias_name, } | |
303 return self.make_request(action='DeleteAlias', | |
304 body=json.dumps(params)) | |
305 | |
306 def describe_key(self, key_id): | |
307 """ | |
308 Provides detailed information about the specified customer | |
309 master key. | |
310 | |
311 :type key_id: string | |
312 :param key_id: Unique identifier of the customer master key to be | |
313 described. This can be an ARN, an alias, or a globally unique | |
314 identifier. | |
315 | |
316 """ | |
317 params = {'KeyId': key_id, } | |
318 return self.make_request(action='DescribeKey', | |
319 body=json.dumps(params)) | |
320 | |
321 def disable_key(self, key_id): | |
322 """ | |
323 Marks a key as disabled, thereby preventing its use. | |
324 | |
325 :type key_id: string | |
326 :param key_id: Unique identifier of the customer master key to be | |
327 disabled. This can be an ARN, an alias, or a globally unique | |
328 identifier. | |
329 | |
330 """ | |
331 params = {'KeyId': key_id, } | |
332 return self.make_request(action='DisableKey', | |
333 body=json.dumps(params)) | |
334 | |
335 def disable_key_rotation(self, key_id): | |
336 """ | |
337 Disables rotation of the specified key. | |
338 | |
339 :type key_id: string | |
340 :param key_id: Unique identifier of the customer master key for which | |
341 rotation is to be disabled. This can be an ARN, an alias, or a | |
342 globally unique identifier. | |
343 | |
344 """ | |
345 params = {'KeyId': key_id, } | |
346 return self.make_request(action='DisableKeyRotation', | |
347 body=json.dumps(params)) | |
348 | |
349 def enable_key(self, key_id): | |
350 """ | |
351 Marks a key as enabled, thereby permitting its use. You can | |
352 have up to 25 enabled keys at one time. | |
353 | |
354 :type key_id: string | |
355 :param key_id: Unique identifier of the customer master key to be | |
356 enabled. This can be an ARN, an alias, or a globally unique | |
357 identifier. | |
358 | |
359 """ | |
360 params = {'KeyId': key_id, } | |
361 return self.make_request(action='EnableKey', | |
362 body=json.dumps(params)) | |
363 | |
364 def enable_key_rotation(self, key_id): | |
365 """ | |
366 Enables rotation of the specified customer master key. | |
367 | |
368 :type key_id: string | |
369 :param key_id: Unique identifier of the customer master key for which | |
370 rotation is to be enabled. This can be an ARN, an alias, or a | |
371 globally unique identifier. | |
372 | |
373 """ | |
374 params = {'KeyId': key_id, } | |
375 return self.make_request(action='EnableKeyRotation', | |
376 body=json.dumps(params)) | |
377 | |
378 def encrypt(self, key_id, plaintext, encryption_context=None, | |
379 grant_tokens=None): | |
380 """ | |
381 Encrypts plaintext into ciphertext by using a customer master | |
382 key. | |
383 | |
384 :type key_id: string | |
385 :param key_id: Unique identifier of the customer master. This can be an | |
386 ARN, an alias, or the Key ID. | |
387 | |
388 :type plaintext: blob | |
389 :param plaintext: Data to be encrypted. | |
390 | |
391 :type encryption_context: map | |
392 :param encryption_context: Name:value pair that specifies the | |
393 encryption context to be used for authenticated encryption. For | |
394 more information, see `Authenticated Encryption`_. | |
395 | |
396 :type grant_tokens: list | |
397 :param grant_tokens: A list of grant tokens that represent grants which | |
398 can be used to provide long term permissions to perform encryption. | |
399 | |
400 """ | |
401 if not isinstance(plaintext, six.binary_type): | |
402 raise TypeError( | |
403 "Value of argument ``plaintext`` " | |
404 "must be of type %s." % six.binary_type) | |
405 plaintext = base64.b64encode(plaintext) | |
406 params = {'KeyId': key_id, 'Plaintext': plaintext.decode('utf-8'), } | |
407 if encryption_context is not None: | |
408 params['EncryptionContext'] = encryption_context | |
409 if grant_tokens is not None: | |
410 params['GrantTokens'] = grant_tokens | |
411 response = self.make_request(action='Encrypt', | |
412 body=json.dumps(params)) | |
413 if response.get('CiphertextBlob') is not None: | |
414 response['CiphertextBlob'] = base64.b64decode( | |
415 response['CiphertextBlob'].encode('utf-8')) | |
416 return response | |
417 | |
418 def generate_data_key(self, key_id, encryption_context=None, | |
419 number_of_bytes=None, key_spec=None, | |
420 grant_tokens=None): | |
421 """ | |
422 Generates a secure data key. Data keys are used to encrypt and | |
423 decrypt data. They are wrapped by customer master keys. | |
424 | |
425 :type key_id: string | |
426 :param key_id: Unique identifier of the key. This can be an ARN, an | |
427 alias, or a globally unique identifier. | |
428 | |
429 :type encryption_context: map | |
430 :param encryption_context: Name/value pair that contains additional | |
431 data to be authenticated during the encryption and decryption | |
432 processes that use the key. This value is logged by AWS CloudTrail | |
433 to provide context around the data encrypted by the key. | |
434 | |
435 :type number_of_bytes: integer | |
436 :param number_of_bytes: Integer that contains the number of bytes to | |
437 generate. Common values are 128, 256, 512, 1024 and so on. 1024 is | |
438 the current limit. | |
439 | |
440 :type key_spec: string | |
441 :param key_spec: Value that identifies the encryption algorithm and key | |
442 size to generate a data key for. Currently this can be AES_128 or | |
443 AES_256. | |
444 | |
445 :type grant_tokens: list | |
446 :param grant_tokens: A list of grant tokens that represent grants which | |
447 can be used to provide long term permissions to generate a key. | |
448 | |
449 """ | |
450 params = {'KeyId': key_id, } | |
451 if encryption_context is not None: | |
452 params['EncryptionContext'] = encryption_context | |
453 if number_of_bytes is not None: | |
454 params['NumberOfBytes'] = number_of_bytes | |
455 if key_spec is not None: | |
456 params['KeySpec'] = key_spec | |
457 if grant_tokens is not None: | |
458 params['GrantTokens'] = grant_tokens | |
459 response = self.make_request(action='GenerateDataKey', | |
460 body=json.dumps(params)) | |
461 if response.get('CiphertextBlob') is not None: | |
462 response['CiphertextBlob'] = base64.b64decode( | |
463 response['CiphertextBlob'].encode('utf-8')) | |
464 if response.get('Plaintext') is not None: | |
465 response['Plaintext'] = base64.b64decode( | |
466 response['Plaintext'].encode('utf-8')) | |
467 return response | |
468 | |
469 def generate_data_key_without_plaintext(self, key_id, | |
470 encryption_context=None, | |
471 key_spec=None, | |
472 number_of_bytes=None, | |
473 grant_tokens=None): | |
474 """ | |
475 Returns a key wrapped by a customer master key without the | |
476 plaintext copy of that key. To retrieve the plaintext, see | |
477 GenerateDataKey. | |
478 | |
479 :type key_id: string | |
480 :param key_id: Unique identifier of the key. This can be an ARN, an | |
481 alias, or a globally unique identifier. | |
482 | |
483 :type encryption_context: map | |
484 :param encryption_context: Name:value pair that contains additional | |
485 data to be authenticated during the encryption and decryption | |
486 processes. | |
487 | |
488 :type key_spec: string | |
489 :param key_spec: Value that identifies the encryption algorithm and key | |
490 size. Currently this can be AES_128 or AES_256. | |
491 | |
492 :type number_of_bytes: integer | |
493 :param number_of_bytes: Integer that contains the number of bytes to | |
494 generate. Common values are 128, 256, 512, 1024 and so on. | |
495 | |
496 :type grant_tokens: list | |
497 :param grant_tokens: A list of grant tokens that represent grants which | |
498 can be used to provide long term permissions to generate a key. | |
499 | |
500 """ | |
501 params = {'KeyId': key_id, } | |
502 if encryption_context is not None: | |
503 params['EncryptionContext'] = encryption_context | |
504 if key_spec is not None: | |
505 params['KeySpec'] = key_spec | |
506 if number_of_bytes is not None: | |
507 params['NumberOfBytes'] = number_of_bytes | |
508 if grant_tokens is not None: | |
509 params['GrantTokens'] = grant_tokens | |
510 response = self.make_request(action='GenerateDataKeyWithoutPlaintext', | |
511 body=json.dumps(params)) | |
512 if response.get('CiphertextBlob') is not None: | |
513 response['CiphertextBlob'] = base64.b64decode( | |
514 response['CiphertextBlob'].encode('utf-8')) | |
515 return response | |
516 | |
517 def generate_random(self, number_of_bytes=None): | |
518 """ | |
519 Generates an unpredictable byte string. | |
520 | |
521 :type number_of_bytes: integer | |
522 :param number_of_bytes: Integer that contains the number of bytes to | |
523 generate. Common values are 128, 256, 512, 1024 and so on. The | |
524 current limit is 1024 bytes. | |
525 | |
526 """ | |
527 params = {} | |
528 if number_of_bytes is not None: | |
529 params['NumberOfBytes'] = number_of_bytes | |
530 response = self.make_request(action='GenerateRandom', | |
531 body=json.dumps(params)) | |
532 if response.get('Plaintext') is not None: | |
533 response['Plaintext'] = base64.b64decode( | |
534 response['Plaintext'].encode('utf-8')) | |
535 return response | |
536 | |
537 def get_key_policy(self, key_id, policy_name): | |
538 """ | |
539 Retrieves a policy attached to the specified key. | |
540 | |
541 :type key_id: string | |
542 :param key_id: Unique identifier of the key. This can be an ARN, an | |
543 alias, or a globally unique identifier. | |
544 | |
545 :type policy_name: string | |
546 :param policy_name: String that contains the name of the policy. | |
547 Currently, this must be "default". Policy names can be discovered | |
548 by calling ListKeyPolicies. | |
549 | |
550 """ | |
551 params = {'KeyId': key_id, 'PolicyName': policy_name, } | |
552 return self.make_request(action='GetKeyPolicy', | |
553 body=json.dumps(params)) | |
554 | |
555 def get_key_rotation_status(self, key_id): | |
556 """ | |
557 Retrieves a Boolean value that indicates whether key rotation | |
558 is enabled for the specified key. | |
559 | |
560 :type key_id: string | |
561 :param key_id: Unique identifier of the key. This can be an ARN, an | |
562 alias, or a globally unique identifier. | |
563 | |
564 """ | |
565 params = {'KeyId': key_id, } | |
566 return self.make_request(action='GetKeyRotationStatus', | |
567 body=json.dumps(params)) | |
568 | |
569 def list_aliases(self, limit=None, marker=None): | |
570 """ | |
571 Lists all of the key aliases in the account. | |
572 | |
573 :type limit: integer | |
574 :param limit: Specify this parameter when paginating results to | |
575 indicate the maximum number of aliases you want in each response. | |
576 If there are additional aliases beyond the maximum you specify, the | |
577 `Truncated` response element will be set to `true.` | |
578 | |
579 :type marker: string | |
580 :param marker: Use this parameter when paginating results, and only in | |
581 a subsequent request after you've received a response where the | |
582 results are truncated. Set it to the value of the `NextMarker` | |
583 element in the response you just received. | |
584 | |
585 """ | |
586 params = {} | |
587 if limit is not None: | |
588 params['Limit'] = limit | |
589 if marker is not None: | |
590 params['Marker'] = marker | |
591 return self.make_request(action='ListAliases', | |
592 body=json.dumps(params)) | |
593 | |
594 def list_grants(self, key_id, limit=None, marker=None): | |
595 """ | |
596 List the grants for a specified key. | |
597 | |
598 :type key_id: string | |
599 :param key_id: Unique identifier of the key. This can be an ARN, an | |
600 alias, or a globally unique identifier. | |
601 | |
602 :type limit: integer | |
603 :param limit: Specify this parameter only when paginating results to | |
604 indicate the maximum number of grants you want listed in the | |
605 response. If there are additional grants beyond the maximum you | |
606 specify, the `Truncated` response element will be set to `true.` | |
607 | |
608 :type marker: string | |
609 :param marker: Use this parameter only when paginating results, and | |
610 only in a subsequent request after you've received a response where | |
611 the results are truncated. Set it to the value of the `NextMarker` | |
612 in the response you just received. | |
613 | |
614 """ | |
615 params = {'KeyId': key_id, } | |
616 if limit is not None: | |
617 params['Limit'] = limit | |
618 if marker is not None: | |
619 params['Marker'] = marker | |
620 return self.make_request(action='ListGrants', | |
621 body=json.dumps(params)) | |
622 | |
623 def list_key_policies(self, key_id, limit=None, marker=None): | |
624 """ | |
625 Retrieves a list of policies attached to a key. | |
626 | |
627 :type key_id: string | |
628 :param key_id: Unique identifier of the key. This can be an ARN, an | |
629 alias, or a globally unique identifier. | |
630 | |
631 :type limit: integer | |
632 :param limit: Specify this parameter only when paginating results to | |
633 indicate the maximum number of policies you want listed in the | |
634 response. If there are additional policies beyond the maximum you | |
635 specify, the `Truncated` response element will be set to `true.` | |
636 | |
637 :type marker: string | |
638 :param marker: Use this parameter only when paginating results, and | |
639 only in a subsequent request after you've received a response where | |
640 the results are truncated. Set it to the value of the `NextMarker` | |
641 in the response you just received. | |
642 | |
643 """ | |
644 params = {'KeyId': key_id, } | |
645 if limit is not None: | |
646 params['Limit'] = limit | |
647 if marker is not None: | |
648 params['Marker'] = marker | |
649 return self.make_request(action='ListKeyPolicies', | |
650 body=json.dumps(params)) | |
651 | |
652 def list_keys(self, limit=None, marker=None): | |
653 """ | |
654 Lists the customer master keys. | |
655 | |
656 :type limit: integer | |
657 :param limit: Specify this parameter only when paginating results to | |
658 indicate the maximum number of keys you want listed in the | |
659 response. If there are additional keys beyond the maximum you | |
660 specify, the `Truncated` response element will be set to `true.` | |
661 | |
662 :type marker: string | |
663 :param marker: Use this parameter only when paginating results, and | |
664 only in a subsequent request after you've received a response where | |
665 the results are truncated. Set it to the value of the `NextMarker` | |
666 in the response you just received. | |
667 | |
668 """ | |
669 params = {} | |
670 if limit is not None: | |
671 params['Limit'] = limit | |
672 if marker is not None: | |
673 params['Marker'] = marker | |
674 return self.make_request(action='ListKeys', | |
675 body=json.dumps(params)) | |
676 | |
677 def put_key_policy(self, key_id, policy_name, policy): | |
678 """ | |
679 Attaches a policy to the specified key. | |
680 | |
681 :type key_id: string | |
682 :param key_id: Unique identifier of the key. This can be an ARN, an | |
683 alias, or a globally unique identifier. | |
684 | |
685 :type policy_name: string | |
686 :param policy_name: Name of the policy to be attached. Currently, the | |
687 only supported name is "default". | |
688 | |
689 :type policy: string | |
690 :param policy: The policy, in JSON format, to be attached to the key. | |
691 | |
692 """ | |
693 params = { | |
694 'KeyId': key_id, | |
695 'PolicyName': policy_name, | |
696 'Policy': policy, | |
697 } | |
698 return self.make_request(action='PutKeyPolicy', | |
699 body=json.dumps(params)) | |
700 | |
701 def re_encrypt(self, ciphertext_blob, destination_key_id, | |
702 source_encryption_context=None, | |
703 destination_encryption_context=None, grant_tokens=None): | |
704 """ | |
705 Encrypts data on the server side with a new customer master | |
706 key without exposing the plaintext of the data on the client | |
707 side. The data is first decrypted and then encrypted. This | |
708 operation can also be used to change the encryption context of | |
709 a ciphertext. | |
710 | |
711 :type ciphertext_blob: blob | |
712 :param ciphertext_blob: Ciphertext of the data to re-encrypt. | |
713 | |
714 :type source_encryption_context: map | |
715 :param source_encryption_context: Encryption context used to encrypt | |
716 and decrypt the data specified in the `CiphertextBlob` parameter. | |
717 | |
718 :type destination_key_id: string | |
719 :param destination_key_id: Key identifier of the key used to re-encrypt | |
720 the data. | |
721 | |
722 :type destination_encryption_context: map | |
723 :param destination_encryption_context: Encryption context to be used | |
724 when the data is re-encrypted. | |
725 | |
726 :type grant_tokens: list | |
727 :param grant_tokens: Grant tokens that identify the grants that have | |
728 permissions for the encryption and decryption process. | |
729 | |
730 """ | |
731 if not isinstance(ciphertext_blob, six.binary_type): | |
732 raise TypeError( | |
733 "Value of argument ``ciphertext_blob`` " | |
734 "must be of type %s." % six.binary_type) | |
735 ciphertext_blob = base64.b64encode(ciphertext_blob) | |
736 params = { | |
737 'CiphertextBlob': ciphertext_blob, | |
738 'DestinationKeyId': destination_key_id, | |
739 } | |
740 if source_encryption_context is not None: | |
741 params['SourceEncryptionContext'] = source_encryption_context | |
742 if destination_encryption_context is not None: | |
743 params['DestinationEncryptionContext'] = destination_encryption_context | |
744 if grant_tokens is not None: | |
745 params['GrantTokens'] = grant_tokens | |
746 response = self.make_request(action='ReEncrypt', | |
747 body=json.dumps(params)) | |
748 if response.get('CiphertextBlob') is not None: | |
749 response['CiphertextBlob'] = base64.b64decode( | |
750 response['CiphertextBlob'].encode('utf-8')) | |
751 return response | |
752 | |
753 def retire_grant(self, grant_token): | |
754 """ | |
755 Retires a grant. You can retire a grant when you're done using | |
756 it to clean up. You should revoke a grant when you intend to | |
757 actively deny operations that depend on it. | |
758 | |
759 :type grant_token: string | |
760 :param grant_token: Token that identifies the grant to be retired. | |
761 | |
762 """ | |
763 params = {'GrantToken': grant_token, } | |
764 return self.make_request(action='RetireGrant', | |
765 body=json.dumps(params)) | |
766 | |
767 def revoke_grant(self, key_id, grant_id): | |
768 """ | |
769 Revokes a grant. You can revoke a grant to actively deny | |
770 operations that depend on it. | |
771 | |
772 :type key_id: string | |
773 :param key_id: Unique identifier of the key associated with the grant. | |
774 | |
775 :type grant_id: string | |
776 :param grant_id: Identifier of the grant to be revoked. | |
777 | |
778 """ | |
779 params = {'KeyId': key_id, 'GrantId': grant_id, } | |
780 return self.make_request(action='RevokeGrant', | |
781 body=json.dumps(params)) | |
782 | |
783 def update_key_description(self, key_id, description): | |
784 """ | |
785 | |
786 | |
787 :type key_id: string | |
788 :param key_id: | |
789 | |
790 :type description: string | |
791 :param description: | |
792 | |
793 """ | |
794 params = {'KeyId': key_id, 'Description': description, } | |
795 return self.make_request(action='UpdateKeyDescription', | |
796 body=json.dumps(params)) | |
797 | |
798 def make_request(self, action, body): | |
799 headers = { | |
800 'X-Amz-Target': '%s.%s' % (self.TargetPrefix, action), | |
801 'Host': self.region.endpoint, | |
802 'Content-Type': 'application/x-amz-json-1.1', | |
803 'Content-Length': str(len(body)), | |
804 } | |
805 http_request = self.build_base_http_request( | |
806 method='POST', path='/', auth_path='/', params={}, | |
807 headers=headers, data=body) | |
808 response = self._mexe(http_request, sender=None, | |
809 override_num_retries=10) | |
810 response_body = response.read().decode('utf-8') | |
811 boto.log.debug(response_body) | |
812 if response.status == 200: | |
813 if response_body: | |
814 return json.loads(response_body) | |
815 else: | |
816 json_body = json.loads(response_body) | |
817 fault_name = json_body.get('__type', None) | |
818 exception_class = self._faults.get(fault_name, self.ResponseError) | |
819 raise exception_class(response.status, response.reason, | |
820 body=json_body) | |
821 |