Frames | No Frames |
1: /* RC5ParameterSpec.java -- parameters for RC5. 2: Copyright (C) 2004 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package javax.crypto.spec; 40: 41: import java.security.spec.AlgorithmParameterSpec; 42: 43: /** 44: * A wrapper for parameters to the <a 45: * href="http://www.rsasecurity.com/rsalabs/faq/3-6-4.html">RC5</a> 46: * block cipher. 47: * 48: * @author Casey Marshall (csm@gnu.org) 49: * @since 1.4 50: */ 51: public class RC5ParameterSpec implements AlgorithmParameterSpec 52: { 53: 54: // Fields. 55: // ------------------------------------------------------------------------ 56: 57: /** The IV. */ 58: private byte[] iv; 59: 60: /** The number of rounds. */ 61: private int rounds; 62: 63: /** The version number. */ 64: private int version; 65: 66: /** The word size, in bits. */ 67: private int wordSize; 68: 69: // Constructors. 70: // ------------------------------------------------------------------------ 71: 72: /** 73: * Create RC5 parameters without an IV. 74: * 75: * @param version The version number. 76: * @param rounds The number of rounds. 77: * @param wordSize The size of a word, in bits. 78: */ 79: public RC5ParameterSpec(int version, int rounds, int wordSize) 80: { 81: this.version = version; 82: this.rounds = rounds; 83: this.wordSize = wordSize; 84: } 85: 86: /** 87: * Create RC5 parameters with an IV. The bytes in <code>iv</code> in 88: * the range <code>[0, 2*(wordSize/8)-1]</code> are used. 89: * 90: * @param version The version number. 91: * @param rounds The number of rounds. 92: * @param wordSize The size of a word, in bits. 93: * @param iv The IV data. 94: */ 95: public RC5ParameterSpec(int version, int rounds, int wordSize, byte[] iv) 96: { 97: this(version, rounds, wordSize, iv, 0); 98: } 99: 100: /** 101: * Create RC5 parameters with an IV. The bytes in <code>iv</code> in 102: * the range <code>[off, off+2*(wordSize/8)-1]</code> are used. 103: * 104: * @param version The version number. 105: * @param rounds The number of rounds. 106: * @param wordSize The size of a word, in bits. 107: * @param iv The IV data. 108: * @param off From where in the array the IV starts. 109: */ 110: public 111: RC5ParameterSpec(int version, int rounds, int wordSize, byte[] iv, int off) 112: { 113: this(version, rounds, wordSize); 114: int ivLength = 2 * (wordSize / 8); 115: if (off < 0) 116: throw new IllegalArgumentException(); 117: if (iv.length - off < ivLength) 118: { 119: throw new IllegalArgumentException("IV too short"); 120: } 121: this.iv = new byte[ivLength]; 122: System.arraycopy(iv, off, this.iv, 0, ivLength); 123: } 124: 125: // Instance methods. 126: // ------------------------------------------------------------------------ 127: 128: /** 129: * Return the initializaiton vector, or <code>null</code> if none was 130: * specified. 131: * 132: * @return The IV, or null. 133: */ 134: public byte[] getIV() 135: { 136: return iv; 137: } 138: 139: /** 140: * Get the number of rounds. 141: * 142: * @return The number of rounds. 143: */ 144: public int getRounds() 145: { 146: return rounds; 147: } 148: 149: /** 150: * Get the version number. 151: * 152: * @return The version number. 153: */ 154: public int getVersion() 155: { 156: return version; 157: } 158: 159: /** 160: * Get the word size, in bits. 161: * 162: * @return The word size, in bits. 163: */ 164: public int getWordSize() 165: { 166: return wordSize; 167: } 168: 169: public boolean equals(Object o) 170: { 171: if (this == o) return true; 172: byte[] oiv = ((RC5ParameterSpec) o).getIV(); 173: if (iv != oiv) 174: { 175: if (iv == null || oiv == null) return false; 176: if (iv.length != oiv.length) return false; 177: for (int i = 0; i < iv.length; i++) 178: { 179: if (iv[i] != oiv[i]) 180: { 181: return false; 182: } 183: } 184: } 185: return rounds == ((RC5ParameterSpec) o).getRounds() 186: && version == ((RC5ParameterSpec) o).getVersion() 187: && wordSize == ((RC5ParameterSpec) o).getWordSize(); 188: } 189: 190: public int hashCode() 191: { 192: int code = rounds + version + wordSize; 193: if (iv != null) 194: { 195: for (int i = 0; i < iv.length; i++) 196: { 197: code += iv[i]; 198: } 199: } 200: return code; 201: } 202: }