1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /** 19 * @author Boris V. Kuznetsov 20 * @version $Revision$ 21 */ 22 23 package org.apache.harmony.security.tests.java.security; 24 25 import java.nio.ByteBuffer; 26 import java.security.DigestException; 27 import java.security.MessageDigest; 28 import java.security.MessageDigestSpi; 29 import java.security.NoSuchAlgorithmException; 30 31 import junit.framework.TestCase; 32 33 /** 34 * Tests for <code>MessageDigestSpi</code> constructor and methods 35 */ 36 public class MessageDigestSpiTest extends TestCase { 37 38 /** 39 * java.security.MessageDigestSpi#MessageDigestSpi() 40 */ 41 @SuppressWarnings("cast") 42 public void test_constructor() { 43 MyMessageDigest mds; 44 try { 45 mds = new MyMessageDigest(); 46 assertTrue(mds instanceof MessageDigestSpi); 47 } catch (Exception e) { 48 fail("Unexpected exception " + e.getMessage()); 49 } 50 51 try { 52 mds = new MyMessageDigest(); 53 byte[] ba = {0, 1, 2, 3, 4, 5}; 54 55 mds.engineDigest(); 56 mds.engineReset(); 57 mds.engineUpdate(ba[0]); 58 mds.engineUpdate(ba, 0, ba.length); 59 } catch (Exception e) { 60 fail("Unexpected exception for abstract methods"); 61 } 62 } 63 64 /** 65 * java.security.MessageDigestSpi#engineDigest(byte[], int, int) 66 */ 67 public void test_engineDigestLB$LILI() throws Exception { 68 69 final int DIGEST_LENGTH = 2; 70 71 MyMessageDigest md = new MyMessageDigest() { 72 73 public int engineGetDigestLength() { 74 return DIGEST_LENGTH; 75 } 76 77 public byte[] engineDigest() { 78 return new byte[DIGEST_LENGTH]; // return non-null value 79 } 80 }; 81 82 byte[] b = new byte[5]; 83 try { 84 // test: null output buffer 85 md.engineDigest(null, 1, DIGEST_LENGTH); 86 fail("No expected NullPointerException"); 87 } catch (NullPointerException e) { 88 } 89 try { 90 //test: len param < digest length 91 md.engineDigest(b, 1, DIGEST_LENGTH - 1); 92 fail("No expected DigestException"); 93 } catch (DigestException e) { 94 } 95 96 try { 97 //test: offset param > digest length 98 md.engineDigest(b, b.length + 1, b.length); 99 fail("No expected DigestException - 1"); 100 } catch (DigestException e) { 101 } 102 103 try { 104 //test: negative param 105 md.engineDigest(b, -1, b.length); 106 fail("No expected DigestException"); 107 } catch (ArrayIndexOutOfBoundsException e) { 108 // on RI 109 } catch (DigestException e) { 110 // ok 111 } 112 113 assertEquals("incorrect result", DIGEST_LENGTH, md 114 .engineDigest(b, 1, 3)); 115 116 // Regression for HARMONY-3045 117 md = new MyMessageDigest(); 118 try { 119 md.engineDigest(b, 0, 1); 120 fail("should throw NullPointerException"); 121 } catch (NullPointerException e) { 122 // expected 123 } 124 } 125 126 /** 127 * java.security.MessageDigestSpi#engineGetDigestLength() 128 */ 129 public void test_engineGetDigestLength() { 130 MyMessageDigest md = new MyMessageDigest(); 131 assertEquals(0, md.engineGetDigestLength()); 132 133 MessageDigest md5Digest = null; 134 try { 135 md5Digest = MessageDigest.getInstance("MD5"); 136 } catch (NoSuchAlgorithmException e) { 137 fail("unexpected Exception: " + e); 138 } 139 assertEquals(16, md5Digest.getDigestLength()); 140 } 141 142 /** 143 * java.security.MessageDigestSpi#engineUpdate(ByteBuffer) 144 */ 145 public void test_engineUpdateLjava_nio_ByteBuffer() { 146 MyMessageDigest md = new MyMessageDigest(); 147 byte[] b = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 148 149 ByteBuffer buf = ByteBuffer.wrap(b, 0, b.length); 150 buf.get(b); 151 int limit = buf.limit(); 152 md.engineUpdate(buf); 153 assertEquals(limit, buf.limit()); 154 assertEquals(limit, buf.position()); 155 156 buf = ByteBuffer.wrap(b, 0, b.length); 157 buf.get(); 158 buf.get(); 159 buf.get(); 160 md.engineUpdate(buf); 161 assertEquals(limit, buf.limit()); 162 assertEquals(limit, buf.position()); 163 } 164 165 /** 166 * java.security.MessageDigestSpi#clone() 167 */ 168 public void test_clone() throws CloneNotSupportedException { 169 MyMessageDigest md = new MyMessageDigest(); 170 try { 171 md.clone(); 172 fail("No expected CloneNotSupportedException"); 173 } catch (CloneNotSupportedException e) { 174 } 175 176 MyMessageDigestCloneable mdc = new MyMessageDigestCloneable(); 177 assertNotSame(mdc, mdc.clone()); 178 } 179 180 private class MyMessageDigest extends MessageDigestSpi { 181 182 @Override 183 public void engineReset() { 184 } 185 186 @Override 187 public byte[] engineDigest() { 188 return null; 189 } 190 191 @Override 192 public void engineUpdate(byte arg0) { 193 } 194 195 @Override 196 public void engineUpdate(byte[] arg0, int arg1, int arg2) { 197 } 198 199 @Override 200 protected int engineDigest(byte[] buf, int offset, int len) 201 throws DigestException { 202 return super.engineDigest(buf, offset, len); 203 } 204 205 @Override 206 protected int engineGetDigestLength() { 207 return super.engineGetDigestLength(); 208 } 209 210 @Override 211 protected void engineUpdate(ByteBuffer input) { 212 super.engineUpdate(input); 213 } 214 } 215 216 private class MyMessageDigestCloneable extends MyMessageDigest implements 217 Cloneable { 218 } 219 } 220