27 * @summary Known-answer-test for TlsMasterSecret generator |
27 * @summary Known-answer-test for TlsMasterSecret generator |
28 * @author Andreas Sterbenz |
28 * @author Andreas Sterbenz |
29 * @library .. |
29 * @library .. |
30 * @modules java.base/sun.security.internal.interfaces |
30 * @modules java.base/sun.security.internal.interfaces |
31 * java.base/sun.security.internal.spec |
31 * java.base/sun.security.internal.spec |
|
32 * @run main/othervm TestMasterSecret |
|
33 * @run main/othervm TestMasterSecret sm TestMasterSecret.policy |
32 */ |
34 */ |
33 |
35 |
34 import java.io.*; |
36 import java.io.BufferedReader; |
35 import java.util.*; |
37 import java.nio.file.Files; |
36 |
38 import java.nio.file.Paths; |
37 import java.security.Security; |
|
38 import java.security.Provider; |
39 import java.security.Provider; |
39 |
40 import java.util.Arrays; |
40 import javax.crypto.KeyGenerator; |
41 import javax.crypto.KeyGenerator; |
41 import javax.crypto.SecretKey; |
42 import javax.crypto.SecretKey; |
42 |
43 import javax.crypto.spec.SecretKeySpec; |
43 import javax.crypto.spec.*; |
|
44 |
|
45 import sun.security.internal.spec.*; |
|
46 import sun.security.internal.interfaces.TlsMasterSecret; |
44 import sun.security.internal.interfaces.TlsMasterSecret; |
|
45 import sun.security.internal.spec.TlsMasterSecretParameterSpec; |
47 |
46 |
48 public class TestMasterSecret extends PKCS11Test { |
47 public class TestMasterSecret extends PKCS11Test { |
49 |
48 |
50 private static int PREFIX_LENGTH = "m-premaster: ".length(); |
49 private static final int PREFIX_LENGTH = "m-premaster: ".length(); |
51 |
50 |
52 public static void main(String[] args) throws Exception { |
51 public static void main(String[] args) throws Exception { |
53 main(new TestMasterSecret()); |
52 main(new TestMasterSecret(), args); |
54 } |
53 } |
55 |
54 |
|
55 @Override |
56 public void main(Provider provider) throws Exception { |
56 public void main(Provider provider) throws Exception { |
57 if (provider.getService("KeyGenerator", "SunTlsMasterSecret") == null) { |
57 if (provider.getService("KeyGenerator", "SunTlsMasterSecret") == null) { |
58 System.out.println("Not supported by provider, skipping"); |
58 System.out.println("Not supported by provider, skipping"); |
59 return; |
59 return; |
60 } |
60 } |
61 InputStream in = new FileInputStream(new File(BASE, "masterdata.txt")); |
|
62 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); |
|
63 |
61 |
64 int n = 0; |
62 try (BufferedReader reader = Files.newBufferedReader( |
65 int lineNumber = 0; |
63 Paths.get(BASE, "masterdata.txt"))) { |
66 |
64 |
67 String algorithm = null; |
65 int n = 0; |
68 byte[] premaster = null; |
66 int lineNumber = 0; |
69 byte[] clientRandom = null; |
|
70 byte[] serverRandom = null; |
|
71 int protoMajor = 0; |
|
72 int protoMinor = 0; |
|
73 int preMajor = 0; |
|
74 int preMinor = 0; |
|
75 byte[] master = null; |
|
76 |
67 |
77 while (true) { |
68 String algorithm = null; |
78 String line = reader.readLine(); |
69 byte[] premaster = null; |
79 lineNumber++; |
70 byte[] clientRandom = null; |
80 if (line == null) { |
71 byte[] serverRandom = null; |
81 break; |
72 int protoMajor = 0; |
|
73 int protoMinor = 0; |
|
74 int preMajor = 0; |
|
75 int preMinor = 0; |
|
76 byte[] master = null; |
|
77 |
|
78 while (true) { |
|
79 String line = reader.readLine(); |
|
80 lineNumber++; |
|
81 if (line == null) { |
|
82 break; |
|
83 } |
|
84 if (line.startsWith("m-") == false) { |
|
85 continue; |
|
86 } |
|
87 String data = line.substring(PREFIX_LENGTH); |
|
88 if (line.startsWith("m-algorithm:")) { |
|
89 algorithm = data; |
|
90 } else if (line.startsWith("m-premaster:")) { |
|
91 premaster = parse(data); |
|
92 } else if (line.startsWith("m-crandom:")) { |
|
93 clientRandom = parse(data); |
|
94 } else if (line.startsWith("m-srandom:")) { |
|
95 serverRandom = parse(data); |
|
96 } else if (line.startsWith("m-protomajor:")) { |
|
97 protoMajor = Integer.parseInt(data); |
|
98 } else if (line.startsWith("m-protominor:")) { |
|
99 protoMinor = Integer.parseInt(data); |
|
100 } else if (line.startsWith("m-premajor:")) { |
|
101 preMajor = Integer.parseInt(data); |
|
102 } else if (line.startsWith("m-preminor:")) { |
|
103 preMinor = Integer.parseInt(data); |
|
104 } else if (line.startsWith("m-master:")) { |
|
105 master = parse(data); |
|
106 |
|
107 System.out.print("."); |
|
108 n++; |
|
109 |
|
110 KeyGenerator kg = |
|
111 KeyGenerator.getInstance("SunTlsMasterSecret", provider); |
|
112 SecretKey premasterKey = |
|
113 new SecretKeySpec(premaster, algorithm); |
|
114 TlsMasterSecretParameterSpec spec = |
|
115 new TlsMasterSecretParameterSpec(premasterKey, |
|
116 protoMajor, protoMinor, clientRandom, serverRandom, |
|
117 null, -1, -1); |
|
118 kg.init(spec); |
|
119 TlsMasterSecret key = (TlsMasterSecret)kg.generateKey(); |
|
120 byte[] enc = key.getEncoded(); |
|
121 if (Arrays.equals(master, enc) == false) { |
|
122 throw new Exception("mismatch line: " + lineNumber); |
|
123 } |
|
124 if ((preMajor != key.getMajorVersion()) || |
|
125 (preMinor != key.getMinorVersion())) { |
|
126 throw new Exception("version mismatch line: " + lineNumber); |
|
127 } |
|
128 } else { |
|
129 throw new Exception("Unknown line: " + line); |
|
130 } |
82 } |
131 } |
83 if (line.startsWith("m-") == false) { |
132 if (n == 0) { |
84 continue; |
133 throw new Exception("no tests"); |
85 } |
134 } |
86 String data = line.substring(PREFIX_LENGTH); |
135 System.out.println(); |
87 if (line.startsWith("m-algorithm:")) { |
136 System.out.println("OK: " + n + " tests"); |
88 algorithm = data; |
|
89 } else if (line.startsWith("m-premaster:")) { |
|
90 premaster = parse(data); |
|
91 } else if (line.startsWith("m-crandom:")) { |
|
92 clientRandom = parse(data); |
|
93 } else if (line.startsWith("m-srandom:")) { |
|
94 serverRandom = parse(data); |
|
95 } else if (line.startsWith("m-protomajor:")) { |
|
96 protoMajor = Integer.parseInt(data); |
|
97 } else if (line.startsWith("m-protominor:")) { |
|
98 protoMinor = Integer.parseInt(data); |
|
99 } else if (line.startsWith("m-premajor:")) { |
|
100 preMajor = Integer.parseInt(data); |
|
101 } else if (line.startsWith("m-preminor:")) { |
|
102 preMinor = Integer.parseInt(data); |
|
103 } else if (line.startsWith("m-master:")) { |
|
104 master = parse(data); |
|
105 |
|
106 System.out.print("."); |
|
107 n++; |
|
108 |
|
109 KeyGenerator kg = |
|
110 KeyGenerator.getInstance("SunTlsMasterSecret", provider); |
|
111 SecretKey premasterKey = |
|
112 new SecretKeySpec(premaster, algorithm); |
|
113 TlsMasterSecretParameterSpec spec = |
|
114 new TlsMasterSecretParameterSpec(premasterKey, |
|
115 protoMajor, protoMinor, clientRandom, serverRandom, |
|
116 null, -1, -1); |
|
117 kg.init(spec); |
|
118 TlsMasterSecret key = (TlsMasterSecret)kg.generateKey(); |
|
119 byte[] enc = key.getEncoded(); |
|
120 if (Arrays.equals(master, enc) == false) { |
|
121 throw new Exception("mismatch line: " + lineNumber); |
|
122 } |
|
123 if ((preMajor != key.getMajorVersion()) || |
|
124 (preMinor != key.getMinorVersion())) { |
|
125 throw new Exception("version mismatch line: " + lineNumber); |
|
126 } |
|
127 } else { |
|
128 throw new Exception("Unknown line: " + line); |
|
129 } |
|
130 } |
137 } |
131 if (n == 0) { |
|
132 throw new Exception("no tests"); |
|
133 } |
|
134 in.close(); |
|
135 System.out.println(); |
|
136 System.out.println("OK: " + n + " tests"); |
|
137 } |
138 } |
138 |
139 |
139 } |
140 } |