Refined get attribute value.

This commit is contained in:
Alessio Di Mauro
2015-07-22 14:39:19 +02:00
parent 7da7e8ab97
commit 91d7e52b21
2 changed files with 49 additions and 45 deletions
+47 -43
View File
@@ -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
View File
@@ -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 ?;