gnu.crypto.mac
public class UHash32 extends BaseMac
UHASH is a keyed hash function, which takes as input a string of arbitrary length, and produces as output a string of fixed length (such as 8 bytes). The actual output length depends on the parameter UMAC-OUTPUT-LEN.
UHASH has been shown to be epsilon-ASU ("Almost Strongly Universal"), where epsilon is a small (parameter-dependent) real number. Informally, saying that a keyed hash function is epsilon-ASU means that for any two distinct fixed input strings, the two outputs of the hash function with a random key "look almost like a pair of random strings". The number epsilon measures how non-random the output strings may be.
UHASH has been designed to be fast by exploiting several architectural features of modern commodity processors. It was specifically designed for use in UMAC. But UHASH is useful beyond that domain, and can be easily adopted for other purposes. UHASH does its work in three layers. First, a hash function calledNH
is used to compress input messages into strings which are
typically many times smaller than the input message. Second, the compressed
message is hashed with an optimized polynomial hash function into a
fixed-length 16-byte string. Finally, the 16-byte string is hashed using an
inner-product hash into a string of length WORD-LEN bytes. These three
layers are repeated (with a modified key) until the outputs total
UMAC-OUTPUT-LEN bytes.
References:
Version: $Revision: 1.7 $
Nested Class Summary | |
---|---|
class | UHash32.L1Hash32
First hash stage of the UHash32 algorithm. |
class | UHash32.L2Hash32 Second hash stage of the UHash32 algorithm. 5.4 L2-HASH-32: Second-layer hash.
|
class | UHash32.L3Hash32
Third hash stage of the UHash32 algorithm.
|
Field Summary | |
---|---|
static byte[] | ALL_ZEROES |
static long | BOUNDARY |
UHash32.L1Hash32[] | l1hash |
static BigInteger | LOWER_RANGE |
int | streams |
static BigInteger | TWO |
static BigInteger | UPPER_RANGE |
Constructor Summary | |
---|---|
UHash32() Trivial 0-arguments constructor. |
Method Summary | |
---|---|
Object | clone() |
byte[] | digest() |
void | init(Map attributes) |
int | macSize() |
static BigInteger | prime(int n) The prime numbers used in UMAC are: +-----+--------------------+---------------------------------------+ | x | prime(x) [Decimal] | prime(x) [Hexadecimal] | +-----+--------------------+---------------------------------------+ | 19 | 2^19 - 1 | 0x0007FFFF | | 32 | 2^32 - 5 | 0xFFFFFFFB | | 36 | 2^36 - 5 | 0x0000000F FFFFFFFB | | 64 | 2^64 - 59 | 0xFFFFFFFF FFFFFFC5 | | 128 | 2^128 - 159 | 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFF61 | +-----+--------------------+---------------------------------------+ |
void | reset() |
boolean | selfTest() |
void | update(byte b) |
void | update(byte[] b, int offset, int len) |
The prime numbers used in UMAC are:
+-----+--------------------+---------------------------------------+ | x | prime(x) [Decimal] | prime(x) [Hexadecimal] | +-----+--------------------+---------------------------------------+ | 19 | 2^19 - 1 | 0x0007FFFF | | 32 | 2^32 - 5 | 0xFFFFFFFB | | 36 | 2^36 - 5 | 0x0000000F FFFFFFFB | | 64 | 2^64 - 59 | 0xFFFFFFFF FFFFFFC5 | | 128 | 2^128 - 159 | 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFF61 | +-----+--------------------+---------------------------------------+
Parameters: n a number of bits.
Returns: the largest prime number less than 2**n.