Не, злобный Интель может увидеть что просят операцию XOR Там зырь какая фигня
hash - это юнион
union {
__u32 w[5];
unsigned long l[LONGS(EXTRACT_SIZE)];
} hash;
....
дальше распердолили энтропию,
....
перемешиваем
hash.w[0] ^= hash.w[3];
hash.w[1] ^= hash.w[4];
hash.w[2] ^= rol32(hash.w[2], 16);
for (i = 0; i < LONGS(EXTRACT_SIZE); i++) {
unsigned long v;
if (!arch_get_random_long(&v))
break;
// hash.l[] - не инициализирован, пустой,
// при (gcc -O2) с вероятностью 99.999999% он нулевой.
// тут делаем волшебную вещь
hash.l[i] ^= v;
// Это равносильно hash.l[i] = (0 ^ v) или просто (hash.l[i] = v);
}
То есть пул энтропии от софтварных способов лежит отдельно в hash.w[5],
от хардварного - в hash.l[8]
И да, троян RDRAND может определить адрес последней записи в кэш,
оттуда вынуть, сделать с ним нужную операцию, и поместить в массив hash.l[8].
Тем самым пул энтропии будет являться сам для себя ключом!