Hello, I would like to commit a change to pkcs11-spy, that changes the output related to enquiries on attribute values (C_GetAttributeValue). The reason for that change is that PKCS#11 defines a precise algorithm for these enquiries. That algorithm depends for example on pointer (NULL_PTR) and size of input-buffer.
The new output is more detailed and less verbose. And it makes tracing of applications a little bit more easy. See attached file sample.txt. The patch uses the following format string with variable sized hex-dump of pointers: sprintf(buf, "0x%0*lx / %ld", 2 * ptr_sz, ptr, buf_len); It works well on Linux (32 and 64 bit). But does this kind of format string would work on other platforms too? Other objections about that patch? Regards Andre
======= Before: ======= 47: C_GetAttributeValue [in] hSession = 0x8a75080 [in] hObject = 0x8a74718 [in] pTemplate[1]: CKA_NETSCAPE_EMAIL(Netsc) requested with 0 buffer [out] pTemplate[1]: CKA_NETSCAPE_EMAIL(Netsc) has size -1 Returned: 18 CKR_ATTRIBUTE_TYPE_INVALID 127: C_GetAttributeValue [in] hSession = 0x8a75080 [in] hObject = 0x8a74718 [in] pTemplate[2]: CKA_ID requested with 0 buffer CKA_CLASS requested with 0 buffer [out] pTemplate[2]: CKA_ID has size 12 CKA_CLASS has size 4 Returned: 0 CKR_OK 128: C_GetAttributeValue [in] hSession = 0x8a75080 [in] hObject = 0x8a74718 [in] pTemplate[2]: CKA_ID requested with 12 buffer CKA_CLASS requested with 4 buffer [out] pTemplate[2]: CKA_ID [size : 0xC (12)] 344D656A ABBF1222 EC50B3A3 CKA_CLASS CKO_CERTIFICATE Returned: 0 CKR_OK ====== After: ====== 47: C_GetAttributeValue [in] hSession = 0x8a73210 [in] hObject = 0x8a71fd0 [in] pTemplate[1]: CKA_NETSCAPE_EMAIL(Netsc) 0x00000000 / 0 [out] pTemplate[1]: CKA_NETSCAPE_EMAIL(Netsc) 0x00000000 / -1 Returned: 18 CKR_ATTRIBUTE_TYPE_INVALID 127: C_GetAttributeValue [in] hSession = 0x8a73210 [in] hObject = 0x8a71fd0 [in] pTemplate[2]: CKA_ID 0x00000000 / 0 CKA_CLASS 0x00000000 / 0 [out] pTemplate[2]: CKA_ID 0x00000000 / 12 CKA_CLASS 0x00000000 / 4 Returned: 0 CKR_OK 128: C_GetAttributeValue [in] hSession = 0x8a73210 [in] hObject = 0x8a71fd0 [in] pTemplate[2]: CKA_ID 0x08cf8ea8 / 12 CKA_CLASS 0x08cf8ec0 / 4 [out] pTemplate[2]: CKA_ID 0x08cf8ea8 / 12 344D656A ABBF1222 EC50B3A3 CKA_CLASS CKO_CERTIFICATE Returned: 0 CKR_OK
Index: src/pkcs11/pkcs11-display.c =================================================================== --- src/pkcs11/pkcs11-display.c (revision 4877) +++ src/pkcs11/pkcs11-display.c (working copy) @@ -84,6 +84,14 @@ #define CKA_CERT_MD5_HASH (CKA_TRUST + 101) +static char *buf_spec(CK_VOID_PTR value, CK_ULONG size) +{ + static const size_t ptr_sz = sizeof(CK_VOID_PTR); + static char buf[64]; + sprintf(buf, "0x%0*lx / %ld", 2 * ptr_sz, value, (CK_LONG) size); + return buf; +} + void print_enum(FILE *f, CK_LONG type, CK_VOID_PTR value, CK_ULONG size, CK_VOID_PTR arg) { enum_spec *spec = (enum_spec*)arg; @@ -109,7 +117,7 @@ { CK_ULONG i; if(size != (CK_LONG)(-1) && value != NULL) { - fprintf(f, "[size : 0x%lX (%ld)]\n ", size, size); + fprintf(f, "%s\n ", buf_spec(value, size)); for(i = 0; i < size; i++) { if (i != 0) { if ((i % 32) == 0) @@ -153,7 +161,7 @@ CK_ULONG i, j; CK_BYTE c; if(size != (CK_LONG)(-1)) { - fprintf(f, "[size : 0x%lX (%ld)]\n ", size, size); + fprintf(f, "%s\n ", buf_spec(value, size)); for(i = 0; i < size; i += j) { for(j = 0; ((i + j < size) && (j < 32)); j++) { if (((j % 4) == 0) && (j != 0)) fprintf(f, " "); @@ -862,20 +870,20 @@ if(ck_attribute_specs[k].type == pTemplate[j].type) { found = 1; fprintf(f, " %s ", ck_attribute_specs[k].name); - if(pTemplate[j].pValue) { + if(pTemplate[j].pValue && ((CK_LONG) pTemplate[j].ulValueLen) > 0) { ck_attribute_specs[k].display (f, pTemplate[j].type, pTemplate[j].pValue, pTemplate[j].ulValueLen, ck_attribute_specs[k].arg); } else { - fprintf(f, "has size %ld\n", pTemplate[j].ulValueLen); + fprintf(f, "%s\n", buf_spec(pTemplate[j].pValue, pTemplate[j].ulValueLen)); } k = ck_attribute_num; } } if (!found) { fprintf(f, " CKA_? (0x%08lx) ", pTemplate[j].type); - fprintf(f, "has size %ld\n", pTemplate[j].ulValueLen); + fprintf(f, "%s\n", buf_spec(pTemplate[j].pValue, pTemplate[j].ulValueLen)); } } } @@ -891,13 +899,13 @@ if(ck_attribute_specs[k].type == pTemplate[j].type) { found = 1; fprintf(f, " %s ", ck_attribute_specs[k].name); - fprintf(f, "requested with %ld buffer\n", pTemplate[j].ulValueLen); + fprintf(f, "%s\n", buf_spec(pTemplate[j].pValue, pTemplate[j].ulValueLen)); k = ck_attribute_num; } } if (!found) { fprintf(f, " CKA_? (0x%08lx) ", pTemplate[j].type); - fprintf(f, "requested with %ld buffer\n", pTemplate[j].ulValueLen); + fprintf(f, "%s\n", buf_spec(pTemplate[j].pValue, pTemplate[j].ulValueLen)); } } }
_______________________________________________ opensc-devel mailing list opensc-devel@lists.opensc-project.org http://www.opensc-project.org/mailman/listinfo/opensc-devel