GNUTLS_PKCS11_OBJ_FLAG_CRT = (1<<18),
GNUTLS_PKCS11_OBJ_FLAG_WITH_PRIVKEY = (1<<19),
GNUTLS_PKCS11_OBJ_FLAG_PUBKEY = (1<<20),
- GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY = (1<<21),
+ GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY = (1<<21)
+ /* flags 1<<29 and later are reserved - see pkcs11_int.h */
} gnutls_pkcs11_obj_flags;
#define gnutls_pkcs11_obj_attr_t gnutls_pkcs11_obj_flags
_gnutls_token_data = userdata;
}
-int pkcs11_url_to_info(const char *url, struct p11_kit_uri **info)
+int pkcs11_url_to_info(const char *url, struct p11_kit_uri **info, unsigned flags)
{
int allocated = 0;
int ret;
GNUTLS_E_MEMORY_ERROR : GNUTLS_E_PARSING_ERROR;
}
+ /* check for incomplete URIs */
+ if (p11_kit_uri_get_attribute (*info, CKA_CLASS) == NULL) {
+ struct ck_attribute at;
+ ck_object_class_t klass;
+
+ if (flags & GNUTLS_PKCS11_OBJ_FLAG_EXPECT_CERT) {
+ klass = CKO_CERTIFICATE;
+ at.type = CKA_CLASS;
+ at.value = &klass;
+ at.value_len = sizeof (klass);
+ p11_kit_uri_set_attribute (*info, &at);
+ } else if (flags & GNUTLS_PKCS11_OBJ_FLAG_EXPECT_PRIVKEY) {
+ klass = CKO_PRIVATE_KEY;
+ at.type = CKA_CLASS;
+ at.value = &klass;
+ at.value_len = sizeof (klass);
+ p11_kit_uri_set_attribute (*info, &at);
+ }
+ }
+
return 0;
}
/* fill in the find data structure */
find_data.obj = obj;
- ret = pkcs11_url_to_info(url, &obj->info);
+ ret = pkcs11_url_to_info(url, &obj->info, flags);
if (ret < 0) {
gnutls_assert();
return ret;
PKCS11_CHECK_INIT;
- ret = pkcs11_url_to_info(url, &info);
+ ret = pkcs11_url_to_info(url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
url = "pkcs11:";
}
- ret = pkcs11_url_to_info(url, &priv.info);
+ ret = pkcs11_url_to_info(url, &priv.info, flags);
if (ret < 0) {
gnutls_assert();
return ret;
url = "pkcs11:";
}
- ret = pkcs11_url_to_info(url, &priv.info);
+ ret = pkcs11_url_to_info(url, &priv.info, flags);
if (ret < 0) {
gnutls_assert();
return ret;
gnutls_pkcs11_obj_set_pin_function(pcrt, crt->pin.cb,
crt->pin.data);
- ret = gnutls_pkcs11_obj_import_url(pcrt, url, flags);
+ ret = gnutls_pkcs11_obj_import_url(pcrt, url, flags|GNUTLS_PKCS11_OBJ_FLAG_EXPECT_CERT);
if (ret < 0) {
gnutls_assert();
goto cleanup;
PKCS11_CHECK_INIT;
memset(&find_data, 0, sizeof(find_data));
- ret = pkcs11_url_to_info(url, &find_data.info);
+ ret = pkcs11_url_to_info(url, &find_data.info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
PKCS11_CHECK_INIT;
- ret = pkcs11_url_to_info(url, &info);
+ ret = pkcs11_url_to_info(url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
url = "pkcs11:";
}
- ret = pkcs11_url_to_info(url, &info);
+ ret = pkcs11_url_to_info(url, &info, flags);
if (ret < 0) {
gnutls_assert();
return ret;
url = "pkcs11:";
}
- ret = pkcs11_url_to_info(url, &info);
+ ret = pkcs11_url_to_info(url, &info, flags);
if (ret < 0) {
gnutls_assert();
return ret;
url = "pkcs11:";
}
- ret = pkcs11_url_to_info(url, &info);
+ ret = pkcs11_url_to_info(url, &info, 0);
if (ret < 0) {
gnutls_assert();
return 0;
void *input);
int pkcs11_rv_to_err(ck_rv_t rv);
-int pkcs11_url_to_info(const char *url, struct p11_kit_uri **info);
+int pkcs11_url_to_info(const char *url, struct p11_kit_uri **info, unsigned flags);
int
pkcs11_find_slot(struct ck_function_list **module, ck_slot_id_t * slot,
struct p11_kit_uri *info, struct ck_token_info *_tinfo,
unsigned int flags);
ck_object_class_t pkcs11_strtype_to_class(const char *type);
+/* Additional internal flags for gnutls_pkcs11_obj_flags */
+/* @GNUTLS_PKCS11_OBJ_FLAG_EXPECT_CERT: When importing an object, provide a hint on the type, to allow incomplete URLs
+ * @GNUTLS_PKCS11_OBJ_FLAG_EXPECT_PRIVKEY: Hint for private key */
+#define GNUTLS_PKCS11_OBJ_FLAG_EXPECT_CERT (1<<29)
+#define GNUTLS_PKCS11_OBJ_FLAG_EXPECT_PRIVKEY (1<<30)
+
int pkcs11_token_matches_info(struct p11_kit_uri *info,
struct ck_token_info *tinfo,
struct ck_info *lib_info);
if (pkey->url == NULL)
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
- ret = pkcs11_url_to_info(pkey->url, &pkey->uinfo);
+ ret = pkcs11_url_to_info(pkey->url, &pkey->uinfo, flags|GNUTLS_PKCS11_OBJ_FLAG_EXPECT_PRIVKEY);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&sinfo, 0, sizeof(sinfo));
- ret = pkcs11_url_to_info(url, &info);
+ ret = pkcs11_url_to_info(url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&sinfo, 0, sizeof(sinfo));
- ret = pkcs11_url_to_info(token_url, &info);
+ ret = pkcs11_url_to_info(token_url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&sinfo, 0, sizeof(sinfo));
- ret = pkcs11_url_to_info(token_url, &info);
+ ret = pkcs11_url_to_info(token_url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&sinfo, 0, sizeof(sinfo));
- ret = pkcs11_url_to_info(token_url, &info);
+ ret = pkcs11_url_to_info(token_url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&exp1, 0, sizeof(exp1));
memset(&exp2, 0, sizeof(exp2));
- ret = pkcs11_url_to_info(token_url, &info);
+ ret = pkcs11_url_to_info(token_url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&find_data, 0, sizeof(find_data));
- ret = pkcs11_url_to_info(object_url, &find_data.info);
+ ret = pkcs11_url_to_info(object_url, &find_data.info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
PKCS11_CHECK_INIT;
- ret = pkcs11_url_to_info(token_url, &info);
+ ret = pkcs11_url_to_info(token_url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&sinfo, 0, sizeof(sinfo));
- ret = pkcs11_url_to_info(token_url, &info);
+ ret = pkcs11_url_to_info(token_url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;
memset(&sinfo, 0, sizeof(sinfo));
- ret = pkcs11_url_to_info(token_url, &info);
+ ret = pkcs11_url_to_info(token_url, &info, 0);
if (ret < 0) {
gnutls_assert();
return ret;