|
 |
68d1ae6 |
From 4935de246254df236caf8487d15028d05ad88d94 Mon Sep 17 00:00:00 2001
|
|
 |
68d1ae6 |
From: Per Nilsson <per.nilsson@yubico.com>
|
|
 |
68d1ae6 |
Date: Fri, 27 Jan 2023 10:09:11 +0100
|
|
 |
68d1ae6 |
Subject: [PATCH] Fix type of id (#312)
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
---
|
|
 |
68d1ae6 |
pkcs11/util_pkcs11.c | 17 ++++-------------
|
|
 |
68d1ae6 |
pkcs11/util_pkcs11.h | 4 ++--
|
|
 |
68d1ae6 |
pkcs11/yubihsm_pkcs11.c | 24 ++++++++----------------
|
|
 |
68d1ae6 |
3 files changed, 14 insertions(+), 31 deletions(-)
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
diff --git a/pkcs11/util_pkcs11.c b/pkcs11/util_pkcs11.c
|
|
 |
68d1ae6 |
index 5834a5bd..db5f83ca 100644
|
|
 |
68d1ae6 |
--- a/pkcs11/util_pkcs11.c
|
|
 |
68d1ae6 |
+++ b/pkcs11/util_pkcs11.c
|
|
 |
68d1ae6 |
@@ -4294,7 +4294,7 @@ CK_RV parse_hmac_template(CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
CK_RV parse_meta_id_template(pkcs11_meta_object *pkcs11meta, bool pubkey,
|
|
 |
68d1ae6 |
- int *id, uint8_t *value, size_t value_len) {
|
|
 |
68d1ae6 |
+ uint16_t *id, uint8_t *value, size_t value_len) {
|
|
 |
68d1ae6 |
if (value_len != 2) {
|
|
 |
68d1ae6 |
if (pubkey) {
|
|
 |
68d1ae6 |
pkcs11meta->cka_id_pubkey.len = value_len;
|
|
 |
68d1ae6 |
@@ -4307,10 +4307,6 @@ CK_RV parse_meta_id_template(pkcs11_meta_object *pkcs11meta, bool pubkey,
|
|
 |
68d1ae6 |
} else {
|
|
 |
68d1ae6 |
if (!pubkey) {
|
|
 |
68d1ae6 |
*id = parse_id_value(value, value_len);
|
|
 |
68d1ae6 |
- if (*id == -1) {
|
|
 |
68d1ae6 |
- DBG_ERR("CKA_ID invalid in template");
|
|
 |
68d1ae6 |
- return CKR_ATTRIBUTE_VALUE_INVALID;
|
|
 |
68d1ae6 |
- }
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
@@ -4343,7 +4339,6 @@ CK_RV parse_rsa_generate_template(CK_ATTRIBUTE_PTR pPublicKeyTemplate,
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
uint8_t *e = NULL;
|
|
 |
68d1ae6 |
CK_RV rv;
|
|
 |
68d1ae6 |
- int id = 0;
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
memset(template->label, 0, sizeof(template->label));
|
|
 |
68d1ae6 |
for (CK_ULONG i = 0; i < ulPublicKeyAttributeCount; i++) {
|
|
 |
68d1ae6 |
@@ -4482,14 +4477,13 @@ CK_RV parse_rsa_generate_template(CK_ATTRIBUTE_PTR pPublicKeyTemplate,
|
|
 |
68d1ae6 |
break;
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
case CKA_ID: {
|
|
 |
68d1ae6 |
- rv = parse_meta_id_template(pkcs11meta, false, &id,
|
|
 |
68d1ae6 |
+ rv = parse_meta_id_template(pkcs11meta, false, &template->id,
|
|
 |
68d1ae6 |
pPrivateKeyTemplate[i].pValue,
|
|
 |
68d1ae6 |
pPrivateKeyTemplate[i].ulValueLen);
|
|
 |
68d1ae6 |
if (rv != CKR_OK) {
|
|
 |
68d1ae6 |
DBG_ERR("Failed to parse CKA_ID in PrivateKeyTemplate");
|
|
 |
68d1ae6 |
return rv;
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
- template->id = id;
|
|
 |
68d1ae6 |
} break;
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
case CKA_DECRYPT:
|
|
 |
68d1ae6 |
@@ -4572,7 +4566,7 @@ CK_RV parse_rsa_generate_template(CK_ATTRIBUTE_PTR pPublicKeyTemplate,
|
|
 |
68d1ae6 |
return CKR_OK;
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
-int parse_id_value(void *value, CK_ULONG len) {
|
|
 |
68d1ae6 |
+uint16_t parse_id_value(void *value, CK_ULONG len) {
|
|
 |
68d1ae6 |
switch (len) {
|
|
 |
68d1ae6 |
case 0:
|
|
 |
68d1ae6 |
return 0;
|
|
 |
68d1ae6 |
@@ -4596,7 +4590,6 @@ CK_RV parse_ec_generate_template(CK_ATTRIBUTE_PTR pPublicKeyTemplate,
|
|
 |
68d1ae6 |
uint8_t *ecparams = NULL;
|
|
 |
68d1ae6 |
uint16_t ecparams_len = 0;
|
|
 |
68d1ae6 |
CK_RV rv;
|
|
 |
68d1ae6 |
- int id;
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
memset(template->label, 0, sizeof(template->label));
|
|
 |
68d1ae6 |
for (CK_ULONG i = 0; i < ulPublicKeyAttributeCount; i++) {
|
|
 |
68d1ae6 |
@@ -4701,15 +4694,13 @@ CK_RV parse_ec_generate_template(CK_ATTRIBUTE_PTR pPublicKeyTemplate,
|
|
 |
68d1ae6 |
break;
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
case CKA_ID: {
|
|
 |
68d1ae6 |
- rv = parse_meta_id_template(pkcs11meta, false, &id,
|
|
 |
68d1ae6 |
+ rv = parse_meta_id_template(pkcs11meta, false, &template->id,
|
|
 |
68d1ae6 |
pPrivateKeyTemplate[i].pValue,
|
|
 |
68d1ae6 |
pPrivateKeyTemplate[i].ulValueLen);
|
|
 |
68d1ae6 |
if (rv != CKR_OK) {
|
|
 |
68d1ae6 |
DBG_ERR("Failed to parse CKA_ID in PrivateKeyTemplate");
|
|
 |
68d1ae6 |
return rv;
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
- template->id = id;
|
|
 |
68d1ae6 |
-
|
|
 |
68d1ae6 |
} break;
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
case CKA_SIGN:
|
|
 |
68d1ae6 |
diff --git a/pkcs11/util_pkcs11.h b/pkcs11/util_pkcs11.h
|
|
 |
68d1ae6 |
index d8026e57..5a91ee34 100644
|
|
 |
68d1ae6 |
--- a/pkcs11/util_pkcs11.h
|
|
 |
68d1ae6 |
+++ b/pkcs11/util_pkcs11.h
|
|
 |
68d1ae6 |
@@ -151,7 +151,7 @@ CK_RV parse_ec_generate_template(CK_ATTRIBUTE_PTR pPublicKeyTemplate,
|
|
 |
68d1ae6 |
yubihsm_pkcs11_object_template *template,
|
|
 |
68d1ae6 |
pkcs11_meta_object *pkcs11meta);
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
-int parse_id_value(void *value, CK_ULONG len);
|
|
 |
68d1ae6 |
+uint16_t parse_id_value(void *value, CK_ULONG len);
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
CK_RV populate_template(int type, void *object, CK_ATTRIBUTE_PTR pTemplate,
|
|
 |
68d1ae6 |
CK_ULONG ulCount, yubihsm_pkcs11_session *session);
|
|
 |
68d1ae6 |
@@ -176,7 +176,7 @@ bool match_meta_attributes(yubihsm_pkcs11_session *session,
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
bool is_meta_object(yh_object_descriptor *object);
|
|
 |
68d1ae6 |
CK_RV parse_meta_id_template(pkcs11_meta_object *pkcs11meta, bool public,
|
|
 |
68d1ae6 |
- int *id, uint8_t *value, size_t value_len);
|
|
 |
68d1ae6 |
+ uint16_t *id, uint8_t *value, size_t value_len);
|
|
 |
68d1ae6 |
void parse_meta_label_template(yubihsm_pkcs11_object_template *template,
|
|
 |
68d1ae6 |
pkcs11_meta_object *pkcs11meta, bool public,
|
|
 |
68d1ae6 |
uint8_t *value, size_t value_len);
|
|
 |
68d1ae6 |
diff --git a/pkcs11/yubihsm_pkcs11.c b/pkcs11/yubihsm_pkcs11.c
|
|
 |
68d1ae6 |
index 48b3bf46..6f715e01 100644
|
|
 |
68d1ae6 |
--- a/pkcs11/yubihsm_pkcs11.c
|
|
 |
68d1ae6 |
+++ b/pkcs11/yubihsm_pkcs11.c
|
|
 |
68d1ae6 |
@@ -1383,10 +1383,6 @@ CK_DEFINE_FUNCTION(CK_RV, C_CreateObject)
|
|
 |
68d1ae6 |
id.d = 0;
|
|
 |
68d1ae6 |
} else {
|
|
 |
68d1ae6 |
id.d = parse_id_value(pTemplate[i].pValue, pTemplate[i].ulValueLen);
|
|
 |
68d1ae6 |
- if (id.d == (CK_ULONG) -1) {
|
|
 |
68d1ae6 |
- rv = CKR_ATTRIBUTE_VALUE_INVALID;
|
|
 |
68d1ae6 |
- goto c_co_out;
|
|
 |
68d1ae6 |
- }
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
id.set = true;
|
|
 |
68d1ae6 |
} else {
|
|
 |
68d1ae6 |
@@ -2200,7 +2196,7 @@ CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
} else {
|
|
 |
68d1ae6 |
- int new_id =
|
|
 |
68d1ae6 |
+ uint16_t new_id =
|
|
 |
68d1ae6 |
parse_id_value(pTemplate[i].pValue, pTemplate[i].ulValueLen);
|
|
 |
68d1ae6 |
if (pTemplate[i].ulValueLen != 2 || new_id != object->object.id) {
|
|
 |
68d1ae6 |
if (object->object.type == YH_PUBLIC_KEY) {
|
|
 |
68d1ae6 |
@@ -2360,7 +2356,6 @@ CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
yh_rc rc = YHR_SUCCESS;
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
- int id = 0;
|
|
 |
68d1ae6 |
uint8_t type = 0;
|
|
 |
68d1ae6 |
uint16_t domains = 0;
|
|
 |
68d1ae6 |
yh_capabilities capabilities = {{0}};
|
|
 |
68d1ae6 |
@@ -2527,7 +2522,7 @@ CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)
|
|
 |
68d1ae6 |
yh_object_descriptor
|
|
 |
68d1ae6 |
tmp_objects[YH_MAX_ITEMS_COUNT + MAX_ECDH_SESSION_KEYS] = {0};
|
|
 |
68d1ae6 |
size_t tmp_n_objects = YH_MAX_ITEMS_COUNT + MAX_ECDH_SESSION_KEYS;
|
|
 |
68d1ae6 |
- rc = yh_util_list_objects(session->slot->device_session, id, 0, domains,
|
|
 |
68d1ae6 |
+ rc = yh_util_list_objects(session->slot->device_session, 0, 0, domains,
|
|
 |
68d1ae6 |
&capabilities, algorithm, label, tmp_objects,
|
|
 |
68d1ae6 |
&tmp_n_objects);
|
|
 |
68d1ae6 |
if (rc != YHR_SUCCESS) {
|
|
 |
68d1ae6 |
@@ -2563,7 +2558,7 @@ CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)
|
|
 |
68d1ae6 |
} else {
|
|
 |
68d1ae6 |
yh_object_descriptor tmp_objects[YH_MAX_ITEMS_COUNT] = {0};
|
|
 |
68d1ae6 |
size_t tmp_n_objects = sizeof(tmp_objects);
|
|
 |
68d1ae6 |
- rc = yh_util_list_objects(session->slot->device_session, id,
|
|
 |
68d1ae6 |
+ rc = yh_util_list_objects(session->slot->device_session, 0,
|
|
 |
68d1ae6 |
YH_OPAQUE, domains, &capabilities,
|
|
 |
68d1ae6 |
YH_ALGO_OPAQUE_X509_CERTIFICATE, label,
|
|
 |
68d1ae6 |
tmp_objects, &tmp_n_objects);
|
|
 |
68d1ae6 |
@@ -2599,7 +2594,7 @@ CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)
|
|
 |
68d1ae6 |
yh_object_descriptor
|
|
 |
68d1ae6 |
tmp_objects[YH_MAX_ITEMS_COUNT + MAX_ECDH_SESSION_KEYS] = {0};
|
|
 |
68d1ae6 |
size_t tmp_n_objects = YH_MAX_ITEMS_COUNT + MAX_ECDH_SESSION_KEYS;
|
|
 |
68d1ae6 |
- rc = yh_util_list_objects(session->slot->device_session, id, type,
|
|
 |
68d1ae6 |
+ rc = yh_util_list_objects(session->slot->device_session, 0, type,
|
|
 |
68d1ae6 |
domains, &capabilities, algorithm, label,
|
|
 |
68d1ae6 |
tmp_objects, &tmp_n_objects);
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
@@ -2636,12 +2631,7 @@ CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
- id = parse_id_value(template_id, template_id_len);
|
|
 |
68d1ae6 |
- if (id == -1) {
|
|
 |
68d1ae6 |
- DBG_ERR("Failed to parse ID from template");
|
|
 |
68d1ae6 |
- rv = CKR_ATTRIBUTE_VALUE_INVALID;
|
|
 |
68d1ae6 |
- goto c_foi_out;
|
|
 |
68d1ae6 |
- }
|
|
 |
68d1ae6 |
+ uint16_t id = parse_id_value(template_id, template_id_len);
|
|
 |
68d1ae6 |
DBG_INFO("id parsed as %x", id);
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
if (ulCount == 0 ||
|
|
 |
68d1ae6 |
@@ -4948,12 +4938,14 @@ CK_DEFINE_FUNCTION(CK_RV, C_GenerateKey)
|
|
 |
68d1ae6 |
|
|
 |
68d1ae6 |
case CKA_ID:
|
|
 |
68d1ae6 |
if (id.set == false) {
|
|
 |
68d1ae6 |
- rv = parse_meta_id_template(&meta_object, FALSE, (int *) &id.d,
|
|
 |
68d1ae6 |
+ uint16_t d;
|
|
 |
68d1ae6 |
+ rv = parse_meta_id_template(&meta_object, FALSE, &d,
|
|
 |
68d1ae6 |
pTemplate[i].pValue,
|
|
 |
68d1ae6 |
pTemplate[i].ulValueLen);
|
|
 |
68d1ae6 |
if (rv != CKR_OK) {
|
|
 |
68d1ae6 |
goto c_gk_out;
|
|
 |
68d1ae6 |
}
|
|
 |
68d1ae6 |
+ id.d = d;
|
|
 |
68d1ae6 |
id.set = true;
|
|
 |
68d1ae6 |
} else {
|
|
 |
68d1ae6 |
rv = CKR_TEMPLATE_INCONSISTENT;
|
|
 |
68d1ae6 |
|
|
 |
7702129 |
diff --git a/pkcs11/util_pkcs11.c b/pkcs11/util_pkcs11.c
|
|
 |
7702129 |
index db5f83c..caa467f 100644
|
|
 |
7702129 |
--- a/pkcs11/util_pkcs11.c
|
|
 |
7702129 |
+++ b/pkcs11/util_pkcs11.c
|
|
 |
7702129 |
@@ -2720,7 +2720,7 @@ static CK_RV perform_aes_update(yh_session *session,
|
|
 |
7702129 |
return rv;
|
|
 |
7702129 |
}
|
|
 |
7702129 |
|
|
 |
7702129 |
- DBG_INFO("Returning %lu bytes (buffered %lu bytes)", size, next);
|
|
 |
7702129 |
+ DBG_INFO("Returning %zu bytes (buffered %zu bytes)", size, next);
|
|
 |
7702129 |
*out_len = size;
|
|
 |
7702129 |
|
|
 |
7702129 |
return CKR_OK;
|