blob: 242db61d83fb6302b37d48d16676e668b9667915 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package com.sun.crypto.provider;
27
28import java.security.*;
29import java.security.spec.AlgorithmParameterSpec;
30
31import javax.crypto.*;
32import javax.crypto.spec.SecretKeySpec;
33
34/**
35 * KeyGeneratore core implementation and individual key generator
36 * implementations. Because of US export regulations, we cannot use
37 * subclassing to achieve code sharing between the key generator
38 * implementations for our various algorithms. Instead, we have the
39 * core implementation in this KeyGeneratorCore class, which is used
40 * by the individual implementations. See those further down in this
41 * file.
42 *
43 * @since 1.5
44 * @author Andreas Sterbenz
45 */
46final class KeyGeneratorCore {
47
48 // algorithm name to use for the generator keys
49 private final String name;
50
51 // default key size in bits
52 private final int defaultKeySize;
53
54 // current key size in bits
55 private int keySize;
56
57 // PRNG to use
58 private SecureRandom random;
59
60 /**
61 * Construct a new KeyGeneratorCore object with the specified name
62 * and defaultKeySize. Initialize to default key size in case the
63 * application does not call any of the init() methods.
64 */
65 KeyGeneratorCore(String name, int defaultKeySize) {
66 this.name = name;
67 this.defaultKeySize = defaultKeySize;
68 implInit(null);
69 }
70
71 // implementation for engineInit(), see JCE doc
72 // reset keySize to default
73 void implInit(SecureRandom random) {
74 this.keySize = defaultKeySize;
75 this.random = random;
76 }
77
78 // implementation for engineInit(), see JCE doc
79 // we do not support any parameters
80 void implInit(AlgorithmParameterSpec params, SecureRandom random)
81 throws InvalidAlgorithmParameterException {
82 throw new InvalidAlgorithmParameterException
83 (name + " key generation does not take any parameters");
84 }
85
86 // implementation for engineInit(), see JCE doc
87 // we enforce a general 40 bit minimum key size for security
88 void implInit(int keysize, SecureRandom random) {
89 if (keysize < 40) {
90 throw new InvalidParameterException
91 ("Key length must be at least 40 bits");
92 }
93 this.keySize = keysize;
94 this.random = random;
95 }
96
97 // implementation for engineInit(), see JCE doc
98 // generate the key
99 SecretKey implGenerateKey() {
100 if (random == null) {
101 random = SunJCE.RANDOM;
102 }
103 byte[] b = new byte[(keySize + 7) >> 3];
104 random.nextBytes(b);
105 return new SecretKeySpec(b, name);
106 }
107
108 // nested static class for the HmacSHA256 key generator
109 public static final class HmacSHA256KG extends KeyGeneratorSpi {
110 private final KeyGeneratorCore core;
111 public HmacSHA256KG() {
112 SunJCE.ensureIntegrity(getClass());
113 core = new KeyGeneratorCore("HmacSHA256", 256);
114 }
115 protected void engineInit(SecureRandom random) {
116 core.implInit(random);
117 }
118 protected void engineInit(AlgorithmParameterSpec params,
119 SecureRandom random) throws InvalidAlgorithmParameterException {
120 core.implInit(params, random);
121 }
122 protected void engineInit(int keySize, SecureRandom random) {
123 core.implInit(keySize, random);
124 }
125 protected SecretKey engineGenerateKey() {
126 return core.implGenerateKey();
127 }
128 }
129
130 // nested static class for the HmacSHA384 key generator
131 public static final class HmacSHA384KG extends KeyGeneratorSpi {
132 private final KeyGeneratorCore core;
133 public HmacSHA384KG() {
134 SunJCE.ensureIntegrity(getClass());
135 core = new KeyGeneratorCore("HmacSHA384", 384);
136 }
137 protected void engineInit(SecureRandom random) {
138 core.implInit(random);
139 }
140 protected void engineInit(AlgorithmParameterSpec params,
141 SecureRandom random) throws InvalidAlgorithmParameterException {
142 core.implInit(params, random);
143 }
144 protected void engineInit(int keySize, SecureRandom random) {
145 core.implInit(keySize, random);
146 }
147 protected SecretKey engineGenerateKey() {
148 return core.implGenerateKey();
149 }
150 }
151
152 // nested static class for the HmacSHA384 key generator
153 public static final class HmacSHA512KG extends KeyGeneratorSpi {
154 private final KeyGeneratorCore core;
155 public HmacSHA512KG() {
156 SunJCE.ensureIntegrity(getClass());
157 core = new KeyGeneratorCore("HmacSHA512", 512);
158 }
159 protected void engineInit(SecureRandom random) {
160 core.implInit(random);
161 }
162 protected void engineInit(AlgorithmParameterSpec params,
163 SecureRandom random) throws InvalidAlgorithmParameterException {
164 core.implInit(params, random);
165 }
166 protected void engineInit(int keySize, SecureRandom random) {
167 core.implInit(keySize, random);
168 }
169 protected SecretKey engineGenerateKey() {
170 return core.implGenerateKey();
171 }
172 }
173
174 // nested static class for the RC2 key generator
175 public static final class RC2KeyGenerator extends KeyGeneratorSpi {
176 private final KeyGeneratorCore core;
177 public RC2KeyGenerator() {
178 SunJCE.ensureIntegrity(getClass());
179 core = new KeyGeneratorCore("RC2", 128);
180 }
181 protected void engineInit(SecureRandom random) {
182 core.implInit(random);
183 }
184 protected void engineInit(AlgorithmParameterSpec params,
185 SecureRandom random) throws InvalidAlgorithmParameterException {
186 core.implInit(params, random);
187 }
188 protected void engineInit(int keySize, SecureRandom random) {
189 if ((keySize < 40) || (keySize > 1024)) {
190 throw new InvalidParameterException("Key length for RC2"
191 + " must be between 40 and 1024 bits");
192 }
193 core.implInit(keySize, random);
194 }
195 protected SecretKey engineGenerateKey() {
196 return core.implGenerateKey();
197 }
198 }
199
200 // nested static class for the ARCFOUR (RC4) key generator
201 public static final class ARCFOURKeyGenerator extends KeyGeneratorSpi {
202 private final KeyGeneratorCore core;
203 public ARCFOURKeyGenerator() {
204 SunJCE.ensureIntegrity(getClass());
205 core = new KeyGeneratorCore("ARCFOUR", 128);
206 }
207 protected void engineInit(SecureRandom random) {
208 core.implInit(random);
209 }
210 protected void engineInit(AlgorithmParameterSpec params,
211 SecureRandom random) throws InvalidAlgorithmParameterException {
212 core.implInit(params, random);
213 }
214 protected void engineInit(int keySize, SecureRandom random) {
215 if ((keySize < 40) || (keySize > 1024)) {
216 throw new InvalidParameterException("Key length for ARCFOUR"
217 + " must be between 40 and 1024 bits");
218 }
219 core.implInit(keySize, random);
220 }
221 protected SecretKey engineGenerateKey() {
222 return core.implGenerateKey();
223 }
224 }
225
226}