#include <x509/x509_int.h>
/* Part of PKCS#11 3.0 interface, which was added in p11-kit 0.23.14 */
-#ifdef CKM_EDDSA
-#define HAVE_CKM_EDDSA
+#if defined(CKM_EDDSA) && defined(CKM_EC_EDWARDS_KEY_PAIR_GEN)
+#define HAVE_PKCS11_EDDSA
#endif
#define PKCS11_ID_SIZE 128
return CKM_RSA_PKCS;
else if (pk == GNUTLS_PK_RSA_PSS)
return CKM_RSA_PKCS_PSS;
-#ifdef HAVE_CKM_EDDSA
+#ifdef HAVE_PKCS11_EDDSA
else if (pk == GNUTLS_PK_EDDSA_ED25519)
return CKM_EDDSA;
#endif
return CKK_ECDSA;
else if (pk == GNUTLS_PK_RSA_PSS || pk == GNUTLS_PK_RSA)
return CKK_RSA;
-#ifdef HAVE_CKM_EDDSA
+#ifdef HAVE_PKCS11_EDDSA
else if (pk == GNUTLS_PK_EDDSA_ED25519)
return CKK_EC_EDWARDS;
#endif
return GNUTLS_PK_DSA;
else if (m == CKK_ECDSA)
return GNUTLS_PK_EC;
-#ifdef HAVE_CKM_EDDSA
+#ifdef HAVE_PKCS11_EDDSA
else if (m == CKK_EC_EDWARDS)
return GNUTLS_PK_EDDSA_ED25519;
#endif
} else if (pk == GNUTLS_PK_RSA_PSS || pk == GNUTLS_PK_RSA) {
*type = CKK_RSA;
return CKM_RSA_PKCS_KEY_PAIR_GEN;
-#ifdef HAVE_CKM_EDDSA
+#ifdef HAVE_PKCS11_EDDSA
} else if (pk == GNUTLS_PK_EDDSA_ED25519) {
*type = CKK_EC_EDWARDS;
- return CKM_EDDSA;
+ return CKM_EC_EDWARDS_KEY_PAIR_GEN;
#endif
} else {
*type = -1;
#include <gnutls/x509.h>
#include <gnutls/abstract.h>
#include <gnutls/pkcs11.h>
+#include <p11-kit/pkcs11.h>
#ifdef _WIN32
exit(1);
}
+ success("generated RSA key\n");
+
assert(gnutls_pkcs11_obj_init(&obj) >= 0);
assert(out.size > 0);
exit(1);
}
+ success("generated RSA key (non-sensitive)\n");
+
assert(gnutls_pkcs11_obj_init(&obj) >= 0);
assert(out.size > 0);
gnutls_free(out.data);
gnutls_pkcs11_obj_deinit(obj);
+#ifdef CKM_EC_EDWARDS_KEY_PAIR_GEN
+ ret = gnutls_pkcs11_token_check_mechanism(
+ "pkcs11:token=test", CKM_EC_EDWARDS_KEY_PAIR_GEN, NULL, 0, 0);
+ if (ret != 0) {
+ ret = gnutls_pkcs11_privkey_generate3(
+ "pkcs11:token=test", GNUTLS_PK_EDDSA_ED25519, 256,
+ "testkey-ed25519", NULL, GNUTLS_X509_FMT_DER, &out, 0,
+ GNUTLS_PKCS11_OBJ_FLAG_LOGIN);
+ if (ret < 0) {
+ fail("%d: %s\n", ret, gnutls_strerror(ret));
+ exit(1);
+ }
+
+ success("generated Ed25519 key\n");
+
+ assert(gnutls_pkcs11_obj_init(&obj) >= 0);
+ assert(out.size > 0);
+
+ gnutls_pkcs11_obj_set_pin_function(obj, pin_func, NULL);
+ assert(gnutls_pkcs11_obj_import_url(
+ obj,
+ "pkcs11:token=test;object=testkey-ed25519;type=private",
+ GNUTLS_PKCS11_OBJ_FLAG_LOGIN) >= 0);
+
+ assert(gnutls_pkcs11_obj_get_flags(obj, &flags) >= 0);
+
+ assert(!(flags & GNUTLS_PKCS11_OBJ_FLAG_MARK_NOT_SENSITIVE));
+ assert(flags & GNUTLS_PKCS11_OBJ_FLAG_MARK_SENSITIVE);
+
+ gnutls_free(out.data);
+ gnutls_pkcs11_obj_deinit(obj);
+ }
+#endif
+
gnutls_pkcs11_deinit();
gnutls_global_deinit();
remove(CONFIG);