jdk/test/sun/security/pkcs11/tls/TestMasterSecret.java
changeset 35379 1e8e336ef66b
parent 30820 0d4717a011d3
child 40975 680639c9b307
equal deleted inserted replaced
35378:7e19fa0e4e5b 35379:1e8e336ef66b
     1 /*
     1 /*
     2  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    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 }