staticvoid TEA_transform(__u32 buf[4], __u32 const in[])
{
__u32 sum = 0;
__u32 b0 = buf[0], b1 = buf[1];
__u32 a = in[0], b = in[1], c = in[2], d = in[3]; int n = 16;
do {
sum += DELTA;
b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b);
b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d);
} while (--n);
buf[0] += b0;
buf[1] += b1;
}
/* F, G and H are basic MD4 functions: selection, majority, parity */ #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) #define H(x, y, z) ((x) ^ (y) ^ (z))
staticvoid str2hashbuf_signed(constchar *msg, int len, __u32 *buf, int num)
{
__u32 pad, val; int i; constsignedchar *scp = (constsignedchar *) msg;
pad = (__u32)len | ((__u32)len << 8);
pad |= pad << 16;
val = pad; if (len > num*4)
len = num * 4; for (i = 0; i < len; i++) {
val = ((int) scp[i]) + (val << 8); if ((i % 4) == 3) {
*buf++ = val;
val = pad;
num--;
}
} if (--num >= 0)
*buf++ = val; while (--num >= 0)
*buf++ = pad;
}
staticvoid str2hashbuf_unsigned(constchar *msg, int len, __u32 *buf, int num)
{
__u32 pad, val; int i; constunsignedchar *ucp = (constunsignedchar *) msg;
pad = (__u32)len | ((__u32)len << 8);
pad |= pad << 16;
val = pad; if (len > num*4)
len = num * 4; for (i = 0; i < len; i++) {
val = ((int) ucp[i]) + (val << 8); if ((i % 4) == 3) {
*buf++ = val;
val = pad;
num--;
}
} if (--num >= 0)
*buf++ = val; while (--num >= 0)
*buf++ = pad;
}
/* Initialize the default seed for the hash checksum functions */
buf[0] = 0x67452301;
buf[1] = 0xefcdab89;
buf[2] = 0x98badcfe;
buf[3] = 0x10325476;
/* Check to see if the seed is all zero's */ if (hinfo->seed) { for (i = 0; i < 4; i++) { if (hinfo->seed[i]) {
memcpy(buf, hinfo->seed, sizeof(buf)); break;
}
}
}
switch (hinfo->hash_version) { case DX_HASH_LEGACY_UNSIGNED:
hash = dx_hack_hash_unsigned(name, len); break; case DX_HASH_LEGACY:
hash = dx_hack_hash_signed(name, len); break; case DX_HASH_HALF_MD4_UNSIGNED:
str2hashbuf = str2hashbuf_unsigned;
fallthrough; case DX_HASH_HALF_MD4:
p = name; while (len > 0) {
(*str2hashbuf)(p, len, in, 8);
half_md4_transform(buf, in);
len -= 32;
p += 32;
}
minor_hash = buf[2];
hash = buf[1]; break; case DX_HASH_TEA_UNSIGNED:
str2hashbuf = str2hashbuf_unsigned;
fallthrough; case DX_HASH_TEA:
p = name; while (len > 0) {
(*str2hashbuf)(p, len, in, 4);
TEA_transform(buf, in);
len -= 16;
p += 16;
}
hash = buf[0];
minor_hash = buf[1]; break; case DX_HASH_SIPHASH:
{ struct qstr qname = QSTR_INIT(name, len);
__u64 combined_hash;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.