test/compiler/7184394/TestAESBase.java

Tue, 04 Feb 2020 18:13:14 +0800

author
aoqi
date
Tue, 04 Feb 2020 18:13:14 +0800
changeset 9806
758c07667682
parent 6876
710a3c8b516e
parent 9789
e55d4d896e30
permissions
-rw-r--r--

Merge

     1 /*
     2  * Copyright (c) 2012, 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  */
    25 /**
    26  * @author Tom Deneau
    27  */
    29 import javax.crypto.Cipher;
    30 import javax.crypto.KeyGenerator;
    31 import javax.crypto.SecretKey;
    32 import javax.crypto.spec.GCMParameterSpec;
    33 import javax.crypto.spec.IvParameterSpec;
    34 import javax.crypto.spec.SecretKeySpec;
    35 import java.security.AlgorithmParameters;
    37 import java.util.Random;
    38 import java.util.Arrays;
    40 abstract public class TestAESBase {
    41   int msgSize = Integer.getInteger("msgSize", 646);
    42   boolean checkOutput = Boolean.getBoolean("checkOutput");
    43   boolean noReinit = Boolean.getBoolean("noReinit");
    44   boolean testingMisalignment;
    45   private static final int ALIGN = 8;
    46   int encInputOffset = Integer.getInteger("encInputOffset", 0) % ALIGN;
    47   int encOutputOffset = Integer.getInteger("encOutputOffset", 0) % ALIGN;
    48   int decOutputOffset = Integer.getInteger("decOutputOffset", 0) % ALIGN;
    49   int lastChunkSize = Integer.getInteger("lastChunkSize", 32);
    50   int keySize = Integer.getInteger("keySize", 128);
    51   int inputLength;
    52   int encodeLength;
    53   int decodeLength;
    54   int decodeMsgSize;
    55   String algorithm = System.getProperty("algorithm", "AES");
    56   String mode = System.getProperty("mode", "CBC");
    57   String paddingStr = System.getProperty("paddingStr", "PKCS5Padding");
    58   byte[] input;
    59   byte[] encode;
    60   byte[] expectedEncode;
    61   byte[] decode;
    62   byte[] expectedDecode;
    63   Random random = new Random(0);
    64   Cipher cipher;
    65   Cipher dCipher;
    66   AlgorithmParameters algParams = null;
    67   SecretKey key;
    68   GCMParameterSpec gcm_spec;
    69   byte[] aad = { 0x11, 0x22, 0x33, 0x44, 0x55 };
    70   int tlen = 12;
    71   byte[] iv = new byte[16];
    73   static int numThreads = 0;
    74   int  threadId;
    75   static synchronized int getThreadId() {
    76     int id = numThreads;
    77     numThreads++;
    78     return id;
    79   }
    81   abstract public void run();
    83   public void prepare() {
    84     try {
    85       System.out.println("\nalgorithm=" + algorithm + ", mode=" + mode + ", paddingStr=" + paddingStr +
    86               ", msgSize=" + msgSize + ", keySize=" + keySize + ", noReinit=" + noReinit +
    87               ", checkOutput=" + checkOutput + ", encInputOffset=" + encInputOffset + ", encOutputOffset=" +
    88               encOutputOffset + ", decOutputOffset=" + decOutputOffset + ", lastChunkSize=" +lastChunkSize );
    90       if (encInputOffset % ALIGN != 0 || encOutputOffset % ALIGN != 0 || decOutputOffset % ALIGN !=0 )
    91         testingMisalignment = true;
    93       int keyLenBytes = (keySize == 0 ? 16 : keySize/8);
    94       byte keyBytes[] = new byte[keyLenBytes];
    95       if (keySize == 128)
    96         keyBytes = new byte[] {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7};
    97       else
    98         random.nextBytes(keyBytes);
   100       key = new SecretKeySpec(keyBytes, algorithm);
   101       if (threadId == 0) {
   102         System.out.println("Algorithm: " + key.getAlgorithm() + "("
   103                            + key.getEncoded().length * 8 + "bit)");
   104       }
   106       cipher = Cipher.getInstance(algorithm + "/" + mode + "/" + paddingStr, "SunJCE");
   107       dCipher = Cipher.getInstance(algorithm + "/" + mode + "/" + paddingStr, "SunJCE");
   109       // CBC init
   110       if (mode.equals("CBC")) {
   111         IvParameterSpec initVector = new IvParameterSpec(iv);
   112         cipher.init(Cipher.ENCRYPT_MODE, key, initVector);
   113         algParams = cipher.getParameters();
   114         dCipher.init(Cipher.DECRYPT_MODE, key, initVector);
   116       // GCM init
   117       } else if (mode.equals("GCM")) {
   118         gcm_init(true);
   119         gcm_init(false);
   121       // ECB init
   122       } else {
   123         cipher.init(Cipher.ENCRYPT_MODE, key, algParams);
   124         dCipher.init(Cipher.DECRYPT_MODE, key, algParams);
   125       }
   127       if (threadId == 0) {
   128         childShowCipher();
   129       }
   131       inputLength = msgSize + encInputOffset;
   132       if (testingMisalignment) {
   133         encodeLength = cipher.getOutputSize(msgSize - lastChunkSize) + encOutputOffset;
   134         encodeLength += cipher.getOutputSize(lastChunkSize);
   135         decodeLength = dCipher.getOutputSize(encodeLength - lastChunkSize) + decOutputOffset;
   136         decodeLength += dCipher.getOutputSize(lastChunkSize);
   137       } else {
   138         encodeLength = cipher.getOutputSize(msgSize) + encOutputOffset;
   139         decodeLength = dCipher.getOutputSize(encodeLength) + decOutputOffset;
   140       }
   142       input = new byte[inputLength];
   143       for (int i=encInputOffset, j=0; i<inputLength; i++, j++) {
   144         input[i] = (byte) (j & 0xff);
   145       }
   147       // do one encode and decode in preparation
   148       encode = new byte[encodeLength];
   149       decode = new byte[decodeLength];
   150       if (testingMisalignment) {
   151         decodeMsgSize = cipher.update(input, encInputOffset, (msgSize - lastChunkSize), encode, encOutputOffset);
   152         decodeMsgSize += cipher.doFinal(input, (encInputOffset + msgSize - lastChunkSize), lastChunkSize, encode, (encOutputOffset + decodeMsgSize));
   154         int tempSize = dCipher.update(encode, encOutputOffset, (decodeMsgSize - lastChunkSize), decode, decOutputOffset);
   155         dCipher.doFinal(encode, (encOutputOffset + decodeMsgSize - lastChunkSize), lastChunkSize, decode, (decOutputOffset + tempSize));
   156       } else {
   157         decodeMsgSize = cipher.doFinal(input, encInputOffset, msgSize, encode, encOutputOffset);
   158         dCipher.doFinal(encode, encOutputOffset, decodeMsgSize, decode, decOutputOffset);
   159       }
   160       if (checkOutput) {
   161         expectedEncode = (byte[]) encode.clone();
   162         expectedDecode = (byte[]) decode.clone();
   163         showArray(key.getEncoded()  ,  "key:    ");
   164         showArray(input,  "input:  ");
   165         showArray(encode, "encode: ");
   166         showArray(decode, "decode: ");
   167       }
   168     }
   169     catch (Exception e) {
   170       e.printStackTrace();
   171       System.exit(1);
   172     }
   173   }
   175   void showArray(byte b[], String name) {
   176     System.out.format("%s [%d]: ", name, b.length);
   177     for (int i=0; i<Math.min(b.length, 32); i++) {
   178       System.out.format("%02x ", b[i] & 0xff);
   179     }
   180     System.out.println();
   181   }
   183   void compareArrays(byte b[], byte exp[]) {
   184     if (b.length != exp.length) {
   185       System.out.format("different lengths for actual and expected output arrays\n");
   186       showArray(b, "test: ");
   187       showArray(exp, "exp : ");
   188       System.exit(1);
   189     }
   190     for (int i=0; i< exp.length; i++) {
   191       if (b[i] != exp[i]) {
   192         System.out.format("output error at index %d: got %02x, expected %02x\n", i, b[i] & 0xff, exp[i] & 0xff);
   193         showArray(b, "test: ");
   194         showArray(exp, "exp : ");
   195         System.exit(1);
   196       }
   197     }
   198   }
   201   void showCipher(Cipher c, String kind) {
   202     System.out.println(kind + " cipher provider: " + cipher.getProvider());
   203     System.out.println(kind + " cipher algorithm: " + cipher.getAlgorithm());
   204   }
   206   abstract void childShowCipher();
   208   void gcm_init(boolean encrypt) throws Exception {
   209     gcm_spec = new GCMParameterSpec(tlen * 8, iv);
   210     if (encrypt) {
   211       // Get a new instance everytime because of reuse IV restrictions
   212       cipher = Cipher.getInstance(algorithm + "/" + mode + "/" + paddingStr, "SunJCE");
   213       cipher.init(Cipher.ENCRYPT_MODE, key, gcm_spec);
   214       cipher.updateAAD(aad);
   215     } else {
   216       dCipher.init(Cipher.DECRYPT_MODE, key, gcm_spec);
   217       dCipher.updateAAD(aad);
   220     }
   221   }
   222 }

mercurial