diff --git a/src/libopensc/pkcs15.c b/src/libopensc/pkcs15.c index cab3cbc0..571c65eb 100644 --- a/src/libopensc/pkcs15.c +++ b/src/libopensc/pkcs15.c @@ -2431,8 +2431,8 @@ sc_pkcs15_get_supported_algo(struct sc_pkcs15_card *p15card, break; if (ii < SC_MAX_SUPPORTED_ALGORITHMS && p15card->tokeninfo->supported_algos[ii].reference) { - info = &p15card->tokeninfo->supported_algos[ii]; - sc_log(ctx, "found supported algorithm (ref:%X,mech:%X,ops:%X,algo_ref:%X)", + info = &p15card->tokeninfo->supported_algos[ii]; + sc_log(ctx, "found supported algorithm (ref:%X,mech:%X,ops:%X,algo_ref:%X)", info->reference, info->mechanism, info->operations, info->algo_ref); } @@ -2440,6 +2440,43 @@ sc_pkcs15_get_supported_algo(struct sc_pkcs15_card *p15card, } +int +sc_pkcs15_get_generalized_time(struct sc_context *ctx, char **out) +{ +#ifdef HAVE_GETTIMEOFDAY + struct timeval tv; +#endif + struct tm *tm_time; + time_t t; + + if (!ctx || !out) + return SC_ERROR_INVALID_ARGUMENTS; + *out = NULL; + +#ifdef HAVE_GETTIMEOFDAY + gettimeofday(&tv, NULL); + t = tv.tv_sec; +#else + t = time(NULL); +#endif + tm_time = gmtime(&t); + if (!tm_time) + LOG_TEST_RET(ctx, SC_ERROR_INTERNAL, "gmtime failed"); + + *out = calloc(1, 16); + if (*out == NULL) + LOG_TEST_RET(ctx, SC_ERROR_OUT_OF_MEMORY, "memory failure"); + + /* print time in generalized time format */ + if (!strftime(*out, 16, "%Y%m%d%H%M%SZ", tm_time)) { + free(*out); + LOG_TEST_RET(ctx, SC_ERROR_INTERNAL, "strftime failed"); + } + + return SC_SUCCESS; +} + + int sc_pkcs15_add_supported_algo_ref(struct sc_pkcs15_object *obj, struct sc_supported_algo_info *algo) diff --git a/src/libopensc/pkcs15.h b/src/libopensc/pkcs15.h index 9b4f015a..0e97c12c 100644 --- a/src/libopensc/pkcs15.h +++ b/src/libopensc/pkcs15.h @@ -969,6 +969,9 @@ int sc_pkcs15_convert_pubkey(struct sc_pkcs15_pubkey *key, void *evp_key); /* Get 'LastUpdate' string */ char *sc_pkcs15_get_lastupdate(struct sc_pkcs15_card *p15card); +/* Allocate generalized time string */ +int sc_pkcs15_get_generalized_time(struct sc_context *ctx, char **out); + /* New object search API. * More complex, but also more powerful. */ diff --git a/src/libopensc/types.h b/src/libopensc/types.h index fb1c18d0..7a379243 100644 --- a/src/libopensc/types.h +++ b/src/libopensc/types.h @@ -281,8 +281,8 @@ typedef struct sc_apdu { int cse; /* APDU case */ unsigned char cla, ins, p1, p2; /* CLA, INS, P1 and P2 bytes */ size_t lc, le; /* Lc and Le bytes */ - const unsigned char *data; /* C-APDU data */ - size_t datalen; /* length of data in C-APDU */ + unsigned char *data; /* S-APDU data */ + size_t datalen; /* length of data in S-APDU */ unsigned char *resp; /* R-APDU data buffer */ size_t resplen; /* in: size of R-APDU buffer, * out: length of data returned in R-APDU */ diff --git a/src/pkcs15init/pkcs15-lib.c b/src/pkcs15init/pkcs15-lib.c index 4085a160..a0db824c 100644 --- a/src/pkcs15init/pkcs15-lib.c +++ b/src/pkcs15init/pkcs15-lib.c @@ -2524,74 +2524,36 @@ sc_pkcs15init_update_dir(struct sc_pkcs15_card *p15card, } -static char * -get_generalized_time(struct sc_context *ctx) -{ -#ifdef HAVE_GETTIMEOFDAY - struct timeval tv; -#endif - struct tm *tm_time; - time_t t; - char* ret; - size_t r; - -#ifdef HAVE_GETTIMEOFDAY - gettimeofday(&tv, NULL); - t = tv.tv_sec; -#else - t = time(NULL); -#endif - tm_time = gmtime(&t); - if (tm_time == NULL) { - sc_log(ctx, "error: gmtime failed"); - return NULL; - } - - ret = calloc(1, 16); - if (ret == NULL) { - sc_log(ctx, "error: calloc failed"); - return NULL; - } - /* print time in generalized time format */ - r = strftime(ret, 16, "%Y%m%d%H%M%SZ", tm_time); - if (r == 0) { - sc_log(ctx, "error: strftime failed"); - free(ret); - return NULL; - } - - return ret; -} - - static int sc_pkcs15init_update_tokeninfo(struct sc_pkcs15_card *p15card, struct sc_profile *profile) { + struct sc_context *ctx = p15card->card->ctx; struct sc_card *card = p15card->card; struct sc_pkcs15_tokeninfo tokeninfo; unsigned char *buf = NULL; size_t size; - int r; + int rv; + + LOG_FUNC_CALLED(ctx); - LOG_FUNC_CALLED(p15card->card->ctx); /* set lastUpdate field */ if (p15card->tokeninfo->last_update.gtime != NULL) free(p15card->tokeninfo->last_update.gtime); - p15card->tokeninfo->last_update.gtime = get_generalized_time(card->ctx); - if (p15card->tokeninfo->last_update.gtime == NULL) - return SC_ERROR_INTERNAL; + rv = sc_pkcs15_get_generalized_time(ctx, &p15card->tokeninfo->last_update.gtime); + LOG_TEST_RET(ctx, rv, "Cannot allocate generalized time string"); tokeninfo = *(p15card->tokeninfo); if (profile->ops->emu_update_tokeninfo) return profile->ops->emu_update_tokeninfo(profile, p15card, &tokeninfo); - r = sc_pkcs15_encode_tokeninfo(card->ctx, &tokeninfo, &buf, &size); - if (r >= 0) - r = sc_pkcs15init_update_file(profile, p15card, p15card->file_tokeninfo, buf, size); + rv = sc_pkcs15_encode_tokeninfo(ctx, &tokeninfo, &buf, &size); + if (rv >= 0) + rv = sc_pkcs15init_update_file(profile, p15card, p15card->file_tokeninfo, buf, size); if (buf) free(buf); - LOG_FUNC_RETURN(p15card->card->ctx, r); + + LOG_FUNC_RETURN(ctx, rv); } @@ -2617,9 +2579,8 @@ sc_pkcs15init_update_lastupdate(struct sc_pkcs15_card *p15card, struct sc_profil /* update 'lastUpdate' file */ if (last_update->gtime != NULL) free(last_update->gtime); - last_update->gtime = get_generalized_time(ctx); - if (last_update->gtime == NULL) - return SC_ERROR_INTERNAL; + r = sc_pkcs15_get_generalized_time(ctx, &last_update->gtime); + LOG_TEST_RET(ctx, r, "Cannot allocate generalized time string"); sc_copy_asn1_entry(c_asn1_last_update, asn1_last_update); lupdate_len = strlen(last_update->gtime);