jdk/test/sun/security/pkcs11/Mac/MacSameTest.java
changeset 28403 02b91a87c4dd
child 30046 cf2c86e1819e
equal deleted inserted replaced
28344:722378bc599e 28403:02b91a87c4dd
       
     1 /*
       
     2  * Copyright (c) 1998, 2014, 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 import java.security.InvalidKeyException;
       
    25 import java.security.NoSuchAlgorithmException;
       
    26 import java.security.NoSuchProviderException;
       
    27 import java.security.Provider;
       
    28 import java.security.SecureRandom;
       
    29 import java.util.List;
       
    30 import javax.crypto.Mac;
       
    31 import javax.crypto.spec.SecretKeySpec;
       
    32 
       
    33 /**
       
    34  * @test
       
    35  * @bug 8048603
       
    36  * @summary Check if doFinal and update operation result in same Mac
       
    37  * @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
       
    38  * @library ..
       
    39  * @run main MacSameTest
       
    40  */
       
    41 public class MacSameTest extends PKCS11Test {
       
    42 
       
    43     private static final int MESSAGE_SIZE = 25;
       
    44     private static final int OFFSET = 5;
       
    45     private static final int KEY_SIZE = 70;
       
    46 
       
    47     /**
       
    48      * Initialize a message, instantiate a Mac object,
       
    49      * initialize the object with a SecretKey,
       
    50      * feed the message into the Mac object
       
    51      * all at once and get the output MAC as result1.
       
    52      * Reset the Mac object, chop the message into three pieces,
       
    53      * feed into the Mac object sequentially, and get the output MAC as result2.
       
    54      * Finally, compare result1 and result2 and see if they are the same.
       
    55      *
       
    56      * @param args the command line arguments
       
    57      */
       
    58     public static void main(String[] args) throws Exception {
       
    59         main(new MacSameTest());
       
    60     }
       
    61 
       
    62     @Override
       
    63     public void main(Provider p) {
       
    64         List<String> algorithms = getSupportedAlgorithms("Mac", "Hmac", p);
       
    65         boolean success = true;
       
    66         for (String alg : algorithms) {
       
    67             try {
       
    68                 doTest(alg, p);
       
    69             } catch (Exception e) {
       
    70                 System.out.println("Unexpected exception: " + e);
       
    71                 e.printStackTrace();
       
    72                 success = false;
       
    73             }
       
    74         }
       
    75 
       
    76         if (!success) {
       
    77             throw new RuntimeException("Test failed");
       
    78         }
       
    79     }
       
    80 
       
    81     private void doTest(String algo, Provider provider)
       
    82             throws NoSuchAlgorithmException, NoSuchProviderException,
       
    83             InvalidKeyException {
       
    84         System.out.println("Test " + algo);
       
    85         Mac mac;
       
    86         try {
       
    87             mac = Mac.getInstance(algo, provider);
       
    88         } catch (NoSuchAlgorithmException nsae) {
       
    89             if ("SunPKCS11-Solaris".equals(provider.getName())) {
       
    90                 // depending on Solaris configuration,
       
    91                 // it can support HMAC or not with Mac
       
    92                 System.out.println("Expected NoSuchAlgorithmException thrown: "
       
    93                         + nsae);
       
    94                 return;
       
    95             }
       
    96             throw nsae;
       
    97         }
       
    98 
       
    99         byte[] plain = new byte[MESSAGE_SIZE];
       
   100         for (int i = 0; i < MESSAGE_SIZE; i++) {
       
   101             plain[i] = (byte) (i % 256);
       
   102         }
       
   103 
       
   104         byte[] tail = new byte[plain.length - OFFSET];
       
   105         System.arraycopy(plain, OFFSET, tail, 0, tail.length);
       
   106 
       
   107         SecureRandom srdm = new SecureRandom();
       
   108         byte[] keyVal = new byte[KEY_SIZE];
       
   109         srdm.nextBytes(keyVal);
       
   110         SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");
       
   111 
       
   112         mac.init(keySpec);
       
   113         byte[] result1 = mac.doFinal(plain);
       
   114 
       
   115         mac.reset();
       
   116         mac.update(plain[0]);
       
   117         mac.update(plain, 1, OFFSET - 1);
       
   118         byte[] result2 = mac.doFinal(tail);
       
   119 
       
   120         if (!java.util.Arrays.equals(result1, result2)) {
       
   121             throw new RuntimeException("result1 and result2 are not the same");
       
   122         }
       
   123     }
       
   124 
       
   125 }