001/* RC5ParameterSpec.java -- parameters for RC5.
002   Copyright (C) 2004  Free Software Foundation, Inc.
003
004This file is part of GNU Classpath.
005
006GNU Classpath is free software; you can redistribute it and/or modify
007it under the terms of the GNU General Public License as published by
008the Free Software Foundation; either version 2, or (at your option)
009any later version.
010
011GNU Classpath is distributed in the hope that it will be useful, but
012WITHOUT ANY WARRANTY; without even the implied warranty of
013MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014General Public License for more details.
015
016You should have received a copy of the GNU General Public License
017along with GNU Classpath; see the file COPYING.  If not, write to the
018Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
01902110-1301 USA.
020
021Linking this library statically or dynamically with other modules is
022making a combined work based on this library.  Thus, the terms and
023conditions of the GNU General Public License cover the whole
024combination.
025
026As a special exception, the copyright holders of this library give you
027permission to link this library with independent modules to produce an
028executable, regardless of the license terms of these independent
029modules, and to copy and distribute the resulting executable under
030terms of your choice, provided that you also meet, for each linked
031independent module, the terms and conditions of the license of that
032module.  An independent module is a module which is not derived from
033or based on this library.  If you modify this library, you may extend
034this exception to your version of the library, but you are not
035obligated to do so.  If you do not wish to do so, delete this
036exception statement from your version. */
037
038
039package javax.crypto.spec;
040
041import java.security.spec.AlgorithmParameterSpec;
042
043/**
044 * A wrapper for parameters to the <a
045 * href="http://www.rsasecurity.com/rsalabs/faq/3-6-4.html">RC5</a>
046 * block cipher.
047 *
048 * @author Casey Marshall (csm@gnu.org)
049 * @since 1.4
050 */
051public class RC5ParameterSpec implements AlgorithmParameterSpec
052{
053
054  // Fields.
055  // ------------------------------------------------------------------------
056
057  /** The IV. */
058  private byte[] iv;
059
060  /** The number of rounds. */
061  private int rounds;
062
063  /** The version number. */
064  private int version;
065
066  /** The word size, in bits. */
067  private int wordSize;
068
069  // Constructors.
070  // ------------------------------------------------------------------------
071
072  /**
073   * Create RC5 parameters without an IV.
074   *
075   * @param version  The version number.
076   * @param rounds   The number of rounds.
077   * @param wordSize The size of a word, in bits.
078   */
079  public RC5ParameterSpec(int version, int rounds, int wordSize)
080  {
081    this.version = version;
082    this.rounds = rounds;
083    this.wordSize = wordSize;
084  }
085
086  /**
087   * Create RC5 parameters with an IV. The bytes in <code>iv</code> in
088   * the range <code>[0, 2*(wordSize/8)-1]</code> are used.
089   *
090   * @param version  The version number.
091   * @param rounds   The number of rounds.
092   * @param wordSize The size of a word, in bits.
093   * @param iv       The IV data.
094   */
095  public RC5ParameterSpec(int version, int rounds, int wordSize, byte[] iv)
096  {
097    this(version, rounds, wordSize, iv, 0);
098  }
099
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}