From 5926c08c9198c3282b7828af0f3c2ceb8a0be1dc Mon Sep 17 00:00:00 2001 From: aj Date: Thu, 22 Oct 2009 18:28:25 +0000 Subject: [PATCH] =?UTF-8?q?Cleanup=20westcos=20driver=20to=20remove=20warn?= =?UTF-8?q?ings=20-=20by=20Fran=C3=A7ois=20Leblanc.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3786 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/card-westcos.c | 124 ++++++++++++++------------------ src/libopensc/cardctl.h | 4 +- src/libopensc/p15emu-westcos.c | 2 +- src/pkcs15init/pkcs15-westcos.c | 6 +- src/tools/westcos-tool.c | 57 +++++++-------- 5 files changed, 87 insertions(+), 106 deletions(-) diff --git a/src/libopensc/card-westcos.c b/src/libopensc/card-westcos.c index a27c9051..9fe50d31 100644 --- a/src/libopensc/card-westcos.c +++ b/src/libopensc/card-westcos.c @@ -144,19 +144,12 @@ static int westcos_check_sw(sc_card_t * card, unsigned int sw1, return iso_ops->check_sw(card, sw1, sw2); } -typedef struct mon_atr { - size_t len; - int flags; - u8 *atr, *mask; -} mon_atr_t; - -static mon_atr_t atrs[] = { - {13, 0x00, - "\x3f\x69\x00\x00\x00\x64\x01\x00\x00\x00\x80\x90\x00", - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xf0\xff\xff"}, - {12, JAVACARD, - "\x3b\x95\x94\x80\x1F\xC3\x80\x73\xC8\x21\x13\x54", - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"} +static struct sc_atr_table westcos_atrs[] = { + /* westcos 2ko */ + { "3F:69:00:00:00:64:01:00:00:00:80:90:00", "ff:ff:ff:ff:ff:ff:ff:00:00:00:f0:ff:ff", NULL, 0x00, 0, NULL }, + /* westcos applet */ + { "3B:95:94:80:1F:C3:80:73:C8:21:13:54", "ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff", NULL, JAVACARD, 0, NULL }, + { NULL, NULL, NULL, 0, 0, NULL } }; static int westcos_finish(sc_card_t * card) @@ -172,63 +165,39 @@ static int westcos_finish(sc_card_t * card) static int westcos_match_card(sc_card_t * card) { - u8 *p, j; - size_t i; - mon_atr_t *matr; - if (card->ctx->debug >= 1) - sc_debug(card->ctx, "westcos_match_card %d, %X:%X:%X\n", - card->atr_len, card->atr[0], card->atr[1], - card->atr[2]); - for (i = 0; i < sizeof(atrs) / sizeof(*atrs); i++) { - matr = &atrs[i]; - if (matr->len != card->atr_len) - continue; - p = card->atr; - for (j = 0; j < card->atr_len; j++) { - if (((matr->mask[j]) & (*p)) != (matr->atr[j])) - break; - p++; - if (*p == ':') - p++; - } - if (j >= card->atr_len) { - if (matr->flags & JAVACARD) { - int r; - sc_apdu_t apdu; - u8 aid[] = { - 0xA0, 0x00, 0xCE, 0x00, 0x07, 0x01 - }; - sc_format_apdu(card, &apdu, - SC_APDU_CASE_3_SHORT, 0xA4, 0x04, - 0); - apdu.cla = 0x00; - apdu.lc = sizeof(aid); - apdu.datalen = sizeof(aid); - apdu.data = aid; - sc_ctx_suppress_errors_on(card->ctx); - r = sc_transmit_apdu(card, &apdu); - sc_ctx_suppress_errors_off(card->ctx); - if (r) - continue; - sc_ctx_suppress_errors_on(card->ctx); - r = sc_check_sw(card, apdu.sw1, apdu.sw2); - sc_ctx_suppress_errors_off(card->ctx); - if (r) - continue; - } - card->drv_data = malloc(sizeof(priv_data_t)); - if (card->drv_data == NULL) - return SC_ERROR_OUT_OF_MEMORY; - memset(card->drv_data, 0, sizeof(card->drv_data)); - if (matr->flags & JAVACARD) { - priv_data_t *priv_data = - (priv_data_t *) card->drv_data; - priv_data->flags |= JAVACARD; - } - return 1; - } + int i; + + i = _sc_match_atr(card, westcos_atrs, &card->type); + if (i < 0) + return 0; + + /* JAVACARD, look for westcos applet */ + if (i == 1) { + int r; + sc_apdu_t apdu; + u8 aid[] = { + 0xA0, 0x00, 0xCE, 0x00, 0x07, 0x01 + }; + sc_format_apdu(card, &apdu, + SC_APDU_CASE_3_SHORT, 0xA4, 0x04, + 0); + apdu.cla = 0x00; + apdu.lc = sizeof(aid); + apdu.datalen = sizeof(aid); + apdu.data = aid; + sc_ctx_suppress_errors_on(card->ctx); + r = sc_transmit_apdu(card, &apdu); + sc_ctx_suppress_errors_off(card->ctx); + if (r) + return 0; + sc_ctx_suppress_errors_on(card->ctx); + r = sc_check_sw(card, apdu.sw1, apdu.sw2); + sc_ctx_suppress_errors_off(card->ctx); + if (r) + return 0; } - return 0; + + return 1; } static int westcos_init(sc_card_t * card) @@ -236,8 +205,19 @@ static int westcos_init(sc_card_t * card) int r; const char *default_key; unsigned long exponent, flags; - if (card == NULL || card->drv_data == NULL) + if (card == NULL)// || card->drv_data == NULL) return SC_ERROR_INVALID_ARGUMENTS; + + card->drv_data = malloc(sizeof(priv_data_t)); + if (card->drv_data == NULL) + return SC_ERROR_OUT_OF_MEMORY; + memset(card->drv_data, 0, sizeof(card->drv_data)); + if (card->type & JAVACARD) { + priv_data_t *priv_data = + (priv_data_t *) card->drv_data; + priv_data->flags |= JAVACARD; + } + card->cla = 0x00; card->max_send_size = 240; card->max_recv_size = 240; @@ -264,9 +244,9 @@ static int westcos_init(sc_card_t * card) priv_data_t *priv_data = (priv_data_t *) (card->drv_data); priv_data->default_key.key_reference = 0; priv_data->default_key.key_len = - sizeof(priv_data->default_key.key_value); + sizeof(priv_data->default_key.key_value); r = sc_hex_to_bin(default_key, priv_data->default_key.key_value, - &(priv_data->default_key.key_len)); + &(priv_data->default_key.key_len)); if (r) return (r); } diff --git a/src/libopensc/cardctl.h b/src/libopensc/cardctl.h index 5d6fe431..29d75fa5 100644 --- a/src/libopensc/cardctl.h +++ b/src/libopensc/cardctl.h @@ -488,8 +488,8 @@ typedef struct sc_cardctl_asepcos_activate_file { typedef struct { int key_reference; - int key_len; //8, 16 or 24 - u8 key_value[24]; + size_t key_len; //8, 16 or 24 + u8 key_value[24]; }sc_autkey_t; typedef struct { diff --git a/src/libopensc/p15emu-westcos.c b/src/libopensc/p15emu-westcos.c index 69e58908..1214e5c3 100644 --- a/src/libopensc/p15emu-westcos.c +++ b/src/libopensc/p15emu-westcos.c @@ -32,7 +32,7 @@ static int sc_pkcs15emu_westcos_init(sc_pkcs15_card_t * p15card) { int i, r; int modulus_length = 0, usage = 0; - u8 buf[256]; + char buf[256]; sc_card_t *card = p15card->card; sc_context_t *ctx = card->ctx; sc_serial_number_t serial; diff --git a/src/pkcs15init/pkcs15-westcos.c b/src/pkcs15init/pkcs15-westcos.c index efcef804..65235d42 100644 --- a/src/pkcs15init/pkcs15-westcos.c +++ b/src/pkcs15init/pkcs15-westcos.c @@ -268,9 +268,9 @@ static int westcos_pkcs15init_generate_key(sc_profile_t *profile, #ifndef ENABLE_OPENSSL return SC_ERROR_NOT_SUPPORTED; #else - int r = SC_ERROR_UNKNOWN; - long lg; - char *p; + int r = SC_ERROR_UNKNOWN; + long lg; + u8 *p; sc_pkcs15_prkey_info_t *key_info = (sc_pkcs15_prkey_info_t *) obj->data; RSA *rsa = NULL; BIGNUM *bn = NULL; diff --git a/src/tools/westcos-tool.c b/src/tools/westcos-tool.c index 8e0bbfea..799d9520 100644 --- a/src/tools/westcos-tool.c +++ b/src/tools/westcos-tool.c @@ -62,9 +62,7 @@ static int new_pin = 0; static int debloque = 0; static char *get_filename = NULL; -static char *get_path = NULL; static char *put_filename = NULL; -static char *put_path = NULL; static int do_convert_bignum(sc_pkcs15_bignum_t *dst, BIGNUM *src) { @@ -90,7 +88,7 @@ static void print_openssl_erreur(void) fprintf(stderr, "%s\n", ERR_error_string(r, NULL)); } -static verify_pin(sc_card_t *card, int pin_reference, char *pin_value) +static int verify_pin(sc_card_t *card, int pin_reference, char *pin_value) { int r, tries_left = -1; struct sc_pin_cmd_data data; @@ -117,7 +115,7 @@ static verify_pin(sc_card_t *card, int pin_reference, char *pin_value) return SC_ERROR_INVALID_ARGUMENTS; } - data.pin1.data = pin_value; + data.pin1.data = (u8*)pin_value; data.pin1.len = strlen(pin_value); } @@ -140,7 +138,7 @@ static verify_pin(sc_card_t *card, int pin_reference, char *pin_value) return 0; } -static change_pin(sc_card_t *card, +static int change_pin(sc_card_t *card, int pin_reference, char *pin_value1, char *pin_value2) @@ -170,10 +168,10 @@ static change_pin(sc_card_t *card, return SC_ERROR_INVALID_ARGUMENTS; } - data.pin1.data = pin_value1; + data.pin1.data = (u8*)pin_value1; data.pin1.len = strlen(pin_value1); - data.pin2.data = pin_value2; + data.pin2.data = (u8*)pin_value2; data.pin2.len = strlen(pin_value2); } @@ -198,7 +196,7 @@ static change_pin(sc_card_t *card, return 0; } -static debloque_pin(sc_card_t *card, +static int debloque_pin(sc_card_t *card, int pin_reference, char *puk_value, char *pin_value) @@ -228,10 +226,10 @@ static debloque_pin(sc_card_t *card, return SC_ERROR_INVALID_ARGUMENTS; } - data.pin1.data = puk_value; + data.pin1.data = (u8*)puk_value; data.pin1.len = strlen(puk_value); - data.pin2.data = pin_value; + data.pin2.data = (u8*)pin_value; data.pin2.len = strlen(pin_value); } @@ -353,7 +351,7 @@ int main(int argc, char *argv[]) { int r; int i = 1; - u8 *p; + char *p; int card_presente = 0; sc_context_param_t ctx_param; sc_reader_t *lecteur = NULL; @@ -593,7 +591,7 @@ int main(int argc, char *argv[]) pin_cmd.encoding = SC_PIN_ENCODING_GLP; pin_cmd.len = strlen(pin); - pin_cmd.data = pin; + pin_cmd.data = (u8*)pin; pin_cmd.max_length = 8; ck.new_key.key_len = sc_build_pin(ck.new_key.key_value, @@ -617,7 +615,7 @@ int main(int argc, char *argv[]) puk_cmd.encoding = SC_PIN_ENCODING_GLP; puk_cmd.len = strlen(puk); - puk_cmd.data = puk; + puk_cmd.data = (u8*)puk; puk_cmd.max_length = 8; ck.new_key.key_len = sc_build_pin(ck.new_key.key_value, @@ -655,10 +653,11 @@ int main(int argc, char *argv[]) if(keylen) { - int lg; + size_t lg; struct sc_pkcs15_pubkey key; struct sc_pkcs15_pubkey_rsa *dst = &(key.u.rsa); - + u8 *pdata; + memset(&key, 0, sizeof(key)); key.algorithm = SC_ALGORITHM_RSA; @@ -691,7 +690,7 @@ int main(int argc, char *argv[]) #endif { fprintf(stderr, - "RSA_generate_key_ex return %d\n", ERR_get_error()); + "RSA_generate_key_ex return %ld\n", ERR_get_error()); goto out; } @@ -700,11 +699,11 @@ int main(int argc, char *argv[]) if(!i2d_RSAPrivateKey_bio(mem, rsa)) { fprintf(stderr, - "i2d_RSAPrivateKey_bio return %d\n", ERR_get_error()); + "i2d_RSAPrivateKey_bio return %ld\n", ERR_get_error()); goto out; } - lg = BIO_get_mem_data(mem, &p); + lg = BIO_get_mem_data(mem, &pdata); sc_format_path("0001", &path); sc_ctx_suppress_errors_on(ctx); @@ -756,7 +755,7 @@ int main(int argc, char *argv[]) printf("Private key length is %d\n", lg); printf("Write private key.\n"); - r = sc_update_binary(card,0,p,lg,0); + r = sc_update_binary(card,0,pdata,lg,0); if(r<0) goto out; printf("Private key correctly written.\n"); @@ -767,7 +766,7 @@ int main(int argc, char *argv[]) || !do_convert_bignum(&dst->exponent, rsa->e)) goto out; - r = sc_pkcs15_encode_pubkey(ctx, &key, &p, &lg); + r = sc_pkcs15_encode_pubkey(ctx, &key, &pdata, &lg); if(r) goto out; printf("Public key length %d\n", lg); @@ -777,7 +776,7 @@ int main(int argc, char *argv[]) if(r) goto out; printf("Write public key.\n"); - r = sc_update_binary(card,0,p,lg,0); + r = sc_update_binary(card,0,pdata,lg,0); if(r<0) goto out; printf("Public key correctly written.\n"); @@ -785,9 +784,10 @@ int main(int argc, char *argv[]) if(cert) { - BIO *bio; - X509 *xp; - + BIO *bio; + X509 *xp; + u8 *pdata; + bio = BIO_new(BIO_s_file()); if (BIO_read_filename(bio, cert) <= 0) { @@ -804,7 +804,7 @@ int main(int argc, char *argv[]) } else { - int lg = cert2der(xp, &p); + int lg = cert2der(xp, &pdata); sc_format_path("0002", &path); r = sc_select_file(card, &path, NULL); @@ -813,14 +813,14 @@ int main(int argc, char *argv[]) /* FIXME: verifier taille fichier compatible... */ printf("Write certificate %s.\n", cert); - r = sc_update_binary(card,0,p,lg,0); + r = sc_update_binary(card,0,pdata,lg,0); if(r<0) { - if(p) free(p); + if(pdata) free(pdata); goto out; } if(xp) X509_free(xp); - if(p) free(p); + if(pdata) free(pdata); printf("Certificate correctly written.\n"); } @@ -956,5 +956,6 @@ out: if (ctx) sc_release_context(ctx); + return EXIT_SUCCESS; }