com/quadcap/crypto/SHA1Digest.java
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
package com.quadcap.crypto;
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
import java.util.Random;
00070
00071
00072
00073
00074
00075
00076 public final class SHA1Digest implements Digest {
00077 private byte[]
digest = null;
00078 private boolean digestValid =
false;
00079 private int[]
state =
new int[5];
00080 private long count = 0;
00081
00082
00083
00084
00085
00086
00087 private int[]
block =
new int[16];
00088 private int blockIndex;
00089
00090
00091
00092
00093 public SHA1Digest() {
00094
init();
00095 }
00096
00097
00098
00099
00100
00101 public void init() {
00102
00103
state[0] = 0x67452301;
00104
state[1] = 0xEFCDAB89;
00105
state[2] = 0x98BADCFE;
00106
state[3] = 0x10325476;
00107
state[4] = 0xC3D2E1F0;
00108
count = 0;
00109
digest =
new byte[20];
00110
digestValid =
false;
00111
blockIndex = 0;
00112 }
00113
00114
00115
00116
00117
00118
00119 public void update(byte b) {
00120
int mask = (8 * (
blockIndex & 3));
00121
count += 8;
00122
block[
blockIndex >> 2] &= ~(0xff << mask);
00123
block[
blockIndex >> 2] |= (b & 0xff) << mask;
00124
blockIndex++;
00125
if (
blockIndex == 64) {
00126
transform();
00127
blockIndex = 0;
00128 }
00129 }
00130
00131
00132
00133
00134 public void update(byte[] b,
int off,
int len) {
00135
for (
int i = 0; i < len; i++) update(b[off+i]);
00136 }
00137
00138
00139
00140
00141
00142 public void update(byte[] buf) { update(buf, 0, buf.length); }
00143
00144
00145
00146
00147 public byte[]
digest() {
00148 byte[] ret = null;
00149
if (!
digestValid) {
00150
finish();
00151 ret = digest;
00152
init();
00153 }
00154
return ret;
00155 }
00156
00157
00158
00159
00160 private final void finish() {
00161 byte bits[] =
new byte[8];
00162
int i, j;
00163
00164
for (i = 0; i < 8; i++) {
00165 bits[i] = (byte)((
count >>> (((7 - i) * 8))) & 0xff);
00166 }
00167
00168 update((byte) 128);
00169
while (
blockIndex != 56)
00170 update((byte) 0);
00171
00172 update(bits);
00173
for (i = 0; i < 20; i++) {
00174 digest[i] = (byte)
00175 ((
state[i>>2] >> ((3-(i & 3)) * 8) ) & 0xff);
00176 }
00177
digestValid =
true;
00178 }
00179
00180
00181 public String
getAlg() {
return "SHA1"; }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 final int rol(
int value,
int bits) {
00196
int q = (value << bits) | (value >>> (32 - bits));
00197
return q;
00198 }
00199
00200 final int blk0(
int i) {
00201
block[i] = (rol(
block[i],24)&0xFF00FF00) |
00202 (rol(
block[i],8)&0x00FF00FF);
00203
return block[i];
00204 }
00205
00206 final int blk(
int i) {
00207
block[i&15] = rol(
block[(i+13)&15]^
block[(i+8)&15]^
00208
block[(i+2)&15]^
block[i&15], 1);
00209
return (
block[i&15]);
00210 }
00211
00212 final void R0(
int data[],
int v,
int w,
int x ,
int y,
int z,
int i) {
00213 data[z] += ((data[w] & (data[x] ^ data[y] )) ^ data[y]) +
00214 blk0(i) + 0x5A827999 + rol(data[v] ,5);
00215 data[w] = rol(data[w], 30);
00216 }
00217
00218 final void R1(
int data[],
int v,
int w,
int x,
int y,
int z,
int i) {
00219 data[z] += ((data[w] & (data[x] ^ data[y])) ^ data[y]) +
00220 blk(i) + 0x5A827999 + rol(data[v] ,5);
00221 data[w] = rol(data[w], 30);
00222 }
00223
00224 final void R2(
int data[],
int v,
int w,
int x,
int y,
int z,
int i) {
00225 data[z] += (data[w] ^ data[x] ^ data[y]) +
00226 blk(i) + 0x6ED9EBA1 + rol(data[v] ,5);
00227 data[w] = rol(data[w], 30);
00228 }
00229
00230 final void R3(
int data[],
int v,
int w,
int x,
int y,
int z,
int i) {
00231 data[z] += (((data[w] | data[x]) & data[y]) | (data[w] &
00232 data[x])) +
00233 blk(i) + 0x8F1BBCDC + rol(data[v] ,5);
00234 data[w] = rol(data[w], 30);
00235 }
00236
00237 final void R4(
int data[],
int v,
int w,
int x,
int y,
int z,
int i) {
00238 data[z] += (data[w] ^ data[x] ^ data[y]) +
00239 blk(i) + 0xCA62C1D6 + rol(data[v] ,5);
00240 data[w] = rol(data[w], 30);
00241 }
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 int dd[] =
new int[5];
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 void transform() {
00279
00280
dd[0] =
state[0];
00281
dd[1] = state[1];
00282
dd[2] = state[2];
00283
dd[3] = state[3];
00284
dd[4] = state[4];
00285
00286 R0(
dd,0,1,2,3,4, 0); R0(
dd,4,0,1,2,3, 1); R0(
dd,3,4,0,1,2, 2);
00287 R0(
dd,2,3,4,0,1, 3);
00288 R0(
dd,1,2,3,4,0, 4); R0(
dd,0,1,2,3,4, 5); R0(
dd,4,0,1,2,3, 6);
00289 R0(
dd,3,4,0,1,2, 7);
00290 R0(
dd,2,3,4,0,1, 8); R0(
dd,1,2,3,4,0, 9); R0(
dd,0,1,2,3,4,10);
00291 R0(
dd,4,0,1,2,3,11);
00292 R0(
dd,3,4,0,1,2,12); R0(
dd,2,3,4,0,1,13); R0(
dd,1,2,3,4,0,14);
00293 R0(
dd,0,1,2,3,4,15);
00294 R1(
dd,4,0,1,2,3,16); R1(
dd,3,4,0,1,2,17); R1(
dd,2,3,4,0,1,18);
00295 R1(
dd,1,2,3,4,0,19);
00296 R2(
dd,0,1,2,3,4,20); R2(
dd,4,0,1,2,3,21); R2(
dd,3,4,0,1,2,22);
00297 R2(
dd,2,3,4,0,1,23);
00298 R2(
dd,1,2,3,4,0,24); R2(
dd,0,1,2,3,4,25); R2(
dd,4,0,1,2,3,26);
00299 R2(
dd,3,4,0,1,2,27);
00300 R2(
dd,2,3,4,0,1,28); R2(
dd,1,2,3,4,0,29); R2(
dd,0,1,2,3,4,30);
00301 R2(
dd,4,0,1,2,3,31);
00302 R2(
dd,3,4,0,1,2,32); R2(
dd,2,3,4,0,1,33); R2(
dd,1,2,3,4,0,34);
00303 R2(
dd,0,1,2,3,4,35);
00304 R2(
dd,4,0,1,2,3,36); R2(
dd,3,4,0,1,2,37); R2(
dd,2,3,4,0,1,38);
00305 R2(
dd,1,2,3,4,0,39);
00306 R3(
dd,0,1,2,3,4,40); R3(
dd,4,0,1,2,3,41); R3(
dd,3,4,0,1,2,42);
00307 R3(
dd,2,3,4,0,1,43);
00308 R3(
dd,1,2,3,4,0,44); R3(
dd,0,1,2,3,4,45); R3(
dd,4,0,1,2,3,46);
00309 R3(
dd,3,4,0,1,2,47);
00310 R3(
dd,2,3,4,0,1,48); R3(
dd,1,2,3,4,0,49); R3(
dd,0,1,2,3,4,50);
00311 R3(
dd,4,0,1,2,3,51);
00312 R3(
dd,3,4,0,1,2,52); R3(
dd,2,3,4,0,1,53); R3(
dd,1,2,3,4,0,54);
00313 R3(
dd,0,1,2,3,4,55);
00314 R3(
dd,4,0,1,2,3,56); R3(
dd,3,4,0,1,2,57); R3(
dd,2,3,4,0,1,58);
00315 R3(
dd,1,2,3,4,0,59);
00316 R4(
dd,0,1,2,3,4,60); R4(
dd,4,0,1,2,3,61); R4(
dd,3,4,0,1,2,62);
00317 R4(
dd,2,3,4,0,1,63);
00318 R4(
dd,1,2,3,4,0,64); R4(
dd,0,1,2,3,4,65); R4(
dd,4,0,1,2,3,66);
00319 R4(
dd,3,4,0,1,2,67);
00320 R4(
dd,2,3,4,0,1,68); R4(
dd,1,2,3,4,0,69); R4(
dd,0,1,2,3,4,70);
00321 R4(
dd,4,0,1,2,3,71);
00322 R4(
dd,3,4,0,1,2,72); R4(
dd,2,3,4,0,1,73); R4(
dd,1,2,3,4,0,74);
00323 R4(
dd,0,1,2,3,4,75);
00324 R4(
dd,4,0,1,2,3,76); R4(
dd,3,4,0,1,2,77); R4(
dd,2,3,4,0,1,78);
00325 R4(
dd,1,2,3,4,0,79);
00326
00327 state[0] +=
dd[0];
00328 state[1] += dd[1];
00329 state[2] += dd[2];
00330 state[3] += dd[3];
00331 state[4] += dd[4];
00332 }
00333
00334
00335
00336
00337
00338
00339 private String
digout() {
00340 StringBuffer sb =
new StringBuffer();
00341
for (
int i = 0; i < 20; i++) {
00342
char c1, c2;
00343
00344 c1 = (
char) ((digest[i] >>> 4) & 0xf);
00345 c2 = (
char) (digest[i] & 0xf);
00346 c1 = (
char) ((c1 > 9) ?
'A' + (c1 - 10) :
'0' + c1);
00347 c2 = (
char) ((c2 > 9) ?
'A' + (c2 - 10) :
'0' + c2);
00348 sb.append(c1);
00349 sb.append(c2);
00350
if (((i+1) % 4) == 0)
00351 sb.append(
' ');
00352 }
00353
return sb.toString();
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367 public static void main(String args[]) {
00368
SHA1Digest s =
new SHA1Digest();
00369
00370 System.out.println(
"SHA-1 Test PROGRAM.");
00371 System.out.println(
"This code runs the test vectors through the code.");
00372
00373
00374
00375
00376 System.out.println(
"First test is 'abc'");
00377 String z =
"abc";
00378 s.
init();
00379 s.
update((byte)
'a');
00380 s.
update((byte)
'b');
00381 s.
update((byte)
'c');
00382 s.
finish();
00383 System.out.println(s.
digout());
00384 System.out.println(
"A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D");
00385
00386
00387
00388
00389
00390 System.out.println(
"Next Test is 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'");
00391 z =
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
00392 s.
init();
00393
for (
int j = 0; j < z.length(); j++) s.
update((byte)z.charAt(j));
00394 s.
finish();
00395 System.out.println(s.
digout());
00396 System.out.println(
"84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1");
00397
00398
00399
00400
00401 System.out.println(
"Last test is 1 million 'a' characters.");
00402 s.
init();
00403
for (
int i = 0; i < 1000000; i++)
00404 s.
update((byte)
'a');
00405 s.
finish();
00406 System.out.println(s.
digout());
00407 System.out.println(
"34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F");
00408
00409
00410
00411 }
00412
00413 }