Latest update.

This commit is contained in:
2020-02-11 23:20:44 +09:00
parent 047a30700b
commit 9dfeec3942
639 changed files with 14024 additions and 31198 deletions
+151 -30
View File
@@ -10,7 +10,9 @@
#include <openssl/core_numbers.h>
#include <openssl/core_names.h>
#include <openssl/bn.h>
#include <openssl/err.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/params.h>
#include <openssl/types.h>
#include "internal/param_build.h"
@@ -18,9 +20,20 @@
#include "prov/providercommon.h"
#include "crypto/rsa.h"
static OSSL_OP_keymgmt_importkey_fn rsa_importkey;
static OSSL_OP_keymgmt_exportkey_fn rsa_exportkey;
static OSSL_OP_keymgmt_get_key_params_fn rsa_get_key_params;
static OSSL_OP_keymgmt_new_fn rsa_newdata;
static OSSL_OP_keymgmt_free_fn rsa_freedata;
static OSSL_OP_keymgmt_get_params_fn rsa_get_params;
static OSSL_OP_keymgmt_gettable_params_fn rsa_gettable_params;
static OSSL_OP_keymgmt_has_fn rsa_has;
static OSSL_OP_keymgmt_validate_fn rsa_validate;
static OSSL_OP_keymgmt_import_fn rsa_import;
static OSSL_OP_keymgmt_import_types_fn rsa_import_types;
static OSSL_OP_keymgmt_export_fn rsa_export;
static OSSL_OP_keymgmt_export_types_fn rsa_export_types;
#define RSA_DEFAULT_MD "SHA256"
#define RSA_POSSIBLE_SELECTIONS \
(OSSL_KEYMGMT_SELECT_KEYPAIR | OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS)
DEFINE_STACK_OF(BIGNUM)
DEFINE_SPECIAL_STACK_OF_CONST(BIGNUM_const, BIGNUM)
@@ -155,33 +168,73 @@ static int key_to_params(RSA *rsa, OSSL_PARAM_BLD *tmpl)
return ret;
}
static void *rsa_importkey(void *provctx, const OSSL_PARAM params[])
static void *rsa_newdata(void *provctx)
{
RSA *rsa;
if ((rsa = RSA_new()) == NULL
|| !params_to_key(rsa, params)) {
RSA_free(rsa);
rsa = NULL;
}
return rsa;
return RSA_new();
}
static int rsa_exportkey(void *key, OSSL_CALLBACK *param_callback, void *cbarg)
static void rsa_freedata(void *keydata)
{
RSA *rsa = key;
RSA_free(keydata);
}
static int rsa_has(void *keydata, int selection)
{
RSA *rsa = keydata;
int ok = 0;
if ((selection & RSA_POSSIBLE_SELECTIONS) != 0)
ok = 1;
ok = ok && (RSA_get0_e(rsa) != NULL);
if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0)
ok = ok && (RSA_get0_n(rsa) != NULL);
if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)
ok = ok && (RSA_get0_d(rsa) != NULL);
return ok;
}
static int rsa_import(void *keydata, int selection, const OSSL_PARAM params[])
{
RSA *rsa = keydata;
int ok = 1;
if (rsa == NULL)
return 0;
/* TODO(3.0) PSS and OAEP should bring on parameters */
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
ok = ok && params_to_key(rsa, params);
return ok;
}
static int rsa_export(void *keydata, int selection,
OSSL_CALLBACK *param_callback, void *cbarg)
{
RSA *rsa = keydata;
OSSL_PARAM_BLD tmpl;
OSSL_PARAM *params = NULL;
int ret;
int ok = 1;
if (rsa == NULL)
return 0;
/* TODO(3.0) PSS and OAEP should bring on parameters */
ossl_param_bld_init(&tmpl);
if (rsa == NULL
|| !key_to_params(rsa, &tmpl)
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
ok = ok && key_to_params(rsa, &tmpl);
if (!ok
|| (params = ossl_param_bld_to_param(&tmpl)) == NULL)
return 0;
ret = param_callback(params, cbarg);
ok = param_callback(params, cbarg);
ossl_param_bld_free(params);
return ret;
return ok;
}
/*
@@ -235,17 +288,25 @@ static const OSSL_PARAM rsa_key_types[] = {
* so we at least pretend to have some limits.
*/
static const OSSL_PARAM *rsa_exportkey_types(void)
static const OSSL_PARAM *rsa_imexport_types(int selection)
{
return rsa_key_types;
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
return rsa_key_types;
return NULL;
}
static const OSSL_PARAM *rsa_importkey_types(void)
static const OSSL_PARAM *rsa_import_types(int selection)
{
return rsa_key_types;
return rsa_imexport_types(selection);
}
static int rsa_get_key_params(void *key, OSSL_PARAM params[])
static const OSSL_PARAM *rsa_export_types(int selection)
{
return rsa_imexport_types(selection);
}
static int rsa_get_params(void *key, OSSL_PARAM params[])
{
RSA *rsa = key;
OSSL_PARAM *p;
@@ -259,15 +320,75 @@ static int rsa_get_key_params(void *key, OSSL_PARAM params[])
if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_MAX_SIZE)) != NULL
&& !OSSL_PARAM_set_int(p, RSA_size(rsa)))
return 0;
# if 0 /* PSS support pending */
if ((p = OSSL_PARAM_locate(params,
OSSL_PKEY_PARAM_MANDATORY_DIGEST)) != NULL
&& RSA_get0_pss_params(rsa) != NULL) {
const EVP_MD *md, *mgf1md;
int min_saltlen;
if (!rsa_pss_get_param(RSA_get0_pss_params(rsa),
&md, &mgf1md, &min_saltlen)) {
ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
return 0;
}
if (!OSSL_PARAM_set_utf8_string(p, EVP_MD_name(md)))
return 0;
}
#endif
if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_DEFAULT_DIGEST)) != NULL
&& RSA_get0_pss_params(rsa) == NULL)
if (!OSSL_PARAM_set_utf8_string(p, RSA_DEFAULT_MD))
return 0;
return 1;
}
static const OSSL_PARAM rsa_params[] = {
OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS, NULL),
OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS, NULL),
OSSL_PARAM_int(OSSL_PKEY_PARAM_MAX_SIZE, NULL),
OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_DEFAULT_DIGEST, NULL, 0),
OSSL_PARAM_END
};
static const OSSL_PARAM *rsa_gettable_params(void)
{
return rsa_params;
}
static int rsa_validate(void *keydata, int selection)
{
RSA *rsa = keydata;
int ok = 0;
if ((selection & RSA_POSSIBLE_SELECTIONS) != 0)
ok = 1;
/* If the whole key is selected, we do a pairwise validation */
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR)
== OSSL_KEYMGMT_SELECT_KEYPAIR) {
ok = ok && rsa_validate_pairwise(rsa);
} else {
if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)
ok = ok && rsa_validate_private(rsa);
if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0)
ok = ok && rsa_validate_public(rsa);
}
return ok;
}
const OSSL_DISPATCH rsa_keymgmt_functions[] = {
{ OSSL_FUNC_KEYMGMT_IMPORTKEY, (void (*)(void))rsa_importkey },
{ OSSL_FUNC_KEYMGMT_IMPORTKEY_TYPES, (void (*)(void))rsa_importkey_types },
{ OSSL_FUNC_KEYMGMT_EXPORTKEY, (void (*)(void))rsa_exportkey },
{ OSSL_FUNC_KEYMGMT_EXPORTKEY_TYPES, (void (*)(void))rsa_exportkey_types },
{ OSSL_FUNC_KEYMGMT_FREEKEY, (void (*)(void))RSA_free },
{ OSSL_FUNC_KEYMGMT_GET_KEY_PARAMS, (void (*) (void))rsa_get_key_params },
{ OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))rsa_newdata },
{ OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))rsa_freedata },
{ OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*) (void))rsa_get_params },
{ OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*) (void))rsa_gettable_params },
{ OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))rsa_has },
{ OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))rsa_validate },
{ OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))rsa_import },
{ OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))rsa_import_types },
{ OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))rsa_export },
{ OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))rsa_export_types },
{ 0, NULL }
};