libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

test_sha512_256.c (30116B)


      1 /*
      2   This file is part of libmicrohttpd
      3   Copyright (C) 2019-2022 Evgeny Grin (Karlson2k)
      4 
      5   This test tool is free software; you can redistribute it and/or
      6   modify it under the terms of the GNU General Public License as
      7   published by the Free Software Foundation; either version 2, or
      8   (at your option) any later version.
      9 
     10   This test tool is distributed in the hope that it will be useful,
     11   but WITHOUT ANY WARRANTY; without even the implied warranty of
     12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13   Lesser General Public License for more details.
     14 
     15   You should have received a copy of the GNU Lesser General Public
     16   License along with this library; if not, write to the Free Software
     17   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     18 */
     19 
     20 /**
     21  * @file microhttpd/test_sha512_256.h
     22  * @brief  Unit tests for SHA-512/256 functions
     23  * @author Karlson2k (Evgeny Grin)
     24  */
     25 
     26 #include "mhd_options.h"
     27 #include "sha512_256.h"
     28 #include "test_helpers.h"
     29 #include <stdio.h>
     30 #include <stdlib.h>
     31 
     32 static int verbose = 0; /* verbose level (0-1)*/
     33 
     34 
     35 struct str_with_len
     36 {
     37   const char *const str;
     38   const size_t len;
     39 };
     40 
     41 #define D_STR_W_LEN(s) {(s), (sizeof((s)) / sizeof(char)) - 1}
     42 
     43 struct data_unit1
     44 {
     45   const struct str_with_len str_l;
     46   const uint8_t digest[SHA512_256_DIGEST_SIZE];
     47 };
     48 
     49 static const struct data_unit1 data_units1[] = {
     50   {D_STR_W_LEN ("abc"),
     51    {0x53, 0x04, 0x8E, 0x26, 0x81, 0x94, 0x1E, 0xF9, 0x9B, 0x2E, 0x29, 0xB7,
     52     0x6B, 0x4C, 0x7D, 0xAB, 0xE4, 0xC2, 0xD0, 0xC6, 0x34, 0xFC, 0x6D, 0x46,
     53     0xE0, 0xE2, 0xF1, 0x31, 0x07, 0xE7, 0xAF, 0x23}},
     54   {D_STR_W_LEN ("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhi" \
     55                 "jklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"),
     56    {0x39, 0x28, 0xE1, 0x84, 0xFB, 0x86, 0x90, 0xF8, 0x40, 0xDA, 0x39, 0x88,
     57     0x12, 0x1D, 0x31, 0xBE, 0x65, 0xCB, 0x9D, 0x3E, 0xF8, 0x3E, 0xE6, 0x14,
     58     0x6F, 0xEA, 0xC8, 0x61, 0xE1, 0x9B, 0x56, 0x3A}},
     59   {D_STR_W_LEN (""), /* The empty zero-size input */
     60    {0xc6, 0x72, 0xb8, 0xd1, 0xef, 0x56, 0xed, 0x28, 0xab, 0x87, 0xc3, 0x62,
     61     0x2c, 0x51, 0x14, 0x06, 0x9b, 0xdd, 0x3a, 0xd7, 0xb8, 0xf9, 0x73, 0x74,
     62     0x98, 0xd0, 0xc0, 0x1e, 0xce, 0xf0, 0x96, 0x7a}},
     63   {D_STR_W_LEN ("1234567890!@~%&$@#{}[]\\/!?`."),
     64    {0xc8, 0x7c, 0x5a, 0x55, 0x27, 0x77, 0x1b, 0xe7, 0x69, 0x3c, 0x50, 0x79,
     65     0x32, 0xad, 0x7c, 0x79, 0xe9, 0x60, 0xa0, 0x18, 0xb7, 0x78, 0x2b, 0x6f,
     66     0xa9, 0x7b, 0xa3, 0xa0, 0xb5, 0x18, 0x17, 0xa5}},
     67   {D_STR_W_LEN ("Simple string."),
     68    {0xde, 0xcb, 0x3c, 0x81, 0x65, 0x4b, 0xa0, 0xf5, 0xf0, 0x45, 0x6b, 0x7e,
     69     0x61, 0xf5, 0x0d, 0xf5, 0x38, 0xa4, 0xfc, 0xb1, 0x8a, 0x95, 0xff, 0x59,
     70     0xbc, 0x04, 0x82, 0xcf, 0x23, 0xb2, 0x32, 0x56}},
     71   {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz"),
     72    {0xfc, 0x31, 0x89, 0x44, 0x3f, 0x9c, 0x26, 0x8f, 0x62, 0x6a, 0xea, 0x08,
     73     0xa7, 0x56, 0xab, 0xe7, 0xb7, 0x26, 0xb0, 0x5f, 0x70, 0x1c, 0xb0, 0x82,
     74     0x22, 0x31, 0x2c, 0xcf, 0xd6, 0x71, 0x0a, 0x26, }},
     75   {D_STR_W_LEN ("zyxwvutsrqponMLKJIHGFEDCBA"),
     76    {0xd2, 0x6d, 0x24, 0x81, 0xa4, 0xf9, 0x0a, 0x72, 0xd2, 0x7f, 0xc1, 0xac,
     77     0xac, 0xe1, 0xc0, 0x6b, 0x39, 0x94, 0xac, 0x73, 0x50, 0x2e, 0x27, 0x97,
     78     0xa3, 0x65, 0x37, 0x4e, 0xbb, 0x5c, 0x27, 0xe9}},
     79   {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyzzyxwvutsrqponMLKJIHGFEDCBA" \
     80                 "abcdefghijklmnopqrstuvwxyzzyxwvutsrqponMLKJIHGFEDCBA"),
     81    {0xad, 0xe9, 0x5d, 0x55, 0x3b, 0x9e, 0x45, 0x69, 0xdb, 0x53, 0xa4, 0x04,
     82     0x92, 0xe7, 0x87, 0x94, 0xff, 0xc9, 0x98, 0x5f, 0x93, 0x03, 0x86, 0x45,
     83     0xe1, 0x97, 0x17, 0x72, 0x7c, 0xbc, 0x31, 0x15}},
     84   {D_STR_W_LEN ("/long/long/long/long/long/long/long/long/long/long/long" \
     85                 "/long/long/long/long/long/long/long/long/long/long/long" \
     86                 "/long/long/long/long/long/long/long/long/long/long/long" \
     87                 "/long/long/long/long/long/long/long/long/long/long/long" \
     88                 "/long/long/long/long/long/long/long/long/long/long/long" \
     89                 "/long/long/long/long/long/long/long/long/long/long/long" \
     90                 "/long/long/long/long/path?with%20some=parameters"),
     91    {0xbc, 0xab, 0xc6, 0x2c, 0x0a, 0x22, 0xd5, 0xcb, 0xac, 0xac, 0xe9, 0x25,
     92     0xcf, 0xce, 0xaa, 0xaf, 0x0e, 0xa1, 0xed, 0x42, 0x46, 0x8a, 0xe2, 0x01,
     93     0xee, 0x2f, 0xdb, 0x39, 0x75, 0x47, 0x73, 0xf1}}
     94 };
     95 
     96 static const size_t units1_num = sizeof(data_units1) / sizeof(data_units1[0]);
     97 
     98 struct bin_with_len
     99 {
    100   const uint8_t bin[512];
    101   const size_t len;
    102 };
    103 
    104 struct data_unit2
    105 {
    106   const struct bin_with_len bin_l;
    107   const uint8_t digest[SHA512_256_DIGEST_SIZE];
    108 };
    109 
    110 /* Size must be less than 512 bytes! */
    111 static const struct data_unit2 data_units2[] = {
    112   { { {97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
    113        112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122}, 26}, /* a..z ASCII sequence */
    114     {0xfc, 0x31, 0x89, 0x44, 0x3f, 0x9c, 0x26, 0x8f, 0x62, 0x6a, 0xea, 0x08,
    115      0xa7, 0x56, 0xab, 0xe7, 0xb7, 0x26, 0xb0, 0x5f, 0x70, 0x1c, 0xb0, 0x82,
    116      0x22, 0x31, 0x2c, 0xcf, 0xd6, 0x71, 0x0a, 0x26}},
    117   { { {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
    118        65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
    119        65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
    120        65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65},
    121       72 }, /* 'A' x 72 times */
    122     {0x36, 0x5d, 0x41, 0x0e, 0x55, 0xd1, 0xfd, 0xe6, 0xc3, 0xb8, 0x68, 0xcc,
    123      0xed, 0xeb, 0xcd, 0x0d, 0x2e, 0x34, 0xb2, 0x5c, 0xdf, 0xe7, 0x79, 0xe2,
    124      0xe9, 0x65, 0x07, 0x33, 0x78, 0x0d, 0x01, 0x89}},
    125   { { {19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
    126        37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
    127        55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
    128        73}, 55}, /* 19..73 sequence */
    129     {0xb9, 0xe5, 0x74, 0x11, 0xbf, 0xa2, 0x0e, 0x98, 0xbe, 0x08, 0x69, 0x2e,
    130      0x17, 0x9e, 0xc3, 0xfe, 0x61, 0xe3, 0x7a, 0x80, 0x2e, 0x25, 0x8c, 0xf3,
    131      0x76, 0xda, 0x9f, 0x5f, 0xcd, 0x87, 0x48, 0x0d}},
    132   { { {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
    133        26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
    134        44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
    135        62, 63, 64, 65, 66, 67, 68, 69}, 63}, /* 7..69 sequence */
    136     {0x80, 0x15, 0x83, 0xed, 0x7d, 0xef, 0x9f, 0xdf, 0xfb, 0x83, 0x1f, 0xc5,
    137      0x8b, 0x50, 0x37, 0x81, 0x00, 0xc3, 0x4f, 0xfd, 0xfe, 0xc2, 0x9b, 0xaf,
    138      0xfe, 0x15, 0x66, 0xe5, 0x08, 0x42, 0x5e, 0xae}},
    139   { { {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
    140        56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
    141        74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
    142        92}, 55}, /* 38..92 sequence */
    143     {0x76, 0x2f, 0x27, 0x4d, 0xfa, 0xd5, 0xa9, 0x21, 0x4e, 0xe9, 0x56, 0x22,
    144      0x54, 0x38, 0x71, 0x3e, 0xef, 0x14, 0xa9, 0x22, 0x37, 0xf3, 0xb0, 0x50,
    145      0x3d, 0x95, 0x40, 0xb7, 0x08, 0x64, 0xa9, 0xfd}},
    146   { { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
    147        21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
    148        39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
    149        57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72}, 72}, /* 1..72 sequence */
    150     {0x3f, 0x5c, 0xd3, 0xec, 0x40, 0xc4, 0xb9, 0x78, 0x35, 0x57, 0xc6, 0x4f,
    151      0x3e, 0x46, 0x82, 0xdc, 0xd4, 0x46, 0x11, 0xd0, 0xb3, 0x0a, 0xbb, 0x89,
    152      0xf1, 0x1d, 0x34, 0xb5, 0xf9, 0xd5, 0x10, 0x35}},
    153   { { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
    154        21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
    155        39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
    156        57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
    157        75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
    158        93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
    159        109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
    160        123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
    161        137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
    162        151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
    163        165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,
    164        179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
    165        193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
    166        207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
    167        221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
    168        235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248,
    169        249, 250, 251, 252, 253, 254, 255}, 256}, /* 0..255 sequence */
    170     {0x08, 0x37, 0xa1, 0x1d, 0x99, 0x4d, 0x5a, 0xa8, 0x60, 0xd0, 0x69, 0x17,
    171      0xa8, 0xa0, 0xf6, 0x3e, 0x31, 0x11, 0xb9, 0x56, 0x33, 0xde, 0xeb, 0x15,
    172      0xee, 0xd9, 0x94, 0x93, 0x76, 0xf3, 0x7d, 0x36, }},
    173   { { {199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186,
    174        185, 184, 183, 182, 181, 180,
    175        179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166,
    176        165, 164, 163, 162, 161, 160,
    177        159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146,
    178        145, 144, 143, 142, 141, 140,
    179        139}, 61},  /* 199..139 sequence */
    180     {0xcf, 0x21, 0x4b, 0xb2, 0xdd, 0x40, 0x98, 0xdf, 0x3a, 0xb7, 0x21, 0xb4,
    181      0x69, 0x0e, 0x19, 0x36, 0x24, 0xa9, 0xbe, 0x30, 0xf7, 0xd0, 0x75, 0xb0,
    182      0x39, 0x94, 0x82, 0xda, 0x55, 0x97, 0xe4, 0x79}},
    183   { { {255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242,
    184        241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228,
    185        227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214,
    186        213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200,
    187        199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186,
    188        185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172,
    189        171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158,
    190        157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144,
    191        143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130,
    192        129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116,
    193        115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102,
    194        101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85,
    195        84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67,
    196        66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49,
    197        48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31,
    198        30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13,
    199        12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, 255},  /* 255..1 sequence */
    200     {0x22, 0x31, 0xf2, 0xa1, 0xb4, 0x89, 0xb2, 0x44, 0xf7, 0x66, 0xa0, 0xb8,
    201      0x31, 0xed, 0xb7, 0x73, 0x8a, 0x34, 0xdc, 0x11, 0xc8, 0x2c, 0xf2, 0xb5,
    202      0x88, 0x60, 0x39, 0x6b, 0x5c, 0x06, 0x70, 0x37}},
    203   { { {41, 35, 190, 132, 225, 108, 214, 174, 82, 144, 73, 241, 241, 187, 233,
    204        235, 179, 166, 219, 60, 135, 12, 62, 153, 36, 94, 13, 28, 6, 183, 71,
    205        222, 179, 18, 77, 200, 67, 187, 139, 166, 31, 3, 90, 125, 9, 56, 37,
    206        31, 93, 212, 203, 252, 150, 245, 69, 59, 19, 13, 137, 10, 28, 219, 174,
    207        50, 32, 154, 80, 238, 64, 120, 54, 253, 18, 73, 50, 246, 158, 125, 73,
    208        220, 173, 79, 20, 242, 68, 64, 102, 208, 107, 196, 48, 183, 50, 59,
    209        161, 34, 246, 34, 145, 157, 225, 139, 31, 218, 176, 202, 153, 2, 185,
    210        114, 157, 73, 44, 128, 126, 197, 153, 213, 233, 128, 178, 234, 201,
    211        204, 83, 191, 103, 214, 191, 20, 214, 126, 45, 220, 142, 102, 131, 239,
    212        87, 73, 97, 255, 105, 143, 97, 205, 209, 30, 157, 156, 22, 114, 114,
    213        230, 29, 240, 132, 79, 74, 119, 2, 215, 232, 57, 44, 83, 203, 201, 18,
    214        30, 51, 116, 158, 12, 244, 213, 212, 159, 212, 164, 89, 126, 53, 207,
    215        50, 34, 244, 204, 207, 211, 144, 45, 72, 211, 143, 117, 230, 217, 29,
    216        42, 229, 192, 247, 43, 120, 129, 135, 68, 14, 95, 80, 0, 212, 97, 141,
    217        190, 123, 5, 21, 7, 59, 51, 130, 31, 24, 112, 146, 218, 100, 84, 206,
    218        177, 133, 62, 105, 21, 248, 70, 106, 4, 150, 115, 14, 217, 22, 47, 103,
    219        104, 212, 247, 74, 74, 208, 87, 104}, 255},  /* pseudo-random data */
    220     {0xb8, 0xdb, 0x2c, 0x2e, 0xf3, 0x12, 0x77, 0x14, 0xf9, 0x34, 0x2d, 0xfa,
    221      0xda, 0x42, 0xbe, 0xfe, 0x67, 0x3a, 0x8a, 0xf6, 0x71, 0x36, 0x00, 0xff,
    222      0x77, 0xa5, 0x83, 0x14, 0x55, 0x2a, 0x05, 0xaf}},
    223   { { {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
    224        66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
    225        66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
    226        66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
    227        66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
    228        66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
    229        66, 66}, 110},  /* 'B' x 110 times */
    230     {0xc8, 0x9e, 0x0d, 0x8f, 0x7b, 0x35, 0xfd, 0x3e, 0xdc, 0x90, 0x87, 0x64,
    231      0x45, 0x94, 0x94, 0x21, 0xb3, 0x8e, 0xb5, 0xc7, 0x54, 0xc8, 0xee, 0xde,
    232      0xfc, 0x77, 0xd6, 0xe3, 0x9f, 0x81, 0x8e, 0x78}},
    233   { { {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
    234        67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
    235        67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
    236        67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
    237        67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
    238        67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
    239        67, 67, 67}, 111},  /* 'C' x 111 times */
    240     {0x86, 0xca, 0x6d, 0x2a, 0x72, 0xe2, 0x8c, 0x17, 0x89, 0x86, 0x89, 0x1b,
    241      0x36, 0xf9, 0x6d, 0xda, 0x8c, 0xd6, 0x30, 0xb2, 0xd3, 0x60, 0x39, 0xfb,
    242      0xc9, 0x04, 0xc5, 0x11, 0xcd, 0x2d, 0xe3, 0x62}},
    243   { { {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
    244        68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
    245        68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
    246        68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
    247        68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
    248        68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
    249        68, 68, 68, 68}, 112},  /* 'D' x 112 times */
    250     {0xdf, 0x9d, 0x4a, 0xcf, 0x81, 0x0d, 0x3a, 0xd4, 0x8e, 0xa4, 0x65, 0x9e,
    251      0x1e, 0x15, 0xe4, 0x15, 0x1b, 0x37, 0xb6, 0xeb, 0x17, 0xab, 0xf6, 0xb1,
    252      0xbc, 0x30, 0x46, 0x34, 0x24, 0x56, 0x1c, 0x06}},
    253   { { {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
    254        69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
    255        69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
    256        69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
    257        69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
    258        69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
    259        69, 69, 69, 69, 69}, 113},  /* 'E' x 113 times */
    260     {0xa5, 0xf1, 0x47, 0x74, 0xf8, 0x2b, 0xed, 0x23, 0xe4, 0x10, 0x59, 0x8f,
    261      0x7e, 0xb1, 0x30, 0xe5, 0x7e, 0xd1, 0x4b, 0xbc, 0x72, 0x58, 0x58, 0x81,
    262      0xbb, 0xa0, 0xa5, 0xb6, 0x15, 0x39, 0x49, 0xa1}},
    263   { { {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    264        70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    265        70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    266        70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    267        70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    268        70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
    269        70, 70, 70, 70, 70, 70}, 114},  /* 'F' x 114 times */
    270     {0xe6, 0xa3, 0xc9, 0x63, 0xd5, 0x28, 0x6e, 0x2d, 0xfb, 0x71, 0xdf, 0xd4,
    271      0xff, 0xc2, 0xd4, 0x2b, 0x5d, 0x9b, 0x76, 0x28, 0xd2, 0xcb, 0x15, 0xc8,
    272      0x81, 0x57, 0x14, 0x09, 0xc3, 0x8e, 0x92, 0xce}},
    273   { { {76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    274        76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    275        76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    276        76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    277        76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    278        76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    279        76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    280        76}, 127},  /* 'L' x 127 times */
    281     {0x5d, 0x18, 0xff, 0xd7, 0xbe, 0x23, 0xb2, 0xb2, 0xbd, 0xe3, 0x13, 0x12,
    282      0x1c, 0x16, 0x89, 0x14, 0x4a, 0x42, 0xb4, 0x3f, 0xab, 0xc8, 0x41, 0x14,
    283      0x62, 0x00, 0xb5, 0x53, 0xa7, 0xd6, 0xd5, 0x35}},
    284   { { {77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    285        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    286        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    287        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    288        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    289        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    290        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    291        77, 77}, 128},  /* 'M' x 128 times */
    292     {0x6e, 0xf0, 0xda, 0x81, 0x3d, 0x50, 0x1d, 0x31, 0xf1, 0x4a, 0xf8, 0xd9,
    293      0x7d, 0xd2, 0x13, 0xdd, 0xa4, 0x46, 0x15, 0x0b, 0xb8, 0x5a, 0x8a, 0xc6,
    294      0x1e, 0x3a, 0x1f, 0x21, 0x35, 0xa2, 0xbb, 0x4f}},
    295   { { {78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
    296        78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
    297        78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
    298        78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
    299        78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
    300        78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
    301        78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
    302        78, 78, 78}, 129},  /* 'N' x 129 times */
    303     {0xee, 0xce, 0xd5, 0x34, 0xab, 0x14, 0x13, 0x9e, 0x8f, 0x5c, 0xb4, 0xef,
    304      0xac, 0xaf, 0xc5, 0xeb, 0x1d, 0x2f, 0xe3, 0xc5, 0xca, 0x09, 0x29, 0x96,
    305      0xfa, 0x84, 0xff, 0x12, 0x26, 0x6a, 0x50, 0x49}},
    306   { { {97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    307        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    308        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    309        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    310        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    311        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    312        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    313        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    314        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    315        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    316        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    317        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    318        97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
    319        97, 97, 97, 97}, 238},  /* 'a' x 238 times */
    320     {0xb4, 0x24, 0xe5, 0x7b, 0xa7, 0x37, 0xe3, 0xc4, 0xac, 0x35, 0x21, 0x17,
    321      0x98, 0xec, 0xb9, 0xae, 0x45, 0x13, 0x24, 0xa4, 0x2c, 0x76, 0xae, 0x7d,
    322      0x17, 0x75, 0x27, 0x8a, 0xaa, 0x4a, 0x48, 0x60}},
    323   { { {98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    324        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    325        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    326        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    327        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    328        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    329        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    330        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    331        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    332        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    333        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    334        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    335        98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
    336        98, 98, 98, 98, 98}, 239},  /* 'b' x 239 times */
    337     {0xcd, 0x93, 0xb8, 0xab, 0x6a, 0x74, 0xbd, 0x34, 0x8c, 0x43, 0x76, 0x0c,
    338      0x2a, 0xd0, 0x6e, 0xd8, 0x76, 0xcf, 0xdf, 0x2a, 0x21, 0x04, 0xfb, 0xf6,
    339      0x16, 0x53, 0x68, 0xf6, 0x10, 0xc3, 0xa1, 0xac}},
    340   { { {99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    341        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    342        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    343        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    344        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    345        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    346        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    347        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    348        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    349        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    350        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    351        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    352        99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    353        99, 99, 99, 99, 99, 99}, 240},  /* 'c' x 240 times */
    354     {0x5f, 0x60, 0xea, 0x44, 0xb6, 0xc6, 0x9e, 0xfe, 0xfc, 0x0e, 0x6a, 0x0a,
    355      0x99, 0x40, 0x1b, 0x61, 0x43, 0x58, 0xba, 0x4a, 0x0a, 0xee, 0x6b, 0x52,
    356      0x10, 0xdb, 0x32, 0xd9, 0x7f, 0x12, 0xba, 0x70}},
    357   { { {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    358        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    359        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    360        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    361        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    362        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    363        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    364        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    365        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    366        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    367        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    368        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    369        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
    370        48, 48, 48, 48, 48, 48, 48}, 241}, /* '0' x 241 times */
    371     {0x3c, 0xcb, 0xcf, 0x50, 0x79, 0xd5, 0xb6, 0xf5, 0xbf, 0x25, 0x07, 0xfb,
    372      0x4d, 0x1f, 0xa3, 0x77, 0xc3, 0x6f, 0xe8, 0xe3, 0xc4, 0x4b, 0xf8, 0xcd,
    373      0x90, 0x93, 0xf1, 0x3e, 0x08, 0x09, 0xa7, 0x69}}
    374 };
    375 
    376 static const size_t units2_num = sizeof(data_units2) / sizeof(data_units2[0]);
    377 
    378 
    379 /*
    380  *  Helper functions
    381  */
    382 
    383 /**
    384  * Print bin as hex
    385  *
    386  * @param bin binary data
    387  * @param len number of bytes in bin
    388  * @param hex pointer to len*2+1 bytes buffer
    389  */
    390 static void
    391 bin2hex (const uint8_t *bin,
    392          size_t len,
    393          char *hex)
    394 {
    395   while (len-- > 0)
    396   {
    397     unsigned int b1, b2;
    398     b1 = (*bin >> 4) & 0xf;
    399     *hex++ = (char) ((b1 > 9) ? (b1 + 'A' - 10) : (b1 + '0'));
    400     b2 = *bin++ & 0xf;
    401     *hex++ = (char) ((b2 > 9) ? (b2 + 'A' - 10) : (b2 + '0'));
    402   }
    403   *hex = 0;
    404 }
    405 
    406 
    407 static int
    408 check_result (const char *test_name,
    409               unsigned int check_num,
    410               const uint8_t calculated[SHA512_256_DIGEST_SIZE],
    411               const uint8_t expected[SHA512_256_DIGEST_SIZE])
    412 {
    413   int failed = memcmp (calculated, expected, SHA512_256_DIGEST_SIZE);
    414   check_num++; /* Print 1-based numbers */
    415   if (failed)
    416   {
    417     char calc_str[SHA512_256_DIGEST_SIZE * 2 + 1];
    418     char expc_str[SHA512_256_DIGEST_SIZE * 2 + 1];
    419     bin2hex (calculated, SHA512_256_DIGEST_SIZE, calc_str);
    420     bin2hex (expected, SHA512_256_DIGEST_SIZE, expc_str);
    421     fprintf (stderr,
    422              "FAILED: %s check %u: calculated digest %s, expected digest %s.\n",
    423              test_name, check_num, calc_str, expc_str);
    424     fflush (stderr);
    425   }
    426   else if (verbose)
    427   {
    428     char calc_str[SHA512_256_DIGEST_SIZE * 2 + 1];
    429     bin2hex (calculated, SHA512_256_DIGEST_SIZE, calc_str);
    430     printf ("PASSED: %s check %u: calculated digest %s matches " \
    431             "expected digest.\n",
    432             test_name, check_num, calc_str);
    433     fflush (stdout);
    434   }
    435   return failed ? 1 : 0;
    436 }
    437 
    438 
    439 /*
    440  *  Tests
    441  */
    442 
    443 /* Calculated SHA-512/256 as one pass for whole data */
    444 static int
    445 test1_str (void)
    446 {
    447   int num_failed = 0;
    448   unsigned int i;
    449   struct Sha512_256Ctx ctx;
    450 
    451   for (i = 0; i < units1_num; i++)
    452   {
    453     uint8_t digest[SHA512_256_DIGEST_SIZE];
    454 
    455     MHD_SHA512_256_init (&ctx);
    456     MHD_SHA512_256_update (&ctx, (const uint8_t *) data_units1[i].str_l.str,
    457                            data_units1[i].str_l.len);
    458     MHD_SHA512_256_finish (&ctx, digest);
    459     num_failed += check_result (__FUNCTION__, i, digest,
    460                                 data_units1[i].digest);
    461   }
    462   return num_failed;
    463 }
    464 
    465 
    466 static int
    467 test1_bin (void)
    468 {
    469   int num_failed = 0;
    470   unsigned int i;
    471   struct Sha512_256Ctx ctx;
    472 
    473   for (i = 0; i < units2_num; i++)
    474   {
    475     uint8_t digest[SHA512_256_DIGEST_SIZE];
    476 
    477     MHD_SHA512_256_init (&ctx);
    478     MHD_SHA512_256_update (&ctx, data_units2[i].bin_l.bin,
    479                            data_units2[i].bin_l.len);
    480     MHD_SHA512_256_finish (&ctx, digest);
    481     num_failed += check_result (__FUNCTION__, i, digest,
    482                                 data_units2[i].digest);
    483   }
    484   return num_failed;
    485 }
    486 
    487 
    488 /* Calculated SHA-512/256 as two iterations for whole data */
    489 static int
    490 test2_str (void)
    491 {
    492   int num_failed = 0;
    493   unsigned int i;
    494   struct Sha512_256Ctx ctx;
    495 
    496   for (i = 0; i < units1_num; i++)
    497   {
    498     uint8_t digest[SHA512_256_DIGEST_SIZE];
    499     size_t part_s = data_units1[i].str_l.len / 4;
    500 
    501     MHD_SHA512_256_init (&ctx);
    502     MHD_SHA512_256_update (&ctx, (const uint8_t *) "", 0);
    503     MHD_SHA512_256_update (&ctx, (const uint8_t *) data_units1[i].str_l.str,
    504                            part_s);
    505     MHD_SHA512_256_update (&ctx, (const uint8_t *) "", 0);
    506     MHD_SHA512_256_update (&ctx, (const uint8_t *) data_units1[i].str_l.str
    507                            + part_s,
    508                            data_units1[i].str_l.len - part_s);
    509     MHD_SHA512_256_update (&ctx, (const uint8_t *) "", 0);
    510     MHD_SHA512_256_finish (&ctx, digest);
    511     num_failed += check_result (__FUNCTION__, i, digest,
    512                                 data_units1[i].digest);
    513   }
    514   return num_failed;
    515 }
    516 
    517 
    518 static int
    519 test2_bin (void)
    520 {
    521   int num_failed = 0;
    522   unsigned int i;
    523   struct Sha512_256Ctx ctx;
    524 
    525   for (i = 0; i < units2_num; i++)
    526   {
    527     uint8_t digest[SHA512_256_DIGEST_SIZE];
    528     size_t part_s = data_units2[i].bin_l.len * 2 / 3;
    529 
    530     MHD_SHA512_256_init (&ctx);
    531     MHD_SHA512_256_update (&ctx, data_units2[i].bin_l.bin, part_s);
    532     MHD_SHA512_256_update (&ctx, (const uint8_t *) "", 0);
    533     MHD_SHA512_256_update (&ctx, data_units2[i].bin_l.bin + part_s,
    534                            data_units2[i].bin_l.len - part_s);
    535     MHD_SHA512_256_finish (&ctx, digest);
    536     num_failed += check_result (__FUNCTION__, i, digest,
    537                                 data_units2[i].digest);
    538   }
    539   return num_failed;
    540 }
    541 
    542 
    543 /* Use data set number 7 as it has the longest sequence */
    544 #define DATA_POS 6
    545 #define MAX_OFFSET 63
    546 
    547 static int
    548 test_unaligned (void)
    549 {
    550   int num_failed = 0;
    551   unsigned int offset;
    552   uint8_t *buf;
    553   uint8_t *digest_buf;
    554   struct Sha512_256Ctx ctx;
    555 
    556   const struct data_unit2 *const tdata = data_units2 + DATA_POS;
    557 
    558   buf = malloc (tdata->bin_l.len + MAX_OFFSET);
    559   digest_buf = malloc (SHA512_256_DIGEST_SIZE + MAX_OFFSET);
    560   if ((NULL == buf) || (NULL == digest_buf))
    561     exit (99);
    562 
    563   for (offset = MAX_OFFSET; offset >= 1; --offset)
    564   {
    565     uint8_t *unaligned_digest;
    566     uint8_t *unaligned_buf;
    567 
    568     unaligned_buf = buf + offset;
    569     memcpy (unaligned_buf, tdata->bin_l.bin, tdata->bin_l.len);
    570     unaligned_digest = digest_buf + MAX_OFFSET - offset;
    571     memset (unaligned_digest, 0, SHA512_256_DIGEST_SIZE);
    572 
    573     MHD_SHA512_256_init (&ctx);
    574     MHD_SHA512_256_update (&ctx, unaligned_buf, tdata->bin_l.len);
    575     MHD_SHA512_256_finish (&ctx, unaligned_digest);
    576     num_failed += check_result (__FUNCTION__, MAX_OFFSET - offset,
    577                                 unaligned_digest, tdata->digest);
    578   }
    579   free (digest_buf);
    580   free (buf);
    581   return num_failed;
    582 }
    583 
    584 
    585 int
    586 main (int argc, char *argv[])
    587 {
    588   int num_failed = 0;
    589   (void) has_in_name; /* Mute compiler warning. */
    590   if (has_param (argc, argv, "-v") || has_param (argc, argv, "--verbose"))
    591     verbose = 1;
    592 
    593   num_failed += test1_str ();
    594   num_failed += test1_bin ();
    595 
    596   num_failed += test2_str ();
    597   num_failed += test2_bin ();
    598 
    599   num_failed += test_unaligned ();
    600 
    601   return num_failed ? 1 : 0;
    602 }