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
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.provider.crypto;
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.UnsupportedEncodingException;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.Test;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestSuite;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.provider.crypto.SHA1Impl;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.MessageDigest;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Tests against methods in SHA1Impl class.
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The input data and results of computing are defined in Secure Hash Standard,
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * see http://www.itl.nist.gov/fipspubs/fip180-1.htm
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SHA1ImplTest extends TestCase {
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // SHA1Data constant used in below methods
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final int INDEX = SHA1Impl.BYTES_OFFSET;
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static MessageDigest md;
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @see TestCase#setUp()
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        md = MessageDigest.getInstance("SHA-1", "Crypto");
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The test checks out that for given three byte input
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * a value returned by SHA1Impl is equal to both :
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * - one defined in the Standard and
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * - one calculated with alternative computation algorithm defined in the Standard.
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testOneBlockMessage() {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int[] words = new int[INDEX +6];	// working array to compute hash
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // values defined in examples in Secure Hash Standard
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int[] hash1 = {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 };
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int[] hash  = {0xA9993E36, 0x4706816A, 0xBA3E2571, 0x7850C26C, 0x9CD0D89D };
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < words.length; i++ ) {
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            words[i] = 0;
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        words[0]  = 0x61626380;    // constants from Secure Hash Standard
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        words[15] = 0x00000018;
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        alternateHash(words, hash1);
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        md.update(new byte[]{0x61,0x62,0x63});
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] dgst = md.digest();
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for ( int k = 0; k < 5; k++ ) {
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int i = k*4;
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
87e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            int j = ((dgst[i  ]&0xff)<<24) | ((dgst[i+1]&0xff)<<16) |
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((dgst[i+2]&0xff)<<8 ) | (dgst[i+3]&0xff)  ;
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
90e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertTrue("false1: k=" + k + " hash1[k]=" + Integer.toHexString(hash1[k]),
91e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                       hash[k] == hash1[k] );
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("false2: k=" + k + " j=" + Integer.toHexString(j), hash[k] == j );
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The test checks out that SHA1Impl computes correct value
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * if data supplied takes exactly fourteen words of sixteen word buffer.
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testMultiBlockMessage() throws UnsupportedEncodingException {
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // values defined in examples in Secure Hash Standard
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int[] hash  = {0x84983e44, 0x1c3bd26e, 0xbaae4aa1, 0xf95129e5, 0xe54670f1 };
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // string defined in examples in Secure Hash Standard
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        md.update("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".getBytes("UTF-8"));
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] dgst = md.digest();
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for ( int k = 0; k < 5; k++ ) {
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int i = k*4;
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
116e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                int j = ((dgst[i  ]&0xff)<<24) | ((dgst[i+1]&0xff)<<16) |
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        ((dgst[i+2]&0xff)<<8 ) | (dgst[i+3]&0xff)  ;
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("false: k=" + k + " j=" + Integer.toHexString(j), hash[k] == j );
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
125e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * The test checks out that SHA1Impl returns correct values
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * for four different cases of infilling internal buffer and computing intermediate hash.
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLongMessage() {
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // values defined in examples in Secure Hash Standard
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int[] hash  = {0x34aa973c, 0xd4c4daa4, 0xf61eeb2b, 0xdbad2731, 0x6534016f };
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte msgs[][] = new byte[][] { {0x61},
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                       {0x61, 0x61},
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                       {0x61, 0x61, 0x61},
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                       {0x61, 0x61, 0x61, 0x61} };
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int lngs[] = new int[]{1000000, 500000, 333333, 250000};
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for ( int n = 0; n < 4; n++ ) {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for ( int i = 0; i < lngs[n]; i++) {
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                md.update(msgs[n]);
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ( n == 2 ) {
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                md.update(msgs[0]);
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] dgst = md.digest();
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for ( int k = 0; k < 5; k++ ) {
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                int i = k*4;
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
153e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                int j = ((dgst[i  ]&0xff)<<24) | ((dgst[i+1]&0xff)<<16) |
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        ((dgst[i+2]&0xff)<<8 ) | (dgst[i+3]&0xff)  ;
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
156e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                assertTrue("false: n =" + n + "  k=" + k + " j" + Integer.toHexString(j),
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            hash[k] == j );
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * implements alternative algorithm described in the SECURE HASH STANDARD
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void alternateHash(int[] bufW, int[] hash) {
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // constants defined in Secure Hash Standard
169e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        final int[] K = {
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x5A827999, 0x5A827999, 0x5A827999, 0x5A827999,
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x5A827999, 0x5A827999, 0x5A827999, 0x5A827999,
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x5A827999, 0x5A827999, 0x5A827999, 0x5A827999,
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x5A827999, 0x5A827999, 0x5A827999, 0x5A827999,
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x5A827999, 0x5A827999, 0x5A827999, 0x5A827999,
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1,
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1,
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1,
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1,
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1, 0x6ED9EBA1,
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC,
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC,
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC,
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC,
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC, 0x8F1BBCDC,
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6,
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6,
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6,
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6,
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6, 0xCA62C1D6
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int  a = hash[0]; //0x67452301 ;
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int  b = hash[1]; //0xEFCDAB89 ;
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int  c = hash[2]; //0x98BADCFE ;
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int  d = hash[3]; //0x10325476 ;
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int  e = hash[4]; //0xC3D2E1F0 ;
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // implementation constant and variables
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        final int MASK = 0x0000000F;
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int temp;
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int s;
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int tmp;
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // computation defined in Secure Hash Standard
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for ( int t = 0 ; t < 80 ; t++ ) {
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            s = t & MASK;
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ( t >= 16) {
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                tmp = bufW[ (s+13)&MASK ] ^ bufW[(s+8)&MASK ] ^ bufW[ (s+2)&MASK ] ^ bufW[s];
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bufW[s] = ( tmp<<1 ) | ( tmp>>>31 );
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            temp = ( a << 5 ) | ( a >>> 27 );
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ( t < 20 ) {
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                temp += ( b & c ) | ( (~b) & d ) ;
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else if ( t < 40 ) {
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                temp += b ^ c ^ d ;
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else if ( t < 60 ) {
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                temp += ( b & c ) | ( b & d ) | ( c & d ) ;
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                temp += b ^ c ^ d ;
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            temp += e + bufW[s] + K[t] ;
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            e = d;
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            d = c;
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            c = ( b<<30 ) | ( b>>>2 ) ;
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            b = a;
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            a = temp;
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        hash[0] += a;
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        hash[1] += b;
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        hash[2] += c;
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        hash[3] += d;
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        hash[4] += e;
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Test suite() {
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestSuite(SHA1ImplTest.class);
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }
252