2019-09-13 21:08:26 +00:00
# -*- coding: utf-8 -*-
2015-06-30 09:44:39 +00:00
from __future__ import unicode_literals
2019-08-27 20:42:36 +00:00
import base64
import re
2015-06-30 09:44:39 +00:00
import boto . kms
2020-02-19 14:12:13 +00:00
import boto3
2019-09-13 21:08:26 +00:00
import six
2019-08-27 20:42:36 +00:00
import sure # noqa
2015-06-30 09:44:39 +00:00
from boto . exception import JSONResponseError
2015-07-22 15:42:26 +00:00
from boto . kms . exceptions import AlreadyExistsException , NotFoundException
2019-08-27 20:42:36 +00:00
from nose . tools import assert_raises
from parameterized import parameterized
2020-01-16 18:10:38 +00:00
from moto . core . exceptions import JsonRESTError
from moto . kms . models import KmsBackend
2019-04-26 19:52:24 +00:00
from moto . kms . exceptions import NotFoundException as MotoNotFoundException
2020-02-19 14:12:13 +00:00
from moto import mock_kms_deprecated , mock_kms
2019-08-27 20:42:36 +00:00
PLAINTEXT_VECTORS = (
( b " some encodeable plaintext " , ) ,
( b " some unencodeable plaintext \xec \x8a \xcf \xb6 r \xe9 \xb5 \xeb \xff \xa2 3 \x16 " , ) ,
2019-10-31 15:44:26 +00:00
( " some unicode characters ø˚∆øˆˆ∆ßçøˆˆçßøˆ¨¥ " , ) ,
2019-08-27 20:42:36 +00:00
)
2015-06-30 09:44:39 +00:00
2017-02-24 02:37:43 +00:00
2019-09-13 21:08:26 +00:00
def _get_encoded_value ( plaintext ) :
if isinstance ( plaintext , six . binary_type ) :
return plaintext
return plaintext . encode ( " utf-8 " )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-06-30 09:44:39 +00:00
def test_describe_key ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-06-30 09:44:39 +00:00
key = conn . describe_key ( key_id )
2019-08-27 20:42:36 +00:00
key [ " KeyMetadata " ] [ " Description " ] . should . equal ( " my key " )
key [ " KeyMetadata " ] [ " KeyUsage " ] . should . equal ( " ENCRYPT_DECRYPT " )
2015-06-30 09:44:39 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_describe_key_via_alias ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
conn . create_alias (
alias_name = " alias/my-key-alias " , target_key_id = key [ " KeyMetadata " ] [ " KeyId " ]
)
2016-10-02 14:33:59 +00:00
2019-08-27 20:42:36 +00:00
alias_key = conn . describe_key ( " alias/my-key-alias " )
alias_key [ " KeyMetadata " ] [ " Description " ] . should . equal ( " my key " )
alias_key [ " KeyMetadata " ] [ " KeyUsage " ] . should . equal ( " ENCRYPT_DECRYPT " )
alias_key [ " KeyMetadata " ] [ " Arn " ] . should . equal ( key [ " KeyMetadata " ] [ " Arn " ] )
2016-10-02 14:33:59 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_describe_key_via_alias_not_found ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
conn . create_alias (
alias_name = " alias/my-key-alias " , target_key_id = key [ " KeyMetadata " ] [ " KeyId " ]
)
2016-10-02 14:33:59 +00:00
2019-10-31 15:44:26 +00:00
conn . describe_key . when . called_with ( " alias/not-found-alias " ) . should . throw (
NotFoundException
)
2016-10-02 14:33:59 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_describe_key_via_arn ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
arn = key [ " KeyMetadata " ] [ " Arn " ]
2016-10-02 14:33:59 +00:00
the_key = conn . describe_key ( arn )
2019-08-27 20:42:36 +00:00
the_key [ " KeyMetadata " ] [ " Description " ] . should . equal ( " my key " )
the_key [ " KeyMetadata " ] [ " KeyUsage " ] . should . equal ( " ENCRYPT_DECRYPT " )
the_key [ " KeyMetadata " ] [ " KeyId " ] . should . equal ( key [ " KeyMetadata " ] [ " KeyId " ] )
2016-10-02 14:33:59 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-06-30 09:44:39 +00:00
def test_describe_missing_key ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-08-28 06:55:08 +00:00
conn . describe_key . when . called_with ( " not-a-key " ) . should . throw ( NotFoundException )
2015-06-30 09:44:39 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-06-30 09:44:39 +00:00
def test_list_keys ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
conn . create_key (
policy = " my policy " , description = " my key2 " , key_usage = " ENCRYPT_DECRYPT "
)
2015-06-30 09:44:39 +00:00
keys = conn . list_keys ( )
2019-08-27 20:42:36 +00:00
keys [ " Keys " ] . should . have . length_of ( 2 )
2015-07-22 15:42:26 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-24 23:44:55 +00:00
def test_enable_key_rotation ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-11-24 23:44:55 +00:00
conn . enable_key_rotation ( key_id )
2019-08-27 20:42:36 +00:00
conn . get_key_rotation_status ( key_id ) [ " KeyRotationEnabled " ] . should . equal ( True )
2017-02-24 02:37:43 +00:00
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_enable_key_rotation_via_arn ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " Arn " ]
2016-10-02 14:33:59 +00:00
conn . enable_key_rotation ( key_id )
2019-08-27 20:42:36 +00:00
conn . get_key_rotation_status ( key_id ) [ " KeyRotationEnabled " ] . should . equal ( True )
2016-10-02 14:33:59 +00:00
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-24 23:44:55 +00:00
def test_enable_key_rotation_with_missing_key ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
conn . enable_key_rotation . when . called_with ( " not-a-key " ) . should . throw (
NotFoundException
)
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_enable_key_rotation_with_alias_name_should_fail ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
conn . create_alias (
alias_name = " alias/my-key-alias " , target_key_id = key [ " KeyMetadata " ] [ " KeyId " ]
)
2016-10-02 14:33:59 +00:00
2019-08-27 20:42:36 +00:00
alias_key = conn . describe_key ( " alias/my-key-alias " )
alias_key [ " KeyMetadata " ] [ " Arn " ] . should . equal ( key [ " KeyMetadata " ] [ " Arn " ] )
2016-10-02 14:33:59 +00:00
2019-10-31 15:44:26 +00:00
conn . enable_key_rotation . when . called_with ( " alias/my-alias " ) . should . throw (
NotFoundException
)
2016-10-02 14:33:59 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-24 23:44:55 +00:00
def test_disable_key_rotation ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-11-24 23:44:55 +00:00
conn . enable_key_rotation ( key_id )
2019-08-27 20:42:36 +00:00
conn . get_key_rotation_status ( key_id ) [ " KeyRotationEnabled " ] . should . equal ( True )
2015-11-24 23:44:55 +00:00
conn . disable_key_rotation ( key_id )
2019-08-27 20:42:36 +00:00
conn . get_key_rotation_status ( key_id ) [ " KeyRotationEnabled " ] . should . equal ( False )
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2019-08-27 20:42:36 +00:00
def test_generate_data_key ( ) :
2017-02-10 03:36:24 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
key_arn = key [ " KeyMetadata " ] [ " Arn " ]
response = conn . generate_data_key ( key_id = key_id , number_of_bytes = 32 )
# CiphertextBlob must NOT be base64-encoded
with assert_raises ( Exception ) :
base64 . b64decode ( response [ " CiphertextBlob " ] , validate = True )
# Plaintext must NOT be base64-encoded
with assert_raises ( Exception ) :
base64 . b64decode ( response [ " Plaintext " ] , validate = True )
response [ " KeyId " ] . should . equal ( key_arn )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-24 23:44:55 +00:00
def test_disable_key_rotation_with_missing_key ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
conn . disable_key_rotation . when . called_with ( " not-a-key " ) . should . throw (
NotFoundException
)
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-24 23:44:55 +00:00
def test_get_key_rotation_status_with_missing_key ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
conn . get_key_rotation_status . when . called_with ( " not-a-key " ) . should . throw (
NotFoundException
)
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-24 23:44:55 +00:00
def test_get_key_rotation_status ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-11-24 23:44:55 +00:00
2019-08-27 20:42:36 +00:00
conn . get_key_rotation_status ( key_id ) [ " KeyRotationEnabled " ] . should . equal ( False )
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-24 23:44:55 +00:00
def test_create_key_defaults_key_rotation ( ) :
conn = boto . kms . connect_to_region ( " us-west-2 " )
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-11-24 23:44:55 +00:00
2019-08-27 20:42:36 +00:00
conn . get_key_rotation_status ( key_id ) [ " KeyRotationEnabled " ] . should . equal ( False )
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-25 19:50:55 +00:00
def test_get_key_policy ( ) :
2019-08-27 20:42:36 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2015-11-25 19:50:55 +00:00
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-11-25 19:50:55 +00:00
2019-08-27 20:42:36 +00:00
policy = conn . get_key_policy ( key_id , " default " )
policy [ " Policy " ] . should . equal ( " my policy " )
2015-11-25 19:50:55 +00:00
2017-02-24 02:37:43 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_get_key_policy_via_arn ( ) :
2019-08-27 20:42:36 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2016-10-02 14:33:59 +00:00
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
policy = conn . get_key_policy ( key [ " KeyMetadata " ] [ " Arn " ] , " default " )
2016-10-02 14:33:59 +00:00
2019-08-27 20:42:36 +00:00
policy [ " Policy " ] . should . equal ( " my policy " )
2015-11-25 19:50:55 +00:00
2017-02-24 02:37:43 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-25 19:50:55 +00:00
def test_put_key_policy ( ) :
2019-08-27 20:42:36 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2015-11-25 19:50:55 +00:00
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-11-25 19:50:55 +00:00
2019-08-27 20:42:36 +00:00
conn . put_key_policy ( key_id , " default " , " new policy " )
policy = conn . get_key_policy ( key_id , " default " )
policy [ " Policy " ] . should . equal ( " new policy " )
2015-11-25 19:50:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_put_key_policy_via_arn ( ) :
2019-08-27 20:42:36 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2016-10-02 14:33:59 +00:00
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " Arn " ]
2016-10-02 14:33:59 +00:00
2019-08-27 20:42:36 +00:00
conn . put_key_policy ( key_id , " default " , " new policy " )
policy = conn . get_key_policy ( key_id , " default " )
policy [ " Policy " ] . should . equal ( " new policy " )
2016-10-02 14:33:59 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_put_key_policy_via_alias_should_not_update ( ) :
2019-08-27 20:42:36 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2016-10-02 14:33:59 +00:00
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
conn . create_alias (
alias_name = " alias/my-key-alias " , target_key_id = key [ " KeyMetadata " ] [ " KeyId " ]
)
2016-10-02 14:33:59 +00:00
2019-10-31 15:44:26 +00:00
conn . put_key_policy . when . called_with (
" alias/my-key-alias " , " default " , " new policy "
) . should . throw ( NotFoundException )
2016-10-02 14:33:59 +00:00
2019-08-27 20:42:36 +00:00
policy = conn . get_key_policy ( key [ " KeyMetadata " ] [ " KeyId " ] , " default " )
policy [ " Policy " ] . should . equal ( " my policy " )
2016-10-02 14:33:59 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2016-10-02 14:33:59 +00:00
def test_put_key_policy ( ) :
2019-08-27 20:42:36 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2016-10-02 14:33:59 +00:00
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
conn . put_key_policy ( key [ " KeyMetadata " ] [ " Arn " ] , " default " , " new policy " )
2016-10-02 14:33:59 +00:00
2019-08-27 20:42:36 +00:00
policy = conn . get_key_policy ( key [ " KeyMetadata " ] [ " KeyId " ] , " default " )
policy [ " Policy " ] . should . equal ( " new policy " )
2016-10-02 14:33:59 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-25 19:50:55 +00:00
def test_list_key_policies ( ) :
2019-08-27 20:42:36 +00:00
conn = boto . kms . connect_to_region ( " us-west-2 " )
2015-11-25 19:50:55 +00:00
2019-10-31 15:44:26 +00:00
key = conn . create_key (
policy = " my policy " , description = " my key1 " , key_usage = " ENCRYPT_DECRYPT "
)
2019-08-27 20:42:36 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2015-11-25 19:50:55 +00:00
policies = conn . list_key_policies ( key_id )
2019-08-27 20:42:36 +00:00
policies [ " PolicyNames " ] . should . equal ( [ " default " ] )
2015-11-25 19:50:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__returns_none_if_correct ( ) :
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
2015-07-22 15:42:26 +00:00
2019-08-27 20:42:36 +00:00
resp = kms . create_alias ( " alias/my-alias " , key_id )
2015-07-22 15:42:26 +00:00
resp . should . be . none
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__raises_if_reserved_alias ( ) :
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
2015-07-22 15:42:26 +00:00
2019-10-31 15:44:26 +00:00
reserved_aliases = [
" alias/aws/ebs " ,
" alias/aws/s3 " ,
" alias/aws/redshift " ,
" alias/aws/rds " ,
]
2015-07-22 15:42:26 +00:00
for alias_name in reserved_aliases :
with assert_raises ( JSONResponseError ) as err :
kms . create_alias ( alias_name , key_id )
ex = err . exception
ex . error_message . should . be . none
2019-08-27 20:42:36 +00:00
ex . error_code . should . equal ( " NotAuthorizedException " )
ex . body . should . equal ( { " __type " : " NotAuthorizedException " } )
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . status . should . equal ( 400 )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__can_create_multiple_aliases_for_same_key_id ( ) :
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
2015-07-22 15:42:26 +00:00
2019-08-27 20:42:36 +00:00
kms . create_alias ( " alias/my-alias3 " , key_id ) . should . be . none
kms . create_alias ( " alias/my-alias4 " , key_id ) . should . be . none
kms . create_alias ( " alias/my-alias5 " , key_id ) . should . be . none
2015-07-22 15:42:26 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__raises_if_wrong_prefix ( ) :
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
2015-07-22 15:42:26 +00:00
with assert_raises ( JSONResponseError ) as err :
2019-08-27 20:42:36 +00:00
kms . create_alias ( " wrongprefix/my-alias " , key_id )
2015-07-22 15:42:26 +00:00
ex = err . exception
2019-08-27 20:42:36 +00:00
ex . error_message . should . equal ( " Invalid identifier " )
ex . error_code . should . equal ( " ValidationException " )
2019-10-31 15:44:26 +00:00
ex . body . should . equal (
{ " message " : " Invalid identifier " , " __type " : " ValidationException " }
)
2019-08-27 20:42:36 +00:00
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . status . should . equal ( 400 )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__raises_if_duplicate ( ) :
2019-08-27 20:42:36 +00:00
region = " us-west-2 "
2015-07-22 15:42:26 +00:00
kms = boto . kms . connect_to_region ( region )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
alias = " alias/my-alias "
2015-07-22 15:42:26 +00:00
kms . create_alias ( alias , key_id )
with assert_raises ( AlreadyExistsException ) as err :
kms . create_alias ( alias , key_id )
ex = err . exception
2019-08-27 20:42:36 +00:00
ex . error_message . should . match (
2019-10-31 15:44:26 +00:00
r " An alias with the name arn:aws:kms: {region} : \ d {{ 12}}: {alias} already exists " . format (
* * locals ( )
)
2019-08-27 20:42:36 +00:00
)
2015-07-22 15:42:26 +00:00
ex . error_code . should . be . none
ex . box_usage . should . be . none
ex . request_id . should . be . none
2019-08-27 20:42:36 +00:00
ex . body [ " message " ] . should . match (
2019-10-31 15:44:26 +00:00
r " An alias with the name arn:aws:kms: {region} : \ d {{ 12}}: {alias} already exists " . format (
* * locals ( )
)
2019-08-27 20:42:36 +00:00
)
ex . body [ " __type " ] . should . equal ( " AlreadyExistsException " )
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . status . should . equal ( 400 )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__raises_if_alias_has_restricted_characters ( ) :
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
2015-07-22 15:42:26 +00:00
2019-10-31 15:44:26 +00:00
alias_names_with_restricted_characters = [
" alias/my-alias! " ,
" alias/my-alias$ " ,
" alias/my-alias@ " ,
]
2015-07-22 15:42:26 +00:00
for alias_name in alias_names_with_restricted_characters :
with assert_raises ( JSONResponseError ) as err :
kms . create_alias ( alias_name , key_id )
ex = err . exception
2019-08-27 20:42:36 +00:00
ex . body [ " __type " ] . should . equal ( " ValidationException " )
ex . body [ " message " ] . should . equal (
" 1 validation error detected: Value ' {alias_name} ' at ' aliasName ' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-zA-Z0-9:/_-]+$ " . format (
* * locals ( )
)
)
ex . error_code . should . equal ( " ValidationException " )
2017-02-24 02:37:43 +00:00
ex . message . should . equal (
2019-08-27 20:42:36 +00:00
" 1 validation error detected: Value ' {alias_name} ' at ' aliasName ' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-zA-Z0-9:/_-]+$ " . format (
* * locals ( )
)
)
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . status . should . equal ( 400 )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__raises_if_alias_has_colon_character ( ) :
2017-02-24 02:37:43 +00:00
# For some reason, colons are not accepted for an alias, even though they
# are accepted by regex ^[a-zA-Z0-9:/_-]+$
2015-07-22 15:42:26 +00:00
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
2015-07-22 15:42:26 +00:00
2019-08-27 20:42:36 +00:00
alias_names_with_restricted_characters = [ " alias/my:alias " ]
2015-07-22 15:42:26 +00:00
for alias_name in alias_names_with_restricted_characters :
with assert_raises ( JSONResponseError ) as err :
kms . create_alias ( alias_name , key_id )
ex = err . exception
2019-08-27 20:42:36 +00:00
ex . body [ " __type " ] . should . equal ( " ValidationException " )
2019-10-31 15:44:26 +00:00
ex . body [ " message " ] . should . equal (
" {alias_name} contains invalid characters for an alias " . format ( * * locals ( ) )
)
2019-08-27 20:42:36 +00:00
ex . error_code . should . equal ( " ValidationException " )
2019-10-31 15:44:26 +00:00
ex . message . should . equal (
" {alias_name} contains invalid characters for an alias " . format ( * * locals ( ) )
)
2019-08-27 20:42:36 +00:00
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . status . should . equal ( 400 )
2019-10-31 15:44:26 +00:00
@parameterized ( ( ( " alias/my-alias_/ " , ) , ( " alias/my_alias-/ " , ) ) )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2019-08-28 06:52:44 +00:00
def test__create_alias__accepted_characters ( alias_name ) :
2015-07-22 15:42:26 +00:00
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
2015-07-22 15:42:26 +00:00
2019-08-28 06:52:44 +00:00
kms . create_alias ( alias_name , key_id )
2015-07-22 15:42:26 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__create_alias__raises_if_target_key_id_is_existing_alias ( ) :
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
alias = " alias/my-alias "
2015-07-22 15:42:26 +00:00
kms . create_alias ( alias , key_id )
with assert_raises ( JSONResponseError ) as err :
kms . create_alias ( alias , alias )
ex = err . exception
2019-08-27 20:42:36 +00:00
ex . body [ " __type " ] . should . equal ( " ValidationException " )
ex . body [ " message " ] . should . equal ( " Aliases must refer to keys. Not aliases " )
ex . error_code . should . equal ( " ValidationException " )
ex . message . should . equal ( " Aliases must refer to keys. Not aliases " )
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . status . should . equal ( 400 )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__delete_alias ( ) :
kms = boto . connect_kms ( )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
alias = " alias/my-alias "
2015-07-22 15:42:26 +00:00
2017-11-27 10:36:25 +00:00
# added another alias here to make sure that the deletion of the alias can
# be done when there are multiple existing aliases.
another_create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
another_key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
another_alias = " alias/another-alias "
2017-11-27 10:36:25 +00:00
2015-07-22 15:42:26 +00:00
kms . create_alias ( alias , key_id )
2017-11-27 10:36:25 +00:00
kms . create_alias ( another_alias , another_key_id )
2015-07-22 15:42:26 +00:00
resp = kms . delete_alias ( alias )
resp . should . be . none
# we can create the alias again, since it has been deleted
kms . create_alias ( alias , key_id )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__delete_alias__raises_if_wrong_prefix ( ) :
kms = boto . connect_kms ( )
with assert_raises ( JSONResponseError ) as err :
2019-08-27 20:42:36 +00:00
kms . delete_alias ( " wrongprefix/my-alias " )
2015-07-22 15:42:26 +00:00
ex = err . exception
2019-08-27 20:42:36 +00:00
ex . body [ " __type " ] . should . equal ( " ValidationException " )
ex . body [ " message " ] . should . equal ( " Invalid identifier " )
ex . error_code . should . equal ( " ValidationException " )
ex . message . should . equal ( " Invalid identifier " )
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . status . should . equal ( 400 )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__delete_alias__raises_if_alias_is_not_found ( ) :
2019-08-27 20:42:36 +00:00
region = " us-west-2 "
2015-07-22 15:42:26 +00:00
kms = boto . kms . connect_to_region ( region )
2019-08-27 20:42:36 +00:00
alias_name = " alias/unexisting-alias "
2015-07-22 15:42:26 +00:00
with assert_raises ( NotFoundException ) as err :
kms . delete_alias ( alias_name )
2019-08-28 06:52:44 +00:00
expected_message_match = r " Alias arn:aws:kms: {region} :[0-9] {{ 12}}: {alias_name} is not found. " . format (
2019-10-31 15:44:26 +00:00
region = region , alias_name = alias_name
2019-08-28 06:52:44 +00:00
)
2015-07-22 15:42:26 +00:00
ex = err . exception
2019-08-27 20:42:36 +00:00
ex . body [ " __type " ] . should . equal ( " NotFoundException " )
2019-08-28 06:52:44 +00:00
ex . body [ " message " ] . should . match ( expected_message_match )
2015-07-22 15:42:26 +00:00
ex . box_usage . should . be . none
ex . error_code . should . be . none
2019-08-28 06:52:44 +00:00
ex . message . should . match ( expected_message_match )
2019-08-27 20:42:36 +00:00
ex . reason . should . equal ( " Bad Request " )
2015-07-22 15:42:26 +00:00
ex . request_id . should . be . none
ex . status . should . equal ( 400 )
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-07-22 15:42:26 +00:00
def test__list_aliases ( ) :
region = " eu-west-1 "
kms = boto . kms . connect_to_region ( region )
create_resp = kms . create_key ( )
2019-08-27 20:42:36 +00:00
key_id = create_resp [ " KeyMetadata " ] [ " KeyId " ]
kms . create_alias ( " alias/my-alias1 " , key_id )
kms . create_alias ( " alias/my-alias2 " , key_id )
kms . create_alias ( " alias/my-alias3 " , key_id )
2015-07-22 15:42:26 +00:00
resp = kms . list_aliases ( )
2019-08-27 20:42:36 +00:00
resp [ " Truncated " ] . should . be . false
2015-07-22 15:42:26 +00:00
2019-08-27 20:42:36 +00:00
aliases = resp [ " Aliases " ]
2015-07-22 15:42:26 +00:00
def has_correct_arn ( alias_obj ) :
2019-08-27 20:42:36 +00:00
alias_name = alias_obj [ " AliasName " ]
alias_arn = alias_obj [ " AliasArn " ]
return re . match (
2019-10-31 15:44:26 +00:00
r " arn:aws:kms: {region} : \ d {{ 12}}: {alias_name} " . format (
region = region , alias_name = alias_name
) ,
alias_arn ,
2019-08-27 20:42:36 +00:00
)
len (
2019-10-31 15:44:26 +00:00
[
alias
for alias in aliases
if has_correct_arn ( alias ) and " alias/aws/ebs " == alias [ " AliasName " ]
]
) . should . equal ( 1 )
len (
[
alias
for alias in aliases
if has_correct_arn ( alias ) and " alias/aws/rds " == alias [ " AliasName " ]
]
) . should . equal ( 1 )
len (
[
alias
for alias in aliases
if has_correct_arn ( alias ) and " alias/aws/redshift " == alias [ " AliasName " ]
]
) . should . equal ( 1 )
len (
[
alias
for alias in aliases
if has_correct_arn ( alias ) and " alias/aws/s3 " == alias [ " AliasName " ]
]
2019-08-27 20:42:36 +00:00
) . should . equal ( 1 )
len (
2019-10-31 15:44:26 +00:00
[
alias
for alias in aliases
if has_correct_arn ( alias ) and " alias/my-alias1 " == alias [ " AliasName " ]
]
2019-08-27 20:42:36 +00:00
) . should . equal ( 1 )
len (
2019-10-31 15:44:26 +00:00
[
alias
for alias in aliases
if has_correct_arn ( alias ) and " alias/my-alias2 " == alias [ " AliasName " ]
]
2019-08-27 20:42:36 +00:00
) . should . equal ( 1 )
2019-10-31 15:44:26 +00:00
len (
[
alias
for alias in aliases
if " TargetKeyId " in alias and key_id == alias [ " TargetKeyId " ]
]
) . should . equal ( 3 )
2015-07-22 15:42:26 +00:00
len ( aliases ) . should . equal ( 7 )
2015-11-24 23:44:55 +00:00
2017-02-16 03:35:45 +00:00
@mock_kms_deprecated
2015-11-25 19:50:55 +00:00
def test__assert_default_policy ( ) :
from moto . kms . responses import _assert_default_policy
2019-10-31 15:44:26 +00:00
_assert_default_policy . when . called_with ( " not-default " ) . should . throw (
MotoNotFoundException
)
_assert_default_policy . when . called_with ( " default " ) . should_not . throw (
MotoNotFoundException
)
2020-02-18 19:40:34 +00:00
2020-02-19 14:12:13 +00:00
if six . PY2 :
sort = sorted
else :
sort = lambda l : sorted ( l , key = lambda d : d . keys ( ) )
@mock_kms
def test_key_tag_on_create_key_happy ( ) :
2020-02-18 19:40:34 +00:00
client = boto3 . client ( " kms " , region_name = " us-east-1 " )
2020-02-19 14:12:13 +00:00
tags = [
{ " TagKey " : " key1 " , " TagValue " : " value1 " } ,
{ " TagKey " : " key2 " , " TagValue " : " value2 " } ,
]
key = client . create_key ( Description = " test-key-tagging " , Tags = tags )
2020-02-18 19:40:34 +00:00
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
2020-02-19 14:12:13 +00:00
result = client . list_resource_tags ( KeyId = key_id )
actual = result . get ( " Tags " , [ ] )
assert sort ( tags ) == sort ( actual )
client . untag_resource ( KeyId = key_id , TagKeys = [ " key1 " ] )
actual = client . list_resource_tags ( KeyId = key_id ) . get ( " Tags " , [ ] )
expected = [ { " TagKey " : " key2 " , " TagValue " : " value2 " } ]
assert sort ( expected ) == sort ( actual )
@mock_kms
def test_key_tag_added_happy ( ) :
client = boto3 . client ( " kms " , region_name = " us-east-1 " )
key = client . create_key ( Description = " test-key-tagging " )
key_id = key [ " KeyMetadata " ] [ " KeyId " ]
tags = [
{ " TagKey " : " key1 " , " TagValue " : " value1 " } ,
{ " TagKey " : " key2 " , " TagValue " : " value2 " } ,
]
2020-02-18 19:40:34 +00:00
client . tag_resource ( KeyId = key_id , Tags = tags )
result = client . list_resource_tags ( KeyId = key_id )
actual = result . get ( " Tags " , [ ] )
2020-02-19 14:12:13 +00:00
assert sort ( tags ) == sort ( actual )
2020-02-18 19:40:34 +00:00
client . untag_resource ( KeyId = key_id , TagKeys = [ " key1 " ] )
actual = client . list_resource_tags ( KeyId = key_id ) . get ( " Tags " , [ ] )
expected = [ { " TagKey " : " key2 " , " TagValue " : " value2 " } ]
2020-02-19 14:12:13 +00:00
assert sort ( expected ) == sort ( actual )
2020-02-18 19:40:34 +00:00
2020-02-19 15:18:01 +00:00
@mock_kms_deprecated
2020-02-18 19:40:34 +00:00
def test_key_tagging_sad ( ) :
b = KmsBackend ( )
try :
2020-02-19 14:12:13 +00:00
b . tag_resource ( " unknown " , [ ] )
raise " tag_resource should fail if KeyId is not known "
2020-02-18 19:40:34 +00:00
except JsonRESTError :
pass
try :
2020-02-19 14:12:13 +00:00
b . untag_resource ( " unknown " , [ ] )
raise " untag_resource should fail if KeyId is not known "
2020-02-18 19:40:34 +00:00
except JsonRESTError :
pass
try :
2020-02-19 14:12:13 +00:00
b . list_resource_tags ( " unknown " )
raise " list_resource_tags should fail if KeyId is not known "
2020-02-18 19:40:34 +00:00
except JsonRESTError :
pass