blob: 08a890f26c8d2296b99572b708cfa6a2d527284f [file] [log] [blame]
The Android Open Source Projectb5de22c2012-04-01 00:00:00 -07001/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package javax.crypto.spec;
19
20import java.security.spec.AlgorithmParameterSpec;
21import java.util.Arrays;
22
23/**
24 * The algorithm parameter specification for the <a
25 * href="http://www.ietf.org/rfc/rfc2040.txt">RC5</a> algorithm.
26 */
27public class RC5ParameterSpec implements AlgorithmParameterSpec {
28
29 private final int version;
30 private final int rounds;
31 private final int wordSize;
32 private final byte[] iv;
33
34 /**
35 * Creates a new <code>RC5ParameterSpec</code> instance with the specified
36 * version, round count an word size (in bits).
37 *
38 * @param version
39 * the version.
40 * @param rounds
41 * the round count.
42 * @param wordSize
43 * the word size (in bits).
44 */
45 public RC5ParameterSpec(int version, int rounds, int wordSize) {
46 this.version = version;
47 this.rounds = rounds;
48 this.wordSize = wordSize;
49 this.iv = null;
50 }
51
52 /**
53 * Creates a new <code>RC5ParameterSpec</code> instance with the specified
54 * version, round count, word size (in bits) and an <i>initialization
55 * vector</i>.
56 * <p>
57 * The size of the <i>initialization vector</i> must be at least
58 * <code>2 * (wordSize / 8)</code> bytes which are copied to protect them
59 * against modification.
60 *
61 * @param version
62 * the version.
63 * @param rounds
64 * the round count.
65 * @param wordSize
66 * the word size (in bits).
67 * @param iv
68 * the initialization vector.
69 * @throws IllegalArgumentException
70 * if the initialization vector is null or shorter than <code>2
71 * * (wordSize / 8)</code>.
72 */
73 public RC5ParameterSpec(int version, int rounds, int wordSize, byte[] iv) {
74 if (iv == null) {
75 throw new IllegalArgumentException("iv == null");
76 }
77 if (iv.length < 2 * (wordSize / 8)) {
78 throw new IllegalArgumentException("iv.length < 2 * (wordSize / 8)");
79 }
80 this.version = version;
81 this.rounds = rounds;
82 this.wordSize = wordSize;
83 this.iv = new byte[2*(wordSize/8)];
84 System.arraycopy(iv, 0, this.iv, 0, 2*(wordSize/8));
85 }
86
87 /**
88 * Creates a new <code>RC5ParameterSpec</code> instance with the specified
89 * version, round count, wordSize (in bits), an <i>initialization vector</i>
90 * and an offset.
91 * <p>
92 * The size of the <i>initialization vector</i> must be at least
93 * <code>offset + (2 * (wordSize / 8))</code> bytes. The bytes starting at
94 * <code>offset</code> are copied to protect them against modification.
95 *
96 * @param version
97 * the version.
98 * @param rounds
99 * the round count.
100 * @param wordSize
101 * the word size (in bits).
102 * @param iv
103 * the initialization vector.
104 * @param offset
105 * the offset in the initialization vector.
106 * @throws IllegalArgumentException
107 * if the initialization vector is null of shorter than
108 * <code>offset + (2 * (wordSize / 8))</code>.
109 * @throws ArrayIndexOutOfBoundsException
110 * if <code>offset</code> is negative.
111 */
112 public RC5ParameterSpec(int version, int rounds, int wordSize, byte[] iv, int offset) {
113 if (iv == null) {
114 throw new IllegalArgumentException("iv == null");
115 }
116 if (offset < 0) {
117 throw new ArrayIndexOutOfBoundsException("offset < 0: " + offset);
118 }
119 if (iv.length - offset < 2 * (wordSize / 8)) {
120 throw new IllegalArgumentException("iv.length - offset < 2 * (wordSize / 8)");
121 }
122 this.version = version;
123 this.rounds = rounds;
124 this.wordSize = wordSize;
125 this.iv = new byte[offset+2*(wordSize/8)];
126 System.arraycopy(iv, offset, this.iv, 0, 2*(wordSize/8));
127 }
128
129 /**
130 * Returns the version.
131 *
132 * @return the version.
133 */
134 public int getVersion() {
135 return version;
136 }
137
138 /**
139 * Returns the round count.
140 *
141 * @return the round count.
142 */
143 public int getRounds() {
144 return rounds;
145 }
146
147 /**
148 * Returns the word size (in bits).
149 *
150 * @return the word size (in bits).
151 */
152 public int getWordSize() {
153 return wordSize;
154 }
155
156 /**
157 * Returns a copy of the initialization vector.
158 *
159 * @return a copy of the initialization vector, or null if none specified.
160 */
161 public byte[] getIV() {
162 if (iv == null) {
163 return null;
164 }
165 byte[] result = new byte[iv.length];
166 System.arraycopy(iv, 0, result, 0, iv.length);
167 return result;
168 }
169
170 /**
171 * Compares the specified object with this <code>RC5ParameterSpec</code>
172 * instance.
173 *
174 * @param obj
175 * the object to compare.
176 * @return true if version, round count, word size and initializaion vector
177 * of both objects are equal, otherwise false.
178 */
179 @Override
180 public boolean equals(Object obj) {
181 if (obj == this) {
182 return true;
183 }
184 if (!(obj instanceof RC5ParameterSpec)) {
185 return false;
186 }
187 RC5ParameterSpec ps = (RC5ParameterSpec) obj;
188 return (version == ps.version)
189 && (rounds == ps.rounds)
190 && (wordSize == ps.wordSize)
191 && (Arrays.equals(iv, ps.iv));
192 }
193
194 /**
195 * Returns the hash code of this <code>RC5ParameterSpec</code> instance.
196 *
197 * @return the hash code.
198 */
199 @Override
200 public int hashCode() {
201 int result = version + rounds + wordSize;
202 if (iv == null) {
203 return result;
204 }
205 for (byte element : iv) {
206 result += element & 0xFF;
207 }
208 return result;
209 }
210}