/* * Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.services.dynamodbv2.datamodeling.encryption; import java.security.GeneralSecurityException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; /** * Identifies keys which should not be used directly with {@link Cipher} but instead contain their * own cryptographic logic. This can be used to wrap more complex logic, HSM integration, or * service-calls. * *
Most delegated keys will only support a subset of these operations. (For example, AES keys
* will generally not support {@link #sign(byte[], String)} or {@link #verify(byte[], byte[],
* String)} and HMAC keys will generally not support anything except sign
and
* verify
.) {@link UnsupportedOperationException} should be thrown in these cases.
*
* @author Greg Rubin
*/
public interface DelegatedKey extends SecretKey {
/**
* Encrypts the provided plaintext and returns a byte-array containing the ciphertext.
*
* @param plainText
* @param additionalAssociatedData Optional additional data which must then also be provided for
* successful decryption. Both null
and arrays of length 0 are treated
* identically. Not all keys will support this parameter.
* @param algorithm the transformation to be used when encrypting the data
* @return ciphertext the ciphertext produced by this encryption operation
* @throws UnsupportedOperationException if encryption is not supported or if
* additionalAssociatedData
is provided, but not supported.
*/
public byte[] encrypt(byte[] plainText, byte[] additionalAssociatedData, String algorithm)
throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException,
NoSuchAlgorithmException, NoSuchPaddingException;
/**
* Decrypts the provided ciphertext and returns a byte-array containing the plaintext.
*
* @param cipherText
* @param additionalAssociatedData Optional additional data which was provided during encryption.
* Both null
and arrays of length 0 are treated identically. Not all keys will
* support this parameter.
* @param algorithm the transformation to be used when decrypting the data
* @return plaintext the result of decrypting the input ciphertext
* @throws UnsupportedOperationException if decryption is not supported or if
* additionalAssociatedData
is provided, but not supported.
*/
public byte[] decrypt(byte[] cipherText, byte[] additionalAssociatedData, String algorithm)
throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException,
NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException;
/**
* Wraps (encrypts) the provided key
to make it safe for storage or transmission.
*
* @param key
* @param additionalAssociatedData Optional additional data which must then also be provided for
* successful unwrapping. Both null
and arrays of length 0 are treated
* identically. Not all keys will support this parameter.
* @param algorithm the transformation to be used when wrapping the key
* @return the wrapped key
* @throws UnsupportedOperationException if wrapping is not supported or if
* additionalAssociatedData
is provided, but not supported.
*/
public byte[] wrap(Key key, byte[] additionalAssociatedData, String algorithm)
throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException;
/**
* Unwraps (decrypts) the provided wrappedKey
to recover the original key.
*
* @param wrappedKey
* @param additionalAssociatedData Optional additional data which was provided during wrapping.
* Both null
and arrays of length 0 are treated identically. Not all keys will
* support this parameter.
* @param algorithm the transformation to be used when unwrapping the key
* @return the unwrapped key
* @throws UnsupportedOperationException if wrapping is not supported or if
* additionalAssociatedData
is provided, but not supported.
*/
public Key unwrap(
byte[] wrappedKey,
String wrappedKeyAlgorithm,
int wrappedKeyType,
byte[] additionalAssociatedData,
String algorithm)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException;
/**
* Calculates and returns a signature for dataToSign
.
*
* @param dataToSign
* @param algorithm
* @return the signature
* @throws UnsupportedOperationException if signing is not supported
*/
public byte[] sign(byte[] dataToSign, String algorithm) throws GeneralSecurityException;
/**
* Checks the provided signature for correctness.
*
* @param dataToSign
* @param signature
* @param algorithm
* @return true if and only if the signature
matches the dataToSign
.
* @throws UnsupportedOperationException if signature validation is not supported
*/
public boolean verify(byte[] dataToSign, byte[] signature, String algorithm);
}