diff --git a/src/libopensc/Makefile.am b/src/libopensc/Makefile.am index be32adb9..ad3b7f8e 100644 --- a/src/libopensc/Makefile.am +++ b/src/libopensc/Makefile.am @@ -39,7 +39,8 @@ libopensc_la_SOURCES = \ card-oberthur.c card-belpic.c card-atrust-acos.c card-entersafe.c \ card-incrypto34.c card-piv.c card-muscle.c card-acos5.c \ card-asepcos.c card-akis.c card-gemsafeV1.c card-rutoken.c \ - card-rtecp.c card-westcos.c card-myeid.c card-ias.c\ + card-rtecp.c card-westcos.c card-myeid.c card-ias.c \ + card-javacard.c \ \ pkcs15-openpgp.c pkcs15-infocamere.c pkcs15-starcert.c \ pkcs15-tcos.c pkcs15-esteid.c pkcs15-postecert.c pkcs15-gemsafeGPK.c \ diff --git a/src/libopensc/Makefile.mak b/src/libopensc/Makefile.mak index 8014a388..bca7664c 100644 --- a/src/libopensc/Makefile.mak +++ b/src/libopensc/Makefile.mak @@ -26,6 +26,7 @@ OBJECTS = \ card-incrypto34.obj card-piv.obj card-muscle.obj card-acos5.obj \ card-asepcos.obj card-akis.obj card-gemsafeV1.obj card-rutoken.obj \ card-rtecp.obj card-westcos.obj card-myeid.obj card-ias.obj \ + card-javacard.c \ \ p15emu-westcos.obj \ pkcs15-openpgp.obj pkcs15-infocamere.obj pkcs15-starcert.obj \ diff --git a/src/libopensc/card-javacard.c b/src/libopensc/card-javacard.c new file mode 100644 index 00000000..2b91aef7 --- /dev/null +++ b/src/libopensc/card-javacard.c @@ -0,0 +1,74 @@ +/* + * card-javacard.c: Recognize known blank JavaCards + * + * Copyright (C) 2010 Martin Paljak + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "internal.h" + +static struct sc_atr_table javacard_atrs[] = { + {"3b:db:18:00:80:b1:fe:45:1f:83:00:31:c0:64:c7:fc:10:00:01:90:00:fa", NULL, "Cosmo v7 64K dual/128K", SC_CARD_TYPE_JAVACARD, 0, NULL}, + {"3b:75:94:00:00:62:02:02:02:01", NULL, "Cyberflex 32K", SC_CARD_TYPE_JAVACARD, 0, NULL}, + {"3b:95:95:40:ff:ae:01:03:00:00", NULL, "Cyberflex v2 64K", SC_CARD_TYPE_JAVACARD, 0, NULL}, + {NULL, NULL, NULL, 0, 0, NULL} +}; + +static struct sc_card_operations javacard_ops; +static struct sc_card_driver javacard_drv = { + "JavaCard (without supported applet)", + "javacard", + &javacard_ops, + NULL, 0, NULL +}; + +static int javacard_finish(sc_card_t * card) +{ + return SC_SUCCESS; +} + +static int javacard_match_card(sc_card_t * card) +{ + if (_sc_match_atr(card, javacard_atrs, &card->type) < 0) + return 0; + return 1; +} + +static int javacard_init(sc_card_t * card) +{ + card->drv_data = NULL; + + return SC_SUCCESS; +} + + +static struct sc_card_driver *sc_get_driver(void) +{ + struct sc_card_driver *iso_drv = sc_get_iso7816_driver(); + + javacard_ops = *iso_drv->ops; + javacard_ops.match_card = javacard_match_card; + javacard_ops.select_file = NULL; + javacard_ops.init = javacard_init; + javacard_ops.finish = javacard_finish; + + return &javacard_drv; +} + +struct sc_card_driver *sc_get_javacard_driver(void) +{ + return sc_get_driver(); +} diff --git a/src/libopensc/cards.h b/src/libopensc/cards.h index 65c2cc20..0997758d 100644 --- a/src/libopensc/cards.h +++ b/src/libopensc/cards.h @@ -160,6 +160,10 @@ enum { /* IAS cards */ SC_CARD_TYPE_IAS_BASE = 22000, SC_CARD_TYPE_IAS_PTEID, + + /* Generic JavaCards without supported applet */ + SC_CARD_TYPE_JAVACARD_BASE = 23000, + SC_CARD_TYPE_JAVACARD, }; extern sc_card_driver_t *sc_get_default_driver(void); @@ -191,6 +195,7 @@ extern sc_card_driver_t *sc_get_rtecp_driver(void); extern sc_card_driver_t *sc_get_westcos_driver(void); extern sc_card_driver_t *sc_get_myeid_driver(void); extern sc_card_driver_t *sc_get_ias_driver(void); +extern sc_card_driver_t *sc_get_javacard_driver(void); #ifdef __cplusplus } diff --git a/src/libopensc/ctx.c b/src/libopensc/ctx.c index 7ec4753b..8c8a87bf 100644 --- a/src/libopensc/ctx.c +++ b/src/libopensc/ctx.c @@ -86,6 +86,7 @@ static const struct _sc_driver_entry internal_card_drivers[] = { { "myeid", (void *(*)(void)) sc_get_myeid_driver }, /* emv is not really implemented */ { "emv", (void *(*)(void)) sc_get_emv_driver }, + { "javacard", (void *(*)(void)) sc_get_javacard_driver }, /* The default driver should be last, as it handles all the * unrecognized cards. */ { "default", (void *(*)(void)) sc_get_default_driver },