Some time ago I tests Cardos SC_CARD_TYPE_CARDOS_M4_3, with atr:
3b:f2:18:00:02:c1:0a:31:fe:58:c8:08:74

Sign fails on final transmit of sign adpu. I analyzed adpu winscard.dll log of 
SmartTrustPersonal, which CSP sign correctly. 
And found that it use other way of sign throw adpu: 00 2A 80 86 ...

So I modify OpenSc, and now it sign well.

1. Add new type: SC_CARD_TYPE_CARDOS_M4_3B

2. In static struct sc_atr_table cardos_atrs[] init as:
//Old:
        { "3b:f2:18:00:02:c1:0a:31:fe:58:c8:08:74", NULL, NULL,            
SC_CARD_TYPE_CARDOS_M4_3, 0, NULL },
//Modified:
        { "3b:f2:18:00:02:c1:0a:31:fe:58:c8:08:74", NULL, NULL, 
SC_CARD_TYPE_CARDOS_M4_3B, 0, NULL },
/////////

3. In do_compute_signature modifies: 
//Old:
       sc_format_apdu(card, &apdu, SC_APDU_CASE_4, 0x2A, 0x9E, 0x9A);
//Modified:
        if(card->type == SC_CARD_TYPE_CARDOS_M4_3B)
                sc_format_apdu(card, &apdu, SC_APDU_CASE_4B, 0x2A, 0x80, 0x86);
        else 
                sc_format_apdu(card, &apdu, SC_APDU_CASE_4, 0x2A, 0x9E, 0x9A);
////////


4. Add constants:

//Modified:
#define SC_APDU_CASE_4B                 0x34
#define SC_APDU_B                       0x20
#define SC_APDU_CASE_4B_EXT             SC_APDU_CASE_4_SHORT | SC_APDU_EXT | 
SC_APDU_B
/////////

5.  In static size_t sc_apdu_get_length(const sc_apdu_t *apdu, unsigned int 
proto) add:

//Modified: 
        case SC_APDU_CASE_4B_EXT:       
                ret += apdu->lc + (proto == SC_PROTO_T0 ? 1 : 6);
                break;
/////////

6. In static int sc_apdu2bytes(sc_context_t *ctx, const sc_apdu_t *apdu,
        unsigned int proto, u8 *out, size_t outlen) add:

//Modified:
        case SC_APDU_CASE_4B_EXT:
                if (proto == SC_PROTO_T0) {
                        /* again a T0 extended case 4 APDU looks just
                        * like a short APDU, the additional data is
                        * transferred using ENVELOPE and GET RESPONSE */
                        *p++ = (u8)apdu->lc;
                        memcpy(p, apdu->data, apdu->lc);
                        p += apdu->lc & 0xff;
                } else {
                        *p++ = (u8)0x00;
                        *p++ = (u8)0x01;
                        *p++ = (u8)(apdu->lc >> 8);
                        *p++ = (u8)apdu->lc;
                        memcpy(p, apdu->data, apdu->lc);
                        p += apdu->lc;
                        /* only 2 bytes are use to specify the length of the
                        * expected data */
                        *p++ = (u8)(apdu->le >> 8);
                        *p++ = (u8)apdu->le;
                }
                break;
//////
 

7. In static void sc_detect_apdu_cse(const sc_card_t *card, sc_apdu_t *apdu):

        if ((apdu->le > 256 || (apdu->lc > 255 && (apdu->flags & 
SC_APDU_FLAGS_CHAINING) == 0)) &&
                        (card->caps & SC_CARD_CAP_APDU_EXT) != 0){
                        btype |= SC_APDU_EXT;
//Modified:
                        if(apdu->cse == SC_APDU_CASE_4B) btype |= SC_APDU_B;
/////////
                }


This example of my winscard.dll adpu log: 

...

 transmitted:
 00 A4 08 00 02 50 15
 received:
 90 00

 transmitted:
 00 A4 08 00 06 50 15 50 72 4B 01
 received:
 90 00

 transmitted:
 00 22 01 B6 03 83 01 01
 received:
 90 00

 transmitted:
 00 2A 80 86 00 01 01 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 30 20 30 0C
  06 08 2A 86 48 86 F7 0D 02 05 05 00 04 10 F4 89 AD 25 62 36 F3 79 0D B9 AC C6
  C4 11 75 13 01 00
 received:
 12 F3 25 DB 23 4F BE B5 D7 9E 44 85 9E C6 40 56 DD DE E6 85 FD 44 F1 2C 80 DD
  EE 37 EE 62 22 23 3B 4D 53 03 79 9B F7 7F B8 CD C2 21 94 20 12 F0 B9 F2 82 10
  58 47 82 5A 45 0D 36 0C 49 EC E5 E7 8C 1C CB 83 9C 14 33 41 6D 6D 19 89 79 A3
  72 89 6F 50 A4 79 A6 7D DE F9 C8 32 C5 74 FF F4 C3 E4 D3 EB 28 84 D7 5C A2 54
  EF 22 3B 18 9D 43 01 AB D7 AE 85 AD C6 87 BC 0D FD 88 8F F6 A1 99 F9 3C 3A 7A
  94 FB F1 3B FC 64 67 7E BE D1 3D C6 AE 03 F6 F7 2B 6E 0B 8D 8E ED 12 BF 51 65
  73 B7 BF A0 55 5E EE 23 B7 8F FE EE 70 EC 40 8D B8 51 A2 78 1A C6 96 72 20 B6
  19 8F 0E 85 A2 BC 42 CA A1 2C 31 93 19 92 F1 3D B8 7B ED 2E 0A C4 C0 05 42 A7
  8F 54 9F DE 18 63 E4 99 D1 F0 45 AE C9 72 BA 41 CD 5D 7A 52 39 94 D6 3D F1 21
  4A 4D 8A 4D DB FF B3 09 9F 76 FF 69 FE A0 77 AC 79 C5 19 F3 98 4C 90 00

_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to