cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

test_siphash.c (7708B)


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