jdk/test/com/sun/crypto/provider/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.SecureRandom;
       
    28 import javax.crypto.Mac;
       
    29 import javax.crypto.spec.SecretKeySpec;
       
    30 
       
    31 /**
       
    32  * @test
       
    33  * @bug 8048603
       
    34  * @summary Check if doFinal and update operation result in same Mac
       
    35  * @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
       
    36  * @build Utils
       
    37  * @run main MacSameTest
       
    38  */
       
    39 public class MacSameTest implements MacTest {
       
    40 
       
    41     private static final int MESSAGE_SIZE = 25;
       
    42     private static final int OFFSET = 5;
       
    43     private static final int KEY_SIZE = 70;
       
    44 
       
    45     /**
       
    46      * Initialize a message, instantiate a Mac object,
       
    47      * initialize the object with a SecretKey,
       
    48      * feed the message into the Mac object
       
    49      * all at once and get the output MAC as result1.
       
    50      * Reset the Mac object, chop the message into three pieces,
       
    51      * feed into the Mac object sequentially, and get the output MAC as result2.
       
    52      * Finally, compare result1 and result2 and see if they are the same.
       
    53      *
       
    54      * @param args the command line arguments
       
    55      */
       
    56     public static void main(String[] args) {
       
    57         Utils.runTests(new MacSameTest());
       
    58     }
       
    59 
       
    60     @Override
       
    61     public void doTest(String algo) throws NoSuchAlgorithmException,
       
    62             NoSuchProviderException, InvalidKeyException {
       
    63         Mac mac;
       
    64         try {
       
    65             mac = Mac.getInstance(algo, "SunJCE");
       
    66         } catch (NoSuchAlgorithmException nsae) {
       
    67             // depending on Solaris configuration,
       
    68             // it can support HMAC or not with Mac
       
    69             System.out.println("Expected NoSuchAlgorithmException thrown: "
       
    70                     + nsae);
       
    71             return;
       
    72         }
       
    73 
       
    74         byte[] plain = new byte[MESSAGE_SIZE];
       
    75         for (int i = 0; i < MESSAGE_SIZE; i++) {
       
    76             plain[i] = (byte) (i % 256);
       
    77         }
       
    78 
       
    79         byte[] tail = new byte[plain.length - OFFSET];
       
    80         System.arraycopy(plain, OFFSET, tail, 0, tail.length);
       
    81 
       
    82         SecureRandom srdm = new SecureRandom();
       
    83         byte[] keyVal = new byte[KEY_SIZE];
       
    84         srdm.nextBytes(keyVal);
       
    85         SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");
       
    86 
       
    87         mac.init(keySpec);
       
    88         byte[] result1 = mac.doFinal(plain);
       
    89 
       
    90         mac.reset();
       
    91         mac.update(plain[0]);
       
    92         mac.update(plain, 1, OFFSET - 1);
       
    93         byte[] result2 = mac.doFinal(tail);
       
    94 
       
    95         if (!java.util.Arrays.equals(result1, result2)) {
       
    96             throw new RuntimeException("result1 and result2 are not the same");
       
    97         }
       
    98     }
       
    99 
       
   100 }