Refined get attribute value.
This commit is contained in:
+47
-43
@@ -173,9 +173,10 @@ static void get_object_class(CK_OBJECT_HANDLE obj, CK_OBJECT_CLASS_PTR class) {
|
|||||||
*class = CKO_DATA; // TODO: other possibilities?
|
*class = CKO_DATA; // TODO: other possibilities?
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_object_label(CK_OBJECT_HANDLE obj, CK_UTF8CHAR_PTR label) {
|
/*static void get_object_label(CK_OBJECT_HANDLE obj, CK_UTF8CHAR_PTR label) {
|
||||||
strcpy((char *)label, objects[obj].name);
|
strcpy((char *)label, objects[obj].name);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Next two functions based off the code at
|
// Next two functions based off the code at
|
||||||
// https://github.com/m9aertner/oidConverter/blob/master/oid.c
|
// https://github.com/m9aertner/oidConverter/blob/master/oid.c
|
||||||
@@ -249,7 +250,7 @@ static void asn1_encode_oid(CK_CHAR_PTR oid, CK_BYTE_PTR asn1_oid, CK_ULONG_PTR
|
|||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_object_oid(CK_OBJECT_HANDLE obj, CK_UTF8CHAR_PTR oid) {
|
/*static void get_object_oid(CK_OBJECT_HANDLE obj, CK_UTF8CHAR_PTR oid) {
|
||||||
strcpy((char *)oid, objects[obj].oid);
|
strcpy((char *)oid, objects[obj].oid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,19 +262,21 @@ static void get_object_certificate_type(CK_OBJECT_HANDLE obj, CK_CERTIFICATE_TYP
|
|||||||
static void get_object_key_id(CK_OBJECT_HANDLE obj, CK_UTF8CHAR_PTR key_id) {
|
static void get_object_key_id(CK_OBJECT_HANDLE obj, CK_UTF8CHAR_PTR key_id) {
|
||||||
memcpy((char *)key_id, objects[obj].containerid, 2);
|
memcpy((char *)key_id, objects[obj].containerid, 2);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
CK_RV get_attribute(CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_PTR template) {
|
CK_RV get_attribute(CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_PTR template) {
|
||||||
|
CK_BYTE_PTR data;
|
||||||
|
CK_BYTE tmp[64];
|
||||||
|
CK_ULONG len = 0;
|
||||||
fprintf(stderr, "FOR OBJECT %lu, I WANT ", obj);
|
fprintf(stderr, "FOR OBJECT %lu, I WANT ", obj);
|
||||||
|
|
||||||
switch (template->type) {
|
switch (template->type) {
|
||||||
case CKA_CLASS:
|
case CKA_CLASS:
|
||||||
fprintf(stderr, "CLASS\n");
|
fprintf(stderr, "CLASS\n");
|
||||||
if (template->pValue == NULL_PTR) // TODO: just don't use functions, break and check return later?
|
len = 1;
|
||||||
template->ulValueLen = 1;
|
get_object_class(obj, (CK_OBJECT_CLASS_PTR)tmp);
|
||||||
else
|
data = tmp;
|
||||||
get_object_class(obj, template->pValue);
|
break;
|
||||||
|
|
||||||
return CKR_OK;
|
|
||||||
|
|
||||||
// case CKA_TOKEN:
|
// case CKA_TOKEN:
|
||||||
case CKA_PRIVATE:
|
case CKA_PRIVATE:
|
||||||
@@ -283,38 +286,31 @@ CK_RV get_attribute(CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_PTR template) {
|
|||||||
|
|
||||||
case CKA_LABEL:
|
case CKA_LABEL:
|
||||||
fprintf(stderr, "LABEL\n");
|
fprintf(stderr, "LABEL\n");
|
||||||
if (template->pValue == NULL_PTR)
|
len = strlen(objects[obj].name) + 1;
|
||||||
template->ulValueLen = strlen(objects[obj].name);
|
data = objects[obj].name;
|
||||||
else
|
break;
|
||||||
strcpy((char *)template->pValue, objects[obj].name);
|
|
||||||
return CKR_OK;
|
|
||||||
|
|
||||||
case CKA_APPLICATION:
|
case CKA_APPLICATION:
|
||||||
fprintf(stderr, "APPLICATION\n");
|
fprintf(stderr, "APPLICATION\n");
|
||||||
if (template->pValue == NULL_PTR)
|
len = strlen(objects[obj].name) + 1;
|
||||||
template->ulValueLen = strlen(objects[obj].name);
|
data = objects[obj].name;
|
||||||
else
|
break;
|
||||||
strcpy((char *)template->pValue, objects[obj].name);
|
|
||||||
return CKR_OK;
|
|
||||||
|
|
||||||
// case CKA_VALUE:
|
// case CKA_VALUE:
|
||||||
case CKA_OBJECT_ID: // TODO: how about just storing the OID in DER ?
|
case CKA_OBJECT_ID: // TODO: how about just storing the OID in DER ?
|
||||||
fprintf(stderr, "OID\n");
|
fprintf(stderr, "OID\n");
|
||||||
if (template->pValue == NULL_PTR)
|
strcpy((char *)tmp, objects[obj].oid);
|
||||||
template->ulValueLen = strlen(objects[obj].oid) * 2; // Slightly oversized
|
asn1_encode_oid(tmp, tmp, &len);
|
||||||
else {
|
data = tmp;
|
||||||
strcpy((char *)template->pValue, objects[obj].oid);
|
break;
|
||||||
asn1_encode_oid(template->pValue, template->pValue, &template->ulValueLen);
|
|
||||||
}
|
|
||||||
return CKR_OK;
|
|
||||||
|
|
||||||
case CKA_CERTIFICATE_TYPE:
|
case CKA_CERTIFICATE_TYPE:
|
||||||
fprintf(stderr, "CERTIFICATE TYPE\n");
|
fprintf(stderr, "CERTIFICATE TYPE\n");
|
||||||
if (template->pValue == NULL_PTR)
|
len = 1;
|
||||||
template->ulValueLen = 1;
|
tmp[0] = CKC_X_509; // Support only X.509 certs
|
||||||
else
|
data = tmp;
|
||||||
*((CK_ULONG_PTR)template->pValue) = CKC_X_509; // Support only X.509 certs
|
break;
|
||||||
return CKR_OK;
|
|
||||||
// case CKA_ISSUER:
|
// case CKA_ISSUER:
|
||||||
// case CKA_SERIAL_NUMBER:
|
// case CKA_SERIAL_NUMBER:
|
||||||
case CKA_KEY_TYPE:
|
case CKA_KEY_TYPE:
|
||||||
@@ -324,11 +320,10 @@ CK_RV get_attribute(CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_PTR template) {
|
|||||||
/* case CKA_SUBJECT: */
|
/* case CKA_SUBJECT: */
|
||||||
case CKA_ID:
|
case CKA_ID:
|
||||||
fprintf(stderr, "KEY ID\n");
|
fprintf(stderr, "KEY ID\n");
|
||||||
if (template->pValue == NULL_PTR)
|
len = 2;
|
||||||
template->ulValueLen = 2;
|
data = objects[obj].containerid;
|
||||||
else
|
break;
|
||||||
memcpy((char *)template->pValue, objects[obj].containerid, 2);
|
|
||||||
return CKR_OK;
|
|
||||||
/* case CKA_SENSITIVE: */
|
/* case CKA_SENSITIVE: */
|
||||||
/* case CKA_ENCRYPT: */
|
/* case CKA_ENCRYPT: */
|
||||||
/* case CKA_DECRYPT: */
|
/* case CKA_DECRYPT: */
|
||||||
@@ -361,20 +356,29 @@ CK_RV get_attribute(CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_PTR template) {
|
|||||||
/* case CKA_ALWAYS_SENSITIVE: */
|
/* case CKA_ALWAYS_SENSITIVE: */
|
||||||
case CKA_MODIFIABLE:
|
case CKA_MODIFIABLE:
|
||||||
fprintf(stderr, "MODIFIABLE\n");
|
fprintf(stderr, "MODIFIABLE\n");
|
||||||
if (template->pValue == NULL_PTR)
|
len = 1;
|
||||||
template->ulValueLen = 1;
|
tmp[0] = CK_FALSE;
|
||||||
else
|
data = tmp;
|
||||||
*((CK_ULONG_PTR)template->pValue) = CK_FALSE;
|
break;
|
||||||
return CKR_OK;
|
|
||||||
|
|
||||||
case CKA_VENDOR_DEFINED:
|
case CKA_VENDOR_DEFINED:
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "UNKNOWN ATTRIBUTE!!!!! %lx\n", template[0].type);
|
fprintf(stderr, "UNKNOWN ATTRIBUTE!!!!! %lx\n", template[0].type);
|
||||||
template->ulValueLen = CK_UNAVAILABLE_INFORMATION;
|
template->ulValueLen = CK_UNAVAILABLE_INFORMATION;
|
||||||
return CKR_FUNCTION_FAILED;
|
return CKR_ATTRIBUTE_TYPE_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Never reached
|
if (template->pValue == NULL_PTR) {
|
||||||
return CKR_FUNCTION_FAILED;
|
template->ulValueLen = len; // TODO: define?
|
||||||
|
return CKR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (template->ulValueLen < len)
|
||||||
|
return CKR_BUFFER_TOO_SMALL;
|
||||||
|
|
||||||
|
template->ulValueLen = len;
|
||||||
|
memcpy(template->pValue, data, len);
|
||||||
|
|
||||||
|
return CKR_OK;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@
|
|||||||
printf ("\n"); \
|
printf ("\n"); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define YKCS11_DBG 0 // General debug, must be either 1 or 0
|
#define YKCS11_DBG 1 // General debug, must be either 1 or 0
|
||||||
#define YKCS11_DINOUT 0 // Function in/out debug, must be either 1 or 0
|
#define YKCS11_DINOUT 0 // Function in/out debug, must be either 1 or 0
|
||||||
|
|
||||||
#define YKCS11_MANUFACTURER "Yubico (www.yubico.com)"
|
#define YKCS11_MANUFACTURER "Yubico (www.yubico.com)"
|
||||||
@@ -800,7 +800,7 @@ CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)(
|
|||||||
return CKR_OPERATION_ACTIVE;
|
return CKR_OPERATION_ACTIVE;
|
||||||
|
|
||||||
if (slots[session_info.slotID].vid == UNKNOWN) {
|
if (slots[session_info.slotID].vid == UNKNOWN) {
|
||||||
DBG(("Slot %lu is tokenless/unsupported", slotID));
|
DBG(("Slot %lu is tokenless/unsupported", session_info.slotID));
|
||||||
return CKR_SLOT_ID_INVALID;
|
return CKR_SLOT_ID_INVALID;
|
||||||
}
|
}
|
||||||
vendor = get_vendor(slots[session_info.slotID].vid); // TODO: make a token field in slot_t ?;
|
vendor = get_vendor(slots[session_info.slotID].vid); // TODO: make a token field in slot_t ?;
|
||||||
|
|||||||
Reference in New Issue
Block a user