Download Reference Manual
The Developer's Library for D
About Wiki Forums Source Search Contact

root/trunk/tango/io/digest/Sha0.d

Revision 2809, 3.6 kB (checked in by kris, 1 year ago)

updated svn properties

  • Property svn:mime-type set to text/x-dsrc
  • Property svn:eol-style set to native
Line 
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 }
Note: See TracBrowser for help on using the browser.