1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements. See the NOTICE file distributed with 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership. 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License. You may obtain a copy of the License at 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License. 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @author Vera Y. Petrashkova 208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage javax.crypto; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.spec.AlgorithmParameterSpec; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.InvalidAlgorithmParameterException; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.InvalidKeyException; 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Key; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchAlgorithmException; 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.SecureRandom; 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.AlgorithmParameters; 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.ByteBuffer; 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase; 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Tests for <code>CipherSpi</code> class constructors and methods. 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class CipherSpiTest extends TestCase { 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Constructor for CipherSpiTests. 448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @param arg0 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public CipherSpiTest(String arg0) { 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes super(arg0); 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Test for <code>CipherSpi</code> constructor 53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: constructs CipherSpi 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testCipherSpiTests01() throws IllegalBlockSizeException, 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes BadPaddingException, ShortBufferException { 578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes CipherSpi cSpi = new myCipherSpi(); 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("BlockSize is not 0", cSpi.engineGetBlockSize(), 0); 60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("OutputSize is not 0", cSpi.engineGetOutputSize(1), 0); 61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] bb = cSpi.engineGetIV(); 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Length of result byte array is not 0", bb.length, 0); 63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertNull("Not null result", cSpi.engineGetParameters()); 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] bb1 = new byte[10]; 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] bb2 = new byte[10]; 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb = cSpi.engineUpdate(bb1, 1, 2); 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect result of engineUpdate(byte, int, int)", 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb.length, 2); 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb = cSpi.engineDoFinal(bb1, 1, 2); 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect result of engineDoFinal(byte, int, int)", 2, 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb.length); 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals( 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "Incorrect result of engineUpdate(byte, int, int, byte, int)", 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineUpdate(bb1, 1, 2, bb2, 7), 2); 75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals( 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "Incorrect result of engineDoFinal(byte, int, int, byte, int)", 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 2, cSpi.engineDoFinal(bb1, 1, 2, bb2, 0)); 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Test for <code>engineGetKeySize(Key)</code> method 82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: It throws UnsupportedOperationException if it is not overridden 83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testCipherSpi02() throws Exception { 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes CipherSpi cSpi = new myCipherSpi(); 86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineGetKeySize(null); 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("UnsupportedOperationException must be thrown"); 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (UnsupportedOperationException e) { 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Test for <code>engineWrap(Key)</code> method 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: It throws UnsupportedOperationException if it is not overridden 96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testCipherSpi03() throws Exception { 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes CipherSpi cSpi = new myCipherSpi(); 99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineWrap(null); 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("UnsupportedOperationException must be thrown"); 102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (UnsupportedOperationException e) { 103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>engineUnwrap(byte[], String, int)</code> method 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: It throws UnsupportedOperationException if it is not overridden 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testCipherSpi04() throws Exception { 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes CipherSpi cSpi = new myCipherSpi(); 112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineUnwrap(new byte[0], "", 0); 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("UnsupportedOperationException must be thrown"); 115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (UnsupportedOperationException e) { 116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 1188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>engineUpdate(ByteBuffer, ByteBuffer)</code> method 121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertions: 122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * throws NullPointerException if one of these buffers is null; 123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * throws ShortBufferException is there is no space in output to hold result 124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testCipherSpi05() throws ShortBufferException { 126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes CipherSpi cSpi = new myCipherSpi(); 127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] bb = { (byte) 0, (byte) 1, (byte) 2, (byte) 3, (byte) 4, 128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 9, (byte) 10 }; 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int pos = 5; 130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int len = bb.length; 131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ByteBuffer bbNull = null; 132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ByteBuffer bb1 = ByteBuffer.allocate(len); 133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.put(bb); 134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(0); 135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineUpdate(bbNull, bb1); 137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("NullPointerException must be thrown"); 138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (NullPointerException e) { 139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineUpdate(bb1, bbNull); 142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("NullPointerException must be thrown"); 143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (NullPointerException e) { 144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ByteBuffer bb2 = ByteBuffer.allocate(bb.length); 146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(len); 147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect number of stored bytes", 0, cSpi.engineUpdate( 148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1, bb2)); 149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(0); 151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb2.position(len - 2); 152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineUpdate(bb1, bb2); 154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("ShortBufferException bust be thrown. Output buffer remaining: " 155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .concat(Integer.toString(bb2.remaining()))); 156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (ShortBufferException e) { 157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(10); 159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb2.position(0); 160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Incorrect number of stored bytes", cSpi.engineUpdate(bb1, 161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb2) > 0); 162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(bb.length); 163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineUpdate(bb1, bb2); 164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(pos); 166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb2.position(0); 167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int res = cSpi.engineUpdate(bb1, bb2); 168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Incorrect result", res > 0); 169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>engineDoFinal(ByteBuffer, ByteBuffer)</code> method 1738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Assertions: 174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * throws NullPointerException if one of these buffers is null; 175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * throws ShortBufferException is there is no space in output to hold result 176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testCipherSpi06() throws BadPaddingException, 178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ShortBufferException, IllegalBlockSizeException { 179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes CipherSpi cSpi = new myCipherSpi(); 180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int len = 10; 181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] bbuf = new byte[len]; 182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < bbuf.length; i++) { 183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bbuf[i] = (byte) i; 184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ByteBuffer bb1 = ByteBuffer.wrap(bbuf); 186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ByteBuffer bbNull = null; 187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineDoFinal(bbNull, bb1); 189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("NullPointerException must be thrown"); 190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (NullPointerException e) { 191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineDoFinal(bb1, bbNull); 194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("NullPointerException must be thrown"); 195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (NullPointerException e) { 196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ByteBuffer bb2 = ByteBuffer.allocate(len); 198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(bb1.limit()); 199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect result", 0, cSpi.engineDoFinal(bb1, bb2)); 200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(0); 202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb2.position(len - 2); 203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes cSpi.engineDoFinal(bb1, bb2); 205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("ShortBufferException must be thrown. Output buffer remaining: " 206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .concat(Integer.toString(bb2.remaining()))); 207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (ShortBufferException e) { 208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int pos = 5; 210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb1.position(pos); 211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb2.position(0); 212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Incorrect result", cSpi.engineDoFinal(bb1, bb2) > 0); 213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Additional class for CipherGeneratorSpi constructor verification 218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesclass myCipherSpi extends CipherSpi { 221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private byte[] initV; 222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private static byte[] resV = { (byte) 7, (byte) 6, (byte) 5, (byte) 4, 224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (byte) 3, (byte) 2, (byte) 1, (byte) 0 }; 225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public myCipherSpi() { 227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes this.initV = new byte[0]; 228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected void engineSetMode(String mode) throws NoSuchAlgorithmException { 231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected void engineSetPadding(String padding) 234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws NoSuchPaddingException { 235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected int engineGetBlockSize() { 238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return 0; 239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected int engineGetOutputSize(int inputLen) { 242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return 0; 243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected byte[] engineGetIV() { 246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return new byte[0]; 247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected AlgorithmParameters engineGetParameters() { 250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return null; 251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected void engineInit(int opmode, Key key, SecureRandom random) 254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws InvalidKeyException { 255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected void engineInit(int opmode, Key key, 258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes AlgorithmParameterSpec params, SecureRandom random) 259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws InvalidKeyException, InvalidAlgorithmParameterException { 260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected void engineInit(int opmode, Key key, AlgorithmParameters params, 263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SecureRandom random) throws InvalidKeyException, 264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InvalidAlgorithmParameterException { 265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected byte[] engineUpdate(byte[] input, int inputOffset, int inputLen) { 268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (initV.length < inputLen) { 269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes initV = new byte[inputLen]; 270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < inputLen; i++) { 272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes initV[i] = input[inputOffset + i]; 273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return initV; 275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected int engineUpdate(byte[] input, int inputOffset, int inputLen, 278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] output, int outputOffset) throws ShortBufferException { 2798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath byte[] res = engineUpdate(input, inputOffset, inputLen); 280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int t = res.length; 281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if ((output.length - outputOffset) < t) { 282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throw new ShortBufferException("Update"); 283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < t; i++) { 285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes output[i + outputOffset] = initV[i]; 286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return t; 288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen) 291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws IllegalBlockSizeException, BadPaddingException { 292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (resV.length > inputLen) { 293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] bb = new byte[inputLen]; 294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < inputLen; i++) { 295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes bb[i] = resV[i]; 296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return bb; 298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return resV; 300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected int engineDoFinal(byte[] input, int inputOffset, int inputLen, 303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] output, int outputOffset) throws ShortBufferException, 304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes IllegalBlockSizeException, BadPaddingException { 305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] res = engineDoFinal(input, inputOffset, inputLen); 3068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int t = res.length; 308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if ((output.length - outputOffset) < t) { 309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throw new ShortBufferException("DoFinal"); 310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 3118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < t; i++) { 312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes output[i + outputOffset] = res[i]; 313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return t; 315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected int engineUpdate(ByteBuffer input, ByteBuffer output) 3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath throws ShortBufferException { 320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return super.engineUpdate(input, output); 321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 3228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes protected int engineDoFinal(ByteBuffer input, ByteBuffer output) 3248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath throws ShortBufferException, IllegalBlockSizeException, 3258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath BadPaddingException { 326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return super.engineDoFinal(input, output); 327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 329