1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage javax.crypto.spec;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.crypto.internal.nls.Messages;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The algorithm parameter specification for the <a
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * href="http://www.ietf.org/rfc/rfc2268.txt">RC2</a> algorithm.
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class RC2ParameterSpec implements AlgorithmParameterSpec {
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final int effectiveKeyBits;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final byte[] iv;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new <code>RC2ParameterSpec</code> instance with the specified
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * effective key length (in bits),
378207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param effectiveKeyBits
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the effective key length (in bits).
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RC2ParameterSpec(int effectiveKeyBits) {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.effectiveKeyBits = effectiveKeyBits;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        iv = null;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new <code>RC2ParameterSpec</code> instance with the specified
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * effective key length (in bits) and <i>initialization vector</i>.
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The size of the <i>initialization vector</i> must be at least 8 bytes
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * which are copied to protect them against modification.
528207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param effectiveKeyBits
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the effective key length (in bits).
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param iv
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the initialization vector.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the initialization vector is null or shorter than 8 bytes.
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RC2ParameterSpec(int effectiveKeyBits, byte[] iv) {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (iv == null) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("crypto.31")); //$NON-NLS-1$
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (iv.length < 8) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("crypto.41")); //$NON-NLS-1$
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.effectiveKeyBits = effectiveKeyBits;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.iv = new byte[8];
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.arraycopy(iv, 0, this.iv, 0, 8);
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new <code>RC2ParameterSpec</code> instance with the specified
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * effective key length (in bits) and <i>initialization vector<i>.
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The size of the <i>initialization vector</i> starting at
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>offset</code> must be at least 8 bytes which are copied to protect
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * them against modification.
798207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param effectiveKeyBits
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the effective key length (in bits).
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param iv
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the initialization vector.
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param offset
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the offset in the initialization vector to start at.
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the initialization vector is null or starting at
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             <code>offset</code> is shorter than 8 bytes.
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RC2ParameterSpec(int effectiveKeyBits, byte[] iv, int offset) {
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (iv == null) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("crypto.31")); //$NON-NLS-1$
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (iv.length - offset < 8) {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("crypto.41")); //$NON-NLS-1$
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.effectiveKeyBits = effectiveKeyBits;
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.iv = new byte[8];
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.arraycopy(iv, offset, this.iv, 0, 8);
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the effective key length (in bits).
1048207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the effective key length (in bits).
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getEffectiveKeyBits() {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return effectiveKeyBits;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a copy of the initialization vector.
1138207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a copy of the initialization vector, or null if none specified.
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public byte[] getIV() {
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (iv == null) {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] result = new byte[iv.length];
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.arraycopy(iv, 0, result, 0, iv.length);
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares the specified object to this <code>RC2ParameterSpec</code>
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance.
1288207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the object to compare.
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return true if the effective key length and the initialization vector of
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         both objects are equal, otherwise false.
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object obj) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj == this) {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(obj instanceof RC2ParameterSpec)) {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RC2ParameterSpec ps = (RC2ParameterSpec) obj;
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (effectiveKeyBits == ps.effectiveKeyBits)
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            && (Arrays.equals(iv, ps.iv));
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the hash code of this <code>RC2ParameterSpec</code> instance.
1498207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the hash code.
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = effectiveKeyBits;
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (iv == null) {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return result;
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (byte element : iv) {
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            result += element;
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165