diff options
author | Kenny Root <kroot@google.com> | 2013-05-13 14:47:30 -0700 |
---|---|---|
committer | Kenny Root <kroot@google.com> | 2013-05-14 17:33:18 -0700 |
commit | d416195acbc08f2b3bdd5d5532d40438465d99e9 (patch) | |
tree | 531d20377c7bb7471798b0f4e622ac882bf0d291 /luni/src/main/java/javax/crypto/spec | |
parent | e95612e19f51b0fbcc9196e7a07737388010a4ea (diff) | |
download | libcore-d416195acbc08f2b3bdd5d5532d40438465d99e9.zip libcore-d416195acbc08f2b3bdd5d5532d40438465d99e9.tar.gz libcore-d416195acbc08f2b3bdd5d5532d40438465d99e9.tar.bz2 |
Add classes for AEAD encryption
New classes in Java 7 for Authenicated Encryption with Additional Data
(AEAD). This allows the use of encryption modes such as Galois/Counter
Mode with performs the equivalent of MAC and encryption simultaneously
and consequently makes encryption safer to use for implementors.
Change-Id: I6302826b096044ade5f62a667dc240e3ab07b351
Diffstat (limited to 'luni/src/main/java/javax/crypto/spec')
-rw-r--r-- | luni/src/main/java/javax/crypto/spec/GCMParameterSpec.java | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/luni/src/main/java/javax/crypto/spec/GCMParameterSpec.java b/luni/src/main/java/javax/crypto/spec/GCMParameterSpec.java new file mode 100644 index 0000000..a781697 --- /dev/null +++ b/luni/src/main/java/javax/crypto/spec/GCMParameterSpec.java @@ -0,0 +1,97 @@ +/* + * Copyright 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License 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 javax.crypto.spec; + +import java.security.spec.AlgorithmParameterSpec; +import java.util.Arrays; + +/** + * Provides a the parameters for an instance of a {@link javax.crypto.Cipher} + * using Galois/Counter Mode (GCM). This is an Authenticated Encryption with + * Associated Data (AEAD) mode for a cipher which allows you to use the + * {@link javax.crypto.Cipher#updateAAD(byte[])} method to provide data that is + * transmitted in the clear but authenticated using a cryptographic Message + * Authentication Code (MAC). + * + * @since 1.7 + */ +public class GCMParameterSpec implements AlgorithmParameterSpec { + private final int tagLen; + + private final byte[] iv; + + /** + * Creates a new {@code GCMParameterSpec} instance from the specified + * Initial Vector (IV) from buffer {@code iv} and a tag length of + * {@code tagLen} in bits. + * + * @throws IllegalArgumentException if the specified {@code iv} is null or + * {@code offset} and {@code byteCount} do not specify a valid + * chunk in the specified buffer. + */ + public GCMParameterSpec(int tagLen, byte[] iv) { + if (tagLen < 0) { + throw new IllegalArgumentException("tag should be a non-negative integer"); + } + if (iv == null) { + throw new IllegalArgumentException("iv == null"); + } + this.tagLen = tagLen; + this.iv = iv.clone(); + } + + /** + * Creates a new {@code GCMParameterSpec} instance with the Initial Vector + * (IV) of {@code byteCount} bytes from the specified buffer {@code iv} + * starting at {@code offset} and a tag length of {@code tagLen} in bits. + * + * @throws IllegalArgumentException if the specified {@code iv} is null or + * {@code offset} and {@code byteCount} do not specify a valid + * chunk in the specified buffer. + * @throws ArrayIndexOutOfBoundsException if {@code offset} or + * {@code byteCount} are negative. + */ + public GCMParameterSpec(int tagLen, byte[] iv, int offset, int byteCount) { + if (tagLen < 0) { + throw new IllegalArgumentException("tag should be a non-negative integer"); + } + if (iv == null) { + throw new IllegalArgumentException("iv == null"); + } + try { + Arrays.checkOffsetAndCount(iv.length, offset, byteCount); + } catch (ArrayIndexOutOfBoundsException e) { + throw new IllegalArgumentException(e); + } + this.tagLen = tagLen; + this.iv = Arrays.copyOfRange(iv, offset, offset + byteCount); + } + + /** + * Returns the size of the tag in bits. + */ + public int getTLen() { + return tagLen; + } + + /** + * Returns the Initial Vector (IV) used by this parameter spec. + */ + public byte[] getIV() { + return iv.clone(); + } +} |