Hello!
I propose a patch for src/libopensc/card-westcos.c if it's working.

src/libopensc/card-westcos.c:westcos_select_file:

309:    case SC_PATH_TYPE_PATH:
                apdu.p1 = 9;    // Why is it needed?  ("9" ?)

336:    if (file_out != NULL) {
                apdu.resp = buf;
                apdu.resplen = sizeof(buf);
                apdu.le = 255;
        } else {
                apdu.resplen = 0;
                apdu.le = 0;
                apdu.cse = SC_APDU_CASE_3_SHORT;
        }
Is this correct? (See http://www.opensc-project.org/opensc/changeset/3700/trunk/src/libopensc and http://www.opensc-project.org/pipermail/opensc-devel/2009-June/012280.html)
Patch for trunk revision 3741 attached.
Thanks
diff -u -r opensc-trunk-r3742/src/libopensc/card-westcos.c 
opensc-trunk-r3742_new/src/libopensc/card-westcos.c
--- opensc-trunk-r3742/src/libopensc/card-westcos.c     2009-09-12 
07:04:48.000000000 +0400
+++ opensc-trunk-r3742_new/src/libopensc/card-westcos.c 2009-09-21 
11:11:15.000000000 +0400
@@ -280,100 +280,11 @@
 static int westcos_select_file(sc_card_t * card, const sc_path_t * in_path,
                               sc_file_t ** file_out)
 {
-       sc_context_t *ctx;
-       sc_apdu_t apdu;
-       u8 buf[SC_MAX_APDU_BUFFER_SIZE];
-       u8 pathbuf[SC_MAX_PATH_SIZE], *path = pathbuf;
-       int r, pathlen;
-       sc_file_t *file = NULL;
-       priv_data_t *priv_data = NULL;
-       if (card->ctx->debug >= 1)
-               sc_debug(card->ctx, "westcos_select_file\n");
-       if (card == NULL)
-               return SC_ERROR_INVALID_ARGUMENTS;
-       priv_data = (priv_data_t *) card->drv_data;
-       priv_data->file_id = 0;
-       ctx = card->ctx;
-       memcpy(path, in_path->value, in_path->len);
-       pathlen = (int)in_path->len;
-       sc_format_apdu(card, &apdu, SC_APDU_CASE_4_SHORT, 0xA4, 0, 0);
-       switch (in_path->type) {
-       case SC_PATH_TYPE_FILE_ID:
-               apdu.p1 = 0;
-               if (pathlen != 2)
-                       return SC_ERROR_INVALID_ARGUMENTS;
-               break;
-       case SC_PATH_TYPE_DF_NAME:
-               apdu.p1 = 4;
-               break;
-       case SC_PATH_TYPE_PATH:
-               apdu.p1 = 9;
-               if (pathlen == 2 && memcmp(path, "\x3F\x00", 2) == 0) {
-                       apdu.p1 = 0;
-               }
+       priv_data_t *priv_data = (priv_data_t *) card->drv_data;
 
-               else if (pathlen > 2 && memcmp(path, "\x3F\x00", 2) == 0) {
-                       apdu.p1 = 8;
-                       pathlen -= 2;
-                       memcpy(path, &in_path->value[2], pathlen);
-               }
-               break;
-       case SC_PATH_TYPE_FROM_CURRENT:
-               apdu.p1 = 9;
-               break;
-       case SC_PATH_TYPE_PARENT:
-               apdu.p1 = 3;
-               pathlen = 0;
-               apdu.cse = SC_APDU_CASE_3_SHORT;
-               break;
-       default:
-               return SC_ERROR_INVALID_ARGUMENTS;
-       }
-       apdu.p2 = 0;    /* first record, return FCI */
-       apdu.lc = pathlen;
-       apdu.data = path;
-       apdu.datalen = pathlen;
-       if (file_out != NULL) {
-               apdu.resp = buf;
-               apdu.resplen = sizeof(buf);
-               apdu.le = 255;
-       } else {
-               apdu.resplen = 0;
-               apdu.le = 0;
-               apdu.cse = SC_APDU_CASE_3_SHORT;
-       }
-       r = sc_transmit_apdu(card, &apdu);
-       if (r)
-               return (r);
-       if (file_out == NULL) {
-               if (apdu.sw1 == 0x61)
-                       return 0;
-               return sc_check_sw(card, apdu.sw1, apdu.sw2);
-       }
-       r = sc_check_sw(card, apdu.sw1, apdu.sw2);
-       if (r)
-               return (r);
-       switch (apdu.resp[0]) {
-       case 0x6F:
-               file = sc_file_new();
-               if (file == NULL)
-                       return SC_ERROR_OUT_OF_MEMORY;
-               file->path = *in_path;
-               if (card->ops->process_fci == NULL) {
-                       sc_file_free(file);
-                       return SC_ERROR_NOT_SUPPORTED;
-               }
-               if (apdu.resp[1] <= apdu.resplen)
-                       card->ops->process_fci(card, file, apdu.resp + 2,
-                                              apdu.resp[1]);
-               *file_out = file;
-               break;
-       case 0x00:              /* proprietary coding */
-               return SC_ERROR_UNKNOWN_DATA_RECEIVED;
-       default:
-               return SC_ERROR_UNKNOWN_DATA_RECEIVED;
-       }
-       return 0;
+       assert(iso_ops && iso_ops->select_file);
+       priv_data->file_id = 0;
+       return iso_ops->select_file(card, in_path, file_out);
 }
 
 static int _westcos2opensc_ac(u8 flag)
_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to