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

hash.c (3243B)


      1// SPDX-License-Identifier: GPL-2.0
      2#ifdef __KERNEL__
      3# include <linux/crush/hash.h>
      4#else
      5# include "hash.h"
      6#endif
      7
      8/*
      9 * Robert Jenkins' function for mixing 32-bit values
     10 * https://burtleburtle.net/bob/hash/evahash.html
     11 * a, b = random bits, c = input and output
     12 */
     13#define crush_hashmix(a, b, c) do {			\
     14		a = a-b;  a = a-c;  a = a^(c>>13);	\
     15		b = b-c;  b = b-a;  b = b^(a<<8);	\
     16		c = c-a;  c = c-b;  c = c^(b>>13);	\
     17		a = a-b;  a = a-c;  a = a^(c>>12);	\
     18		b = b-c;  b = b-a;  b = b^(a<<16);	\
     19		c = c-a;  c = c-b;  c = c^(b>>5);	\
     20		a = a-b;  a = a-c;  a = a^(c>>3);	\
     21		b = b-c;  b = b-a;  b = b^(a<<10);	\
     22		c = c-a;  c = c-b;  c = c^(b>>15);	\
     23	} while (0)
     24
     25#define crush_hash_seed 1315423911
     26
     27static __u32 crush_hash32_rjenkins1(__u32 a)
     28{
     29	__u32 hash = crush_hash_seed ^ a;
     30	__u32 b = a;
     31	__u32 x = 231232;
     32	__u32 y = 1232;
     33	crush_hashmix(b, x, hash);
     34	crush_hashmix(y, a, hash);
     35	return hash;
     36}
     37
     38static __u32 crush_hash32_rjenkins1_2(__u32 a, __u32 b)
     39{
     40	__u32 hash = crush_hash_seed ^ a ^ b;
     41	__u32 x = 231232;
     42	__u32 y = 1232;
     43	crush_hashmix(a, b, hash);
     44	crush_hashmix(x, a, hash);
     45	crush_hashmix(b, y, hash);
     46	return hash;
     47}
     48
     49static __u32 crush_hash32_rjenkins1_3(__u32 a, __u32 b, __u32 c)
     50{
     51	__u32 hash = crush_hash_seed ^ a ^ b ^ c;
     52	__u32 x = 231232;
     53	__u32 y = 1232;
     54	crush_hashmix(a, b, hash);
     55	crush_hashmix(c, x, hash);
     56	crush_hashmix(y, a, hash);
     57	crush_hashmix(b, x, hash);
     58	crush_hashmix(y, c, hash);
     59	return hash;
     60}
     61
     62static __u32 crush_hash32_rjenkins1_4(__u32 a, __u32 b, __u32 c, __u32 d)
     63{
     64	__u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d;
     65	__u32 x = 231232;
     66	__u32 y = 1232;
     67	crush_hashmix(a, b, hash);
     68	crush_hashmix(c, d, hash);
     69	crush_hashmix(a, x, hash);
     70	crush_hashmix(y, b, hash);
     71	crush_hashmix(c, x, hash);
     72	crush_hashmix(y, d, hash);
     73	return hash;
     74}
     75
     76static __u32 crush_hash32_rjenkins1_5(__u32 a, __u32 b, __u32 c, __u32 d,
     77				      __u32 e)
     78{
     79	__u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d ^ e;
     80	__u32 x = 231232;
     81	__u32 y = 1232;
     82	crush_hashmix(a, b, hash);
     83	crush_hashmix(c, d, hash);
     84	crush_hashmix(e, x, hash);
     85	crush_hashmix(y, a, hash);
     86	crush_hashmix(b, x, hash);
     87	crush_hashmix(y, c, hash);
     88	crush_hashmix(d, x, hash);
     89	crush_hashmix(y, e, hash);
     90	return hash;
     91}
     92
     93
     94__u32 crush_hash32(int type, __u32 a)
     95{
     96	switch (type) {
     97	case CRUSH_HASH_RJENKINS1:
     98		return crush_hash32_rjenkins1(a);
     99	default:
    100		return 0;
    101	}
    102}
    103
    104__u32 crush_hash32_2(int type, __u32 a, __u32 b)
    105{
    106	switch (type) {
    107	case CRUSH_HASH_RJENKINS1:
    108		return crush_hash32_rjenkins1_2(a, b);
    109	default:
    110		return 0;
    111	}
    112}
    113
    114__u32 crush_hash32_3(int type, __u32 a, __u32 b, __u32 c)
    115{
    116	switch (type) {
    117	case CRUSH_HASH_RJENKINS1:
    118		return crush_hash32_rjenkins1_3(a, b, c);
    119	default:
    120		return 0;
    121	}
    122}
    123
    124__u32 crush_hash32_4(int type, __u32 a, __u32 b, __u32 c, __u32 d)
    125{
    126	switch (type) {
    127	case CRUSH_HASH_RJENKINS1:
    128		return crush_hash32_rjenkins1_4(a, b, c, d);
    129	default:
    130		return 0;
    131	}
    132}
    133
    134__u32 crush_hash32_5(int type, __u32 a, __u32 b, __u32 c, __u32 d, __u32 e)
    135{
    136	switch (type) {
    137	case CRUSH_HASH_RJENKINS1:
    138		return crush_hash32_rjenkins1_5(a, b, c, d, e);
    139	default:
    140		return 0;
    141	}
    142}
    143
    144const char *crush_hash_name(int type)
    145{
    146	switch (type) {
    147	case CRUSH_HASH_RJENKINS1:
    148		return "rjenkins1";
    149	default:
    150		return "unknown";
    151	}
    152}