in src/main/java/software/amazon/encryption/s3/materials/S3Keyring.java [94:126]
public DecryptionMaterials onDecrypt(final DecryptionMaterials materials, List<EncryptedDataKey> encryptedDataKeys) {
if (materials.plaintextDataKey() != null) {
throw new S3EncryptionClientException("Decryption materials already contains a plaintext data key.");
}
if (encryptedDataKeys.size() != 1) {
throw new S3EncryptionClientException("Only one encrypted data key is supported, found: " + encryptedDataKeys.size());
}
EncryptedDataKey encryptedDataKey = encryptedDataKeys.get(0);
final String keyProviderId = encryptedDataKey.keyProviderId();
if (!KEY_PROVIDER_ID.equals(keyProviderId)) {
throw new S3EncryptionClientException("Unknown key provider: " + keyProviderId);
}
String keyProviderInfo = new String(encryptedDataKey.keyProviderInfo(), StandardCharsets.UTF_8);
DecryptDataKeyStrategy decryptStrategy = decryptDataKeyStrategies().get(keyProviderInfo);
if (decryptStrategy == null) {
throw new S3EncryptionClientException("The keyring does not support the object's key wrapping algorithm: " + keyProviderInfo);
}
if (decryptStrategy.isLegacy() && !_enableLegacyWrappingAlgorithms) {
throw new S3EncryptionClientException("Enable legacy wrapping algorithms to use legacy key wrapping algorithm: " + keyProviderInfo);
}
try {
byte[] plaintext = decryptStrategy.decryptDataKey(materials, encryptedDataKey.encryptedDatakey());
return materials.toBuilder().plaintextDataKey(plaintext).build();
} catch (GeneralSecurityException e) {
throw new S3EncryptionClientException("Unable to " + keyProviderInfo + " unwrap", e);
}
}