Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,19 @@ versions may need to update templates or error-handling:
bootstrap empty-password databases. Integrators who require an enforced
minimum can opt in at build time with `C_EXTRA_FLAGS="-DWP11_MIN_PIN_LEN=N"`
(`N>0`); non-NSS builds already default to `4`.
- `C_GetAttributeValue` returns `CKR_ATTRIBUTE_TYPE_INVALID` when a template
names an attribute the object does not have or that is not supported, and
keeps processing the rest of the template. Previously such attributes
returned `CK_UNAVAILABLE_INFORMATION` as the function's return value, and
`CKA_CERTIFICATE_TYPE` on a non-certificate object failed the whole call
with `CKR_FUNCTION_FAILED`. In both cases the attribute's `ulValueLen` is
set to `CK_UNAVAILABLE_INFORMATION`.
- `CKA_KEY_TYPE` is only an attribute of key objects. Reading it from a
certificate or data object now returns `CKR_ATTRIBUTE_TYPE_INVALID` (an
X.509 certificate previously read back as `CKK_RSA`), `C_FindObjects` with
`CKA_KEY_TYPE` in the template no longer matches non-key objects, and
`C_SetAttributeValue` of `CKA_KEY_TYPE` on them returns
`CKR_ATTRIBUTE_TYPE_INVALID`.

#### Analog Devices, Inc. MAXQ10xx Secure Elements ([MAXQ1065](https://www.analog.com/en/products/maxq1065.html)/MAXQ1080)

Expand Down
24 changes: 13 additions & 11 deletions src/crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -1170,7 +1170,12 @@ static CK_RV SetAttributeValue(WP11_Session* session, WP11_Object* obj,
attr->type == CKA_ALWAYS_SENSITIVE ||
attr->type == CKA_NEVER_EXTRACTABLE)) {
roCurLen = sizeof(roCur);
if (WP11_Object_GetAttr(obj, attr->type, roCur, &roCurLen) == 0 &&
ret = WP11_Object_GetAttr(obj, attr->type, roCur, &roCurLen);
/* Not an attribute of this object, e.g. CKA_KEY_TYPE on a
* certificate. */
if (ret == CKR_ATTRIBUTE_TYPE_INVALID)
return CKR_ATTRIBUTE_TYPE_INVALID;
if (ret == 0 &&
(attr->pValue == NULL || attr->ulValueLen != roCurLen ||
XMEMCMP(attr->pValue, roCur, roCurLen) != 0)) {
return CKR_ATTRIBUTE_READ_ONLY;
Expand Down Expand Up @@ -1986,11 +1991,10 @@ CK_RV C_GetObjectSize(CK_SESSION_HANDLE hSession,
* CKR_SESSION_HANDLE_INVALID when session handle is not valid.
* CKR_ARGUMENTS_BAD when pTemplate is NULL.
* CKR_OBJECT_HANDLE_INVALID when handle is not to a valid object.
* CKR_ATTRIBUTE_TYPE_INVALID if the attribute type is not supported.
* CKR_ATTRIBUTE_VALUE_INVALID if value is not valid for data type.
* CKR_ATTRIBUTE_TYPE_INVALID if the attribute type is not supported
* or not valid for the object.
* CKR_ATTRIBUTE_SENSITIVE if an attribute value cannot be revealed.
* CKR_BUFFER_TOO_SMALL if an attribute length is too short.
* CK_UNAVAILABLE_INFORMATION when an attribute type is not supported
* for retrieval.
* CKR_FUNCTION_FAILED when getting a value fails.
* CKR_OK on success.
*/
Expand Down Expand Up @@ -2050,16 +2054,14 @@ CK_RV C_GetAttributeValue(CK_SESSION_HANDLE hSession,

ret = WP11_Object_GetAttr(obj, attr->type, (byte*)attr->pValue,
&attr->ulValueLen);
if (ret == BAD_FUNC_ARG) {
/* Attribute not valid for, or not available from, this object: mark
* it unavailable and keep processing the rest of the template. */
if (ret == BAD_FUNC_ARG || ret == NOT_AVAILABLE_E ||
ret == CKR_ATTRIBUTE_TYPE_INVALID) {
attr->ulValueLen = (CK_ULONG)-1;
if (rv == CKR_OK)
rv = CKR_ATTRIBUTE_TYPE_INVALID;
}
else if (ret == NOT_AVAILABLE_E) {
attr->ulValueLen = (CK_ULONG)-1;
if (rv == CKR_OK)
rv = CK_UNAVAILABLE_INFORMATION;
}
else if (ret == BUFFER_E) {
if (rv == CKR_OK)
rv = CKR_BUFFER_TOO_SMALL;
Expand Down
11 changes: 10 additions & 1 deletion src/internal.c
Original file line number Diff line number Diff line change
Expand Up @@ -12686,6 +12686,8 @@ static int GetEcbCheckValue(WP11_Object* secret, byte* dataOut,
* On out, length of data in bytes.
* @return BUFFER_E when buffer is too small for data.
* NOT_AVAILABLE_E when attribute type is not supported.
* CKR_ATTRIBUTE_TYPE_INVALID when attribute is not valid for the
* object's class.
* 0 on success.
*/
int WP11_Object_GetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type, byte* data,
Expand Down Expand Up @@ -12770,7 +12772,14 @@ int WP11_Object_GetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type, byte* data,
ret = GetData(object->keyId, object->keyIdLen, data, len);
break;
case CKA_KEY_TYPE:
ret = GetULong(object->type, data, len);
/* Only key objects have a key type. Other classes reuse
* object->type, e.g. certificates store CKA_CERTIFICATE_TYPE. */
if (object->objClass == CKO_PUBLIC_KEY ||
object->objClass == CKO_PRIVATE_KEY ||
object->objClass == CKO_SECRET_KEY)
ret = GetULong(object->type, data, len);
else
ret = CKR_ATTRIBUTE_TYPE_INVALID;
break;
case CKA_START_DATE:
if (object->startDate[0] == '\0') {
Expand Down
12 changes: 6 additions & 6 deletions tests/pkcs11mtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,7 @@ static CK_RV test_attribute(void* args)
if (ret == CKR_OK) {
count = sizeof(attrNotAvail) / sizeof(*attrNotAvail);
ret = funcList->C_GetAttributeValue(session, obj, attrNotAvail, count);
CHECK_CKR_FAIL(ret, CK_UNAVAILABLE_INFORMATION,
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_TYPE_INVALID,
"Get Attribute Value attribute not available");
}

Expand Down Expand Up @@ -766,7 +766,7 @@ static CK_RV test_attribute_types(void* args)
}
for (i = 0; i < (int)badAttrsTmplCnt; i++) {
ret = funcList->C_GetAttributeValue(session, obj, &badAttrsTmpl[i], 1);
CHECK_CKR_FAIL(ret, CK_UNAVAILABLE_INFORMATION,
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_TYPE_INVALID,
"Get unavailable attribute");
}
if (ret == CKR_OK) {
Expand Down Expand Up @@ -858,7 +858,7 @@ static CK_RV test_attributes_secret(void* args)
if (ret == CKR_OK) {
for (i = 0; i < (int)badTmplCnt; i++) {
ret = funcList->C_GetAttributeValue(session, key, &badTmpl[i], 1);
CHECK_CKR_FAIL(ret, CK_UNAVAILABLE_INFORMATION,
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_TYPE_INVALID,
"Get Attributes secret unavailable");
}
}
Expand Down Expand Up @@ -2311,7 +2311,7 @@ static CK_RV test_attributes_rsa(void* args)
for (i = 0; i < (int)rsaPubBadTmplCnt; i++) {
ret = funcList->C_GetAttributeValue(session, pub, &rsaPubBadTmpl[i],
1);
CHECK_CKR_FAIL(ret, CK_UNAVAILABLE_INFORMATION,
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_TYPE_INVALID,
"Get Attributes RSA unavailable");
}
}
Expand Down Expand Up @@ -3690,7 +3690,7 @@ static CK_RV test_attributes_ecc(void* args)
for (i = 0; i < (int)eccBadTmplCnt; i++) {
ret = funcList->C_GetAttributeValue(session, pub, &eccBadTmpl[i],
1);
CHECK_CKR_FAIL(ret, CK_UNAVAILABLE_INFORMATION,
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_TYPE_INVALID,
"Get Attributes EC unavailable");
}
}
Expand Down Expand Up @@ -4413,7 +4413,7 @@ static CK_RV test_attributes_dh(void* args)
if (ret == CKR_OK) {
for (i = 0; i < (int)dhBadTmplCnt; i++) {
ret = funcList->C_GetAttributeValue(session, pub, &dhBadTmpl[i], 1);
CHECK_CKR_FAIL(ret, CK_UNAVAILABLE_INFORMATION,
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_TYPE_INVALID,
"Get Attributes DH unavailable");
}
}
Expand Down
Loading
Loading