151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 2ee2676da0c3ab3814991cc0146e311839b145861Sergio Giro * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage javax.crypto.spec; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.spec.AlgorithmParameterSpec; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class specifies the parameters used with the 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <a href="http://www.ietf.org/rfc/rfc2268.txt"><i>RC2</i></a> 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * algorithm. 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The parameters consist of an effective key size and optionally 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * an 8-byte initialization vector (IV) (only in feedback mode). 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This class can be used to initialize a <code>Cipher</code> object that 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implements the <i>RC2</i> algorithm. 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Jan Luehe 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class RC2ParameterSpec implements AlgorithmParameterSpec { 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private byte[] iv = null; 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int effectiveKeyBits; 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a parameter set for RC2 from the given effective key size 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (in bits). 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param effectiveKeyBits the effective key size in bits. 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public RC2ParameterSpec(int effectiveKeyBits) { 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.effectiveKeyBits = effectiveKeyBits; 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a parameter set for RC2 from the given effective key size 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (in bits) and an 8-byte IV. 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The bytes that constitute the IV are those between 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>iv[0]</code> and <code>iv[7]</code> inclusive. 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param effectiveKeyBits the effective key size in bits. 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param iv the buffer with the 8-byte IV. The first 8 bytes of 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the buffer are copied to protect against subsequent modification. 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if <code>iv</code> is null. 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public RC2ParameterSpec(int effectiveKeyBits, byte[] iv) { 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(effectiveKeyBits, iv, 0); 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a parameter set for RC2 from the given effective key size 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (in bits) and IV. 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The IV is taken from <code>iv</code>, starting at 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>offset</code> inclusive. 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The bytes that constitute the IV are those between 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>iv[offset]</code> and <code>iv[offset+7]</code> inclusive. 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param effectiveKeyBits the effective key size in bits. 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param iv the buffer with the IV. The first 8 bytes 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the buffer beginning at <code>offset</code> inclusive 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * are copied to protect against subsequent modification. 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset the offset in <code>iv</code> where the 8-byte IV 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * starts. 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if <code>iv</code> is null. 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public RC2ParameterSpec(int effectiveKeyBits, byte[] iv, int offset) { 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.effectiveKeyBits = effectiveKeyBits; 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (iv == null) throw new IllegalArgumentException("IV missing"); 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int blockSize = 8; 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (iv.length - offset < blockSize) { 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("IV too short"); 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.iv = new byte[blockSize]; 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.arraycopy(iv, offset, this.iv, 0, blockSize); 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the effective key size in bits. 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the effective key size in bits. 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getEffectiveKeyBits() { 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this.effectiveKeyBits; 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the IV or null if this parameter set does not contain an IV. 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the IV or null if this parameter set does not contain an IV. 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a new array each time this method is called. 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte[] getIV() { 120ee2676da0c3ab3814991cc0146e311839b145861Sergio Giro return (iv == null? null:iv.clone()); 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Tests for equality between the specified object and this 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. Two RC2ParameterSpec objects are considered equal if their 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * effective key sizes and IVs are equal. 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (Two IV references are considered equal if both are <tt>null</tt>.) 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param obj the object to test for equality with this object. 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if the objects are considered equal, false if 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>obj</code> is null or otherwise. 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object obj) { 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (obj == this) { 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(obj instanceof RC2ParameterSpec)) { 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski RC2ParameterSpec other = (RC2ParameterSpec) obj; 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((effectiveKeyBits == other.effectiveKeyBits) && 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski java.util.Arrays.equals(iv, other.iv)); 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Calculates a hash code value for the object. 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Objects that are equal will also have the same hashcode. 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int retval = 0; 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (iv != null) { 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 1; i < iv.length; i++) { 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski retval += iv[i] * i; 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (retval += effectiveKeyBits); 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 161