Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/javax/crypto/ExemptionMechanism.java
38829 views
1
/*
2
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. 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. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package javax.crypto;
27
28
import java.security.AlgorithmParameters;
29
import java.security.Provider;
30
import java.security.Key;
31
import java.security.Security;
32
import java.security.NoSuchAlgorithmException;
33
import java.security.NoSuchProviderException;
34
import java.security.InvalidKeyException;
35
import java.security.InvalidAlgorithmParameterException;
36
import java.security.spec.AlgorithmParameterSpec;
37
38
import sun.security.jca.GetInstance.Instance;
39
40
/**
41
* This class provides the functionality of an exemption mechanism, examples
42
* of which are <i>key recovery</i>, <i>key weakening</i>, and
43
* <i>key escrow</i>.
44
*
45
* <p>Applications or applets that use an exemption mechanism may be granted
46
* stronger encryption capabilities than those which don't.
47
*
48
* @since 1.4
49
*/
50
51
public class ExemptionMechanism {
52
53
// The provider
54
private Provider provider;
55
56
// The provider implementation (delegate)
57
private ExemptionMechanismSpi exmechSpi;
58
59
// The name of the exemption mechanism.
60
private String mechanism;
61
62
// Flag which indicates whether this ExemptionMechanism
63
// result is generated successfully.
64
private boolean done = false;
65
66
// State information
67
private boolean initialized = false;
68
69
// Store away the key at init() time for later comparison.
70
private Key keyStored = null;
71
72
/**
73
* Creates a ExemptionMechanism object.
74
*
75
* @param exmechSpi the delegate
76
* @param provider the provider
77
* @param mechanism the exemption mechanism
78
*/
79
protected ExemptionMechanism(ExemptionMechanismSpi exmechSpi,
80
Provider provider,
81
String mechanism) {
82
this.exmechSpi = exmechSpi;
83
this.provider = provider;
84
this.mechanism = mechanism;
85
}
86
87
/**
88
* Returns the exemption mechanism name of this
89
* <code>ExemptionMechanism</code> object.
90
*
91
* <p>This is the same name that was specified in one of the
92
* <code>getInstance</code> calls that created this
93
* <code>ExemptionMechanism</code> object.
94
*
95
* @return the exemption mechanism name of this
96
* <code>ExemptionMechanism</code> object.
97
*/
98
public final String getName() {
99
return this.mechanism;
100
}
101
102
/**
103
* Returns an <code>ExemptionMechanism</code> object that implements the
104
* specified exemption mechanism algorithm.
105
*
106
* <p> This method traverses the list of registered security Providers,
107
* starting with the most preferred Provider.
108
* A new ExemptionMechanism object encapsulating the
109
* ExemptionMechanismSpi implementation from the first
110
* Provider that supports the specified algorithm is returned.
111
*
112
* <p> Note that the list of registered providers may be retrieved via
113
* the {@link Security#getProviders() Security.getProviders()} method.
114
*
115
* @param algorithm the standard name of the requested exemption
116
* mechanism.
117
* See the ExemptionMechanism section in the
118
* <a href=
119
* "{@docRoot}/../technotes/guides/security/StandardNames.html#Exemption">
120
* Java Cryptography Architecture Standard Algorithm Name Documentation</a>
121
* for information about standard exemption mechanism names.
122
*
123
* @return the new <code>ExemptionMechanism</code> object.
124
*
125
* @exception NullPointerException if <code>algorithm</code>
126
* is null.
127
*
128
* @exception NoSuchAlgorithmException if no Provider supports an
129
* ExemptionMechanismSpi implementation for the
130
* specified algorithm.
131
*
132
* @see java.security.Provider
133
*/
134
public static final ExemptionMechanism getInstance(String algorithm)
135
throws NoSuchAlgorithmException {
136
Instance instance = JceSecurity.getInstance("ExemptionMechanism",
137
ExemptionMechanismSpi.class, algorithm);
138
return new ExemptionMechanism((ExemptionMechanismSpi)instance.impl,
139
instance.provider, algorithm);
140
}
141
142
143
/**
144
* Returns an <code>ExemptionMechanism</code> object that implements the
145
* specified exemption mechanism algorithm.
146
*
147
* <p> A new ExemptionMechanism object encapsulating the
148
* ExemptionMechanismSpi implementation from the specified provider
149
* is returned. The specified provider must be registered
150
* in the security provider list.
151
*
152
* <p> Note that the list of registered providers may be retrieved via
153
* the {@link Security#getProviders() Security.getProviders()} method.
154
155
* @param algorithm the standard name of the requested exemption mechanism.
156
* See the ExemptionMechanism section in the
157
* <a href=
158
* "{@docRoot}/../technotes/guides/security/StandardNames.html#Exemption">
159
* Java Cryptography Architecture Standard Algorithm Name Documentation</a>
160
* for information about standard exemption mechanism names.
161
*
162
* @param provider the name of the provider.
163
*
164
* @return the new <code>ExemptionMechanism</code> object.
165
*
166
* @exception NullPointerException if <code>algorithm</code>
167
* is null.
168
*
169
* @exception NoSuchAlgorithmException if an ExemptionMechanismSpi
170
* implementation for the specified algorithm is not
171
* available from the specified provider.
172
*
173
* @exception NoSuchProviderException if the specified provider is not
174
* registered in the security provider list.
175
*
176
* @exception IllegalArgumentException if the <code>provider</code>
177
* is null or empty.
178
*
179
* @see java.security.Provider
180
*/
181
public static final ExemptionMechanism getInstance(String algorithm,
182
String provider) throws NoSuchAlgorithmException,
183
NoSuchProviderException {
184
Instance instance = JceSecurity.getInstance("ExemptionMechanism",
185
ExemptionMechanismSpi.class, algorithm, provider);
186
return new ExemptionMechanism((ExemptionMechanismSpi)instance.impl,
187
instance.provider, algorithm);
188
}
189
190
/**
191
* Returns an <code>ExemptionMechanism</code> object that implements the
192
* specified exemption mechanism algorithm.
193
*
194
* <p> A new ExemptionMechanism object encapsulating the
195
* ExemptionMechanismSpi implementation from the specified Provider
196
* object is returned. Note that the specified Provider object
197
* does not have to be registered in the provider list.
198
*
199
* @param algorithm the standard name of the requested exemption mechanism.
200
* See the ExemptionMechanism section in the
201
* <a href=
202
* "{@docRoot}/../technotes/guides/security/StandardNames.html#Exemption">
203
* Java Cryptography Architecture Standard Algorithm Name Documentation</a>
204
* for information about standard exemption mechanism names.
205
*
206
* @param provider the provider.
207
*
208
* @return the new <code>ExemptionMechanism</code> object.
209
*
210
* @exception NullPointerException if <code>algorithm</code>
211
* is null.
212
*
213
* @exception NoSuchAlgorithmException if an ExemptionMechanismSpi
214
* implementation for the specified algorithm is not available
215
* from the specified Provider object.
216
*
217
* @exception IllegalArgumentException if the <code>provider</code>
218
* is null.
219
*
220
* @see java.security.Provider
221
*/
222
public static final ExemptionMechanism getInstance(String algorithm,
223
Provider provider) throws NoSuchAlgorithmException {
224
Instance instance = JceSecurity.getInstance("ExemptionMechanism",
225
ExemptionMechanismSpi.class, algorithm, provider);
226
return new ExemptionMechanism((ExemptionMechanismSpi)instance.impl,
227
instance.provider, algorithm);
228
}
229
230
/**
231
* Returns the provider of this <code>ExemptionMechanism</code> object.
232
*
233
* @return the provider of this <code>ExemptionMechanism</code> object.
234
*/
235
public final Provider getProvider() {
236
return this.provider;
237
}
238
239
/**
240
* Returns whether the result blob has been generated successfully by this
241
* exemption mechanism.
242
*
243
* <p>The method also makes sure that the key passed in is the same as
244
* the one this exemption mechanism used in initializing and generating
245
* phases.
246
*
247
* @param key the key the crypto is going to use.
248
*
249
* @return whether the result blob of the same key has been generated
250
* successfully by this exemption mechanism; false if <code>key</code>
251
* is null.
252
*
253
* @exception ExemptionMechanismException if problem(s) encountered
254
* while determining whether the result blob has been generated successfully
255
* by this exemption mechanism object.
256
*/
257
public final boolean isCryptoAllowed(Key key)
258
throws ExemptionMechanismException {
259
boolean ret = false;
260
if (done && (key != null)) {
261
// Check if the key passed in is the same as the one
262
// this exemption mechanism used.
263
ret = keyStored.equals(key);
264
}
265
return ret;
266
}
267
268
/**
269
* Returns the length in bytes that an output buffer would need to be in
270
* order to hold the result of the next
271
* {@link #genExemptionBlob(byte[]) genExemptionBlob}
272
* operation, given the input length <code>inputLen</code> (in bytes).
273
*
274
* <p>The actual output length of the next
275
* {@link #genExemptionBlob(byte[]) genExemptionBlob}
276
* call may be smaller than the length returned by this method.
277
*
278
* @param inputLen the input length (in bytes)
279
*
280
* @return the required output buffer size (in bytes)
281
*
282
* @exception IllegalStateException if this exemption mechanism is in a
283
* wrong state (e.g., has not yet been initialized)
284
*/
285
public final int getOutputSize(int inputLen) throws IllegalStateException {
286
if (!initialized) {
287
throw new IllegalStateException(
288
"ExemptionMechanism not initialized");
289
}
290
if (inputLen < 0) {
291
throw new IllegalArgumentException(
292
"Input size must be equal to " + "or greater than zero");
293
}
294
return exmechSpi.engineGetOutputSize(inputLen);
295
}
296
297
/**
298
* Initializes this exemption mechanism with a key.
299
*
300
* <p>If this exemption mechanism requires any algorithm parameters
301
* that cannot be derived from the given <code>key</code>, the
302
* underlying exemption mechanism implementation is supposed to
303
* generate the required parameters itself (using provider-specific
304
* default values); in the case that algorithm parameters must be
305
* specified by the caller, an <code>InvalidKeyException</code> is raised.
306
*
307
* @param key the key for this exemption mechanism
308
*
309
* @exception InvalidKeyException if the given key is inappropriate for
310
* this exemption mechanism.
311
* @exception ExemptionMechanismException if problem(s) encountered in the
312
* process of initializing.
313
*/
314
public final void init(Key key)
315
throws InvalidKeyException, ExemptionMechanismException {
316
done = false;
317
initialized = false;
318
319
keyStored = key;
320
exmechSpi.engineInit(key);
321
initialized = true;
322
}
323
324
/**
325
* Initializes this exemption mechanism with a key and a set of algorithm
326
* parameters.
327
*
328
* <p>If this exemption mechanism requires any algorithm parameters
329
* and <code>params</code> is null, the underlying exemption
330
* mechanism implementation is supposed to generate the required
331
* parameters itself (using provider-specific default values); in the case
332
* that algorithm parameters must be specified by the caller, an
333
* <code>InvalidAlgorithmParameterException</code> is raised.
334
*
335
* @param key the key for this exemption mechanism
336
* @param params the algorithm parameters
337
*
338
* @exception InvalidKeyException if the given key is inappropriate for
339
* this exemption mechanism.
340
* @exception InvalidAlgorithmParameterException if the given algorithm
341
* parameters are inappropriate for this exemption mechanism.
342
* @exception ExemptionMechanismException if problem(s) encountered in the
343
* process of initializing.
344
*/
345
public final void init(Key key, AlgorithmParameterSpec params)
346
throws InvalidKeyException, InvalidAlgorithmParameterException,
347
ExemptionMechanismException {
348
done = false;
349
initialized = false;
350
351
keyStored = key;
352
exmechSpi.engineInit(key, params);
353
initialized = true;
354
}
355
356
/**
357
* Initializes this exemption mechanism with a key and a set of algorithm
358
* parameters.
359
*
360
* <p>If this exemption mechanism requires any algorithm parameters
361
* and <code>params</code> is null, the underlying exemption mechanism
362
* implementation is supposed to generate the required parameters itself
363
* (using provider-specific default values); in the case that algorithm
364
* parameters must be specified by the caller, an
365
* <code>InvalidAlgorithmParameterException</code> is raised.
366
*
367
* @param key the key for this exemption mechanism
368
* @param params the algorithm parameters
369
*
370
* @exception InvalidKeyException if the given key is inappropriate for
371
* this exemption mechanism.
372
* @exception InvalidAlgorithmParameterException if the given algorithm
373
* parameters are inappropriate for this exemption mechanism.
374
* @exception ExemptionMechanismException if problem(s) encountered in the
375
* process of initializing.
376
*/
377
public final void init(Key key, AlgorithmParameters params)
378
throws InvalidKeyException, InvalidAlgorithmParameterException,
379
ExemptionMechanismException {
380
done = false;
381
initialized = false;
382
383
keyStored = key;
384
exmechSpi.engineInit(key, params);
385
initialized = true;
386
}
387
388
/**
389
* Generates the exemption mechanism key blob.
390
*
391
* @return the new buffer with the result key blob.
392
*
393
* @exception IllegalStateException if this exemption mechanism is in
394
* a wrong state (e.g., has not been initialized).
395
* @exception ExemptionMechanismException if problem(s) encountered in the
396
* process of generating.
397
*/
398
public final byte[] genExemptionBlob() throws IllegalStateException,
399
ExemptionMechanismException {
400
if (!initialized) {
401
throw new IllegalStateException(
402
"ExemptionMechanism not initialized");
403
}
404
byte[] blob = exmechSpi.engineGenExemptionBlob();
405
done = true;
406
return blob;
407
}
408
409
/**
410
* Generates the exemption mechanism key blob, and stores the result in
411
* the <code>output</code> buffer.
412
*
413
* <p>If the <code>output</code> buffer is too small to hold the result,
414
* a <code>ShortBufferException</code> is thrown. In this case, repeat this
415
* call with a larger output buffer. Use
416
* {@link #getOutputSize(int) getOutputSize} to determine how big
417
* the output buffer should be.
418
*
419
* @param output the buffer for the result
420
*
421
* @return the number of bytes stored in <code>output</code>
422
*
423
* @exception IllegalStateException if this exemption mechanism is in
424
* a wrong state (e.g., has not been initialized).
425
* @exception ShortBufferException if the given output buffer is too small
426
* to hold the result.
427
* @exception ExemptionMechanismException if problem(s) encountered in the
428
* process of generating.
429
*/
430
public final int genExemptionBlob(byte[] output)
431
throws IllegalStateException, ShortBufferException,
432
ExemptionMechanismException {
433
if (!initialized) {
434
throw new IllegalStateException
435
("ExemptionMechanism not initialized");
436
}
437
int n = exmechSpi.engineGenExemptionBlob(output, 0);
438
done = true;
439
return n;
440
}
441
442
/**
443
* Generates the exemption mechanism key blob, and stores the result in
444
* the <code>output</code> buffer, starting at <code>outputOffset</code>
445
* inclusive.
446
*
447
* <p>If the <code>output</code> buffer is too small to hold the result,
448
* a <code>ShortBufferException</code> is thrown. In this case, repeat this
449
* call with a larger output buffer. Use
450
* {@link #getOutputSize(int) getOutputSize} to determine how big
451
* the output buffer should be.
452
*
453
* @param output the buffer for the result
454
* @param outputOffset the offset in <code>output</code> where the result
455
* is stored
456
*
457
* @return the number of bytes stored in <code>output</code>
458
*
459
* @exception IllegalStateException if this exemption mechanism is in
460
* a wrong state (e.g., has not been initialized).
461
* @exception ShortBufferException if the given output buffer is too small
462
* to hold the result.
463
* @exception ExemptionMechanismException if problem(s) encountered in the
464
* process of generating.
465
*/
466
public final int genExemptionBlob(byte[] output, int outputOffset)
467
throws IllegalStateException, ShortBufferException,
468
ExemptionMechanismException {
469
if (!initialized) {
470
throw new IllegalStateException
471
("ExemptionMechanism not initialized");
472
}
473
int n = exmechSpi.engineGenExemptionBlob(output, outputOffset);
474
done = true;
475
return n;
476
}
477
478
/**
479
* Ensures that the key stored away by this ExemptionMechanism
480
* object will be wiped out when there are no more references to it.
481
*/
482
protected void finalize() {
483
keyStored = null;
484
// Are there anything else we could do?
485
}
486
}
487
488