blob: 9be9e5097f4b136f84c4092d7707899aa470f21c [file] [log] [blame]
package org.apache.amaterasu.common.crypto
import com.amazonaws.services.identitymanagement.model.AccessKey
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider
import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
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.EncryptRequest
import software.amazon.awssdk.regions.Region
class AwsKmsCryptoProvider(override val accessKeyId: String = "",
override val secretAccessKey: String = "",
override val region: String) : CryptoKeyProvider {
private var credentials: AwsCredentialsProvider = if (accessKeyId.isNotEmpty()) {
StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKeyId, secretAccessKey))
} else {
InstanceProfileCredentialsProvider.builder().build()
}
val kmsClient = KmsClient.builder().apply {
credentialsProvider(credentials)
region(Region.of(region))
}.build()
override fun decryptKey(cipherText: ByteArray): String {
val decryptRequest = DecryptRequest.builder().apply {
ciphertextBlob(SdkBytes.fromByteArray(cipherText))
}.build()
val decryptedValue = kmsClient.decrypt(decryptRequest).plaintext()
return decryptedValue.asUtf8String()
}
override fun encryptKey(keyId: String, value: String): ByteArray? {
val encryptRequest = EncryptRequest.builder().apply {
keyId(keyId)
plaintext(SdkBytes.fromUtf8String(value))
}.build()
val encryptResponse = kmsClient.encrypt(encryptRequest)
return encryptResponse.ciphertextBlob().asByteArray()
}
}