mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
8302111: Serialization considerations
Reviewed-by: skoivu, rhalade, weijun, wetmore
This commit is contained in:
parent
df7d6e081f
commit
369c573383
21 changed files with 747 additions and 468 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -26,6 +26,7 @@
|
|||
package sun.security.provider;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InvalidObjectException;
|
||||
import java.security.AccessController;
|
||||
import java.security.DrbgParameters;
|
||||
import java.security.PrivilegedAction;
|
||||
|
@ -272,11 +273,18 @@ public final class DRBG extends SecureRandomSpi {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores the state of this object from the stream.
|
||||
*
|
||||
* @param s the {@code ObjectInputStream} from which data is read
|
||||
* @throws IOException if an I/O error occurs
|
||||
* @throws ClassNotFoundException if a serialized class cannot be loaded
|
||||
*/
|
||||
@java.io.Serial
|
||||
private void readObject(java.io.ObjectInputStream s)
|
||||
throws IOException, ClassNotFoundException {
|
||||
s.defaultReadObject();
|
||||
if (mdp.mech == null) {
|
||||
if (mdp == null || mdp.mech == null) {
|
||||
throw new IllegalArgumentException("Input data is corrupted");
|
||||
}
|
||||
createImpl();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -127,13 +127,24 @@ public final class ObjectIdentifier implements Serializable {
|
|||
// Is the component's field calculated?
|
||||
private transient boolean componentsCalculated = false;
|
||||
|
||||
/**
|
||||
* Restores the state of this object from the stream.
|
||||
*
|
||||
* @param is the {@code ObjectInputStream} from which data is read
|
||||
* @throws IOException if an I/O error occurs
|
||||
* @throws ClassNotFoundException if a serialized class cannot be loaded
|
||||
*/
|
||||
@java.io.Serial
|
||||
private void readObject(ObjectInputStream is)
|
||||
throws IOException, ClassNotFoundException {
|
||||
is.defaultReadObject();
|
||||
|
||||
if (encoding == null) { // from an old version
|
||||
int[] comp = (int[])components;
|
||||
if (components == null) {
|
||||
throw new InvalidObjectException("OID components is null");
|
||||
}
|
||||
|
||||
int[] comp = ((int[]) components).clone();
|
||||
if (componentLen > comp.length) {
|
||||
componentLen = comp.length;
|
||||
}
|
||||
|
@ -142,7 +153,9 @@ public final class ObjectIdentifier implements Serializable {
|
|||
// will be performed again in init().
|
||||
checkOidSize(componentLen);
|
||||
init(comp, componentLen);
|
||||
components = comp;
|
||||
} else {
|
||||
encoding = encoding.clone(); // defensive copying
|
||||
checkOidSize(encoding.length);
|
||||
check(encoding);
|
||||
}
|
||||
|
@ -261,6 +274,7 @@ public final class ObjectIdentifier implements Serializable {
|
|||
encoding = in.getDerValue().getOID().encoding;
|
||||
}
|
||||
|
||||
// set 'encoding' field based on the specified 'components' and 'length'
|
||||
private void init(int[] components, int length) throws IOException {
|
||||
int pos = 0;
|
||||
byte[] tmp = new byte[length * 5 + 1]; // +1 for empty input
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -25,11 +25,13 @@
|
|||
|
||||
package sun.security.x509;
|
||||
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InvalidObjectException;
|
||||
import java.math.BigInteger;
|
||||
import java.security.*;
|
||||
import java.security.interfaces.DSAParams;
|
||||
|
||||
import java.util.Arrays;
|
||||
import sun.security.util.*;
|
||||
|
||||
|
||||
|
@ -72,33 +74,42 @@ import sun.security.util.*;
|
|||
*
|
||||
* @author David Brownell
|
||||
*/
|
||||
public final
|
||||
class AlgIdDSA extends AlgorithmId implements DSAParams
|
||||
{
|
||||
public final class AlgIdDSA extends AlgorithmId implements DSAParams {
|
||||
|
||||
@java.io.Serial
|
||||
private static final long serialVersionUID = 3437177836797504046L;
|
||||
|
||||
private static class DSAComponents {
|
||||
private final BigInteger p;
|
||||
private final BigInteger q;
|
||||
private final BigInteger g;
|
||||
DSAComponents(BigInteger p, BigInteger q, BigInteger g) {
|
||||
this.p = p;
|
||||
this.q = q;
|
||||
this.g = g;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The three unsigned integer parameters.
|
||||
*/
|
||||
private BigInteger p , q, g;
|
||||
private BigInteger p, q, g;
|
||||
|
||||
/** Returns the DSS/DSA parameter "P" */
|
||||
public BigInteger getP () { return p; }
|
||||
public BigInteger getP() { return p; }
|
||||
|
||||
/** Returns the DSS/DSA parameter "Q" */
|
||||
public BigInteger getQ () { return q; }
|
||||
public BigInteger getQ() { return q; }
|
||||
|
||||
/** Returns the DSS/DSA parameter "G" */
|
||||
public BigInteger getG () { return g; }
|
||||
public BigInteger getG() { return g; }
|
||||
|
||||
/**
|
||||
* Default constructor. The OID and parameters must be
|
||||
* deserialized before this algorithm ID is used.
|
||||
*/
|
||||
@Deprecated
|
||||
public AlgIdDSA () {}
|
||||
public AlgIdDSA() {}
|
||||
|
||||
/**
|
||||
* Constructs a DSS/DSA Algorithm ID from numeric parameters.
|
||||
|
@ -109,7 +120,7 @@ class AlgIdDSA extends AlgorithmId implements DSAParams
|
|||
* @param q the DSS/DSA parameter "Q"
|
||||
* @param g the DSS/DSA parameter "G"
|
||||
*/
|
||||
public AlgIdDSA (BigInteger p, BigInteger q, BigInteger g) {
|
||||
public AlgIdDSA(BigInteger p, BigInteger q, BigInteger g) {
|
||||
super (DSA_oid);
|
||||
|
||||
if (p != null || q != null || g != null) {
|
||||
|
@ -120,8 +131,10 @@ class AlgIdDSA extends AlgorithmId implements DSAParams
|
|||
this.p = p;
|
||||
this.q = q;
|
||||
this.g = g;
|
||||
initializeParams ();
|
||||
|
||||
// For algorithm IDs which haven't been created from a DER
|
||||
// encoded value, need to create DER encoding and store it
|
||||
// into "encodedParams"
|
||||
encodedParams = encode(p, q, g);
|
||||
} catch (IOException e) {
|
||||
/* this should not happen */
|
||||
throw new ProviderException ("Construct DSS/DSA Algorithm ID");
|
||||
|
@ -133,50 +146,10 @@ class AlgIdDSA extends AlgorithmId implements DSAParams
|
|||
* Returns "DSA", indicating the Digital Signature Algorithm (DSA) as
|
||||
* defined by the Digital Signature Standard (DSS), FIPS 186.
|
||||
*/
|
||||
public String getName ()
|
||||
{ return "DSA"; }
|
||||
|
||||
|
||||
/*
|
||||
* For algorithm IDs which haven't been created from a DER encoded
|
||||
* value, "params" must be created.
|
||||
*/
|
||||
private void initializeParams () throws IOException {
|
||||
DerOutputStream out = new DerOutputStream();
|
||||
out.putInteger(p);
|
||||
out.putInteger(q);
|
||||
out.putInteger(g);
|
||||
DerOutputStream result = new DerOutputStream();
|
||||
result.write(DerValue.tag_Sequence, out);
|
||||
encodedParams = result.toByteArray();
|
||||
public String getName() {
|
||||
return "DSA";
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses algorithm parameters P, Q, and G. They're found
|
||||
* in the "params" member, which never needs to be changed.
|
||||
*/
|
||||
protected void decodeParams () throws IOException {
|
||||
if (encodedParams == null) {
|
||||
throw new IOException("DSA alg params are null");
|
||||
}
|
||||
|
||||
DerValue params = new DerValue(encodedParams);
|
||||
if (params.tag != DerValue.tag_Sequence) {
|
||||
throw new IOException("DSA alg parsing error");
|
||||
}
|
||||
|
||||
params.data.reset ();
|
||||
|
||||
this.p = params.data.getBigInteger();
|
||||
this.q = params.data.getBigInteger();
|
||||
this.g = params.data.getBigInteger();
|
||||
|
||||
if (params.data.available () != 0)
|
||||
throw new IOException ("AlgIdDSA params, extra="+
|
||||
params.data.available ());
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns a formatted string describing the parameters.
|
||||
*/
|
||||
|
@ -197,4 +170,44 @@ class AlgIdDSA extends AlgorithmId implements DSAParams
|
|||
"\n";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores the state of this object from the stream. Override to check
|
||||
* on the 'p', 'q', 'g', and 'encodedParams'.
|
||||
*
|
||||
* @param stream the {@code ObjectInputStream} from which data is read
|
||||
* @throws IOException if an I/O error occurs
|
||||
* @throws ClassNotFoundException if a serialized class cannot be loaded
|
||||
*/
|
||||
@java.io.Serial
|
||||
private void readObject(ObjectInputStream stream) throws IOException {
|
||||
try {
|
||||
stream.defaultReadObject();
|
||||
// if any of the 'p', 'q', 'g', 'encodedParams' is non-null,
|
||||
// then they must be all non-null w/ matching encoding
|
||||
if ((p != null || q != null || g != null || encodedParams != null)
|
||||
&& !Arrays.equals(encodedParams, encode(p, q, g))) {
|
||||
throw new InvalidObjectException("Invalid DSA alg params");
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the DER encoding w/ the specified 'p', 'q', 'g'
|
||||
*/
|
||||
private static byte[] encode(BigInteger p, BigInteger q,
|
||||
BigInteger g) throws IOException {
|
||||
if (p == null || q == null || g == null) {
|
||||
throw new InvalidObjectException("invalid null value");
|
||||
}
|
||||
DerOutputStream out = new DerOutputStream();
|
||||
out.putInteger(p);
|
||||
out.putInteger(q);
|
||||
out.putInteger(g);
|
||||
DerOutputStream result = new DerOutputStream();
|
||||
result.write(DerValue.tag_Sequence, out);
|
||||
return result.toByteArray();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue