Cleanup westcos driver to remove warnings - by François Leblanc.

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3786 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
aj 2009-10-22 18:28:25 +00:00
parent 268755c4d6
commit 5926c08c91
5 changed files with 87 additions and 106 deletions

View File

@ -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);
}

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -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;
}