|
DESede3KeySpec |
|
1 /* $RCSfile: DESede3KeySpec.java,v $
2 * $Revision: 1.8 $
3 * $Date: 2002/11/23 11:09:57 $
4 * $Author: uwe_guenther $
5 * $State: Exp $
6 *
7 * Created on August 11, 2001 11:18 AM
8 *
9 * Copyright (C) 2001 Uwe Guenther <uwe@cscc.de>
10 *
11 * This file is part of the jhbci JCE-ServiceProvider. The jhbci JCE-
12 * ServiceProvider is a library, written in JavaTM, that should be
13 * used in HBCI banking applications (clients and may be servers),
14 * to do cryptographic operations.
15 *
16 * The jhbci library is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU Lesser General Public
18 * License as published by the Free Software Foundation; either
19 * version 2.1 of the License, or (at your option) any later version.
20 *
21 * The jhbci library is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 * Lesser General Public License for more details.
25 *
26 * You should have received a copy of the GNU Lesser General Public
27 * License along with this library; if not, write to the Free Software
28 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 *
30 */
31
32 package de.cscc.crypto.provider.spec;
33
34 import java.security.InvalidKeyException;
35
36 /**
37 * 3 Key Triple DES secret keys specification (168 bit or 192 bit with parity)
38 * class.
39 *
40 * <p>This class is immutable.
41 *
42 * @author <a href=mailto:uwe@cscc.de>Uwe Günther</a>
43 * @version $Revision: 1.8 $
44 */
45 public class DESede3KeySpec implements DESKeySpec, Cloneable {
46
47 /** Key length in bytes. */
48 private static final int DES_EDE_3KEY_LEN = 24;
49
50 /** Internal data representation of key1. */
51 private DES1KeySpec key1;
52
53 /** Internal data representation of key2. */
54 private DES1KeySpec key2;
55
56 /** Internal data representation of key3. */
57 private DES1KeySpec key3;
58
59 /**
60 * Creates a new DESede3KeySpec from a 24 bytes long byte array.
61 * We use the first 24 bytes in key as the key material for the DES key.
62 *
63 * The first (leftmost) DES key (key[0] to key[7]) is key1,
64 * the second (middle) DES key (key[8] to key[15]) is key2 and
65 * the third (rightmost) DES key (key[16] to key[13]) is key3.
66 *
67 * @param key the buffer with the three DES keys.
68 * @throws InvalidKeyException if the given key material is shorter
69 * than 24 bytes or the key is weak or semi weak.
70 */
71 public DESede3KeySpec(byte[] key) throws InvalidKeyException {
72 this(key, 0);
73 }
74
75 /**
76 * Creates a new DESede3KeySpec from a 24 bytes long byte array.
77 *
78 * @param key the buffer with the DES keys.
79 * @param offset the offset in key, where the key starts.
80 * @throws InvalidKeyException if the given key material is shorter
81 * than 24 bytes or the key is weak or semi weak.
82 */
83 public DESede3KeySpec(byte[] key, int offset) throws InvalidKeyException {
84 this.key1 = new DES1KeySpec(key, offset+0);
85 this.key2 = new DES1KeySpec(key, offset+8);
86 this.key3 = new DES1KeySpec(key, offset+16);
87 }
88
89 /**
90 * Creates a new DESede3KeySpec from an existing one.
91 *
92 * @param key DesKeySpec object with a key.
93 */
94 public DESede3KeySpec(DESede3KeySpec key) {
95 this.key1 = new DES1KeySpec(key.key1);
96 this.key2 = new DES1KeySpec(key.key2);
97 this.key3 = new DES1KeySpec(key.key3);
98 }
99
100 /**
101 * Creates and returns a deep copy of this object.
102 *
103 * @return a clone of this instance.
104 * @see java.lang.Cloneable
105 * @exception CloneNotSupportedException if the object's class does not
106 * support the <code>Cloneable</code> interface. Subclasses
107 * that override the <code>clone</code> method can also
108 * throw this exception to indicate that an instance cannot
109 * be cloned.
110 */
111 public Object clone() throws CloneNotSupportedException {
112 DESede3KeySpec result = (DESede3KeySpec) super.clone();
113 result.key1 = (DES1KeySpec) this.key1.clone();
114 result.key2 = (DES1KeySpec) this.key2.clone();
115 result.key3 = (DES1KeySpec) this.key3.clone();
116 return result;
117 }
118
119 /**
120 * Indicates whether some other object is "equal to" this one.
121 *
122 * @param obj the reference object with which to compare.
123 * @return <code>true</code> if this object is the same as the obj
124 * argument; <code>false</code> otherwise.
125 * @see #hashCode()
126 * @see java.util.Hashtable
127 */
128 public boolean equals(Object obj) {
129 //Only for performance.
130 if (this == obj) {
131 return true;
132 }
133
134 //If obj == null then instanceof returns false, see JLS 15.20.2
135 if (!(obj instanceof DESede3KeySpec)) {
136 return false;
137 }
138
139 DESede3KeySpec other = (DESede3KeySpec)obj;
140 return this.key1.equals(other.key1) &&
141 this.key2.equals(other.key2) &&
142 this.key3.equals(other.key3) ;
143 }
144
145 /**
146 * Returns a hash code value for the object. This method is
147 * supported for the benefit of hashtables such as those provided by
148 * <code>java.util.Hashtable</code>.
149 *
150 * @return a hash code value for this object.
151 * @see #equals(java.lang.Object)
152 * @see java.util.Hashtable
153 */
154 public int hashCode() {
155 int result = 17;
156 result = 37*result + this.key1.hashCode();
157 result = 37*result + this.key2.hashCode();
158 result = 37*result + this.key3.hashCode();
159 return result;
160 }
161
162 /**
163 * Returns a string representation of the object.
164 * The Format may catch (change in further releases.
165 *
166 * @return a string representation of the object.
167 */
168 public String toString() {
169 return "key1: [" + this.key1 + "] " +
170 "key2: [" + this.key2 + "] " +
171 "key3: [" + this.key3 + "]";
172 }
173
174 /**
175 * Get the DES Key as byte[24].
176 *
177 * @return the DES Key as byte[24].
178 */
179 public byte[] getKey() {
180 byte[] returnValue = new byte[24];
181 System.arraycopy(this.key1.getKey(), 0, returnValue, 0, 8);
182 System.arraycopy(this.key2.getKey(), 0, returnValue, 8, 8);
183 System.arraycopy(this.key3.getKey(), 0, returnValue, 16, 8);
184 return returnValue;
185 }
186 }
187
|
DESede3KeySpec |
|