crypto: dh - add public key verification test
According to SP800-56A section 5.6.2.1, the public key to be processed for the DH operation shall be checked for appropriateness. The check shall covers the full verification test in case the domain parameter Q is provided as defined in SP800-56A section 5.6.2.3.1. If Q is not provided, the partial check according to SP800-56A section 5.6.2.3.2 is performed. The full verification test requires the presence of the domain parameter Q. Thus, the patch adds the support to handle Q. It is permissible to not provide the Q value as part of the domain parameters. This implies that the interface is still backwards-compatible where so far only P and G are to be provided. However, if Q is provided, it is imported. Without the test, the NIST ACVP testing fails. After adding this check, the NIST ACVP testing passes. Testing without providing the Q domain parameter has been performed to verify the interface has not changed. Signed-off-by: Stephan Mueller <smueller@chronox.de> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
73463ade0a
commit
e3fe0ae129
3 changed files with 79 additions and 6 deletions
|
|
@ -30,7 +30,7 @@ static inline const u8 *dh_unpack_data(void *dst, const void *src, size_t size)
|
|||
|
||||
static inline unsigned int dh_data_size(const struct dh *p)
|
||||
{
|
||||
return p->key_size + p->p_size + p->g_size;
|
||||
return p->key_size + p->p_size + p->q_size + p->g_size;
|
||||
}
|
||||
|
||||
unsigned int crypto_dh_key_len(const struct dh *p)
|
||||
|
|
@ -56,9 +56,11 @@ int crypto_dh_encode_key(char *buf, unsigned int len, const struct dh *params)
|
|||
ptr = dh_pack_data(ptr, &secret, sizeof(secret));
|
||||
ptr = dh_pack_data(ptr, ¶ms->key_size, sizeof(params->key_size));
|
||||
ptr = dh_pack_data(ptr, ¶ms->p_size, sizeof(params->p_size));
|
||||
ptr = dh_pack_data(ptr, ¶ms->q_size, sizeof(params->q_size));
|
||||
ptr = dh_pack_data(ptr, ¶ms->g_size, sizeof(params->g_size));
|
||||
ptr = dh_pack_data(ptr, params->key, params->key_size);
|
||||
ptr = dh_pack_data(ptr, params->p, params->p_size);
|
||||
ptr = dh_pack_data(ptr, params->q, params->q_size);
|
||||
dh_pack_data(ptr, params->g, params->g_size);
|
||||
|
||||
return 0;
|
||||
|
|
@ -79,6 +81,7 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
|||
|
||||
ptr = dh_unpack_data(¶ms->key_size, ptr, sizeof(params->key_size));
|
||||
ptr = dh_unpack_data(¶ms->p_size, ptr, sizeof(params->p_size));
|
||||
ptr = dh_unpack_data(¶ms->q_size, ptr, sizeof(params->q_size));
|
||||
ptr = dh_unpack_data(¶ms->g_size, ptr, sizeof(params->g_size));
|
||||
if (secret.len != crypto_dh_key_len(params))
|
||||
return -EINVAL;
|
||||
|
|
@ -88,7 +91,7 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
|||
* some drivers assume otherwise.
|
||||
*/
|
||||
if (params->key_size > params->p_size ||
|
||||
params->g_size > params->p_size)
|
||||
params->g_size > params->p_size || params->q_size > params->p_size)
|
||||
return -EINVAL;
|
||||
|
||||
/* Don't allocate memory. Set pointers to data within
|
||||
|
|
@ -96,7 +99,9 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
|||
*/
|
||||
params->key = (void *)ptr;
|
||||
params->p = (void *)(ptr + params->key_size);
|
||||
params->g = (void *)(ptr + params->key_size + params->p_size);
|
||||
params->q = (void *)(ptr + params->key_size + params->p_size);
|
||||
params->g = (void *)(ptr + params->key_size + params->p_size +
|
||||
params->q_size);
|
||||
|
||||
/*
|
||||
* Don't permit 'p' to be 0. It's not a prime number, and it's subject
|
||||
|
|
@ -106,6 +111,10 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
|||
if (memchr_inv(params->p, 0, params->p_size) == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* It is permissible to not provide Q. */
|
||||
if (params->q_size == 0)
|
||||
params->q = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(crypto_dh_decode_key);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue