Mercurial > projects > dcrypt
annotate dcrypt/crypto/hashes/MD5.d @ 28:ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
author | Thomas Dixon <reikon@reikon.us> |
---|---|
date | Sun, 10 May 2009 22:38:48 -0400 |
parents | 8b5eaf3c2979 |
children |
rev | line source |
---|---|
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.MD5; | |
10 | |
11 public import dcrypt.crypto.Hash; | |
12 | |
6
5cb17e09d685
Minor edits to the unittests of hash functions and ciphers. Added AES and test vectors.
Thomas Dixon <reikon@reikon.us>
parents:
3
diff
changeset
|
13 /** |
5cb17e09d685
Minor edits to the unittests of hash functions and ciphers. Added AES and test vectors.
Thomas Dixon <reikon@reikon.us>
parents:
3
diff
changeset
|
14 * Implementation of Ron Rivest's MD5. |
5cb17e09d685
Minor edits to the unittests of hash functions and ciphers. Added AES and test vectors.
Thomas Dixon <reikon@reikon.us>
parents:
3
diff
changeset
|
15 * |
5cb17e09d685
Minor edits to the unittests of hash functions and ciphers. Added AES and test vectors.
Thomas Dixon <reikon@reikon.us>
parents:
3
diff
changeset
|
16 * Conforms: RFC 1321 |
5cb17e09d685
Minor edits to the unittests of hash functions and ciphers. Added AES and test vectors.
Thomas Dixon <reikon@reikon.us>
parents:
3
diff
changeset
|
17 * References: http://www.faqs.org/rfcs/rfc1321.html |
5cb17e09d685
Minor edits to the unittests of hash functions and ciphers. Added AES and test vectors.
Thomas Dixon <reikon@reikon.us>
parents:
3
diff
changeset
|
18 * Bugs: MD5 is not cryptographically secure. |
5cb17e09d685
Minor edits to the unittests of hash functions and ciphers. Added AES and test vectors.
Thomas Dixon <reikon@reikon.us>
parents:
3
diff
changeset
|
19 */ |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
20 class MD5 : Hash |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
21 { |
28
ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
Thomas Dixon <reikon@reikon.us>
parents:
27
diff
changeset
|
22 private uint h0, h1, h2, h3; |
0 | 23 |
24 // Shift amounts | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
25 private enum |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
26 { |
0 | 27 S11 = 7, |
28 S12 = 12, | |
29 S13 = 17, | |
30 S14 = 22, | |
31 | |
32 S21 = 5, | |
33 S22 = 9, | |
34 S23 = 14, | |
35 S24 = 20, | |
36 | |
37 S31 = 4, | |
38 S32 = 11, | |
39 S33 = 16, | |
40 S34 = 23, | |
41 | |
42 S41 = 6, | |
43 S42 = 10, | |
44 S43 = 15, | |
45 S44 = 21 | |
46 }; | |
47 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
48 this (void[] input_=null) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
49 { |
0 | 50 reset(); |
51 super(input_); | |
52 } | |
53 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
54 uint blockSize() |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
55 { |
0 | 56 return 64; |
57 } | |
58 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
59 uint digestSize() |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
60 { |
0 | 61 return 16; |
62 } | |
63 | |
28
ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
Thomas Dixon <reikon@reikon.us>
parents:
27
diff
changeset
|
64 string name() |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
65 { |
0 | 66 return "MD5"; |
67 } | |
68 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
69 void transform(ubyte[] input) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
70 { |
0 | 71 uint[] w = new uint[16]; |
72 | |
23
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
73 for (int i = 0, j = 0; i < 16; i++,j+=int.sizeof) |
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
74 w[i] = ByteConverter.LittleEndian.to!(uint)(input[j..j+int.sizeof]); |
0 | 75 |
76 uint a = h0, | |
77 b = h1, | |
78 c = h2, | |
79 d = h3; | |
80 | |
81 // Round 1 -- FIGHT! | |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
82 ff(a, b, c, d, w[ 0], S11, 0xd76aa478u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
83 ff(d, a, b, c, w[ 1], S12, 0xe8c7b756u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
84 ff(c, d, a, b, w[ 2], S13, 0x242070dbu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
85 ff(b, c, d, a, w[ 3], S14, 0xc1bdceeeu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
86 ff(a, b, c, d, w[ 4], S11, 0xf57c0fafu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
87 ff(d, a, b, c, w[ 5], S12, 0x4787c62au); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
88 ff(c, d, a, b, w[ 6], S13, 0xa8304613u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
89 ff(b, c, d, a, w[ 7], S14, 0xfd469501u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
90 ff(a, b, c, d, w[ 8], S11, 0x698098d8u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
91 ff(d, a, b, c, w[ 9], S12, 0x8b44f7afu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
92 ff(c, d, a, b, w[10], S13, 0xffff5bb1u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
93 ff(b, c, d, a, w[11], S14, 0x895cd7beu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
94 ff(a, b, c, d, w[12], S11, 0x6b901122u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
95 ff(d, a, b, c, w[13], S12, 0xfd987193u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
96 ff(c, d, a, b, w[14], S13, 0xa679438eu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
97 ff(b, c, d, a, w[15], S14, 0x49b40821u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
98 |
0 | 99 // Round 2 |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
100 gg(a, b, c, d, w[ 1], S21, 0xf61e2562u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
101 gg(d, a, b, c, w[ 6], S22, 0xc040b340u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
102 gg(c, d, a, b, w[11], S23, 0x265e5a51u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
103 gg(b, c, d, a, w[ 0], S24, 0xe9b6c7aau); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
104 gg(a, b, c, d, w[ 5], S21, 0xd62f105du); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
105 gg(d, a, b, c, w[10], S22, 0x02441453u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
106 gg(c, d, a, b, w[15], S23, 0xd8a1e681u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
107 gg(b, c, d, a, w[ 4], S24, 0xe7d3fbc8u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
108 gg(a, b, c, d, w[ 9], S21, 0x21e1cde6u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
109 gg(d, a, b, c, w[14], S22, 0xc33707d6u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
110 gg(c, d, a, b, w[ 3], S23, 0xf4d50d87u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
111 gg(b, c, d, a, w[ 8], S24, 0x455a14edu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
112 gg(a, b, c, d, w[13], S21, 0xa9e3e905u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
113 gg(d, a, b, c, w[ 2], S22, 0xfcefa3f8u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
114 gg(c, d, a, b, w[ 7], S23, 0x676f02d9u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
115 gg(b, c, d, a, w[12], S24, 0x8d2a4c8au); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
116 |
0 | 117 // Round 3 |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
118 hh(a, b, c, d, w[ 5], S31, 0xfffa3942u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
119 hh(d, a, b, c, w[ 8], S32, 0x8771f681u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
120 hh(c, d, a, b, w[11], S33, 0x6d9d6122u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
121 hh(b, c, d, a, w[14], S34, 0xfde5380cu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
122 hh(a, b, c, d, w[ 1], S31, 0xa4beea44u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
123 hh(d, a, b, c, w[ 4], S32, 0x4bdecfa9u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
124 hh(c, d, a, b, w[ 7], S33, 0xf6bb4b60u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
125 hh(b, c, d, a, w[10], S34, 0xbebfbc70u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
126 hh(a, b, c, d, w[13], S31, 0x289b7ec6u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
127 hh(d, a, b, c, w[ 0], S32, 0xeaa127fau); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
128 hh(c, d, a, b, w[ 3], S33, 0xd4ef3085u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
129 hh(b, c, d, a, w[ 6], S34, 0x04881d05u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
130 hh(a, b, c, d, w[ 9], S31, 0xd9d4d039u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
131 hh(d, a, b, c, w[12], S32, 0xe6db99e5u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
132 hh(c, d, a, b, w[15], S33, 0x1fa27cf8u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
133 hh(b, c, d, a, w[ 2], S34, 0xc4ac5665u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
134 |
0 | 135 // Round 4 |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
136 ii(a, b, c, d, w[ 0], S41, 0xf4292244u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
137 ii(d, a, b, c, w[ 7], S42, 0x432aff97u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
138 ii(c, d, a, b, w[14], S43, 0xab9423a7u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
139 ii(b, c, d, a, w[ 5], S44, 0xfc93a039u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
140 ii(a, b, c, d, w[12], S41, 0x655b59c3u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
141 ii(d, a, b, c, w[ 3], S42, 0x8f0ccc92u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
142 ii(c, d, a, b, w[10], S43, 0xffeff47du); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
143 ii(b, c, d, a, w[ 1], S44, 0x85845dd1u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
144 ii(a, b, c, d, w[ 8], S41, 0x6fa87e4fu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
145 ii(d, a, b, c, w[15], S42, 0xfe2ce6e0u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
146 ii(c, d, a, b, w[ 6], S43, 0xa3014314u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
147 ii(b, c, d, a, w[13], S44, 0x4e0811a1u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
148 ii(a, b, c, d, w[ 4], S41, 0xf7537e82u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
149 ii(d, a, b, c, w[11], S42, 0xbd3af235u); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
150 ii(c, d, a, b, w[ 2], S43, 0x2ad7d2bbu); |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
151 ii(b, c, d, a, w[ 9], S44, 0xeb86d391u); |
0 | 152 |
153 // FINISH HIM! | |
154 h0 += a; | |
155 h1 += b; | |
156 h2 += c; | |
157 h3 += d; | |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
158 // FATALITY! \o/ |
0 | 159 } |
160 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
161 private uint f(uint x, uint y, uint z) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
162 { |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
163 return (x&y)|(~x&z); |
0 | 164 } |
165 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
166 private uint h(uint x, uint y, uint z) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
167 { |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
168 return x^y^z; |
0 | 169 } |
170 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
171 private uint g(uint x, uint y, uint z) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
172 { |
0 | 173 return (x&z)|(y&~z); |
174 } | |
175 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
176 private uint i(uint x, uint y, uint z) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
177 { |
0 | 178 return y^(x|~z); |
179 } | |
180 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
181 private void ff(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
182 { |
0 | 183 a += f(b, c, d) + x + ac; |
23
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
184 a = Bitwise.rotateLeft(a, s); |
0 | 185 a += b; |
186 } | |
187 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
188 private void gg(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
189 { |
0 | 190 a += g(b, c, d) + x + ac; |
23
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
191 a = Bitwise.rotateLeft(a, s); |
0 | 192 a += b; |
193 } | |
194 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
195 private void hh(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
196 { |
0 | 197 a += h(b, c, d) + x + ac; |
23
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
198 a = Bitwise.rotateLeft(a, s); |
0 | 199 a += b; |
200 } | |
201 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
202 private void ii(ref uint a, uint b, uint c, uint d, uint x, uint s, uint ac) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
203 { |
0 | 204 a += i(b, c, d) + x + ac; |
23
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
205 a = Bitwise.rotateLeft(a, s); |
0 | 206 a += b; |
207 } | |
208 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
209 ubyte[] digest() |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
210 { |
28
ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
Thomas Dixon <reikon@reikon.us>
parents:
27
diff
changeset
|
211 padMessage(MODE_MD); |
0 | 212 ubyte[] result = new ubyte[digestSize]; |
213 | |
23
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
214 result[0..4] = ByteConverter.LittleEndian.from!(uint)(h0); |
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
215 result[4..8] = ByteConverter.LittleEndian.from!(uint)(h1); |
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
216 result[8..12] = ByteConverter.LittleEndian.from!(uint)(h2); |
4589f8c5eb3c
Replaced dcrypt.crypto.Util with dcrypt.misc.Bitwise and dcrypt.misc.ByteConverter. Altered all dependent files to reflect changes.
Thomas Dixon <reikon@reikon.us>
parents:
10
diff
changeset
|
217 result[12..16] = ByteConverter.LittleEndian.from!(uint)(h3); |
0 | 218 |
219 reset(); | |
220 return result; | |
221 } | |
222 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
223 void reset() |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
224 { |
0 | 225 super.reset(); |
26
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
226 h0 = 0x67452301u; |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
227 h1 = 0xefcdab89u; |
176c933827a8
Implemented MD4. Refactored MD5. Replaced all instances of 'version (UnitTest)' with 'debug (UnitTest)'.
Thomas Dixon <reikon@reikon.us>
parents:
23
diff
changeset
|
228 h2 = 0x98badcfeu; |
0 | 229 h3 = 0x10325476u; |
230 } | |
231 | |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
232 MD5 copy() |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
233 { |
2
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
234 MD5 h = new MD5(buffer[0..index]); |
3
a5789a7b3b3b
Fixed error in hash copy() functions where I forgot to copy the length of the message. Now, twice as jank! =)
Thomas Dixon <reikon@reikon.us>
parents:
2
diff
changeset
|
235 h.bytes = bytes; |
2
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
236 h.h0 = h0; |
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
237 h.h1 = h1; |
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
238 h.h2 = h2; |
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
239 h.h3 = h3; |
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
240 return h; |
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
241 } |
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
242 |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
243 debug (UnitTest) |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
244 { |
0 | 245 // Found in Tango <3 |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
246 unittest |
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
247 { |
28
ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
Thomas Dixon <reikon@reikon.us>
parents:
27
diff
changeset
|
248 static string[] test_inputs = [ |
0 | 249 "", |
250 "a", | |
251 "abc", | |
252 "message digest", | |
253 "abcdefghijklmnopqrstuvwxyz", | |
254 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", | |
255 "12345678901234567890123456789012345678901234567890123456789012345678901234567890" | |
256 ]; | |
257 | |
28
ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
Thomas Dixon <reikon@reikon.us>
parents:
27
diff
changeset
|
258 static string[] test_results = [ |
0 | 259 "d41d8cd98f00b204e9800998ecf8427e", |
260 "0cc175b9c0f1b6a831c399e269772661", | |
261 "900150983cd24fb0d6963f7d28e17f72", | |
262 "f96b697d7cb7938d525a2f31aaf161d0", | |
263 "c3fcd3d76192e4007dfb496cca67e13b", | |
264 "d174ab98d277d9f5a5611c2c9f419d9f", | |
265 "57edf4a22be3c955ac49da2e2107b67a" | |
266 ]; | |
267 | |
268 MD5 h = new MD5(); | |
28
ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
Thomas Dixon <reikon@reikon.us>
parents:
27
diff
changeset
|
269 foreach (uint i, string input; test_inputs) |
27
8b5eaf3c2979
Fixed error in hash message padding reported by Glenn Haecker.
Thomas Dixon <reikon@reikon.us>
parents:
26
diff
changeset
|
270 { |
0 | 271 h.update(input); |
28
ad687db713a4
Further reworked the code for hash padding. Replaced all instances of 'char[]' with 'string' and removed a few 'const' modifiers as per Glenn Haecker's patch for D2 compatibility. Updated CONTRIBUTORS file.
Thomas Dixon <reikon@reikon.us>
parents:
27
diff
changeset
|
272 string digest = h.hexDigest(); |
0 | 273 assert(digest == test_results[i], |
2
71aae178f89a
Added copy() to hash functions. Modified some code style.
Thomas Dixon <reikon@reikon.us>
parents:
0
diff
changeset
|
274 h.name~": ("~digest~") != ("~test_results[i]~")"); |
0 | 275 } |
276 } | |
277 } | |
278 } |