#include <isc/crypto.h>
#include <isc/mem.h>
+#include <isc/ossl_wrap.h>
#include <isc/result.h>
#include <isc/safe.h>
#include <isc/string.h>
UNUSED(unused);
UNUSED(callback);
+ if (key->label != NULL) {
+ switch (key->key_alg) {
+ case DST_ALG_ED25519:
+ RETERR(isc_ossl_wrap_generate_pkcs11_ed25519_key(
+ key->label, &pkey));
+ break;
+#if HAVE_OPENSSL_ED448
+ case DST_ALG_ED448:
+ RETERR(isc_ossl_wrap_generate_pkcs11_ed448_key(
+ key->label, &pkey));
+ break;
+#endif /* HAVE_OPENSSL_ED448 */
+ default:
+ UNREACHABLE();
+ }
+ key->key_size = alginfo->key_size * 8;
+ key->keydata.pkeypair.priv = pkey;
+ key->keydata.pkeypair.pub = pkey;
+ return ISC_R_SUCCESS;
+ }
+
ctx = EVP_PKEY_CTX_new_id(alginfo->nid, NULL);
if (ctx == NULL) {
return dst__openssl_toresult2("EVP_PKEY_CTX_new_id",
* \li `uri != NULL` and is a NUL-terminated string
*/
+isc_result_t
+isc_ossl_wrap_generate_pkcs11_ed25519_key(char *uri, EVP_PKEY **pkeyp);
+/*%
+ * Generates an Ed25519 key using the PKCS#11 label specified at `uri`.
+ *
+ * Requires:
+ * \li pkeyp != NULL
+ * \li *pkeyp == NULL
+ * \li `uri != NULL` and is a NUL-terminated string
+ */
+
+isc_result_t
+isc_ossl_wrap_generate_pkcs11_ed448_key(char *uri, EVP_PKEY **pkeyp);
+/*%
+ * Generates an Ed448 key using the PKCS#11 label specified at `uri`.
+ *
+ * Requires:
+ * \li pkeyp != NULL
+ * \li *pkeyp == NULL
+ * \li `uri != NULL` and is a NUL-terminated string
+ */
+
isc_result_t
isc_ossl_wrap_load_p384_public_from_region(isc_region_t region,
EVP_PKEY **pkeyp);
isc_result_t
isc_ossl_wrap_generate_pkcs11_rsa_key(char *uri, size_t bit_size,
EVP_PKEY **pkeyp) {
+ REQUIRE(uri != NULL);
+ REQUIRE(pkeyp != NULL && *pkeyp == NULL);
+
+ UNUSED(uri);
+ UNUSED(bit_size);
+ UNUSED(pkeyp);
+ return ISC_R_NOTIMPLEMENTED;
+}
+
+isc_result_t
+isc_ossl_wrap_generate_pkcs11_ed25519_key(char *uri, EVP_PKEY **pkeyp) {
+ REQUIRE(uri != NULL);
+ REQUIRE(pkeyp != NULL && *pkeyp == NULL);
+
UNUSED(uri);
+ UNUSED(pkeyp);
+ return ISC_R_NOTIMPLEMENTED;
+}
+
+isc_result_t
+isc_ossl_wrap_generate_pkcs11_ed448_key(char *uri, EVP_PKEY **pkeyp) {
+ REQUIRE(uri != NULL);
+ REQUIRE(pkeyp != NULL && *pkeyp == NULL);
- return isc_ossl_wrap_generate_rsa_key(NULL, bit_size, pkeyp);
+ UNUSED(uri);
+ UNUSED(pkeyp);
+ return ISC_R_NOTIMPLEMENTED;
}
bool
return result;
}
+static isc_result_t
+generate_pkcs11_eddsa_key(char *uri, EVP_PKEY **pkeyp, const char *keytype) {
+ isc_result_t result;
+ EVP_PKEY_CTX *pctx = NULL;
+ size_t len;
+
+ INSIST(uri != NULL);
+ len = strlen(uri);
+
+ const OSSL_PARAM params[] = {
+ OSSL_PARAM_utf8_string("pkcs11_uri", uri, len),
+ OSSL_PARAM_utf8_string("pkcs11_key_usage", pkcs11_key_usage,
+ sizeof(pkcs11_key_usage) - 1),
+ OSSL_PARAM_END,
+ };
+
+ pctx = EVP_PKEY_CTX_new_from_name(NULL, keytype, "provider=pkcs11");
+ if (pctx == NULL) {
+ CLEANUP(OSSL_WRAP_ERROR("EVP_PKEY_CTX_new_from_name"));
+ }
+
+ if (EVP_PKEY_keygen_init(pctx) != 1) {
+ CLEANUP(OSSL_WRAP_ERROR("EVP_PKEY_keygen_init"));
+ }
+
+ if (EVP_PKEY_CTX_set_params(pctx, params) != 1) {
+ CLEANUP(OSSL_WRAP_ERROR("EVP_PKEY_CTX_set_params"));
+ }
+
+ if (EVP_PKEY_generate(pctx, pkeyp) != 1) {
+ CLEANUP(OSSL_WRAP_ERROR("EVP_PKEY_generate"));
+ }
+
+ result = ISC_R_SUCCESS;
+
+cleanup:
+ EVP_PKEY_CTX_free(pctx);
+ return result;
+}
+
+isc_result_t
+isc_ossl_wrap_generate_pkcs11_ed25519_key(char *uri, EVP_PKEY **pkeyp) {
+ REQUIRE(pkeyp != NULL && *pkeyp == NULL);
+ REQUIRE(uri != NULL);
+ return generate_pkcs11_eddsa_key(uri, pkeyp, "ED25519");
+}
+
+isc_result_t
+isc_ossl_wrap_generate_pkcs11_ed448_key(char *uri, EVP_PKEY **pkeyp) {
+ REQUIRE(pkeyp != NULL && *pkeyp == NULL);
+ REQUIRE(uri != NULL);
+ return generate_pkcs11_eddsa_key(uri, pkeyp, "ED448");
+}
+
static isc_result_t
validate_ec_pkey(EVP_PKEY *pkey, const OSSL_PARAM *const curve_params) {
isc_result_t result;
int status;
size_t len;
+ REQUIRE(uri != NULL);
+ REQUIRE(pkeyp != NULL && *pkeyp == NULL);
+
len = strlen(uri);
INSIST(len != 0);