summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPauli <ppzgs1@gmail.com>2021-02-09 16:58:38 +1000
committerPauli <ppzgs1@gmail.com>2021-02-12 12:28:55 +1000
commit2b248f4e3f53b97a745865a7f9e3984bb7acee17 (patch)
tree3822a6d7374460efe84638522327802eb3d85a33
parentca2c778c26d488bd923121d7e4718b580fd283f2 (diff)
downloadopenssl-new-2b248f4e3f53b97a745865a7f9e3984bb7acee17.tar.gz
test: add import and export key management hooks for the TLS provider.
Without these hooks, if the TLS provider isn't matched in the fetch cache, a test failure will occur in the TLS API tests. Without allowing import and export, an existing key can not move to a new key manager even if it is really the same. Reviewed-by: Shane Lontis <shane.lontis@oracle.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/14126)
-rw-r--r--test/tls-provider.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/test/tls-provider.c b/test/tls-provider.c
index 184b926881..64c855f4a9 100644
--- a/test/tls-provider.c
+++ b/test/tls-provider.c
@@ -15,6 +15,11 @@
/* For TLS1_3_VERSION */
#include <openssl/ssl.h>
+static OSSL_FUNC_keymgmt_import_fn xor_import;
+static OSSL_FUNC_keymgmt_import_types_fn xor_import_types;
+static OSSL_FUNC_keymgmt_export_fn xor_export;
+static OSSL_FUNC_keymgmt_export_types_fn xor_export_types;
+
int tls_provider_init(const OSSL_CORE_HANDLE *handle,
const OSSL_DISPATCH *in,
const OSSL_DISPATCH **out,
@@ -600,6 +605,82 @@ static void *xor_gen(void *genctx, OSSL_CALLBACK *osslcb, void *cbarg)
return key;
}
+/* IMPORT + EXPORT */
+
+static int xor_import(void *vkey, int select, const OSSL_PARAM params[])
+{
+ XORKEY *key = vkey;
+ const OSSL_PARAM *param_priv_key, *param_pub_key;
+ unsigned char privkey[XOR_KEY_SIZE];
+ unsigned char pubkey[XOR_KEY_SIZE];
+ void *pprivkey = privkey, *ppubkey = pubkey;
+ size_t priv_len = 0, pub_len = 0;
+ int res = 0;
+
+ if (key == NULL || (select & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0)
+ return 0;
+
+ memset(privkey, 0, sizeof(privkey));
+ memset(pubkey, 0, sizeof(pubkey));
+ param_priv_key = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PRIV_KEY);
+ param_pub_key = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PUB_KEY);
+
+ if ((param_priv_key != NULL
+ && !OSSL_PARAM_get_octet_string(param_priv_key, &pprivkey,
+ sizeof(privkey), &priv_len))
+ || (param_pub_key != NULL
+ && !OSSL_PARAM_get_octet_string(param_pub_key, &ppubkey,
+ sizeof(pubkey), &pub_len)))
+ goto err;
+
+ if (priv_len > 0) {
+ memcpy(key->privkey, privkey, priv_len);
+ key->hasprivkey = 1;
+ }
+ if (pub_len > 0) {
+ memcpy(key->pubkey, pubkey, pub_len);
+ key->haspubkey = 1;
+ }
+ res = 1;
+ err:
+ return res;
+}
+
+static int xor_export(void *vkey, int select, OSSL_CALLBACK *param_cb,
+ void *cbarg)
+{
+ XORKEY *key = vkey;
+ OSSL_PARAM params[3], *p = params;
+
+ if (key == NULL || (select & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0)
+ return 0;
+
+ *p++ = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
+ key->privkey,
+ sizeof(key->privkey));
+ *p++ = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
+ key->pubkey, sizeof(key->pubkey));
+ *p++ = OSSL_PARAM_construct_end();
+
+ return param_cb(params, cbarg);
+}
+
+static const OSSL_PARAM xor_key_types[] = {
+ OSSL_PARAM_BN(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0),
+ OSSL_PARAM_BN(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0),
+ OSSL_PARAM_END
+};
+
+static const OSSL_PARAM *xor_import_types(int select)
+{
+ return (select & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0 ? xor_key_types : NULL;
+}
+
+static const OSSL_PARAM *xor_export_types(int select)
+{
+ return (select & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0 ? xor_key_types : NULL;
+}
+
static void xor_gen_cleanup(void *genctx)
{
OPENSSL_free(genctx);
@@ -620,6 +701,10 @@ static const OSSL_DISPATCH xor_keymgmt_functions[] = {
{ OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))xor_has },
{ OSSL_FUNC_KEYMGMT_COPY, (void (*)(void))xor_copy },
{ OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))xor_freedata },
+ { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))xor_import },
+ { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))xor_import_types },
+ { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))xor_export },
+ { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))xor_export_types },
{ 0, NULL }
};