1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.tests.java.security;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ByteBuffer;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.DigestException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.MessageDigest;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.MessageDigestSpi;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.tests.support.MyMessageDigest1;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests for <code>MessageDigest</code> constructor and methods
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class MessageDigest1Test extends TestCase {
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3744e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#reset()
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_reset() {
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md.reset();
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineReset);
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4644e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#update(byte)
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_updateLB() {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md.update((byte) 1);
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineUpdate1);
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5544e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#update(byte[], int, int)
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_updateLB$LILI() {
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final byte[] bytes = { 1, 2, 3, 4, 5 };
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md.update(bytes, 1, 2);
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineUpdate2);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Regression for HARMONY-1120
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // buf == null
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.update(null, 0, 1);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected IllegalArgumentException");
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // offset + len > buf.length
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.update(bytes, 0, bytes.length + 1);
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected IllegalArgumentException");
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // offset + len > Integer.MAX_VALUE
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.update(bytes, Integer.MAX_VALUE, 1);
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected IllegalArgumentException");
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // offset<0 and len<0 are passed to provider
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final int offset = -1;
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final int len = -1;
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md = new MyMessageDigest1("ABC") {
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            @Override
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void engineUpdate(byte[] arg0, int arg1, int arg2) {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertSame("buf", bytes, arg0);
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertEquals("offset", offset, arg1);
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertEquals("len", len, arg2);
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                runEngineUpdate2 = true;
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md.update(bytes, offset, len);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineUpdate2);
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
9944e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#update(byte[])
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_updateLB$() {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b = { 1, 2, 3, 4, 5 };
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md.update(b);
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineUpdate2);
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
10944e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#update(ByteBuffer)
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_updateLjava_nio_ByteBuffer() {
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b = { 1, 2, 3, 4, 5 };
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer byteBuffer = ByteBuffer.wrap(b);
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int limit = byteBuffer.limit();
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md.update(byteBuffer);
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineUpdate2);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(byteBuffer.limit(), byteBuffer.position());
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(limit, byteBuffer.limit());
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
12444e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#digest()
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_digest() {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("incorrect result", 0, md.digest().length);
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineDigest);
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
13344e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#digest(byte[])
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_digestLB$() {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b = { 1, 2, 3, 4, 5 };
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("incorrect result", 0, md.digest(b).length);
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(md.runEngineDigest);
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
14344e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#digest(byte[], int, int)
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_digestLB$LILI() throws Exception {
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b = { 1, 2, 3, 4, 5 };
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("incorrect result", 0, md.digest(b, 2, 3));
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("digest failed", md.runEngineDigest);
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Regression for Harmony-1148
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md = new MyMessageDigest1();
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final byte[] bytes = new byte[] { 2, 4, 1 };
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // buf == null
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.digest(null, 0, 1);
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected IllegalArgumentException");
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // offset + len > buf.length
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.digest(bytes, 0, bytes.length + 1);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected IllegalArgumentException");
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // offset + len > Integer.MAX_VALUE
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.digest(bytes, Integer.MAX_VALUE, 1);
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected IllegalArgumentException");
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException e) {
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // offset<0 and len<0 are passed to provider
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final int offset = -1;
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final int len = -1;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final int status = 33;
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        md = new MyMessageDigest1("ABC") {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            @Override
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public int engineDigest(byte[] arg0, int arg1, int arg2) {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertSame("buf", bytes, arg0);
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertEquals("offset", offset, arg1);
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertEquals("len", len, arg2);
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return status;
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("returned status", status, md.digest(bytes, offset, len));
186f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            MessageDigest digest = MessageDigest.getInstance("TestDigest", new TestProvider());
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            digest.digest(new byte[5], 0, 5);
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("expected DigestException");
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (DigestException e) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // ok
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
19744e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#isEqual(byte[],byte[])
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_isEqualLB$LB$() {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = { 1, 2, 3, 4 };
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b2 = { 1, 2, 3, 4, 5 };
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b3 = { 1, 3, 3, 4 };
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b4 = { 1, 2, 3, 4 };
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(MessageDigest.isEqual(b1, b4));
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertFalse(MessageDigest.isEqual(b1, b2));
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertFalse(MessageDigest.isEqual(b1, b3));
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
21144e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#getAlgorithm()
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getAlgorithm() {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("ABC", md.getAlgorithm());
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
21944e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#getProvider()
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getProvider() {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNull(md.getProvider());
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
22744e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom     * java.security.MessageDigest#getDigestLength()
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getDigestLength() {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MyMessageDigest1 md = new MyMessageDigest1("ABC");
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(0, md.getDigestLength());
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Tests SHA MessageDigest provider
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testSHAProvider() {
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        MessageDigest md = null;
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md = MessageDigest.getInstance("SHA");
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NoSuchAlgorithmException e) {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("unexpected exception: " + e);
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bytes = new byte[] { 1, 1, 1, 1, 1 };
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Regression for HARMONY-1120
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // testing combination with provider
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // offset < 0
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.update(bytes, -1, 1);
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected IndexOutOfBoundsException");
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IndexOutOfBoundsException e) {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
25444e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom        try {
25544e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom            md.update(bytes, 1, -1);
25644e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom            fail("No expected IndexOutOfBoundsException");
25744e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom        } catch (IndexOutOfBoundsException e) {
25844e4b13e9a75f12b9267a8b563730f3687062aa6Brian Carlstrom        }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //Regression for Harmony-1148
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md = MessageDigest.getInstance("SHA");
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NoSuchAlgorithmException e) {
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("unexpected exception: " + e);
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // offset < 0
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.digest(bytes, 0, -1);
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected DigestException");
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (DigestException e) {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // len < 0
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md.digest(bytes, -1, 0);
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("No expected DigestException");
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (DigestException e) {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
279f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            md = MessageDigest.getInstance("UnknownDigest");
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("expected NoSuchAlgorithmException");
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NoSuchAlgorithmException e) {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // ok
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
286f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
288f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    class TestProvider extends Provider {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestProvider() {
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super("TestProvider", 1.0, "info");
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            put("MessageDigest.TestDigest", TestMessageDigestSpi.class.getName());
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
295f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class TestMessageDigestSpi extends MessageDigestSpi {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestMessageDigestSpi() {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
300f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected byte[] engineDigest() {
303f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            return new byte[]{3,4,5,6,7,8,9,3,45,6,7,};
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineReset() {
308f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineUpdate(byte input) {
313f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineUpdate(byte[] input, int offset, int len) {
318f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
320f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected int engineGetDigestLength() {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 42;
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
327