Optimized MGF1 implementation
This commit is contained in:
@@ -68,7 +68,9 @@ METHOD(ntru_mgf1_t, get_mask, bool,
|
|||||||
private_ntru_mgf1_t *this, size_t mask_len, u_char *mask)
|
private_ntru_mgf1_t *this, size_t mask_len, u_char *mask)
|
||||||
{
|
{
|
||||||
u_char buf[HASH_SIZE_SHA512];
|
u_char buf[HASH_SIZE_SHA512];
|
||||||
size_t len;
|
size_t hash_len;
|
||||||
|
|
||||||
|
hash_len = this->hasher->get_hash_size(this->hasher);
|
||||||
|
|
||||||
while (mask_len > 0)
|
while (mask_len > 0)
|
||||||
{
|
{
|
||||||
@@ -83,17 +85,20 @@ METHOD(ntru_mgf1_t, get_mask, bool,
|
|||||||
this->overflow = TRUE;
|
this->overflow = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this->hasher->get_hash(this->hasher, this->state, buf))
|
/* get the next or final mask block from the hash function */
|
||||||
|
if (!this->hasher->get_hash(this->hasher, this->state,
|
||||||
|
(mask_len < hash_len) ? buf : mask))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
if (mask_len < hash_len)
|
||||||
len = min(mask_len, this->hasher->get_hash_size(this->hasher));
|
{
|
||||||
memcpy(mask, buf, len);
|
memcpy(mask, buf, mask_len);
|
||||||
mask_len -= len;
|
return TRUE;
|
||||||
mask += len;
|
}
|
||||||
|
mask_len -= hash_len;
|
||||||
|
mask += hash_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user