Mercurial > projects > ldc
comparison tango/tango/io/digest/Sha0.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
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 } |