From 26382e27dd0aae4b1197dee91cea1d462609a166 Mon Sep 17 00:00:00 2001 From: Vinnie Ryan Date: Mon, 13 Dec 2010 14:58:52 +0000 Subject: [PATCH] 6799854: CodeSigner.hashCode() does not work with serialization Reviewed-by: mullan --- .../classes/java/security/CodeSigner.java | 8 ++- .../classes/java/security/Timestamp.java | 9 ++- .../share/native/sun/security/ec/ECC_JNI.cpp | 4 +- .../java/security/CodeSigner/Serialize.java | 68 ++++++++++++++++++ jdk/test/java/security/CodeSigner/cert_file | Bin 0 -> 784 bytes 5 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 jdk/test/java/security/CodeSigner/Serialize.java create mode 100644 jdk/test/java/security/CodeSigner/cert_file diff --git a/jdk/src/share/classes/java/security/CodeSigner.java b/jdk/src/share/classes/java/security/CodeSigner.java index 204f71970db..75a9df9d24b 100644 --- a/jdk/src/share/classes/java/security/CodeSigner.java +++ b/jdk/src/share/classes/java/security/CodeSigner.java @@ -25,7 +25,7 @@ package java.security; -import java.io.Serializable; +import java.io.*; import java.security.cert.CRL; import java.security.cert.CertPath; import sun.misc.JavaSecurityCodeSignerAccess; @@ -205,4 +205,10 @@ public final class CodeSigner implements Serializable { }); } + // Explicitly reset hash code value to -1 + private void readObject(ObjectInputStream ois) + throws IOException, ClassNotFoundException { + ois.defaultReadObject(); + myhash = -1; + } } diff --git a/jdk/src/share/classes/java/security/Timestamp.java b/jdk/src/share/classes/java/security/Timestamp.java index f9bb77cd19d..1629d9bbff9 100644 --- a/jdk/src/share/classes/java/security/Timestamp.java +++ b/jdk/src/share/classes/java/security/Timestamp.java @@ -25,7 +25,7 @@ package java.security; -import java.io.Serializable; +import java.io.*; import java.security.cert.Certificate; import java.security.cert.CertPath; import java.security.cert.X509Extension; @@ -153,4 +153,11 @@ public final class Timestamp implements Serializable { sb.append(")"); return sb.toString(); } + + // Explicitly reset hash code value to -1 + private void readObject(ObjectInputStream ois) + throws IOException, ClassNotFoundException { + ois.defaultReadObject(); + myhash = -1; + } } diff --git a/jdk/src/share/native/sun/security/ec/ECC_JNI.cpp b/jdk/src/share/native/sun/security/ec/ECC_JNI.cpp index 1ddc5853368..a810cd8db28 100644 --- a/jdk/src/share/native/sun/security/ec/ECC_JNI.cpp +++ b/jdk/src/share/native/sun/security/ec/ECC_JNI.cpp @@ -89,7 +89,7 @@ JNICALL Java_sun_security_ec_ECKeyPairGenerator_generateECKeyPair // Fill a new ECParams using the supplied OID if (EC_DecodeParams(¶ms_item, &ecparams, 0) != SECSuccess) { /* bad curve OID */ - ThrowException(env, INVALID_ALGORITHM_PARAMETER_EXCEPTION); + ThrowException(env, (char *) INVALID_ALGORITHM_PARAMETER_EXCEPTION); goto cleanup; } @@ -101,7 +101,7 @@ JNICALL Java_sun_security_ec_ECKeyPairGenerator_generateECKeyPair // Generate the new keypair (using the supplied seed) if (EC_NewKey(ecparams, &privKey, (unsigned char *) pSeedBuffer, jSeedLength, 0) != SECSuccess) { - ThrowException(env, KEY_EXCEPTION); + ThrowException(env, (char *) KEY_EXCEPTION); goto cleanup; } diff --git a/jdk/test/java/security/CodeSigner/Serialize.java b/jdk/test/java/security/CodeSigner/Serialize.java new file mode 100644 index 00000000000..9a1f9fca97e --- /dev/null +++ b/jdk/test/java/security/CodeSigner/Serialize.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 6799854 + * @summary CodeSigner.hashCode() does not work with serialization + */ + +import java.io.*; +import java.security.CodeSigner; +import java.security.Timestamp; +import java.security.cert.*; +import java.util.Collections; +import java.util.Date; + +public class Serialize { + + public static void main(String[] args) throws Exception { + + // Create a certpath consisting of one certificate + File f = new File(System.getProperty("test.src", "."), "cert_file"); + FileInputStream fis = new FileInputStream(f); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + Certificate c = cf.generateCertificate(fis); + fis.close(); + CertPath cp = cf.generateCertPath(Collections.singletonList(c)); + + // Create a code signer + CodeSigner cs = new CodeSigner(cp, new Timestamp(new Date(), cp)); + + // Serialize the code signer + ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(byteOut); + out.writeObject(cs); + out.close(); + + // Deserialize the code signer + byte[] data = byteOut.toByteArray(); + CodeSigner cs2 = (CodeSigner) new ObjectInputStream( + new ByteArrayInputStream(data)).readObject(); + + // Test for equality + if (!cs.equals(cs2) || cs.hashCode() != cs2.hashCode()) { + throw new Exception("CodeSigner serialization test FAILED"); + } + } +} diff --git a/jdk/test/java/security/CodeSigner/cert_file b/jdk/test/java/security/CodeSigner/cert_file new file mode 100644 index 0000000000000000000000000000000000000000..42af97b376221127bc892d2479e53655ac768b8b GIT binary patch literal 784 zcmXqLV&*YuVmigdVlJI^(tw+dU8~LGoCOOrD}zCfp@0D&8*?ZNn=pH5UUpu7c^*uJ z14D!zLxc-Mgd0PI87^WVC(dhWX<%Y#X=rX@Xk-}$=9(K?K)G~wO%vmGgC<5DSa2`` zIr2=6jSPS5gBxW_g*1cid(F{%^W^zA!Ra7Z9gXc!#e!=u@%ci z`B{E9f4h8C?l6;Sh;WqHM5Aw|pVw(8Ue|j6Nr_oKz?hg?%UqMd${%}F-wb{1!PVZSAW40rFXXTXjyMI}|YWf-O!)?pnlpYuv-nZ*Y zr2n%*c7eu*EuLb9$}fC0#Duq>=QQd$vFxFZSXFmOO|Qm-#p~p>H!mxln76o|`ErxtT#3jn@&fmS< hf$B^6@`IT~B7ZJVp2~YvI;6SF_zE}Eo}lFS+5kZ&AXxwa literal 0 HcmV?d00001