Latest update.
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <openssl/core_names.h>
|
||||
#include "internal/ffc.h"
|
||||
#include "internal/sizes.h"
|
||||
|
||||
/*
|
||||
* The intention with the "backend" source file is to offer backend support
|
||||
@@ -16,27 +17,76 @@
|
||||
* implementations alike.
|
||||
*/
|
||||
|
||||
int ffc_fromdata(FFC_PARAMS *ffc, const OSSL_PARAM params[])
|
||||
int ffc_params_fromdata(FFC_PARAMS *ffc, const OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *prm;
|
||||
const OSSL_PARAM *param_p, *param_q, *param_g;
|
||||
BIGNUM *p = NULL, *q = NULL, *g = NULL;
|
||||
BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
|
||||
int i;
|
||||
|
||||
if (ffc == NULL)
|
||||
return 0;
|
||||
|
||||
prm = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_GROUP);
|
||||
if (prm != NULL) {
|
||||
if (prm->data_type != OSSL_PARAM_UTF8_STRING)
|
||||
goto err;
|
||||
#ifndef OPENSSL_NO_DH
|
||||
/*
|
||||
* In a no-dh build we just go straight to err because we have no
|
||||
* support for this.
|
||||
*/
|
||||
if (!ffc_set_group_pqg(ffc, prm->data))
|
||||
#endif
|
||||
goto err;
|
||||
}
|
||||
|
||||
param_p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_P);
|
||||
param_q = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_Q);
|
||||
param_g = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_G);
|
||||
param_q = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_Q);
|
||||
|
||||
if ((param_p != NULL && !OSSL_PARAM_get_BN(param_p, &p))
|
||||
|| (param_q != NULL && !OSSL_PARAM_get_BN(param_q, &q))
|
||||
|| (param_g != NULL && !OSSL_PARAM_get_BN(param_g, &g)))
|
||||
goto err;
|
||||
|
||||
prm = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_GINDEX);
|
||||
if (prm != NULL) {
|
||||
if (!OSSL_PARAM_get_int(prm, &i))
|
||||
goto err;
|
||||
ffc->gindex = i;
|
||||
}
|
||||
prm = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_PCOUNTER);
|
||||
if (prm != NULL) {
|
||||
if (!OSSL_PARAM_get_int(prm, &i))
|
||||
goto err;
|
||||
ffc->pcounter = i;
|
||||
}
|
||||
prm = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_COFACTOR);
|
||||
if (prm != NULL) {
|
||||
if (!OSSL_PARAM_get_BN(prm, &j))
|
||||
goto err;
|
||||
j = NULL;
|
||||
}
|
||||
prm = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_H);
|
||||
if (prm != NULL) {
|
||||
if (!OSSL_PARAM_get_int(prm, &i))
|
||||
goto err;
|
||||
ffc->h = i;
|
||||
}
|
||||
prm = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_FFC_SEED);
|
||||
if (prm != NULL) {
|
||||
if (prm->data_type != OSSL_PARAM_OCTET_STRING)
|
||||
goto err;
|
||||
if (!ffc_params_set_seed(ffc, prm->data, prm->data_size))
|
||||
goto err;
|
||||
}
|
||||
ffc_params_set0_pqg(ffc, p, q, g);
|
||||
ffc_params_set0_j(ffc, j);
|
||||
return 1;
|
||||
|
||||
err:
|
||||
BN_free(j);
|
||||
BN_free(p);
|
||||
BN_free(q);
|
||||
BN_free(g);
|
||||
|
||||
@@ -21,34 +21,20 @@
|
||||
*/
|
||||
int ffc_generate_private_key(BN_CTX *ctx, const FFC_PARAMS *params,
|
||||
int N, int s, BIGNUM *priv)
|
||||
{
|
||||
#ifdef FIPS_MODE
|
||||
return ffc_generate_private_key_fips(ctx, params, N, s, priv);
|
||||
#else
|
||||
do {
|
||||
if (!BN_priv_rand_range_ex(priv, params->q, ctx))
|
||||
return 0;
|
||||
} while (BN_is_zero(priv) || BN_is_one(priv));
|
||||
return 1;
|
||||
#endif /* FIPS_MODE */
|
||||
}
|
||||
|
||||
int ffc_generate_private_key_fips(BN_CTX *ctx, const FFC_PARAMS *params,
|
||||
int N, int s, BIGNUM *priv)
|
||||
{
|
||||
int ret = 0, qbits = BN_num_bits(params->q);
|
||||
BIGNUM *m, *two_powN = NULL;
|
||||
|
||||
/* Deal with the edge case where the value of N is not set */
|
||||
if (N == 0)
|
||||
N = qbits;
|
||||
if (s == 0)
|
||||
s = N / 2;
|
||||
|
||||
/* Step (2) : check range of N */
|
||||
if (N < 2 * s || N > qbits)
|
||||
return 0;
|
||||
|
||||
/* Deal with the edge case where the value of N is not set */
|
||||
if (N == 0) {
|
||||
N = qbits;
|
||||
s = N / 2;
|
||||
}
|
||||
|
||||
two_powN = BN_new();
|
||||
/* 2^N */
|
||||
if (two_powN == NULL || !BN_lshift(two_powN, BN_value_one(), N))
|
||||
|
||||
+85
-4
@@ -8,7 +8,10 @@
|
||||
*/
|
||||
|
||||
#include <string.h> /* memset */
|
||||
#include <openssl/core_names.h>
|
||||
#include "internal/ffc.h"
|
||||
#include "internal/param_build_set.h"
|
||||
|
||||
#ifndef FIPS_MODE
|
||||
# include <openssl/asn1.h> /* ffc_params_print */
|
||||
#endif
|
||||
@@ -67,15 +70,17 @@ void ffc_params_set0_j(FFC_PARAMS *d, BIGNUM *j)
|
||||
d->j = j;
|
||||
}
|
||||
|
||||
int ffc_params_set_validate_params(FFC_PARAMS *params,
|
||||
const unsigned char *seed, size_t seedlen,
|
||||
int counter)
|
||||
int ffc_params_set_seed(FFC_PARAMS *params,
|
||||
const unsigned char *seed, size_t seedlen)
|
||||
{
|
||||
if (params == NULL)
|
||||
return 0;
|
||||
|
||||
if (params->seed != NULL)
|
||||
if (params->seed != NULL) {
|
||||
if (params->seed == seed)
|
||||
return 1;
|
||||
OPENSSL_free(params->seed);
|
||||
}
|
||||
|
||||
if (seed != NULL && seedlen > 0) {
|
||||
params->seed = OPENSSL_memdup(seed, seedlen);
|
||||
@@ -86,6 +91,30 @@ int ffc_params_set_validate_params(FFC_PARAMS *params,
|
||||
params->seed = NULL;
|
||||
params->seedlen = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ffc_params_set_gindex(FFC_PARAMS *params, int index)
|
||||
{
|
||||
params->gindex = index;
|
||||
}
|
||||
|
||||
void ffc_params_set_pcounter(FFC_PARAMS *params, int index)
|
||||
{
|
||||
params->pcounter = index;
|
||||
}
|
||||
|
||||
void ffc_params_set_h(FFC_PARAMS *params, int index)
|
||||
{
|
||||
params->h = index;
|
||||
}
|
||||
|
||||
int ffc_params_set_validate_params(FFC_PARAMS *params,
|
||||
const unsigned char *seed, size_t seedlen,
|
||||
int counter)
|
||||
{
|
||||
if (!ffc_params_set_seed(params, seed, seedlen))
|
||||
return 0;
|
||||
params->pcounter = counter;
|
||||
return 1;
|
||||
}
|
||||
@@ -139,7 +168,10 @@ int ffc_params_copy(FFC_PARAMS *dst, const FFC_PARAMS *src)
|
||||
} else {
|
||||
dst->seed = NULL;
|
||||
}
|
||||
dst->nid = src->nid;
|
||||
dst->pcounter = src->pcounter;
|
||||
dst->h = src->h;
|
||||
dst->gindex = src->gindex;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -150,6 +182,55 @@ int ffc_params_cmp(const FFC_PARAMS *a, const FFC_PARAMS *b, int ignore_q)
|
||||
&& (ignore_q || BN_cmp(a->q, b->q) == 0); /* Note: q may be NULL */
|
||||
}
|
||||
|
||||
int ffc_params_todata(const FFC_PARAMS *ffc, OSSL_PARAM_BLD *bld,
|
||||
OSSL_PARAM params[])
|
||||
{
|
||||
if (ffc == NULL)
|
||||
return 0;
|
||||
|
||||
if (ffc->p != NULL
|
||||
&& !ossl_param_build_set_bn(bld, params, OSSL_PKEY_PARAM_FFC_P, ffc->p))
|
||||
return 0;
|
||||
if (ffc->q != NULL
|
||||
&& !ossl_param_build_set_bn(bld, params, OSSL_PKEY_PARAM_FFC_Q, ffc->q))
|
||||
return 0;
|
||||
if (ffc->g != NULL
|
||||
&& !ossl_param_build_set_bn(bld, params, OSSL_PKEY_PARAM_FFC_G, ffc->g))
|
||||
return 0;
|
||||
if (ffc->j != NULL
|
||||
&& !ossl_param_build_set_bn(bld, params, OSSL_PKEY_PARAM_FFC_COFACTOR,
|
||||
ffc->j))
|
||||
return 0;
|
||||
if (!ossl_param_build_set_int(bld, params, OSSL_PKEY_PARAM_FFC_GINDEX,
|
||||
ffc->gindex))
|
||||
return 0;
|
||||
if (!ossl_param_build_set_int(bld, params, OSSL_PKEY_PARAM_FFC_PCOUNTER,
|
||||
ffc->pcounter))
|
||||
return 0;
|
||||
if (!ossl_param_build_set_int(bld, params, OSSL_PKEY_PARAM_FFC_H, ffc->h))
|
||||
return 0;
|
||||
if (ffc->seed != NULL
|
||||
&& !ossl_param_build_set_octet_string(bld, params,
|
||||
OSSL_PKEY_PARAM_FFC_SEED,
|
||||
ffc->seed, ffc->seedlen))
|
||||
return 0;
|
||||
if (ffc->nid != NID_undef) {
|
||||
#ifndef OPENSSL_NO_DH
|
||||
const char *name = ffc_named_group_from_uid(ffc->nid);
|
||||
|
||||
if (name == NULL
|
||||
|| !ossl_param_build_set_utf8_string(bld, params,
|
||||
OSSL_PKEY_PARAM_FFC_GROUP,
|
||||
name))
|
||||
return 0;
|
||||
#else
|
||||
/* How could this be? We should not have a nid in a no-dh build. */
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef FIPS_MODE
|
||||
int ffc_params_print(BIO *bp, const FFC_PARAMS *ffc, int indent)
|
||||
{
|
||||
|
||||
@@ -487,7 +487,7 @@ int ffc_params_FIPS186_4_gen_verify(OPENSSL_CTX *libctx, FFC_PARAMS *params,
|
||||
BIGNUM *g = NULL, *q = NULL, *p = NULL;
|
||||
BN_MONT_CTX *mont = NULL;
|
||||
int n = 0, m = 0, qsize = N >> 3;
|
||||
int canonical_g = 0, hret = -1;
|
||||
int canonical_g = 0, hret = 0;
|
||||
BN_CTX *ctx = NULL;
|
||||
EVP_MD_CTX *mctx = NULL;
|
||||
int generate = (validate_flags == 0);
|
||||
|
||||
Reference in New Issue
Block a user