|
15 | 15 | package software.amazon.cloudformation.encryption;
|
16 | 16 |
|
17 | 17 | import static org.assertj.core.api.Assertions.assertThat;
|
| 18 | +import static org.assertj.core.api.Assertions.assertThatThrownBy; |
18 | 19 | import static org.mockito.ArgumentMatchers.any;
|
19 | 20 | import static org.mockito.Mockito.lenient;
|
20 | 21 | import com.amazonaws.encryptionsdk.AwsCrypto;
|
21 | 22 | import com.amazonaws.encryptionsdk.CryptoResult;
|
| 23 | +import com.amazonaws.encryptionsdk.exception.AwsCryptoException; |
22 | 24 | import com.amazonaws.encryptionsdk.kms.KmsMasterKey;
|
23 | 25 | import com.amazonaws.encryptionsdk.kms.KmsMasterKeyProvider;
|
| 26 | +import java.io.IOException; |
24 | 27 | import org.junit.jupiter.api.Test;
|
25 | 28 | import org.junit.jupiter.api.extension.ExtendWith;
|
26 | 29 | import org.mockito.Mock;
|
27 | 30 | import org.mockito.junit.jupiter.MockitoExtension;
|
| 31 | +import software.amazon.cloudformation.exceptions.EncryptionException; |
28 | 32 | import software.amazon.cloudformation.proxy.Credentials;
|
29 | 33 |
|
30 | 34 | @ExtendWith(MockitoExtension.class)
|
@@ -53,33 +57,76 @@ public void constructKMSCipher_constructSuccess() {
|
53 | 57 | public void decryptCredentials_decryptSuccess() {
|
54 | 58 | cipher = new KMSCipher(cryptoHelper, kmsKeyProvider);
|
55 | 59 | lenient().when(cryptoHelper.decryptData(any(KmsMasterKeyProvider.class), any(byte[].class))).thenReturn(result);
|
56 |
| - lenient().when(result.getResult()).thenReturn("{\"test\":\"test\"}".getBytes()); |
57 |
| - |
58 |
| - try { |
59 |
| - Credentials decryptedCredentials = cipher |
60 |
| - .decryptCredentials("ewogICAgICAgICAgICAiYWNjZXNzS2V5SWQiOiAiSUFTQVlLODM1R0FJRkhBSEVJMjMiLAogICAg\n" |
61 |
| - + "ICAgICAgICAic2VjcmV0QWNjZXNzS2V5IjogIjY2aU9HUE41TG5wWm9yY0xyOEtoMjV1OEFiakhW\n" |
62 |
| - + "bGx2NS9wb2gyTzAiLAogICAgICAgICAgICAic2Vzc2lvblRva2VuIjogImxhbWVIUzJ2UU9rblNI\n" |
63 |
| - + "V2hkRllUeG0yZUpjMUpNbjlZQk5JNG5WNG1YdWU5NDVLUEw2REhmVzhFc1VRVDV6d3NzWUVDMU52\n" |
64 |
| - + "WVA5eUQ2WTVzNWxLUjNjaGZsT0hQRnNJZTZlcWciCiAgICAgICAgfQ=="); |
65 |
| - assertThat(decryptedCredentials).isNotNull(); |
66 |
| - } catch (final Exception ex) { |
67 |
| - } |
| 60 | + lenient().when(result.getResult()).thenReturn( |
| 61 | + "{\"accessKeyId\":\"testAccessKeyId\", \"secretAccessKey\": \"testSecretAccessKey\", \"sessionToken\": \"testToken\"}" |
| 62 | + .getBytes()); |
68 | 63 |
|
| 64 | + Credentials decryptedCredentials = cipher |
| 65 | + .decryptCredentials("ewogICAgICAgICAgICAiYWNjZXNzS2V5SWQiOiAiSUFTQVlLODM1R0FJRkhBSEVJMjMiLAogICAg\n" |
| 66 | + + "ICAgICAgICAic2VjcmV0QWNjZXNzS2V5IjogIjY2aU9HUE41TG5wWm9yY0xyOEtoMjV1OEFiakhW\n" |
| 67 | + + "bGx2NS9wb2gyTzAiLAogICAgICAgICAgICAic2Vzc2lvblRva2VuIjogImxhbWVIUzJ2UU9rblNI\n" |
| 68 | + + "V2hkRllUeG0yZUpjMUpNbjlZQk5JNG5WNG1YdWU5NDVLUEw2REhmVzhFc1VRVDV6d3NzWUVDMU52\n" |
| 69 | + + "WVA5eUQ2WTVzNWxLUjNjaGZsT0hQRnNJZTZlcWciCiAgICAgICAgfQ=="); |
| 70 | + assertThat(decryptedCredentials).isNotNull(); |
| 71 | + assertThat(decryptedCredentials.getAccessKeyId()).isEqualTo("testAccessKeyId"); |
| 72 | + assertThat(decryptedCredentials.getSecretAccessKey()).isEqualTo("testSecretAccessKey"); |
| 73 | + assertThat(decryptedCredentials.getSessionToken()).isEqualTo("testToken"); |
69 | 74 | }
|
70 | 75 |
|
71 | 76 | @Test
|
72 | 77 | public void decryptCredentials_decryptFailure() {
|
73 | 78 | cipher = new KMSCipher("encryptionKeyArn", "encryptionKeyRole");
|
74 |
| - try { |
75 |
| - Credentials decryptedCredentials = cipher |
76 |
| - .decryptCredentials("ewogICAgICAgICAgICAiYWNjZXNzS2V5SWQiOiAiSUFTQVlLODM1R0FJRkhBSEVJMjMiLAogICAg\n" |
77 |
| - + "ICAgICAgICAic2VjcmV0QWNjZXNzS2V5IjogIjY2aU9HUE41TG5wWm9yY0xyOEtoMjV1OEFiakhW\n" |
78 |
| - + "bGx2NS9wb2gyTzAiLAogICAgICAgICAgICAic2Vzc2lvblRva2VuIjogImxhbWVIUzJ2UU9rblNI\n" |
79 |
| - + "V2hkRllUeG0yZUpjMUpNbjlZQk5JNG5WNG1YdWU5NDVLUEw2REhmVzhFc1VRVDV6d3NzWUVDMU52\n" |
80 |
| - + "WVA5eUQ2WTVzNWxLUjNjaGZsT0hQRnNJZTZlcWciCiAgICAgICAgfQ=="); |
81 |
| - assertThat(decryptedCredentials).isNotNull(); |
82 |
| - } catch (final Exception ex) { |
83 |
| - } |
| 79 | + assertThatThrownBy( |
| 80 | + () -> cipher.decryptCredentials("ewogICAgICAgICAgICAiYWNjZXNzS2V5SWQiOiAiSUFTQVlLODM1R0FJRkhBSEVJMjMiLAogICAg\n" |
| 81 | + + "ICAgICAgICAic2VjcmV0QWNjZXNzS2V5IjogIjY2aU9HUE41TG5wWm9yY0xyOEtoMjV1OEFiakhW\n" |
| 82 | + + "bGx2NS9wb2gyTzAiLAogICAgICAgICAgICAic2Vzc2lvblRva2VuIjogImxhbWVIUzJ2UU9rblNI\n" |
| 83 | + + "V2hkRllUeG0yZUpjMUpNbjlZQk5JNG5WNG1YdWU5NDVLUEw2REhmVzhFc1VRVDV6d3NzWUVDMU52\n" |
| 84 | + + "WVA5eUQ2WTVzNWxLUjNjaGZsT0hQRnNJZTZlcWciCiAgICAgICAgfQ==")).isInstanceOf(EncryptionException.class) |
| 85 | + .hasMessageContaining("Failed to decrypt credentials"); |
| 86 | + } |
| 87 | + |
| 88 | + @Test |
| 89 | + public void decryptCredentials_returnsNullCredentials_decryptFailure() { |
| 90 | + cipher = new KMSCipher(cryptoHelper, kmsKeyProvider); |
| 91 | + lenient().when(cryptoHelper.decryptData(any(KmsMasterKeyProvider.class), any(byte[].class))).thenReturn(result); |
| 92 | + lenient().when(result.getResult()).thenReturn("null".getBytes()); |
| 93 | + |
| 94 | + assertThatThrownBy( |
| 95 | + () -> cipher.decryptCredentials("ewogICAgICAgICAgICAiYWNjZXNzS2V5SWQiOiAiSUFTQVlLODM1R0FJRkhBSEVJMjMiLAogICAg\n" |
| 96 | + + "ICAgICAgICAic2VjcmV0QWNjZXNzS2V5IjogIjY2aU9HUE41TG5wWm9yY0xyOEtoMjV1OEFiakhW\n" |
| 97 | + + "bGx2NS9wb2gyTzAiLAogICAgICAgICAgICAic2Vzc2lvblRva2VuIjogImxhbWVIUzJ2UU9rblNI\n" |
| 98 | + + "V2hkRllUeG0yZUpjMUpNbjlZQk5JNG5WNG1YdWU5NDVLUEw2REhmVzhFc1VRVDV6d3NzWUVDMU52\n" |
| 99 | + + "WVA5eUQ2WTVzNWxLUjNjaGZsT0hQRnNJZTZlcWciCiAgICAgICAgfQ==")).isInstanceOf(EncryptionException.class) |
| 100 | + .hasMessageContaining("Failed to decrypt credentials. Decrypted credentials are 'null'"); |
| 101 | + } |
| 102 | + |
| 103 | + @Test |
| 104 | + public void decryptCredentials_encryptionSDKError_decryptFailure() { |
| 105 | + cipher = new KMSCipher(cryptoHelper, kmsKeyProvider); |
| 106 | + lenient().when(cryptoHelper.decryptData(any(KmsMasterKeyProvider.class), any(byte[].class))) |
| 107 | + .thenThrow(new AwsCryptoException()); |
| 108 | + |
| 109 | + assertThatThrownBy( |
| 110 | + () -> cipher.decryptCredentials("ewogICAgICAgICAgICAiYWNjZXNzS2V5SWQiOiAiSUFTQVlLODM1R0FJRkhBSEVJMjMiLAogICAg\n" |
| 111 | + + "ICAgICAgICAic2VjcmV0QWNjZXNzS2V5IjogIjY2aU9HUE41TG5wWm9yY0xyOEtoMjV1OEFiakhW\n" |
| 112 | + + "bGx2NS9wb2gyTzAiLAogICAgICAgICAgICAic2Vzc2lvblRva2VuIjogImxhbWVIUzJ2UU9rblNI\n" |
| 113 | + + "V2hkRllUeG0yZUpjMUpNbjlZQk5JNG5WNG1YdWU5NDVLUEw2REhmVzhFc1VRVDV6d3NzWUVDMU52\n" |
| 114 | + + "WVA5eUQ2WTVzNWxLUjNjaGZsT0hQRnNJZTZlcWciCiAgICAgICAgfQ==")).isInstanceOf(EncryptionException.class) |
| 115 | + .hasCauseInstanceOf(AwsCryptoException.class).hasMessageContaining("Failed to decrypt credentials"); |
| 116 | + } |
| 117 | + |
| 118 | + @Test |
| 119 | + public void decryptCredentials_deserializationError_decryptFailure() { |
| 120 | + cipher = new KMSCipher(cryptoHelper, kmsKeyProvider); |
| 121 | + lenient().when(cryptoHelper.decryptData(any(KmsMasterKeyProvider.class), any(byte[].class))).thenReturn(result); |
| 122 | + lenient().when(result.getResult()).thenReturn("{test: test\"".getBytes()); |
| 123 | + |
| 124 | + assertThatThrownBy( |
| 125 | + () -> cipher.decryptCredentials("ewogICAgICAgICAgICAiYWNjZXNzS2V5SWQiOiAiSUFTQVlLODM1R0FJRkhBSEVJMjMiLAogICAg\n" |
| 126 | + + "ICAgICAgICAic2VjcmV0QWNjZXNzS2V5IjogIjY2aU9HUE41TG5wWm9yY0xyOEtoMjV1OEFiakhW\n" |
| 127 | + + "bGx2NS9wb2gyTzAiLAogICAgICAgICAgICAic2Vzc2lvblRva2VuIjogImxhbWVIUzJ2UU9rblNI\n" |
| 128 | + + "V2hkRllUeG0yZUpjMUpNbjlZQk5JNG5WNG1YdWU5NDVLUEw2REhmVzhFc1VRVDV6d3NzWUVDMU52\n" |
| 129 | + + "WVA5eUQ2WTVzNWxLUjNjaGZsT0hQRnNJZTZlcWciCiAgICAgICAgfQ==")).isInstanceOf(EncryptionException.class) |
| 130 | + .hasCauseInstanceOf(IOException.class).hasMessageContaining("Failed to decrypt credentials"); |
84 | 131 | }
|
85 | 132 | }
|
0 commit comments