"Fossies" - the Fresh Open Source Software Archive

Member "tin-2.4.2/libcanlock/test/shatest.c" (4 Jun 2017, 63533 Bytes) of package /linux/misc/tin-2.4.2.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /************************** shatest.c **************************/
    2 /***************** See RFC 6234 for details. *******************/
    3 /* Copyright (c) 2011 IETF Trust and the persons identified as */
    4 /* authors of the code.  All rights reserved.                  */
    5 /* See sha.h for terms of use and redistribution.              */
    6 
    7 /*
    8  *  Description:
    9  *    This file will exercise the SHA code performing
   10  *      the three tests documented in FIPS PUB 180-3
   11  *        (http://csrc.nist.gov/publications/fips/
   12  *         fips180-2/fips180-2withchangenotice.pdf)
   13  *      one that calls SHAInput with an exact multiple of 512 bits
   14  *      the seven tests documented for each algorithm in
   15  *        "The Secure Hash Algorithm Validation System (SHAVS)"
   16  *        (http://csrc.nist.gov/cryptval/shs/SHAVS.pdf),
   17  *        three of which are bit-level tests
   18  *
   19  *    These tests have subsequently been moved to pages linked from
   20  *      http://csrc.nist.gov/groups/ST/toolkit/examples.html
   21  *
   22  *    This file will exercise the HMAC SHA1 code performing
   23  *      the seven tests documented in RFCs [RFC 2202] and [RFC 4231].
   24  *
   25  *    This file will exercise the HKDF code performing
   26  *      the seven tests documented in RFC 4869.
   27  *
   28  *    To run the tests and just see PASSED/FAILED, use the -p option.
   29  *
   30  *    Other options exercise:
   31  *      hashing an arbitrary string
   32  *      hashing a file's contents
   33  *      a few error test checks
   34  *      printing the results in raw format
   35  *
   36  *  Portability Issues:
   37  *    None.
   38  *
   39  */
   40 
   41 #include <stdint.h>
   42 #include <stdio.h>
   43 #include <stdlib.h>
   44 #include <string.h>
   45 #include <ctype.h>
   46 #include <unistd.h>     /* defines getopt() and optarg */
   47 #include "sha.h"
   48 
   49 static int scasecmp(const char *s1, const char *s2);
   50 
   51 /*
   52  *  Define patterns for testing
   53  */
   54 #define TEST1    "abc"
   55 #define TEST2_1  \
   56         "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
   57 #define TEST2_2a \
   58         "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
   59 #define TEST2_2b \
   60         "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
   61 #define TEST2_2  TEST2_2a TEST2_2b
   62 #define TEST3    "a"                            /* times 1000000 */
   63 #define TEST4a   "01234567012345670123456701234567"
   64 #define TEST4b   "01234567012345670123456701234567"
   65     /* an exact multiple of 512 bits */
   66 #define TEST4   TEST4a TEST4b                   /* times 10 */
   67 #define TEST7_1 \
   68   "\x49\xb2\xae\xc2\x59\x4b\xbe\x3a\x3b\x11\x75\x42\xd9\x4a\xc8"
   69 #define TEST8_1 \
   70   "\x9a\x7d\xfd\xf1\xec\xea\xd0\x6e\xd6\x46\xaa\x55\xfe\x75\x71\x46"
   71 #define TEST9_1 \
   72   "\x65\xf9\x32\x99\x5b\xa4\xce\x2c\xb1\xb4\xa2\xe7\x1a\xe7\x02\x20" \
   73   "\xaa\xce\xc8\x96\x2d\xd4\x49\x9c\xbd\x7c\x88\x7a\x94\xea\xaa\x10" \
   74   "\x1e\xa5\xaa\xbc\x52\x9b\x4e\x7e\x43\x66\x5a\x5a\xf2\xcd\x03\xfe" \
   75   "\x67\x8e\xa6\xa5\x00\x5b\xba\x3b\x08\x22\x04\xc2\x8b\x91\x09\xf4" \
   76   "\x69\xda\xc9\x2a\xaa\xb3\xaa\x7c\x11\xa1\xb3\x2a"
   77 #define TEST10_1 \
   78   "\xf7\x8f\x92\x14\x1b\xcd\x17\x0a\xe8\x9b\x4f\xba\x15\xa1\xd5\x9f" \
   79   "\x3f\xd8\x4d\x22\x3c\x92\x51\xbd\xac\xbb\xae\x61\xd0\x5e\xd1\x15" \
   80   "\xa0\x6a\x7c\xe1\x17\xb7\xbe\xea\xd2\x44\x21\xde\xd9\xc3\x25\x92" \
   81   "\xbd\x57\xed\xea\xe3\x9c\x39\xfa\x1f\xe8\x94\x6a\x84\xd0\xcf\x1f" \
   82   "\x7b\xee\xad\x17\x13\xe2\xe0\x95\x98\x97\x34\x7f\x67\xc8\x0b\x04" \
   83   "\x00\xc2\x09\x81\x5d\x6b\x10\xa6\x83\x83\x6f\xd5\x56\x2a\x56\xca" \
   84   "\xb1\xa2\x8e\x81\xb6\x57\x66\x54\x63\x1c\xf1\x65\x66\xb8\x6e\x3b" \
   85   "\x33\xa1\x08\xb0\x53\x07\xc0\x0a\xff\x14\xa7\x68\xed\x73\x50\x60" \
   86   "\x6a\x0f\x85\xe6\xa9\x1d\x39\x6f\x5b\x5c\xbe\x57\x7f\x9b\x38\x80" \
   87   "\x7c\x7d\x52\x3d\x6d\x79\x2f\x6e\xbc\x24\xa4\xec\xf2\xb3\xa4\x27" \
   88   "\xcd\xbb\xfb"
   89 #define TEST7_224 \
   90   "\xf0\x70\x06\xf2\x5a\x0b\xea\x68\xcd\x76\xa2\x95\x87\xc2\x8d"
   91 #define TEST8_224 \
   92   "\x18\x80\x40\x05\xdd\x4f\xbd\x15\x56\x29\x9d\x6f\x9d\x93\xdf\x62"
   93 #define TEST9_224 \
   94   "\xa2\xbe\x6e\x46\x32\x81\x09\x02\x94\xd9\xce\x94\x82\x65\x69\x42" \
   95   "\x3a\x3a\x30\x5e\xd5\xe2\x11\x6c\xd4\xa4\xc9\x87\xfc\x06\x57\x00" \
   96   "\x64\x91\xb1\x49\xcc\xd4\xb5\x11\x30\xac\x62\xb1\x9d\xc2\x48\xc7" \
   97   "\x44\x54\x3d\x20\xcd\x39\x52\xdc\xed\x1f\x06\xcc\x3b\x18\xb9\x1f" \
   98   "\x3f\x55\x63\x3e\xcc\x30\x85\xf4\x90\x70\x60\xd2"
   99 #define TEST10_224 \
  100   "\x55\xb2\x10\x07\x9c\x61\xb5\x3a\xdd\x52\x06\x22\xd1\xac\x97\xd5" \
  101   "\xcd\xbe\x8c\xb3\x3a\xa0\xae\x34\x45\x17\xbe\xe4\xd7\xba\x09\xab" \
  102   "\xc8\x53\x3c\x52\x50\x88\x7a\x43\xbe\xbb\xac\x90\x6c\x2e\x18\x37" \
  103   "\xf2\x6b\x36\xa5\x9a\xe3\xbe\x78\x14\xd5\x06\x89\x6b\x71\x8b\x2a" \
  104   "\x38\x3e\xcd\xac\x16\xb9\x61\x25\x55\x3f\x41\x6f\xf3\x2c\x66\x74" \
  105   "\xc7\x45\x99\xa9\x00\x53\x86\xd9\xce\x11\x12\x24\x5f\x48\xee\x47" \
  106   "\x0d\x39\x6c\x1e\xd6\x3b\x92\x67\x0c\xa5\x6e\xc8\x4d\xee\xa8\x14" \
  107   "\xb6\x13\x5e\xca\x54\x39\x2b\xde\xdb\x94\x89\xbc\x9b\x87\x5a\x8b" \
  108   "\xaf\x0d\xc1\xae\x78\x57\x36\x91\x4a\xb7\xda\xa2\x64\xbc\x07\x9d" \
  109   "\x26\x9f\x2c\x0d\x7e\xdd\xd8\x10\xa4\x26\x14\x5a\x07\x76\xf6\x7c" \
  110   "\x87\x82\x73"
  111 #define TEST7_256 \
  112   "\xbe\x27\x46\xc6\xdb\x52\x76\x5f\xdb\x2f\x88\x70\x0f\x9a\x73"
  113 #define TEST8_256 \
  114   "\xe3\xd7\x25\x70\xdc\xdd\x78\x7c\xe3\x88\x7a\xb2\xcd\x68\x46\x52"
  115 #define TEST9_256 \
  116   "\x3e\x74\x03\x71\xc8\x10\xc2\xb9\x9f\xc0\x4e\x80\x49\x07\xef\x7c" \
  117   "\xf2\x6b\xe2\x8b\x57\xcb\x58\xa3\xe2\xf3\xc0\x07\x16\x6e\x49\xc1" \
  118   "\x2e\x9b\xa3\x4c\x01\x04\x06\x91\x29\xea\x76\x15\x64\x25\x45\x70" \
  119   "\x3a\x2b\xd9\x01\xe1\x6e\xb0\xe0\x5d\xeb\xa0\x14\xeb\xff\x64\x06" \
  120   "\xa0\x7d\x54\x36\x4e\xff\x74\x2d\xa7\x79\xb0\xb3"
  121 #define TEST10_256 \
  122   "\x83\x26\x75\x4e\x22\x77\x37\x2f\x4f\xc1\x2b\x20\x52\x7a\xfe\xf0" \
  123   "\x4d\x8a\x05\x69\x71\xb1\x1a\xd5\x71\x23\xa7\xc1\x37\x76\x00\x00" \
  124   "\xd7\xbe\xf6\xf3\xc1\xf7\xa9\x08\x3a\xa3\x9d\x81\x0d\xb3\x10\x77" \
  125   "\x7d\xab\x8b\x1e\x7f\x02\xb8\x4a\x26\xc7\x73\x32\x5f\x8b\x23\x74" \
  126   "\xde\x7a\x4b\x5a\x58\xcb\x5c\x5c\xf3\x5b\xce\xe6\xfb\x94\x6e\x5b" \
  127   "\xd6\x94\xfa\x59\x3a\x8b\xeb\x3f\x9d\x65\x92\xec\xed\xaa\x66\xca" \
  128   "\x82\xa2\x9d\x0c\x51\xbc\xf9\x33\x62\x30\xe5\xd7\x84\xe4\xc0\xa4" \
  129   "\x3f\x8d\x79\xa3\x0a\x16\x5c\xba\xbe\x45\x2b\x77\x4b\x9c\x71\x09" \
  130   "\xa9\x7d\x13\x8f\x12\x92\x28\x96\x6f\x6c\x0a\xdc\x10\x6a\xad\x5a" \
  131   "\x9f\xdd\x30\x82\x57\x69\xb2\xc6\x71\xaf\x67\x59\xdf\x28\xeb\x39" \
  132   "\x3d\x54\xd6"
  133 #define TEST7_384 \
  134   "\x8b\xc5\x00\xc7\x7c\xee\xd9\x87\x9d\xa9\x89\x10\x7c\xe0\xaa"
  135 #define TEST8_384 \
  136   "\xa4\x1c\x49\x77\x79\xc0\x37\x5f\xf1\x0a\x7f\x4e\x08\x59\x17\x39"
  137 #define TEST9_384 \
  138   "\x68\xf5\x01\x79\x2d\xea\x97\x96\x76\x70\x22\xd9\x3d\xa7\x16\x79" \
  139   "\x30\x99\x20\xfa\x10\x12\xae\xa3\x57\xb2\xb1\x33\x1d\x40\xa1\xd0" \
  140   "\x3c\x41\xc2\x40\xb3\xc9\xa7\x5b\x48\x92\xf4\xc0\x72\x4b\x68\xc8" \
  141   "\x75\x32\x1a\xb8\xcf\xe5\x02\x3b\xd3\x75\xbc\x0f\x94\xbd\x89\xfe" \
  142   "\x04\xf2\x97\x10\x5d\x7b\x82\xff\xc0\x02\x1a\xeb\x1c\xcb\x67\x4f" \
  143   "\x52\x44\xea\x34\x97\xde\x26\xa4\x19\x1c\x5f\x62\xe5\xe9\xa2\xd8" \
  144   "\x08\x2f\x05\x51\xf4\xa5\x30\x68\x26\xe9\x1c\xc0\x06\xce\x1b\xf6" \
  145   "\x0f\xf7\x19\xd4\x2f\xa5\x21\xc8\x71\xcd\x23\x94\xd9\x6e\xf4\x46" \
  146   "\x8f\x21\x96\x6b\x41\xf2\xba\x80\xc2\x6e\x83\xa9"
  147 #define TEST10_384 \
  148   "\x39\x96\x69\xe2\x8f\x6b\x9c\x6d\xbc\xbb\x69\x12\xec\x10\xff\xcf" \
  149   "\x74\x79\x03\x49\xb7\xdc\x8f\xbe\x4a\x8e\x7b\x3b\x56\x21\xdb\x0f" \
  150   "\x3e\x7d\xc8\x7f\x82\x32\x64\xbb\xe4\x0d\x18\x11\xc9\xea\x20\x61" \
  151   "\xe1\xc8\x4a\xd1\x0a\x23\xfa\xc1\x72\x7e\x72\x02\xfc\x3f\x50\x42" \
  152   "\xe6\xbf\x58\xcb\xa8\xa2\x74\x6e\x1f\x64\xf9\xb9\xea\x35\x2c\x71" \
  153   "\x15\x07\x05\x3c\xf4\xe5\x33\x9d\x52\x86\x5f\x25\xcc\x22\xb5\xe8" \
  154   "\x77\x84\xa1\x2f\xc9\x61\xd6\x6c\xb6\xe8\x95\x73\x19\x9a\x2c\xe6" \
  155   "\x56\x5c\xbd\xf1\x3d\xca\x40\x38\x32\xcf\xcb\x0e\x8b\x72\x11\xe8" \
  156   "\x3a\xf3\x2a\x11\xac\x17\x92\x9f\xf1\xc0\x73\xa5\x1c\xc0\x27\xaa" \
  157   "\xed\xef\xf8\x5a\xad\x7c\x2b\x7c\x5a\x80\x3e\x24\x04\xd9\x6d\x2a" \
  158   "\x77\x35\x7b\xda\x1a\x6d\xae\xed\x17\x15\x1c\xb9\xbc\x51\x25\xa4" \
  159   "\x22\xe9\x41\xde\x0c\xa0\xfc\x50\x11\xc2\x3e\xcf\xfe\xfd\xd0\x96" \
  160   "\x76\x71\x1c\xf3\xdb\x0a\x34\x40\x72\x0e\x16\x15\xc1\xf2\x2f\xbc" \
  161   "\x3c\x72\x1d\xe5\x21\xe1\xb9\x9b\xa1\xbd\x55\x77\x40\x86\x42\x14" \
  162   "\x7e\xd0\x96"
  163 #define TEST7_512 \
  164   "\x08\xec\xb5\x2e\xba\xe1\xf7\x42\x2d\xb6\x2b\xcd\x54\x26\x70"
  165 #define TEST8_512 \
  166   "\x8d\x4e\x3c\x0e\x38\x89\x19\x14\x91\x81\x6e\x9d\x98\xbf\xf0\xa0"
  167 #define TEST9_512 \
  168   "\x3a\xdd\xec\x85\x59\x32\x16\xd1\x61\x9a\xa0\x2d\x97\x56\x97\x0b" \
  169   "\xfc\x70\xac\xe2\x74\x4f\x7c\x6b\x27\x88\x15\x10\x28\xf7\xb6\xa2" \
  170   "\x55\x0f\xd7\x4a\x7e\x6e\x69\xc2\xc9\xb4\x5f\xc4\x54\x96\x6d\xc3" \
  171   "\x1d\x2e\x10\xda\x1f\x95\xce\x02\xbe\xb4\xbf\x87\x65\x57\x4c\xbd" \
  172   "\x6e\x83\x37\xef\x42\x0a\xdc\x98\xc1\x5c\xb6\xd5\xe4\xa0\x24\x1b" \
  173   "\xa0\x04\x6d\x25\x0e\x51\x02\x31\xca\xc2\x04\x6c\x99\x16\x06\xab" \
  174   "\x4e\xe4\x14\x5b\xee\x2f\xf4\xbb\x12\x3a\xab\x49\x8d\x9d\x44\x79" \
  175   "\x4f\x99\xcc\xad\x89\xa9\xa1\x62\x12\x59\xed\xa7\x0a\x5b\x6d\xd4" \
  176   "\xbd\xd8\x77\x78\xc9\x04\x3b\x93\x84\xf5\x49\x06"
  177 #define TEST10_512 \
  178   "\xa5\x5f\x20\xc4\x11\xaa\xd1\x32\x80\x7a\x50\x2d\x65\x82\x4e\x31" \
  179   "\xa2\x30\x54\x32\xaa\x3d\x06\xd3\xe2\x82\xa8\xd8\x4e\x0d\xe1\xde" \
  180   "\x69\x74\xbf\x49\x54\x69\xfc\x7f\x33\x8f\x80\x54\xd5\x8c\x26\xc4" \
  181   "\x93\x60\xc3\xe8\x7a\xf5\x65\x23\xac\xf6\xd8\x9d\x03\xe5\x6f\xf2" \
  182   "\xf8\x68\x00\x2b\xc3\xe4\x31\xed\xc4\x4d\xf2\xf0\x22\x3d\x4b\xb3" \
  183   "\xb2\x43\x58\x6e\x1a\x7d\x92\x49\x36\x69\x4f\xcb\xba\xf8\x8d\x95" \
  184   "\x19\xe4\xeb\x50\xa6\x44\xf8\xe4\xf9\x5e\xb0\xea\x95\xbc\x44\x65" \
  185   "\xc8\x82\x1a\xac\xd2\xfe\x15\xab\x49\x81\x16\x4b\xbb\x6d\xc3\x2f" \
  186   "\x96\x90\x87\xa1\x45\xb0\xd9\xcc\x9c\x67\xc2\x2b\x76\x32\x99\x41" \
  187   "\x9c\xc4\x12\x8b\xe9\xa0\x77\xb3\xac\xe6\x34\x06\x4e\x6d\x99\x28" \
  188   "\x35\x13\xdc\x06\xe7\x51\x5d\x0d\x73\x13\x2e\x9a\x0d\xc6\xd3\xb1" \
  189   "\xf8\xb2\x46\xf1\xa9\x8a\x3f\xc7\x29\x41\xb1\xe3\xbb\x20\x98\xe8" \
  190   "\xbf\x16\xf2\x68\xd6\x4f\x0b\x0f\x47\x07\xfe\x1e\xa1\xa1\x79\x1b" \
  191   "\xa2\xf3\xc0\xc7\x58\xe5\xf5\x51\x86\x3a\x96\xc9\x49\xad\x47\xd7" \
  192   "\xfb\x40\xd2"
  193 #define SHA1_SEED "\xd0\x56\x9c\xb3\x66\x5a\x8a\x43\xeb\x6e\xa2\x3d" \
  194   "\x75\xa3\xc4\xd2\x05\x4a\x0d\x7d"
  195 #define SHA224_SEED "\xd0\x56\x9c\xb3\x66\x5a\x8a\x43\xeb\x6e\xa2" \
  196   "\x3d\x75\xa3\xc4\xd2\x05\x4a\x0d\x7d\x66\xa9\xca\x99\xc9\xce\xb0" \
  197   "\x27"
  198 #define SHA256_SEED "\xf4\x1e\xce\x26\x13\xe4\x57\x39\x15\x69\x6b" \
  199   "\x5a\xdc\xd5\x1c\xa3\x28\xbe\x3b\xf5\x66\xa9\xca\x99\xc9\xce\xb0" \
  200   "\x27\x9c\x1c\xb0\xa7"
  201 #define SHA384_SEED "\x82\x40\xbc\x51\xe4\xec\x7e\xf7\x6d\x18\xe3" \
  202   "\x52\x04\xa1\x9f\x51\xa5\x21\x3a\x73\xa8\x1d\x6f\x94\x46\x80\xd3" \
  203   "\x07\x59\x48\xb7\xe4\x63\x80\x4e\xa3\xd2\x6e\x13\xea\x82\x0d\x65" \
  204   "\xa4\x84\xbe\x74\x53"
  205 #define SHA512_SEED "\x47\x3f\xf1\xb9\xb3\xff\xdf\xa1\x26\x69\x9a" \
  206   "\xc7\xef\x9e\x8e\x78\x77\x73\x09\x58\x24\xc6\x42\x55\x7c\x13\x99" \
  207   "\xd9\x8e\x42\x20\x44\x8d\xc3\x5b\x99\xbf\xdd\x44\x77\x95\x43\x92" \
  208   "\x4c\x1c\xe9\x3b\xc5\x94\x15\x38\x89\x5d\xb9\x88\x26\x1b\x00\x77" \
  209   "\x4b\x12\x27\x20\x39"
  210 
  211 #define TESTCOUNT 10
  212 #define HASHCOUNT 5
  213 #define RANDOMCOUNT 4
  214 #define HMACTESTCOUNT 7
  215 #define HKDFTESTCOUNT 7
  216 
  217 #define PRINTNONE 0
  218 #define PRINTTEXT 1
  219 #define PRINTRAW 2
  220 #define PRINTHEX 3
  221 #define PRINTBASE64 4
  222 
  223 #define PRINTPASSFAIL 1
  224 #define PRINTFAIL 2
  225 
  226 #define length(x) (sizeof(x)-1)
  227 
  228 /* Test arrays for hashes. */
  229 struct hash {
  230     const char *name;
  231     SHAversion whichSha;
  232     int hashsize;
  233     struct {
  234         const char *testarray;
  235         int length;
  236         long repeatcount;
  237         int extrabits;
  238         int numberExtrabits;
  239         const char *resultarray;
  240     } tests[TESTCOUNT];
  241     const char *randomtest;
  242     const char *randomresults[RANDOMCOUNT];
  243 } hashes[HASHCOUNT] = {
  244   { "SHA1", SHA1, SHA1HashSize,
  245     {
  246       /* 1 */ { TEST1, length(TEST1), 1, 0, 0,
  247         "A9993E364706816ABA3E25717850C26C9CD0D89D" },
  248       /* 2 */ { TEST2_1, length(TEST2_1), 1, 0, 0,
  249         "84983E441C3BD26EBAAE4AA1F95129E5E54670F1" },
  250       /* 3 */ { TEST3, length(TEST3), 1000000, 0, 0,
  251         "34AA973CD4C4DAA4F61EEB2BDBAD27316534016F" },
  252       /* 4 */ { TEST4, length(TEST4), 10, 0, 0,
  253         "DEA356A2CDDD90C7A7ECEDC5EBB563934F460452" },
  254       /* 5 */ { "", 0, 0, 0x98, 5,
  255         "29826B003B906E660EFF4027CE98AF3531AC75BA" },
  256       /* 6 */ { "\x5e", 1, 1, 0, 0,
  257         "5E6F80A34A9798CAFC6A5DB96CC57BA4C4DB59C2" },
  258       /* 7 */ { TEST7_1, length(TEST7_1), 1, 0x80, 3,
  259         "6239781E03729919C01955B3FFA8ACB60B988340" },
  260       /* 8 */ { TEST8_1, length(TEST8_1), 1, 0, 0,
  261         "82ABFF6605DBE1C17DEF12A394FA22A82B544A35" },
  262       /* 9 */ { TEST9_1, length(TEST9_1), 1, 0xE0, 3,
  263         "8C5B2A5DDAE5A97FC7F9D85661C672ADBF7933D4" },
  264       /* 10 */ { TEST10_1, length(TEST10_1), 1, 0, 0,
  265         "CB0082C8F197D260991BA6A460E76E202BAD27B3" }
  266     }, SHA1_SEED, { "E216836819477C7F78E0D843FE4FF1B6D6C14CD4",
  267         "A2DBC7A5B1C6C0A8BCB7AAA41252A6A7D0690DBC",
  268         "DB1F9050BB863DFEF4CE37186044E2EEB17EE013",
  269         "127FDEDF43D372A51D5747C48FBFFE38EF6CDF7B"
  270      } },
  271   { "SHA224", SHA224, SHA224HashSize,
  272     {
  273       /* 1 */ { TEST1, length(TEST1), 1, 0, 0,
  274         "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7" },
  275       /* 2 */ { TEST2_1, length(TEST2_1), 1, 0, 0,
  276         "75388B16512776CC5DBA5DA1FD890150B0C6455CB4F58B1952522525" },
  277       /* 3 */ { TEST3, length(TEST3), 1000000, 0, 0,
  278         "20794655980C91D8BBB4C1EA97618A4BF03F42581948B2EE4EE7AD67" },
  279       /* 4 */ { TEST4, length(TEST4), 10, 0, 0,
  280         "567F69F168CD7844E65259CE658FE7AADFA25216E68ECA0EB7AB8262" },
  281       /* 5 */ { "", 0, 0, 0x68, 5,
  282         "E3B048552C3C387BCAB37F6EB06BB79B96A4AEE5FF27F51531A9551C" },
  283       /* 6 */ { "\x07", 1, 1, 0, 0,
  284         "00ECD5F138422B8AD74C9799FD826C531BAD2FCABC7450BEE2AA8C2A" },
  285       /* 7 */ { TEST7_224, length(TEST7_224), 1, 0xA0, 3,
  286         "1B01DB6CB4A9E43DED1516BEB3DB0B87B6D1EA43187462C608137150" },
  287       /* 8 */ { TEST8_224, length(TEST8_224), 1, 0, 0,
  288         "DF90D78AA78821C99B40BA4C966921ACCD8FFB1E98AC388E56191DB1" },
  289       /* 9 */ { TEST9_224, length(TEST9_224), 1, 0xE0, 3,
  290         "54BEA6EAB8195A2EB0A7906A4B4A876666300EEFBD1F3B8474F9CD57" },
  291       /* 10 */ { TEST10_224, length(TEST10_224), 1, 0, 0,
  292         "0B31894EC8937AD9B91BDFBCBA294D9ADEFAA18E09305E9F20D5C3A4" }
  293     }, SHA224_SEED, { "100966A5B4FDE0B42E2A6C5953D4D7F41BA7CF79FD"
  294         "2DF431416734BE", "1DCA396B0C417715DEFAAE9641E10A2E99D55A"
  295         "BCB8A00061EB3BE8BD", "1864E627BDB2319973CD5ED7D68DA71D8B"
  296         "F0F983D8D9AB32C34ADB34", "A2406481FC1BCAF24DD08E6752E844"
  297         "709563FB916227FED598EB621F"
  298      } },
  299   { "SHA256", SHA256, SHA256HashSize,
  300   {
  301       /* 1 */ { TEST1, length(TEST1), 1, 0, 0, "BA7816BF8F01CFEA4141"
  302         "40DE5DAE2223B00361A396177A9CB410FF61F20015AD" },
  303       /* 2 */ { TEST2_1, length(TEST2_1), 1, 0, 0, "248D6A61D20638B8"
  304         "E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1" },
  305       /* 3 */ { TEST3, length(TEST3), 1000000, 0, 0, "CDC76E5C9914FB92"
  306         "81A1C7E284D73E67F1809A48A497200E046D39CCC7112CD0" },
  307       /* 4 */ { TEST4, length(TEST4), 10, 0, 0, "594847328451BDFA"
  308         "85056225462CC1D867D877FB388DF0CE35F25AB5562BFBB5" },
  309       /* 5 */ { "", 0, 0, 0x68, 5, "D6D3E02A31A84A8CAA9718ED6C2057BE"
  310         "09DB45E7823EB5079CE7A573A3760F95" },
  311       /* 6 */ { "\x19", 1, 1, 0, 0, "68AA2E2EE5DFF96E3355E6C7EE373E3D"
  312         "6A4E17F75F9518D843709C0C9BC3E3D4" },
  313       /* 7 */ { TEST7_256, length(TEST7_256), 1, 0x60, 3, "77EC1DC8"
  314         "9C821FF2A1279089FA091B35B8CD960BCAF7DE01C6A7680756BEB972" },
  315       /* 8 */ { TEST8_256, length(TEST8_256), 1, 0, 0, "175EE69B02BA"
  316         "9B58E2B0A5FD13819CEA573F3940A94F825128CF4209BEABB4E8" },
  317       /* 9 */ { TEST9_256, length(TEST9_256), 1, 0xA0, 3, "3E9AD646"
  318         "8BBBAD2AC3C2CDC292E018BA5FD70B960CF1679777FCE708FDB066E9" },
  319       /* 10 */ { TEST10_256, length(TEST10_256), 1, 0, 0, "97DBCA7D"
  320         "F46D62C8A422C941DD7E835B8AD3361763F7E9B2D95F4F0DA6E1CCBC" },
  321     }, SHA256_SEED, { "83D28614D49C3ADC1D6FC05DB5F48037C056F8D2A4CE44"
  322         "EC6457DEA5DD797CD1", "99DBE3127EF2E93DD9322D6A07909EB33B6399"
  323         "5E529B3F954B8581621BB74D39", "8D4BE295BB64661CA3C7EFD129A2F7"
  324         "25B33072DBDDE32385B9A87B9AF88EA76F", "40AF5D3F9716B040DF9408"
  325         "E31536B70FF906EC51B00447CA97D7DD97C12411F4"
  326     } },
  327   { "SHA384", SHA384, SHA384HashSize,
  328     {
  329       /* 1 */ { TEST1, length(TEST1), 1, 0, 0,
  330         "CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED163"
  331         "1A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7" },
  332       /* 2 */ { TEST2_2, length(TEST2_2), 1, 0, 0,
  333         "09330C33F71147E83D192FC782CD1B4753111B173B3B05D2"
  334         "2FA08086E3B0F712FCC7C71A557E2DB966C3E9FA91746039" },
  335       /* 3 */ { TEST3, length(TEST3), 1000000, 0, 0,
  336         "9D0E1809716474CB086E834E310A4A1CED149E9C00F24852"
  337         "7972CEC5704C2A5B07B8B3DC38ECC4EBAE97DDD87F3D8985" },
  338       /* 4 */ { TEST4, length(TEST4), 10, 0, 0,
  339         "2FC64A4F500DDB6828F6A3430B8DD72A368EB7F3A8322A70"
  340         "BC84275B9C0B3AB00D27A5CC3C2D224AA6B61A0D79FB4596" },
  341       /* 5 */ { "", 0, 0, 0x10, 5,
  342         "8D17BE79E32B6718E07D8A603EB84BA0478F7FCFD1BB9399"
  343         "5F7D1149E09143AC1FFCFC56820E469F3878D957A15A3FE4" },
  344       /* 6 */ { "\xb9", 1, 1, 0, 0,
  345         "BC8089A19007C0B14195F4ECC74094FEC64F01F90929282C"
  346         "2FB392881578208AD466828B1C6C283D2722CF0AD1AB6938" },
  347       /* 7 */ { TEST7_384, length(TEST7_384), 1, 0xA0, 3,
  348         "D8C43B38E12E7C42A7C9B810299FD6A770BEF30920F17532"
  349         "A898DE62C7A07E4293449C0B5FA70109F0783211CFC4BCE3" },
  350       /* 8 */ { TEST8_384, length(TEST8_384), 1, 0, 0,
  351         "C9A68443A005812256B8EC76B00516F0DBB74FAB26D66591"
  352         "3F194B6FFB0E91EA9967566B58109CBC675CC208E4C823F7" },
  353       /* 9 */ { TEST9_384, length(TEST9_384), 1, 0xE0, 3,
  354         "5860E8DE91C21578BB4174D227898A98E0B45C4C760F0095"
  355         "49495614DAEDC0775D92D11D9F8CE9B064EEAC8DAFC3A297" },
  356       /* 10 */ { TEST10_384, length(TEST10_384), 1, 0, 0,
  357         "4F440DB1E6EDD2899FA335F09515AA025EE177A79F4B4AAF"
  358         "38E42B5C4DE660F5DE8FB2A5B2FBD2A3CBFFD20CFF1288C0" }
  359     }, SHA384_SEED, { "CE44D7D63AE0C91482998CF662A51EC80BF6FC68661A3C"
  360         "57F87566112BD635A743EA904DEB7D7A42AC808CABE697F38F", "F9C6D2"
  361         "61881FEE41ACD39E67AA8D0BAD507C7363EB67E2B81F45759F9C0FD7B503"
  362         "DF1A0B9E80BDE7BC333D75B804197D", "D96512D8C9F4A7A4967A366C01"
  363         "C6FD97384225B58343A88264847C18E4EF8AB7AEE4765FFBC3E30BD485D3"
  364         "638A01418F", "0CA76BD0813AF1509E170907A96005938BC985628290B2"
  365         "5FEF73CF6FAD68DDBA0AC8920C94E0541607B0915A7B4457F7"
  366     } },
  367   { "SHA512", SHA512, SHA512HashSize,
  368     {
  369       /* 1 */ { TEST1, length(TEST1), 1, 0, 0,
  370         "DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA2"
  371         "0A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD"
  372         "454D4423643CE80E2A9AC94FA54CA49F" },
  373       /* 2 */ { TEST2_2, length(TEST2_2), 1, 0, 0,
  374         "8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7FA1"
  375         "7299AEADB6889018501D289E4900F7E4331B99DEC4B5433A"
  376         "C7D329EEB6DD26545E96E55B874BE909" },
  377        /* 3 */ { TEST3, length(TEST3), 1000000, 0, 0,
  378         "E718483D0CE769644E2E42C7BC15B4638E1F98B13B204428"
  379         "5632A803AFA973EBDE0FF244877EA60A4CB0432CE577C31B"
  380         "EB009C5C2C49AA2E4EADB217AD8CC09B" },
  381       /* 4 */ { TEST4, length(TEST4), 10, 0, 0,
  382         "89D05BA632C699C31231DED4FFC127D5A894DAD412C0E024"
  383         "DB872D1ABD2BA8141A0F85072A9BE1E2AA04CF33C765CB51"
  384         "0813A39CD5A84C4ACAA64D3F3FB7BAE9" },
  385       /* 5 */ { "", 0, 0, 0xB0, 5,
  386         "D4EE29A9E90985446B913CF1D1376C836F4BE2C1CF3CADA0"
  387         "720A6BF4857D886A7ECB3C4E4C0FA8C7F95214E41DC1B0D2"
  388         "1B22A84CC03BF8CE4845F34DD5BDBAD4" },
  389       /* 6 */ { "\xD0", 1, 1, 0, 0,
  390         "9992202938E882E73E20F6B69E68A0A7149090423D93C81B"
  391         "AB3F21678D4ACEEEE50E4E8CAFADA4C85A54EA8306826C4A"
  392         "D6E74CECE9631BFA8A549B4AB3FBBA15" },
  393       /* 7 */ { TEST7_512, length(TEST7_512), 1, 0x80, 3,
  394         "ED8DC78E8B01B69750053DBB7A0A9EDA0FB9E9D292B1ED71"
  395         "5E80A7FE290A4E16664FD913E85854400C5AF05E6DAD316B"
  396         "7359B43E64F8BEC3C1F237119986BBB6" },
  397       /* 8 */ { TEST8_512, length(TEST8_512), 1, 0, 0,
  398         "CB0B67A4B8712CD73C9AABC0B199E9269B20844AFB75ACBD"
  399         "D1C153C9828924C3DDEDAAFE669C5FDD0BC66F630F677398"
  400         "8213EB1B16F517AD0DE4B2F0C95C90F8" },
  401       /* 9 */ { TEST9_512, length(TEST9_512), 1, 0x80, 3,
  402         "32BA76FC30EAA0208AEB50FFB5AF1864FDBF17902A4DC0A6"
  403         "82C61FCEA6D92B783267B21080301837F59DE79C6B337DB2"
  404         "526F8A0A510E5E53CAFED4355FE7C2F1" },
  405       /* 10 */ { TEST10_512, length(TEST10_512), 1, 0, 0,
  406         "C665BEFB36DA189D78822D10528CBF3B12B3EEF726039909"
  407         "C1A16A270D48719377966B957A878E720584779A62825C18"
  408         "DA26415E49A7176A894E7510FD1451F5" }
  409     }, SHA512_SEED, { "2FBB1E7E00F746BA514FBC8C421F36792EC0E11FF5EFC3"
  410         "78E1AB0C079AA5F0F66A1E3EDBAEB4F9984BE14437123038A452004A5576"
  411         "8C1FD8EED49E4A21BEDCD0", "25CBE5A4F2C7B1D7EF07011705D50C62C5"
  412         "000594243EAFD1241FC9F3D22B58184AE2FEE38E171CF8129E29459C9BC2"
  413         "EF461AF5708887315F15419D8D17FE7949", "5B8B1F2687555CE2D7182B"
  414         "92E5C3F6C36547DA1C13DBB9EA4F73EA4CBBAF89411527906D35B1B06C1B"
  415         "6A8007D05EC66DF0A406066829EAB618BDE3976515AAFC", "46E36B007D"
  416         "19876CDB0B29AD074FE3C08CDD174D42169D6ABE5A1414B6E79707DF5877"
  417         "6A98091CF431854147BB6D3C66D43BFBC108FD715BDE6AA127C2B0E79F"
  418     }
  419   }
  420 };
  421 
  422 /* Test arrays for HMAC. */
  423 struct hmachash {
  424     const char *keyarray[5];
  425     int keylength[5];
  426     const char *dataarray[5];
  427     int datalength[5];
  428     const char *resultarray[5];
  429     int resultlength[5];
  430 } hmachashes[HMACTESTCOUNT] = {
  431   { /* 1 */ {
  432       "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  433       "\x0b\x0b\x0b\x0b\x0b"
  434     }, { 20 }, {
  435       "\x48\x69\x20\x54\x68\x65\x72\x65" /* "Hi There" */
  436     }, { 8 }, {
  437       /* HMAC-SHA-1 */
  438       "B617318655057264E28BC0B6FB378C8EF146BE00",
  439       /* HMAC-SHA-224 */
  440       "896FB1128ABBDF196832107CD49DF33F47B4B1169912BA4F53684B22",
  441       /* HMAC-SHA-256 */
  442       "B0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833DA726E9376C2E32"
  443       "CFF7",
  444       /* HMAC-SHA-384 */
  445       "AFD03944D84895626B0825F4AB46907F15F9DADBE4101EC682AA034C7CEB"
  446       "C59CFAEA9EA9076EDE7F4AF152E8B2FA9CB6",
  447       /* HMAC-SHA-512 */
  448       "87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2787AD0B30545E1"
  449       "7CDEDAA833B7D6B8A702038B274EAEA3F4E4BE9D914EEB61F1702E696C20"
  450       "3A126854"
  451     }, { SHA1HashSize, SHA224HashSize, SHA256HashSize,
  452       SHA384HashSize, SHA512HashSize }
  453   },
  454   { /* 2 */ {
  455       "\x4a\x65\x66\x65" /* "Jefe" */
  456     }, { 4 }, {
  457       "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74"
  458       "\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f"
  459       /* "what do ya want for nothing?" */
  460     }, { 28 }, {
  461       /* HMAC-SHA-1 */
  462       "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79",
  463       /* HMAC-SHA-224 */
  464       "A30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E6148008FD05E44",
  465       /* HMAC-SHA-256 */
  466       "5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC"
  467       "3843",
  468       /* HMAC-SHA-384 */
  469       "AF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B47E42EC3736322"
  470       "445E8E2240CA5E69E2C78B3239ECFAB21649",
  471       /* HMAC-SHA-512 */
  472       "164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831FD610270CD7EA25"
  473       "05549758BF75C05A994A6D034F65F8F0E6FDCAEAB1A34D4A6B4B636E070A"
  474       "38BCE737"
  475     }, { SHA1HashSize, SHA224HashSize, SHA256HashSize,
  476       SHA384HashSize, SHA512HashSize }
  477   },
  478   { /* 3 */
  479     {
  480       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  481       "\xaa\xaa\xaa\xaa\xaa"
  482     }, { 20 }, {
  483       "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  484       "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  485       "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  486       "\xdd\xdd\xdd\xdd\xdd"
  487     }, { 50 }, {
  488       /* HMAC-SHA-1 */
  489       "125D7342B9AC11CD91A39AF48AA17B4F63F175D3",
  490       /* HMAC-SHA-224 */
  491       "7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69D1EC8333EA",
  492       /* HMAC-SHA-256 */
  493       "773EA91E36800E46854DB8EBD09181A72959098B3EF8C122D9635514CED5"
  494       "65FE",
  495       /* HMAC-SHA-384 */
  496       "88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9FEBE83EF4E55966"
  497       "144B2A5AB39DC13814B94E3AB6E101A34F27",
  498       /* HMAC-SHA-512 */
  499       "FA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A3655F83E33B227"
  500       "9D39BF3E848279A722C806B485A47E67C807B946A337BEE8942674278859"
  501       "E13292FB"
  502     }, { SHA1HashSize, SHA224HashSize, SHA256HashSize,
  503       SHA384HashSize, SHA512HashSize }
  504   },
  505   { /* 4 */ {
  506       "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
  507       "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19"
  508     }, { 25 }, {
  509       "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  510       "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  511       "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  512       "\xcd\xcd\xcd\xcd\xcd"
  513     }, { 50 }, {
  514       /* HMAC-SHA-1 */
  515       "4C9007F4026250C6BC8414F9BF50C86C2D7235DA",
  516       /* HMAC-SHA-224 */
  517       "6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC012DE7AFEC5A",
  518       /* HMAC-SHA-256 */
  519       "82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8077A2E3FF46729"
  520       "665B",
  521       /* HMAC-SHA-384 */
  522       "3E8A69B7783C25851933AB6290AF6CA77A9981480850009CC5577C6E1F57"
  523       "3B4E6801DD23C4A7D679CCF8A386C674CFFB",
  524       /* HMAC-SHA-512 */
  525       "B0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B872DE76F8050361E"
  526       "E3DBA91CA5C11AA25EB4D679275CC5788063A5F19741120C4F2DE2ADEBEB"
  527       "10A298DD"
  528     }, { SHA1HashSize, SHA224HashSize, SHA256HashSize,
  529       SHA384HashSize, SHA512HashSize }
  530   },
  531   { /* 5 */ {
  532       "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
  533       "\x0c\x0c\x0c\x0c\x0c"
  534     }, { 20 }, {
  535       "Test With Truncation"
  536     }, { 20 }, {
  537       /* HMAC-SHA-1 */
  538       "4C1A03424B55E07FE7F27BE1",
  539       /* HMAC-SHA-224 */
  540       "0E2AEA68A90C8D37C988BCDB9FCA6FA8",
  541       /* HMAC-SHA-256 */
  542       "A3B6167473100EE06E0C796C2955552B",
  543       /* HMAC-SHA-384 */
  544       "3ABF34C3503B2A23A46EFC619BAEF897",
  545       /* HMAC-SHA-512 */
  546       "415FAD6271580A531D4179BC891D87A6"
  547     }, { 12, 16, 16, 16, 16 }
  548   },
  549   { /* 6 */ {
  550       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  551       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  552       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  553       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  554       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  555       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  556       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  557       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  558       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  559     }, { 80, 131 }, {
  560       "Test Using Larger Than Block-Size Key - Hash Key First"
  561     }, { 54 }, {
  562       /* HMAC-SHA-1 */
  563       "AA4AE5E15272D00E95705637CE8A3B55ED402112",
  564       /* HMAC-SHA-224 */
  565       "95E9A0DB962095ADAEBE9B2D6F0DBCE2D499F112F2D2B7273FA6870E",
  566       /* HMAC-SHA-256 */
  567       "60E431591EE0B67F0D8A26AACBF5B77F8E0BC6213728C5140546040F0EE3"
  568       "7F54",
  569       /* HMAC-SHA-384 */
  570       "4ECE084485813E9088D2C63A041BC5B44F9EF1012A2B588F3CD11F05033A"
  571       "C4C60C2EF6AB4030FE8296248DF163F44952",
  572       /* HMAC-SHA-512 */
  573       "80B24263C7C1A3EBB71493C1DD7BE8B49B46D1F41B4AEEC1121B013783F8"
  574       "F3526B56D037E05F2598BD0FD2215D6A1E5295E64F73F63F0AEC8B915A98"
  575       "5D786598"
  576     }, { SHA1HashSize, SHA224HashSize, SHA256HashSize,
  577       SHA384HashSize, SHA512HashSize }
  578   },
  579   { /* 7 */ {
  580       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  581       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  582       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  583       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  584       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  585       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  586       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  587       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  588       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  589     }, { 80, 131 }, {
  590       "Test Using Larger Than Block-Size Key and "
  591       "Larger Than One Block-Size Data",
  592       "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20"
  593       "\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
  594       "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65"
  595       "\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
  596       "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73"
  597       "\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
  598       "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20"
  599       "\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
  600       "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68"
  601       "\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
  602       "\x6d\x2e"
  603       /* "This is a test using a larger than block-size key and a "
  604           "larger than block-size data.  The key needs to be hashed "
  605           "before being used by the HMAC algorithm." */
  606     }, { 73, 152 }, {
  607       /* HMAC-SHA-1 */
  608       "E8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
  609       /* HMAC-SHA-224 */
  610       "3A854166AC5D9F023F54D517D0B39DBD946770DB9C2B95C9F6F565D1",
  611       /* HMAC-SHA-256 */
  612       "9B09FFA71B942FCB27635FBCD5B0E944BFDC63644F0713938A7F51535C3A"
  613       "35E2",
  614       /* HMAC-SHA-384 */
  615       "6617178E941F020D351E2F254E8FD32C602420FEB0B8FB9ADCCEBB82461E"
  616       "99C5A678CC31E799176D3860E6110C46523E",
  617       /* HMAC-SHA-512 */
  618       "E37B6A775DC87DBAA4DFA9F96E5E3FFDDEBD71F8867289865DF5A32D20CD"
  619       "C944B6022CAC3C4982B10D5EEB55C3E4DE15134676FB6DE0446065C97440"
  620       "FA8C6A58"
  621     }, { SHA1HashSize, SHA224HashSize, SHA256HashSize,
  622       SHA384HashSize, SHA512HashSize }
  623   }
  624 };
  625 
  626 /* Test arrays for HKDF. */
  627 struct hkdfhash {
  628     SHAversion whichSha;
  629     int ikmlength;
  630     const char *ikmarray;
  631     int saltlength;
  632     const char *saltarray;
  633     int infolength;
  634     const char *infoarray;
  635     int prklength;
  636     const char *prkarray;
  637     int okmlength;
  638     const char *okmarray;
  639 } hkdfhashes[HKDFTESTCOUNT] = {
  640     {   /* RFC 5869 A.1. Test Case 1 */
  641         SHA256,
  642         22, "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  643             "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
  644         13, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c",
  645         10, "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9",
  646         32, "077709362C2E32DF0DDC3F0DC47BBA6390B6C73BB50F9C3122EC844A"
  647             "D7C2B3E5",
  648         42, "3CB25F25FAACD57A90434F64D0362F2A2D2D0A90CF1A5A4C5DB02D56"
  649             "ECC4C5BF34007208D5B887185865"
  650     },
  651     {   /* RFC 5869 A.2. Test Case 2 */
  652         SHA256,
  653         80, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
  654             "\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b"
  655             "\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29"
  656             "\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37"
  657             "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45"
  658             "\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f",
  659         80, "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d"
  660             "\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b"
  661             "\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89"
  662             "\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97"
  663             "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5"
  664             "\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
  665         80, "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd"
  666             "\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb"
  667             "\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9"
  668             "\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
  669             "\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5"
  670             "\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
  671         32, "06A6B88C5853361A06104C9CEB35B45C"
  672             "EF760014904671014A193F40C15FC244",
  673         82, "B11E398DC80327A1C8E7F78C596A4934"
  674             "4F012EDA2D4EFAD8A050CC4C19AFA97C"
  675             "59045A99CAC7827271CB41C65E590E09"
  676             "DA3275600C2F09B8367793A9ACA3DB71"
  677             "CC30C58179EC3E87C14C01D5C1F3434F"
  678             "1D87"
  679     },
  680     {   /* RFC 5869 A.3. Test Case 3 */
  681         SHA256,
  682         22, "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  683             "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
  684         0, "",
  685         0, "",
  686         32, "19EF24A32C717B167F33A91D6F648BDF"
  687             "96596776AFDB6377AC434C1C293CCB04",
  688         42, "8DA4E775A563C18F715F802A063C5A31"
  689             "B8A11F5C5EE1879EC3454E5F3C738D2D"
  690             "9D201395FAA4B61A96C8"
  691     },
  692     {   /* RFC 5869 A.4. Test Case 4 */
  693         SHA1,
  694         11, "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
  695         13, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c",
  696         10, "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9",
  697         20, "9B6C18C432A7BF8F0E71C8EB88F4B30BAA2BA243",
  698         42, "085A01EA1B10F36933068B56EFA5AD81"
  699             "A4F14B822F5B091568A9CDD4F155FDA2"
  700             "C22E422478D305F3F896"
  701     },
  702     {   /* RFC 5869 A.5. Test Case 5 */
  703         SHA1,
  704         80, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
  705             "\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b"
  706             "\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29"
  707             "\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37"
  708             "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45"
  709             "\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f",
  710         80, "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D"
  711             "\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B"
  712             "\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89"
  713             "\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97"
  714             "\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5"
  715             "\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF",
  716         80, "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD"
  717             "\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB"
  718             "\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9"
  719             "\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7"
  720             "\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5"
  721             "\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF",
  722         20, "8ADAE09A2A307059478D309B26C4115A224CFAF6",
  723         82, "0BD770A74D1160F7C9F12CD5912A06EB"
  724             "FF6ADCAE899D92191FE4305673BA2FFE"
  725             "8FA3F1A4E5AD79F3F334B3B202B2173C"
  726             "486EA37CE3D397ED034C7F9DFEB15C5E"
  727             "927336D0441F4C4300E2CFF0D0900B52"
  728             "D3B4"
  729     },
  730     {   /* RFC 5869 A.6. Test Case 6 */
  731         SHA1,
  732         22, "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  733             "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
  734         0, "",
  735         0, "",
  736         20, "DA8C8A73C7FA77288EC6F5E7C297786AA0D32D01",
  737         42, "0AC1AF7002B3D761D1E55298DA9D0506"
  738             "B9AE52057220A306E07B6B87E8DF21D0"
  739             "EA00033DE03984D34918"
  740     },
  741     {   /* RFC 5869 A.7. Test Case 7. */
  742         SHA1,
  743         22, "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
  744             "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
  745         0, 0,
  746         0, "",
  747         20, "2ADCCADA18779E7C2077AD2EB19D3F3E731385DD",
  748         42, "2C91117204D745F3500D636A62F64F0A"
  749             "B3BAE548AA53D423B0D1F27EBBA6F5E5"
  750             "673A081D70CCE7ACFC48"
  751     }
  752 };
  753 
  754 /*
  755  * Check the hash value against the expected string, expressed in hex
  756  */
  757 static const char hexdigits[ ] = "0123456789ABCDEF";
  758 static int checkmatch(const unsigned char *hashvalue,
  759   const char *hexstr, int hashsize)
  760 {
  761   int i;
  762   for (i = 0; i < hashsize; ++i) {
  763     if (*hexstr++ != hexdigits[(hashvalue[i] >> 4) & 0xF])
  764       return 0;
  765     if (*hexstr++ != hexdigits[hashvalue[i] & 0xF]) return 0;
  766   }
  767   return 1;
  768 }
  769 
  770 /*
  771  * Print the string, converting non-printable characters to "."
  772  */
  773 static void printstr(const char *str, int len)
  774 {
  775   for ( ; len-- > 0; str++)
  776     putchar(isprint((unsigned char)*str) ? *str : '.');
  777 }
  778 
  779 /*
  780  * Print the string, converting all characters to hex "## ".
  781  */
  782 static void printxstr(const char *str, int len)
  783 {
  784   char *sep = "";
  785   for ( ; len-- > 0; str++) {
  786     printf("%s%c%c", sep, hexdigits[(*str >> 4) & 0xF],
  787       hexdigits[*str & 0xF]);
  788     sep = " ";
  789   }
  790 }
  791 
  792 /*
  793  * Print a usage message.
  794  */
  795 static void usage(const char *argv0)
  796 {
  797   fprintf(stderr,
  798     "Usage:\n"
  799     "Common options: [-h hash] [-w|-x|-6] [-H]\n"
  800     "Hash a string:\n"
  801       "\t%s [-S expectedresult] -s hashstr [-k key] "
  802            "[-i info -L okm-len]\n"
  803     "Hash a file:\n"
  804       "\t%s [-S expectedresult] -f file [-k key] "
  805            "[-i info -L okm-len]\n"
  806     "Hash a file, ignoring whitespace:\n"
  807       "\t%s [-S expectedresult] -F file [-k key] "
  808            "[-i info -L okm-len]\n"
  809     "Additional bits to add in: [-B bitcount -b bits]\n"
  810     "(If -k,-i&-L are used, run HKDF-SHA###.\n"
  811     " If -k is used, but not -i&-L, run HMAC-SHA###.\n"
  812     " Otherwise, run SHA###.)\n"
  813     "Standard tests:\n"
  814       "\t%s [-m | -d] [-l loopcount] [-t test#] [-e]\n"
  815       "\t\t[-r randomseed] [-R randomloop-count] "
  816         "[-p] [-P|-X]\n"
  817     "-h\thash to test: "
  818       "0|SHA1, 1|SHA224, 2|SHA256, 3|SHA384, 4|SHA512\n"
  819     "-m\tperform hmac standard tests\n"
  820     "-k\tkey for hmac test\n"
  821     "-d\tperform hkdf standard tests\n"
  822     "-t\ttest case to run, 1-10\n"
  823     "-l\thow many times to run the test\n"
  824     "-e\ttest error returns\n"
  825     "-p\tdo not print results\n"
  826     "-P\tdo not print PASSED/FAILED\n"
  827     "-X\tprint FAILED, but not PASSED\n"
  828     "-r\tseed for random test\n"
  829     "-R\thow many times to run random test\n"
  830     "-s\tstring to hash\n"
  831     "-S\texpected result of hashed string, in hex\n"
  832     "-w\toutput hash in raw format\n"
  833     "-x\toutput hash in hex format\n"
  834     "-6\toutput hash in base64 format\n"
  835     "-B\t# extra bits to add in after string or file input\n"
  836     "-b\textra bits to add (high order bits of #, 0# or 0x#)\n"
  837     "-H\tinput hashstr or randomseed is in hex\n"
  838     , argv0, argv0, argv0, argv0);
  839   exit(1);
  840 }
  841 
  842 /*
  843  * Print the results and PASS/FAIL.
  844  */
  845 static void printResult(uint8_t *Message_Digest, int hashsize,
  846     const char *hashname, const char *testtype, const char *testname,
  847     const char *resultarray, int printResults, int printPassFail)
  848 {
  849   int i, k;
  850   if (printResults == PRINTTEXT) {
  851     printf("\nhashsize=%d\n", hashsize);
  852     putchar('\t');
  853     for (i = 0; i < hashsize; ++i) {
  854       putchar(hexdigits[(Message_Digest[i] >> 4) & 0xF]);
  855       putchar(hexdigits[Message_Digest[i] & 0xF]);
  856       putchar(' ');
  857     }
  858     putchar('\n');
  859   } else if (printResults == PRINTRAW) {
  860     fwrite(Message_Digest, 1, hashsize, stdout);
  861   } else if (printResults == PRINTHEX) {
  862     for (i = 0; i < hashsize; ++i) {
  863       putchar(hexdigits[(Message_Digest[i] >> 4) & 0xF]);
  864       putchar(hexdigits[Message_Digest[i] & 0xF]);
  865     }
  866     putchar('\n');
  867   } else if (printResults == PRINTBASE64) {
  868     unsigned char b;
  869     char *sm = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  870                "0123456789+/";
  871     for (i = 0; i < hashsize; i += 3) {
  872       putchar(sm[Message_Digest[i] >> 2]);
  873       b = (Message_Digest[i] & 0x03) << 4;
  874       if (i+1 < hashsize) b |= Message_Digest[i+1] >> 4;
  875       putchar(sm[b]);
  876       if (i+1 < hashsize) {
  877         b = (Message_Digest[i+1] & 0x0f) << 2;
  878         if (i+2 < hashsize) b |= Message_Digest[i+2] >> 6;
  879         putchar(sm[b]);
  880       } else putchar('=');
  881       if (i+2 < hashsize) putchar(sm[Message_Digest[i+2] & 0x3f]);
  882       else putchar('=');
  883     }
  884     putchar('\n');
  885   }
  886 
  887   if (printResults && resultarray) {
  888     printf("    Should match:\n\t");
  889     for (i = 0, k = 0; i < hashsize; i++, k += 2) {
  890       putchar(resultarray[k]);
  891       putchar(resultarray[k+1]);
  892       putchar(' ');
  893     }
  894     putchar('\n');
  895   }
  896 
  897   if (printPassFail && resultarray) {
  898     int ret = checkmatch(Message_Digest, resultarray, hashsize);
  899     if ((printPassFail == PRINTPASSFAIL) || !ret)
  900       printf("%s %s %s: %s\n", hashname, testtype, testname,
  901         ret ? "PASSED" : "FAILED");
  902   }
  903 }
  904 
  905 /*
  906  * Exercise a hash series of functions.  The input is the testarray,
  907  * repeated repeatcount times, followed by the extrabits.  If the
  908  * result is known, it is in resultarray in uppercase hex.
  909  */
  910 static int hash(int testno, int loopno, int hashno,
  911   const char *testarray, int length, long repeatcount,
  912   int numberExtrabits, int extrabits, const unsigned char *keyarray,
  913   int keylen, const unsigned char *info, int infolen, int okmlen,
  914   const char *resultarray, int hashsize, int printResults,
  915   int printPassFail)
  916 {
  917   USHAContext sha;
  918   HMACContext hmac;
  919   HKDFContext hkdf;
  920   int err, i;
  921   uint8_t Message_Digest_Buf[USHAMaxHashSize];
  922   uint8_t *Message_Digest = Message_Digest_Buf;
  923   char buf[20];
  924 
  925   if (printResults == PRINTTEXT) {
  926     printf("\nTest %d: Iteration %d, Repeat %ld\n\t'", testno+1,
  927       loopno, repeatcount);
  928     printstr(testarray, length);
  929     printf("'\n\t'");
  930     printxstr(testarray, length);
  931     printf("'\n");
  932     printf("    Length=%d bytes (%d bits), ", length, length * 8);
  933     printf("ExtraBits %d: %2.2x\n", numberExtrabits, extrabits);
  934   }
  935 
  936   if (info) Message_Digest = malloc(okmlen);
  937   memset(&sha, '\343', sizeof(sha)); /* force bad data into struct */
  938   memset(&hmac, '\343', sizeof(hmac));
  939   memset(&hkdf, '\343', sizeof(hkdf));
  940 
  941   err = info ? hkdfReset(&hkdf, hashes[hashno].whichSha,
  942                              keyarray, keylen) :
  943         keyarray ? hmacReset(&hmac, hashes[hashno].whichSha,
  944                              keyarray, keylen) :
  945                    USHAReset(&sha, hashes[hashno].whichSha);
  946   if (err != shaSuccess) {
  947     fprintf(stderr, "hash(): %sReset Error %d.\n",
  948             info ? "hkdf" : keyarray ? "hmac" : "sha", err);
  949     if (info) free(Message_Digest);
  950     return err;
  951   }
  952 
  953   for (i = 0; i < repeatcount; ++i) {
  954     err = info ? hkdfInput(&hkdf, (const uint8_t *)testarray, length) :
  955           keyarray ? hmacInput(&hmac, (const uint8_t *) testarray,
  956                                length) :
  957                      USHAInput(&sha, (const uint8_t *) testarray,
  958                                length);
  959     if (err != shaSuccess) {
  960       fprintf(stderr, "hash(): %sInput Error %d.\n",
  961               info ? "hkdf" : keyarray ? "hmac" : "sha", err);
  962       if (info) free(Message_Digest);
  963       return err;
  964     }
  965   }
  966 
  967   if (numberExtrabits > 0) {
  968     err = info ? hkdfFinalBits(&hkdf, extrabits, numberExtrabits) :
  969           keyarray ? hmacFinalBits(&hmac, (uint8_t) extrabits,
  970                                    numberExtrabits) :
  971                      USHAFinalBits(&sha, (uint8_t) extrabits,
  972                                    numberExtrabits);
  973     if (err != shaSuccess) {
  974       fprintf(stderr, "hash(): %sFinalBits Error %d.\n",
  975               info ? "hkdf" : keyarray ? "hmac" : "sha", err);
  976       if (info) free(Message_Digest);
  977       return err;
  978     }
  979   }
  980 
  981   err = info ? hkdfResult(&hkdf, 0, info, infolen,
  982                           Message_Digest, okmlen) :
  983         keyarray ? hmacResult(&hmac, Message_Digest) :
  984                    USHAResult(&sha, Message_Digest);
  985   if (err != shaSuccess) {
  986     fprintf(stderr, "hash(): %s Result Error %d, could not compute "
  987       "message digest.\n",
  988       info ? "hkdf" : keyarray ? "hmac" : "sha", err);
  989     if (info) free(Message_Digest);
  990     return err;
  991   }
  992 
  993   sprintf(buf, "%d", testno+1);
  994   printResult(Message_Digest, info ? okmlen : hashsize,
  995     hashes[hashno].name, info ? "hkdf standard test" :
  996     keyarray ? "hmac standard test" : "sha standard test", buf,
  997     resultarray, printResults, printPassFail);
  998 
  999   if (info) free(Message_Digest);
 1000 
 1001   return err;
 1002 }
 1003 
 1004 /*
 1005  * Exercise an HKDF series.  The input is the testarray,
 1006  * repeated repeatcount times, followed by the extrabits.  If the
 1007  * result is known, it is in resultarray in uppercase hex.
 1008  */
 1009 static int hashHkdf(int testno, int loopno, int hashno,
 1010   int printResults, int printPassFail)
 1011 {
 1012   int err;
 1013   unsigned char prk[USHAMaxHashSize+1];
 1014   uint8_t okm[255 * USHAMaxHashSize+1];
 1015   char buf[20];
 1016 
 1017   (void) hashno;  /* Silence 'unused parameter' warning */
 1018 
 1019   if (printResults == PRINTTEXT) {
 1020     printf("\nTest %d: Iteration %d\n\tSALT\t'", testno+1, loopno);
 1021     printxstr(hkdfhashes[testno].saltarray,
 1022       hkdfhashes[testno].saltlength);
 1023     printf("'\n\tIKM\t'");
 1024     printxstr(hkdfhashes[testno].ikmarray,
 1025       hkdfhashes[testno].ikmlength);
 1026     printf("'\n\tINFO\t'");
 1027     printxstr(hkdfhashes[testno].infoarray,
 1028       hkdfhashes[testno].infolength);
 1029     printf("'\n");
 1030     printf("    L=%d bytes\n", hkdfhashes[testno].okmlength);
 1031   }
 1032 
 1033   /* Run hkdf() against the test vectors */
 1034   err = hkdf(hkdfhashes[testno].whichSha,
 1035              (const uint8_t *) hkdfhashes[testno].saltarray,
 1036              hkdfhashes[testno].saltlength,
 1037              (const uint8_t *) hkdfhashes[testno].ikmarray,
 1038              hkdfhashes[testno].ikmlength,
 1039              (const uint8_t *) hkdfhashes[testno].infoarray,
 1040              hkdfhashes[testno].infolength, okm,
 1041              hkdfhashes[testno].okmlength);
 1042   if (err != shaSuccess) {
 1043     fprintf(stderr, "hashHkdf(): hkdf Error %d.\n", err);
 1044     return err;
 1045   }
 1046   sprintf(buf, "hkdf %d", testno+1);
 1047   printResult(okm, hkdfhashes[testno].okmlength,
 1048     USHAHashName(hkdfhashes[testno].whichSha), "hkdf standard test",
 1049     buf, hkdfhashes[testno].okmarray, printResults, printPassFail);
 1050 
 1051   /* Now run hkdfExtract() by itself against the test vectors */
 1052   /* to verify the intermediate results. */
 1053   err = hkdfExtract(hkdfhashes[testno].whichSha,
 1054                     (const uint8_t *) hkdfhashes[testno].saltarray,
 1055                     hkdfhashes[testno].saltlength,
 1056                     (const uint8_t *) hkdfhashes[testno].ikmarray,
 1057                     hkdfhashes[testno].ikmlength, prk);
 1058   if (err != shaSuccess) {
 1059     fprintf(stderr, "hashHkdf(): hkdfExtract Error %d.\n", err);
 1060     return err;
 1061   }
 1062   sprintf(buf, "hkdfExtract %d", testno+1);
 1063   printResult(prk, USHAHashSize(hkdfhashes[testno].whichSha),
 1064     USHAHashName(hkdfhashes[testno].whichSha), "hkdf standard test",
 1065     buf, hkdfhashes[testno].prkarray, printResults, printPassFail);
 1066 
 1067   /* Now run hkdfExpand() by itself against the test vectors */
 1068   /* using the intermediate results from hkdfExtract. */
 1069   err = hkdfExpand(hkdfhashes[testno].whichSha, prk,
 1070     USHAHashSize(hkdfhashes[testno].whichSha),
 1071     (const uint8_t *)hkdfhashes[testno].infoarray,
 1072     hkdfhashes[testno].infolength, okm, hkdfhashes[testno].okmlength);
 1073   if (err != shaSuccess) {
 1074     fprintf(stderr, "hashHkdf(): hkdfExpand Error %d.\n", err);
 1075     return err;
 1076   }
 1077   sprintf(buf, "hkdfExpand %d", testno+1);
 1078   printResult(okm, hkdfhashes[testno].okmlength,
 1079     USHAHashName(hkdfhashes[testno].whichSha), "hkdf standard test",
 1080     buf, hkdfhashes[testno].okmarray, printResults, printPassFail);
 1081 
 1082   return err;
 1083 }
 1084 
 1085 /*
 1086  * Exercise a hash series of functions.  The input is a filename.
 1087  * If the result is known, it is in resultarray in uppercase hex.
 1088  */
 1089 static int hashfile(int hashno, const char *hashfilename, int bits,
 1090   int bitcount, int skipSpaces, const unsigned char *keyarray,
 1091   int keylen, const unsigned char *info, int infolen, int okmlen,
 1092   const char *resultarray, int hashsize,
 1093   int printResults, int printPassFail)
 1094 {
 1095   USHAContext sha;
 1096   HMACContext hmac;
 1097   HKDFContext hkdf;
 1098   int err, nread, c;
 1099   unsigned char buf[4096];
 1100   uint8_t Message_Digest_Buf[USHAMaxHashSize];
 1101   uint8_t *Message_Digest = Message_Digest_Buf;
 1102   unsigned char cc;
 1103   FILE *hashfp = (strcmp(hashfilename, "-") == 0) ? stdin :
 1104     fopen(hashfilename, "r");
 1105 
 1106   if (!hashfp) {
 1107     fprintf(stderr, "cannot open file '%s'\n", hashfilename);
 1108     return shaStateError;
 1109   }
 1110 
 1111   if (info) Message_Digest = malloc(okmlen);
 1112   memset(&sha, '\343', sizeof(sha)); /* force bad data into struct */
 1113   memset(&hmac, '\343', sizeof(hmac));
 1114   memset(&hkdf, '\343', sizeof(hkdf));
 1115   err = info ? hkdfReset(&hkdf, hashes[hashno].whichSha,
 1116                              keyarray, keylen) :
 1117         keyarray ? hmacReset(&hmac, hashes[hashno].whichSha,
 1118                              keyarray, keylen) :
 1119                    USHAReset(&sha, hashes[hashno].whichSha);
 1120   if (err != shaSuccess) {
 1121     fprintf(stderr, "hashfile(): %sReset Error %d.\n",
 1122             info ? "hkdf" : keyarray ? "hmac" : "sha", err);
 1123     if (hashfp != stdin) fclose(hashfp);
 1124     if (info) free(Message_Digest);
 1125     return err;
 1126   }
 1127 
 1128   if (skipSpaces)
 1129     while ((c = getc(hashfp)) != EOF) {
 1130       if (!isspace(c)) {
 1131         cc = (unsigned char)c;
 1132         err = info ? hkdfInput(&hkdf, &cc, 1) :
 1133               keyarray ? hmacInput(&hmac, &cc, 1) :
 1134                          USHAInput(&sha, &cc, 1);
 1135         if (err != shaSuccess) {
 1136           fprintf(stderr, "hashfile(): %sInput Error %d.\n",
 1137                   info ? "hkdf" : keyarray ? "hmac" : "sha", err);
 1138           if (hashfp != stdin) fclose(hashfp);
 1139           if (info) free(Message_Digest);
 1140           return err;
 1141         }
 1142       }
 1143     }
 1144   else
 1145     while ((nread = fread(buf, 1, sizeof(buf), hashfp)) > 0) {
 1146       err = info ? hkdfInput(&hkdf, buf, nread) :
 1147             keyarray ? hmacInput(&hmac, buf, nread) :
 1148                        USHAInput(&sha, buf, nread);
 1149       if (err != shaSuccess) {
 1150         fprintf(stderr, "hashfile(): %s Error %d.\n",
 1151                 info ? "hkdf" : keyarray ? "hmacInput" :
 1152                 "shaInput", err);
 1153         if (hashfp != stdin) fclose(hashfp);
 1154         if (info) free(Message_Digest);
 1155         return err;
 1156       }
 1157     }
 1158 
 1159   if (bitcount > 0)
 1160     err = info ? hkdfFinalBits(&hkdf, bits, bitcount) :
 1161           keyarray ? hmacFinalBits(&hmac, bits, bitcount) :
 1162                    USHAFinalBits(&sha, bits, bitcount);
 1163   if (err != shaSuccess) {
 1164     fprintf(stderr, "hashfile(): %s Error %d.\n",
 1165             info ? "hkdf" : keyarray ? "hmacFinalBits" :
 1166             "shaFinalBits", err);
 1167     if (hashfp != stdin) fclose(hashfp);
 1168     if (info) free(Message_Digest);
 1169     return err;
 1170   }
 1171 
 1172   err = info ? hkdfResult(&hkdf, 0, info, infolen,
 1173                           Message_Digest, okmlen) :
 1174         keyarray ? hmacResult(&hmac, Message_Digest) :
 1175                    USHAResult(&sha, Message_Digest);
 1176   if (err != shaSuccess) {
 1177     fprintf(stderr, "hashfile(): %s Error %d.\n",
 1178             info ? "hkdf" : keyarray ? "hmacResult" :
 1179             "shaResult", err);
 1180     if (hashfp != stdin) fclose(hashfp);
 1181     if (info) free(Message_Digest);
 1182     return err;
 1183   }
 1184 
 1185   printResult(Message_Digest, info ? okmlen : hashsize,
 1186     hashes[hashno].name, "file", hashfilename, resultarray,
 1187     printResults, printPassFail);
 1188 
 1189   if (hashfp != stdin) fclose(hashfp);
 1190   if (info) free(Message_Digest);
 1191   return err;
 1192 }
 1193 
 1194 /*
 1195  * Exercise a hash series of functions through multiple permutations.
 1196  * The input is an initial seed.  That seed is replicated 3 times.
 1197  * For 1000 rounds, the previous three results are used as the input.
 1198  * This result is then checked, and used to seed the next cycle.
 1199  * If the result is known, it is in resultarrays in uppercase hex.
 1200  */
 1201 static void randomtest(int hashno, const char *seed, int hashsize,
 1202     const char **resultarrays, int randomcount,
 1203     int printResults, int printPassFail)
 1204 {
 1205   int i, j; char buf[20];
 1206   unsigned char SEED[USHAMaxHashSize], MD[1003][USHAMaxHashSize];
 1207 
 1208   /* INPUT: Seed - A random seed n bits long */
 1209   memcpy(SEED, seed, hashsize);
 1210   if (printResults == PRINTTEXT) {
 1211     printf("%s random test seed= '", hashes[hashno].name);
 1212     printxstr(seed, hashsize);
 1213     printf("'\n");
 1214   }
 1215 
 1216   for (j = 0; j < randomcount; j++) {
 1217     /* MD0 = MD1 = MD2 = Seed; */
 1218     memcpy(MD[0], SEED, hashsize);
 1219     memcpy(MD[1], SEED, hashsize);
 1220     memcpy(MD[2], SEED, hashsize);
 1221     for (i=3; i<1003; i++) {
 1222       /* Mi = MDi-3 || MDi-2 || MDi-1; */
 1223       USHAContext Mi;
 1224       memset(&Mi, '\343', sizeof(Mi)); /* force bad data into struct */
 1225       USHAReset(&Mi, hashes[hashno].whichSha);
 1226       USHAInput(&Mi, MD[i-3], hashsize);
 1227       USHAInput(&Mi, MD[i-2], hashsize);
 1228       USHAInput(&Mi, MD[i-1], hashsize);
 1229       /* MDi = SHA(Mi); */
 1230       USHAResult(&Mi, MD[i]);
 1231     }
 1232 
 1233     /* MDj = Seed = MDi; */
 1234     memcpy(SEED, MD[i-1], hashsize);
 1235 
 1236     /* OUTPUT: MDj */
 1237     sprintf(buf, "%d", j);
 1238     printResult(SEED, hashsize, hashes[hashno].name, "random test",
 1239       buf, resultarrays ? resultarrays[j] : 0, printResults,
 1240       (j < RANDOMCOUNT) ? printPassFail : 0);
 1241   }
 1242 }
 1243 
 1244 /*
 1245  * Look up a hash name.
 1246  */
 1247 static int findhash(const char *argv0, const char *opt)
 1248 {
 1249   int i;
 1250   const char *names[HASHCOUNT][2] = {
 1251     { "0", "sha1" }, { "1", "sha224" }, { "2", "sha256" },
 1252     { "3", "sha384" }, { "4", "sha512" }
 1253   };
 1254   for (i = 0; i < HASHCOUNT; i++)
 1255     if ((strcmp(opt, names[i][0]) == 0) ||
 1256         (scasecmp(opt, names[i][1]) == 0))
 1257       return i;
 1258 
 1259   fprintf(stderr, "%s: Unknown hash name: '%s'\n", argv0, opt);
 1260   usage(argv0);
 1261   return 0;
 1262 }
 1263 
 1264 /*
 1265  * Run some tests that should invoke errors.
 1266  */
 1267 static void testErrors(int hashnolow, int hashnohigh, int printResults,
 1268     int printPassFail)
 1269 {
 1270   USHAContext usha;
 1271   uint8_t Message_Digest[USHAMaxHashSize];
 1272   int hashno, err;
 1273 
 1274   for (hashno = hashnolow; hashno <= hashnohigh; hashno++) {
 1275     memset(&usha, '\343', sizeof(usha)); /* force bad data */
 1276     USHAReset(&usha, hashno);
 1277     USHAResult(&usha, Message_Digest);
 1278     err = USHAInput(&usha, (const unsigned char *)"foo", 3);
 1279     if (printResults == PRINTTEXT)
 1280       printf ("\nError %d. Should be %d.\n", err, shaStateError);
 1281 
 1282     if ((printPassFail == PRINTPASSFAIL) ||
 1283         ((printPassFail == PRINTFAIL) && (err != shaStateError)))
 1284       printf("%s se: %s\n", hashes[hashno].name,
 1285         (err == shaStateError) ? "PASSED" : "FAILED");
 1286 
 1287     err = USHAFinalBits(&usha, 0x80, 3);
 1288     if (printResults == PRINTTEXT)
 1289       printf ("\nError %d. Should be %d.\n", err, shaStateError);
 1290     if ((printPassFail == PRINTPASSFAIL) ||
 1291         ((printPassFail == PRINTFAIL) && (err != shaStateError)))
 1292       printf("%s se: %s\n", hashes[hashno].name,
 1293         (err == shaStateError) ? "PASSED" : "FAILED");
 1294 
 1295     err = USHAReset(0, hashes[hashno].whichSha);
 1296     if (printResults == PRINTTEXT)
 1297        printf("\nError %d. Should be %d.\n", err, shaNull);
 1298     if ((printPassFail == PRINTPASSFAIL) ||
 1299         ((printPassFail == PRINTFAIL) && (err != shaNull)))
 1300        printf("%s usha null: %s\n", hashes[hashno].name,
 1301         (err == shaNull) ? "PASSED" : "FAILED");
 1302 
 1303     switch (hashno) {
 1304       case SHA1: err = SHA1Reset(0); break;
 1305       case SHA224: err = SHA224Reset(0); break;
 1306       case SHA256: err = SHA256Reset(0); break;
 1307       case SHA384: err = SHA384Reset(0); break;
 1308       case SHA512: err = SHA512Reset(0); break;
 1309     }
 1310     if (printResults == PRINTTEXT)
 1311        printf("\nError %d. Should be %d.\n", err, shaNull);
 1312     if ((printPassFail == PRINTPASSFAIL) ||
 1313         ((printPassFail == PRINTFAIL) && (err != shaNull)))
 1314        printf("%s sha null: %s\n", hashes[hashno].name,
 1315         (err == shaNull) ? "PASSED" : "FAILED");
 1316   }
 1317 }
 1318 
 1319 /* replace a hex string in place with its value */
 1320 static int unhexStr(char *hexstr)
 1321 {
 1322   char *o = hexstr;
 1323   int len = 0, nibble1 = 0, nibble2 = 0;
 1324   if (!hexstr) return 0;
 1325   for ( ; *hexstr; hexstr++) {
 1326     if (isalpha((int)(unsigned char)(*hexstr))) {
 1327       nibble1 = tolower((int)(unsigned char)(*hexstr)) - 'a' + 10;
 1328     } else if (isdigit((int)(unsigned char)(*hexstr))) {
 1329       nibble1 = *hexstr - '0';
 1330     } else {
 1331       printf("\nError: bad hex character '%c'\n", *hexstr);
 1332     }
 1333     if (!*++hexstr) break;
 1334     if (isalpha((int)(unsigned char)(*hexstr))) {
 1335       nibble2 = tolower((int)(unsigned char)(*hexstr)) - 'a' + 10;
 1336     } else if (isdigit((int)(unsigned char)(*hexstr))) {
 1337       nibble2 = *hexstr - '0';
 1338     } else {
 1339       printf("\nError: bad hex character '%c'\n", *hexstr);
 1340     }
 1341     *o++ = (char)((nibble1 << 4) | nibble2);
 1342     len++;
 1343   }
 1344   return len;
 1345 }
 1346 
 1347 int main(int argc, char **argv)
 1348 {
 1349   int i, err;
 1350   int loopno, loopnohigh = 1;
 1351   int hashno, hashnolow = 0, hashnohigh = HASHCOUNT - 1;
 1352   int testno, testnolow = 0, testnohigh;
 1353   int ntestnohigh = 0;
 1354   int printResults = PRINTTEXT;
 1355   int printPassFail = 1;
 1356   int checkErrors = 0;
 1357   char *hashstr = 0;
 1358   int hashlen = 0;
 1359   const char *resultstr = 0;
 1360   char *randomseedstr = 0;
 1361   int runHmacTests = 0;
 1362   int runHkdfTests = 0;
 1363   char *hmacKey = 0;
 1364   int hmaclen = 0;
 1365   char *info = 0;
 1366   int infolen = 0, okmlen = 0;
 1367   int randomcount = RANDOMCOUNT;
 1368   const char *hashfilename = 0;
 1369   const char *hashFilename = 0;
 1370   int extrabits = 0, numberExtrabits = 0;
 1371   int strIsHex = 0;
 1372 
 1373   if ('A' != 0x41) {
 1374     fprintf(stderr, "%s: these tests require ASCII\n", argv[0]);
 1375   }
 1376 
 1377   while ((i = getopt(argc, argv,
 1378                       "6b:B:def:F:h:i:Hk:l:L:mpPr:R:s:S:t:wxX")) != -1)
 1379     switch (i) {
 1380       case 'b': extrabits = strtol(optarg, 0, 0); break;
 1381       case 'B': numberExtrabits = atoi(optarg); break;
 1382       case 'd': runHkdfTests = 1; break;
 1383       case 'e': checkErrors = 1; break;
 1384       case 'f': hashfilename = optarg; break;
 1385       case 'F': hashFilename = optarg; break;
 1386       case 'h': hashnolow = hashnohigh = findhash(argv[0], optarg);
 1387         break;
 1388       case 'H': strIsHex = 1; break;
 1389       case 'i': info = optarg; infolen = strlen(optarg); break;
 1390       case 'k': hmacKey = optarg; hmaclen = strlen(optarg); break;
 1391       case 'l': loopnohigh = atoi(optarg); break;
 1392       case 'L': okmlen = strtol(optarg, 0, 0); break;
 1393       case 'm': runHmacTests = 1; break;
 1394       case 'P': printPassFail = 0; break;
 1395       case 'p': printResults = PRINTNONE; break;
 1396       case 'R': randomcount = atoi(optarg); break;
 1397       case 'r': randomseedstr = optarg; break;
 1398       case 's': hashstr = optarg; hashlen = strlen(hashstr); break;
 1399       case 'S': resultstr = optarg; break;
 1400       case 't': testnolow = ntestnohigh = atoi(optarg) - 1; break;
 1401       case 'w': printResults = PRINTRAW; break;
 1402       case 'x': printResults = PRINTHEX; break;
 1403       case 'X': printPassFail = 2; break;
 1404       case '6': printResults = PRINTBASE64; break;
 1405       default: usage(argv[0]);
 1406       }
 1407 
 1408   if (strIsHex) {
 1409     hashlen = unhexStr(hashstr);
 1410     unhexStr(randomseedstr);
 1411     hmaclen = unhexStr(hmacKey);
 1412     infolen = unhexStr(info);
 1413   }
 1414   testnohigh = (ntestnohigh != 0) ? ntestnohigh:
 1415                runHmacTests ? (HMACTESTCOUNT-1) :
 1416                runHkdfTests ? (HKDFTESTCOUNT-1) :
 1417                (TESTCOUNT-1);
 1418   if ((testnolow < 0) ||
 1419       (testnohigh >= (runHmacTests ? HMACTESTCOUNT : TESTCOUNT)) ||
 1420       (hashnolow < 0) || (hashnohigh >= HASHCOUNT) ||
 1421       (hashstr && (testnolow == testnohigh)) ||
 1422       (randomcount < 0) ||
 1423       (resultstr && (!hashstr && !hashfilename && !hashFilename)) ||
 1424       ((runHmacTests || hmacKey) && randomseedstr) ||
 1425       (hashfilename && hashFilename) ||
 1426       (info && ((infolen <= 0) || (okmlen <= 0))) ||
 1427       (info && !hmacKey))
 1428     usage(argv[0]);
 1429 
 1430   /*
 1431    *  Perform SHA/HMAC tests
 1432    */
 1433   for (hashno = hashnolow; hashno <= hashnohigh; ++hashno) {
 1434     if (printResults == PRINTTEXT)
 1435       printf("Hash %s\n", hashes[hashno].name);
 1436     err = shaSuccess;
 1437 
 1438     for (loopno = 1; (loopno <= loopnohigh) && (err == shaSuccess);
 1439          ++loopno) {
 1440       if (hashstr)
 1441         err = hash(0, loopno, hashno, hashstr, hashlen, 1,
 1442           numberExtrabits, extrabits, (const unsigned char *)hmacKey,
 1443           hmaclen, (const uint8_t *) info, infolen, okmlen, resultstr,
 1444           hashes[hashno].hashsize, printResults, printPassFail);
 1445 
 1446       else if (randomseedstr)
 1447         randomtest(hashno, randomseedstr, hashes[hashno].hashsize, 0,
 1448           randomcount, printResults, printPassFail);
 1449 
 1450       else if (hashfilename)
 1451         err = hashfile(hashno, hashfilename, extrabits,
 1452                        numberExtrabits, 0,
 1453                        (const unsigned char *)hmacKey, hmaclen,
 1454                        (const uint8_t *) info, infolen, okmlen,
 1455                        resultstr, hashes[hashno].hashsize,
 1456                        printResults, printPassFail);
 1457 
 1458       else if (hashFilename)
 1459         err = hashfile(hashno, hashFilename, extrabits,
 1460                        numberExtrabits, 1,
 1461                        (const unsigned char *)hmacKey, hmaclen,
 1462                        (const uint8_t *) info, infolen, okmlen,
 1463                        resultstr, hashes[hashno].hashsize,
 1464                        printResults, printPassFail);
 1465 
 1466       else /* standard tests */ {
 1467         for (testno = testnolow;
 1468              (testno <= testnohigh) && (err == shaSuccess); ++testno) {
 1469           if (runHmacTests) {
 1470             err = hash(testno, loopno, hashno,
 1471                        hmachashes[testno].dataarray[hashno] ?
 1472                        hmachashes[testno].dataarray[hashno] :
 1473                        hmachashes[testno].dataarray[1] ?
 1474                        hmachashes[testno].dataarray[1] :
 1475                        hmachashes[testno].dataarray[0],
 1476                        hmachashes[testno].datalength[hashno] ?
 1477                        hmachashes[testno].datalength[hashno] :
 1478                        hmachashes[testno].datalength[1] ?
 1479                        hmachashes[testno].datalength[1] :
 1480                        hmachashes[testno].datalength[0],
 1481                        1, 0, 0,
 1482                        (const unsigned char *)(
 1483                         hmachashes[testno].keyarray[hashno] ?
 1484                         hmachashes[testno].keyarray[hashno] :
 1485                         hmachashes[testno].keyarray[1] ?
 1486                         hmachashes[testno].keyarray[1] :
 1487                         hmachashes[testno].keyarray[0]),
 1488                        hmachashes[testno].keylength[hashno] ?
 1489                        hmachashes[testno].keylength[hashno] :
 1490                        hmachashes[testno].keylength[1] ?
 1491                        hmachashes[testno].keylength[1] :
 1492                        hmachashes[testno].keylength[0],
 1493                        0, 0, 0,
 1494                        hmachashes[testno].resultarray[hashno],
 1495                        hmachashes[testno].resultlength[hashno],
 1496                        printResults, printPassFail);
 1497           } else if (runHkdfTests) {
 1498             err = hashHkdf(testno, loopno, hashno,
 1499                        printResults, printPassFail);
 1500           } else { /* sha tests */
 1501             err = hash(testno, loopno, hashno,
 1502                        hashes[hashno].tests[testno].testarray,
 1503                        hashes[hashno].tests[testno].length,
 1504                        hashes[hashno].tests[testno].repeatcount,
 1505                        hashes[hashno].tests[testno].numberExtrabits,
 1506                        hashes[hashno].tests[testno].extrabits,
 1507                        0, 0, 0, 0, 0,
 1508                        hashes[hashno].tests[testno].resultarray,
 1509                        hashes[hashno].hashsize,
 1510                        printResults, printPassFail);
 1511           }
 1512         }
 1513         if (!runHmacTests && !runHkdfTests) {
 1514           randomtest(hashno, hashes[hashno].randomtest,
 1515             hashes[hashno].hashsize, hashes[hashno].randomresults,
 1516             RANDOMCOUNT, printResults, printPassFail);
 1517         }
 1518       }
 1519     }
 1520   }
 1521 
 1522   /* Test some error returns */
 1523   if (checkErrors) {
 1524     testErrors(hashnolow, hashnohigh, printResults, printPassFail);
 1525   }
 1526 
 1527   return 0;
 1528 }
 1529 
 1530 /*
 1531  * Compare two strings, case independently.
 1532  * Equivalent to strcasecmp() found on some systems.
 1533  */
 1534 int scasecmp(const char *s1, const char *s2)
 1535 {
 1536   for (;;) {
 1537     char u1 = tolower((int)(unsigned char)(*s1++));
 1538     char u2 = tolower((int)(unsigned char)(*s2++));
 1539     if (u1 != u2)
 1540       return u1 - u2;
 1541     if (u1 == '\0')
 1542       return 0;
 1543    }
 1544 }