15850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann/* 25850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Copyright (C) 2009 The Android Open Source Project 35850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * 45850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Licensed under the Apache License, Version 2.0 (the "License"); 55850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * you may not use this file except in compliance with the License. 65850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * You may obtain a copy of the License at 75850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * 85850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * http://www.apache.org/licenses/LICENSE-2.0 95850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * 105850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Unless required by applicable law or agreed to in writing, software 115850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * distributed under the License is distributed on an "AS IS" BASIS, 125850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * See the License for the specific language governing permissions and 145850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * limitations under the License. 155850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann */ 16f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonpackage tests.security; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.MessageDigest; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException; 224155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstromimport junit.framework.TestCase; 234155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class MessageDigestTest extends TestCase { 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String digestAlgorithmName; 27f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected MessageDigestTest(String digestAlgorithmName) { 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.digestAlgorithmName = digestAlgorithmName; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private MessageDigest digest; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InputStream sourceData; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] checkDigest; 36f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() throws Exception { 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.setUp(); 40f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 415850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann this.source3 = getLongMessage(1000000); 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.digest = getMessageDigest(); 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.sourceData = getSourceData(); 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.checkDigest = getCheckDigest(); 455850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann } 46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 475850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann @Override 485850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann public void tearDown() throws Exception { 495850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann super.tearDown(); 50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 515850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann // This is critical. The MessageDigest tests consume a lot of memory due 525850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann // to the 1 MB buffers being allocated. We need to make sure all data is 535850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann // freed after each test. Otherwise the Android runtime simply dies at 545850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann // some point. 555850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann source1 = null; 565850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann source2 = null; 575850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann source3 = null; 58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 595850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann expected1 = null; 605850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann expected2 = null; 615850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann expected3 = null; 62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 635850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann digest = null; 644155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom sourceData.close(); 655850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann sourceData = null; 665850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann checkDigest = null; 67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 685850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann System.gc(); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 714155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom MessageDigest getMessageDigest() { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return MessageDigest.getInstance(digestAlgorithmName); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NoSuchAlgorithmException e) { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("failed to get digest instance: " + e); 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 804155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom InputStream getSourceData() { 814155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom InputStream sourceStream = getClass().getResourceAsStream(digestAlgorithmName + ".data"); 824155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom assertNotNull("digest source data not found: " + digestAlgorithmName, sourceStream); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sourceStream; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 864155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom byte[] getCheckDigest() { 874155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom InputStream checkDigestStream = 884155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom getClass().getResourceAsStream(digestAlgorithmName + ".check"); 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] checkDigest = new byte[digest.getDigestLength()]; 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int read = 0; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = 0; 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 934155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom while ((read = checkDigestStream.read()) != -1) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkDigest[index++] = (byte)read; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 964155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom checkDigestStream.close(); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("failed to read digest golden data: " + digestAlgorithmName); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return checkDigest; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 1034155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom public void testMessageDigest1() { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] buf = new byte[128]; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int read = 0; 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1074155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom while ((read = sourceData.read(buf)) != -1) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project digest.update(buf, 0, read); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1104155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom sourceData.close(); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("failed to read digest data"); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] computedDigest = digest.digest(); 116f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("computed digest is is null", computedDigest); 1184155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom assertEquals("digest length mismatch", checkDigest.length, computedDigest.length); 119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 1204155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom for (int i = 0; i < checkDigest.length; i++) { 1215850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann assertEquals("byte " + i + " of computed and check digest differ", 1224155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom checkDigest[i], computedDigest[i]); 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 1274155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom public void testMessageDigest2() { 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int val; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1304155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom while ((val = sourceData.read()) != -1) { 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project digest.update((byte)val); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1334155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom sourceData.close(); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("failed to read digest data"); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] computedDigest = digest.digest(); 139f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("computed digest is is null", computedDigest); 1414155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom assertEquals("digest length mismatch", checkDigest.length, computedDigest.length); 1424155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom for (int i = 0; i < checkDigest.length; i++) { 1435850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann assertEquals("byte " + i + " of computed and check digest differ", 1444155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom checkDigest[i], computedDigest[i]); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 146f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Official FIPS180-2 testcases 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1544155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom protected String source1; 1554155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom protected String source2; 1564155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom protected String source3; 1574155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom protected String expected1; 1584155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom protected String expected2; 1594155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom protected String expected3; 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String getLongMessage(int length) { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder sourceBuilder = new StringBuilder(length); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < length / 10; i++) { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sourceBuilder.append("aaaaaaaaaa"); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sourceBuilder.toString(); 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168fa890109ecc4522f0e07481431c04d4cf6ba16d1The Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testfips180_2_singleblock() { 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project digest.update(source1.getBytes(), 0, source1.length()); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] computedDigest = digest.digest(); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("computed digest is null", computedDigest); 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder sb = new StringBuilder(); 1784155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom for (int i = 0; i < computedDigest.length; i++) { 1794155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom String res = Integer.toHexString(computedDigest[i] & 0xFF); 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append((res.length() == 1 ? "0" : "") + res); 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1824155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom assertEquals("computed and check digest differ", expected1, sb.toString()); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testfips180_2_multiblock() { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project digest.update(source2.getBytes(), 0, source2.length()); 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] computedDigest = digest.digest(); 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("computed digest is null", computedDigest); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder sb = new StringBuilder(); 1944155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom for (int i = 0; i < computedDigest.length; i++) { 1954155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom String res = Integer.toHexString(computedDigest[i] & 0xFF); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append((res.length() == 1 ? "0" : "") + res); 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1984155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom assertEquals("computed and check digest differ", expected2, sb.toString()); 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testfips180_2_longMessage() { 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project digest.update(source3.getBytes(), 0, source3.length()); 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] computedDigest = digest.digest(); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull("computed digest is null", computedDigest); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder sb = new StringBuilder(); 2104155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom for (int i = 0; i < computedDigest.length; i++) { 2114155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom String res = Integer.toHexString(computedDigest[i] & 0xFF); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append((res.length() == 1 ? "0" : "") + res); 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2144155a2498a57fb09e92815f8993a70c216ddc5ecBrian Carlstrom assertEquals("computed and check digest differ", expected3, sb.toString()); 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 217