unit_sha512_256.c (36730B)
1 /* SPDX-License-Identifier: LGPL-2.1-or-later OR (GPL-2.0-or-later WITH eCos-exception-2.0) */ 2 3 /* 4 This file is part of GNU libmicrohttpd. 5 Copyright (C) 2025 Christian Grothoff 6 7 GNU libmicrohttpd is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public 9 License as published by the Free Software Foundation; either 10 version 2.1 of the License, or (at your option) any later version. 11 12 GNU libmicrohttpd is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 Lesser General Public License for more details. 16 17 Alternatively, you can redistribute GNU libmicrohttpd and/or 18 modify it under the terms of the GNU General Public License as 19 published by the Free Software Foundation; either version 2 of 20 the License, or (at your option) any later version, together 21 with the eCos exception, as follows: 22 23 As a special exception, if other files instantiate templates or 24 use macros or inline functions from this file, or you compile this 25 file and link it with other works to produce a work based on this 26 file, this file does not by itself cause the resulting work to be 27 covered by the GNU General Public License. However the source code 28 for this file must still be made available in accordance with 29 section (3) of the GNU General Public License v2. 30 31 This exception does not invalidate any other reasons why a work 32 based on this file might be covered by the GNU General Public 33 License. 34 35 You should have received copies of the GNU Lesser General Public 36 License and the GNU General Public License along with this library; 37 if not, see <https://www.gnu.org/licenses/>. 38 */ 39 40 /** 41 * @file src/test/unit/unit_sha512_256.c 42 * @brief The tests for SHA-512/256 43 * @author Karlson2k (Evgeny Grin) 44 * @author Christian Grothoff 45 */ 46 47 48 #include "mhd_sys_options.h" 49 50 #include <stdio.h> 51 #include <stdlib.h> 52 #include <string.h> 53 #include <stdint.h> 54 #include <stdbool.h> 55 56 #include "mhdt_has_param.h" 57 58 #if defined MHD_SHA512_256_EXTR_OPENSSL 59 #include "../mhd2/sha512_256_ext_openssl.c" 60 #elif defined MHD_SHA512_256_EXTR_MBEDTLS 61 #include "../mhd2/sha512_256_ext_mbedtls.c" 62 #else 63 #include "../mhd2/sha512_256_int.c" 64 #endif 65 66 #include "../mhd2/mhd_sha512_256.h" 67 68 #define SHA512_256_DIGEST_STRING_SIZE (mhd_SHA256_DIGEST_SIZE * 2 + 1) 69 70 /** 71 * Verbose output? 72 */ 73 static int verbose; 74 75 76 /* Helper function to convert hex string to binary */ 77 static size_t 78 hex2bin (const char *hex, 79 uint8_t *bin, 80 size_t max_len) 81 { 82 size_t len = strlen (hex) / 2; 83 if (len > max_len) 84 len = max_len; 85 86 for (size_t i = 0; i < len; i++) 87 { 88 sscanf (hex + 2 * i, "%2hhx", &bin[i]); 89 } 90 return len; 91 } 92 93 94 /* Helper function to compare digest with expected hex string */ 95 static unsigned int 96 check_digest (const uint8_t *digest, 97 size_t digest_len, 98 const char *expected_hex, 99 const char *test_name) 100 { 101 uint8_t expected[64]; 102 size_t expected_len = hex2bin (expected_hex, expected, sizeof(expected)); 103 104 if (expected_len != digest_len) 105 { 106 printf ("FAIL: %s - length mismatch\n", 107 test_name); 108 return 0; 109 } 110 111 if (memcmp (digest, expected, digest_len) != 0) 112 { 113 printf ("FAIL: %s\n", test_name); 114 printf (" Expected: %s\n", expected_hex); 115 printf (" Got: "); 116 for (size_t i = 0; i < digest_len; i++) 117 { 118 printf ("%02x", digest[i]); 119 } 120 printf ("\n"); 121 return 0; 122 } 123 124 if (verbose) 125 printf ("PASS: %s\n", 126 test_name); 127 return 1; 128 } 129 130 131 struct str_with_len 132 { 133 const char *const str; 134 const size_t len; 135 }; 136 137 #define D_STR_W_LEN(s) {(s), (sizeof((s)) / sizeof(char)) - 1} 138 139 struct data_unit1 140 { 141 const struct str_with_len str_l; 142 const uint8_t digest[mhd_SHA512_256_DIGEST_SIZE]; 143 }; 144 145 static const struct data_unit1 data_units1[] = { 146 {D_STR_W_LEN ("abc"), 147 {0x53, 0x04, 0x8E, 0x26, 0x81, 0x94, 0x1E, 0xF9, 0x9B, 0x2E, 0x29, 0xB7, 148 0x6B, 0x4C, 0x7D, 0xAB, 0xE4, 0xC2, 0xD0, 0xC6, 0x34, 0xFC, 0x6D, 0x46, 149 0xE0, 0xE2, 0xF1, 0x31, 0x07, 0xE7, 0xAF, 0x23}}, 150 {D_STR_W_LEN ("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhi" \ 151 "jklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"), 152 {0x39, 0x28, 0xE1, 0x84, 0xFB, 0x86, 0x90, 0xF8, 0x40, 0xDA, 0x39, 0x88, 153 0x12, 0x1D, 0x31, 0xBE, 0x65, 0xCB, 0x9D, 0x3E, 0xF8, 0x3E, 0xE6, 0x14, 154 0x6F, 0xEA, 0xC8, 0x61, 0xE1, 0x9B, 0x56, 0x3A}}, 155 {D_STR_W_LEN (""), /* The empty zero-size input */ 156 {0xc6, 0x72, 0xb8, 0xd1, 0xef, 0x56, 0xed, 0x28, 0xab, 0x87, 0xc3, 0x62, 157 0x2c, 0x51, 0x14, 0x06, 0x9b, 0xdd, 0x3a, 0xd7, 0xb8, 0xf9, 0x73, 0x74, 158 0x98, 0xd0, 0xc0, 0x1e, 0xce, 0xf0, 0x96, 0x7a}}, 159 {D_STR_W_LEN ("1234567890!@~%&$@#{}[]\\/!?`."), 160 {0xc8, 0x7c, 0x5a, 0x55, 0x27, 0x77, 0x1b, 0xe7, 0x69, 0x3c, 0x50, 0x79, 161 0x32, 0xad, 0x7c, 0x79, 0xe9, 0x60, 0xa0, 0x18, 0xb7, 0x78, 0x2b, 0x6f, 162 0xa9, 0x7b, 0xa3, 0xa0, 0xb5, 0x18, 0x17, 0xa5}}, 163 {D_STR_W_LEN ("Simple string."), 164 {0xde, 0xcb, 0x3c, 0x81, 0x65, 0x4b, 0xa0, 0xf5, 0xf0, 0x45, 0x6b, 0x7e, 165 0x61, 0xf5, 0x0d, 0xf5, 0x38, 0xa4, 0xfc, 0xb1, 0x8a, 0x95, 0xff, 0x59, 166 0xbc, 0x04, 0x82, 0xcf, 0x23, 0xb2, 0x32, 0x56}}, 167 {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz"), 168 {0xfc, 0x31, 0x89, 0x44, 0x3f, 0x9c, 0x26, 0x8f, 0x62, 0x6a, 0xea, 0x08, 169 0xa7, 0x56, 0xab, 0xe7, 0xb7, 0x26, 0xb0, 0x5f, 0x70, 0x1c, 0xb0, 0x82, 170 0x22, 0x31, 0x2c, 0xcf, 0xd6, 0x71, 0x0a, 0x26, }}, 171 {D_STR_W_LEN ("zyxwvutsrqponMLKJIHGFEDCBA"), 172 {0xd2, 0x6d, 0x24, 0x81, 0xa4, 0xf9, 0x0a, 0x72, 0xd2, 0x7f, 0xc1, 0xac, 173 0xac, 0xe1, 0xc0, 0x6b, 0x39, 0x94, 0xac, 0x73, 0x50, 0x2e, 0x27, 0x97, 174 0xa3, 0x65, 0x37, 0x4e, 0xbb, 0x5c, 0x27, 0xe9}}, 175 {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyzzyxwvutsrqponMLKJIHGFEDCBA" \ 176 "abcdefghijklmnopqrstuvwxyzzyxwvutsrqponMLKJIHGFEDCBA"), 177 {0xad, 0xe9, 0x5d, 0x55, 0x3b, 0x9e, 0x45, 0x69, 0xdb, 0x53, 0xa4, 0x04, 178 0x92, 0xe7, 0x87, 0x94, 0xff, 0xc9, 0x98, 0x5f, 0x93, 0x03, 0x86, 0x45, 179 0xe1, 0x97, 0x17, 0x72, 0x7c, 0xbc, 0x31, 0x15}}, 180 {D_STR_W_LEN ("/long/long/long/long/long/long/long/long/long/long/long" \ 181 "/long/long/long/long/long/long/long/long/long/long/long" \ 182 "/long/long/long/long/long/long/long/long/long/long/long" \ 183 "/long/long/long/long/long/long/long/long/long/long/long" \ 184 "/long/long/long/long/long/long/long/long/long/long/long" \ 185 "/long/long/long/long/long/long/long/long/long/long/long" \ 186 "/long/long/long/long/path?with%20some=parameters"), 187 {0xbc, 0xab, 0xc6, 0x2c, 0x0a, 0x22, 0xd5, 0xcb, 0xac, 0xac, 0xe9, 0x25, 188 0xcf, 0xce, 0xaa, 0xaf, 0x0e, 0xa1, 0xed, 0x42, 0x46, 0x8a, 0xe2, 0x01, 189 0xee, 0x2f, 0xdb, 0x39, 0x75, 0x47, 0x73, 0xf1}} 190 }; 191 192 static const size_t units1_num = sizeof(data_units1) / sizeof(data_units1[0]); 193 194 struct bin_with_len 195 { 196 const uint8_t bin[512]; 197 const size_t len; 198 }; 199 200 struct data_unit2 201 { 202 const struct bin_with_len bin_l; 203 const uint8_t digest[mhd_SHA512_256_DIGEST_SIZE]; 204 }; 205 206 /* Size must be less than 512 bytes! */ 207 static const struct data_unit2 data_units2[] = { 208 { { {97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 209 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122}, 26}, /* a..z ASCII sequence */ 210 {0xfc, 0x31, 0x89, 0x44, 0x3f, 0x9c, 0x26, 0x8f, 0x62, 0x6a, 0xea, 0x08, 211 0xa7, 0x56, 0xab, 0xe7, 0xb7, 0x26, 0xb0, 0x5f, 0x70, 0x1c, 0xb0, 0x82, 212 0x22, 0x31, 0x2c, 0xcf, 0xd6, 0x71, 0x0a, 0x26}}, 213 { { {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 214 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 215 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 216 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, 217 72 }, /* 'A' x 72 times */ 218 {0x36, 0x5d, 0x41, 0x0e, 0x55, 0xd1, 0xfd, 0xe6, 0xc3, 0xb8, 0x68, 0xcc, 219 0xed, 0xeb, 0xcd, 0x0d, 0x2e, 0x34, 0xb2, 0x5c, 0xdf, 0xe7, 0x79, 0xe2, 220 0xe9, 0x65, 0x07, 0x33, 0x78, 0x0d, 0x01, 0x89}}, 221 { { {19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 222 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 223 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 224 73}, 55}, /* 19..73 sequence */ 225 {0xb9, 0xe5, 0x74, 0x11, 0xbf, 0xa2, 0x0e, 0x98, 0xbe, 0x08, 0x69, 0x2e, 226 0x17, 0x9e, 0xc3, 0xfe, 0x61, 0xe3, 0x7a, 0x80, 0x2e, 0x25, 0x8c, 0xf3, 227 0x76, 0xda, 0x9f, 0x5f, 0xcd, 0x87, 0x48, 0x0d}}, 228 { { {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 229 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 230 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 231 62, 63, 64, 65, 66, 67, 68, 69}, 63}, /* 7..69 sequence */ 232 {0x80, 0x15, 0x83, 0xed, 0x7d, 0xef, 0x9f, 0xdf, 0xfb, 0x83, 0x1f, 0xc5, 233 0x8b, 0x50, 0x37, 0x81, 0x00, 0xc3, 0x4f, 0xfd, 0xfe, 0xc2, 0x9b, 0xaf, 234 0xfe, 0x15, 0x66, 0xe5, 0x08, 0x42, 0x5e, 0xae}}, 235 { { {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 236 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 237 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 238 92}, 55}, /* 38..92 sequence */ 239 {0x76, 0x2f, 0x27, 0x4d, 0xfa, 0xd5, 0xa9, 0x21, 0x4e, 0xe9, 0x56, 0x22, 240 0x54, 0x38, 0x71, 0x3e, 0xef, 0x14, 0xa9, 0x22, 0x37, 0xf3, 0xb0, 0x50, 241 0x3d, 0x95, 0x40, 0xb7, 0x08, 0x64, 0xa9, 0xfd}}, 242 { { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 243 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 244 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 245 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72}, 72}, /* 1..72 sequence */ 246 {0x3f, 0x5c, 0xd3, 0xec, 0x40, 0xc4, 0xb9, 0x78, 0x35, 0x57, 0xc6, 0x4f, 247 0x3e, 0x46, 0x82, 0xdc, 0xd4, 0x46, 0x11, 0xd0, 0xb3, 0x0a, 0xbb, 0x89, 248 0xf1, 0x1d, 0x34, 0xb5, 0xf9, 0xd5, 0x10, 0x35}}, 249 { { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 250 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 251 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 252 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 253 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 254 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 255 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 256 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 257 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 258 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 259 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 260 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 261 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 262 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 263 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 264 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 265 249, 250, 251, 252, 253, 254, 255}, 256}, /* 0..255 sequence */ 266 {0x08, 0x37, 0xa1, 0x1d, 0x99, 0x4d, 0x5a, 0xa8, 0x60, 0xd0, 0x69, 0x17, 267 0xa8, 0xa0, 0xf6, 0x3e, 0x31, 0x11, 0xb9, 0x56, 0x33, 0xde, 0xeb, 0x15, 268 0xee, 0xd9, 0x94, 0x93, 0x76, 0xf3, 0x7d, 0x36, }}, 269 { { {199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 270 185, 184, 183, 182, 181, 180, 271 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 272 165, 164, 163, 162, 161, 160, 273 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 274 145, 144, 143, 142, 141, 140, 275 139}, 61}, /* 199..139 sequence */ 276 {0xcf, 0x21, 0x4b, 0xb2, 0xdd, 0x40, 0x98, 0xdf, 0x3a, 0xb7, 0x21, 0xb4, 277 0x69, 0x0e, 0x19, 0x36, 0x24, 0xa9, 0xbe, 0x30, 0xf7, 0xd0, 0x75, 0xb0, 278 0x39, 0x94, 0x82, 0xda, 0x55, 0x97, 0xe4, 0x79}}, 279 { { {255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 280 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 281 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 282 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 283 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 284 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 285 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 286 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 287 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 288 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 289 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 290 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 291 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 292 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 293 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 294 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 295 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, 255}, /* 255..1 sequence */ 296 {0x22, 0x31, 0xf2, 0xa1, 0xb4, 0x89, 0xb2, 0x44, 0xf7, 0x66, 0xa0, 0xb8, 297 0x31, 0xed, 0xb7, 0x73, 0x8a, 0x34, 0xdc, 0x11, 0xc8, 0x2c, 0xf2, 0xb5, 298 0x88, 0x60, 0x39, 0x6b, 0x5c, 0x06, 0x70, 0x37}}, 299 { { {41, 35, 190, 132, 225, 108, 214, 174, 82, 144, 73, 241, 241, 187, 233, 300 235, 179, 166, 219, 60, 135, 12, 62, 153, 36, 94, 13, 28, 6, 183, 71, 301 222, 179, 18, 77, 200, 67, 187, 139, 166, 31, 3, 90, 125, 9, 56, 37, 302 31, 93, 212, 203, 252, 150, 245, 69, 59, 19, 13, 137, 10, 28, 219, 174, 303 50, 32, 154, 80, 238, 64, 120, 54, 253, 18, 73, 50, 246, 158, 125, 73, 304 220, 173, 79, 20, 242, 68, 64, 102, 208, 107, 196, 48, 183, 50, 59, 305 161, 34, 246, 34, 145, 157, 225, 139, 31, 218, 176, 202, 153, 2, 185, 306 114, 157, 73, 44, 128, 126, 197, 153, 213, 233, 128, 178, 234, 201, 307 204, 83, 191, 103, 214, 191, 20, 214, 126, 45, 220, 142, 102, 131, 239, 308 87, 73, 97, 255, 105, 143, 97, 205, 209, 30, 157, 156, 22, 114, 114, 309 230, 29, 240, 132, 79, 74, 119, 2, 215, 232, 57, 44, 83, 203, 201, 18, 310 30, 51, 116, 158, 12, 244, 213, 212, 159, 212, 164, 89, 126, 53, 207, 311 50, 34, 244, 204, 207, 211, 144, 45, 72, 211, 143, 117, 230, 217, 29, 312 42, 229, 192, 247, 43, 120, 129, 135, 68, 14, 95, 80, 0, 212, 97, 141, 313 190, 123, 5, 21, 7, 59, 51, 130, 31, 24, 112, 146, 218, 100, 84, 206, 314 177, 133, 62, 105, 21, 248, 70, 106, 4, 150, 115, 14, 217, 22, 47, 103, 315 104, 212, 247, 74, 74, 208, 87, 104}, 255}, /* pseudo-random data */ 316 {0xb8, 0xdb, 0x2c, 0x2e, 0xf3, 0x12, 0x77, 0x14, 0xf9, 0x34, 0x2d, 0xfa, 317 0xda, 0x42, 0xbe, 0xfe, 0x67, 0x3a, 0x8a, 0xf6, 0x71, 0x36, 0x00, 0xff, 318 0x77, 0xa5, 0x83, 0x14, 0x55, 0x2a, 0x05, 0xaf}}, 319 { { {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 320 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 321 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 322 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 323 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 324 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 325 66, 66}, 110}, /* 'B' x 110 times */ 326 {0xc8, 0x9e, 0x0d, 0x8f, 0x7b, 0x35, 0xfd, 0x3e, 0xdc, 0x90, 0x87, 0x64, 327 0x45, 0x94, 0x94, 0x21, 0xb3, 0x8e, 0xb5, 0xc7, 0x54, 0xc8, 0xee, 0xde, 328 0xfc, 0x77, 0xd6, 0xe3, 0x9f, 0x81, 0x8e, 0x78}}, 329 { { {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 330 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 331 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 332 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 333 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 334 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 335 67, 67, 67}, 111}, /* 'C' x 111 times */ 336 {0x86, 0xca, 0x6d, 0x2a, 0x72, 0xe2, 0x8c, 0x17, 0x89, 0x86, 0x89, 0x1b, 337 0x36, 0xf9, 0x6d, 0xda, 0x8c, 0xd6, 0x30, 0xb2, 0xd3, 0x60, 0x39, 0xfb, 338 0xc9, 0x04, 0xc5, 0x11, 0xcd, 0x2d, 0xe3, 0x62}}, 339 { { {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 340 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 341 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 342 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 343 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 344 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 345 68, 68, 68, 68}, 112}, /* 'D' x 112 times */ 346 {0xdf, 0x9d, 0x4a, 0xcf, 0x81, 0x0d, 0x3a, 0xd4, 0x8e, 0xa4, 0x65, 0x9e, 347 0x1e, 0x15, 0xe4, 0x15, 0x1b, 0x37, 0xb6, 0xeb, 0x17, 0xab, 0xf6, 0xb1, 348 0xbc, 0x30, 0x46, 0x34, 0x24, 0x56, 0x1c, 0x06}}, 349 { { {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 350 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 351 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 352 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 353 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 354 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 355 69, 69, 69, 69, 69}, 113}, /* 'E' x 113 times */ 356 {0xa5, 0xf1, 0x47, 0x74, 0xf8, 0x2b, 0xed, 0x23, 0xe4, 0x10, 0x59, 0x8f, 357 0x7e, 0xb1, 0x30, 0xe5, 0x7e, 0xd1, 0x4b, 0xbc, 0x72, 0x58, 0x58, 0x81, 358 0xbb, 0xa0, 0xa5, 0xb6, 0x15, 0x39, 0x49, 0xa1}}, 359 { { {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 360 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 361 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 362 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 363 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 364 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 365 70, 70, 70, 70, 70, 70}, 114}, /* 'F' x 114 times */ 366 {0xe6, 0xa3, 0xc9, 0x63, 0xd5, 0x28, 0x6e, 0x2d, 0xfb, 0x71, 0xdf, 0xd4, 367 0xff, 0xc2, 0xd4, 0x2b, 0x5d, 0x9b, 0x76, 0x28, 0xd2, 0xcb, 0x15, 0xc8, 368 0x81, 0x57, 0x14, 0x09, 0xc3, 0x8e, 0x92, 0xce}}, 369 { { {76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 370 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 371 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 372 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 373 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 374 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 375 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 376 76}, 127}, /* 'L' x 127 times */ 377 {0x5d, 0x18, 0xff, 0xd7, 0xbe, 0x23, 0xb2, 0xb2, 0xbd, 0xe3, 0x13, 0x12, 378 0x1c, 0x16, 0x89, 0x14, 0x4a, 0x42, 0xb4, 0x3f, 0xab, 0xc8, 0x41, 0x14, 379 0x62, 0x00, 0xb5, 0x53, 0xa7, 0xd6, 0xd5, 0x35}}, 380 { { {77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 381 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 382 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 383 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 384 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 385 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 386 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 387 77, 77}, 128}, /* 'M' x 128 times */ 388 {0x6e, 0xf0, 0xda, 0x81, 0x3d, 0x50, 0x1d, 0x31, 0xf1, 0x4a, 0xf8, 0xd9, 389 0x7d, 0xd2, 0x13, 0xdd, 0xa4, 0x46, 0x15, 0x0b, 0xb8, 0x5a, 0x8a, 0xc6, 390 0x1e, 0x3a, 0x1f, 0x21, 0x35, 0xa2, 0xbb, 0x4f}}, 391 { { {78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 392 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 393 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 394 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 395 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 396 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 397 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 398 78, 78, 78}, 129}, /* 'N' x 129 times */ 399 {0xee, 0xce, 0xd5, 0x34, 0xab, 0x14, 0x13, 0x9e, 0x8f, 0x5c, 0xb4, 0xef, 400 0xac, 0xaf, 0xc5, 0xeb, 0x1d, 0x2f, 0xe3, 0xc5, 0xca, 0x09, 0x29, 0x96, 401 0xfa, 0x84, 0xff, 0x12, 0x26, 0x6a, 0x50, 0x49}}, 402 { { {97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 403 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 404 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 405 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 406 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 407 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 408 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 409 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 410 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 411 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 412 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 413 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 414 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 415 97, 97, 97, 97}, 238}, /* 'a' x 238 times */ 416 {0xb4, 0x24, 0xe5, 0x7b, 0xa7, 0x37, 0xe3, 0xc4, 0xac, 0x35, 0x21, 0x17, 417 0x98, 0xec, 0xb9, 0xae, 0x45, 0x13, 0x24, 0xa4, 0x2c, 0x76, 0xae, 0x7d, 418 0x17, 0x75, 0x27, 0x8a, 0xaa, 0x4a, 0x48, 0x60}}, 419 { { {98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 420 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 421 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 422 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 423 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 424 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 425 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 426 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 427 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 428 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 429 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 430 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 431 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 432 98, 98, 98, 98, 98}, 239}, /* 'b' x 239 times */ 433 {0xcd, 0x93, 0xb8, 0xab, 0x6a, 0x74, 0xbd, 0x34, 0x8c, 0x43, 0x76, 0x0c, 434 0x2a, 0xd0, 0x6e, 0xd8, 0x76, 0xcf, 0xdf, 0x2a, 0x21, 0x04, 0xfb, 0xf6, 435 0x16, 0x53, 0x68, 0xf6, 0x10, 0xc3, 0xa1, 0xac}}, 436 { { {99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 437 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 438 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 439 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 440 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 441 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 442 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 443 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 444 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 445 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 446 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 447 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 448 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 449 99, 99, 99, 99, 99, 99}, 240}, /* 'c' x 240 times */ 450 {0x5f, 0x60, 0xea, 0x44, 0xb6, 0xc6, 0x9e, 0xfe, 0xfc, 0x0e, 0x6a, 0x0a, 451 0x99, 0x40, 0x1b, 0x61, 0x43, 0x58, 0xba, 0x4a, 0x0a, 0xee, 0x6b, 0x52, 452 0x10, 0xdb, 0x32, 0xd9, 0x7f, 0x12, 0xba, 0x70}}, 453 { { {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 454 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 455 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 456 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 457 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 458 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 459 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 460 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 461 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 462 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 463 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 464 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 465 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 466 48, 48, 48, 48, 48, 48, 48}, 241}, /* '0' x 241 times */ 467 {0x3c, 0xcb, 0xcf, 0x50, 0x79, 0xd5, 0xb6, 0xf5, 0xbf, 0x25, 0x07, 0xfb, 468 0x4d, 0x1f, 0xa3, 0x77, 0xc3, 0x6f, 0xe8, 0xe3, 0xc4, 0x4b, 0xf8, 0xcd, 469 0x90, 0x93, 0xf1, 0x3e, 0x08, 0x09, 0xa7, 0x69}} 470 }; 471 472 static const size_t units2_num = sizeof(data_units2) / sizeof(data_units2[0]); 473 474 475 /* 476 * Helper functions 477 */ 478 479 /** 480 * Print bin as hex 481 * 482 * @param bin binary data 483 * @param len number of bytes in bin 484 * @param hex pointer to len*2+1 bytes buffer 485 */ 486 static void 487 bin2hex (const uint8_t *bin, 488 size_t len, 489 char *hex) 490 { 491 while (len-- > 0) 492 { 493 unsigned int b1, b2; 494 b1 = (*bin >> 4) & 0xf; 495 *hex++ = (char) ((b1 > 9) ? (b1 + 'A' - 10) : (b1 + '0')); 496 b2 = *bin++ & 0xf; 497 *hex++ = (char) ((b2 > 9) ? (b2 + 'A' - 10) : (b2 + '0')); 498 } 499 *hex = 0; 500 } 501 502 503 static unsigned int 504 check_result (const char *test_name, 505 unsigned int check_num, 506 const uint8_t calculated[mhd_SHA512_256_DIGEST_SIZE], 507 const uint8_t expected[mhd_SHA512_256_DIGEST_SIZE]) 508 { 509 bool failed = (0 != memcmp (calculated, 510 expected, 511 mhd_SHA512_256_DIGEST_SIZE)); 512 513 check_num++; /* Print 1-based numbers */ 514 if (failed) 515 { 516 char calc_str[mhd_SHA512_256_DIGEST_SIZE * 2 + 1]; 517 char expc_str[mhd_SHA512_256_DIGEST_SIZE * 2 + 1]; 518 bin2hex (calculated, mhd_SHA512_256_DIGEST_SIZE, calc_str); 519 bin2hex (expected, mhd_SHA512_256_DIGEST_SIZE, expc_str); 520 fprintf (stderr, 521 "FAILED: %s check %u: calculated digest %s, expected digest %s.\n", 522 test_name, check_num, calc_str, expc_str); 523 fflush (stderr); 524 return 1; 525 } 526 if (verbose) 527 { 528 char calc_str[mhd_SHA512_256_DIGEST_SIZE * 2 + 1]; 529 bin2hex (calculated, mhd_SHA512_256_DIGEST_SIZE, calc_str); 530 printf ("PASSED: %s check %u: calculated digest %s matches " \ 531 "expected digest.\n", 532 test_name, check_num, calc_str); 533 fflush (stdout); 534 } 535 return 0; 536 } 537 538 539 /* 540 * Tests 541 */ 542 543 /* Calculated SHA-512/256 as one pass for whole data */ 544 static unsigned int 545 test1_str (void) 546 { 547 unsigned int num_failed = 0; 548 unsigned int i; 549 struct mhd_Sha512_256Ctx ctx; 550 551 for (i = 0; i < units1_num; i++) 552 { 553 uint8_t digest[mhd_SHA512_256_DIGEST_SIZE]; 554 555 mhd_SHA512_256_init_one_time (&ctx); 556 if (0 != data_units1[i].str_l.len) 557 mhd_SHA512_256_update (&ctx, 558 data_units1[i].str_l.len, 559 (const uint8_t *) data_units1[i].str_l.str); 560 mhd_SHA512_256_finish_reset (&ctx, 561 digest); 562 num_failed += check_result (MHD_FUNC_, 563 i, 564 digest, 565 data_units1[i].digest); 566 mhd_SHA512_256_deinit (&ctx); 567 } 568 return num_failed; 569 } 570 571 572 static unsigned int 573 test1_bin (void) 574 { 575 unsigned int num_failed = 0; 576 unsigned int i; 577 struct mhd_Sha512_256Ctx ctx; 578 579 for (i = 0; i < units2_num; i++) 580 { 581 uint8_t digest[mhd_SHA512_256_DIGEST_SIZE]; 582 583 mhd_SHA512_256_init_one_time (&ctx); 584 mhd_SHA512_256_update (&ctx, 585 data_units2[i].bin_l.len, 586 data_units2[i].bin_l.bin); 587 mhd_SHA512_256_finish_reset (&ctx, 588 digest); 589 num_failed += check_result (MHD_FUNC_, 590 i, 591 digest, 592 data_units2[i].digest); 593 mhd_SHA512_256_deinit (&ctx); 594 } 595 return num_failed; 596 } 597 598 599 /* Calculated SHA-512/256 as two iterations for whole data */ 600 static unsigned int 601 test2_str (void) 602 { 603 unsigned int num_failed = 0; 604 unsigned int i; 605 struct mhd_Sha512_256Ctx ctx; 606 607 for (i = 0; i < units1_num; i++) 608 { 609 uint8_t digest[mhd_SHA512_256_DIGEST_SIZE]; 610 size_t part_s = data_units1[i].str_l.len / 4; 611 612 mhd_SHA512_256_init_one_time (&ctx); 613 if (0 != part_s) 614 mhd_SHA512_256_update (&ctx, 615 part_s, 616 (const uint8_t *) data_units1[i].str_l.str); 617 if (data_units1[i].str_l.len != part_s) 618 mhd_SHA512_256_update (&ctx, 619 data_units1[i].str_l.len - part_s, 620 (const uint8_t *) data_units1[i].str_l.str + part_s 621 ); 622 mhd_SHA512_256_finish_reset (&ctx, 623 digest); 624 num_failed += check_result (MHD_FUNC_, 625 i, 626 digest, 627 data_units1[i].digest); 628 mhd_SHA512_256_deinit (&ctx); 629 } 630 return num_failed; 631 } 632 633 634 static unsigned int 635 test2_bin (void) 636 { 637 unsigned int num_failed = 0; 638 unsigned int i; 639 struct mhd_Sha512_256Ctx ctx; 640 641 for (i = 0; i < units2_num; i++) 642 { 643 uint8_t digest[mhd_SHA512_256_DIGEST_SIZE]; 644 size_t part_s = data_units2[i].bin_l.len * 2 / 3; 645 646 mhd_SHA512_256_init_one_time (&ctx); 647 mhd_SHA512_256_update (&ctx, 648 part_s, 649 data_units2[i].bin_l.bin); 650 mhd_SHA512_256_update (&ctx, 651 data_units2[i].bin_l.len - part_s, 652 data_units2[i].bin_l.bin + part_s); 653 mhd_SHA512_256_finish_reset (&ctx, 654 digest); 655 num_failed += check_result (MHD_FUNC_, 656 i, 657 digest, 658 data_units2[i].digest); 659 mhd_SHA512_256_deinit (&ctx); 660 } 661 return num_failed; 662 } 663 664 665 /* Use data set number 7 as it has the longest sequence */ 666 #define DATA_POS 6 667 #define MAX_OFFSET 63 668 669 static unsigned int 670 test_unaligned (void) 671 { 672 unsigned int num_failed = 0; 673 unsigned int offset; 674 uint8_t *buf; 675 uint8_t *digest_buf; 676 struct mhd_Sha512_256Ctx ctx; 677 const struct data_unit2 *const tdata = data_units2 + DATA_POS; 678 679 buf = (uint8_t *) malloc (tdata->bin_l.len + MAX_OFFSET); 680 digest_buf = (uint8_t *) malloc (mhd_SHA512_256_DIGEST_SIZE + MAX_OFFSET); 681 if ((NULL == buf) || (NULL == digest_buf)) 682 exit (99); 683 684 for (offset = MAX_OFFSET; offset >= 1; --offset) 685 { 686 uint8_t *unaligned_digest; 687 uint8_t *unaligned_buf; 688 689 unaligned_buf = buf + offset; 690 memcpy (unaligned_buf, 691 tdata->bin_l.bin, 692 tdata->bin_l.len); 693 unaligned_digest = digest_buf + MAX_OFFSET - offset; 694 memset (unaligned_digest, 695 0, 696 mhd_SHA512_256_DIGEST_SIZE); 697 mhd_SHA512_256_init_one_time (&ctx); 698 mhd_SHA512_256_update (&ctx, 699 tdata->bin_l.len, 700 unaligned_buf); 701 mhd_SHA512_256_finish_reset (&ctx, 702 unaligned_digest); 703 num_failed += check_result (MHD_FUNC_, 704 MAX_OFFSET - offset, 705 unaligned_digest, 706 tdata->digest); 707 mhd_SHA512_256_deinit (&ctx); 708 } 709 free (digest_buf); 710 free (buf); 711 return num_failed; 712 } 713 714 715 int 716 main (int argc, 717 char **argv) 718 { 719 struct Test 720 { 721 const char *name; 722 const char *input; 723 const char *digest; 724 } tests[] = { 725 { 726 "Empty string (https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/shs/shabytetestvectors.zip)", 727 "", 728 "c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a" 729 }, 730 { 731 "abc", 732 "616263", 733 "53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23" 734 }, 735 { 736 "896-bit message abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 737 "61626364656667686263646566676869636465666768696a6465666768696a6b65666768696a6b6c666768696a6b6c6d6768696a6b6c6d6e68696a6b6c6d6e6f696a6b6c6d6e6f706a6b6c6d6e6f70716b6c6d6e6f7071726c6d6e6f707172736d6e6f70717273746e6f707172737475", 738 "3928e184fb8690f840da3988121d31be65cb9d3ef83ee6146feac861e19b563a" 739 }, 740 { 741 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 742 "6162636462636465636465666465666765666768666768696768696a68696a6b696a6b6c6a6b6c6d6b6c6d6e6c6d6e6f6d6e6f706e6f7071", 743 "bde8e1f9f19bb9fd3406c90ec6bc47bd36d8ada9f11880dbc8a22a7078b6a461" 744 }, 745 { 746 "One byte 0x00", 747 "00", 748 "10baad1713566ac2333467bddb0597dec9066120dd72ac2dcb8394221dcbe43d" 749 }, 750 { 751 "The quick brown fox jumps over the lazy dog", 752 "54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67", 753 "dd9d67b371519c339ed8dbd25af90e976a1eeefd4ad3d889005e532fc5bef04d" 754 }, 755 { NULL, NULL, NULL } 756 }; 757 struct mhd_Sha512_256Ctx ctx; 758 uint8_t digest[mhd_SHA512_256_DIGEST_SIZE]; 759 uint8_t data[1024]; 760 size_t data_len; 761 unsigned int passed = 0; 762 unsigned int total = 0; 763 unsigned int num_failed; 764 765 if (mhdt_has_param (argc, argv, "-v") || 766 mhdt_has_param (argc, argv, "--verbose")) 767 verbose = 1; 768 769 770 while (NULL != tests[total].name) 771 { 772 const struct Test *t = &tests[total]; 773 774 mhd_SHA512_256_init_one_time (&ctx); 775 if (! mhd_SHA512_256_has_err (&ctx)) 776 { 777 data_len = hex2bin (t->input, 778 data, 779 sizeof(data)); 780 if (0 != data_len) 781 mhd_SHA512_256_update (&ctx, 782 data_len, 783 data); 784 mhd_SHA512_256_finish_deinit (&ctx, 785 digest); 786 if (! mhd_SHA512_256_has_err (&ctx)) 787 { 788 if (check_digest (digest, 789 mhd_SHA512_256_DIGEST_SIZE, 790 t->digest, 791 t->name)) 792 passed++; 793 } 794 else 795 { 796 printf ("FAIL: %s - error in finish\n", 797 t->name); 798 } 799 } 800 else 801 { 802 printf ("FAIL: %s - error in init\n", 803 t->name); 804 } 805 mhd_SHA512_256_deinit (&ctx); 806 total++; 807 } 808 809 num_failed = total - passed; 810 811 num_failed += test1_str (); 812 num_failed += test1_bin (); 813 814 num_failed += test2_str (); 815 num_failed += test2_bin (); 816 817 num_failed += test_unaligned (); 818 819 if ((0 != num_failed) || verbose) 820 fprintf (stderr, 821 "Result: %u tests failed\n", 822 num_failed); 823 824 return (0 == num_failed) ? 0 : 1; 825 }