132
|
1 /*******************************************************************************
|
|
2
|
|
3 copyright: Copyright (c) 2006 Tango. All rights reserved
|
|
4
|
|
5 license: BSD style: see doc/license.txt for details
|
|
6
|
|
7 version: Initial release: Feb 2006
|
|
8
|
|
9 author: Regan Heath, Oskar Linde
|
|
10
|
|
11 This module implements the SHA-0 Algorithm described by Secure
|
|
12 Hash Standard, FIPS PUB 180
|
|
13
|
|
14 *******************************************************************************/
|
|
15
|
|
16 module tango.io.digest.Sha0;
|
|
17
|
|
18 private import tango.io.digest.Sha01;
|
|
19
|
|
20 public import tango.io.digest.Digest;
|
|
21
|
|
22 /*******************************************************************************
|
|
23
|
|
24 *******************************************************************************/
|
|
25
|
|
26 final class Sha0 : Sha01
|
|
27 {
|
|
28 /***********************************************************************
|
|
29
|
|
30 Construct an Sha0
|
|
31
|
|
32 ***********************************************************************/
|
|
33
|
|
34 this() { }
|
|
35
|
|
36 /***********************************************************************
|
|
37
|
|
38 ***********************************************************************/
|
|
39
|
|
40 final protected override void transform(ubyte[] input)
|
|
41 {
|
|
42 uint A,B,C,D,E,TEMP;
|
|
43 uint[16] W;
|
|
44 uint s;
|
|
45
|
|
46 bigEndian32(input,W);
|
|
47
|
|
48 A = context[0];
|
|
49 B = context[1];
|
|
50 C = context[2];
|
|
51 D = context[3];
|
|
52 E = context[4];
|
|
53
|
|
54 for(uint t = 0; t < 80; t++) {
|
|
55 s = t & mask;
|
|
56 if (t >= 16) expand(W,s);
|
|
57 TEMP = rotateLeft(A,5) + f(t,B,C,D) + E + W[s] + K[t/20];
|
|
58 E = D; D = C; C = rotateLeft(B,30); B = A; A = TEMP;
|
|
59 }
|
|
60
|
|
61 context[0] += A;
|
|
62 context[1] += B;
|
|
63 context[2] += C;
|
|
64 context[3] += D;
|
|
65 context[4] += E;
|
|
66 }
|
|
67
|
|
68 /***********************************************************************
|
|
69
|
|
70 ***********************************************************************/
|
|
71
|
|
72 final static protected void expand(uint W[], uint s)
|
|
73 {
|
|
74 W[s] = W[(s+13)&mask] ^ W[(s+8)&mask] ^ W[(s+2)&mask] ^ W[s];
|
|
75 }
|
|
76
|
|
77
|
|
78 }
|
|
79
|
|
80
|
|
81 /*******************************************************************************
|
|
82
|
|
83 *******************************************************************************/
|
|
84
|
|
85 version (UnitTest)
|
|
86 {
|
|
87 unittest
|
|
88 {
|
|
89 static char[][] strings =
|
|
90 [
|
|
91 "",
|
|
92 "abc",
|
|
93 "message digest",
|
|
94 "abcdefghijklmnopqrstuvwxyz",
|
|
95 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
|
|
96 "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
|
|
97 ];
|
|
98
|
|
99 static char[][] results =
|
|
100 [
|
|
101 "f96cea198ad1dd5617ac084a3d92c6107708c0ef",
|
|
102 "0164b8a914cd2a5e74c4f7ff082c4d97f1edf880",
|
|
103 "c1b0f222d150ebb9aa36a40cafdc8bcbed830b14",
|
|
104 "b40ce07a430cfd3c033039b9fe9afec95dc1bdcd",
|
|
105 "79e966f7a3a990df33e40e3d7f8f18d2caebadfa",
|
|
106 "4aa29d14d171522ece47bee8957e35a41f3e9cff",
|
|
107 ];
|
|
108
|
|
109 Sha0 h = new Sha0();
|
|
110
|
|
111 foreach (int i, char[] s; strings)
|
|
112 {
|
|
113 h.update(s);
|
|
114 char[] d = h.hexDigest();
|
|
115 assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")");
|
|
116 }
|
|
117 }
|
|
118 }
|