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