~ubuntu-branches/ubuntu/trusty/rhash/trusty

« back to all changes in this revision

Viewing changes to librhash/test_sums.c

  • Committer: Bazaar Package Importer
  • Author(s): Alexey S Kravchenko
  • Date: 2011-06-15 01:03:34 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20110615010334-ochayini7ut2djvs
Tags: 1.2.6-1
* New upstream release version 1.2.6
 - ABI changed - now librhash0.0 is librhash0
 - OpenSSL support for faster hash calculation if libssl is installed
   (fully optional) for both rhash and librhash0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* test_sums.c - unit tests and benchmark for LibRHash algorithms
2
 
 * written by Alexei Kravchenko.
3
 
 *
4
 
 * Copyleft:
5
 
 * I, the author, hereby release this code into the public domain.
6
 
 * This applies worldwide. I grant any entity the right to use this work for
7
 
 * ANY PURPOSE, without any conditions, unless such conditions are required
8
 
 * by law.
 
2
 *
 
3
 * Copyright: 2008 Alexey Kravchenko <rhash.admin@gmail.com>
 
4
 *
 
5
 * Permission is hereby granted,  free of charge,  to any person  obtaining a
 
6
 * copy of this software and associated documentation files (the "Software"),
 
7
 * to deal in the Software without restriction,  including without limitation
 
8
 * the rights to  use, copy, modify,  merge, publish, distribute, sublicense,
 
9
 * and/or sell copies  of  the Software,  and to permit  persons  to whom the
 
10
 * Software is furnished to do so.
9
11
 */
10
12
 
11
13
#include <unistd.h>
 
14
#include <stdio.h>
 
15
#include <stdarg.h>
12
16
#include <string.h>
13
 
#include <stdio.h>
14
17
#include <assert.h>
15
18
#include <ctype.h>
 
19
 
16
20
#include "byte_order.h"
17
21
#include "timing.h"
18
22
 
26
30
 *                         Data for tests                                *
27
31
 *=======================================================================*/
28
32
const char* crc32_tests[] = { /* verified with cksfv */
29
 
  "", "00000000",
30
 
  "a", "E8B7BE43",
31
 
  "abc", "352441C2",
32
 
  "message digest", "20159D7F",
33
 
  "abcdefghijklmnopqrstuvwxyz", "4C2750BD",
34
 
  "The quick brown fox jumps over the lazy dog", "414FA339",
35
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "1FC2E6D2",
36
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "7CA94A72",
37
 
  0
 
33
        "", "00000000",
 
34
        "a", "E8B7BE43",
 
35
        "abc", "352441C2",
 
36
        "message digest", "20159D7F",
 
37
        "abcdefghijklmnopqrstuvwxyz", "4C2750BD",
 
38
        "The quick brown fox jumps over the lazy dog", "414FA339",
 
39
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "1FC2E6D2",
 
40
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "7CA94A72",
 
41
        0
38
42
};
39
43
 
40
44
const char* md4_tests[] = {
41
 
  "", "31D6CFE0D16AE931B73C59D7E0C089C0",
42
 
  "a", "BDE52CB31DE33E46245E05FBDBD6FB24",
43
 
  "abc", "A448017AAF21D8525FC10AE87AA6729D",
44
 
  "message digest", "D9130A8164549FE818874806E1C7014B",
45
 
  "abcdefghijklmnopqrstuvwxyz", "D79E1C308AA5BBCDEEA8ED63DF412DA9",
46
 
  "The quick brown fox jumps over the lazy dog", "1BEE69A46BA811185C194762ABAEAE90",
47
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "043F8582F241DB351CE627E153E7F0E4",
48
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "E33B4DDC9C38F2199C3E7B164FCC0536",
49
 
  0
 
45
        "", "31D6CFE0D16AE931B73C59D7E0C089C0",
 
46
        "a", "BDE52CB31DE33E46245E05FBDBD6FB24",
 
47
        "abc", "A448017AAF21D8525FC10AE87AA6729D",
 
48
        "message digest", "D9130A8164549FE818874806E1C7014B",
 
49
        "abcdefghijklmnopqrstuvwxyz", "D79E1C308AA5BBCDEEA8ED63DF412DA9",
 
50
        "The quick brown fox jumps over the lazy dog", "1BEE69A46BA811185C194762ABAEAE90",
 
51
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "043F8582F241DB351CE627E153E7F0E4",
 
52
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "E33B4DDC9C38F2199C3E7B164FCC0536",
 
53
        0
50
54
};
51
55
 
52
 
/* for short strings ed2k hashes are equal to md4 */
 
56
/* for short messages ed2k hash values are equal to md4 */
53
57
#define ed2k_tests md4_tests
54
58
 
55
59
/* test vectors from spec */
56
60
const char* md5_tests[] = {
57
 
  "", "D41D8CD98F00B204E9800998ECF8427E",
58
 
  "a", "0CC175B9C0F1B6A831C399E269772661",
59
 
  "abc", "900150983CD24FB0D6963F7D28E17F72",
60
 
  "message digest", "F96B697D7CB7938D525A2F31AAF161D0",
61
 
  "abcdefghijklmnopqrstuvwxyz", "C3FCD3D76192E4007DFB496CCA67E13B",
62
 
  "The quick brown fox jumps over the lazy dog", "9E107D9D372BB6826BD81D3542A419D6",
63
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "D174AB98D277D9F5A5611C2C9F419D9F",
64
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "57EDF4A22BE3C955AC49DA2E2107B67A",
65
 
  0
 
61
        "", "D41D8CD98F00B204E9800998ECF8427E",
 
62
        "a", "0CC175B9C0F1B6A831C399E269772661",
 
63
        "abc", "900150983CD24FB0D6963F7D28E17F72",
 
64
        "message digest", "F96B697D7CB7938D525A2F31AAF161D0",
 
65
        "abcdefghijklmnopqrstuvwxyz", "C3FCD3D76192E4007DFB496CCA67E13B",
 
66
        "The quick brown fox jumps over the lazy dog", "9E107D9D372BB6826BD81D3542A419D6",
 
67
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "D174AB98D277D9F5A5611C2C9F419D9F",
 
68
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "57EDF4A22BE3C955AC49DA2E2107B67A",
 
69
        0
66
70
};
67
71
 
68
72
/* test vectors from spec */
69
73
const char* sha1_tests[] = {
70
 
  "", "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709",
71
 
  "a", "86F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8",
72
 
  "abc", "A9993E364706816ABA3E25717850C26C9CD0D89D",
73
 
  "message digest", "C12252CEDA8BE8994D5FA0290A47231C1D16AAE3",
74
 
  "The quick brown fox jumps over the lazy dog", "2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12",
75
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "761C457BF73B14D27E9E9265C46F4B4DDA11F940",
76
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "50ABF5706A150990A08B2C5EA40FA0E585554732",
77
 
  0
 
74
        "", "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709",
 
75
        "a", "86F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8",
 
76
        "abc", "A9993E364706816ABA3E25717850C26C9CD0D89D",
 
77
        "message digest", "C12252CEDA8BE8994D5FA0290A47231C1D16AAE3",
 
78
        "The quick brown fox jumps over the lazy dog", "2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12",
 
79
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "761C457BF73B14D27E9E9265C46F4B4DDA11F940",
 
80
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "50ABF5706A150990A08B2C5EA40FA0E585554732",
 
81
        0
78
82
};
79
83
 
80
84
/* tests from spec and NESSIE test vectors */
81
85
const char* tiger_hashes[] = {
82
 
  "", "3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3",
83
 
  "a", "77BEFBEF2E7EF8AB2EC8F93BF587A7FC613E247F5F247809",
84
 
  "abc", "2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93",
85
 
  "Tiger", "DD00230799F5009FEC6DEBC838BB6A27DF2B9D6F110C7937",
86
 
  "The quick brown fox jumps over the lazy dog", "6D12A41E72E644F017B6F0E2F7B44C6285F06DD5D2C5B075",
87
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-", "F71C8583902AFB879EDFE610F82C0D4786A3A534504486B5",
88
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789", "48CEEB6308B87D46E95D656112CDF18D97915F9765658957",
89
 
  "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham", "8A866829040A410C729AD23F5ADA711603B3CDD357E4C15E",
90
 
  "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proceedings of Fast Software Encryption 3, Cambridge.", "CE55A6AFD591F5EBAC547FF84F89227F9331DAB0B611C889",
91
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-", "C54034E5B43EB8005848A7E0AE6AAC76E4FF590AE715FD25",
92
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "8DCEA680A17583EE502BA38A3C368651890FFBCCDC49A8CC",
 
86
        "", "3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3",
 
87
        "a", "77BEFBEF2E7EF8AB2EC8F93BF587A7FC613E247F5F247809",
 
88
        "abc", "2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93",
 
89
        "Tiger", "DD00230799F5009FEC6DEBC838BB6A27DF2B9D6F110C7937",
 
90
        "The quick brown fox jumps over the lazy dog", "6D12A41E72E644F017B6F0E2F7B44C6285F06DD5D2C5B075",
 
91
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-", "F71C8583902AFB879EDFE610F82C0D4786A3A534504486B5",
 
92
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789", "48CEEB6308B87D46E95D656112CDF18D97915F9765658957",
 
93
        "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham", "8A866829040A410C729AD23F5ADA711603B3CDD357E4C15E",
 
94
        "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proceedings of Fast Software Encryption 3, Cambridge.", "CE55A6AFD591F5EBAC547FF84F89227F9331DAB0B611C889",
 
95
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-", "C54034E5B43EB8005848A7E0AE6AAC76E4FF590AE715FD25",
 
96
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "8DCEA680A17583EE502BA38A3C368651890FFBCCDC49A8CC",
93
97
 
94
 
  "message digest", "D981F8CB78201A950DCF3048751E441C517FCA1AA55A29F6",
95
 
  "abcdefghijklmnopqrstuvwxyz", "1714A472EEE57D30040412BFCC55032A0B11602FF37BEEE9",
96
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "0F7BF9A19B9C58F2B7610DF7E84F0AC3A71C631E7B53F78E",
97
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "8DCEA680A17583EE502BA38A3C368651890FFBCCDC49A8CC",
98
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "1C14795529FD9F207A958F84C52F11E887FA0CABDFD91BFD",
99
 
  0
 
98
        "message digest", "D981F8CB78201A950DCF3048751E441C517FCA1AA55A29F6",
 
99
        "abcdefghijklmnopqrstuvwxyz", "1714A472EEE57D30040412BFCC55032A0B11602FF37BEEE9",
 
100
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "0F7BF9A19B9C58F2B7610DF7E84F0AC3A71C631E7B53F78E",
 
101
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "8DCEA680A17583EE502BA38A3C368651890FFBCCDC49A8CC",
 
102
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "1C14795529FD9F207A958F84C52F11E887FA0CABDFD91BFD",
 
103
        0
100
104
};
101
105
 
102
106
/* verified by strong dc++ */
103
107
const char* tth_tests[] = {
104
 
  "", "LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ",
105
 
  "a", "CZQUWH3IYXBF5L3BGYUGZHASSMXU647IP2IKE4Y",
106
 
  "abc", "ASD4UJSEH5M47PDYB46KBTSQTSGDKLBHYXOMUIA",
107
 
  "message digest", "YM432MSOX5QILIH2L4TNO62E3O35WYGWSBSJOBA",
108
 
  "abcdefghijklmnopqrstuvwxyz", "LMHNA2VYO465P2RDOGTR2CL6XKHZNI2X4CCUY5Y",
109
 
  "The quick brown fox jumps over the lazy dog", "WLM2MITXFTCQXEOYO3M4EL5APES353NQLI66ORY",
110
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "TF74ENF7MF2WPDE35M23NRSVKJIRKYRMTLWAHWQ",
111
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "NBKCANQ2ODNTSV4C7YJFF3JRAV7LKTFIPHQNBJY",
112
 
  0
 
108
        "", "LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ",
 
109
        "a", "CZQUWH3IYXBF5L3BGYUGZHASSMXU647IP2IKE4Y",
 
110
        "abc", "ASD4UJSEH5M47PDYB46KBTSQTSGDKLBHYXOMUIA",
 
111
        "message digest", "YM432MSOX5QILIH2L4TNO62E3O35WYGWSBSJOBA",
 
112
        "abcdefghijklmnopqrstuvwxyz", "LMHNA2VYO465P2RDOGTR2CL6XKHZNI2X4CCUY5Y",
 
113
        "The quick brown fox jumps over the lazy dog", "WLM2MITXFTCQXEOYO3M4EL5APES353NQLI66ORY",
 
114
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "TF74ENF7MF2WPDE35M23NRSVKJIRKYRMTLWAHWQ",
 
115
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "NBKCANQ2ODNTSV4C7YJFF3JRAV7LKTFIPHQNBJY",
 
116
        0
113
117
};
114
118
 
115
119
const char* aich_tests[] = {
116
 
  "", "3I42H3S6NNFQ2MSVX7XZKYAYSCX5QBYJ",
117
 
  "a", "Q336IN72UWT7ZYK5DXOLT2XK5I3XMZ5Y",
118
 
  "abc", "VGMT4NSHA2AWVOR6EVYXQUGCNSONBWE5",
119
 
  "message digest", "YERFFTW2RPUJSTK7UAUQURZDDQORNKXD",
120
 
  "abcdefghijklmnopqrstuvwxyz", "GLIQY64M7FSXBSQEZY37FIM5QQSA2OUJ",
121
 
  "The quick brown fox jumps over the lazy dog", "F7KODRT2FUUPZ3MET3Q3W5XHHENZH2YS",
122
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "OYOEK67XHMKNE7U6SJS4I32LJXNBD6KA",
123
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "KCV7K4DKCUEZBIELFRPKID5A4WCVKRZS",
124
 
  0
 
120
        "", "3I42H3S6NNFQ2MSVX7XZKYAYSCX5QBYJ",
 
121
        "a", "Q336IN72UWT7ZYK5DXOLT2XK5I3XMZ5Y",
 
122
        "abc", "VGMT4NSHA2AWVOR6EVYXQUGCNSONBWE5",
 
123
        "message digest", "YERFFTW2RPUJSTK7UAUQURZDDQORNKXD",
 
124
        "abcdefghijklmnopqrstuvwxyz", "GLIQY64M7FSXBSQEZY37FIM5QQSA2OUJ",
 
125
        "The quick brown fox jumps over the lazy dog", "F7KODRT2FUUPZ3MET3Q3W5XHHENZH2YS",
 
126
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "OYOEK67XHMKNE7U6SJS4I32LJXNBD6KA",
 
127
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "KCV7K4DKCUEZBIELFRPKID5A4WCVKRZS",
 
128
        0
125
129
};
126
130
 
127
131
const char* whirlpool_tests[] = {
128
 
  "", "19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A73E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3",
129
 
  "a", "8ACA2602792AEC6F11A67206531FB7D7F0DFF59413145E6973C45001D0087B42D11BC645413AEFF63A42391A39145A591A92200D560195E53B478584FDAE231A",
130
 
  "abc", "4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5",
131
 
  "message digest", "378C84A4126E2DC6E56DCC7458377AAC838D00032230F53CE1F5700C0FFB4D3B8421557659EF55C106B4B52AC5A4AAA692ED920052838F3362E86DBD37A8903E",
132
 
  "abcdefghijklmnopqrstuvwxyz", "F1D754662636FFE92C82EBB9212A484A8D38631EAD4238F5442EE13B8054E41B08BF2A9251C30B6A0B8AAE86177AB4A6F68F673E7207865D5D9819A3DBA4EB3B",
133
 
  "The quick brown fox jumps over the lazy dog", "B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725FD2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35",
134
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
135
 
    "DC37E008CF9EE69BF11F00ED9ABA26901DD7C28CDEC066CC6AF42E40F82F3A1E08EBA26629129D8FB7CB57211B9281A65517CC879D7B962142C65F5A7AF01467",
136
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", 
137
 
    "466EF18BABB0154D25B9D38A6414F5C08784372BCCB204D6549C4AFADB6014294D5BD8DF2A6C44E538CD047B2681A51A2C60481E88C5A20B2C2A80CF3A9A083B",
138
 
  "abcdbcdecdefdefgefghfghighijhijk",
139
 
    "2A987EA40F917061F5D6F0A0E4644F488A7A5A52DEEE656207C562F988E95C6916BDC8031BC5BE1B7B947639FE050B56939BAAA0ADFF9AE6745B7B181C3BE3FD",
140
 
  0
 
132
        "", "19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A73E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3",
 
133
        "a", "8ACA2602792AEC6F11A67206531FB7D7F0DFF59413145E6973C45001D0087B42D11BC645413AEFF63A42391A39145A591A92200D560195E53B478584FDAE231A",
 
134
        "abc", "4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5",
 
135
        "message digest", "378C84A4126E2DC6E56DCC7458377AAC838D00032230F53CE1F5700C0FFB4D3B8421557659EF55C106B4B52AC5A4AAA692ED920052838F3362E86DBD37A8903E",
 
136
        "abcdefghijklmnopqrstuvwxyz", "F1D754662636FFE92C82EBB9212A484A8D38631EAD4238F5442EE13B8054E41B08BF2A9251C30B6A0B8AAE86177AB4A6F68F673E7207865D5D9819A3DBA4EB3B",
 
137
        "The quick brown fox jumps over the lazy dog", "B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725FD2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35",
 
138
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
 
139
        "DC37E008CF9EE69BF11F00ED9ABA26901DD7C28CDEC066CC6AF42E40F82F3A1E08EBA26629129D8FB7CB57211B9281A65517CC879D7B962142C65F5A7AF01467",
 
140
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", 
 
141
        "466EF18BABB0154D25B9D38A6414F5C08784372BCCB204D6549C4AFADB6014294D5BD8DF2A6C44E538CD047B2681A51A2C60481E88C5A20B2C2A80CF3A9A083B",
 
142
        "abcdbcdecdefdefgefghfghighijhijk",
 
143
        "2A987EA40F917061F5D6F0A0E4644F488A7A5A52DEEE656207C562F988E95C6916BDC8031BC5BE1B7B947639FE050B56939BAAA0ADFF9AE6745B7B181C3BE3FD",
 
144
        0
141
145
};
142
146
 
143
147
/* test vectors from RIPEMD-160 spec */
144
148
const char* ripemd_tests[] = {
145
 
  "", "9C1185A5C5E9FC54612808977EE8F548B2258D31",
146
 
  "a", "0BDC9D2D256B3EE9DAAE347BE6F4DC835A467FFE",
147
 
  "abc", "8EB208F7E05D987A9B044A8E98C6B087F15A0BFC",
148
 
  "message digest", "5D0689EF49D2FAE572B881B123A85FFA21595F36",
149
 
  "abcdefghijklmnopqrstuvwxyz", "F71C27109C692C1B56BBDCEB5B9D2865B3708DBC",
150
 
  "The quick brown fox jumps over the lazy dog", "37F332F68DB77BD9D7EDD4969571AD671CF9DD3B",
151
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "12A053384A9C0C88E405A06C27DCF49ADA62EB2B",
152
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "B0E20B6E3116640286ED3A87A5713079B21F5189",
153
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "9B752E45573D4B39F4DBD3323CAB82BF63326BFB",
154
 
  0
 
149
        "", "9C1185A5C5E9FC54612808977EE8F548B2258D31",
 
150
        "a", "0BDC9D2D256B3EE9DAAE347BE6F4DC835A467FFE",
 
151
        "abc", "8EB208F7E05D987A9B044A8E98C6B087F15A0BFC",
 
152
        "message digest", "5D0689EF49D2FAE572B881B123A85FFA21595F36",
 
153
        "abcdefghijklmnopqrstuvwxyz", "F71C27109C692C1B56BBDCEB5B9D2865B3708DBC",
 
154
        "The quick brown fox jumps over the lazy dog", "37F332F68DB77BD9D7EDD4969571AD671CF9DD3B",
 
155
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "12A053384A9C0C88E405A06C27DCF49ADA62EB2B",
 
156
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "B0E20B6E3116640286ED3A87A5713079B21F5189",
 
157
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "9B752E45573D4B39F4DBD3323CAB82BF63326BFB",
 
158
        0
155
159
};
156
160
 
157
161
/*
158
 
 * Two important test-cases (some sites calculate them incorrectly):
159
 
 * GOST( <100000 characters of 'a'> ) = 5C00CCC2734CDD3332D3D4749576E3C1A7DBAF0E7EA74E9FA602413C90A129FA
160
 
 * GOST( <128 characters of 'U'> ) = 53A3A3ED25180CEF0C1D85A074273E551C25660A87062A52D926A9E8FE5733A4 
161
 
 */
 
162
* Two important test-cases (some sites calculate them incorrectly):
 
163
* GOST( <100000 characters of 'a'> ) = 5C00CCC2734CDD3332D3D4749576E3C1A7DBAF0E7EA74E9FA602413C90A129FA
 
164
* GOST( <128 characters of 'U'> ) = 53A3A3ED25180CEF0C1D85A074273E551C25660A87062A52D926A9E8FE5733A4 
 
165
*/
162
166
 
163
167
/* test vectors from internet, verified by openssl and some other progs */
164
168
const char* gost_tests[] = {
165
 
  "", "CE85B99CC46752FFFEE35CAB9A7B0278ABB4C2D2055CFF685AF4912C49490F8D",
166
 
  "a", "D42C539E367C66E9C88A801F6649349C21871B4344C6A573F849FDCE62F314DD",
167
 
  "abc", "F3134348C44FB1B2A277729E2285EBB5CB5E0F29C975BC753B70497C06A4D51D",
168
 
  "message digest", "AD4434ECB18F2C99B60CBE59EC3D2469582B65273F48DE72DB2FDE16A4889A4D",
169
 
  "The quick brown fox jumps over the lazy dog", "77B7FA410C9AC58A25F49BCA7D0468C9296529315EACA76BD1A10F376D1F4294",
170
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "95C1AF627C356496D80274330B2CFF6A10C67B5F597087202F94D06D2338CF8E",
171
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "CC178DCAD4DF619DCAA00AAC79CA355C00144E4ADA2793D7BD9B3518EAD3CCD3",
172
 
  "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU", "53A3A3ED25180CEF0C1D85A074273E551C25660A87062A52D926A9E8FE5733A4",
173
 
  /* two test strings from GOST standard */
174
 
  "This is message, length=32 bytes", "B1C466D37519B82E8319819FF32595E047A28CB6F83EFF1C6916A815A637FFFA",
175
 
  "Suppose the original message has length = 50 bytes", "471ABA57A60A770D3A76130635C1FBEA4EF14DE51F78B4AE57DD893B62F55208",
176
 
  /* tests from Wikipedia */
177
 
  "\303\316\321\322 \320 34.11-94", "30CFF16501E3D77D84F24C55284945F7297120C78BC6B3ED4F537B674735A8B6",
178
 
  "The quick brown fox jumps over the lazy cog", "A3EBC4DAAAB78B0BE131DAB5737A7F67E602670D543521319150D2E14EEEC445",
179
 
  0
 
169
        "", "CE85B99CC46752FFFEE35CAB9A7B0278ABB4C2D2055CFF685AF4912C49490F8D",
 
170
        "a", "D42C539E367C66E9C88A801F6649349C21871B4344C6A573F849FDCE62F314DD",
 
171
        "abc", "F3134348C44FB1B2A277729E2285EBB5CB5E0F29C975BC753B70497C06A4D51D",
 
172
        "message digest", "AD4434ECB18F2C99B60CBE59EC3D2469582B65273F48DE72DB2FDE16A4889A4D",
 
173
        "The quick brown fox jumps over the lazy dog", "77B7FA410C9AC58A25F49BCA7D0468C9296529315EACA76BD1A10F376D1F4294",
 
174
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "95C1AF627C356496D80274330B2CFF6A10C67B5F597087202F94D06D2338CF8E",
 
175
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "CC178DCAD4DF619DCAA00AAC79CA355C00144E4ADA2793D7BD9B3518EAD3CCD3",
 
176
        "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU", "53A3A3ED25180CEF0C1D85A074273E551C25660A87062A52D926A9E8FE5733A4",
 
177
        /* two test strings from GOST standard */
 
178
        "This is message, length=32 bytes", "B1C466D37519B82E8319819FF32595E047A28CB6F83EFF1C6916A815A637FFFA",
 
179
        "Suppose the original message has length = 50 bytes", "471ABA57A60A770D3A76130635C1FBEA4EF14DE51F78B4AE57DD893B62F55208",
 
180
        "The quick brown fox jumps over the lazy cog", "A3EBC4DAAAB78B0BE131DAB5737A7F67E602670D543521319150D2E14EEEC445", /* test from Wikipedia */
 
181
        0
180
182
};
181
183
 
182
184
/* tested with openssl */
183
185
const char* gost_cryptopro_tests[] = {
184
 
  "", "981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0",
185
 
  "a", "E74C52DD282183BF37AF0079C9F78055715A103F17E3133CEFF1AACF2F403011",
186
 
  "abc", "B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C",
187
 
  "message digest", "BC6041DD2AA401EBFA6E9886734174FEBDB4729AA972D60F549AC39B29721BA0",
188
 
  "The quick brown fox jumps over the lazy dog", "9004294A361A508C586FE53D1F1B02746765E71B765472786E4770D565830A76",
189
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "73B70A39497DE53A6E08C67B6D4DB853540F03E9389299D9B0156EF7E85D0F61",
190
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "6BC7B38989B28CF93AE8842BF9D752905910A7528A61E5BCE0782DE43E610C90",
191
 
  "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU", "1C4AC7614691BBF427FA2316216BE8F10D92EDFD37CD1027514C1008F649C4E8",
192
 
  "This is message, length=32 bytes", "2CEFC2F7B7BDC514E18EA57FA74FF357E7FA17D652C75F69CB1BE7893EDE48EB",
193
 
  "Suppose the original message has length = 50 bytes", "C3730C5CBCCACF915AC292676F21E8BD4EF75331D9405E5F1A61DC3130A65011",
194
 
  0
 
186
        "", "981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0",
 
187
        "a", "E74C52DD282183BF37AF0079C9F78055715A103F17E3133CEFF1AACF2F403011",
 
188
        "abc", "B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C",
 
189
        "message digest", "BC6041DD2AA401EBFA6E9886734174FEBDB4729AA972D60F549AC39B29721BA0",
 
190
        "The quick brown fox jumps over the lazy dog", "9004294A361A508C586FE53D1F1B02746765E71B765472786E4770D565830A76",
 
191
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "73B70A39497DE53A6E08C67B6D4DB853540F03E9389299D9B0156EF7E85D0F61",
 
192
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "6BC7B38989B28CF93AE8842BF9D752905910A7528A61E5BCE0782DE43E610C90",
 
193
        "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU", "1C4AC7614691BBF427FA2316216BE8F10D92EDFD37CD1027514C1008F649C4E8",
 
194
        "This is message, length=32 bytes", "2CEFC2F7B7BDC514E18EA57FA74FF357E7FA17D652C75F69CB1BE7893EDE48EB",
 
195
        "Suppose the original message has length = 50 bytes", "C3730C5CBCCACF915AC292676F21E8BD4EF75331D9405E5F1A61DC3130A65011",
 
196
        0
195
197
};
196
198
 
197
199
/* test vectors verified by mhash */
198
200
const char* snefru256_tests[] = {
199
 
  "", "8617F366566A011837F4FB4BA5BEDEA2B892F3ED8B894023D16AE344B2BE5881",
200
 
  "a", "45161589AC317BE0CEBA70DB2573DDDA6E668A31984B39BF65E4B664B584C63D",
201
 
  "abc", "7D033205647A2AF3DC8339F6CB25643C33EBC622D32979C4B612B02C4903031B",
202
 
  "message digest", "C5D4CE38DAA043BDD59ED15DB577500C071B917C1A46CD7B4D30B44A44C86DF8",
203
 
  "abcdefghijklmnopqrstuvwxyz", "9304BB2F876D9C4F54546CF7EC59E0A006BEAD745F08C642F25A7C808E0BF86E",
204
 
  "The quick brown fox jumps over the lazy dog", "674CAA75F9D8FD2089856B95E93A4FB42FA6C8702F8980E11D97A142D76CB358",
205
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "83AA9193B62FFD269FAA43D31E6AC2678B340E2A85849470328BE9773A9E5728",
206
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "D5FCE38A152A2D9B83AB44C29306EE45AB0AED0E38C957EC431DAB6ED6BB71B8",
207
 
  0
 
201
        "", "8617F366566A011837F4FB4BA5BEDEA2B892F3ED8B894023D16AE344B2BE5881",
 
202
        "a", "45161589AC317BE0CEBA70DB2573DDDA6E668A31984B39BF65E4B664B584C63D",
 
203
        "abc", "7D033205647A2AF3DC8339F6CB25643C33EBC622D32979C4B612B02C4903031B",
 
204
        "message digest", "C5D4CE38DAA043BDD59ED15DB577500C071B917C1A46CD7B4D30B44A44C86DF8",
 
205
        "abcdefghijklmnopqrstuvwxyz", "9304BB2F876D9C4F54546CF7EC59E0A006BEAD745F08C642F25A7C808E0BF86E",
 
206
        "The quick brown fox jumps over the lazy dog", "674CAA75F9D8FD2089856B95E93A4FB42FA6C8702F8980E11D97A142D76CB358",
 
207
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "83AA9193B62FFD269FAA43D31E6AC2678B340E2A85849470328BE9773A9E5728",
 
208
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "D5FCE38A152A2D9B83AB44C29306EE45AB0AED0E38C957EC431DAB6ED6BB71B8",
 
209
        0
208
210
};
209
211
 
210
212
/* test vectors verified by mhash */
211
213
const char* snefru128_tests[] = {
212
 
  "", "8617F366566A011837F4FB4BA5BEDEA2",
213
 
  "a", "BF5CE540AE51BC50399F96746C5A15BD",
214
 
  "abc", "553D0648928299A0F22A275A02C83B10",
215
 
  "message digest", "96D6F2F4112C4BAF29F653F1594E2D5D",
216
 
  "abcdefghijklmnopqrstuvwxyz", "7840148A66B91C219C36F127A0929606",
217
 
  "The quick brown fox jumps over the lazy dog", "59D9539D0DD96D635B5BDBD1395BB86C",
218
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "0EFD7F93A549F023B79781090458923E",
219
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "D9204ED80BB8430C0B9C244FE485814A",
220
 
  0
 
214
        "", "8617F366566A011837F4FB4BA5BEDEA2",
 
215
        "a", "BF5CE540AE51BC50399F96746C5A15BD",
 
216
        "abc", "553D0648928299A0F22A275A02C83B10",
 
217
        "message digest", "96D6F2F4112C4BAF29F653F1594E2D5D",
 
218
        "abcdefghijklmnopqrstuvwxyz", "7840148A66B91C219C36F127A0929606",
 
219
        "The quick brown fox jumps over the lazy dog", "59D9539D0DD96D635B5BDBD1395BB86C",
 
220
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "0EFD7F93A549F023B79781090458923E",
 
221
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "D9204ED80BB8430C0B9C244FE485814A",
 
222
        0
221
223
};
222
224
 
223
225
/* checked against test vectors: http://www.randombit.net/text/has160.html */
224
226
const char* has160_tests[] = {
225
 
  "",  "307964EF34151D37C8047ADEC7AB50F4FF89762D",
226
 
  "a", "4872BCBC4CD0F0A9DC7C2F7045E5B43B6C830DB8",
227
 
  "abc", "975E810488CF2A3D49838478124AFCE4B1C78804",
228
 
  "message digest", "2338DBC8638D31225F73086246BA529F96710BC6",
229
 
  "abcdefghijklmnopqrstuvwxyz", "596185C9AB6703D0D0DBB98702BC0F5729CD1D3C",
230
 
  "The quick brown fox jumps over the lazy dog", "ABE2B8C711F9E8579AA8EB40757A27B4EF14A7EA",
231
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "CB5D7EFBCA2F02E0FB7167CABB123AF5795764E5",
232
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "07F05C8C0773C55CA3A5A695CE6ACA4C438911B5",
233
 
  0
 
227
        "", "307964EF34151D37C8047ADEC7AB50F4FF89762D",
 
228
        "a", "4872BCBC4CD0F0A9DC7C2F7045E5B43B6C830DB8",
 
229
        "abc", "975E810488CF2A3D49838478124AFCE4B1C78804",
 
230
        "message digest", "2338DBC8638D31225F73086246BA529F96710BC6",
 
231
        "abcdefghijklmnopqrstuvwxyz", "596185C9AB6703D0D0DBB98702BC0F5729CD1D3C",
 
232
        "The quick brown fox jumps over the lazy dog", "ABE2B8C711F9E8579AA8EB40757A27B4EF14A7EA",
 
233
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "CB5D7EFBCA2F02E0FB7167CABB123AF5795764E5",
 
234
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "07F05C8C0773C55CA3A5A695CE6ACA4C438911B5",
 
235
        0
234
236
};
235
237
 
236
238
/* unconfirmed test vectors */
237
239
const char* sha224_tests[] = {
238
 
  "", "D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F",
239
 
  "a", "ABD37534C7D9A2EFB9465DE931CD7055FFDB8879563AE98078D6D6D5",
240
 
  "abc", "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7",
241
 
  "message digest", "2CB21C83AE2F004DE7E81C3C7019CBCB65B71AB656B22D6D0C39B8EB",
242
 
  "abcdefghijklmnopqrstuvwxyz", "45A5F72C39C5CFF2522EB3429799E49E5F44B356EF926BCF390DCCC2",
243
 
  "The quick brown fox jumps over the lazy dog", "730E109BD7A8A32B1CB9D9A09AA2325D2430587DDBC0C38BAD911525",
244
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "75388B16512776CC5DBA5DA1FD890150B0C6455CB4F58B1952522525",
245
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "BFF72B4FCB7D75E5632900AC5F90D219E05E97A7BDE72E740DB393D9",
246
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "B50AECBE4E9BB0B57BC5F3AE760A8E01DB24F203FB3CDCD13148046E",
247
 
  0
 
240
        "", "D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F",
 
241
        "a", "ABD37534C7D9A2EFB9465DE931CD7055FFDB8879563AE98078D6D6D5",
 
242
        "abc", "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7",
 
243
        "message digest", "2CB21C83AE2F004DE7E81C3C7019CBCB65B71AB656B22D6D0C39B8EB",
 
244
        "abcdefghijklmnopqrstuvwxyz", "45A5F72C39C5CFF2522EB3429799E49E5F44B356EF926BCF390DCCC2",
 
245
        "The quick brown fox jumps over the lazy dog", "730E109BD7A8A32B1CB9D9A09AA2325D2430587DDBC0C38BAD911525",
 
246
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "75388B16512776CC5DBA5DA1FD890150B0C6455CB4F58B1952522525",
 
247
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "BFF72B4FCB7D75E5632900AC5F90D219E05E97A7BDE72E740DB393D9",
 
248
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "B50AECBE4E9BB0B57BC5F3AE760A8E01DB24F203FB3CDCD13148046E",
 
249
        0
248
250
};
249
251
 
250
252
/* test vectors from the NESSIE project */
251
253
const char* sha256_tests[] = {
252
 
  "", "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
253
 
  "a", "CA978112CA1BBDCAFAC231B39A23DC4DA786EFF8147C4E72B9807785AFEE48BB",
254
 
  "abc", "BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD",
255
 
  "message digest", "F7846F55CF23E14EEBEAB5B4E1550CAD5B509E3348FBC4EFA3A1413D393CB650",
256
 
  "abcdefghijklmnopqrstuvwxyz", "71C480DF93D6AE2F1EFAD1447C66C9525E316218CF51FC8D9ED832F2DAF18B73",
257
 
  "The quick brown fox jumps over the lazy dog", "D7A8FBB307D7809469CA9ABCB0082E4F8D5651E46D3CDB762D02D0BF37C9E592",
258
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1",
259
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "DB4BFCBD4DA0CD85A60C3C37D3FBD8805C77F15FC6B1FDFE614EE0A7C8FDB4C0",
260
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "F371BC4A311F2B009EEF952DD83CA80E2B60026C8E935592D0F9C308453C813E",
261
 
  0
 
254
        "", "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
 
255
        "a", "CA978112CA1BBDCAFAC231B39A23DC4DA786EFF8147C4E72B9807785AFEE48BB",
 
256
        "abc", "BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD",
 
257
        "message digest", "F7846F55CF23E14EEBEAB5B4E1550CAD5B509E3348FBC4EFA3A1413D393CB650",
 
258
        "abcdefghijklmnopqrstuvwxyz", "71C480DF93D6AE2F1EFAD1447C66C9525E316218CF51FC8D9ED832F2DAF18B73",
 
259
        "The quick brown fox jumps over the lazy dog", "D7A8FBB307D7809469CA9ABCB0082E4F8D5651E46D3CDB762D02D0BF37C9E592",
 
260
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1",
 
261
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "DB4BFCBD4DA0CD85A60C3C37D3FBD8805C77F15FC6B1FDFE614EE0A7C8FDB4C0",
 
262
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "F371BC4A311F2B009EEF952DD83CA80E2B60026C8E935592D0F9C308453C813E",
 
263
        0
262
264
};
263
265
 
264
266
const char* sha384_tests[] = {
265
 
  "", "38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B",
266
 
  "a", "54A59B9F22B0B80880D8427E548B7C23ABD873486E1F035DCE9CD697E85175033CAA88E6D57BC35EFAE0B5AFD3145F31",
267
 
  "abc", "CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1631A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7",
268
 
  "message digest", "473ED35167EC1F5D8E550368A3DB39BE54639F828868E9454C239FC8B52E3C61DBD0D8B4DE1390C256DCBB5D5FD99CD5",
269
 
  "abcdefghijklmnopqrstuvwxyz", "FEB67349DF3DB6F5924815D6C3DC133F091809213731FE5C7B5F4999E463479FF2877F5F2936FA63BB43784B12F3EBB4",
270
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "3391FDDDFC8DC7393707A65B1B4709397CF8B1D162AF05ABFE8F450DE5F36BC6B0455A8520BC4E6F5FE95B1FE3C8452B",
271
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "1761336E3F7CBFE51DEB137F026F89E01A448E3B1FAFA64039C1464EE8732F11A5341A6F41E0C202294736ED64DB1A84",
272
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "B12932B0627D1C060942F5447764155655BD4DA0C9AFA6DD9B9EF53129AF1B8FB0195996D2DE9CA0DF9D821FFEE67026",
273
 
  0
 
267
        "", "38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B",
 
268
        "a", "54A59B9F22B0B80880D8427E548B7C23ABD873486E1F035DCE9CD697E85175033CAA88E6D57BC35EFAE0B5AFD3145F31",
 
269
        "abc", "CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1631A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7",
 
270
        "message digest", "473ED35167EC1F5D8E550368A3DB39BE54639F828868E9454C239FC8B52E3C61DBD0D8B4DE1390C256DCBB5D5FD99CD5",
 
271
        "abcdefghijklmnopqrstuvwxyz", "FEB67349DF3DB6F5924815D6C3DC133F091809213731FE5C7B5F4999E463479FF2877F5F2936FA63BB43784B12F3EBB4",
 
272
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "3391FDDDFC8DC7393707A65B1B4709397CF8B1D162AF05ABFE8F450DE5F36BC6B0455A8520BC4E6F5FE95B1FE3C8452B",
 
273
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "1761336E3F7CBFE51DEB137F026F89E01A448E3B1FAFA64039C1464EE8732F11A5341A6F41E0C202294736ED64DB1A84",
 
274
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "B12932B0627D1C060942F5447764155655BD4DA0C9AFA6DD9B9EF53129AF1B8FB0195996D2DE9CA0DF9D821FFEE67026",
 
275
        0
274
276
};
275
277
 
276
278
const char* sha512_tests[] = {
277
 
  "", "CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E",
278
 
  "a", "1F40FC92DA241694750979EE6CF582F2D5D7D28E18335DE05ABC54D0560E0F5302860C652BF08D560252AA5E74210546F369FBBBCE8C12CFC7957B2652FE9A75",
279
 
  "abc", "DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F",
280
 
  "message digest", "107DBF389D9E9F71A3A95F6C055B9251BC5268C2BE16D6C13492EA45B0199F3309E16455AB1E96118E8A905D5597B72038DDB372A89826046DE66687BB420E7C",
281
 
  "abcdefghijklmnopqrstuvwxyz", "4DBFF86CC2CA1BAE1E16468A05CB9881C97F1753BCE3619034898FAA1AABE429955A1BF8EC483D7421FE3C1646613A59ED5441FB0F321389F77F48A879C7B1F1",
282
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "204A8FC6DDA82F0A0CED7BEB8E08A41657C16EF468B228A8279BE331A703C33596FD15C13B1B07F9AA1D3BEA57789CA031AD85C7A71DD70354EC631238CA3445",
283
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "1E07BE23C26A86EA37EA810C8EC7809352515A970E9253C26F536CFC7A9996C45C8370583E0A78FA4A90041D71A4CEAB7423F19C71B9D5A3E01249F0BEBD5894",
284
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "72EC1EF1124A45B047E8B7C75A932195135BB61DE24EC0D1914042246E0AEC3A2354E093D76F3048B456764346900CB130D2A4FD5DD16ABB5E30BCB850DEE843",
285
 
  0
 
279
        "", "CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E",
 
280
        "a", "1F40FC92DA241694750979EE6CF582F2D5D7D28E18335DE05ABC54D0560E0F5302860C652BF08D560252AA5E74210546F369FBBBCE8C12CFC7957B2652FE9A75",
 
281
        "abc", "DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F",
 
282
        "message digest", "107DBF389D9E9F71A3A95F6C055B9251BC5268C2BE16D6C13492EA45B0199F3309E16455AB1E96118E8A905D5597B72038DDB372A89826046DE66687BB420E7C",
 
283
        "abcdefghijklmnopqrstuvwxyz", "4DBFF86CC2CA1BAE1E16468A05CB9881C97F1753BCE3619034898FAA1AABE429955A1BF8EC483D7421FE3C1646613A59ED5441FB0F321389F77F48A879C7B1F1",
 
284
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "204A8FC6DDA82F0A0CED7BEB8E08A41657C16EF468B228A8279BE331A703C33596FD15C13B1B07F9AA1D3BEA57789CA031AD85C7A71DD70354EC631238CA3445",
 
285
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "1E07BE23C26A86EA37EA810C8EC7809352515A970E9253C26F536CFC7A9996C45C8370583E0A78FA4A90041D71A4CEAB7423F19C71B9D5A3E01249F0BEBD5894",
 
286
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "72EC1EF1124A45B047E8B7C75A932195135BB61DE24EC0D1914042246E0AEC3A2354E093D76F3048B456764346900CB130D2A4FD5DD16ABB5E30BCB850DEE843",
 
287
        0
286
288
};
287
289
 
288
290
/* verified by eBASH SUPERCOP implementation */
289
291
const char* edonr256_tests[] = {
290
 
  "", "86E7C84024C55DBDC9339B395C95E88DB8F781719851AD1D237C6E6A8E370B80",
291
 
  "a", "943AA9225A2CF154EC2E4DD81237720BA538CA8DF2FD83C0B893C5D265F353A0",
292
 
  "abc", "0360F65D97C2152EA6EBE3D462BF49831E2D5F67B6140992320585D89FD271CE",
293
 
  "message digest", "8D27558F4DD9307614A8166CADB136927D1E79A0C04BD8EF77C3FAFC0917E28A",
294
 
  "abcdefghijklmnopqrstuvwxyz", "5415737AF0D827459EFACB7FE33C0E89CF807E6E608A4D70EF9DEB07BF3BF6BF",
295
 
  "The quick brown fox jumps over the lazy dog", "E77A5AC00923B86C1811D42F1CB1198F43412A6D987DC98BDAE11E6D91399609",
296
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "19DE86BC3F0481098A3E623AA1330995043300A9A5D6C2AD584705F62686417F",
297
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "3B57F954420F49FAC6A80CE6CE013FDB47E71CE824DA78A8F66864203D8EF252",
298
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "286F39D5168775C8E541ED2F0FE3ECF3146380B9C479DE41BD847E866420A776",
299
 
  0
 
292
        "", "86E7C84024C55DBDC9339B395C95E88DB8F781719851AD1D237C6E6A8E370B80",
 
293
        "a", "943AA9225A2CF154EC2E4DD81237720BA538CA8DF2FD83C0B893C5D265F353A0",
 
294
        "abc", "0360F65D97C2152EA6EBE3D462BF49831E2D5F67B6140992320585D89FD271CE",
 
295
        "message digest", "8D27558F4DD9307614A8166CADB136927D1E79A0C04BD8EF77C3FAFC0917E28A",
 
296
        "abcdefghijklmnopqrstuvwxyz", "5415737AF0D827459EFACB7FE33C0E89CF807E6E608A4D70EF9DEB07BF3BF6BF",
 
297
        "The quick brown fox jumps over the lazy dog", "E77A5AC00923B86C1811D42F1CB1198F43412A6D987DC98BDAE11E6D91399609",
 
298
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "19DE86BC3F0481098A3E623AA1330995043300A9A5D6C2AD584705F62686417F",
 
299
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "3B57F954420F49FAC6A80CE6CE013FDB47E71CE824DA78A8F66864203D8EF252",
 
300
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "286F39D5168775C8E541ED2F0FE3ECF3146380B9C479DE41BD847E866420A776",
 
301
        0
300
302
};
301
303
 
302
304
/* verified by eBASH SUPERCOP implementation */
303
305
const char* edonr512_tests[] = {
304
 
  "", "C7AFBDF3E5B4590EB0B25000BF83FB16D4F9B722EE7F9A2DC2BD382035E8EE38D6F6F15C7B8EEC85355AC59AF989799950C64557EAB0E687D0FCBDBA90AE9704",
305
 
  "a", "B59EC44F7BEEF8A04CEED38A973D77C65E22E9458D5F67B497948DA34986C093B5EFC5483FBEE55F2F740FCAD31F18D80DB44BB6B8843E7FD599188E7C07233B",
306
 
  "abc", "FE79BCFA310245D9139DA8BC91B99FD022326F7F3ACA1DFDFB6C84E4125D71FE9BB6A1D41AFCE358F8472835220A7829D5146B2BBFC8E5C2627F60A9B517C1A4",
307
 
  "message digest", "A76B6C5CA8778F39EC1F85D64BADBDBF329725C9A6FB92656D94A82922A26FD51D271A6F135F33157143B960CD8D7D20DC99503AA39871FD64050E061689E4E3",
308
 
  "abcdefghijklmnopqrstuvwxyz", "754640B7B01782C1F345A3864B456DB805E39163FA1A06113A37CB8FB18D30F8DC43C7C3FDB407849CAD437C90DBD28E28AEFEF8898589B388ADEBA153B3DE0B",
309
 
  "The quick brown fox jumps over the lazy dog", "B986ADABFA9ADB1E5B152B6D64C733389082E354FDE2FD9740FAEA6766F440EA4391FC745BB9B11A821756944077BB30723F616645492C70FA4C614DB7E9D45B",
310
 
  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "EE5EF974E8677636970A50E7636EC34EFB1F9D8023C715A26747D73D3665D78D2BB4962381901F76892A630133D476A278E4E3C62176FCE1563904636284415B",
311
 
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "0755F846450A6F84001846E1066828727BF5975383867B87E0120F27B79482524EB01137459185F73C24C23BDD9D901AD1577C3EA1A824E6ACE34BBBA119E92F",
312
 
  "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "0998912DA5B13FC5D7332CBC3B240E44547CE9C861867D901DD39D5A43D2EE80686BC4AD70DFF9159FE12CE94255AD5467B2B59D31562FC08B3697B67323075F",
313
 
  0
 
306
        "", "C7AFBDF3E5B4590EB0B25000BF83FB16D4F9B722EE7F9A2DC2BD382035E8EE38D6F6F15C7B8EEC85355AC59AF989799950C64557EAB0E687D0FCBDBA90AE9704",
 
307
        "a", "B59EC44F7BEEF8A04CEED38A973D77C65E22E9458D5F67B497948DA34986C093B5EFC5483FBEE55F2F740FCAD31F18D80DB44BB6B8843E7FD599188E7C07233B",
 
308
        "abc", "FE79BCFA310245D9139DA8BC91B99FD022326F7F3ACA1DFDFB6C84E4125D71FE9BB6A1D41AFCE358F8472835220A7829D5146B2BBFC8E5C2627F60A9B517C1A4",
 
309
        "message digest", "A76B6C5CA8778F39EC1F85D64BADBDBF329725C9A6FB92656D94A82922A26FD51D271A6F135F33157143B960CD8D7D20DC99503AA39871FD64050E061689E4E3",
 
310
        "abcdefghijklmnopqrstuvwxyz", "754640B7B01782C1F345A3864B456DB805E39163FA1A06113A37CB8FB18D30F8DC43C7C3FDB407849CAD437C90DBD28E28AEFEF8898589B388ADEBA153B3DE0B",
 
311
        "The quick brown fox jumps over the lazy dog", "B986ADABFA9ADB1E5B152B6D64C733389082E354FDE2FD9740FAEA6766F440EA4391FC745BB9B11A821756944077BB30723F616645492C70FA4C614DB7E9D45B",
 
312
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "EE5EF974E8677636970A50E7636EC34EFB1F9D8023C715A26747D73D3665D78D2BB4962381901F76892A630133D476A278E4E3C62176FCE1563904636284415B",
 
313
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "0755F846450A6F84001846E1066828727BF5975383867B87E0120F27B79482524EB01137459185F73C24C23BDD9D901AD1577C3EA1A824E6ACE34BBBA119E92F",
 
314
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "0998912DA5B13FC5D7332CBC3B240E44547CE9C861867D901DD39D5A43D2EE80686BC4AD70DFF9159FE12CE94255AD5467B2B59D31562FC08B3697B67323075F",
 
315
        0
314
316
};
315
317
 
316
 
/* test vector verified with uTorrent */
 
318
#define USE_BTIH_WITH_TEST_FILENAME
 
319
 
317
320
const char* btih_tests[] = {
318
 
  "", "A66A2FA70401A9DCA25C7C39937921D377A24C1A",
319
 
  0
 
321
#ifdef USE_BTIH_WITH_TEST_FILENAME
 
322
        /* BTIH calculated with filename = "test.txt", verified using uTorrent */
 
323
        "", "B9E3C388E3D6B5F63EA5CE61F79C23E2C50EF95B",
 
324
        "a", "C277260F7EC3DAB6D15F9B38796578029ED9B32B",
 
325
        "abc", "D8C4B957D2EEB55D39B2FE68AB924EB007355050",
 
326
        "message digest", "8FE65F36D46DEAB1A347CE005A025F302D35D408",
 
327
        "abcdefghijklmnopqrstuvwxyz", "2932DC7AA83123F822E9431F8F10F2C740D0EDF0",
 
328
        "The quick brown fox jumps over the lazy dog", "C39D1F8950FDB39C2366E9A6CD7814AC3686CA55",
 
329
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "4405635D7611838250EEF66AA8F03980C42AD2CB",
 
330
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "A6583B70D9634170940AEEDFE2AD37DADC99B5D4",
 
331
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "545472D099CE50D075A318429C48BE54DDA02731",
 
332
#else
 
333
        /* BTIH calculated without a filename, can't be verified by torrent tools */
 
334
        "", "A66A2FA70401A9DCA25C7C39937921D377A24C1A",
 
335
        "a", "FD408E9D024B58A57AA1313EFF14005FF8B2C5D1",
 
336
        "abc", "83FFAAFFA483B91FBC284D1930F2DEE886515AFB",
 
337
        "message digest", "8208E521BBECEA61711F787824FB301ED3E2C16C",
 
338
        "abcdefghijklmnopqrstuvwxyz", "47D855AE785FEE80A210DF1512B72AE96A50C99E",
 
339
        "The quick brown fox jumps over the lazy dog", "987147B78B586249263F89E8E7C4E636225BC1F7",
 
340
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "5E4886F153F905528055DEB7C5181F459064D9F4",
 
341
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "867A6364D160679F8F7C41C126EAFCB9E8759CE6",
 
342
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "1BFF44EA31BDF301B9E02689815295C4BB25635F",
 
343
#endif
 
344
        0
320
345
};
321
346
 
322
347
typedef struct known_strings_t {
323
 
  unsigned hash_id;
324
 
  const char** tests;
 
348
        unsigned hash_id;
 
349
        const char** tests;
325
350
} known_strings_t;
326
351
 
327
352
known_strings_t known_strings[] = {
328
 
  { RHASH_CRC32, crc32_tests },
329
 
  { RHASH_MD4, md4_tests },
330
 
  { RHASH_MD5, md5_tests },
331
 
  { RHASH_SHA1, sha1_tests },
332
 
  { RHASH_TIGER, tiger_hashes },
333
 
  { RHASH_TTH, tth_tests },
334
 
  { RHASH_BTIH, btih_tests },
335
 
  { RHASH_ED2K, ed2k_tests },
336
 
  { RHASH_AICH, aich_tests },
337
 
  { RHASH_WHIRLPOOL, whirlpool_tests },
338
 
  { RHASH_RIPEMD160, ripemd_tests },
339
 
  { RHASH_GOST, gost_tests },
340
 
  { RHASH_GOST_CRYPTOPRO, gost_cryptopro_tests },
341
 
  { RHASH_HAS160, has160_tests },
342
 
  { RHASH_SNEFRU128, snefru128_tests },
343
 
  { RHASH_SNEFRU256, snefru256_tests },
344
 
  { RHASH_SHA224, sha224_tests },
345
 
  { RHASH_SHA256, sha256_tests },
346
 
  { RHASH_SHA384, sha384_tests },
347
 
  { RHASH_SHA512, sha512_tests },
348
 
  { RHASH_EDONR256, edonr256_tests },
349
 
  { RHASH_EDONR512, edonr512_tests },
350
 
  { 0, 0 }
 
353
        { RHASH_CRC32, crc32_tests },
 
354
        { RHASH_MD4, md4_tests },
 
355
        { RHASH_MD5, md5_tests },
 
356
        { RHASH_SHA1, sha1_tests },
 
357
        { RHASH_TIGER, tiger_hashes },
 
358
        { RHASH_TTH, tth_tests },
 
359
        { RHASH_BTIH, btih_tests },
 
360
        { RHASH_ED2K, ed2k_tests },
 
361
        { RHASH_AICH, aich_tests },
 
362
        { RHASH_WHIRLPOOL, whirlpool_tests },
 
363
        { RHASH_RIPEMD160, ripemd_tests },
 
364
        { RHASH_GOST, gost_tests },
 
365
        { RHASH_GOST_CRYPTOPRO, gost_cryptopro_tests },
 
366
        { RHASH_HAS160, has160_tests },
 
367
        { RHASH_SNEFRU128, snefru128_tests },
 
368
        { RHASH_SNEFRU256, snefru256_tests },
 
369
        { RHASH_SHA224, sha224_tests },
 
370
        { RHASH_SHA256, sha256_tests },
 
371
        { RHASH_SHA384, sha384_tests },
 
372
        { RHASH_SHA512, sha512_tests },
 
373
        { RHASH_EDONR256, edonr256_tests },
 
374
        { RHASH_EDONR512, edonr512_tests },
 
375
        { 0, 0 }
351
376
};
352
377
 
353
378
/*==========================================================================*
354
379
 *                    Helper functions to hash messages                     *
355
380
 *==========================================================================*/
356
381
 
 
382
static int g_errors = 0;  /* total number of errors occured */
 
383
 
 
384
#ifdef UNDER_CE /* if Windows CE */
 
385
static char *g_msg = NULL; /* string buffer to store errors */
 
386
#endif
 
387
 
 
388
static void log_message(char* format, ...)
 
389
{
 
390
        va_list vl;
 
391
#ifndef UNDER_CE /* not Windows CE */
 
392
        va_start(vl, format);
 
393
        vprintf(format, vl);
 
394
        fflush(stdout);
 
395
#else
 
396
        char str[300];
 
397
        int add_nl = (g_msg == NULL);
 
398
        va_start(vl, format);
 
399
        vsprintf(str, format, vl);
 
400
        g_msg = (char*)realloc(g_msg, (g_msg ? strlen(g_msg) : 0) + strlen(str) + 3);
 
401
        if(add_nl) strcat(g_msg, "\r\n");
 
402
        strcat(g_msg, str);
 
403
#endif
 
404
        va_end(vl);
 
405
}
 
406
 
357
407
/**
358
408
 * Calculate hash of the message specified by chunk string, repeated until
359
409
 * the given length is reached.
360
410
 *
361
 
 * @param chunk a null-terminated string representing the chunk
362
 
 * @param msg_size the total message length
363
 
 * @param length the total length of the message
364
411
 * @param hash_id id of the hash algorithm to use
365
 
 */
366
 
static char* calc_sums_c(const char* chunk, size_t msg_size, size_t length, unsigned hash_id)
367
 
{
368
 
  struct rhash_context *ctx;
369
 
  static char out[130];
370
 
  size_t i;
371
 
 
372
 
  ctx = rhash_init(hash_id);
373
 
  for(i = 0; i < length; i += msg_size) {
374
 
    rhash_update(ctx, (const unsigned char*)chunk,
375
 
      ((i + msg_size) <= length ? msg_size : length % msg_size));
376
 
  }
377
 
  rhash_final(ctx, 0);
378
 
  rhash_print(out, ctx, hash_id, RHPR_UPPERCASE);
379
 
  rhash_free(ctx);
380
 
  return out;
 
412
 * @param msg_chunk the message chunk as a null-terminated string
 
413
 * @param chunk_size the size of the chunk in bytes
 
414
 * @param count the number of chunks in the message
 
415
 */
 
416
static char* repeat_hash(unsigned hash_id, const char* chunk, size_t chunk_size, size_t msg_size)
 
417
{
 
418
        struct rhash_context *ctx;
 
419
        size_t left, size;
 
420
        static char out[130];
 
421
        assert(rhash_get_hash_length(hash_id) < 130);
 
422
 
 
423
        ctx = rhash_init(hash_id);
 
424
#ifdef USE_BTIH_WITH_TEST_FILENAME
 
425
        if((hash_id & RHASH_BTIH) != 0) {
 
426
                unsigned long long total_size = msg_size;
 
427
                rhash_transmit(RMSG_BT_ADD_FILE, ctx, RHASH_STR2UPTR("test.txt"), (rhash_uptr_t)&total_size);
 
428
        }
 
429
#endif
 
430
        
 
431
        for(left = msg_size; left > 0; left -= size) {
 
432
                size = (left > chunk_size ? chunk_size : left);
 
433
                rhash_update(ctx, (const unsigned char*)chunk, size);
 
434
        }
 
435
        rhash_final(ctx, 0);
 
436
        rhash_print(out, ctx, hash_id, RHPR_UPPERCASE);
 
437
        rhash_free(ctx);
 
438
        return out;
 
439
}
 
440
 
 
441
/**
 
442
 * Test a hash algorithm against a message of given length, consisting
 
443
 * of repeated chunks.
 
444
 * Report error if calculated hash differs from the expected value.
 
445
 *
 
446
 * @param hash_id id of the algorithm to test
 
447
 * @param msg_chunk the message chunk as a null-terminated string
 
448
 * @param chunk_size the size of the chunk in bytes
 
449
 * @param count the number of chunks in the message
 
450
 * @param hash the expected hash value
 
451
 */
 
452
static void assert_hash_long_msg(unsigned hash_id, const char* msg_chunk, size_t chunk_size, size_t msg_size, const char* hash, const char* msg_name)
 
453
{
 
454
        char* result;
 
455
        result = repeat_hash(hash_id, msg_chunk, chunk_size, msg_size);
 
456
        if(strcmp(result, hash) != 0) {
 
457
                const char* hash_name = rhash_get_name(hash_id); /* the hash function name */
 
458
                if(msg_name) log_message("failed: %s(%s) = %s, expected %s\n", hash_name, msg_name, result, hash);
 
459
                else log_message("failed: %s(\"%s\") = %s, expected %s\n", hash_name, msg_chunk, result, hash);
 
460
                g_errors++;
 
461
        }
381
462
}
382
463
 
383
464
/**
384
465
 * Calculate hash of the given message.
385
466
 *
 
467
 * @param hash_id id of the hash algorithm to use
386
468
 * @param msg the message to hash
387
 
 * @param hash_id id of the hash algorithm to use
388
 
 */
389
 
static char* calc_sum(const char* msg, unsigned hash_id)
390
 
{
391
 
  return calc_sums_c(msg, strlen(msg), strlen(msg), hash_id);
392
 
}
393
 
 
394
 
static int n_errors = 0;  /* total number of errors occured */
395
 
 
396
 
#ifdef UNDER_CE /* if Windows CE */
397
 
static char *g_msg = NULL; /* string buffer to store errors */
398
 
#endif
399
 
 
400
 
/**
401
 
 * Verify processor endianness detected at compile-time against
402
 
 * with the actual cpu endianness in runtime.
403
 
 */
404
 
static void test_endianness(void)
405
 
{
406
 
  unsigned tmp = 1;
407
 
  if(*(char*)&tmp == IS_BIG_ENDIAN) {
408
 
    n_errors++;
409
 
#ifndef UNDER_CE
410
 
    printf("error: wrong endianness detected at compile time\n");
411
 
    fflush(stdout);
412
 
#else /* UNDER_CE */
413
 
    char* str = "error: wrong endianness detected at compile time";
414
 
    int add_nl = (g_msg == NULL);
415
 
    g_msg = (char*)realloc(g_msg, (g_msg ? strlen(g_msg) : 0) + strlen(str) + 3);
416
 
    if(add_nl) strcat(g_msg, "\r\n");
417
 
    strcat(g_msg, str);
418
 
#endif /* UNDER_CE */
419
 
  }
420
 
}
421
 
 
422
 
/**
423
 
 * Verify calculated hash value against expected one. If failed report
424
 
 * the comparision error in the platform-dependent manner.
425
 
 *
426
 
 * @param obtained calculated hash
427
 
 * @param expected expected value
428
 
 * @param name hash algorithm name
429
 
 * @param msg hashed message
430
 
 */
431
 
static int assert_equals(const char* obtained, const char* expected, const char* name, const char* msg)
432
 
{
433
 
  int success = (strcmp(obtained, expected) == 0);
434
 
  if(!success) {
435
 
#ifndef UNDER_CE
436
 
    printf("error: %-5s (\"%s\") = %s, expected: \"%s\"\n", name, msg, obtained, expected);
437
 
    fflush(stdout);
438
 
 
439
 
#else /* UNDER_CE */
440
 
 
441
 
    char str[100];
442
 
    int add_nl = (g_msg == NULL);
443
 
 
444
 
    sprintf(str, "error: %-5s (\"%s\") = %s, expected: \"%s\"\n", name, msg, obtained, expected);
445
 
    g_msg = (char*)realloc(g_msg, (g_msg ? strlen(g_msg) : 0) + strlen(str) + 3);
446
 
    if(add_nl) strcat(g_msg, "\r\n");
447
 
    strcat(g_msg, str);
448
 
#endif /* UNDER_CE */
449
 
    n_errors++;
450
 
  }
451
 
  return success;
452
 
}
453
 
 
454
 
/**
455
 
 * Test a hash algorithm on given message by comparing calculated result with
456
 
 * expected one. Report error on fail.
457
 
 *
 
469
 */
 
470
static char* hash_message(unsigned hash_id, const char* msg)
 
471
{
 
472
        size_t msg_size = strlen(msg);
 
473
        return repeat_hash(hash_id, msg, msg_size, msg_size);
 
474
}
 
475
 
 
476
/**
 
477
 * Test a hash algorithm on given message by comparing the result hash value
 
478
 * against the expected one. Report error on fail.
 
479
 *
 
480
 * @param hash_id id of the algorithm to test
458
481
 * @param message the message to hash
459
 
 * @param expected_hash the expected hash balue
460
 
 * @param hash_id id of the algorithm to test
461
 
 */
462
 
static void test_str(const char* message, const char* expected_hash, unsigned hash_id)
463
 
{
464
 
  char* obtained = calc_sum(message, hash_id);
465
 
  assert_equals(obtained, expected_hash, rhash_get_name(hash_id), message);
466
 
}
467
 
 
468
 
/**
469
 
 * Test a hash algorithm against a message of given length and consisting
470
 
 * of repeated chunks.
471
 
 * Report error if calculated hash doesn't coincide with expected value.
472
 
 *
473
 
 * @param hash_id id of the algorithm to test
474
 
 * @param chunk the message chunk as a null-terminated string
475
 
 * @param size the length of message of zeroes in bytes
476
 
 * @param expected_hash the expected hash balue
477
 
 */
478
 
static void test_long_msg(unsigned hash_id, const char* chunk, size_t size, const char* expected_hash)
479
 
{
480
 
  size_t chunk_length = strlen(chunk);
481
 
  char* obtained = calc_sums_c(chunk, chunk_length, size, hash_id);
482
 
  assert_equals(obtained, expected_hash, rhash_get_name(hash_id), chunk);
483
 
}
484
 
 
485
 
/**
486
 
 * Test a hash algorithm against a long messages of zeroes.
487
 
 * Report error if calculated hash doesn't coincide with expected value.
488
 
 *
489
 
 * @param hash_id id of the algorithm to test
490
 
 * @param size the length of message of zeroes in bytes
491
 
 * @param expected_hash the expected hash balue
492
 
 */
493
 
static void test_long_zero_msg(unsigned hash_id, size_t size, const char* expected_hash)
494
 
{
495
 
  char buffer[8192];
496
 
  char msg[80], *obtained;
497
 
  memset(buffer, 0, 8192);
498
 
  sprintf(msg, "\"\\0\"x%u", (unsigned)size);
499
 
  obtained = calc_sums_c(buffer, 8192, size, hash_id);
500
 
  assert_equals(obtained, expected_hash, rhash_get_name(hash_id), msg);
 
482
 * @param expected_hash the expected hash value
 
483
 */
 
484
static void assert_hash(unsigned hash_id, const char* msg, const char* expected_hash)
 
485
{
 
486
        size_t msg_size = strlen(msg);
 
487
        assert_hash_long_msg(hash_id, msg, msg_size, msg_size, expected_hash, NULL);
 
488
}
 
489
 
 
490
/**
 
491
 * Test a hash algorithm using a message consisting of given repeated character.
 
492
 * Report error if calculated hash doesn't coincide with expected value.
 
493
 *
 
494
 * @param hash_id id of the algorithm to test
 
495
 * @param ch the character the message is filled with
 
496
 * @param msg_size the size of message in bytes
 
497
 * @param expected_hash the expected hash value
 
498
 */
 
499
static void assert_rep_hash(unsigned hash_id, char ch, size_t msg_size, const char* hash)
 
500
{
 
501
        char ALIGN_ATTR(16) msg_chunk[8192]; /* 8 KiB */
 
502
        char msg_name[20];
 
503
        memset(msg_chunk, ch, 8192);
 
504
        if(ch >= 32) sprintf(msg_name, "\"%c\"x%d", ch, (int)msg_size);
 
505
        else sprintf(msg_name, "\"\\%o\"x%d", (unsigned)ch, (int)msg_size);
 
506
        assert_hash_long_msg(hash_id, msg_chunk, 8192, msg_size, hash, msg_name);
501
507
}
502
508
 
503
509
/*=======================================================================*
510
516
 * @param hash_id id of the algorithm to test
511
517
 * @param ptr pointer to array of pairs <message,expected-hash>
512
518
 */
513
 
static void test_known_strings2(unsigned hash_id, const char** ptr)
 
519
static void test_known_strings_pairs(unsigned hash_id, const char** ptr)
514
520
{
515
 
  for(; ptr[0] && ptr[1]; ptr += 2) {
516
 
    test_str(ptr[0], ptr[1], hash_id);
517
 
  }
 
521
        for(; ptr[0] && ptr[1]; ptr += 2) {
 
522
                assert_hash(hash_id, ptr[0], ptr[1]);
 
523
        }
518
524
}
519
525
 
520
526
/**
524
530
 */
525
531
static void test_known_strings(unsigned hash_id)
526
532
{
527
 
  int i;
528
 
  for(i = 0; known_strings[i].tests != 0; i++) {
529
 
    if(hash_id == known_strings[i].hash_id) {
530
 
      test_known_strings2(hash_id, known_strings[i].tests);
531
 
      break;
532
 
    }
533
 
  }
 
533
        int i;
 
534
        for(i = 0; known_strings[i].tests != 0; i++) {
 
535
                if(hash_id == known_strings[i].hash_id) {
 
536
                        test_known_strings_pairs(hash_id, known_strings[i].tests);
 
537
                        break;
 
538
                }
 
539
        }
534
540
}
535
541
 
536
542
/**
538
544
 */
539
545
static void test_all_known_strings(void)
540
546
{
541
 
  int i;
542
 
  for(i = 0; known_strings[i].tests != 0; i++) {
543
 
    assert(i < (int)(sizeof(known_strings)/sizeof(known_strings_t)));
544
 
    test_known_strings2(known_strings[i].hash_id, known_strings[i].tests);
545
 
  }
 
547
        int i;
 
548
        for(i = 0; known_strings[i].tests != 0; i++) {
 
549
                assert(i < (int)(sizeof(known_strings)/sizeof(known_strings_t)));
 
550
                test_known_strings_pairs(known_strings[i].hash_id, known_strings[i].tests);
 
551
        }
546
552
}
547
553
 
548
554
/**
549
555
 * A pair <algorithm-id, expected-hash-value>.
550
556
 */
551
557
typedef struct id_to_hash_t {
552
 
  int hash_id;
553
 
  const char* hash;
 
558
        int hash_id;
 
559
        const char* expected_hash;
554
560
} id_to_hash_t;
555
561
 
556
562
/**
559
565
 */
560
566
static void test_long_strings(void)
561
567
{
562
 
  unsigned count;
563
 
  char* message  = "aaaaaaaaaaaaa"; /* a message with a prime-numbered length */
564
 
 
565
 
  struct id_to_hash_t tests[] = {
566
 
    { RHASH_CRC32, "DC25BFBC" }, /* verified with cksfv */
567
 
    { RHASH_MD4, "BBCE80CC6BB65E5C6745E30D4EECA9A4" }, /* checked by md4sum */
568
 
    { RHASH_MD5, "7707D6AE4E027C70EEA2A935C2296F21" }, /* checked by md5sum */
569
 
    { RHASH_SHA1, "34AA973CD4C4DAA4F61EEB2BDBAD27316534016F" }, /* checked by sha1sum */
570
 
    { RHASH_ED2K, "BBCE80CC6BB65E5C6745E30D4EECA9A4" }, /* checked by eMule' Link Creator (uses eMule algorithm) */
571
 
    { RHASH_AICH, "KSYPATEV3KP26FJYUEEBCPL5LQJ5FGUK" }, /* checked by eMule' Link Creator */
572
 
    { RHASH_TIGER, "6DB0E2729CBEAD93D715C6A7D36302E9B3CEE0D2BC314B41" }, /* from Tiger author's page (NESSIE test vector) */
573
 
    { RHASH_TTH, "KEPTIGT4CQKF7S5EUVNJZSXXIPNMB3XSOAAQS4Y" }, /* verified with Strong DC++ */
574
 
    { RHASH_WHIRLPOOL, "0C99005BEB57EFF50A7CF005560DDF5D29057FD86B20BFD62DECA0F1CCEA4AF51FC15490EDDC47AF32BB2B66C34FF9AD8C6008AD677F77126953B226E4ED8B01" }, /* taken from the algorithm reference */
575
 
    { RHASH_RIPEMD160, "52783243C1697BDBE16D37F97F68F08325DC1528" }, /* taken from the algorithm reference */
576
 
    { RHASH_GOST_CRYPTOPRO, "8693287AA62F9478F7CB312EC0866B6C4E4A0F11160441E8F4FFCD2715DD554F" }, /* verified with openssl */
577
 
    { RHASH_GOST, "5C00CCC2734CDD3332D3D4749576E3C1A7DBAF0E7EA74E9FA602413C90A129FA" }, /* verified with openssl */
578
 
    { RHASH_HAS160, "D6AD6F0608B878DA9B87999C2525CC84F4C9F18D" }, /* verified against jacksum implementation */
579
 
    { RHASH_SNEFRU128, "5071F647BC51CFD48F9A8F2D2ED84829" }, /* verified by mhash */
580
 
    { RHASH_SNEFRU256, "4A02811F28C121F2162ABB251A01A2A58E6CFC27534AAB10EA6AF0A8DF17FFBF" }, /* verified by mhash */
581
 
    { RHASH_SHA224, "20794655980C91D8BBB4C1EA97618A4BF03F42581948B2EE4EE7AD67" }, /* verified against jacksum implementation */
582
 
    { RHASH_SHA256, "CDC76E5C9914FB9281A1C7E284D73E67F1809A48A497200E046D39CCC7112CD0" }, /* from NESSIE test vectors */
583
 
    { RHASH_SHA384, "9D0E1809716474CB086E834E310A4A1CED149E9C00F248527972CEC5704C2A5B07B8B3DC38ECC4EBAE97DDD87F3D8985" }, /* from NESSIE test vectors */
584
 
    { RHASH_SHA512, "E718483D0CE769644E2E42C7BC15B4638E1F98B13B2044285632A803AFA973EBDE0FF244877EA60A4CB0432CE577C31BEB009C5C2C49AA2E4EADB217AD8CC09B" }, /* from NESSIE test vectors */
585
 
    { RHASH_EDONR256, "56F4B8DC0A41C8EA0A6A42C949883CD5DC25DF8CF4E43AD474FD4492A7A07966" }, /* verified by eBASH SUPERCOP implementation */
586
 
    { RHASH_EDONR512, "B4A5A255D67869C990FE79B5FCBDA69958794B8003F01FD11E90FEFEC35F22BD84FFA2E248E8B3C1ACD9B7EFAC5BC66616E234A6E938D3526DEE26BD0DE9C562" }, /* verified by eBASH SUPERCOP implementation */
587
 
 
588
 
    { RHASH_BTIH, "30CF71DEFC48D497D4C6DCA8FAB203C1E253A53F" }, /* not verified */
589
 
  };
590
 
 
591
 
  /* test all algorithms on 1,000,000 charaters of 'a' */
592
 
  for(count = 0; count < (sizeof(tests) / sizeof(id_to_hash_t)); count++) {
593
 
    test_long_msg(tests[count].hash_id, message, 1000000, tests[count].hash);
594
 
  }
595
 
 
596
 
  /* note: it would be better to check with more complex pre-generated messages */
597
 
 
598
 
  /* these messages verified by eMule LinkCreator (which uses eMule variant of ED2K hash) */
599
 
  test_long_zero_msg(RHASH_ED2K, 9728000, "FC21D9AF828F92A8DF64BEAC3357425D");
600
 
  test_long_zero_msg(RHASH_ED2K, 9728000 - 1, "AC44B93FC9AFF773AB0005C911F8396F");
601
 
  test_long_zero_msg(RHASH_ED2K, 9728000 + 1, "06329E9DBA1373512C06386FE29E3C65"); /* msg with: 9728000 < size <= 9732096 */
602
 
  test_long_zero_msg(RHASH_AICH, 9728000, "5D3N4HQHIUMQ7IU7A5QLPLI6RHSWOR7B");
603
 
  test_long_zero_msg(RHASH_AICH, 9728000 - 1, "L6SPMD2CM6PRZBGRQ6UFC4HJFFOATRA4");
604
 
  test_long_zero_msg(RHASH_AICH, 9728000 + 1, "HL3TFXORIUEPXUWFPY3JLR7SMKGTO4IH");
 
568
        unsigned count;
 
569
 
 
570
        struct id_to_hash_t tests[] = {
 
571
                { RHASH_CRC32, "DC25BFBC" }, /* verified with cksfv */
 
572
                { RHASH_MD4, "BBCE80CC6BB65E5C6745E30D4EECA9A4" }, /* checked by md4sum */
 
573
                { RHASH_MD5, "7707D6AE4E027C70EEA2A935C2296F21" }, /* checked by md5sum */
 
574
                { RHASH_SHA1, "34AA973CD4C4DAA4F61EEB2BDBAD27316534016F" }, /* checked by sha1sum */
 
575
                { RHASH_ED2K, "BBCE80CC6BB65E5C6745E30D4EECA9A4" }, /* checked by eMule' Link Creator (uses eMule algorithm) */
 
576
                { RHASH_AICH, "KSYPATEV3KP26FJYUEEBCPL5LQJ5FGUK" }, /* checked by eMule' Link Creator */
 
577
                { RHASH_TIGER, "6DB0E2729CBEAD93D715C6A7D36302E9B3CEE0D2BC314B41" }, /* from Tiger author's page (NESSIE test vector) */
 
578
                { RHASH_TTH, "KEPTIGT4CQKF7S5EUVNJZSXXIPNMB3XSOAAQS4Y" }, /* verified with Strong DC++ */
 
579
                { RHASH_WHIRLPOOL, "0C99005BEB57EFF50A7CF005560DDF5D29057FD86B20BFD62DECA0F1CCEA4AF51FC15490EDDC47AF32BB2B66C34FF9AD8C6008AD677F77126953B226E4ED8B01" }, /* taken from the algorithm reference */
 
580
                { RHASH_RIPEMD160, "52783243C1697BDBE16D37F97F68F08325DC1528" }, /* taken from the algorithm reference */
 
581
                { RHASH_GOST_CRYPTOPRO, "8693287AA62F9478F7CB312EC0866B6C4E4A0F11160441E8F4FFCD2715DD554F" }, /* verified with openssl */
 
582
                { RHASH_GOST, "5C00CCC2734CDD3332D3D4749576E3C1A7DBAF0E7EA74E9FA602413C90A129FA" }, /* verified with openssl */
 
583
                { RHASH_HAS160, "D6AD6F0608B878DA9B87999C2525CC84F4C9F18D" }, /* verified against jacksum implementation */
 
584
                { RHASH_SNEFRU128, "5071F647BC51CFD48F9A8F2D2ED84829" }, /* verified by mhash */
 
585
                { RHASH_SNEFRU256, "4A02811F28C121F2162ABB251A01A2A58E6CFC27534AAB10EA6AF0A8DF17FFBF" }, /* verified by mhash */
 
586
                { RHASH_SHA224, "20794655980C91D8BBB4C1EA97618A4BF03F42581948B2EE4EE7AD67" }, /* verified against jacksum implementation */
 
587
                { RHASH_SHA256, "CDC76E5C9914FB9281A1C7E284D73E67F1809A48A497200E046D39CCC7112CD0" }, /* from NESSIE test vectors */
 
588
                { RHASH_SHA384, "9D0E1809716474CB086E834E310A4A1CED149E9C00F248527972CEC5704C2A5B07B8B3DC38ECC4EBAE97DDD87F3D8985" }, /* from NESSIE test vectors */
 
589
                { RHASH_SHA512, "E718483D0CE769644E2E42C7BC15B4638E1F98B13B2044285632A803AFA973EBDE0FF244877EA60A4CB0432CE577C31BEB009C5C2C49AA2E4EADB217AD8CC09B" }, /* from NESSIE test vectors */
 
590
                { RHASH_EDONR256, "56F4B8DC0A41C8EA0A6A42C949883CD5DC25DF8CF4E43AD474FD4492A7A07966" }, /* verified by eBASH SUPERCOP implementation */
 
591
                { RHASH_EDONR512, "B4A5A255D67869C990FE79B5FCBDA69958794B8003F01FD11E90FEFEC35F22BD84FFA2E248E8B3C1ACD9B7EFAC5BC66616E234A6E938D3526DEE26BD0DE9C562" }, /* verified by eBASH SUPERCOP implementation */
 
592
#ifdef USE_BTIH_WITH_TEST_FILENAME
 
593
                { RHASH_BTIH, "0DA5C5A6BA0D067C4DE134BB5AD525544DB11A6C" }, /* BTIH with filename="test.txt", verified using uTorrent */
 
594
#else
 
595
                { RHASH_BTIH, "30CF71DEFC48D497D4C6DCA8FAB203C1E253A53F" }, /* BTIH calculated without a filename, can't be verified by torrent tools */
 
596
#endif
 
597
        };
 
598
 
 
599
        /* test all algorithms on 1,000,000 charaters of 'a' */
 
600
        for(count = 0; count < (sizeof(tests) / sizeof(id_to_hash_t)); count++) {
 
601
                assert_rep_hash(tests[count].hash_id, 'a', 1000000, tests[count].expected_hash);
 
602
        }
 
603
 
 
604
        /* note: it would be better to check with more complex pre-generated messages */
 
605
 
 
606
        /* these messages verified by eMule LinkCreator (which uses eMule variant of ED2K hash) */
 
607
        assert_rep_hash(RHASH_ED2K, 0, 9728000, "FC21D9AF828F92A8DF64BEAC3357425D");
 
608
        assert_rep_hash(RHASH_ED2K, 0, 9728000 - 1, "AC44B93FC9AFF773AB0005C911F8396F");
 
609
        assert_rep_hash(RHASH_ED2K, 0, 9728000 + 1, "06329E9DBA1373512C06386FE29E3C65"); /* msg with: 9728000 < size <= 9732096 */
 
610
        assert_rep_hash(RHASH_AICH, 0, 9728000, "5D3N4HQHIUMQ7IU7A5QLPLI6RHSWOR7B");
 
611
        assert_rep_hash(RHASH_AICH, 0, 9728000 - 1, "L6SPMD2CM6PRZBGRQ6UFC4HJFFOATRA4");
 
612
        assert_rep_hash(RHASH_AICH, 0, 9728000 + 1, "HL3TFXORIUEPXUWFPY3JLR7SMKGTO4IH");
605
613
#if 0
606
 
  test_long_zero_msg(RHASH_ED2K, 9728000 * 5, "3B613901DABA54F6C0671793E28A1205");
607
 
  test_long_zero_msg(RHASH_AICH, 9728000 * 5, "EZCO3XF2RJ4FERRDEXGOSSRGL5NA5BBM");
 
614
        assert_rep_hash(RHASH_ED2K, 0, 9728000 * 5, "3B613901DABA54F6C0671793E28A1205");
 
615
        assert_rep_hash(RHASH_AICH, 0, 9728000 * 5, "EZCO3XF2RJ4FERRDEXGOSSRGL5NA5BBM");
608
616
#endif
609
617
}
610
618
 
613
621
 */
614
622
static void test_alignment(void)
615
623
{
616
 
  int i, start, hash_id, alignment_size;
617
 
 
618
 
  /* loop by sums */
619
 
  for(i = 0, hash_id = 1; (hash_id & RHASH_ALL_HASHES); hash_id <<= 1, i++) {
620
 
    char expected_hash[130];
621
 
    assert(rhash_get_digest_size(hash_id) < (int)sizeof(expected_hash));
622
 
 
623
 
    alignment_size = (hash_id & (RHASH_TTH | RHASH_TIGER | RHASH_WHIRLPOOL | RHASH_SHA512) ? 8 : 4);
624
 
 
625
 
    /* start message with different alignment */
626
 
    for(start = 0; start < alignment_size; start++) {
627
 
      char message[30];
628
 
      char* obtained;
629
 
      int j, msg_length = 11 + alignment_size;
630
 
 
631
 
      /* fill the buffer fifth shifted letter sequence */
632
 
      for(j = 0; j < msg_length; j++) message[start + j] = 'a' + j;
633
 
      message[start + j] = 0;
634
 
 
635
 
      obtained = calc_sum(message + start, hash_id);
636
 
 
637
 
      if(start == 0) {
638
 
        /* save original sum */
639
 
        strcpy(expected_hash, obtained);
640
 
      } else {
641
 
        /* verify sum result */
642
 
        assert_equals(obtained, expected_hash, rhash_get_name(hash_id), message);
643
 
        fflush(stdout);
644
 
      }
645
 
    }
646
 
  }
 
624
        int i, start, hash_id, alignment_size;
 
625
 
 
626
        /* loop by sums */
 
627
        for(i = 0, hash_id = 1; (hash_id & RHASH_ALL_HASHES); hash_id <<= 1, i++) {
 
628
                char expected_hash[130];
 
629
                assert(rhash_get_digest_size(hash_id) < (int)sizeof(expected_hash));
 
630
 
 
631
                alignment_size = (hash_id & (RHASH_TTH | RHASH_TIGER | RHASH_WHIRLPOOL | RHASH_SHA512) ? 8 : 4);
 
632
 
 
633
                /* start message with different alignment */
 
634
                for(start = 0; start < alignment_size; start++) {
 
635
                        char message[30];
 
636
                        int j, msg_length = 11 + alignment_size;
 
637
 
 
638
                        /* fill the buffer fifth shifted letter sequence */
 
639
                        for(j = 0; j < msg_length; j++) message[start + j] = 'a' + j;
 
640
                        message[start + j] = 0;
 
641
 
 
642
                        if(start == 0) {
 
643
                                /* save original hash value */
 
644
                                strcpy(expected_hash, hash_message(hash_id, message + start));
 
645
                        } else {
 
646
                                /* verify obtained hash value */
 
647
                                assert_hash(hash_id, message + start, expected_hash);
 
648
                        }
 
649
                }
 
650
        }
 
651
}
 
652
 
 
653
/**
 
654
 * Verify processor endianness detected at compile-time against
 
655
 * with the actual cpu endianness in runtime.
 
656
 */
 
657
static void test_endianness(void)
 
658
{
 
659
        unsigned tmp = 1;
 
660
        if(*(char*)&tmp == IS_BIG_ENDIAN) {
 
661
                log_message("error: wrong endianness detected at compile time\n");
 
662
                g_errors++;
 
663
        }
647
664
}
648
665
 
649
666
/**
654
671
 */
655
672
static unsigned find_hash(const char* name)
656
673
{
657
 
  char buf[30];
658
 
  unsigned hash_id;
659
 
  int i;
660
 
 
661
 
  if(strlen(name) > (sizeof(buf) - 1)) return 0;
662
 
  for(i = 0; name[i]; i++) buf[i] = toupper(name[i]);
663
 
  buf[i] = 0;
664
 
 
665
 
  for(hash_id = 1; (hash_id & RHASH_ALL_HASHES); hash_id <<= 1) {
666
 
    if(strcmp(buf, rhash_get_name(hash_id)) == 0) return hash_id;
667
 
  }
668
 
  return 0;
 
674
        char buf[30];
 
675
        unsigned hash_id;
 
676
        int i;
 
677
 
 
678
        if(strlen(name) > (sizeof(buf) - 1)) return 0;
 
679
        for(i = 0; name[i]; i++) buf[i] = toupper(name[i]);
 
680
        buf[i] = 0;
 
681
 
 
682
        for(hash_id = 1; (hash_id & RHASH_ALL_HASHES); hash_id <<= 1) {
 
683
                if(strcmp(buf, rhash_get_name(hash_id)) == 0) return hash_id;
 
684
        }
 
685
        return 0;
669
686
}
670
687
 
671
688
/* define program entry point */
680
697
 */
681
698
int main(int argc, char *argv[])
682
699
{
683
 
  /* rhash_transmit(RMSG_SET_OPENSSL_MASK, 0, RHASH_ALL_HASHES, 0); */
 
700
        /* rhash_transmit(RMSG_SET_OPENSSL_MASK, 0, RHASH_ALL_HASHES, 0); */
684
701
 
685
702
#ifndef USE_RHASH_DLL
686
 
  rhash_library_init();
 
703
        rhash_library_init();
687
704
#endif
688
705
 
689
 
  test_endianness();
690
 
 
691
 
  if(argc > 1 && strcmp(argv[1], "--speed") == 0) {
692
 
    unsigned hash_id = (argc > 2 ? find_hash(argv[2]) : RHASH_SHA1);
693
 
    if(hash_id == 0) {
694
 
      fprintf(stderr, "error: unknown hash_id: %s\n", argv[2]);
695
 
      return 1;
696
 
    }
697
 
    test_known_strings(hash_id);
698
 
 
699
 
    run_benchmark(hash_id, 0, stdout);
700
 
  } else if(argc > 1 && strcmp(argv[1], "--flags") == 0) {
701
 
    printf("%s", compiler_flags);
702
 
  } else {
703
 
    test_all_known_strings();
704
 
    test_long_strings();
705
 
    test_alignment();
706
 
    if(n_errors == 0) printf("All sums are working properly!\n");
707
 
    fflush(stdout);
708
 
  }
709
 
 
710
 
  if(n_errors > 0) printf("%s", compiler_flags);
711
 
 
712
 
  return (n_errors == 0 ? 0 : 1);
 
706
        test_endianness();
 
707
 
 
708
        if(argc > 1 && strcmp(argv[1], "--speed") == 0) {
 
709
                unsigned hash_id = (argc > 2 ? find_hash(argv[2]) : RHASH_SHA1);
 
710
                if(hash_id == 0) {
 
711
                        fprintf(stderr, "error: unknown hash_id: %s\n", argv[2]);
 
712
                        return 1;
 
713
                }
 
714
                test_known_strings(hash_id);
 
715
 
 
716
                rhash_run_benchmark(hash_id, 0, stdout);
 
717
        } else if(argc > 1 && strcmp(argv[1], "--flags") == 0) {
 
718
                printf("%s", compiler_flags);
 
719
        } else {
 
720
                test_all_known_strings();
 
721
                test_long_strings();
 
722
                test_alignment();
 
723
                if(g_errors == 0) printf("All sums are working properly!\n");
 
724
                fflush(stdout);
 
725
        }
 
726
 
 
727
        if(g_errors > 0) printf("%s", compiler_flags);
 
728
 
 
729
        return (g_errors == 0 ? 0 : 1);
713
730
}
714
731
#else /* UNDER_CE */
715
732
 
724
741
 */
725
742
wchar_t *char2wchar(char* str)
726
743
{
727
 
  size_t origsize;
728
 
  wchar_t *wcstring;
 
744
        size_t origsize;
 
745
        wchar_t *wmsg;
729
746
 
730
 
  origsize = strlen(str) + 1;
731
 
  wcstring = (wchar_t*)malloc(origsize * 2);
732
 
  mbstowcs(wcstring, str, origsize);
733
 
  return wcstring;
 
747
        origsize = strlen(str) + 1;
 
748
        wmsg = (wchar_t*)malloc(origsize * 2);
 
749
        mbstowcs(wmsg, str, origsize);
 
750
        return wmsg;
734
751
}
735
752
 
736
753
/**
741
758
 */
742
759
int _tmain(int argc, _TCHAR* argv[])
743
760
{
744
 
  wchar_t *wcstring;
745
 
  (void)argc;
746
 
  (void)argv;
747
 
 
748
 
  test_known_strings();
749
 
  test_alignment();
750
 
 
751
 
  wcstring = char2wchar(g_msg ? g_msg : "Success!\r\nAll sums are working properly.");
752
 
  MessageBox(NULL, wcstring, _T("caption"), MB_OK|MB_ICONEXCLAMATION);
753
 
  free(wcstring);
754
 
 
755
 
  return (n_errors == 0 ? 0 : 1);
 
761
        wchar_t *wmsg;
 
762
        (void)argc;
 
763
        (void)argv;
 
764
 
 
765
        test_known_strings();
 
766
        test_alignment();
 
767
 
 
768
        wmsg = char2wchar(g_msg ? g_msg : "Success!\r\nAll sums are working properly.");
 
769
        MessageBox(NULL, wmsg, _T("caption"), MB_OK|MB_ICONEXCLAMATION);
 
770
        free(wmsg);
 
771
        free(g_msg);
 
772
 
 
773
        return (g_errors == 0 ? 0 : 1);
756
774
}
757
775
#endif /* UNDER_CE */