| /* |
| * 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(); |
| } |
| } |