mirror of
https://github.com/openssl/openssl.git
synced 2025-02-23 14:42:15 +08:00
OSSL_provider_init() gets another output parameter, holding a pointer to a provider side context. It's entirely up to the provider to define the context and what it's being used for. This pointer is passed back to other provider functions, typically the provider global get_params and set_params functions, and also the diverse algorithm context creators, and of course, the teardown function. With this, a provider can be instantiated more than once, or be re-loaded as the case may be, while maintaining instance state. Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/8848)
101 lines
3.0 KiB
C
101 lines
3.0 KiB
C
/*
|
|
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
|
*
|
|
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
|
* this file except in compliance with the License. You can obtain a copy
|
|
* in the file LICENSE in the source distribution or at
|
|
* https://www.openssl.org/source/license.html
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <openssl/core.h>
|
|
#include <openssl/core_numbers.h>
|
|
#include <openssl/core_names.h>
|
|
#include <openssl/params.h>
|
|
|
|
/* Functions provided by the core */
|
|
static OSSL_core_get_param_types_fn *c_get_param_types = NULL;
|
|
static OSSL_core_get_params_fn *c_get_params = NULL;
|
|
|
|
/* Parameters we provide to the core */
|
|
static const OSSL_ITEM fips_param_types[] = {
|
|
{ OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_NAME },
|
|
{ OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_VERSION },
|
|
{ OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_BUILDINFO },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const OSSL_ITEM *fips_get_param_types(const OSSL_PROVIDER *prov)
|
|
{
|
|
return fips_param_types;
|
|
}
|
|
|
|
static int fips_get_params(const OSSL_PROVIDER *prov,
|
|
const OSSL_PARAM params[])
|
|
{
|
|
const OSSL_PARAM *p;
|
|
|
|
p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
|
|
if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL FIPS Provider"))
|
|
return 0;
|
|
p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION);
|
|
if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR))
|
|
return 0;
|
|
p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO);
|
|
if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_FULL_VERSION_STR))
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
extern const OSSL_DISPATCH sha256_functions[];
|
|
|
|
static const OSSL_ALGORITHM fips_digests[] = {
|
|
{ "SHA256", "fips=yes", sha256_functions },
|
|
{ NULL, NULL, NULL }
|
|
};
|
|
|
|
static const OSSL_ALGORITHM *fips_query(OSSL_PROVIDER *prov,
|
|
int operation_id,
|
|
int *no_cache)
|
|
{
|
|
*no_cache = 0;
|
|
switch (operation_id) {
|
|
case OSSL_OP_DIGEST:
|
|
return fips_digests;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/* Functions we provide to the core */
|
|
static const OSSL_DISPATCH fips_dispatch_table[] = {
|
|
{ OSSL_FUNC_PROVIDER_GET_PARAM_TYPES, (void (*)(void))fips_get_param_types },
|
|
{ OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))fips_get_params },
|
|
{ OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))fips_query },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
int OSSL_provider_init(const OSSL_PROVIDER *provider,
|
|
const OSSL_DISPATCH *in,
|
|
const OSSL_DISPATCH **out,
|
|
void **provctx)
|
|
{
|
|
for (; in->function_id != 0; in++) {
|
|
switch (in->function_id) {
|
|
case OSSL_FUNC_CORE_GET_PARAM_TYPES:
|
|
c_get_param_types = OSSL_get_core_get_param_types(in);
|
|
break;
|
|
case OSSL_FUNC_CORE_GET_PARAMS:
|
|
c_get_params = OSSL_get_core_get_params(in);
|
|
break;
|
|
/* Just ignore anything we don't understand */
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
*out = fips_dispatch_table;
|
|
return 1;
|
|
}
|