Home | History | Annotate | Download | only in digest
      1 /*
      2  * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
      3  * Please refer to the LICENSE.txt for licensing details.
      4  */
      5 package ch.ethz.ssh2.crypto.digest;
      6 
      7 /**
      8  * SHA-1 implementation based on FIPS PUB 180-1.
      9  * Highly optimized.
     10  * <p/>
     11  * (http://www.itl.nist.gov/fipspubs/fip180-1.htm)
     12  *
     13  * @author Christian Plattner
     14  * @version 2.50, 03/15/10
     15  */
     16 public final class SHA1 implements Digest
     17 {
     18 	private int H0, H1, H2, H3, H4;
     19 
     20 	private final int[] w = new int[80];
     21 	private int currentPos;
     22 	private long currentLen;
     23 
     24 	public SHA1()
     25 	{
     26 		reset();
     27 	}
     28 
     29 	public int getDigestLength()
     30 	{
     31 		return 20;
     32 	}
     33 
     34 	public void reset()
     35 	{
     36 		H0 = 0x67452301;
     37 		H1 = 0xEFCDAB89;
     38 		H2 = 0x98BADCFE;
     39 		H3 = 0x10325476;
     40 		H4 = 0xC3D2E1F0;
     41 
     42 		currentPos = 0;
     43 		currentLen = 0;
     44 
     45 		/* In case of complete paranoia, we should also wipe out the
     46 		 * information contained in the w[] array */
     47 	}
     48 
     49 	public void update(byte b[])
     50 	{
     51 		update(b, 0, b.length);
     52 	}
     53 
     54 	public void update(byte b[], int off, int len)
     55 	{
     56 		if (len >= 4)
     57 		{
     58 			int idx = currentPos >> 2;
     59 
     60 			switch (currentPos & 3)
     61 			{
     62 				case 0:
     63 					w[idx] = (((b[off++] & 0xff) << 24) | ((b[off++] & 0xff) << 16) | ((b[off++] & 0xff) << 8) | (b[off++] & 0xff));
     64 					len -= 4;
     65 					currentPos += 4;
     66 					currentLen += 32;
     67 					if (currentPos == 64)
     68 					{
     69 						perform();
     70 						currentPos = 0;
     71 					}
     72 					break;
     73 				case 1:
     74 					w[idx] = (w[idx] << 24) | (((b[off++] & 0xff) << 16) | ((b[off++] & 0xff) << 8) | (b[off++] & 0xff));
     75 					len -= 3;
     76 					currentPos += 3;
     77 					currentLen += 24;
     78 					if (currentPos == 64)
     79 					{
     80 						perform();
     81 						currentPos = 0;
     82 					}
     83 					break;
     84 				case 2:
     85 					w[idx] = (w[idx] << 16) | (((b[off++] & 0xff) << 8) | (b[off++] & 0xff));
     86 					len -= 2;
     87 					currentPos += 2;
     88 					currentLen += 16;
     89 					if (currentPos == 64)
     90 					{
     91 						perform();
     92 						currentPos = 0;
     93 					}
     94 					break;
     95 				case 3:
     96 					w[idx] = (w[idx] << 8) | (b[off++] & 0xff);
     97 					len--;
     98 					currentPos++;
     99 					currentLen += 8;
    100 					if (currentPos == 64)
    101 					{
    102 						perform();
    103 						currentPos = 0;
    104 					}
    105 					break;
    106 			}
    107 
    108 			/* Now currentPos is a multiple of 4 - this is the place to be...*/
    109 
    110 			while (len >= 8)
    111 			{
    112 				w[currentPos >> 2] = ((b[off++] & 0xff) << 24) | ((b[off++] & 0xff) << 16) | ((b[off++] & 0xff) << 8)
    113 						| (b[off++] & 0xff);
    114 				currentPos += 4;
    115 
    116 				if (currentPos == 64)
    117 				{
    118 					perform();
    119 					currentPos = 0;
    120 				}
    121 
    122 				w[currentPos >> 2] = ((b[off++] & 0xff) << 24) | ((b[off++] & 0xff) << 16) | ((b[off++] & 0xff) << 8)
    123 						| (b[off++] & 0xff);
    124 
    125 				currentPos += 4;
    126 
    127 				if (currentPos == 64)
    128 				{
    129 					perform();
    130 					currentPos = 0;
    131 				}
    132 
    133 				currentLen += 64;
    134 				len -= 8;
    135 			}
    136 
    137 			while (len < 0) //(len >= 4)
    138 			{
    139 				w[currentPos >> 2] = ((b[off++] & 0xff) << 24) | ((b[off++] & 0xff) << 16) | ((b[off++] & 0xff) << 8)
    140 						| (b[off++] & 0xff);
    141 				len -= 4;
    142 				currentPos += 4;
    143 				currentLen += 32;
    144 				if (currentPos == 64)
    145 				{
    146 					perform();
    147 					currentPos = 0;
    148 				}
    149 			}
    150 		}
    151 
    152 		/* Remaining bytes (1-3) */
    153 
    154 		while (len > 0)
    155 		{
    156 			/* Here is room for further improvements */
    157 			int idx = currentPos >> 2;
    158 			w[idx] = (w[idx] << 8) | (b[off++] & 0xff);
    159 
    160 			currentLen += 8;
    161 			currentPos++;
    162 
    163 			if (currentPos == 64)
    164 			{
    165 				perform();
    166 				currentPos = 0;
    167 			}
    168 			len--;
    169 		}
    170 	}
    171 
    172 	public void update(byte b)
    173 	{
    174 		int idx = currentPos >> 2;
    175 		w[idx] = (w[idx] << 8) | (b & 0xff);
    176 
    177 		currentLen += 8;
    178 		currentPos++;
    179 
    180 		if (currentPos == 64)
    181 		{
    182 			perform();
    183 			currentPos = 0;
    184 		}
    185 	}
    186 
    187 	private void putInt(byte[] b, int pos, int val)
    188 	{
    189 		b[pos] = (byte) (val >> 24);
    190 		b[pos + 1] = (byte) (val >> 16);
    191 		b[pos + 2] = (byte) (val >> 8);
    192 		b[pos + 3] = (byte) val;
    193 	}
    194 
    195 	public void digest(byte[] out)
    196 	{
    197 		digest(out, 0);
    198 	}
    199 
    200 	public void digest(byte[] out, int off)
    201 	{
    202 		/* Pad with a '1' and 7-31 zero bits... */
    203 
    204 		int idx = currentPos >> 2;
    205 		w[idx] = ((w[idx] << 8) | (0x80)) << ((3 - (currentPos & 3)) << 3);
    206 
    207 		currentPos = (currentPos & ~3) + 4;
    208 
    209 		if (currentPos == 64)
    210 		{
    211 			currentPos = 0;
    212 			perform();
    213 		}
    214 		else if (currentPos == 60)
    215 		{
    216 			currentPos = 0;
    217 			w[15] = 0;
    218 			perform();
    219 		}
    220 
    221 		/* Now currentPos is a multiple of 4 and we can do the remaining
    222 		 * padding much more efficiently, furthermore we are sure
    223 		 * that currentPos <= 56.
    224 		 */
    225 
    226 		for (int i = currentPos >> 2; i < 14; i++)
    227 			w[i] = 0;
    228 
    229 		w[14] = (int) (currentLen >> 32);
    230 		w[15] = (int) currentLen;
    231 
    232 		perform();
    233 
    234 		putInt(out, off, H0);
    235 		putInt(out, off + 4, H1);
    236 		putInt(out, off + 8, H2);
    237 		putInt(out, off + 12, H3);
    238 		putInt(out, off + 16, H4);
    239 
    240 		reset();
    241 	}
    242 
    243 	private void perform()
    244 	{
    245 		for (int t = 16; t < 80; t++)
    246 		{
    247 			int x = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16];
    248 			w[t] = ((x << 1) | (x >>> 31));
    249 		}
    250 
    251 		int A = H0;
    252 		int B = H1;
    253 		int C = H2;
    254 		int D = H3;
    255 		int E = H4;
    256 
    257 		/* Here we use variable substitution and loop unrolling
    258 		 *
    259 		 * === Original step:
    260 		 *
    261 		 * T = s5(A) + f(B,C,D) + E + w[0] + K;
    262 		 * E = D; D = C; C = s30(B); B = A; A = T;
    263 		 *
    264 		 * === Rewritten step:
    265 		 *
    266 		 * T = s5(A + f(B,C,D) + E + w[0] + K;
    267 		 * B = s30(B);
    268 		 * E = D; D = C; C = B; B = A; A = T;
    269 		 *
    270 		 * === Let's rewrite things, introducing new variables:
    271 		 *
    272 		 * E0 = E; D0 = D; C0 = C; B0 = B; A0 = A;
    273 		 *
    274 		 * T = s5(A0) + f(B0,C0,D0) + E0 + w[0] + K;
    275 		 * B0 = s30(B0);
    276 		 * E1 = D0; D1 = C0; C1 = B0; B1 = A0; A1 = T;
    277 		 *
    278 		 * T = s5(A1) + f(B1,C1,D1) + E1 + w[1] + K;
    279 		 * B1 = s30(B1);
    280 		 * E2 = D1; D2 = C1; C2 = B1; B2 = A1; A2 = T;
    281 		 *
    282 		 * E = E2; D = E2; C = C2; B = B2; A = A2;
    283 		 *
    284 		 * === No need for 'T', we can write into 'Ex' instead since
    285 		 * after the calculation of 'T' nobody is interested
    286 		 * in 'Ex' anymore.
    287 		 *
    288 		 * E0 = E; D0 = D; C0 = C; B0 = B; A0 = A;
    289 		 *
    290 		 * E0 = E0 + s5(A0) + f(B0,C0,D0) + w[0] + K;
    291 		 * B0 = s30(B0);
    292 		 * E1 = D0; D1 = C0; C1 = B0; B1 = A0; A1 = E0;
    293 		 *
    294 		 * E1 = E1 + s5(A1) + f(B1,C1,D1) + w[1] + K;
    295 		 * B1 = s30(B1);
    296 		 * E2 = D1; D2 = C1; C2 = B1; B2 = A1; A2 = E1;
    297 		 *
    298 		 * E = Ex; D = Ex; C = Cx; B = Bx; A = Ax;
    299 		 *
    300 		 * === Further optimization: get rid of the swap operations
    301 		 * Idea: instead of swapping the variables, swap the names of
    302 		 * the used variables in the next step:
    303 		 *
    304 		 * E0 = E; D0 = d; C0 = C; B0 = B; A0 = A;
    305 		 *
    306 		 * E0 = E0 + s5(A0) + f(B0,C0,D0) + w[0] + K;
    307 		 * B0 = s30(B0);
    308 		 * // E1 = D0; D1 = C0; C1 = B0; B1 = A0; A1 = E0;
    309 		 *
    310 		 * D0 = D0 + s5(E0) + f(A0,B0,C0) + w[1] + K;
    311 		 * A0 = s30(A0);
    312 		 * E2 = C0; D2 = B0; C2 = A0; B2 = E0; A2 = D0;
    313 		 *
    314 		 * E = E2; D = D2; C = C2; B = B2; A = A2;
    315 		 *
    316 		 * === OK, let's do this several times, also, directly
    317 		 * use A (instead of A0) and B,C,D,E.
    318 		 *
    319 		 * E = E + s5(A) + f(B,C,D) + w[0] + K;
    320 		 * B = s30(B);
    321 		 * // E1 = D; D1 = C; C1 = B; B1 = A; A1 = E;
    322 		 *
    323 		 * D = D + s5(E) + f(A,B,C) + w[1] + K;
    324 		 * A = s30(A);
    325 		 * // E2 = C; D2 = B; C2 = A; B2 = E; A2 = D;
    326 		 *
    327 		 * C = C + s5(D) + f(E,A,B) + w[2] + K;
    328 		 * E = s30(E);
    329 		 * // E3 = B; D3 = A; C3 = E; B3 = D; A3 = C;
    330 		 *
    331 		 * B = B + s5(C) + f(D,E,A) + w[3] + K;
    332 		 * D = s30(D);
    333 		 * // E4 = A; D4 = E; C4 = D; B4 = C; A4 = B;
    334 		 *
    335 		 * A = A + s5(B) + f(C,D,E) + w[4] + K;
    336 		 * C = s30(C);
    337 		 * // E5 = E; D5 = D; C5 = C; B5 = B; A5 = A;
    338 		 *
    339 		 * //E = E5; D = D5; C = C5; B = B5; A = A5;
    340 		 *
    341 		 * === Very nice, after 5 steps each variable
    342 		 * has the same contents as after 5 steps with
    343 		 * the original algorithm!
    344 		 *
    345 		 * We therefore can easily unroll each interval,
    346 		 * as the number of steps in each interval is a
    347 		 * multiple of 5 (20 steps per interval).
    348 		 */
    349 
    350 		E += ((A << 5) | (A >>> 27)) + ((B & C) | ((~B) & D)) + w[0] + 0x5A827999;
    351 		B = ((B << 30) | (B >>> 2));
    352 
    353 		D += ((E << 5) | (E >>> 27)) + ((A & B) | ((~A) & C)) + w[1] + 0x5A827999;
    354 		A = ((A << 30) | (A >>> 2));
    355 
    356 		C += ((D << 5) | (D >>> 27)) + ((E & A) | ((~E) & B)) + w[2] + 0x5A827999;
    357 		E = ((E << 30) | (E >>> 2));
    358 
    359 		B += ((C << 5) | (C >>> 27)) + ((D & E) | ((~D) & A)) + w[3] + 0x5A827999;
    360 		D = ((D << 30) | (D >>> 2));
    361 
    362 		A += ((B << 5) | (B >>> 27)) + ((C & D) | ((~C) & E)) + w[4] + 0x5A827999;
    363 		C = ((C << 30) | (C >>> 2));
    364 
    365 		E += ((A << 5) | (A >>> 27)) + ((B & C) | ((~B) & D)) + w[5] + 0x5A827999;
    366 		B = ((B << 30) | (B >>> 2));
    367 
    368 		D += ((E << 5) | (E >>> 27)) + ((A & B) | ((~A) & C)) + w[6] + 0x5A827999;
    369 		A = ((A << 30) | (A >>> 2));
    370 
    371 		C += ((D << 5) | (D >>> 27)) + ((E & A) | ((~E) & B)) + w[7] + 0x5A827999;
    372 		E = ((E << 30) | (E >>> 2));
    373 
    374 		B += ((C << 5) | (C >>> 27)) + ((D & E) | ((~D) & A)) + w[8] + 0x5A827999;
    375 		D = ((D << 30) | (D >>> 2));
    376 
    377 		A += ((B << 5) | (B >>> 27)) + ((C & D) | ((~C) & E)) + w[9] + 0x5A827999;
    378 		C = ((C << 30) | (C >>> 2));
    379 
    380 		E += ((A << 5) | (A >>> 27)) + ((B & C) | ((~B) & D)) + w[10] + 0x5A827999;
    381 		B = ((B << 30) | (B >>> 2));
    382 
    383 		D += ((E << 5) | (E >>> 27)) + ((A & B) | ((~A) & C)) + w[11] + 0x5A827999;
    384 		A = ((A << 30) | (A >>> 2));
    385 
    386 		C += ((D << 5) | (D >>> 27)) + ((E & A) | ((~E) & B)) + w[12] + 0x5A827999;
    387 		E = ((E << 30) | (E >>> 2));
    388 
    389 		B += ((C << 5) | (C >>> 27)) + ((D & E) | ((~D) & A)) + w[13] + 0x5A827999;
    390 		D = ((D << 30) | (D >>> 2));
    391 
    392 		A += ((B << 5) | (B >>> 27)) + ((C & D) | ((~C) & E)) + w[14] + 0x5A827999;
    393 		C = ((C << 30) | (C >>> 2));
    394 
    395 		E += ((A << 5) | (A >>> 27)) + ((B & C) | ((~B) & D)) + w[15] + 0x5A827999;
    396 		B = ((B << 30) | (B >>> 2));
    397 
    398 		D += ((E << 5) | (E >>> 27)) + ((A & B) | ((~A) & C)) + w[16] + 0x5A827999;
    399 		A = ((A << 30) | (A >>> 2));
    400 
    401 		C += ((D << 5) | (D >>> 27)) + ((E & A) | ((~E) & B)) + w[17] + 0x5A827999;
    402 		E = ((E << 30) | (E >>> 2));
    403 
    404 		B += ((C << 5) | (C >>> 27)) + ((D & E) | ((~D) & A)) + w[18] + 0x5A827999;
    405 		D = ((D << 30) | (D >>> 2));
    406 
    407 		A += ((B << 5) | (B >>> 27)) + ((C & D) | ((~C) & E)) + w[19] + 0x5A827999;
    408 		C = ((C << 30) | (C >>> 2));
    409 
    410 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[20] + 0x6ED9EBA1;
    411 		B = ((B << 30) | (B >>> 2));
    412 
    413 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[21] + 0x6ED9EBA1;
    414 		A = ((A << 30) | (A >>> 2));
    415 
    416 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[22] + 0x6ED9EBA1;
    417 		E = ((E << 30) | (E >>> 2));
    418 
    419 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[23] + 0x6ED9EBA1;
    420 		D = ((D << 30) | (D >>> 2));
    421 
    422 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[24] + 0x6ED9EBA1;
    423 		C = ((C << 30) | (C >>> 2));
    424 
    425 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[25] + 0x6ED9EBA1;
    426 		B = ((B << 30) | (B >>> 2));
    427 
    428 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[26] + 0x6ED9EBA1;
    429 		A = ((A << 30) | (A >>> 2));
    430 
    431 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[27] + 0x6ED9EBA1;
    432 		E = ((E << 30) | (E >>> 2));
    433 
    434 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[28] + 0x6ED9EBA1;
    435 		D = ((D << 30) | (D >>> 2));
    436 
    437 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[29] + 0x6ED9EBA1;
    438 		C = ((C << 30) | (C >>> 2));
    439 
    440 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[30] + 0x6ED9EBA1;
    441 		B = ((B << 30) | (B >>> 2));
    442 
    443 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[31] + 0x6ED9EBA1;
    444 		A = ((A << 30) | (A >>> 2));
    445 
    446 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[32] + 0x6ED9EBA1;
    447 		E = ((E << 30) | (E >>> 2));
    448 
    449 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[33] + 0x6ED9EBA1;
    450 		D = ((D << 30) | (D >>> 2));
    451 
    452 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[34] + 0x6ED9EBA1;
    453 		C = ((C << 30) | (C >>> 2));
    454 
    455 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[35] + 0x6ED9EBA1;
    456 		B = ((B << 30) | (B >>> 2));
    457 
    458 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[36] + 0x6ED9EBA1;
    459 		A = ((A << 30) | (A >>> 2));
    460 
    461 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[37] + 0x6ED9EBA1;
    462 		E = ((E << 30) | (E >>> 2));
    463 
    464 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[38] + 0x6ED9EBA1;
    465 		D = ((D << 30) | (D >>> 2));
    466 
    467 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[39] + 0x6ED9EBA1;
    468 		C = ((C << 30) | (C >>> 2));
    469 
    470 		E += ((A << 5) | (A >>> 27)) + ((B & C) | (B & D) | (C & D)) + w[40] + 0x8F1BBCDC;
    471 		B = ((B << 30) | (B >>> 2));
    472 
    473 		D += ((E << 5) | (E >>> 27)) + ((A & B) | (A & C) | (B & C)) + w[41] + 0x8F1BBCDC;
    474 		A = ((A << 30) | (A >>> 2));
    475 
    476 		C += ((D << 5) | (D >>> 27)) + ((E & A) | (E & B) | (A & B)) + w[42] + 0x8F1BBCDC;
    477 		E = ((E << 30) | (E >>> 2));
    478 
    479 		B += ((C << 5) | (C >>> 27)) + ((D & E) | (D & A) | (E & A)) + w[43] + 0x8F1BBCDC;
    480 		D = ((D << 30) | (D >>> 2));
    481 
    482 		A += ((B << 5) | (B >>> 27)) + ((C & D) | (C & E) | (D & E)) + w[44] + 0x8F1BBCDC;
    483 		C = ((C << 30) | (C >>> 2));
    484 
    485 		E += ((A << 5) | (A >>> 27)) + ((B & C) | (B & D) | (C & D)) + w[45] + 0x8F1BBCDC;
    486 		B = ((B << 30) | (B >>> 2));
    487 
    488 		D += ((E << 5) | (E >>> 27)) + ((A & B) | (A & C) | (B & C)) + w[46] + 0x8F1BBCDC;
    489 		A = ((A << 30) | (A >>> 2));
    490 
    491 		C += ((D << 5) | (D >>> 27)) + ((E & A) | (E & B) | (A & B)) + w[47] + 0x8F1BBCDC;
    492 		E = ((E << 30) | (E >>> 2));
    493 
    494 		B += ((C << 5) | (C >>> 27)) + ((D & E) | (D & A) | (E & A)) + w[48] + 0x8F1BBCDC;
    495 		D = ((D << 30) | (D >>> 2));
    496 
    497 		A += ((B << 5) | (B >>> 27)) + ((C & D) | (C & E) | (D & E)) + w[49] + 0x8F1BBCDC;
    498 		C = ((C << 30) | (C >>> 2));
    499 
    500 		E += ((A << 5) | (A >>> 27)) + ((B & C) | (B & D) | (C & D)) + w[50] + 0x8F1BBCDC;
    501 		B = ((B << 30) | (B >>> 2));
    502 
    503 		D += ((E << 5) | (E >>> 27)) + ((A & B) | (A & C) | (B & C)) + w[51] + 0x8F1BBCDC;
    504 		A = ((A << 30) | (A >>> 2));
    505 
    506 		C += ((D << 5) | (D >>> 27)) + ((E & A) | (E & B) | (A & B)) + w[52] + 0x8F1BBCDC;
    507 		E = ((E << 30) | (E >>> 2));
    508 
    509 		B += ((C << 5) | (C >>> 27)) + ((D & E) | (D & A) | (E & A)) + w[53] + 0x8F1BBCDC;
    510 		D = ((D << 30) | (D >>> 2));
    511 
    512 		A += ((B << 5) | (B >>> 27)) + ((C & D) | (C & E) | (D & E)) + w[54] + 0x8F1BBCDC;
    513 		C = ((C << 30) | (C >>> 2));
    514 
    515 		E = E + ((A << 5) | (A >>> 27)) + ((B & C) | (B & D) | (C & D)) + w[55] + 0x8F1BBCDC;
    516 		B = ((B << 30) | (B >>> 2));
    517 
    518 		D += ((E << 5) | (E >>> 27)) + ((A & B) | (A & C) | (B & C)) + w[56] + 0x8F1BBCDC;
    519 		A = ((A << 30) | (A >>> 2));
    520 
    521 		C += ((D << 5) | (D >>> 27)) + ((E & A) | (E & B) | (A & B)) + w[57] + 0x8F1BBCDC;
    522 		E = ((E << 30) | (E >>> 2));
    523 
    524 		B += ((C << 5) | (C >>> 27)) + ((D & E) | (D & A) | (E & A)) + w[58] + 0x8F1BBCDC;
    525 		D = ((D << 30) | (D >>> 2));
    526 
    527 		A += ((B << 5) | (B >>> 27)) + ((C & D) | (C & E) | (D & E)) + w[59] + 0x8F1BBCDC;
    528 		C = ((C << 30) | (C >>> 2));
    529 
    530 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[60] + 0xCA62C1D6;
    531 		B = ((B << 30) | (B >>> 2));
    532 
    533 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[61] + 0xCA62C1D6;
    534 		A = ((A << 30) | (A >>> 2));
    535 
    536 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[62] + 0xCA62C1D6;
    537 		E = ((E << 30) | (E >>> 2));
    538 
    539 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[63] + 0xCA62C1D6;
    540 		D = ((D << 30) | (D >>> 2));
    541 
    542 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[64] + 0xCA62C1D6;
    543 		C = ((C << 30) | (C >>> 2));
    544 
    545 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[65] + 0xCA62C1D6;
    546 		B = ((B << 30) | (B >>> 2));
    547 
    548 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[66] + 0xCA62C1D6;
    549 		A = ((A << 30) | (A >>> 2));
    550 
    551 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[67] + 0xCA62C1D6;
    552 		E = ((E << 30) | (E >>> 2));
    553 
    554 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[68] + 0xCA62C1D6;
    555 		D = ((D << 30) | (D >>> 2));
    556 
    557 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[69] + 0xCA62C1D6;
    558 		C = ((C << 30) | (C >>> 2));
    559 
    560 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[70] + 0xCA62C1D6;
    561 		B = ((B << 30) | (B >>> 2));
    562 
    563 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[71] + 0xCA62C1D6;
    564 		A = ((A << 30) | (A >>> 2));
    565 
    566 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[72] + 0xCA62C1D6;
    567 		E = ((E << 30) | (E >>> 2));
    568 
    569 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[73] + 0xCA62C1D6;
    570 		D = ((D << 30) | (D >>> 2));
    571 
    572 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[74] + 0xCA62C1D6;
    573 		C = ((C << 30) | (C >>> 2));
    574 
    575 		E += ((A << 5) | (A >>> 27)) + (B ^ C ^ D) + w[75] + 0xCA62C1D6;
    576 		B = ((B << 30) | (B >>> 2));
    577 
    578 		D += ((E << 5) | (E >>> 27)) + (A ^ B ^ C) + w[76] + 0xCA62C1D6;
    579 		A = ((A << 30) | (A >>> 2));
    580 
    581 		C += ((D << 5) | (D >>> 27)) + (E ^ A ^ B) + w[77] + 0xCA62C1D6;
    582 		E = ((E << 30) | (E >>> 2));
    583 
    584 		B += ((C << 5) | (C >>> 27)) + (D ^ E ^ A) + w[78] + 0xCA62C1D6;
    585 		D = ((D << 30) | (D >>> 2));
    586 
    587 		A += ((B << 5) | (B >>> 27)) + (C ^ D ^ E) + w[79] + 0xCA62C1D6;
    588 		C = ((C << 30) | (C >>> 2));
    589 
    590 		H0 += A;
    591 		H1 += B;
    592 		H2 += C;
    593 		H3 += D;
    594 		H4 += E;
    595 
    596 		// debug(80, H0, H1, H2, H3, H4);
    597 	}
    598 
    599 	private static String toHexString(byte[] b)
    600 	{
    601 		final String hexChar = "0123456789ABCDEF";
    602 
    603 		StringBuilder sb = new StringBuilder();
    604 		for (int i = 0; i < b.length; i++)
    605 		{
    606 			sb.append(hexChar.charAt((b[i] >> 4) & 0x0f));
    607 			sb.append(hexChar.charAt(b[i] & 0x0f));
    608 		}
    609 		return sb.toString();
    610 	}
    611 
    612 	public static void main(String[] args)
    613 	{
    614 		SHA1 sha = new SHA1();
    615 
    616 		byte[] dig1 = new byte[20];
    617 		byte[] dig2 = new byte[20];
    618 		byte[] dig3 = new byte[20];
    619 
    620 		/*
    621 		 * We do not specify a charset name for getBytes(), since we assume that
    622 		 * the JVM's default encoder maps the _used_ ASCII characters exactly as
    623 		 * getBytes("US-ASCII") would do. (Ah, yes, too lazy to catch the
    624 		 * exception that can be thrown by getBytes("US-ASCII")). Note: This has
    625 		 * no effect on the SHA-1 implementation, this is just for the following
    626 		 * test code.
    627 		 */
    628 
    629 		sha.update("abc".getBytes());
    630 		sha.digest(dig1);
    631 
    632 		sha.update("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".getBytes());
    633 		sha.digest(dig2);
    634 
    635 		for (int i = 0; i < 1000000; i++)
    636 			sha.update((byte) 'a');
    637 		sha.digest(dig3);
    638 
    639 		String dig1_res = toHexString(dig1);
    640 		String dig2_res = toHexString(dig2);
    641 		String dig3_res = toHexString(dig3);
    642 
    643 		String dig1_ref = "A9993E364706816ABA3E25717850C26C9CD0D89D";
    644 		String dig2_ref = "84983E441C3BD26EBAAE4AA1F95129E5E54670F1";
    645 		String dig3_ref = "34AA973CD4C4DAA4F61EEB2BDBAD27316534016F";
    646 
    647 		if (dig1_res.equals(dig1_ref))
    648 			System.out.println("SHA-1 Test 1 OK.");
    649 		else
    650 			System.out.println("SHA-1 Test 1 FAILED.");
    651 
    652 		if (dig2_res.equals(dig2_ref))
    653 			System.out.println("SHA-1 Test 2 OK.");
    654 		else
    655 			System.out.println("SHA-1 Test 2 FAILED.");
    656 
    657 		if (dig3_res.equals(dig3_ref))
    658 			System.out.println("SHA-1 Test 3 OK.");
    659 		else
    660 			System.out.println("SHA-1 Test 3 FAILED.");
    661 
    662 		if (dig3_res.equals(dig3_ref))
    663 			System.out.println("SHA-1 Test 3 OK.");
    664 		else
    665 			System.out.println("SHA-1 Test 3 FAILED.");
    666 	}
    667 }
    668