|
| 1 | +KEY_SPECS = %w[RSA_2048 RSA_3072 RSA_4096 ECC_NIST_P256 ECC_NIST_P384 ECC_NIST_P521 ECC_SECG_P256K1].freeze |
| 2 | +SIGNING_ALGORITHMS = %w[RSASSA_PSS_SHA_256 RSASSA_PSS_SHA_384 RSASSA_PSS_SHA_512 RSASSA_PKCS1_V1_5_SHA_256 RSASSA_PKCS1_V1_5_SHA_384 RSASSA_PKCS1_V1_5_SHA_512 ECDSA_SHA_256 ECDSA_SHA_384 ECDSA_SHA_512] |
| 3 | + |
1 | 4 | Shindo.tests('AWS::KMS | key requests', %w[aws kms]) do
|
2 | 5 | key_id = nil
|
3 |
| - public_key = nil |
4 | 6 | pkey = nil
|
5 | 7 | data = 'sign me'
|
6 | 8 |
|
|
41 | 43 | end
|
42 | 44 |
|
43 | 45 | tests('#sign') do
|
44 |
| - sign_response = Fog::AWS[:kms].sign(key_id, data, 'RSASSA_PSS_SHA_256', 'MessageType' => 'RAW').body |
| 46 | + sign_response = Fog::AWS[:kms].sign(key_id, data, 'RSASSA_PKCS1_V1_5_SHA_256', 'MessageType' => 'RAW').body |
45 | 47 |
|
46 | 48 | tests('format').data_matches_schema(AWS::KMS::Formats::SIGN) { sign_response }
|
47 | 49 |
|
48 | 50 | tests('#verify').returns(true) do
|
49 | 51 | signature = Base64.decode64(sign_response['Signature'])
|
50 |
| - pkey.verify('SHA256', signature, data, { rsa_padding_mode: 'pss' }) |
| 52 | + pkey.verify('SHA256', signature, data) |
51 | 53 | end
|
52 | 54 | end
|
53 | 55 |
|
54 |
| - tests('#sign RAW').returns(true) do |
55 |
| - sign_response = Fog::AWS[:kms].sign(key_id, data, 'RSASSA_PSS_SHA_256', 'MessageType' => 'RAW').body |
56 |
| - signature = Base64.decode64(sign_response['Signature']) |
57 |
| - |
58 |
| - pkey.verify('SHA256', signature, data, { rsa_padding_mode: 'pss' }) |
59 |
| - end |
60 |
| - |
61 |
| - tests('#sign DIGEST').returns(true) do |
62 |
| - hash = OpenSSL::Digest.digest('SHA256', data) |
63 |
| - sign_response = Fog::AWS[:kms].sign(key_id, hash, 'RSASSA_PSS_SHA_256', 'MessageType' => 'DIGEST').body |
64 |
| - signature = Base64.decode64(sign_response['Signature']) |
65 |
| - |
66 |
| - pkey.verify_raw('SHA256', signature, hash, { rsa_padding_mode: 'pss' }) |
67 |
| - end |
68 |
| - |
69 | 56 | tests('#schedule_key_deletion').data_matches_schema(AWS::KMS::Formats::SCHEDULE_KEY_DELETION) do
|
70 | 57 | Fog::AWS[:kms].schedule_key_deletion(key_id, 7).body
|
71 | 58 | end
|
| 59 | + |
| 60 | + tests('mock sign') do |
| 61 | + pending unless Fog.mock? |
| 62 | + |
| 63 | + KEY_SPECS.each do |key_spec| |
| 64 | + SIGNING_ALGORITHMS.select { |sa| sa.start_with?(key_spec[0...2]) }.each do |signing_algorithm| |
| 65 | + key_id = Fog::AWS[:kms].create_key( |
| 66 | + 'KeySpec' => key_spec, |
| 67 | + 'KeyUsage' => 'SIGN_VERIFY' |
| 68 | + ).body['KeyMetadata']['KeyId'] |
| 69 | + |
| 70 | + result = Fog::AWS[:kms].get_public_key(key_id).body |
| 71 | + public_key = Base64.decode64(result['PublicKey']) |
| 72 | + pkey = if key_spec.start_with?('RSA') |
| 73 | + OpenSSL::PKey::RSA.new(public_key) |
| 74 | + elsif key_spec.start_with?('EC') |
| 75 | + OpenSSL::PKey::EC.new(public_key) |
| 76 | + end |
| 77 | + sha = "SHA#{signing_algorithm.split('_SHA_').last}" |
| 78 | + sign_opts = if signing_algorithm.include?('_PSS_') |
| 79 | + { rsa_padding_mode: 'pss' } |
| 80 | + else |
| 81 | + {} |
| 82 | + end |
| 83 | + |
| 84 | + tests("#sign #{key_spec} #{signing_algorithm} DIGEST").returns(true) do |
| 85 | + hash = OpenSSL::Digest.digest(sha, data) |
| 86 | + sign_response = Fog::AWS[:kms].sign(key_id, hash, signing_algorithm, 'MessageType' => 'DIGEST').body |
| 87 | + signature = Base64.decode64(sign_response['Signature']) |
| 88 | + |
| 89 | + pkey.verify_raw(sha, signature, hash, sign_opts) |
| 90 | + end |
| 91 | + |
| 92 | + tests("#sign #{key_spec} #{signing_algorithm} RAW").returns(true) do |
| 93 | + sign_response = Fog::AWS[:kms].sign(key_id, data, signing_algorithm, 'MessageType' => 'RAW').body |
| 94 | + signature = Base64.decode64(sign_response['Signature']) |
| 95 | + |
| 96 | + pkey.verify(sha, signature, data, sign_opts) |
| 97 | + end |
| 98 | + end |
| 99 | + end |
| 100 | + end |
72 | 101 | end
|
0 commit comments