diff --git a/NOTICE b/NOTICE index d7da378bf21058fb9ce92e73928b6da471fdfd68..9e2f9d5fa667d0384b0e89ed186d49e85a52fc46 100644 --- a/NOTICE +++ b/NOTICE @@ -28,6 +28,49 @@ The following software have components provided under the terms of this license: - AMQP 1.0 JMS Spring Boot Starter (from https://repo1.maven.org/maven2/org/amqphub/spring/amqp-10-jms-spring-boot-starter) - API Common (from https://github.com/googleapis, https://github.com/googleapis/api-common-java, https://repo1.maven.org/maven2/com/google/api/api-common) - ASM based accessors helper used by json-smart (from https://urielch.github.io/) +- AWS Cryptographic Material Providers Library (from https://github.com/aws/aws-cryptographic-material-providers-library) +- AWS Database Encryption SDK for DynamoDB (from https://github.com/aws/aws-database-encryption-sdk-dynamodb) +- AWS Event Stream (from https://github.com/awslabs/aws-eventstream-java) +- AWS Java SDK :: AWS CRT Core (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: AWS Core (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Annotations (from https://repo1.maven.org/maven2/software/amazon/awssdk/annotations) +- AWS Java SDK :: Arns (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Auth (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Checksums (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Checksums SPI (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Core :: Protocols :: AWS Json Protocol (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Core :: Protocols :: AWS Query Protocol (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Core :: Protocols :: AWS Xml Protocol (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Core :: Protocols :: Json Utils (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Core :: Protocols :: Protocol Core (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: DynamoDB :: Enhanced Client (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Endpoints SPI (from https://repo1.maven.org/maven2/software/amazon/awssdk/endpoints-spi) +- AWS Java SDK :: HTTP Auth (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: HTTP Auth AWS (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: HTTP Auth Event Stream (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: HTTP Auth SPI (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: HTTP Client Interface (from https://repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi) +- AWS Java SDK :: HTTP Clients :: Apache (from https://repo1.maven.org/maven2/software/amazon/awssdk/apache-client) +- AWS Java SDK :: HTTP Clients :: Netty Non-Blocking I/O (from https://repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client) +- AWS Java SDK :: Identity SPI (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Metrics SPI (from https://repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi) +- AWS Java SDK :: Profiles (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Regions (from https://repo1.maven.org/maven2/software/amazon/awssdk/regions) +- AWS Java SDK :: Retries (from https://repo1.maven.org/maven2/software/amazon/awssdk/retries) +- AWS Java SDK :: Retries API (from https://repo1.maven.org/maven2/software/amazon/awssdk/retries-spi) +- AWS Java SDK :: SDK Core (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: AWS KMS (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: AWS STS (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: AWS Secrets Manager (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: AWS Simple Systems Management (SSM) (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: Amazon CloudWatch Logs (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: Amazon Cognito Identity Provider Service (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: Amazon DynamoDB (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: Amazon S3 (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: Amazon SNS (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Services :: Amazon SQS (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Third Party :: Jackson-core (from https://aws.amazon.com/sdkforjava) +- AWS Java SDK :: Utilities (from https://repo1.maven.org/maven2/software/amazon/awssdk/utils) - AWS Java SDK for AWS KMS (from https://aws.amazon.com/sdkforjava) - AWS Java SDK for AWS STS (from https://aws.amazon.com/sdkforjava) - AWS Java SDK for AWS Secrets Manager (from https://aws.amazon.com/sdkforjava) @@ -168,6 +211,7 @@ The following software have components provided under the terms of this license: - Redisson (from http://redisson.org, https://redisson.pro) - Retrofit (from https://github.com/square/retrofit, https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit) - RxJava (from https://github.com/ReactiveX/RxJava) +- Smithy :: Dafny :: Conversion (from https://github.com/awslabs/smithy) - SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org, https://bitbucket.org/snakeyaml/snakeyaml) - Spring AOP (from http://www.springframework.org, https://github.com/spring-projects/spring-framework, https://repo1.maven.org/maven2/org/springframework/spring-aop) - Spring Beans (from http://www.springframework.org, https://github.com/SpringSource/spring-framework, https://github.com/spring-projects/spring-framework, https://repo1.maven.org/maven2/org/springframework/spring-beans) @@ -322,7 +366,7 @@ BouncyCastle ======================================================================== The following software have components provided under the terms of this license: -- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html, https://www.bouncycastle.org/java.html) +- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html, https://www.bouncycastle.org/download/bouncy-castle-java/, https://www.bouncycastle.org/java.html) ======================================================================== CC-BY-2.5 @@ -472,6 +516,7 @@ The following software have components provided under the terms of this license: - Azure Java Client Runtime for ARM (from https://github.com/Azure/autorest-clientruntime-for-java) - Azure Java Client Runtime for AutoRest (from https://github.com/Azure/autorest-clientruntime-for-java) - Checker Qual (from https://checkerframework.org) +- DafnyRuntime (from https://github.com/dafny-lang/dafny) - Extensions on Apache Proton-J library (from https://github.com/Azure/qpid-proton-j-extensions) - JUL to SLF4J bridge (from http://www.slf4j.org) - Jackson-core (from http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson-core) @@ -531,6 +576,13 @@ The following software have components provided under the terms of this license: - msal4j-persistence-extension (from https://github.com/AzureAD/microsoft-authentication-extensions-for-java, https://github.com/AzureAD/microsoft-authentication-library-for-java) - webjars-locator-lite (from https://webjars.org) +======================================================================== +RSA-MD +======================================================================== +The following software have components provided under the terms of this license: + +- AWS Java SDK :: Services :: Amazon SQS (from https://aws.amazon.com/sdkforjava) + ======================================================================== SAX-PD ======================================================================== diff --git a/provider/partition-aws/pom.xml b/provider/partition-aws/pom.xml index 60c2d94f3697b83bcb5fd91e1cfcf3660d8bbf54..c34f299f38b809f0af51c99540aa4d1b9823cb91 100644 --- a/provider/partition-aws/pom.xml +++ b/provider/partition-aws/pom.xml @@ -52,7 +52,7 @@ <dependency> <groupId>org.opengroup.osdu.core.aws</groupId> <artifactId>os-core-lib-aws</artifactId> - <version>3.0.2</version> + <version>master-sdk-v2-SNAPSHOT</version> </dependency> <dependency> <groupId>org.opengroup.osdu</groupId> @@ -64,7 +64,7 @@ <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-encryption-sdk-java</artifactId> - <version>2.4.0</version> + <version>3.0.1</version> </dependency> <!-- Third party Apache 2.0 license packages --> diff --git a/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationService.java b/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationService.java index 2dbba1ab49d08792f120ff468bc3ec47b0b3e690..b5872d5650bf19e9de3299c07752403f9643a28c 100644 --- a/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationService.java +++ b/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationService.java @@ -14,20 +14,21 @@ package org.opengroup.osdu.partition.provider.aws.security; -import org.opengroup.osdu.core.aws.entitlements.RequestKeys; -import org.opengroup.osdu.core.aws.ssm.K8sLocalParameterProvider; -import org.opengroup.osdu.core.aws.ssm.K8sParameterNotFoundException; +import java.util.Map; + +import org.opengroup.osdu.core.aws.v2.entitlements.Authorizer; +import org.opengroup.osdu.core.aws.v2.entitlements.RequestKeys; +import org.opengroup.osdu.core.aws.v2.ssm.K8sLocalParameterProvider; +import org.opengroup.osdu.core.aws.v2.ssm.K8sParameterNotFoundException; +import org.opengroup.osdu.core.aws.v2.ssm.SSMUtil; import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.partition.provider.interfaces.IAuthorizationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; -import org.opengroup.osdu.core.aws.entitlements.Authorizer; -import org.opengroup.osdu.core.aws.ssm.SSMUtil; import jakarta.annotation.PostConstruct; -import java.util.Map; @Component diff --git a/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClient.java b/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClient.java index ca1cab538b8050ed370df3974132d5e88ba7864e..f39ab11d8a638de32a512e45c36fbb3db6280c16 100644 --- a/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClient.java +++ b/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClient.java @@ -18,20 +18,18 @@ import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Map; -import com.amazonaws.auth.AWSCredentialsProvider; -import com.amazonaws.encryptionsdk.AwsCrypto; -import com.amazonaws.encryptionsdk.CryptoResult; -import com.amazonaws.encryptionsdk.kms.KmsMasterKey; -import com.amazonaws.encryptionsdk.kms.KmsMasterKeyProvider; -import com.amazonaws.encryptionsdk.CommitmentPolicy; -import lombok.Data; - -import org.opengroup.osdu.core.aws.iam.IAMConfig; -import org.opengroup.osdu.core.aws.ssm.K8sLocalParameterProvider; +import org.opengroup.osdu.core.aws.v2.ssm.K8sLocalParameterProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import jakarta.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; +import lombok.Data; +import software.amazon.awssdk.core.SdkBytes; +import software.amazon.awssdk.services.kms.KmsClient; +import software.amazon.awssdk.services.kms.model.DecryptRequest; +import software.amazon.awssdk.services.kms.model.DecryptResponse; +import software.amazon.awssdk.services.kms.model.EncryptRequest; +import software.amazon.awssdk.services.kms.model.EncryptResponse; /** * <p> @@ -43,75 +41,56 @@ import jakarta.annotation.PostConstruct; @Component public class AwsKmsEncryptionClient { - @Value("${aws.kms.keyArn}") - private String keyArn; - - @Value("${osdu.mongodb.database}") - private String authDatabase; - - private AWSCredentialsProvider amazonAWSCredentials; + @Value("${aws.kms.keyArn}") + private String keyArn; - private KmsMasterKeyProvider keyProvider; + @Value("${osdu.mongodb.database}") + private String authDatabase; - private static final AwsCrypto crypto = AwsCrypto.builder() - .withCommitmentPolicy(CommitmentPolicy.RequireEncryptRequireDecrypt) - .build(); + private KmsClient kmsClient; + public AwsKmsEncryptionClient() { + this.kmsClient = KmsClient.builder().build(); + } - private final AwsCrypto instanceCrypto; + public AwsKmsEncryptionClient(KmsClient kmsClient) { + this.kmsClient = kmsClient; + } - public AwsKmsEncryptionClient() { - instanceCrypto = crypto; - } + @PostConstruct + private void initializeKeyProvider() { - public AwsKmsEncryptionClient(final AwsCrypto argCrypto) { - instanceCrypto = argCrypto; - } + // grab key arn from K8s + K8sLocalParameterProvider provider = new K8sLocalParameterProvider(); - @PostConstruct - private void initializeKeyProvider() { + if (Boolean.FALSE.equals(provider.getLocalMode())) { + keyArn = provider.getParameterAsStringOrDefault("KEY_ARN", keyArn); + } + } - // grab key arn from K8s - K8sLocalParameterProvider provider = new K8sLocalParameterProvider(); + public byte[] encrypt(String plainText, String id) { + Map<String, String> encryptionContext = generateEncryptionContext(id); - if (Boolean.FALSE.equals(provider.getLocalMode())) { - keyArn = provider.getParameterAsStringOrDefault("KEY_ARN", keyArn); - } + EncryptRequest request = EncryptRequest.builder().keyId(keyArn) + .plaintext(SdkBytes.fromString(plainText, StandardCharsets.UTF_8)).encryptionContext(encryptionContext) + .build(); - // log in with IAM credentials - amazonAWSCredentials = IAMConfig.amazonAWSCredentials(); + EncryptResponse response = kmsClient.encrypt(request); + return response.ciphertextBlob().asByteArray(); + } - // generate keyProvider - this.keyProvider = KmsMasterKeyProvider.builder() - .withCredentials(amazonAWSCredentials) - .buildStrict(keyArn); - } + public String decrypt(byte[] ciphertext, String id) { + Map<String, String> encryptionContext = generateEncryptionContext(id); - public byte[] encrypt(String plainText, String id) { + DecryptRequest request = DecryptRequest.builder().keyId(keyArn) + .ciphertextBlob(SdkBytes.fromByteArray(ciphertext)).encryptionContext(encryptionContext).build(); - final Map<String, String> encryptionContext = generateEncryptionContext(id); - final CryptoResult<byte[], KmsMasterKey> encryptResult = instanceCrypto.encryptData(keyProvider, plainText.getBytes(StandardCharsets.UTF_8), encryptionContext); - return encryptResult.getResult(); - } + DecryptResponse response = kmsClient.decrypt(request); + return response.plaintext().asString(StandardCharsets.UTF_8); + } - public String decrypt(byte[] ciphertext, String id) { - - final CryptoResult<byte[], KmsMasterKey> decryptResult = instanceCrypto.decryptData(keyProvider, ciphertext); - final Map<String, String> encryptionContext = generateEncryptionContext(id); - - // throw error if context doesn't match - if (!encryptionContext.entrySet().stream() - .allMatch(e -> e.getValue().equals(decryptResult.getEncryptionContext().get(e.getKey())))) { - throw new IllegalStateException("Wrong Encryption Context!"); - } - - return new String(decryptResult.getResult(), StandardCharsets.UTF_8); - } - - private Map<String, String> generateEncryptionContext(String id) { - return Collections.singletonMap(authDatabase, id); - } + private Map<String, String> generateEncryptionContext(String id) { + return Collections.singletonMap(authDatabase, id); + } } - - diff --git a/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/MongoConfig.java b/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/MongoConfig.java index 69b8eca193a0333985dfdbc3846cbe3e812385f9..222f3f0762ebb4ad0d5387357b02f7ee7730d78f 100644 --- a/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/MongoConfig.java +++ b/provider/partition-aws/src/main/java/org/opengroup/osdu/partition/provider/aws/util/MongoConfig.java @@ -14,8 +14,8 @@ package org.opengroup.osdu.partition.provider.aws.util; -import org.opengroup.osdu.core.aws.mongodb.MongoDBSimpleFactory; -import org.opengroup.osdu.core.aws.mongodb.config.MongoPropertiesDefaultReader; +import org.opengroup.osdu.core.aws.v2.mongodb.MongoDBSimpleFactory; +import org.opengroup.osdu.core.aws.v2.mongodb.config.MongoPropertiesDefaultReader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationServiceTest.java b/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationServiceTest.java index 587c484d02a3268f508d12abc6196299d17cdb31..6d051f7882e3ad160632d95dc0db4f5c0182ef21 100644 --- a/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationServiceTest.java +++ b/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/security/AuthorizationServiceTest.java @@ -23,10 +23,10 @@ import org.mockito.Mock; import org.mockito.MockedConstruction; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; -import org.opengroup.osdu.core.aws.entitlements.Authorizer; -import org.opengroup.osdu.core.aws.entitlements.RequestKeys; -import org.opengroup.osdu.core.aws.ssm.K8sLocalParameterProvider; -import org.opengroup.osdu.core.aws.ssm.K8sParameterNotFoundException; +import org.opengroup.osdu.core.aws.v2.entitlements.Authorizer; +import org.opengroup.osdu.core.aws.v2.entitlements.RequestKeys; +import org.opengroup.osdu.core.aws.v2.ssm.K8sLocalParameterProvider; +import org.opengroup.osdu.core.aws.v2.ssm.K8sParameterNotFoundException; import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.springframework.test.util.ReflectionTestUtils; diff --git a/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClientTest.java b/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClientTest.java index d926bf0a4736176b24880baebd5a792c3dfacb03..886356354ba55e0a9def584d46b868e7975f62ae 100644 --- a/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClientTest.java +++ b/provider/partition-aws/src/test/java/org/opengroup/osdu/partition/provider/aws/util/AwsKmsEncryptionClientTest.java @@ -18,16 +18,18 @@ package org.opengroup.osdu.partition.provider.aws.util; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.junit.Assert.fail; -import com.amazonaws.auth.AWSCredentialsProvider; -import com.amazonaws.encryptionsdk.AwsCrypto; -import com.amazonaws.encryptionsdk.CryptoResult; -import com.amazonaws.encryptionsdk.kms.KmsMasterKey; -import com.amazonaws.encryptionsdk.kms.KmsMasterKeyProvider; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.HexFormat; +import java.util.Map; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,166 +38,144 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockedConstruction; -import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; -import org.opengroup.osdu.core.aws.ssm.K8sLocalParameterProvider; +import org.opengroup.osdu.core.aws.v2.ssm.K8sLocalParameterProvider; import org.springframework.test.util.ReflectionTestUtils; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.HexFormat; -import java.util.Map; +import software.amazon.awssdk.core.SdkBytes; +import software.amazon.awssdk.services.kms.KmsClient; +import software.amazon.awssdk.services.kms.model.DecryptRequest; +import software.amazon.awssdk.services.kms.model.DecryptResponse; +import software.amazon.awssdk.services.kms.model.EncryptRequest; +import software.amazon.awssdk.services.kms.model.EncryptResponse; @RunWith(MockitoJUnitRunner.class) public class AwsKmsEncryptionClientTest { - - @Mock - private KmsMasterKeyProvider.Builder kmsBuilder; - - @Mock - private KmsMasterKeyProvider keyProvider; - - @Mock - private AwsCrypto instanceCrypto; - - @Mock - private CryptoResult<byte[], KmsMasterKey> cryptoResult; + @Mock + private KmsClient kmsClient; @Captor - private ArgumentCaptor<Map<String, String>> encryptionContext; + private ArgumentCaptor<EncryptRequest> encryptRequestCaptor; @Captor - private ArgumentCaptor<byte[]> bytesCaptor; - - @InjectMocks - private AwsKmsEncryptionClient encryptionClient; - - private final String KEY_ARN = "key_arn"; - - private final byte[] ENCRYPTED = HexFormat.of().parseHex("0123456789abcdef"); - - private byte[] DECRYPTED_BYTES; - - private final String DECRYPTED = "Decrypted"; - private final String AUTH_DATABASE = "osdu"; - private final String VALID_ID = "valid_id"; - - private final Map<String, String> validContext = new HashMap<>(); - - @Before - public void setup() throws NoSuchFieldException, IllegalAccessException { - ReflectionTestUtils.setField(encryptionClient, "keyArn", KEY_ARN); - ReflectionTestUtils.setField(encryptionClient, "authDatabase", AUTH_DATABASE); - ReflectionTestUtils.setField(encryptionClient, "keyProvider", keyProvider); - - DECRYPTED_BYTES = DECRYPTED.getBytes(StandardCharsets.UTF_8); - validContext.put(AUTH_DATABASE, VALID_ID); - } - - @Test - public void should_return_when_initCalledWithLocal() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { - final String LOCAL_KEY_ARN = "local_key_arn"; - Method initializeKeyProvider = AwsKmsEncryptionClient.class.getDeclaredMethod("initializeKeyProvider"); - initializeKeyProvider.setAccessible(true); - ReflectionTestUtils.setField(encryptionClient, "keyArn", LOCAL_KEY_ARN); - try (MockedConstruction<K8sLocalParameterProvider> k8sParameterProvider = Mockito.mockConstruction(K8sLocalParameterProvider.class, - (mock, context) -> { - when(mock.getParameterAsStringOrDefault(anyString(), anyString())).thenReturn("bogus_key_arn"); - when(mock.getLocalMode()).thenReturn(true); - })) { - try (MockedStatic<KmsMasterKeyProvider> kmsMKPStatic = Mockito.mockStatic(KmsMasterKeyProvider.class)) { - kmsMKPStatic.when(KmsMasterKeyProvider::builder).thenReturn(kmsBuilder); - when(kmsBuilder.withCredentials(any(AWSCredentialsProvider.class))).thenReturn(kmsBuilder); - when(kmsBuilder.buildStrict(anyString())).thenReturn(keyProvider); - - initializeKeyProvider.invoke(encryptionClient); - - assertTrue("Must pass when `initializeKeyProvider` called with local mode enabled!", true); - assertEquals(LOCAL_KEY_ARN, ReflectionTestUtils.getField(encryptionClient, "keyArn")); - } - } finally { - ReflectionTestUtils.setField(encryptionClient, "keyArn", KEY_ARN); - } - } - @Test - public void should_return_when_initCalledWithoutLocal() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { - final String OSDU_KEY_ARN = "osdu_key_arn"; - Method initializeKeyProvider = AwsKmsEncryptionClient.class.getDeclaredMethod("initializeKeyProvider"); - initializeKeyProvider.setAccessible(true); - ReflectionTestUtils.setField(encryptionClient, "keyArn", "bogus_key_arn"); - try (MockedConstruction<K8sLocalParameterProvider> k8sParameterProvider = Mockito.mockConstruction(K8sLocalParameterProvider.class, - (mock, context) -> { - when(mock.getParameterAsStringOrDefault(anyString(), anyString())).thenReturn(OSDU_KEY_ARN); - when(mock.getLocalMode()).thenReturn(false); - })) { - try (MockedStatic<KmsMasterKeyProvider> kmsMKPStatic = Mockito.mockStatic(KmsMasterKeyProvider.class)) { - kmsMKPStatic.when(KmsMasterKeyProvider::builder).thenReturn(kmsBuilder); - when(kmsBuilder.withCredentials(any(AWSCredentialsProvider.class))).thenReturn(kmsBuilder); - when(kmsBuilder.buildStrict(anyString())).thenReturn(keyProvider); - - initializeKeyProvider.invoke(encryptionClient); - - assertTrue("Must pass when `initializeKeyProvider` called with OSDU mode enabled!", true); - assertEquals(OSDU_KEY_ARN, ReflectionTestUtils.getField(encryptionClient, "keyArn")); - } - } finally { - ReflectionTestUtils.setField(encryptionClient, "keyArn", KEY_ARN); - } - } - - @Test - public void should_return_when_encryptCalledWithArgs() { - when(instanceCrypto.encryptData(any(KmsMasterKeyProvider.class), bytesCaptor.capture(), encryptionContext.capture())).thenReturn(cryptoResult); - when(cryptoResult.getResult()).thenReturn(ENCRYPTED); - - byte[] encrypted = encryptionClient.encrypt(DECRYPTED, VALID_ID); - - assertArrayEquals(ENCRYPTED, encrypted); - assertArrayEquals(DECRYPTED_BYTES, bytesCaptor.getValue()); - Map<String, String> map = encryptionContext.getValue(); - assertEquals(1, map.size()); - assertTrue(map.containsKey(AUTH_DATABASE)); - assertEquals(VALID_ID, map.get(AUTH_DATABASE)); - } - - @Test - public void should_return_when_decryptCalledWithValidArgs() { - when(instanceCrypto.decryptData(any(KmsMasterKeyProvider.class), bytesCaptor.capture())).thenReturn(cryptoResult); - when(cryptoResult.getResult()).thenReturn(DECRYPTED_BYTES); - when(cryptoResult.getEncryptionContext()).thenReturn(validContext); - - String decrypted = encryptionClient.decrypt(ENCRYPTED, VALID_ID); - - assertEquals(DECRYPTED, decrypted); - assertArrayEquals(ENCRYPTED, bytesCaptor.getValue()); - } - - @Test - public void should_ThrowIllegalStateException_when_decryptCalledWithInValidArgs() { - when(instanceCrypto.decryptData(any(KmsMasterKeyProvider.class), bytesCaptor.capture())).thenReturn(cryptoResult); - when(cryptoResult.getEncryptionContext()).thenReturn(validContext); - - try { - String INVALID_ID = "invalid_id"; - encryptionClient.decrypt(ENCRYPTED, INVALID_ID); - fail("Should throw exception when encryption contexts do not match."); - } catch (IllegalStateException exception) { - assertEquals("Wrong Encryption Context!", exception.getMessage()); - } - assertArrayEquals(ENCRYPTED, bytesCaptor.getValue()); - } - - @Test - public void should_return_when_defaultConstructorCalled() { - AwsCrypto expectedCrypto = (AwsCrypto) ReflectionTestUtils.getField(AwsKmsEncryptionClient.class, "crypto"); - - AwsKmsEncryptionClient cryptoClient = new AwsKmsEncryptionClient(); - - AwsCrypto actualCrypto = (AwsCrypto) ReflectionTestUtils.getField(cryptoClient, "crypto"); - assertEquals(expectedCrypto, actualCrypto); - } + private ArgumentCaptor<DecryptRequest> decryptRequestCaptor; + + @InjectMocks + private AwsKmsEncryptionClient encryptionClient; + + private final String KEY_ARN = "key_arn"; + + private final byte[] ENCRYPTED = HexFormat.of().parseHex("0123456789abcdef"); + + private final String DECRYPTED = "Decrypted"; + private final String AUTH_DATABASE = "osdu"; + private final String VALID_ID = "valid_id"; + + private final Map<String, String> validContext = new HashMap<>(); + + @Before + public void setup() throws NoSuchFieldException, IllegalAccessException { + ReflectionTestUtils.setField(encryptionClient, "keyArn", KEY_ARN); + ReflectionTestUtils.setField(encryptionClient, "authDatabase", AUTH_DATABASE); + + validContext.put(AUTH_DATABASE, VALID_ID); + } + + @Test + public void should_return_when_initCalledWithLocal() + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + + final String LOCAL_KEY_ARN = "local_key_arn"; + Method initializeKeyProvider = AwsKmsEncryptionClient.class.getDeclaredMethod("initializeKeyProvider"); + initializeKeyProvider.setAccessible(true); + ReflectionTestUtils.setField(encryptionClient, "keyArn", LOCAL_KEY_ARN); + try (MockedConstruction<K8sLocalParameterProvider> k8sParameterProvider = Mockito + .mockConstruction(K8sLocalParameterProvider.class, (mock, context) -> { + when(mock.getParameterAsStringOrDefault(anyString(), anyString())).thenReturn("bogus_key_arn"); + when(mock.getLocalMode()).thenReturn(true); + })) { + initializeKeyProvider.invoke(encryptionClient); + + assertTrue("Must pass when `initializeKeyProvider` called with local mode enabled!", true); + assertEquals(LOCAL_KEY_ARN, ReflectionTestUtils.getField(encryptionClient, "keyArn")); + + } finally { + ReflectionTestUtils.setField(encryptionClient, "keyArn", KEY_ARN); + } + } + + @Test + public void should_return_when_initCalledWithoutLocal() + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + final String OSDU_KEY_ARN = "osdu_key_arn"; + Method initializeKeyProvider = AwsKmsEncryptionClient.class.getDeclaredMethod("initializeKeyProvider"); + initializeKeyProvider.setAccessible(true); + ReflectionTestUtils.setField(encryptionClient, "keyArn", "bogus_key_arn"); + try (MockedConstruction<K8sLocalParameterProvider> k8sParameterProvider = Mockito + .mockConstruction(K8sLocalParameterProvider.class, (mock, context) -> { + when(mock.getParameterAsStringOrDefault(anyString(), anyString())).thenReturn(OSDU_KEY_ARN); + when(mock.getLocalMode()).thenReturn(false); + })) { + + initializeKeyProvider.invoke(encryptionClient); + + assertTrue("Must pass when `initializeKeyProvider` called with OSDU mode enabled!", true); + assertEquals(OSDU_KEY_ARN, ReflectionTestUtils.getField(encryptionClient, "keyArn")); + } finally { + ReflectionTestUtils.setField(encryptionClient, "keyArn", KEY_ARN); + } + } + + @Test + public void should_return_when_encryptCalledWithArgs() { + // Arrange + EncryptResponse mockResponse = EncryptResponse.builder().ciphertextBlob(SdkBytes.fromByteArray(ENCRYPTED)) + .build(); + when(kmsClient.encrypt(any(EncryptRequest.class))).thenReturn(mockResponse); + + // Act + byte[] encrypted = encryptionClient.encrypt(DECRYPTED, VALID_ID); + + // Assert + assertArrayEquals(ENCRYPTED, encrypted); + verify(kmsClient).encrypt(encryptRequestCaptor.capture()); + EncryptRequest capturedRequest = encryptRequestCaptor.getValue(); + + Map<String, String> encryptionContext = capturedRequest.encryptionContext(); + assertEquals("Should have exactly one entry", 1, encryptionContext.size()); + assertEquals("Should contain valid ID", VALID_ID, encryptionContext.get(AUTH_DATABASE)); + assertEquals("Should match expected context", validContext, encryptionContext); + } + + @Test + public void should_return_when_decryptCalledWithValidArgs() { + // Arrange + DecryptResponse mockResponse = DecryptResponse.builder() + .plaintext(SdkBytes.fromString(DECRYPTED, StandardCharsets.UTF_8)).build(); + when(kmsClient.decrypt(any(DecryptRequest.class))).thenReturn(mockResponse); + + // Act + String decrypted = encryptionClient.decrypt(ENCRYPTED, VALID_ID); + + // Assert + assertEquals(DECRYPTED, decrypted); + verify(kmsClient).decrypt(decryptRequestCaptor.capture()); + DecryptRequest capturedRequest = decryptRequestCaptor.getValue(); + + Map<String, String> encryptionContext = capturedRequest.encryptionContext(); + assertEquals("Should have exactly one entry", 1, encryptionContext.size()); + assertEquals("Should contain valid ID", VALID_ID, encryptionContext.get(AUTH_DATABASE)); + assertEquals("Should match expected context", validContext, encryptionContext); + } + + @Test + public void should_return_when_defaultConstructorCalled() { + // Act + AwsKmsEncryptionClient cryptoClient = new AwsKmsEncryptionClient(); + + // Assert + assertTrue(cryptoClient.getKmsClient() != null); + } } diff --git a/testing/partition-test-aws/pom.xml b/testing/partition-test-aws/pom.xml index 6a019eaa5679599463304e7a13de63be5ced85ef..c4d401d6c37cee09f33f352a837bc01bceee264e 100644 --- a/testing/partition-test-aws/pom.xml +++ b/testing/partition-test-aws/pom.xml @@ -68,8 +68,8 @@ <artifactId>os-core-lib-aws</artifactId> <version>0.26.0-spring6-rc2</version> </dependency> - - + + </dependencies> </project>