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