1 38 39 package com.quadcap.crypto; 40 41 45 46 68 69 import java.util.Random ; 70 71 76 public final class SHA1Digest implements Digest { 77 private byte[] digest = null; 78 private boolean digestValid = false; 79 private int[] state = new int[5]; 80 private long count = 0; 81 82 87 private int[] block = new int[16]; 88 private int blockIndex; 89 90 93 public SHA1Digest() { 94 init(); 95 } 96 97 101 public void init() { 102 103 state[0] = 0x67452301; 104 state[1] = 0xEFCDAB89; 105 state[2] = 0x98BADCFE; 106 state[3] = 0x10325476; 107 state[4] = 0xC3D2E1F0; 108 count = 0; 109 digest = new byte[20]; 110 digestValid = false; 111 blockIndex = 0; 112 } 113 114 119 public void update(byte b) { 120 int mask = (8 * (blockIndex & 3)); 121 count += 8; 122 block[blockIndex >> 2] &= ~(0xff << mask); 123 block[blockIndex >> 2] |= (b & 0xff) << mask; 124 blockIndex++; 125 if (blockIndex == 64) { 126 transform(); 127 blockIndex = 0; 128 } 129 } 130 131 134 public void update(byte[] b, int off, int len) { 135 for (int i = 0; i < len; i++) update(b[off+i]); 136 } 137 138 142 public void update(byte[] buf) { update(buf, 0, buf.length); } 143 144 147 public byte[] digest() { 148 byte[] ret = null; 149 if (!digestValid) { 150 finish(); 151 ret = digest; 152 init(); 153 } 154 return ret; 155 } 156 157 160 private final void finish() { 161 byte bits[] = new byte[8]; 162 int i, j; 163 164 for (i = 0; i < 8; i++) { 165 bits[i] = (byte)((count >>> (((7 - i) * 8))) & 0xff); 166 } 167 168 update((byte) 128); 169 while (blockIndex != 56) 170 update((byte) 0); 171 update(bits); 173 for (i = 0; i < 20; i++) { 174 digest[i] = (byte) 175 ((state[i>>2] >> ((3-(i & 3)) * 8) ) & 0xff); 176 } 177 digestValid = true; 178 } 179 180 181 public String getAlg() { return "SHA1"; } 182 183 186 187 195 final int rol(int value, int bits) { 196 int q = (value << bits) | (value >>> (32 - bits)); 197 return q; 198 } 199 200 final int blk0(int i) { 201 block[i] = (rol(block[i],24)&0xFF00FF00) | 202 (rol(block[i],8)&0x00FF00FF); 203 return block[i]; 204 } 205 206 final int blk(int i) { 207 block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15]^ 208 block[(i+2)&15]^block[i&15], 1); 209 return (block[i&15]); 210 } 211 212 final void R0(int data[], int v, int w, int x , int y, int z, int i) { 213 data[z] += ((data[w] & (data[x] ^ data[y] )) ^ data[y]) + 214 blk0(i) + 0x5A827999 + rol(data[v] ,5); 215 data[w] = rol(data[w], 30); 216 } 217 218 final void R1(int data[], int v, int w, int x, int y, int z, int i) { 219 data[z] += ((data[w] & (data[x] ^ data[y])) ^ data[y]) + 220 blk(i) + 0x5A827999 + rol(data[v] ,5); 221 data[w] = rol(data[w], 30); 222 } 223 224 final void R2(int data[], int v, int w, int x, int y, int z, int i) { 225 data[z] += (data[w] ^ data[x] ^ data[y]) + 226 blk(i) + 0x6ED9EBA1 + rol(data[v] ,5); 227 data[w] = rol(data[w], 30); 228 } 229 230 final void R3(int data[], int v, int w, int x, int y, int z, int i) { 231 data[z] += (((data[w] | data[x]) & data[y]) | (data[w] & 232 data[x])) + 233 blk(i) + 0x8F1BBCDC + rol(data[v] ,5); 234 data[w] = rol(data[w], 30); 235 } 236 237 final void R4(int data[], int v, int w, int x, int y, int z, int i) { 238 data[z] += (data[w] ^ data[x] ^ data[y]) + 239 blk(i) + 0xCA62C1D6 + rol(data[v] ,5); 240 data[w] = rol(data[w], 30); 241 } 242 243 244 267 268 int dd[] = new int[5]; 269 270 277 278 void transform() { 279 280 dd[0] = state[0]; 281 dd[1] = state[1]; 282 dd[2] = state[2]; 283 dd[3] = state[3]; 284 dd[4] = state[4]; 285 286 R0(dd,0,1,2,3,4, 0); R0(dd,4,0,1,2,3, 1); R0(dd,3,4,0,1,2, 2); 287 R0(dd,2,3,4,0,1, 3); 288 R0(dd,1,2,3,4,0, 4); R0(dd,0,1,2,3,4, 5); R0(dd,4,0,1,2,3, 6); 289 R0(dd,3,4,0,1,2, 7); 290 R0(dd,2,3,4,0,1, 8); R0(dd,1,2,3,4,0, 9); R0(dd,0,1,2,3,4,10); 291 R0(dd,4,0,1,2,3,11); 292 R0(dd,3,4,0,1,2,12); R0(dd,2,3,4,0,1,13); R0(dd,1,2,3,4,0,14); 293 R0(dd,0,1,2,3,4,15); 294 R1(dd,4,0,1,2,3,16); R1(dd,3,4,0,1,2,17); R1(dd,2,3,4,0,1,18); 295 R1(dd,1,2,3,4,0,19); 296 R2(dd,0,1,2,3,4,20); R2(dd,4,0,1,2,3,21); R2(dd,3,4,0,1,2,22); 297 R2(dd,2,3,4,0,1,23); 298 R2(dd,1,2,3,4,0,24); R2(dd,0,1,2,3,4,25); R2(dd,4,0,1,2,3,26); 299 R2(dd,3,4,0,1,2,27); 300 R2(dd,2,3,4,0,1,28); R2(dd,1,2,3,4,0,29); R2(dd,0,1,2,3,4,30); 301 R2(dd,4,0,1,2,3,31); 302 R2(dd,3,4,0,1,2,32); R2(dd,2,3,4,0,1,33); R2(dd,1,2,3,4,0,34); 303 R2(dd,0,1,2,3,4,35); 304 R2(dd,4,0,1,2,3,36); R2(dd,3,4,0,1,2,37); R2(dd,2,3,4,0,1,38); 305 R2(dd,1,2,3,4,0,39); 306 R3(dd,0,1,2,3,4,40); R3(dd,4,0,1,2,3,41); R3(dd,3,4,0,1,2,42); 307 R3(dd,2,3,4,0,1,43); 308 R3(dd,1,2,3,4,0,44); R3(dd,0,1,2,3,4,45); R3(dd,4,0,1,2,3,46); 309 R3(dd,3,4,0,1,2,47); 310 R3(dd,2,3,4,0,1,48); R3(dd,1,2,3,4,0,49); R3(dd,0,1,2,3,4,50); 311 R3(dd,4,0,1,2,3,51); 312 R3(dd,3,4,0,1,2,52); R3(dd,2,3,4,0,1,53); R3(dd,1,2,3,4,0,54); 313 R3(dd,0,1,2,3,4,55); 314 R3(dd,4,0,1,2,3,56); R3(dd,3,4,0,1,2,57); R3(dd,2,3,4,0,1,58); 315 R3(dd,1,2,3,4,0,59); 316 R4(dd,0,1,2,3,4,60); R4(dd,4,0,1,2,3,61); R4(dd,3,4,0,1,2,62); 317 R4(dd,2,3,4,0,1,63); 318 R4(dd,1,2,3,4,0,64); R4(dd,0,1,2,3,4,65); R4(dd,4,0,1,2,3,66); 319 R4(dd,3,4,0,1,2,67); 320 R4(dd,2,3,4,0,1,68); R4(dd,1,2,3,4,0,69); R4(dd,0,1,2,3,4,70); 321 R4(dd,4,0,1,2,3,71); 322 R4(dd,3,4,0,1,2,72); R4(dd,2,3,4,0,1,73); R4(dd,1,2,3,4,0,74); 323 R4(dd,0,1,2,3,4,75); 324 R4(dd,4,0,1,2,3,76); R4(dd,3,4,0,1,2,77); R4(dd,2,3,4,0,1,78); 325 R4(dd,1,2,3,4,0,79); 326 327 state[0] += dd[0]; 328 state[1] += dd[1]; 329 state[2] += dd[2]; 330 state[3] += dd[3]; 331 state[4] += dd[4]; 332 } 333 334 339 private String digout() { 340 StringBuffer sb = new StringBuffer (); 341 for (int i = 0; i < 20; i++) { 342 char c1, c2; 343 344 c1 = (char) ((digest[i] >>> 4) & 0xf); 345 c2 = (char) (digest[i] & 0xf); 346 c1 = (char) ((c1 > 9) ? 'A' + (c1 - 10) : '0' + c1); 347 c2 = (char) ((c2 > 9) ? 'A' + (c2 - 10) : '0' + c2); 348 sb.append(c1); 349 sb.append(c2); 350 if (((i+1) % 4) == 0) 351 sb.append(' '); 352 } 353 return sb.toString(); 354 } 355 356 357 367 public static void main(String args[]) { 368 SHA1Digest s = new SHA1Digest(); 369 370 System.out.println("SHA-1 Test PROGRAM."); 371 System.out.println("This code runs the test vectors through the code."); 372 373 375 376 System.out.println("First test is 'abc'"); 377 String z = "abc"; 378 s.init(); 379 s.update((byte) 'a'); 380 s.update((byte) 'b'); 381 s.update((byte) 'c'); 382 s.finish(); 383 System.out.println(s.digout()); 384 System.out.println("A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D"); 385 386 387 389 390 System.out.println("Next Test is 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'"); 391 z = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; 392 s.init(); 393 for (int j = 0; j < z.length(); j++) s.update((byte)z.charAt(j)); 394 s.finish(); 395 System.out.println(s.digout()); 396 System.out.println("84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1"); 397 398 400 401 System.out.println("Last test is 1 million 'a' characters."); 402 s.init(); 403 for (int i = 0; i < 1000000; i++) 404 s.update((byte) 'a'); 405 s.finish(); 406 System.out.println(s.digout()); 407 System.out.println("34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F"); 408 } 412 } 414
| Popular Tags
|