linux/lib/test_siphash.c
<<
>>
Prefs
   1/* Test cases for siphash.c
   2 *
   3 * Copyright (C) 2016 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
   4 *
   5 * This file is provided under a dual BSD/GPLv2 license.
   6 *
   7 * SipHash: a fast short-input PRF
   8 * https://131002.net/siphash/
   9 *
  10 * This implementation is specifically for SipHash2-4 for a secure PRF
  11 * and HalfSipHash1-3/SipHash1-3 for an insecure PRF only suitable for
  12 * hashtables.
  13 */
  14
  15#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  16
  17#include <linux/siphash.h>
  18#include <linux/kernel.h>
  19#include <linux/string.h>
  20#include <linux/errno.h>
  21#include <linux/module.h>
  22
  23/* Test vectors taken from reference source available at:
  24 *     https://github.com/veorq/SipHash
  25 */
  26
  27static const siphash_key_t test_key_siphash =
  28        {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
  29
  30static const u64 test_vectors_siphash[64] = {
  31        0x726fdb47dd0e0e31ULL, 0x74f839c593dc67fdULL, 0x0d6c8009d9a94f5aULL,
  32        0x85676696d7fb7e2dULL, 0xcf2794e0277187b7ULL, 0x18765564cd99a68dULL,
  33        0xcbc9466e58fee3ceULL, 0xab0200f58b01d137ULL, 0x93f5f5799a932462ULL,
  34        0x9e0082df0ba9e4b0ULL, 0x7a5dbbc594ddb9f3ULL, 0xf4b32f46226bada7ULL,
  35        0x751e8fbc860ee5fbULL, 0x14ea5627c0843d90ULL, 0xf723ca908e7af2eeULL,
  36        0xa129ca6149be45e5ULL, 0x3f2acc7f57c29bdbULL, 0x699ae9f52cbe4794ULL,
  37        0x4bc1b3f0968dd39cULL, 0xbb6dc91da77961bdULL, 0xbed65cf21aa2ee98ULL,
  38        0xd0f2cbb02e3b67c7ULL, 0x93536795e3a33e88ULL, 0xa80c038ccd5ccec8ULL,
  39        0xb8ad50c6f649af94ULL, 0xbce192de8a85b8eaULL, 0x17d835b85bbb15f3ULL,
  40        0x2f2e6163076bcfadULL, 0xde4daaaca71dc9a5ULL, 0xa6a2506687956571ULL,
  41        0xad87a3535c49ef28ULL, 0x32d892fad841c342ULL, 0x7127512f72f27cceULL,
  42        0xa7f32346f95978e3ULL, 0x12e0b01abb051238ULL, 0x15e034d40fa197aeULL,
  43        0x314dffbe0815a3b4ULL, 0x027990f029623981ULL, 0xcadcd4e59ef40c4dULL,
  44        0x9abfd8766a33735cULL, 0x0e3ea96b5304a7d0ULL, 0xad0c42d6fc585992ULL,
  45        0x187306c89bc215a9ULL, 0xd4a60abcf3792b95ULL, 0xf935451de4f21df2ULL,
  46        0xa9538f0419755787ULL, 0xdb9acddff56ca510ULL, 0xd06c98cd5c0975ebULL,
  47        0xe612a3cb9ecba951ULL, 0xc766e62cfcadaf96ULL, 0xee64435a9752fe72ULL,
  48        0xa192d576b245165aULL, 0x0a8787bf8ecb74b2ULL, 0x81b3e73d20b49b6fULL,
  49        0x7fa8220ba3b2eceaULL, 0x245731c13ca42499ULL, 0xb78dbfaf3a8d83bdULL,
  50        0xea1ad565322a1a0bULL, 0x60e61c23a3795013ULL, 0x6606d7e446282b93ULL,
  51        0x6ca4ecb15c5f91e1ULL, 0x9f626da15c9625f3ULL, 0xe51b38608ef25f57ULL,
  52        0x958a324ceb064572ULL
  53};
  54
  55#if BITS_PER_LONG == 64
  56static const hsiphash_key_t test_key_hsiphash =
  57        {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
  58
  59static const u32 test_vectors_hsiphash[64] = {
  60        0x050fc4dcU, 0x7d57ca93U, 0x4dc7d44dU,
  61        0xe7ddf7fbU, 0x88d38328U, 0x49533b67U,
  62        0xc59f22a7U, 0x9bb11140U, 0x8d299a8eU,
  63        0x6c063de4U, 0x92ff097fU, 0xf94dc352U,
  64        0x57b4d9a2U, 0x1229ffa7U, 0xc0f95d34U,
  65        0x2a519956U, 0x7d908b66U, 0x63dbd80cU,
  66        0xb473e63eU, 0x8d297d1cU, 0xa6cce040U,
  67        0x2b45f844U, 0xa320872eU, 0xdae6c123U,
  68        0x67349c8cU, 0x705b0979U, 0xca9913a5U,
  69        0x4ade3b35U, 0xef6cd00dU, 0x4ab1e1f4U,
  70        0x43c5e663U, 0x8c21d1bcU, 0x16a7b60dU,
  71        0x7a8ff9bfU, 0x1f2a753eU, 0xbf186b91U,
  72        0xada26206U, 0xa3c33057U, 0xae3a36a1U,
  73        0x7b108392U, 0x99e41531U, 0x3f1ad944U,
  74        0xc8138825U, 0xc28949a6U, 0xfaf8876bU,
  75        0x9f042196U, 0x68b1d623U, 0x8b5114fdU,
  76        0xdf074c46U, 0x12cc86b3U, 0x0a52098fU,
  77        0x9d292f9aU, 0xa2f41f12U, 0x43a71ed0U,
  78        0x73f0bce6U, 0x70a7e980U, 0x243c6d75U,
  79        0xfdb71513U, 0xa67d8a08U, 0xb7e8f148U,
  80        0xf7a644eeU, 0x0f1837f2U, 0x4b6694e0U,
  81        0xb7bbb3a8U
  82};
  83#else
  84static const hsiphash_key_t test_key_hsiphash =
  85        {{ 0x03020100U, 0x07060504U }};
  86
  87static const u32 test_vectors_hsiphash[64] = {
  88        0x5814c896U, 0xe7e864caU, 0xbc4b0e30U,
  89        0x01539939U, 0x7e059ea6U, 0x88e3d89bU,
  90        0xa0080b65U, 0x9d38d9d6U, 0x577999b1U,
  91        0xc839caedU, 0xe4fa32cfU, 0x959246eeU,
  92        0x6b28096cU, 0x66dd9cd6U, 0x16658a7cU,
  93        0xd0257b04U, 0x8b31d501U, 0x2b1cd04bU,
  94        0x06712339U, 0x522aca67U, 0x911bb605U,
  95        0x90a65f0eU, 0xf826ef7bU, 0x62512debU,
  96        0x57150ad7U, 0x5d473507U, 0x1ec47442U,
  97        0xab64afd3U, 0x0a4100d0U, 0x6d2ce652U,
  98        0x2331b6a3U, 0x08d8791aU, 0xbc6dda8dU,
  99        0xe0f6c934U, 0xb0652033U, 0x9b9851ccU,
 100        0x7c46fb7fU, 0x732ba8cbU, 0xf142997aU,
 101        0xfcc9aa1bU, 0x05327eb2U, 0xe110131cU,
 102        0xf9e5e7c0U, 0xa7d708a6U, 0x11795ab1U,
 103        0x65671619U, 0x9f5fff91U, 0xd89c5267U,
 104        0x007783ebU, 0x95766243U, 0xab639262U,
 105        0x9c7e1390U, 0xc368dda6U, 0x38ddc455U,
 106        0xfa13d379U, 0x979ea4e8U, 0x53ecd77eU,
 107        0x2ee80657U, 0x33dbb66aU, 0xae3f0577U,
 108        0x88b4c4ccU, 0x3e7f480bU, 0x74c1ebf8U,
 109        0x87178304U
 110};
 111#endif
 112
 113static int __init siphash_test_init(void)
 114{
 115        u8 in[64] __aligned(SIPHASH_ALIGNMENT);
 116        u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
 117        u8 i;
 118        int ret = 0;
 119
 120        for (i = 0; i < 64; ++i) {
 121                in[i] = i;
 122                in_unaligned[i + 1] = i;
 123                if (siphash(in, i, &test_key_siphash) !=
 124                                                test_vectors_siphash[i]) {
 125                        pr_info("siphash self-test aligned %u: FAIL\n", i + 1);
 126                        ret = -EINVAL;
 127                }
 128                if (siphash(in_unaligned + 1, i, &test_key_siphash) !=
 129                                                test_vectors_siphash[i]) {
 130                        pr_info("siphash self-test unaligned %u: FAIL\n", i + 1);
 131                        ret = -EINVAL;
 132                }
 133                if (hsiphash(in, i, &test_key_hsiphash) !=
 134                                                test_vectors_hsiphash[i]) {
 135                        pr_info("hsiphash self-test aligned %u: FAIL\n", i + 1);
 136                        ret = -EINVAL;
 137                }
 138                if (hsiphash(in_unaligned + 1, i, &test_key_hsiphash) !=
 139                                                test_vectors_hsiphash[i]) {
 140                        pr_info("hsiphash self-test unaligned %u: FAIL\n", i + 1);
 141                        ret = -EINVAL;
 142                }
 143        }
 144        if (siphash_1u64(0x0706050403020100ULL, &test_key_siphash) !=
 145                                                test_vectors_siphash[8]) {
 146                pr_info("siphash self-test 1u64: FAIL\n");
 147                ret = -EINVAL;
 148        }
 149        if (siphash_2u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
 150                         &test_key_siphash) != test_vectors_siphash[16]) {
 151                pr_info("siphash self-test 2u64: FAIL\n");
 152                ret = -EINVAL;
 153        }
 154        if (siphash_3u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
 155                         0x1716151413121110ULL, &test_key_siphash) !=
 156                                                test_vectors_siphash[24]) {
 157                pr_info("siphash self-test 3u64: FAIL\n");
 158                ret = -EINVAL;
 159        }
 160        if (siphash_4u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
 161                         0x1716151413121110ULL, 0x1f1e1d1c1b1a1918ULL,
 162                         &test_key_siphash) != test_vectors_siphash[32]) {
 163                pr_info("siphash self-test 4u64: FAIL\n");
 164                ret = -EINVAL;
 165        }
 166        if (siphash_1u32(0x03020100U, &test_key_siphash) !=
 167                                                test_vectors_siphash[4]) {
 168                pr_info("siphash self-test 1u32: FAIL\n");
 169                ret = -EINVAL;
 170        }
 171        if (siphash_2u32(0x03020100U, 0x07060504U, &test_key_siphash) !=
 172                                                test_vectors_siphash[8]) {
 173                pr_info("siphash self-test 2u32: FAIL\n");
 174                ret = -EINVAL;
 175        }
 176        if (siphash_3u32(0x03020100U, 0x07060504U,
 177                         0x0b0a0908U, &test_key_siphash) !=
 178                                                test_vectors_siphash[12]) {
 179                pr_info("siphash self-test 3u32: FAIL\n");
 180                ret = -EINVAL;
 181        }
 182        if (siphash_4u32(0x03020100U, 0x07060504U,
 183                         0x0b0a0908U, 0x0f0e0d0cU, &test_key_siphash) !=
 184                                                test_vectors_siphash[16]) {
 185                pr_info("siphash self-test 4u32: FAIL\n");
 186                ret = -EINVAL;
 187        }
 188        if (hsiphash_1u32(0x03020100U, &test_key_hsiphash) !=
 189                                                test_vectors_hsiphash[4]) {
 190                pr_info("hsiphash self-test 1u32: FAIL\n");
 191                ret = -EINVAL;
 192        }
 193        if (hsiphash_2u32(0x03020100U, 0x07060504U, &test_key_hsiphash) !=
 194                                                test_vectors_hsiphash[8]) {
 195                pr_info("hsiphash self-test 2u32: FAIL\n");
 196                ret = -EINVAL;
 197        }
 198        if (hsiphash_3u32(0x03020100U, 0x07060504U,
 199                          0x0b0a0908U, &test_key_hsiphash) !=
 200                                                test_vectors_hsiphash[12]) {
 201                pr_info("hsiphash self-test 3u32: FAIL\n");
 202                ret = -EINVAL;
 203        }
 204        if (hsiphash_4u32(0x03020100U, 0x07060504U,
 205                          0x0b0a0908U, 0x0f0e0d0cU, &test_key_hsiphash) !=
 206                                                test_vectors_hsiphash[16]) {
 207                pr_info("hsiphash self-test 4u32: FAIL\n");
 208                ret = -EINVAL;
 209        }
 210        if (!ret)
 211                pr_info("self-tests: pass\n");
 212        return ret;
 213}
 214
 215static void __exit siphash_test_exit(void)
 216{
 217}
 218
 219module_init(siphash_test_init);
 220module_exit(siphash_test_exit);
 221
 222MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
 223MODULE_LICENSE("Dual BSD/GPL");
 224