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