diff env/lib/python3.7/site-packages/boto/kms/layer1.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boto/kms/layer1.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,821 +0,0 @@
-# Copyright (c) 2014 Amazon.com, Inc. or its affiliates.  All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish, dis-
-# tribute, sublicense, and/or sell copies of the Software, and to permit
-# persons to whom the Software is furnished to do so, subject to the fol-
-# lowing conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
-#
-
-import boto
-from boto.compat import json
-from boto.connection import AWSQueryConnection
-from boto.regioninfo import RegionInfo
-from boto.exception import JSONResponseError
-from boto.kms import exceptions
-from boto.compat import six
-import base64
-
-
-class KMSConnection(AWSQueryConnection):
-    """
-    AWS Key Management Service
-    AWS Key Management Service (KMS) is an encryption and key
-    management web service. This guide describes the KMS actions that
-    you can call programmatically. For general information about KMS,
-    see (need an address here). For the KMS developer guide, see (need
-    address here).
-
-    AWS provides SDKs that consist of libraries and sample code for
-    various programming languages and platforms (Java, Ruby, .Net,
-    iOS, Android, etc.). The SDKs provide a convenient way to create
-    programmatic access to KMS and AWS. For example, the SDKs take
-    care of tasks such as signing requests (see below), managing
-    errors, and retrying requests automatically. For more information
-    about the AWS SDKs, including how to download and install them,
-    see `Tools for Amazon Web Services`_.
-
-    We recommend that you use the AWS SDKs to make programmatic API
-    calls to KMS. However, you can also use the KMS Query API to make
-    to make direct calls to the KMS web service.
-
-    **Signing Requests**
-
-    Requests must be signed by using an access key ID and a secret
-    access key. We strongly recommend that you do not use your AWS
-    account access key ID and secret key for everyday work with KMS.
-    Instead, use the access key ID and secret access key for an IAM
-    user, or you can use the AWS Security Token Service to generate
-    temporary security credentials that you can use to sign requests.
-
-    All KMS operations require `Signature Version 4`_.
-
-    **Recording API Requests**
-
-    KMS supports AWS CloudTrail, a service that records AWS API calls
-    and related events for your AWS account and delivers them to an
-    Amazon S3 bucket that you specify. By using the information
-    collected by CloudTrail, you can determine what requests were made
-    to KMS, who made the request, when it was made, and so on. To
-    learn more about CloudTrail, including how to turn it on and find
-    your log files, see the `AWS CloudTrail User Guide`_
-
-    **Additional Resources**
-
-    For more information about credentials and request signing, see
-    the following:
-
-
-    + `AWS Security Credentials`_. This topic provides general
-      information about the types of credentials used for accessing AWS.
-    + `AWS Security Token Service`_. This guide describes how to
-      create and use temporary security credentials.
-    + `Signing AWS API Requests`_. This set of topics walks you
-      through the process of signing a request using an access key ID
-      and a secret access key.
-    """
-    APIVersion = "2014-11-01"
-    DefaultRegionName = "us-east-1"
-    DefaultRegionEndpoint = "kms.us-east-1.amazonaws.com"
-    ServiceName = "KMS"
-    TargetPrefix = "TrentService"
-    ResponseError = JSONResponseError
-
-    _faults = {
-        "InvalidGrantTokenException": exceptions.InvalidGrantTokenException,
-        "DisabledException": exceptions.DisabledException,
-        "LimitExceededException": exceptions.LimitExceededException,
-        "DependencyTimeoutException": exceptions.DependencyTimeoutException,
-        "InvalidMarkerException": exceptions.InvalidMarkerException,
-        "AlreadyExistsException": exceptions.AlreadyExistsException,
-        "InvalidCiphertextException": exceptions.InvalidCiphertextException,
-        "KeyUnavailableException": exceptions.KeyUnavailableException,
-        "InvalidAliasNameException": exceptions.InvalidAliasNameException,
-        "UnsupportedOperationException": exceptions.UnsupportedOperationException,
-        "InvalidArnException": exceptions.InvalidArnException,
-        "KMSInternalException": exceptions.KMSInternalException,
-        "InvalidKeyUsageException": exceptions.InvalidKeyUsageException,
-        "MalformedPolicyDocumentException": exceptions.MalformedPolicyDocumentException,
-        "NotFoundException": exceptions.NotFoundException,
-    }
-
-
-    def __init__(self, **kwargs):
-        region = kwargs.pop('region', None)
-        if not region:
-            region = RegionInfo(self, self.DefaultRegionName,
-                                self.DefaultRegionEndpoint)
-
-        if 'host' not in kwargs or kwargs['host'] is None:
-            kwargs['host'] = region.endpoint
-
-        super(KMSConnection, self).__init__(**kwargs)
-        self.region = region
-
-    def _required_auth_capability(self):
-        return ['hmac-v4']
-
-    def create_alias(self, alias_name, target_key_id):
-        """
-        Creates a display name for a customer master key. An alias can
-        be used to identify a key and should be unique. The console
-        enforces a one-to-one mapping between the alias and a key. An
-        alias name can contain only alphanumeric characters, forward
-        slashes (/), underscores (_), and dashes (-). An alias must
-        start with the word "alias" followed by a forward slash
-        (alias/). An alias that begins with "aws" after the forward
-        slash (alias/aws...) is reserved by Amazon Web Services (AWS).
-
-        :type alias_name: string
-        :param alias_name: String that contains the display name. Aliases that
-            begin with AWS are reserved.
-
-        :type target_key_id: string
-        :param target_key_id: An identifier of the key for which you are
-            creating the alias. This value cannot be another alias.
-
-        """
-        params = {
-            'AliasName': alias_name,
-            'TargetKeyId': target_key_id,
-        }
-        return self.make_request(action='CreateAlias',
-                                 body=json.dumps(params))
-
-    def create_grant(self, key_id, grantee_principal,
-                     retiring_principal=None, operations=None,
-                     constraints=None, grant_tokens=None):
-        """
-        Adds a grant to a key to specify who can access the key and
-        under what conditions. Grants are alternate permission
-        mechanisms to key policies. If absent, access to the key is
-        evaluated based on IAM policies attached to the user. By
-        default, grants do not expire. Grants can be listed, retired,
-        or revoked as indicated by the following APIs. Typically, when
-        you are finished using a grant, you retire it. When you want
-        to end a grant immediately, revoke it. For more information
-        about grants, see `Grants`_.
-
-        #. ListGrants
-        #. RetireGrant
-        #. RevokeGrant
-
-        :type key_id: string
-        :param key_id: A unique key identifier for a customer master key. This
-            value can be a globally unique identifier, an ARN, or an alias.
-
-        :type grantee_principal: string
-        :param grantee_principal: Principal given permission by the grant to
-            use the key identified by the `keyId` parameter.
-
-        :type retiring_principal: string
-        :param retiring_principal: Principal given permission to retire the
-            grant. For more information, see RetireGrant.
-
-        :type operations: list
-        :param operations: List of operations permitted by the grant. This can
-            be any combination of one or more of the following values:
-
-        #. Decrypt
-        #. Encrypt
-        #. GenerateDataKey
-        #. GenerateDataKeyWithoutPlaintext
-        #. ReEncryptFrom
-        #. ReEncryptTo
-        #. CreateGrant
-
-        :type constraints: dict
-        :param constraints: Specifies the conditions under which the actions
-            specified by the `Operations` parameter are allowed.
-
-        :type grant_tokens: list
-        :param grant_tokens: List of grant tokens.
-
-        """
-        params = {
-            'KeyId': key_id,
-            'GranteePrincipal': grantee_principal,
-        }
-        if retiring_principal is not None:
-            params['RetiringPrincipal'] = retiring_principal
-        if operations is not None:
-            params['Operations'] = operations
-        if constraints is not None:
-            params['Constraints'] = constraints
-        if grant_tokens is not None:
-            params['GrantTokens'] = grant_tokens
-        return self.make_request(action='CreateGrant',
-                                 body=json.dumps(params))
-
-    def create_key(self, policy=None, description=None, key_usage=None):
-        """
-        Creates a customer master key. Customer master keys can be
-        used to encrypt small amounts of data (less than 4K) directly,
-        but they are most commonly used to encrypt or envelope data
-        keys that are then used to encrypt customer data. For more
-        information about data keys, see GenerateDataKey and
-        GenerateDataKeyWithoutPlaintext.
-
-        :type policy: string
-        :param policy: Policy to be attached to the key. This is required and
-            delegates back to the account. The key is the root of trust.
-
-        :type description: string
-        :param description: Description of the key. We recommend that you
-            choose a description that helps your customer decide whether the
-            key is appropriate for a task.
-
-        :type key_usage: string
-        :param key_usage: Specifies the intended use of the key. Currently this
-            defaults to ENCRYPT/DECRYPT, and only symmetric encryption and
-            decryption are supported.
-
-        """
-        params = {}
-        if policy is not None:
-            params['Policy'] = policy
-        if description is not None:
-            params['Description'] = description
-        if key_usage is not None:
-            params['KeyUsage'] = key_usage
-        return self.make_request(action='CreateKey',
-                                 body=json.dumps(params))
-
-    def decrypt(self, ciphertext_blob, encryption_context=None,
-                grant_tokens=None):
-        """
-        Decrypts ciphertext. Ciphertext is plaintext that has been
-        previously encrypted by using the Encrypt function.
-
-        :type ciphertext_blob: blob
-        :param ciphertext_blob: Ciphertext including metadata.
-
-        :type encryption_context: map
-        :param encryption_context: The encryption context. If this was
-            specified in the Encrypt function, it must be specified here or the
-            decryption operation will fail. For more information, see
-            `Encryption Context`_.
-
-        :type grant_tokens: list
-        :param grant_tokens: A list of grant tokens that represent grants which
-            can be used to provide long term permissions to perform decryption.
-
-        """
-        if not isinstance(ciphertext_blob, six.binary_type):
-            raise TypeError(
-                "Value of argument ``ciphertext_blob`` "
-                "must be of type %s." % six.binary_type)
-        ciphertext_blob = base64.b64encode(ciphertext_blob)
-        params = {'CiphertextBlob': ciphertext_blob.decode('utf-8'), }
-        if encryption_context is not None:
-            params['EncryptionContext'] = encryption_context
-        if grant_tokens is not None:
-            params['GrantTokens'] = grant_tokens
-        response = self.make_request(action='Decrypt',
-                                     body=json.dumps(params))
-        if response.get('Plaintext') is not None:
-            response['Plaintext'] = base64.b64decode(
-                response['Plaintext'].encode('utf-8'))
-        return response
-
-    def delete_alias(self, alias_name):
-        """
-        Deletes the specified alias.
-
-        :type alias_name: string
-        :param alias_name: The alias to be deleted.
-
-        """
-        params = {'AliasName': alias_name, }
-        return self.make_request(action='DeleteAlias',
-                                 body=json.dumps(params))
-
-    def describe_key(self, key_id):
-        """
-        Provides detailed information about the specified customer
-        master key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the customer master key to be
-            described. This can be an ARN, an alias, or a globally unique
-            identifier.
-
-        """
-        params = {'KeyId': key_id, }
-        return self.make_request(action='DescribeKey',
-                                 body=json.dumps(params))
-
-    def disable_key(self, key_id):
-        """
-        Marks a key as disabled, thereby preventing its use.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the customer master key to be
-            disabled. This can be an ARN, an alias, or a globally unique
-            identifier.
-
-        """
-        params = {'KeyId': key_id, }
-        return self.make_request(action='DisableKey',
-                                 body=json.dumps(params))
-
-    def disable_key_rotation(self, key_id):
-        """
-        Disables rotation of the specified key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the customer master key for which
-            rotation is to be disabled. This can be an ARN, an alias, or a
-            globally unique identifier.
-
-        """
-        params = {'KeyId': key_id, }
-        return self.make_request(action='DisableKeyRotation',
-                                 body=json.dumps(params))
-
-    def enable_key(self, key_id):
-        """
-        Marks a key as enabled, thereby permitting its use. You can
-        have up to 25 enabled keys at one time.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the customer master key to be
-            enabled. This can be an ARN, an alias, or a globally unique
-            identifier.
-
-        """
-        params = {'KeyId': key_id, }
-        return self.make_request(action='EnableKey',
-                                 body=json.dumps(params))
-
-    def enable_key_rotation(self, key_id):
-        """
-        Enables rotation of the specified customer master key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the customer master key for which
-            rotation is to be enabled. This can be an ARN, an alias, or a
-            globally unique identifier.
-
-        """
-        params = {'KeyId': key_id, }
-        return self.make_request(action='EnableKeyRotation',
-                                 body=json.dumps(params))
-
-    def encrypt(self, key_id, plaintext, encryption_context=None,
-                grant_tokens=None):
-        """
-        Encrypts plaintext into ciphertext by using a customer master
-        key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the customer master. This can be an
-            ARN, an alias, or the Key ID.
-
-        :type plaintext: blob
-        :param plaintext: Data to be encrypted.
-
-        :type encryption_context: map
-        :param encryption_context: Name:value pair that specifies the
-            encryption context to be used for authenticated encryption. For
-            more information, see `Authenticated Encryption`_.
-
-        :type grant_tokens: list
-        :param grant_tokens: A list of grant tokens that represent grants which
-            can be used to provide long term permissions to perform encryption.
-
-        """
-        if not isinstance(plaintext, six.binary_type):
-            raise TypeError(
-                "Value of argument ``plaintext`` "
-                "must be of type %s." % six.binary_type)
-        plaintext = base64.b64encode(plaintext)
-        params = {'KeyId': key_id, 'Plaintext': plaintext.decode('utf-8'), }
-        if encryption_context is not None:
-            params['EncryptionContext'] = encryption_context
-        if grant_tokens is not None:
-            params['GrantTokens'] = grant_tokens
-        response = self.make_request(action='Encrypt',
-                                     body=json.dumps(params))
-        if response.get('CiphertextBlob') is not None:
-            response['CiphertextBlob'] = base64.b64decode(
-                response['CiphertextBlob'].encode('utf-8'))
-        return response
-
-    def generate_data_key(self, key_id, encryption_context=None,
-                          number_of_bytes=None, key_spec=None,
-                          grant_tokens=None):
-        """
-        Generates a secure data key. Data keys are used to encrypt and
-        decrypt data. They are wrapped by customer master keys.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key. This can be an ARN, an
-            alias, or a globally unique identifier.
-
-        :type encryption_context: map
-        :param encryption_context: Name/value pair that contains additional
-            data to be authenticated during the encryption and decryption
-            processes that use the key. This value is logged by AWS CloudTrail
-            to provide context around the data encrypted by the key.
-
-        :type number_of_bytes: integer
-        :param number_of_bytes: Integer that contains the number of bytes to
-            generate. Common values are 128, 256, 512, 1024 and so on. 1024 is
-            the current limit.
-
-        :type key_spec: string
-        :param key_spec: Value that identifies the encryption algorithm and key
-            size to generate a data key for. Currently this can be AES_128 or
-            AES_256.
-
-        :type grant_tokens: list
-        :param grant_tokens: A list of grant tokens that represent grants which
-            can be used to provide long term permissions to generate a key.
-
-        """
-        params = {'KeyId': key_id, }
-        if encryption_context is not None:
-            params['EncryptionContext'] = encryption_context
-        if number_of_bytes is not None:
-            params['NumberOfBytes'] = number_of_bytes
-        if key_spec is not None:
-            params['KeySpec'] = key_spec
-        if grant_tokens is not None:
-            params['GrantTokens'] = grant_tokens
-        response = self.make_request(action='GenerateDataKey',
-                                     body=json.dumps(params))
-        if response.get('CiphertextBlob') is not None:
-            response['CiphertextBlob'] = base64.b64decode(
-                response['CiphertextBlob'].encode('utf-8'))
-        if response.get('Plaintext') is not None:
-            response['Plaintext'] = base64.b64decode(
-                response['Plaintext'].encode('utf-8'))
-        return response
-
-    def generate_data_key_without_plaintext(self, key_id,
-                                            encryption_context=None,
-                                            key_spec=None,
-                                            number_of_bytes=None,
-                                            grant_tokens=None):
-        """
-        Returns a key wrapped by a customer master key without the
-        plaintext copy of that key. To retrieve the plaintext, see
-        GenerateDataKey.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key. This can be an ARN, an
-            alias, or a globally unique identifier.
-
-        :type encryption_context: map
-        :param encryption_context: Name:value pair that contains additional
-            data to be authenticated during the encryption and decryption
-            processes.
-
-        :type key_spec: string
-        :param key_spec: Value that identifies the encryption algorithm and key
-            size. Currently this can be AES_128 or AES_256.
-
-        :type number_of_bytes: integer
-        :param number_of_bytes: Integer that contains the number of bytes to
-            generate. Common values are 128, 256, 512, 1024 and so on.
-
-        :type grant_tokens: list
-        :param grant_tokens: A list of grant tokens that represent grants which
-            can be used to provide long term permissions to generate a key.
-
-        """
-        params = {'KeyId': key_id, }
-        if encryption_context is not None:
-            params['EncryptionContext'] = encryption_context
-        if key_spec is not None:
-            params['KeySpec'] = key_spec
-        if number_of_bytes is not None:
-            params['NumberOfBytes'] = number_of_bytes
-        if grant_tokens is not None:
-            params['GrantTokens'] = grant_tokens
-        response = self.make_request(action='GenerateDataKeyWithoutPlaintext',
-                                     body=json.dumps(params))
-        if response.get('CiphertextBlob') is not None:
-            response['CiphertextBlob'] = base64.b64decode(
-                response['CiphertextBlob'].encode('utf-8'))
-        return response
-
-    def generate_random(self, number_of_bytes=None):
-        """
-        Generates an unpredictable byte string.
-
-        :type number_of_bytes: integer
-        :param number_of_bytes: Integer that contains the number of bytes to
-            generate. Common values are 128, 256, 512, 1024 and so on. The
-            current limit is 1024 bytes.
-
-        """
-        params = {}
-        if number_of_bytes is not None:
-            params['NumberOfBytes'] = number_of_bytes
-        response = self.make_request(action='GenerateRandom',
-                                     body=json.dumps(params))
-        if response.get('Plaintext') is not None:
-            response['Plaintext'] = base64.b64decode(
-                response['Plaintext'].encode('utf-8'))
-        return response
-
-    def get_key_policy(self, key_id, policy_name):
-        """
-        Retrieves a policy attached to the specified key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key. This can be an ARN, an
-            alias, or a globally unique identifier.
-
-        :type policy_name: string
-        :param policy_name: String that contains the name of the policy.
-            Currently, this must be "default". Policy names can be discovered
-            by calling ListKeyPolicies.
-
-        """
-        params = {'KeyId': key_id, 'PolicyName': policy_name, }
-        return self.make_request(action='GetKeyPolicy',
-                                 body=json.dumps(params))
-
-    def get_key_rotation_status(self, key_id):
-        """
-        Retrieves a Boolean value that indicates whether key rotation
-        is enabled for the specified key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key. This can be an ARN, an
-            alias, or a globally unique identifier.
-
-        """
-        params = {'KeyId': key_id, }
-        return self.make_request(action='GetKeyRotationStatus',
-                                 body=json.dumps(params))
-
-    def list_aliases(self, limit=None, marker=None):
-        """
-        Lists all of the key aliases in the account.
-
-        :type limit: integer
-        :param limit: Specify this parameter when paginating results to
-            indicate the maximum number of aliases you want in each response.
-            If there are additional aliases beyond the maximum you specify, the
-            `Truncated` response element will be set to `true.`
-
-        :type marker: string
-        :param marker: Use this parameter when paginating results, and only in
-            a subsequent request after you've received a response where the
-            results are truncated. Set it to the value of the `NextMarker`
-            element in the response you just received.
-
-        """
-        params = {}
-        if limit is not None:
-            params['Limit'] = limit
-        if marker is not None:
-            params['Marker'] = marker
-        return self.make_request(action='ListAliases',
-                                 body=json.dumps(params))
-
-    def list_grants(self, key_id, limit=None, marker=None):
-        """
-        List the grants for a specified key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key. This can be an ARN, an
-            alias, or a globally unique identifier.
-
-        :type limit: integer
-        :param limit: Specify this parameter only when paginating results to
-            indicate the maximum number of grants you want listed in the
-            response. If there are additional grants beyond the maximum you
-            specify, the `Truncated` response element will be set to `true.`
-
-        :type marker: string
-        :param marker: Use this parameter only when paginating results, and
-            only in a subsequent request after you've received a response where
-            the results are truncated. Set it to the value of the `NextMarker`
-            in the response you just received.
-
-        """
-        params = {'KeyId': key_id, }
-        if limit is not None:
-            params['Limit'] = limit
-        if marker is not None:
-            params['Marker'] = marker
-        return self.make_request(action='ListGrants',
-                                 body=json.dumps(params))
-
-    def list_key_policies(self, key_id, limit=None, marker=None):
-        """
-        Retrieves a list of policies attached to a key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key. This can be an ARN, an
-            alias, or a globally unique identifier.
-
-        :type limit: integer
-        :param limit: Specify this parameter only when paginating results to
-            indicate the maximum number of policies you want listed in the
-            response. If there are additional policies beyond the maximum you
-            specify, the `Truncated` response element will be set to `true.`
-
-        :type marker: string
-        :param marker: Use this parameter only when paginating results, and
-            only in a subsequent request after you've received a response where
-            the results are truncated. Set it to the value of the `NextMarker`
-            in the response you just received.
-
-        """
-        params = {'KeyId': key_id, }
-        if limit is not None:
-            params['Limit'] = limit
-        if marker is not None:
-            params['Marker'] = marker
-        return self.make_request(action='ListKeyPolicies',
-                                 body=json.dumps(params))
-
-    def list_keys(self, limit=None, marker=None):
-        """
-        Lists the customer master keys.
-
-        :type limit: integer
-        :param limit: Specify this parameter only when paginating results to
-            indicate the maximum number of keys you want listed in the
-            response. If there are additional keys beyond the maximum you
-            specify, the `Truncated` response element will be set to `true.`
-
-        :type marker: string
-        :param marker: Use this parameter only when paginating results, and
-            only in a subsequent request after you've received a response where
-            the results are truncated. Set it to the value of the `NextMarker`
-            in the response you just received.
-
-        """
-        params = {}
-        if limit is not None:
-            params['Limit'] = limit
-        if marker is not None:
-            params['Marker'] = marker
-        return self.make_request(action='ListKeys',
-                                 body=json.dumps(params))
-
-    def put_key_policy(self, key_id, policy_name, policy):
-        """
-        Attaches a policy to the specified key.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key. This can be an ARN, an
-            alias, or a globally unique identifier.
-
-        :type policy_name: string
-        :param policy_name: Name of the policy to be attached. Currently, the
-            only supported name is "default".
-
-        :type policy: string
-        :param policy: The policy, in JSON format, to be attached to the key.
-
-        """
-        params = {
-            'KeyId': key_id,
-            'PolicyName': policy_name,
-            'Policy': policy,
-        }
-        return self.make_request(action='PutKeyPolicy',
-                                 body=json.dumps(params))
-
-    def re_encrypt(self, ciphertext_blob, destination_key_id,
-                   source_encryption_context=None,
-                   destination_encryption_context=None, grant_tokens=None):
-        """
-        Encrypts data on the server side with a new customer master
-        key without exposing the plaintext of the data on the client
-        side. The data is first decrypted and then encrypted. This
-        operation can also be used to change the encryption context of
-        a ciphertext.
-
-        :type ciphertext_blob: blob
-        :param ciphertext_blob: Ciphertext of the data to re-encrypt.
-
-        :type source_encryption_context: map
-        :param source_encryption_context: Encryption context used to encrypt
-            and decrypt the data specified in the `CiphertextBlob` parameter.
-
-        :type destination_key_id: string
-        :param destination_key_id: Key identifier of the key used to re-encrypt
-            the data.
-
-        :type destination_encryption_context: map
-        :param destination_encryption_context: Encryption context to be used
-            when the data is re-encrypted.
-
-        :type grant_tokens: list
-        :param grant_tokens: Grant tokens that identify the grants that have
-            permissions for the encryption and decryption process.
-
-        """
-        if not isinstance(ciphertext_blob, six.binary_type):
-            raise TypeError(
-                "Value of argument ``ciphertext_blob`` "
-                "must be of type %s." % six.binary_type)
-        ciphertext_blob = base64.b64encode(ciphertext_blob)
-        params = {
-            'CiphertextBlob': ciphertext_blob,
-            'DestinationKeyId': destination_key_id,
-        }
-        if source_encryption_context is not None:
-            params['SourceEncryptionContext'] = source_encryption_context
-        if destination_encryption_context is not None:
-            params['DestinationEncryptionContext'] = destination_encryption_context
-        if grant_tokens is not None:
-            params['GrantTokens'] = grant_tokens
-        response = self.make_request(action='ReEncrypt',
-                                     body=json.dumps(params))
-        if response.get('CiphertextBlob') is not None:
-            response['CiphertextBlob'] = base64.b64decode(
-                response['CiphertextBlob'].encode('utf-8'))
-        return response
-
-    def retire_grant(self, grant_token):
-        """
-        Retires a grant. You can retire a grant when you're done using
-        it to clean up. You should revoke a grant when you intend to
-        actively deny operations that depend on it.
-
-        :type grant_token: string
-        :param grant_token: Token that identifies the grant to be retired.
-
-        """
-        params = {'GrantToken': grant_token, }
-        return self.make_request(action='RetireGrant',
-                                 body=json.dumps(params))
-
-    def revoke_grant(self, key_id, grant_id):
-        """
-        Revokes a grant. You can revoke a grant to actively deny
-        operations that depend on it.
-
-        :type key_id: string
-        :param key_id: Unique identifier of the key associated with the grant.
-
-        :type grant_id: string
-        :param grant_id: Identifier of the grant to be revoked.
-
-        """
-        params = {'KeyId': key_id, 'GrantId': grant_id, }
-        return self.make_request(action='RevokeGrant',
-                                 body=json.dumps(params))
-
-    def update_key_description(self, key_id, description):
-        """
-        
-
-        :type key_id: string
-        :param key_id:
-
-        :type description: string
-        :param description:
-
-        """
-        params = {'KeyId': key_id, 'Description': description, }
-        return self.make_request(action='UpdateKeyDescription',
-                                 body=json.dumps(params))
-
-    def make_request(self, action, body):
-        headers = {
-            'X-Amz-Target': '%s.%s' % (self.TargetPrefix, action),
-            'Host': self.region.endpoint,
-            'Content-Type': 'application/x-amz-json-1.1',
-            'Content-Length': str(len(body)),
-        }
-        http_request = self.build_base_http_request(
-            method='POST', path='/', auth_path='/', params={},
-            headers=headers, data=body)
-        response = self._mexe(http_request, sender=None,
-                              override_num_retries=10)
-        response_body = response.read().decode('utf-8')
-        boto.log.debug(response_body)
-        if response.status == 200:
-            if response_body:
-                return json.loads(response_body)
-        else:
-            json_body = json.loads(response_body)
-            fault_name = json_body.get('__type', None)
-            exception_class = self._faults.get(fault_name, self.ResponseError)
-            raise exception_class(response.status, response.reason,
-                                  body=json_body)
-