| 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 |
} |
|---|