package javax.crypto.spec;
import java.security.spec.AlgorithmParameterSpec;
/**
* This class specifies the parameters used with the
* <a href="http://www.rsa.com/rsalabs/newfaq/q75.html"><i>RC2</i></a>
* algorithm.
* <p>
* The parameters consist of an effective key size and optionally
* an 8-byte initialization vector (IV) (only in feedback mode).
* <p>
* This class can be used to initialize a <code>Cipher</code> object that
* implements the <i>RC2</i> algorithm.
*/
public class RC2ParameterSpec
implements AlgorithmParameterSpec
{
private int effectiveKeyBits;
private byte[] iv = new byte[8];
/**
* Constructs a parameter set for RC2 from the given effective key size
* (in bits).
*
* @param effectiveKeyBits the effective key size in bits.
*/
public RC2ParameterSpec(
int effectiveKeyBits)
{
this.effectiveKeyBits = effectiveKeyBits;
}
/**
* Constructs a parameter set for RC2 from the given effective key size
* (in bits) and an 8-byte IV.
* <p>
* The bytes that constitute the IV are those between
* <code>iv[0]</code> and <code>iv[7]</code> inclusive.
*
* @param effectiveKeyBits the effective key size in bits.
* @param iv the buffer with the 8-byte IV.
*/
public RC2ParameterSpec(
int effectiveKeyBits,
byte[] iv)
{
this(effectiveKeyBits, iv, 0);
}
/**
* Constructs a parameter set for RC2 from the given effective key size
* (in bits) and IV.
* <p>
* The IV is taken from <code>iv</code>, starting at
* <code>offset</code> inclusive.
* The bytes that constitute the IV are those between
* <code>iv[offset]</code> and <code>iv[offset+7]</code> inclusive.
*
* @param effectiveKeyBits the effective key size in bits.
* @param iv the buffer with the IV.
* @param offset the offset in <code>iv</code> where the 8-byte IV starts.
*/
public RC2ParameterSpec(
int effectiveKeyBits,
byte[] iv,
int offset)
{
this.effectiveKeyBits = effectiveKeyBits;
this.iv = new byte[8];
System.arraycopy(iv, offset, this.iv, 0, this.iv.length);
}
/**
* Returns the effective key size in bits.
*
* @return the effective key size in bits.
*/
public int getEffectiveKeyBits()
{
return effectiveKeyBits;
}
/**
* Returns the IV or null if this parameter set does not contain an IV.
*
* @return the IV or null if this parameter set does not contain an IV.
*/
public byte[] getIV()
{
if (iv == null)
{
return null;
}
byte[] tmp = new byte[iv.length];
System.arraycopy(iv, 0, tmp, 0, tmp.length);
return tmp;
}
/**
* Tests for equality between the specified object and this
* object. Two RC2ParameterSpec objects are considered equal if their
* effective key sizes and IVs are equal.
* (Two IV references are considered equal if both are <tt>null</tt>.)
*
* @param obj the object to test for equality with this object.
* @return true if the objects are considered equal, false otherwise.
* @override equals in class java.lang.Object
*/
public boolean equals(
Object obj)
{
if ((obj == null) || !(obj instanceof RC2ParameterSpec))
{
return false;
}
RC2ParameterSpec spec = (RC2ParameterSpec)obj;
if (this.effectiveKeyBits != spec.effectiveKeyBits)
{
return false;
}
if (iv != null)
{
if (spec.iv == null)
{
return false;
}
for (int i = 0; i != iv.length; i++)
{
if (iv[i] != spec.iv[i])
{
return false;
}
}
}
else if (spec.iv != null)
{
return false;
}
return true;
}
/**
* Calculates a hash code value for the object.
* Objects that are equal will also have the same hashcode.
*
* @override hashCode in class java.lang.Object
*/
public int hashCode()
{
throw new RuntimeException("Not yet implemented");
}
}