1 /*
   2  * Copyright (c) 2003, 2007, 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 /*
  25  * @test
  26  * @bug 4937853
  27  * @summary Make sure normal calls of NullCipher does not throw NPE.
  28  * @author Valerie Peng
  29  */
  30 import java.util.Arrays;
  31 import java.security.AlgorithmParameters;
  32 import java.security.Key;
  33 import java.security.SecureRandom;
  34 import java.security.cert.Certificate;
  35 import java.security.spec.AlgorithmParameterSpec;
  36 import javax.crypto.Cipher;
  37 import javax.crypto.NullCipher;
  38 import javax.crypto.spec.SecretKeySpec;
  39 
  40 public class TestNPE {
  41     private static byte[] BYTES = new byte[16];
  42     static {
  43         new SecureRandom().nextBytes(BYTES);
  44     }
  45 
  46     public static void main(String[] args) throws Exception {
  47         NullCipher nc = new NullCipher();
  48         // testing init(...)
  49         nc.init(Cipher.ENCRYPT_MODE, (Certificate) null);
  50         nc.init(Cipher.ENCRYPT_MODE, (Certificate) null, (SecureRandom) null);
  51         nc.init(Cipher.ENCRYPT_MODE, (Key) null);
  52         nc.init(Cipher.ENCRYPT_MODE, (Key) null, (AlgorithmParameters) null);
  53         nc.init(Cipher.ENCRYPT_MODE, (Key) null, (AlgorithmParameterSpec) null);
  54         nc.init(Cipher.ENCRYPT_MODE, (Key) null, (AlgorithmParameterSpec) null,
  55             (SecureRandom) null);
  56         nc.init(Cipher.ENCRYPT_MODE, (Key) null, (AlgorithmParameters) null,
  57             (SecureRandom) null);
  58         nc.init(Cipher.ENCRYPT_MODE, (Key) null, (SecureRandom) null);
  59         // testing getBlockSize()
  60         if (nc.getBlockSize() != 1) {
  61             throw new Exception("Error with getBlockSize()");
  62         }
  63         // testing update(...)
  64         byte[] out = nc.update(BYTES);
  65         if (!Arrays.equals(out, BYTES)) {
  66             throw new Exception("Error with update(byte[])");
  67         }
  68         out = nc.update(BYTES, 0, BYTES.length);
  69         if (!Arrays.equals(out, BYTES)) {
  70             throw new Exception("Error with update(byte[], int, int)");
  71         }
  72         if (nc.update(BYTES, 0, BYTES.length, out) != BYTES.length) {
  73             throw new Exception("Error with update(byte[], int, int, byte[])");
  74         }
  75         if (nc.update(BYTES, 0, BYTES.length, out, 0) != BYTES.length) {
  76             throw new Exception(
  77                 "Error with update(byte[], int, int, byte[], int)");
  78         }
  79         // testing doFinal(...)
  80         if (nc.doFinal() != null) {
  81             throw new Exception("Error with doFinal()");
  82         }
  83         if (nc.doFinal(out, 0) != 0) {
  84              throw new Exception("Error with doFinal(byte[], 0)");
  85         }
  86         out = nc.doFinal(BYTES);
  87         if (!Arrays.equals(out, BYTES)) {
  88             throw new Exception("Error with doFinal(byte[])");
  89         }
  90         out = nc.doFinal(BYTES, 0, BYTES.length);
  91         if (!Arrays.equals(out, BYTES)) {
  92             throw new Exception("Error with doFinal(byte[], int, int)");
  93         }
  94         if (nc.doFinal(BYTES, 0, BYTES.length, out) != BYTES.length) {
  95             throw new Exception(
  96                 "Error with doFinal(byte[], int, int, byte[])");
  97         }
  98         if (nc.doFinal(BYTES, 0, BYTES.length, out, 0) != BYTES.length) {
  99             throw new Exception(
 100                 "Error with doFinal(byte[], int, int, byte[], int)");
 101         }
 102         // testing getExemptionMechanism()
 103         if (nc.getExemptionMechanism() != null) {
 104             throw new Exception("Error with getExemptionMechanism()");
 105         }
 106         // testing getOutputSize(int)
 107         if (nc.getOutputSize(5) != 5) {
 108             throw new Exception("Error with getOutputSize()");
 109         }
 110         // testing getIV(), getParameters(), getAlgorithm(), etc.
 111         if (nc.getIV() == null) { // should've been null;
 112                                   // left it as is for backward-compatibility
 113             throw new Exception("Error with getIV()");
 114         }
 115         if (nc.getParameters() != null) {
 116             throw new Exception("Error with getParameters()");
 117         }
 118         if (nc.getAlgorithm() != null) {
 119             throw new Exception("Error with getAlgorithm()");
 120         }
 121         if (nc.getProvider() != null) { // not associated with any provider
 122             throw new Exception("Error with getProvider()");
 123         }
 124         System.out.println("Test Done");
 125     }
 126 }