diff -up ./src/coolkey/slot.cpp.more_keys ./src/coolkey/slot.cpp --- ./src/coolkey/slot.cpp.more_keys 2016-06-16 11:50:01.027432856 -0700 +++ ./src/coolkey/slot.cpp 2016-06-16 11:50:13.267224824 -0700 @@ -32,7 +32,8 @@ #define MIN(x, y) ((x) < (y) ? (x) : (y)) - +#define MAX_NUM_KEYS 32 +#define MAX_NUM_CERTS 32 #ifdef DEBUG #define PRINTF(args) printf args @@ -3458,7 +3459,7 @@ Slot::loadObjects() } else if( type == 'c' ) { // cert attribute object. find the DER encoding unsigned short certnum = getObjectIndex(iter->obj.objectID); - if( certnum > 9 ) { + if( certnum > MAX_NUM_CERTS ) { //invalid object id throw PKCS11Exception(CKR_DEVICE_ERROR, "Invalid object id %08x",iter->obj.objectID); @@ -4154,7 +4155,7 @@ Slot::objectToKeyNum(const PKCS11Object throw PKCS11Exception(CKR_KEY_HANDLE_INVALID); } unsigned short keyNum = getObjectIndex(id); - if( keyNum > 9 ) { + if( keyNum > MAX_NUM_KEYS ) { throw PKCS11Exception(CKR_KEY_HANDLE_INVALID); } return keyNum & 0xFF; @@ -4911,7 +4912,6 @@ Slot::generateRandom(SessionHandleSuffix } } -#define MAX_NUM_KEYS 8 unsigned int Slot::getRSAKeySize(PKCS11Object *key) { diff -up ./src/coolkey/slot.h.more_keys ./src/coolkey/slot.h --- ./src/coolkey/slot.h.more_keys 2016-06-16 11:50:08.627303984 -0700 +++ ./src/coolkey/slot.h 2016-06-16 11:54:08.872153180 -0700 @@ -512,7 +512,17 @@ class Slot { return (char) (objectID >> 24) & 0xff; } unsigned short getObjectIndex(unsigned long objectID) const { - return (char )((objectID >> 16) & 0xff) - '0'; + char char_index = (char) ((objectID >> 16) & 0xff); + if (char_index >= '0' && char_index <= '9') { + return char_index - '0'; + } + if (char_index >= 'A' && char_index <= 'Z') { + return char_index - 'A' + 10; + } + if (char_index >= 'a' && char_index <= 'z') { + return char_index - 'a' + 26 + 10; + } + return 0x0100 + char_index; } // actually get the size of a key in bits from the card