0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0015
0016 #include <linux/siphash.h>
0017 #include <linux/kernel.h>
0018 #include <linux/string.h>
0019 #include <linux/errno.h>
0020 #include <linux/module.h>
0021
0022
0023
0024
0025
0026 static const siphash_key_t test_key_siphash =
0027 {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
0028
0029 static const u64 test_vectors_siphash[64] = {
0030 0x726fdb47dd0e0e31ULL, 0x74f839c593dc67fdULL, 0x0d6c8009d9a94f5aULL,
0031 0x85676696d7fb7e2dULL, 0xcf2794e0277187b7ULL, 0x18765564cd99a68dULL,
0032 0xcbc9466e58fee3ceULL, 0xab0200f58b01d137ULL, 0x93f5f5799a932462ULL,
0033 0x9e0082df0ba9e4b0ULL, 0x7a5dbbc594ddb9f3ULL, 0xf4b32f46226bada7ULL,
0034 0x751e8fbc860ee5fbULL, 0x14ea5627c0843d90ULL, 0xf723ca908e7af2eeULL,
0035 0xa129ca6149be45e5ULL, 0x3f2acc7f57c29bdbULL, 0x699ae9f52cbe4794ULL,
0036 0x4bc1b3f0968dd39cULL, 0xbb6dc91da77961bdULL, 0xbed65cf21aa2ee98ULL,
0037 0xd0f2cbb02e3b67c7ULL, 0x93536795e3a33e88ULL, 0xa80c038ccd5ccec8ULL,
0038 0xb8ad50c6f649af94ULL, 0xbce192de8a85b8eaULL, 0x17d835b85bbb15f3ULL,
0039 0x2f2e6163076bcfadULL, 0xde4daaaca71dc9a5ULL, 0xa6a2506687956571ULL,
0040 0xad87a3535c49ef28ULL, 0x32d892fad841c342ULL, 0x7127512f72f27cceULL,
0041 0xa7f32346f95978e3ULL, 0x12e0b01abb051238ULL, 0x15e034d40fa197aeULL,
0042 0x314dffbe0815a3b4ULL, 0x027990f029623981ULL, 0xcadcd4e59ef40c4dULL,
0043 0x9abfd8766a33735cULL, 0x0e3ea96b5304a7d0ULL, 0xad0c42d6fc585992ULL,
0044 0x187306c89bc215a9ULL, 0xd4a60abcf3792b95ULL, 0xf935451de4f21df2ULL,
0045 0xa9538f0419755787ULL, 0xdb9acddff56ca510ULL, 0xd06c98cd5c0975ebULL,
0046 0xe612a3cb9ecba951ULL, 0xc766e62cfcadaf96ULL, 0xee64435a9752fe72ULL,
0047 0xa192d576b245165aULL, 0x0a8787bf8ecb74b2ULL, 0x81b3e73d20b49b6fULL,
0048 0x7fa8220ba3b2eceaULL, 0x245731c13ca42499ULL, 0xb78dbfaf3a8d83bdULL,
0049 0xea1ad565322a1a0bULL, 0x60e61c23a3795013ULL, 0x6606d7e446282b93ULL,
0050 0x6ca4ecb15c5f91e1ULL, 0x9f626da15c9625f3ULL, 0xe51b38608ef25f57ULL,
0051 0x958a324ceb064572ULL
0052 };
0053
0054 #if BITS_PER_LONG == 64
0055 static const hsiphash_key_t test_key_hsiphash =
0056 {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
0057
0058 static const u32 test_vectors_hsiphash[64] = {
0059 0x050fc4dcU, 0x7d57ca93U, 0x4dc7d44dU,
0060 0xe7ddf7fbU, 0x88d38328U, 0x49533b67U,
0061 0xc59f22a7U, 0x9bb11140U, 0x8d299a8eU,
0062 0x6c063de4U, 0x92ff097fU, 0xf94dc352U,
0063 0x57b4d9a2U, 0x1229ffa7U, 0xc0f95d34U,
0064 0x2a519956U, 0x7d908b66U, 0x63dbd80cU,
0065 0xb473e63eU, 0x8d297d1cU, 0xa6cce040U,
0066 0x2b45f844U, 0xa320872eU, 0xdae6c123U,
0067 0x67349c8cU, 0x705b0979U, 0xca9913a5U,
0068 0x4ade3b35U, 0xef6cd00dU, 0x4ab1e1f4U,
0069 0x43c5e663U, 0x8c21d1bcU, 0x16a7b60dU,
0070 0x7a8ff9bfU, 0x1f2a753eU, 0xbf186b91U,
0071 0xada26206U, 0xa3c33057U, 0xae3a36a1U,
0072 0x7b108392U, 0x99e41531U, 0x3f1ad944U,
0073 0xc8138825U, 0xc28949a6U, 0xfaf8876bU,
0074 0x9f042196U, 0x68b1d623U, 0x8b5114fdU,
0075 0xdf074c46U, 0x12cc86b3U, 0x0a52098fU,
0076 0x9d292f9aU, 0xa2f41f12U, 0x43a71ed0U,
0077 0x73f0bce6U, 0x70a7e980U, 0x243c6d75U,
0078 0xfdb71513U, 0xa67d8a08U, 0xb7e8f148U,
0079 0xf7a644eeU, 0x0f1837f2U, 0x4b6694e0U,
0080 0xb7bbb3a8U
0081 };
0082 #else
0083 static const hsiphash_key_t test_key_hsiphash =
0084 {{ 0x03020100U, 0x07060504U }};
0085
0086 static const u32 test_vectors_hsiphash[64] = {
0087 0x5814c896U, 0xe7e864caU, 0xbc4b0e30U,
0088 0x01539939U, 0x7e059ea6U, 0x88e3d89bU,
0089 0xa0080b65U, 0x9d38d9d6U, 0x577999b1U,
0090 0xc839caedU, 0xe4fa32cfU, 0x959246eeU,
0091 0x6b28096cU, 0x66dd9cd6U, 0x16658a7cU,
0092 0xd0257b04U, 0x8b31d501U, 0x2b1cd04bU,
0093 0x06712339U, 0x522aca67U, 0x911bb605U,
0094 0x90a65f0eU, 0xf826ef7bU, 0x62512debU,
0095 0x57150ad7U, 0x5d473507U, 0x1ec47442U,
0096 0xab64afd3U, 0x0a4100d0U, 0x6d2ce652U,
0097 0x2331b6a3U, 0x08d8791aU, 0xbc6dda8dU,
0098 0xe0f6c934U, 0xb0652033U, 0x9b9851ccU,
0099 0x7c46fb7fU, 0x732ba8cbU, 0xf142997aU,
0100 0xfcc9aa1bU, 0x05327eb2U, 0xe110131cU,
0101 0xf9e5e7c0U, 0xa7d708a6U, 0x11795ab1U,
0102 0x65671619U, 0x9f5fff91U, 0xd89c5267U,
0103 0x007783ebU, 0x95766243U, 0xab639262U,
0104 0x9c7e1390U, 0xc368dda6U, 0x38ddc455U,
0105 0xfa13d379U, 0x979ea4e8U, 0x53ecd77eU,
0106 0x2ee80657U, 0x33dbb66aU, 0xae3f0577U,
0107 0x88b4c4ccU, 0x3e7f480bU, 0x74c1ebf8U,
0108 0x87178304U
0109 };
0110 #endif
0111
0112 static int __init siphash_test_init(void)
0113 {
0114 u8 in[64] __aligned(SIPHASH_ALIGNMENT);
0115 u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
0116 u8 i;
0117 int ret = 0;
0118
0119 for (i = 0; i < 64; ++i) {
0120 in[i] = i;
0121 in_unaligned[i + 1] = i;
0122 if (siphash(in, i, &test_key_siphash) !=
0123 test_vectors_siphash[i]) {
0124 pr_info("siphash self-test aligned %u: FAIL\n", i + 1);
0125 ret = -EINVAL;
0126 }
0127 if (siphash(in_unaligned + 1, i, &test_key_siphash) !=
0128 test_vectors_siphash[i]) {
0129 pr_info("siphash self-test unaligned %u: FAIL\n", i + 1);
0130 ret = -EINVAL;
0131 }
0132 if (hsiphash(in, i, &test_key_hsiphash) !=
0133 test_vectors_hsiphash[i]) {
0134 pr_info("hsiphash self-test aligned %u: FAIL\n", i + 1);
0135 ret = -EINVAL;
0136 }
0137 if (hsiphash(in_unaligned + 1, i, &test_key_hsiphash) !=
0138 test_vectors_hsiphash[i]) {
0139 pr_info("hsiphash self-test unaligned %u: FAIL\n", i + 1);
0140 ret = -EINVAL;
0141 }
0142 }
0143 if (siphash_1u64(0x0706050403020100ULL, &test_key_siphash) !=
0144 test_vectors_siphash[8]) {
0145 pr_info("siphash self-test 1u64: FAIL\n");
0146 ret = -EINVAL;
0147 }
0148 if (siphash_2u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
0149 &test_key_siphash) != test_vectors_siphash[16]) {
0150 pr_info("siphash self-test 2u64: FAIL\n");
0151 ret = -EINVAL;
0152 }
0153 if (siphash_3u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
0154 0x1716151413121110ULL, &test_key_siphash) !=
0155 test_vectors_siphash[24]) {
0156 pr_info("siphash self-test 3u64: FAIL\n");
0157 ret = -EINVAL;
0158 }
0159 if (siphash_4u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
0160 0x1716151413121110ULL, 0x1f1e1d1c1b1a1918ULL,
0161 &test_key_siphash) != test_vectors_siphash[32]) {
0162 pr_info("siphash self-test 4u64: FAIL\n");
0163 ret = -EINVAL;
0164 }
0165 if (siphash_1u32(0x03020100U, &test_key_siphash) !=
0166 test_vectors_siphash[4]) {
0167 pr_info("siphash self-test 1u32: FAIL\n");
0168 ret = -EINVAL;
0169 }
0170 if (siphash_2u32(0x03020100U, 0x07060504U, &test_key_siphash) !=
0171 test_vectors_siphash[8]) {
0172 pr_info("siphash self-test 2u32: FAIL\n");
0173 ret = -EINVAL;
0174 }
0175 if (siphash_3u32(0x03020100U, 0x07060504U,
0176 0x0b0a0908U, &test_key_siphash) !=
0177 test_vectors_siphash[12]) {
0178 pr_info("siphash self-test 3u32: FAIL\n");
0179 ret = -EINVAL;
0180 }
0181 if (siphash_4u32(0x03020100U, 0x07060504U,
0182 0x0b0a0908U, 0x0f0e0d0cU, &test_key_siphash) !=
0183 test_vectors_siphash[16]) {
0184 pr_info("siphash self-test 4u32: FAIL\n");
0185 ret = -EINVAL;
0186 }
0187 if (hsiphash_1u32(0x03020100U, &test_key_hsiphash) !=
0188 test_vectors_hsiphash[4]) {
0189 pr_info("hsiphash self-test 1u32: FAIL\n");
0190 ret = -EINVAL;
0191 }
0192 if (hsiphash_2u32(0x03020100U, 0x07060504U, &test_key_hsiphash) !=
0193 test_vectors_hsiphash[8]) {
0194 pr_info("hsiphash self-test 2u32: FAIL\n");
0195 ret = -EINVAL;
0196 }
0197 if (hsiphash_3u32(0x03020100U, 0x07060504U,
0198 0x0b0a0908U, &test_key_hsiphash) !=
0199 test_vectors_hsiphash[12]) {
0200 pr_info("hsiphash self-test 3u32: FAIL\n");
0201 ret = -EINVAL;
0202 }
0203 if (hsiphash_4u32(0x03020100U, 0x07060504U,
0204 0x0b0a0908U, 0x0f0e0d0cU, &test_key_hsiphash) !=
0205 test_vectors_hsiphash[16]) {
0206 pr_info("hsiphash self-test 4u32: FAIL\n");
0207 ret = -EINVAL;
0208 }
0209 if (!ret)
0210 pr_info("self-tests: pass\n");
0211 return ret;
0212 }
0213
0214 static void __exit siphash_test_exit(void)
0215 {
0216 }
0217
0218 module_init(siphash_test_init);
0219 module_exit(siphash_test_exit);
0220
0221 MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
0222 MODULE_LICENSE("Dual BSD/GPL");