libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

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 }