diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 55688fb9..c2b178e1 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -10,6 +10,6 @@ INC = sc-test.h base64_SOURCES = base64.c $(SRC) $(INC) lottery_SOURCES = lottery.c $(SRC) $(INC) -p15dump_SOURCES = p15dump.c $(SRC) $(INC) -pintest_SOURCES = pintest.c $(SRC) $(INC) +p15dump_SOURCES = p15dump.c print.c $(SRC) $(INC) +pintest_SOURCES = pintest.c print.c $(SRC) $(INC) prngtest_SOURCES = prngtest.c $(SRC) $(INC) diff --git a/src/tests/print.c b/src/tests/print.c new file mode 100644 index 00000000..1794a68a --- /dev/null +++ b/src/tests/print.c @@ -0,0 +1,201 @@ +/* Copyright (C) 2001, 2002 Juha Yrjölä + * All rights reserved. + * + * PKCS#15 PIN code test + */ + +#include "sc-test.h" +#include "opensc.h" +#include "opensc-pkcs15.h" +#include +#include + +struct sc_pkcs15_card *p15card; + +static void +print_pin(const struct sc_pkcs15_object *obj) +{ + const char *pin_flags[] = { + "case-sensitive", "local", "change-disabled", + "unblock-disabled", "initialized", "needs-padding", + "unblockingPin", "soPin", "disable_allowed", + "integrity-protected", "confidentiality-protected", + "exchangeRefData" + }; + struct sc_pkcs15_pin_info *pin; + const int pf_count = sizeof(pin_flags)/sizeof(pin_flags[0]); + int i; + char *p; + + pin = (struct sc_pkcs15_pin_info *) obj->data; + printf("\tAuth ID : "); + sc_pkcs15_print_id(&pin->auth_id); + printf("\n"); + printf("\tFlags : [0x%02X]", pin->flags); + for (i = 0; i < pf_count; i++) + if (pin->flags & (1 << i)) { + printf(", %s", pin_flags[i]); + } + printf("\n"); + printf("\tLength : %d..%d\n", pin->min_length, pin->stored_length); + printf("\tPad char : 0x%02X\n", pin->pad_char); + printf("\tReference : %d\n", pin->reference); + printf("\tType : %d\n", pin->type); + printf("\tPath : "); + for (i = 0; i < pin->path.len; i++) { + printf("%02X", pin->path.value[i]); + p += 2; + } + printf("\n"); +} + +static void +print_prkey_rsa(const struct sc_pkcs15_object *obj) +{ + int i; + const char *usages[] = { + "encrypt", "decrypt", "sign", "signRecover", + "wrap", "unwrap", "verify", "verifyRecover", + "derive", "nonRepudiation" + }; + const int usage_count = sizeof(usages)/sizeof(usages[0]); + const char *access_flags[] = { + "sensitive", "extract", "alwaysSensitive", + "neverExtract", "local" + }; + const int af_count = sizeof(access_flags)/sizeof(access_flags[0]); + struct sc_pkcs15_prkey_info *prkey; + + prkey = (struct sc_pkcs15_prkey_info *) obj->data; + + printf("\tUsage : [0x%X]", prkey->usage); + for (i = 0; i < usage_count; i++) + if (prkey->usage & (1 << i)) { + printf(", %s", usages[i]); + } + printf("\n"); + printf("\tAccess Flags: [0x%X]", prkey->access_flags); + for (i = 0; i < af_count; i++) + if (prkey->access_flags & (1 << i)) { + printf(", %s", access_flags[i]); + } + printf("\n"); + printf("\tModLength : %d\n", prkey->modulus_length); + printf("\tKey ref : %d\n", prkey->key_reference); + printf("\tNative : %s\n", prkey->native ? "yes" : "no"); + printf("\tPath : "); + for (i = 0; i < prkey->path.len; i++) + printf("%02X", prkey->path.value[i]); + printf("\n"); + printf("\tID : "); + sc_pkcs15_print_id(&prkey->id); + printf("\n"); +} + +static void +print_pubkey_rsa(const struct sc_pkcs15_object *obj) +{ + int i; + const char *usages[] = { + "encrypt", "decrypt", "sign", "signRecover", + "wrap", "unwrap", "verify", "verifyRecover", + "derive", "nonRepudiation" + }; + const int usage_count = sizeof(usages)/sizeof(usages[0]); + const char *access_flags[] = { + "sensitive", "extract", "alwaysSensitive", + "neverExtract", "local" + }; + const int af_count = sizeof(access_flags)/sizeof(access_flags[0]); + struct sc_pkcs15_pubkey_info *pubkey; + + pubkey = (struct sc_pkcs15_pubkey_info *) obj->data; + + printf("\tUsage : [0x%X]", pubkey->usage); + for (i = 0; i < usage_count; i++) + if (pubkey->usage & (1 << i)) { + printf(", %s", usages[i]); + } + printf("\n"); + printf("\tAccess Flags: [0x%X]", pubkey->access_flags); + for (i = 0; i < af_count; i++) + if (pubkey->access_flags & (1 << i)) { + printf(", %s", access_flags[i]); + } + printf("\n"); + printf("\tModLength : %d\n", pubkey->modulus_length); + printf("\tKey ref : %d\n", pubkey->key_reference); + printf("\tNative : %s\n", pubkey->native ? "yes" : "no"); + printf("\tPath : "); + for (i = 0; i < pubkey->path.len; i++) + printf("%02X", pubkey->path.value[i]); + printf("\n"); + printf("\tID : "); + sc_pkcs15_print_id(&pubkey->id); + printf("\n"); +} + +static void +print_cert_x509(const struct sc_pkcs15_object *obj) +{ + struct sc_pkcs15_cert_info *cert; + int i; + + cert = (struct sc_pkcs15_cert_info *) obj->data; + printf("\tAuthority: %s\n", cert->authority ? "yes" : "no"); + printf("\tPath : "); + for (i = 0; i < cert->path.len; i++) + printf("%02X", cert->path.value[i]); + printf("\n"); + printf("\tID : "); + sc_pkcs15_print_id(&cert->id); + printf("\n"); + + /* XXX original p15dump code would read the certificate + * and dump the label */ +} + + +void +sc_test_print_object(const struct sc_pkcs15_object *obj) +{ + const char *kind; + void (*printer)(const struct sc_pkcs15_object *); + + switch (obj->type) { + case SC_PKCS15_TYPE_AUTH_PIN: + printer = print_pin; + kind = "PIN"; + break; + case SC_PKCS15_TYPE_PRKEY_RSA: + printer = print_prkey_rsa; + kind = "Private RSA key"; + break; + case SC_PKCS15_TYPE_PUBKEY_RSA: + printer = print_pubkey_rsa; + kind = "Public RSA key"; + break; + case SC_PKCS15_TYPE_CERT_X509: + printer = print_cert_x509; + kind = "X.509 Certificate"; + break; + default: + printer = NULL; + kind = "Something"; + break; + } + + printf("%s", kind); + if (obj->label[0]) + printf(" [%s]\n", obj->label); + else + printf(" (no label)\n"); + printf("\tCom. Flags : 0x%X\n", obj->flags); + if (obj->auth_id.len) { + printf("\tCom. Auth ID: "); + sc_pkcs15_print_id(&obj->auth_id); + printf("\n"); + } + if (printer) + printer(obj); +} diff --git a/src/tests/sc-test.h b/src/tests/sc-test.h index b20dc3f4..63bd34be 100644 --- a/src/tests/sc-test.h +++ b/src/tests/sc-test.h @@ -3,8 +3,10 @@ extern struct sc_context *ctx; extern struct sc_card *card; +struct sc_pkcs15_object; int sc_test_init(int *argc, char *argv[]); void sc_test_cleanup(); +void sc_test_print_object(const struct sc_pkcs15_object *); #endif