in umac.c [1124:1167]
static int uhash(uhash_ctx_t ahc, u_char *msg, long len, u_char *res)
/* assumes that msg is in a writable buffer of length divisible by */
/* L1_PAD_BOUNDARY. Bytes beyond msg[len] may be zeroed. */
{
UINT8 nh_result[STREAMS*sizeof(UINT64)];
UINT32 nh_len;
int extra_zeroes_needed;
/* If the message to be hashed is no longer than L1_HASH_LEN, we skip
* the polyhash.
*/
if (len <= L1_KEY_LEN) {
if (len == 0) /* If zero length messages will not */
nh_len = L1_PAD_BOUNDARY; /* be seen, comment out this case */
else
nh_len = ((len + (L1_PAD_BOUNDARY - 1)) & ~(L1_PAD_BOUNDARY - 1));
extra_zeroes_needed = nh_len - len;
zero_pad((UINT8 *)msg + len, extra_zeroes_needed);
nh(&ahc->hash, (UINT8 *)msg, nh_len, len, nh_result);
ip_short(ahc,nh_result, res);
} else {
/* Otherwise, we hash each L1_KEY_LEN chunk with NH, passing the NH
* output to poly_hash().
*/
do {
nh(&ahc->hash, (UINT8 *)msg, L1_KEY_LEN, L1_KEY_LEN, nh_result);
poly_hash(ahc,(UINT32 *)nh_result);
len -= L1_KEY_LEN;
msg += L1_KEY_LEN;
} while (len >= L1_KEY_LEN);
if (len) {
nh_len = ((len + (L1_PAD_BOUNDARY - 1)) & ~(L1_PAD_BOUNDARY - 1));
extra_zeroes_needed = nh_len - len;
zero_pad((UINT8 *)msg + len, extra_zeroes_needed);
nh(&ahc->hash, (UINT8 *)msg, nh_len, len, nh_result);
poly_hash(ahc,(UINT32 *)nh_result);
}
ip_long(ahc, res);
}
uhash_reset(ahc);
return 1;
}