2 * Copyright 2000 Hans Reiser
3 * See README for licensing and copyright details
5 * Ported to FreeBSD by Jean-Sébastien Pédron <jspedron@club-internet.fr>
10 #include <gnu/fs/reiserfs/reiserfs_fs.h>
13 * Keyed 32-bit hash function using TEA in a Davis-Meyer function
15 * Hi = E Mi(Hi-1) + Hi-1
17 * (see Applied Cryptography, 2nd edition, p448).
19 * Jeremy Fitzhardinge <jeremy@zip.com.au> 1998
21 * Jeremy has agreed to the contents of README. -Hans
22 * Yura's function is added (04/07/2000)
31 #define DELTA 0x9E3779B9
32 #define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */
33 #define PARTROUNDS 6 /* 6 gets complete mixing */
35 /* a, b, c, d - data; h0, h1 - accumulated hash */
36 #define TEACORE(rounds) \
49 b0 += ((b1 << 4) + a) ^ (b1+sum) ^ ((b1 >> 5) + b); \
50 b1 += ((b0 << 4) + c) ^ (b0+sum) ^ ((b0 >> 5) + d); \
58 keyed_hash(const signed char *msg, int len)
60 uint32_t k[] = { 0x9464a485, 0x542e1a94, 0x3e846bff, 0xb75bcfc3 };
70 pad = (uint32_t)len | ((uint32_t)len << 8);
74 a = (uint32_t)msg[ 0] |
75 (uint32_t)msg[ 1] << 8 |
76 (uint32_t)msg[ 2] << 16 |
77 (uint32_t)msg[ 3] << 24;
78 b = (uint32_t)msg[ 4] |
79 (uint32_t)msg[ 5] << 8 |
80 (uint32_t)msg[ 6] << 16 |
81 (uint32_t)msg[ 7] << 24;
82 c = (uint32_t)msg[ 8] |
83 (uint32_t)msg[ 9] << 8 |
84 (uint32_t)msg[10] << 16 |
85 (uint32_t)msg[11] << 24;
86 d = (uint32_t)msg[12] |
87 (uint32_t)msg[13] << 8 |
88 (uint32_t)msg[14] << 16 |
89 (uint32_t)msg[15] << 24;
98 a = (uint32_t)msg[ 0] |
99 (uint32_t)msg[ 1] << 8 |
100 (uint32_t)msg[ 2] << 16 |
101 (uint32_t)msg[ 3] << 24;
102 b = (uint32_t)msg[ 4] |
103 (uint32_t)msg[ 5] << 8 |
104 (uint32_t)msg[ 6] << 16 |
105 (uint32_t)msg[ 7] << 24;
106 c = (uint32_t)msg[ 8] |
107 (uint32_t)msg[ 9] << 8 |
108 (uint32_t)msg[10] << 16 |
109 (uint32_t)msg[11] << 24;
112 for(i = 12; i < len; i++) {
116 } else if (len >= 8) {
117 a = (uint32_t)msg[ 0] |
118 (uint32_t)msg[ 1] << 8 |
119 (uint32_t)msg[ 2] << 16 |
120 (uint32_t)msg[ 3] << 24;
121 b = (uint32_t)msg[ 4] |
122 (uint32_t)msg[ 5] << 8 |
123 (uint32_t)msg[ 6] << 16 |
124 (uint32_t)msg[ 7] << 24;
127 for(i = 8; i < len; i++) {
131 } else if (len >= 4) {
132 a = (uint32_t)msg[ 0] |
133 (uint32_t)msg[ 1] << 8 |
134 (uint32_t)msg[ 2] << 16 |
135 (uint32_t)msg[ 3] << 24;
138 for(i = 4; i < len; i++) {
144 for(i = 0; i < len; i++) {
157 * What follows in this file is copyright 2000 by Hans Reiser, and the
158 * licensing of what follows is governed by README
161 yura_hash(const signed char *msg, int len)
167 for (pow = 1, i = 1; i < len; i++)
173 a = (msg[0] - 48) * pow;
175 for (i = 1; i < len; i++) {
177 for (pow = 1, j = i; j < len - 1; j++)
182 for (; i < 40; i++) {
184 for (pow = 1, j = i; j < len - 1; j++)
189 for (; i < 256; i++) {
191 for (pow = 1, j = i; j < len - 1; j++)
201 r5_hash(const signed char *msg, int len)
204 const signed char *start;
209 while (*msg && msg < start + len) {