1 /* 2 * Copyright (c) 2005, 2010, 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. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /** 25 * @test 26 * @bug 6313661 27 * @summary Basic tests for TlsRsaPremasterSecret generator 28 * @author Andreas Sterbenz 29 */ 30 31 import java.security.Security; 32 import java.security.Provider; 33 34 import javax.crypto.KeyGenerator; 35 import javax.crypto.SecretKey; 36 import java.util.Formatter; 37 38 import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; 39 40 public class TestPremaster { 41 42 public static void main(String[] args) throws Exception { 43 Provider provider = Security.getProvider("SunJCE"); 44 45 KeyGenerator kg; 46 47 kg = KeyGenerator.getInstance("SunTlsRsaPremasterSecret", provider); 48 49 try { 50 kg.generateKey(); 51 throw new Exception("no exception"); 52 } catch (IllegalStateException e) { 53 System.out.println("OK: " + e); 54 } 55 56 int[] protocolVersions = {0x0300, 0x0301, 0x0302, 0x0400}; 57 for (int clientVersion : protocolVersions) { 58 for (int serverVersion : protocolVersions) { 59 test(kg, clientVersion, serverVersion); 60 if (serverVersion >= clientVersion) { 61 break; 62 } 63 } 64 } 65 66 System.out.println("Done."); 67 } 68 69 private static void test(KeyGenerator kg, 70 int clientVersion, int serverVersion) throws Exception { 71 72 System.out.printf( 73 "Testing RSA pre-master secret key generation between " + 74 "client (0x%04X) and server(0x%04X)%n", 75 clientVersion, serverVersion); 76 kg.init(new TlsRsaPremasterSecretParameterSpec( 77 clientVersion, serverVersion)); 78 79 SecretKey key = kg.generateKey(); 80 byte[] encoded = key.getEncoded(); 81 if (encoded != null) { // raw key material may be not extractable 82 if (encoded.length != 48) { 83 throw new Exception("length: " + encoded.length); 84 } 85 int v = versionOf(encoded[0], encoded[1]); 86 if (clientVersion != v) { 87 if (serverVersion != v || clientVersion >= 0x0302) { 88 throw new Exception(String.format( 89 "version mismatch: (0x%04X) rather than (0x%04X) " + 90 "is used in pre-master secret", v, clientVersion)); 91 } 92 System.out.printf("Use compatible version (0x%04X)%n", v); 93 } 94 System.out.println("Passed, version matches!"); 95 } else { 96 System.out.println("Raw key material is not extractable"); 97 } 98 } 99 100 private static int versionOf(int major, int minor) { 101 return ((major & 0xFF) << 8) | (minor & 0xFF); 102 } 103 }