CK_RV attributes_output_all()

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;
}