diff --git a/jdk/src/share/classes/com/sun/crypto/provider/DESKeyFactory.java b/jdk/src/share/classes/com/sun/crypto/provider/DESKeyFactory.java index 47f0b26a27d..f51de29ba8b 100644 --- a/jdk/src/share/classes/com/sun/crypto/provider/DESKeyFactory.java +++ b/jdk/src/share/classes/com/sun/crypto/provider/DESKeyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -31,6 +31,7 @@ import javax.crypto.spec.DESKeySpec; import java.security.InvalidKeyException; import java.security.spec.KeySpec; import java.security.spec.InvalidKeySpecException; +import javax.crypto.spec.SecretKeySpec; /** * This class implements the DES key factory of the Sun provider. @@ -60,20 +61,22 @@ public final class DESKeyFactory extends SecretKeyFactorySpi { */ protected SecretKey engineGenerateSecret(KeySpec keySpec) throws InvalidKeySpecException { - DESKey desKey = null; try { - if (!(keySpec instanceof DESKeySpec)) { - throw new InvalidKeySpecException - ("Inappropriate key specification"); + if (keySpec instanceof DESKeySpec) { + return new DESKey(((DESKeySpec)keySpec).getKey()); } - else { - DESKeySpec desKeySpec = (DESKeySpec)keySpec; - desKey = new DESKey(desKeySpec.getKey()); + + if (keySpec instanceof SecretKeySpec) { + return new DESKey(((SecretKeySpec)keySpec).getEncoded()); } + + throw new InvalidKeySpecException( + "Inappropriate key specification"); + } catch (InvalidKeyException e) { + throw new InvalidKeySpecException(e.getMessage()); } - return desKey; } /** diff --git a/jdk/src/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java b/jdk/src/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java index 9caabc3d80b..d2d2d7d47ea 100644 --- a/jdk/src/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java +++ b/jdk/src/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -31,6 +31,7 @@ import javax.crypto.spec.DESedeKeySpec; import java.security.InvalidKeyException; import java.security.spec.KeySpec; import java.security.spec.InvalidKeySpecException; +import javax.crypto.spec.SecretKeySpec; /** * This class implements the DES-EDE key factory of the Sun provider. @@ -60,20 +61,20 @@ public final class DESedeKeyFactory extends SecretKeyFactorySpi { */ protected SecretKey engineGenerateSecret(KeySpec keySpec) throws InvalidKeySpecException { - DESedeKey desEdeKey = null; try { if (keySpec instanceof DESedeKeySpec) { - DESedeKeySpec desEdeKeySpec = (DESedeKeySpec)keySpec; - desEdeKey = new DESedeKey(desEdeKeySpec.getKey()); - - } else { - throw new InvalidKeySpecException - ("Inappropriate key specification"); + return new DESedeKey(((DESedeKeySpec)keySpec).getKey()); } + if (keySpec instanceof SecretKeySpec) { + return new DESedeKey(((SecretKeySpec)keySpec).getEncoded()); + + } + throw new InvalidKeySpecException + ("Inappropriate key specification"); } catch (InvalidKeyException e) { + throw new InvalidKeySpecException(e.getMessage()); } - return desEdeKey; } /** diff --git a/jdk/test/com/sun/crypto/provider/Cipher/DES/DESSecretKeySpec.java b/jdk/test/com/sun/crypto/provider/Cipher/DES/DESSecretKeySpec.java new file mode 100644 index 00000000000..e5ec14f18e5 --- /dev/null +++ b/jdk/test/com/sun/crypto/provider/Cipher/DES/DESSecretKeySpec.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2013, 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 6755701 + * @summary Change SecretKeyFactory.generateSecret to allow SecretKeySpec to + * be passed and used for creating a DES and DESede keys. This avoids the error + * of "InvalidKeySpecException: Inappropriate key specification" + * @author Anthony Scarpino + */ + +import javax.crypto.Cipher; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.SecretKeySpec; + +public class DESSecretKeySpec { + + public static void main(String arg[]) throws Exception { + Cipher c; + byte[] key = new byte[]{'1','2','3','4','5','6','7','8', + '1','2','3','4','5','6','7','8', + '1','2','3','4','5','6','7','8'}; + + + System.out.println("Testing DES key"); + SecretKeySpec skey = new SecretKeySpec(key, "DES"); + c = Cipher.getInstance("DES/CBC/PKCS5Padding", "SunJCE"); + SecretKeyFactory.getInstance("DES").generateSecret(skey); + + System.out.println("Testing DESede key"); + skey = new SecretKeySpec(key, "DESede"); + c = Cipher.getInstance("DESede/CBC/PKCS5Padding", "SunJCE"); + SecretKeyFactory.getInstance("TripleDES").generateSecret(skey); + } +}