0
|
1 /**
|
|
2 * This file is part of the dcrypt project.
|
|
3 *
|
|
4 * Copyright: Copyright (C) dcrypt contributors 2008. All rights reserved.
|
|
5 * License: MIT
|
|
6 * Authors: Thomas Dixon
|
|
7 */
|
|
8
|
|
9 module dcrypt.crypto.hashes.SHA224;
|
|
10
|
|
11 import dcrypt.crypto.hashes.SHA256;
|
|
12
|
|
13 /** Implementation of SHA-224. */
|
|
14 class SHA224 : SHA256 {
|
|
15 this (void[] input_=null) {
|
|
16 reset();
|
|
17 super(input_);
|
|
18 }
|
|
19
|
|
20 uint digestSize() {
|
|
21 return 28;
|
|
22 }
|
|
23
|
|
24 char[] name() {
|
|
25 return "SHA224";
|
|
26 }
|
|
27
|
|
28 ubyte[] digest() {
|
|
29 padMessage(MODE_SHA);
|
|
30
|
|
31 ubyte[] result = new ubyte[digestSize];
|
|
32
|
|
33 Util.uintToUbytesBig(h0, result, 0);
|
|
34 Util.uintToUbytesBig(h1, result, 4);
|
|
35 Util.uintToUbytesBig(h2, result, 8);
|
|
36 Util.uintToUbytesBig(h3, result, 12);
|
|
37 Util.uintToUbytesBig(h4, result, 16);
|
|
38 Util.uintToUbytesBig(h5, result, 20);
|
|
39 Util.uintToUbytesBig(h6, result, 24);
|
|
40
|
|
41 reset();
|
|
42 return result;
|
|
43 }
|
|
44
|
|
45 void reset() {
|
|
46 super.reset();
|
|
47 h0 = 0xc1059ed8u;
|
|
48 h1 = 0x367cd507u;
|
|
49 h2 = 0x3070dd17u;
|
|
50 h3 = 0xf70e5939u;
|
|
51 h4 = 0xffc00b31u;
|
|
52 h5 = 0x68581511u;
|
|
53 h6 = 0x64f98fa7u;
|
|
54 h7 = 0xbefa4fa4u;
|
|
55 }
|
|
56
|
|
57 version (UnitTest) {
|
|
58 unittest {
|
|
59 static const char[][] test_inputs = [
|
|
60 "",
|
|
61 "abc",
|
|
62 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
|
|
63 "a"
|
|
64 ];
|
|
65
|
|
66 static const int[] test_repeat = [
|
|
67 1, 1, 1, 1000000
|
|
68 ];
|
|
69
|
|
70 static const char[][] test_results = [
|
|
71 "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
|
|
72 "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7",
|
|
73 "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525",
|
|
74 "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67"
|
|
75 ];
|
|
76
|
|
77 SHA224 h = new SHA224();
|
|
78 foreach (uint i, char[] input; test_inputs) {
|
|
79 for (int j = 0; j < test_repeat[i]; j++)
|
|
80 h.update(input);
|
|
81 char[] digest = h.hexDigest();
|
|
82 assert(digest == test_results[i],
|
|
83 h.name()~": ("~digest~") != ("~test_results[i]~")");
|
|
84 }
|
|
85 }
|
|
86 }
|
|
87 }
|