keccak-fast.c

Minimal SIMD keccak implementation
git clone git://git.finwo.net/lib/keccak-fast.c
Log | Files | Refs | README | LICENSE

kat.c (4633B)


      1 #include <stdint.h>
      2 #include <stdio.h>
      3 #include <string.h>
      4 
      5 #include "keccak-fast.h"
      6 
      7 typedef int (*kf_fn)(uint8_t *, size_t, const uint8_t *, size_t);
      8 
      9 static int fails;
     10 static int testn;
     11 
     12 static void hex2bin(const char *hex, uint8_t *out) {
     13   for (size_t i = 0; hex[i] != '\0'; i += 2) {
     14     unsigned v;
     15     sscanf(hex + i, "%2x", &v);
     16     out[i / 2] = (uint8_t)v;
     17   }
     18 }
     19 
     20 static void check(const char *name, kf_fn fn, const uint8_t *in, size_t inlen,
     21                   const char *hex) {
     22   uint8_t got[64] = {0};
     23   uint8_t want[64] = {0};
     24   size_t  outlen  = strlen(hex) / 2;
     25   int     rc      = fn(got, outlen, in, inlen);
     26   hex2bin(hex, want);
     27   testn++;
     28   if (rc == 0 && memcmp(got, want, outlen) == 0) {
     29     printf("ok %d - %s\n", testn, name);
     30   } else {
     31     fails++;
     32     printf("not ok %d - %s\n", testn, name);
     33   }
     34 }
     35 
     36 int main(void) {
     37   static uint8_t qbf[200];
     38   for (size_t i = 0; i < sizeof qbf; i++) qbf[i] = (uint8_t)i;
     39   const uint8_t *abc = (const uint8_t *)"abc";
     40   const uint8_t *nil = NULL;
     41 
     42   printf("1..22\n");
     43 
     44   check("shake128 empty", kf_shake128, nil, 0,
     45         "7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26");
     46   check("shake128 abc", kf_shake128, abc, 3,
     47         "5881092dd818bf5cf8a3ddb793fbcba74097d5c526a6d35f97b83351940f2cc8");
     48   check("shake256 empty", kf_shake256, nil, 0,
     49         "46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762f"
     50         "d75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be");
     51   check("shake256 abc", kf_shake256, abc, 3,
     52         "483366601360a8771c6863080cc4114d8db44530f8f1e1ee4f94ea37e78b5739"
     53         "d5a15bef186a5386c75744c0527e1faa9f8726e462a12a4feb06bd8801e751e4");
     54 
     55   check("sha3_224 empty", kf_sha3_224, nil, 0,
     56         "6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7");
     57   check("sha3_224 abc", kf_sha3_224, abc, 3,
     58         "e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf");
     59   check("sha3_256 empty", kf_sha3_256, nil, 0,
     60         "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a");
     61   check("sha3_256 abc", kf_sha3_256, abc, 3,
     62         "3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532");
     63   check("sha3_256 200", kf_sha3_256, qbf, 200,
     64         "5f728f63bf5ee48c77f453c0490398fa645b8d4c4e56be9a41cfec344d6ca899");
     65   check("sha3_384 empty", kf_sha3_384, nil, 0,
     66         "0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2a"
     67         "c3713831264adb47fb6bd1e058d5f004");
     68   check("sha3_384 abc", kf_sha3_384, abc, 3,
     69         "ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b2"
     70         "98d88cea927ac7f539f1edf228376d25");
     71   check("sha3_512 empty", kf_sha3_512, nil, 0,
     72         "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a6"
     73         "15b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26");
     74   check("sha3_512 abc", kf_sha3_512, abc, 3,
     75         "b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e"
     76         "10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0");
     77 
     78   check("turboshake128 empty", kf_turboshake128, nil, 0,
     79         "1e415f1c5983aff2169217277d17bb538cd945a397ddec541f1ce41af2c1b74c");
     80   check("turboshake128 abc", kf_turboshake128, abc, 3,
     81         "dcf1646dfe993a8eb6b782d1faaca6d82416a5dcf1de98ee3c6dbc5e1dc63018");
     82   check("turboshake128 200", kf_turboshake128, qbf, 200,
     83         "5b96f9aac16a9047cd03b83c950fb6b074a31ea05f0aaa3aa3a7f98deaab289c");
     84   check("turboshake256 empty", kf_turboshake256, nil, 0,
     85         "367a329dafea871c7802ec67f905ae13c57695dc2c6663c61035f59a18f8e7db"
     86         "11edc0e12e91ea60eb6b32df06dd7f002fbafabb6e13ec1cc20d995547600db0");
     87   check("turboshake256 abc", kf_turboshake256, abc, 3,
     88         "63824b1431a7372e85edc022c9d7afdd027472fcfa33c887d6f5aaf8dc5d4db6"
     89         "8afbcb5714b49b7ffd8dd115dd5bd5436f837236845a230d6969a4083a113617");
     90   check("turboshake256 200", kf_turboshake256, qbf, 200,
     91         "c27b5422da9177efaf2a335b6ea79cb57961a8cc3ca8f870f17ebbbfd662086a"
     92         "fe62a10085fb7c413fcc0f586aa938d152254a77aa0d682eb846c82199428a71");
     93 
     94   {
     95     uint8_t out[64];
     96     int     bad1 = kf_sha3_256(out, 33, abc, 3);
     97     int     bad2 = kf_sha3_256(NULL, 32, abc, 3);
     98     int     bad3 = kf_shake256(out, 32, NULL, 3);
     99     printf("%s %d - sha3_256 rejects long output\n", bad1 == -1 ? "ok" : "not ok",
    100            ++testn);
    101     printf("%s %d - rejects NULL output\n", bad2 == -1 ? "ok" : "not ok",
    102            ++testn);
    103     printf("%s %d - rejects NULL input\n", bad3 == -1 ? "ok" : "not ok",
    104            ++testn);
    105     if (bad1 != -1 || bad2 != -1 || bad3 != -1) fails++;
    106   }
    107 
    108   if (fails != 0) printf("# %d failed\n", fails);
    109   return fails != 0;
    110 }