Mercurial > projects > ldc
comparison tango/tango/io/digest/Sha1.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-1 Algorithm described by Secure Hash | |
12 Standard, FIPS PUB 180-1, and RFC 3174 US Secure Hash Algorithm 1 | |
13 (SHA1). D. Eastlake 3rd, P. Jones. September 2001. | |
14 | |
15 *******************************************************************************/ | |
16 | |
17 module tango.io.digest.Sha1; | |
18 | |
19 private import tango.io.digest.Sha01; | |
20 | |
21 public import tango.io.digest.Digest; | |
22 | |
23 /******************************************************************************* | |
24 | |
25 *******************************************************************************/ | |
26 | |
27 final class Sha1 : Sha01 | |
28 { | |
29 /*********************************************************************** | |
30 | |
31 Construct a Sha1 hash algorithm context | |
32 | |
33 ***********************************************************************/ | |
34 | |
35 this() { } | |
36 | |
37 /*********************************************************************** | |
38 | |
39 Performs the cipher on a block of data | |
40 | |
41 Params: | |
42 data = the block of data to cipher | |
43 | |
44 Remarks: | |
45 The actual cipher algorithm is carried out by this method on | |
46 the passed block of data. This method is called for every | |
47 blockSize() bytes of input data and once more with the remaining | |
48 data padded to blockSize(). | |
49 | |
50 ***********************************************************************/ | |
51 | |
52 final protected override void transform(ubyte[] input) | |
53 { | |
54 uint A,B,C,D,E,TEMP; | |
55 uint[16] W; | |
56 uint s; | |
57 | |
58 bigEndian32(input,W); | |
59 A = context[0]; | |
60 B = context[1]; | |
61 C = context[2]; | |
62 D = context[3]; | |
63 E = context[4]; | |
64 | |
65 for(uint t = 0; t < 80; t++) { | |
66 s = t & mask; | |
67 if (t >= 16) | |
68 expand(W,s); | |
69 TEMP = rotateLeft(A,5) + f(t,B,C,D) + E + W[s] + K[t/20]; | |
70 E = D; D = C; C = rotateLeft(B,30); B = A; A = TEMP; | |
71 } | |
72 | |
73 context[0] += A; | |
74 context[1] += B; | |
75 context[2] += C; | |
76 context[3] += D; | |
77 context[4] += E; | |
78 } | |
79 | |
80 /*********************************************************************** | |
81 | |
82 ***********************************************************************/ | |
83 | |
84 final static void expand (uint[] W, uint s) | |
85 { | |
86 W[s] = rotateLeft(W[(s+13)&mask] ^ W[(s+8)&mask] ^ W[(s+2)&mask] ^ W[s],1); | |
87 } | |
88 | |
89 } | |
90 | |
91 | |
92 /******************************************************************************* | |
93 | |
94 *******************************************************************************/ | |
95 | |
96 version (UnitTest) | |
97 { | |
98 unittest | |
99 { | |
100 static char[][] strings = | |
101 [ | |
102 "abc", | |
103 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", | |
104 "a", | |
105 "0123456701234567012345670123456701234567012345670123456701234567" | |
106 ]; | |
107 | |
108 static char[][] results = | |
109 [ | |
110 "a9993e364706816aba3e25717850c26c9cd0d89d", | |
111 "84983e441c3bd26ebaae4aa1f95129e5e54670f1", | |
112 "34aa973cd4c4daa4f61eeb2bdbad27316534016f", | |
113 "dea356a2cddd90c7a7ecedc5ebb563934f460452" | |
114 ]; | |
115 | |
116 static int[] repeat = | |
117 [ | |
118 1, | |
119 1, | |
120 1000000, | |
121 10 | |
122 ]; | |
123 | |
124 Sha1 h = new Sha1(); | |
125 | |
126 foreach (int i, char[] s; strings) | |
127 { | |
128 for(int r = 0; r < repeat[i]; r++) | |
129 h.update(s); | |
130 | |
131 char[] d = h.hexDigest(); | |
132 assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")"); | |
133 } | |
134 } | |
135 } |