pkcs15-tool.c - print Supported_algorithms from tokenInfo
Some cards can provide supported algorithms in tokenInfo which contain ECDSA OID, and PKCS11 mechanism Don't know how many Algo_refs were actually read, and a ref of 0 may be valid. print at least one Algo_refs. Print the mechanism from PKCS11, and print operations Use the $(top_srcdir)/src/pkcs11/pkcs11-display.c on Unix Use the $(TOPDIR)\src\pkcs11\pkcs11-display.obj on Windows pkcs15.tool.c treat ECDSA OID as inline pkcs15-tool prints PKCS11 mechanisms using pkcs11-display.c Automake now warns that the default will change, in the future so "[subdir-objects]" is added to configure.ac Changes to be committed: modified: configure.ac modified: src/tools/Makefile.am modified: src/tools/Makefile.mak modified: src/tools/pkcs15-tool.c
This commit is contained in:
parent
c03efeee40
commit
8a5a1435f1
|
@ -27,7 +27,7 @@ AC_INIT([PRODUCT_NAME],[PACKAGE_VERSION_MAJOR.PACKAGE_VERSION_MINOR.PACKAGE_VERS
|
||||||
AC_CONFIG_AUX_DIR([.])
|
AC_CONFIG_AUX_DIR([.])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AM_INIT_AUTOMAKE(foreign 1.10)
|
AM_INIT_AUTOMAKE(foreign 1.10 [subdir-objects])
|
||||||
|
|
||||||
OPENSC_VERSION_MAJOR="PACKAGE_VERSION_MAJOR"
|
OPENSC_VERSION_MAJOR="PACKAGE_VERSION_MAJOR"
|
||||||
OPENSC_VERSION_MINOR="PACKAGE_VERSION_MINOR"
|
OPENSC_VERSION_MINOR="PACKAGE_VERSION_MINOR"
|
||||||
|
|
|
@ -52,7 +52,7 @@ piv_tool_SOURCES = piv-tool.c util.c
|
||||||
piv_tool_LDADD = $(OPTIONAL_OPENSSL_LIBS)
|
piv_tool_LDADD = $(OPTIONAL_OPENSSL_LIBS)
|
||||||
opensc_explorer_SOURCES = opensc-explorer.c util.c
|
opensc_explorer_SOURCES = opensc-explorer.c util.c
|
||||||
opensc_explorer_LDADD = $(OPTIONAL_READLINE_LIBS)
|
opensc_explorer_LDADD = $(OPTIONAL_READLINE_LIBS)
|
||||||
pkcs15_tool_SOURCES = pkcs15-tool.c util.c
|
pkcs15_tool_SOURCES = pkcs15-tool.c util.c ../pkcs11/pkcs11-display.c ../pkcs11/pkcs11-display.h
|
||||||
pkcs15_tool_LDADD = $(OPTIONAL_OPENSSL_LIBS)
|
pkcs15_tool_LDADD = $(OPTIONAL_OPENSSL_LIBS)
|
||||||
pkcs11_tool_SOURCES = pkcs11-tool.c util.c
|
pkcs11_tool_SOURCES = pkcs11-tool.c util.c
|
||||||
pkcs11_tool_LDADD = \
|
pkcs11_tool_LDADD = \
|
||||||
|
|
|
@ -52,6 +52,11 @@ pkcs11-register.exe: pkcs11-register-cmdline.obj fread_to_eof.obj $(LIBS)
|
||||||
link $(LINKFLAGS) /pdb:$*.pdb /out:$@ $*.obj pkcs11-register-cmdline.obj fread_to_eof.obj versioninfo-tools.res $(LIBS) gdi32.lib shell32.lib User32.lib ws2_32.lib
|
link $(LINKFLAGS) /pdb:$*.pdb /out:$@ $*.obj pkcs11-register-cmdline.obj fread_to_eof.obj versioninfo-tools.res $(LIBS) gdi32.lib shell32.lib User32.lib ws2_32.lib
|
||||||
mt -manifest exe.manifest -outputresource:$@;1
|
mt -manifest exe.manifest -outputresource:$@;1
|
||||||
|
|
||||||
|
pkcs15-tool.exe: pkcs15-tool.obj $(TOPDIR)\src\pkcs11\pkcs11-display.obj
|
||||||
|
cl $(COPTS) /c $*.c
|
||||||
|
link $(LINKFLAGS) /pdb:$*.pdb /out:$@ $*.obj $(TOPDIR)\src\pkcs11\pkcs11-display.obj $(OBJECTS) $(LIBS) $(OPENSSL_LIB) gdi32.lib shell32.lib User32.lib ws2_32.lib
|
||||||
|
mt -manifest exe.manifest -outputresource:$@;1
|
||||||
|
|
||||||
.c.exe:
|
.c.exe:
|
||||||
cl $(COPTS) /c $<
|
cl $(COPTS) /c $<
|
||||||
link $(LINKFLAGS) /pdb:$*.pdb /out:$@ $*.obj $(OBJECTS) $(LIBS) $(OPENSSL_LIB) gdi32.lib shell32.lib User32.lib ws2_32.lib
|
link $(LINKFLAGS) /pdb:$*.pdb /out:$@ $*.obj $(OBJECTS) $(LIBS) $(OPENSSL_LIB) gdi32.lib shell32.lib User32.lib ws2_32.lib
|
||||||
|
|
|
@ -57,6 +57,7 @@ typedef unsigned __int32 uint32_t;
|
||||||
#include "libopensc/pkcs15.h"
|
#include "libopensc/pkcs15.h"
|
||||||
#include "libopensc/asn1.h"
|
#include "libopensc/asn1.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "pkcs11/pkcs11-display.h"
|
||||||
|
|
||||||
static const char *app_name = "pkcs15-tool";
|
static const char *app_name = "pkcs15-tool";
|
||||||
|
|
||||||
|
@ -607,6 +608,8 @@ static void print_prkey_info(const struct sc_pkcs15_object *obj)
|
||||||
struct sc_pkcs15_prkey_info *prkey = (struct sc_pkcs15_prkey_info *) obj->data;
|
struct sc_pkcs15_prkey_info *prkey = (struct sc_pkcs15_prkey_info *) obj->data;
|
||||||
unsigned char guid[40];
|
unsigned char guid[40];
|
||||||
size_t guid_len;
|
size_t guid_len;
|
||||||
|
int i;
|
||||||
|
int last_algo_refs = 0;
|
||||||
|
|
||||||
if (compact) {
|
if (compact) {
|
||||||
printf("\t%-3s", key_types[7 & obj->type]);
|
printf("\t%-3s", key_types[7 & obj->type]);
|
||||||
|
@ -635,6 +638,16 @@ static void print_prkey_info(const struct sc_pkcs15_object *obj)
|
||||||
printf("\tAccess Flags : [0x%02X]", prkey->access_flags);
|
printf("\tAccess Flags : [0x%02X]", prkey->access_flags);
|
||||||
print_key_access_flags(prkey->access_flags);
|
print_key_access_flags(prkey->access_flags);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
printf("\tAlgo_refs : ");
|
||||||
|
/* zero may be valid and don't know how many were read print at least 1*/
|
||||||
|
for (i = 0; i< SC_MAX_SUPPORTED_ALGORITHMS; i++) {
|
||||||
|
if (prkey->algo_refs[i] != 0)
|
||||||
|
last_algo_refs = i;
|
||||||
|
}
|
||||||
|
for (i = 0; i< last_algo_refs + 1; i++) {
|
||||||
|
printf("%s%u", (i == 0) ? "" : ", ", prkey->algo_refs[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
print_access_rules(obj->access_rules, SC_PKCS15_MAX_ACCESS_RULES);
|
print_access_rules(obj->access_rules, SC_PKCS15_MAX_ACCESS_RULES);
|
||||||
|
|
||||||
|
@ -1645,6 +1658,21 @@ static int list_apps(FILE *fout)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void print_supported_algo_info_operations(unsigned int operation)
|
||||||
|
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
const char *operations[] = {
|
||||||
|
"compute_checksum", "compute_signature", "verify_checksum", "verify_signature",
|
||||||
|
"encipher", "decipher", "hash", "generate/derive_key"
|
||||||
|
};
|
||||||
|
const size_t operations_count = NELEMENTS(operations);
|
||||||
|
for (i = 0; i < operations_count; i++)
|
||||||
|
if (operation & (1 << i))
|
||||||
|
printf(", %s", operations[i]);
|
||||||
|
}
|
||||||
|
|
||||||
static void list_info(void)
|
static void list_info(void)
|
||||||
{
|
{
|
||||||
const char *flags[] = {
|
const char *flags[] = {
|
||||||
|
@ -1655,6 +1683,7 @@ static void list_info(void)
|
||||||
};
|
};
|
||||||
char *last_update = sc_pkcs15_get_lastupdate(p15card);
|
char *last_update = sc_pkcs15_get_lastupdate(p15card);
|
||||||
int i, count = 0;
|
int i, count = 0;
|
||||||
|
int idx;
|
||||||
|
|
||||||
printf("PKCS#15 Card [%s]:\n", p15card->tokeninfo->label);
|
printf("PKCS#15 Card [%s]:\n", p15card->tokeninfo->label);
|
||||||
printf("\tVersion : %d\n", p15card->tokeninfo->version);
|
printf("\tVersion : %d\n", p15card->tokeninfo->version);
|
||||||
|
@ -1675,6 +1704,34 @@ static void list_info(void)
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
printf("\n");
|
||||||
|
for (i = 0; i < SC_MAX_SUPPORTED_ALGORITHMS; i++) {
|
||||||
|
struct sc_supported_algo_info * sa = &p15card->tokeninfo->supported_algos[i];
|
||||||
|
|
||||||
|
if (sa->reference == 0 && sa->reference == 0 && sa->mechanism == 0
|
||||||
|
&& sa->operations == 0 && sa->algo_ref == 0)
|
||||||
|
break;
|
||||||
|
printf("\t\t sc_supported_algo_info[%d]:\n", i);
|
||||||
|
printf("\t\t\t reference : %u (0x%02x)\n", sa->reference, sa->reference);
|
||||||
|
printf("\t\t\t mechanism : [0x%02x] %s\n", sa->mechanism, lookup_enum(MEC_T, sa->mechanism));
|
||||||
|
if (sc_valid_oid(&sa->parameters)) {
|
||||||
|
printf("\t\t\t parameters: %i", sa->parameters.value[0]);
|
||||||
|
for (idx = 1; idx < SC_MAX_OBJECT_ID_OCTETS && sa->parameters.value[idx] != -1 ; idx++)
|
||||||
|
printf(".%i", sa->parameters.value[idx]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("\t\t\t operations : [0x%2.2x]",sa->operations);
|
||||||
|
print_supported_algo_info_operations(sa->operations);
|
||||||
|
printf("\n");
|
||||||
|
if (sc_valid_oid((const struct sc_object_id*)&sa->algo_id)) {
|
||||||
|
printf("\t\t\t algo_id : %i", sa->algo_id.value[0]);
|
||||||
|
for (idx = 1; idx < SC_MAX_OBJECT_ID_OCTETS && sa->algo_id.value[idx] != -1 ; idx++)
|
||||||
|
printf(".%i", sa->algo_id.value[idx]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("\t\t\t algo_ref : [0x%02x]\n",sa->algo_ref);
|
||||||
|
}
|
||||||
|
|
||||||
printf((compact) ? "\n" : "\n\n");
|
printf((compact) ? "\n" : "\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue