123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
|
/*******************************************************************************
copyright: Copyright (c) 2006 Tango. All rights reserved
license: BSD style: see doc/license.txt for details
version: Initial release: Feb 2006
author: Regan Heath, Oskar Linde
This module implements the SHA-0 Algorithm described by Secure
Hash Standard, FIPS PUB 180
*******************************************************************************/
module tango.util.digest.Sha0;
private import tango.util.digest.Sha01;
public import tango.util.digest.Digest;
/*******************************************************************************
*******************************************************************************/
final class Sha0 : Sha01
{
/***********************************************************************
Construct an Sha0
***********************************************************************/
this() { }
/***********************************************************************
***********************************************************************/
final protected override void transform(const(ubyte[]) input)
{
uint A,B,C,D,E,TEMP;
uint[16] W;
uint s;
bigEndian32(input,W);
A = context[0];
B = context[1];
C = context[2];
D = context[3];
E = context[4];
for(uint t = 0; t < 80; t++) {
s = t & mask;
if (t >= 16) expand(W,s);
TEMP = rotateLeft(A,5) + f(t,B,C,D) + E + W[s] + K[t/20];
E = D; D = C; C = rotateLeft(B,30); B = A; A = TEMP;
}
context[0] += A;
context[1] += B;
context[2] += C;
context[3] += D;
context[4] += E;
}
/***********************************************************************
***********************************************************************/
final static protected void expand(uint W[], uint s)
{
W[s] = W[(s+13)&mask] ^ W[(s+8)&mask] ^ W[(s+2)&mask] ^ W[s];
}
}
/*******************************************************************************
*******************************************************************************/
debug(UnitTest)
{
unittest
{
enum immutable(char)[][] strings =
[
"",
"abc",
"message digest",
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
"12345678901234567890123456789012345678901234567890123456789012345678901234567890"
];
enum immutable(char)[][] results =
[
"f96cea198ad1dd5617ac084a3d92c6107708c0ef",
"0164b8a914cd2a5e74c4f7ff082c4d97f1edf880",
"c1b0f222d150ebb9aa36a40cafdc8bcbed830b14",
"b40ce07a430cfd3c033039b9fe9afec95dc1bdcd",
"79e966f7a3a990df33e40e3d7f8f18d2caebadfa",
"4aa29d14d171522ece47bee8957e35a41f3e9cff",
];
Sha0 h = new Sha0();
foreach (int i, immutable(char)[] s; strings)
{
h.update(s);
char[] d = h.hexDigest();
assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")");
}
}
}
|