in src/attributes/attributes.c [253:361]
CK_RV attributes_output_all(
/** [in] Valid PKCS11 session. */
CK_SESSION_HANDLE session,
/** [in] The object handle. */
CK_OBJECT_HANDLE object,
/** [in] The output file handle. */
FILE *f ) {
uint8_t* attr_avail = calloc(attributes_types_len, sizeof(uint8_t));
if (NULL == attr_avail) {
fprintf(f, "ERROR: failed to allocate memory\n");
return CKR_HOST_MEMORY;
}
size_t i = (size_t)0;
CK_RV rv = CKR_OK;
if (CK_INVALID_HANDLE == session)
return CKR_ARGUMENTS_BAD;
if (CK_INVALID_HANDLE == object)
return CKR_ARGUMENTS_BAD;
if (NULL == f)
return CKR_ARGUMENTS_BAD;
for (i = (size_t)0; i < attributes_types_len; i++) {
CK_ATTRIBUTE attr[] = {
{ attributes_types[i].type, NULL_PTR, (CK_ULONG)0 } };
CK_RV rv_local = CKR_OK;
rv_local = funcs->C_GetAttributeValue(
session,
object,
(CK_ATTRIBUTE_PTR)&attr[0].type,
(CK_ULONG)1 );
if (CKR_OK == rv_local) {
attr_avail[i] = UINT8_C(1);
}
if (CKR_OBJECT_HANDLE_INVALID == rv_local) {
fprintf(f, "ERROR: object [%lu] is not valid\n", object);
rv = CKR_HOST_MEMORY;
goto attributes_output_all_1;
}
}
fprintf(f, "Attributes for object %lu:\n", object);
for (i = (size_t)0; i < attributes_types_len; i++) {
uint8_t *buf = NULL;
CK_ULONG buf_len = (CK_ULONG)0;
CK_RV rv_local = CKR_OK;
if( UINT8_C(0) == attr_avail[i] )
continue;
rv_local = attributes_get(
session, object, attributes_types[i].type, NULL, &buf_len );
switch (rv_local)
{
case CKR_HOST_MEMORY:
fprintf(f, "ERROR: failed to allocate memory\n");
rv = rv_local;
goto attributes_output_all_1;
break;
case CKR_OK:
break;
default:
goto attributes_output_all_1;
break;
}
buf = (uint8_t *)calloc(buf_len, (size_t)1);
if (NULL == buf) {
fprintf(f, "ERROR: failed to allocate memory\n");
rv = CKR_HOST_MEMORY;
break;
}
rv_local = attributes_get(
session, object, attributes_types[i].type, buf, &buf_len );
switch (rv_local)
{
case CKR_HOST_MEMORY:
fprintf(f, "ERROR: failed to allocate memory\n");
rv = rv_local;
break;
case CKR_OK:
fprintf(f, "INFO : Attribute [0x%010lu] %30s:\n 0x ",
attributes_types[i].type, attributes_types[i].name );
attributes_output(buf, buf_len, f);
break;
default:
break;
}
free(buf);
if (CKR_OK != rv_local)
break;
}
attributes_output_all_1:
fprintf(f, "\n");
free(attr_avail);
return rv;
}