int check_2pay_sys(unsigned char *rsp, int lr) { char *MC_RID = "\xA0\x00\x00\x00\x04"; /* MasterCard RID */ char *MC_UK_RID = "\xA0\x00\x00\x00\x05"; /* MasterCard UK RID */ char *VISA_RID = "\xA0\x00\x00\x00\x03"; /* Visa RID */ char *AMEX_RID = "\xA0\x00\x00\x00\x25"; /* AMEX RID */ char *DISCOVER_RID = "\xA0\x00\x00\x03\x24"; /* AMEX RID */ char *GIROGO_RID = "\xD2\x76\x00\x00\x25"; /* Geldkarte/GiroGo RID */ unsigned char *fci_issuer_discret_data; int fci_issuer_discret_data_len = 0; unsigned char *aid = NULL; int aid_len; unsigned char *app_template = NULL; int app_template_len = 0; unsigned char *tmp_aid = NULL; int tmp_aid_len; unsigned char *app_label = NULL; int app_label_len = 0; int priority = 15; unsigned char *prio = NULL; int prio_len; unsigned char *d; fci_issuer_discret_data = asn1Find(rsp, "\x6F\xA5\xBF\x0C", 3); if (fci_issuer_discret_data == NULL) return -1; asn1Tag(&fci_issuer_discret_data); fci_issuer_discret_data_len = asn1Length(&fci_issuer_discret_data); while (fci_issuer_discret_data_len > 4) { app_template = asn1Find(fci_issuer_discret_data, "\x61", 1); if (app_template == NULL) break; asn1Tag(&app_template); app_template_len = asn1Length(&app_template); d = app_template; /* Decode the AID */ tmp_aid = asn1Find(d, "\x4F", 1); if (tmp_aid == NULL) return -1; asn1Tag(&tmp_aid); tmp_aid_len = asn1Length(&tmp_aid); d = tmp_aid + tmp_aid_len; /* Decode the application label */ app_label = asn1Find(d, "\x50", 1); if (app_label != NULL) { asn1Tag(&app_label); app_label_len = asn1Length(&app_label); d = app_label + app_label_len; } /* Decode the priority */ prio = asn1Find(d, "\x87", 1); if (prio != NULL) { asn1Tag(&prio); prio_len = asn1Length(&prio); d = prio + prio_len; if (*prio < priority) { priority = *prio; aid = tmp_aid; aid_len = tmp_aid_len; } } else { aid = tmp_aid; aid_len = tmp_aid_len; } fci_issuer_discret_data_len -= app_template_len; fci_issuer_discret_data = d; } if (aid == NULL) return -1; /* We need at least the first five bytes of the AID (RID) */ if (aid_len < 5) return -1; if ((memcmp(aid, MC_RID, 5) == 0) || (memcmp(aid, MC_UK_RID, 5) == 0)) return 1; else if (memcmp(aid, VISA_RID, 5) == 0) return 2; else if (memcmp(aid, AMEX_RID, 5) == 0) return 3; else if (memcmp(aid, DISCOVER_RID, 5) == 0) return 4; else if (memcmp(aid, GIROGO_RID, 5) == 0) return 5; /* AID (RID) not supported */ return -1; }
int starcosDeterminePinUseCounter(struct p11Token_t *token, unsigned char recref, int *useCounter, int *lifeCycle) { int rc,ucpathlen; unsigned short SW1SW2; unsigned char rec[256], *p,*fid,*ucpath; FUNC_CALLED(); if (token->info.firmwareVersion.minor >= 5) { fid = (unsigned char *)"\x00\x13"; // EF.KEYD ucpath = (unsigned char *)"\x30\x7B\xA4\x9F\x22"; ucpathlen = 4; // 4 Tags (not bytes) } else { fid = (unsigned char *)"\x00\x15"; // EF.PWDD ucpath = (unsigned char *)"\x30\x7B\x9F\x22"; ucpathlen = 3; // 3 Tags (not bytes) } // Select EF rc = transmitAPDU(token->slot, 0x00, 0xA4, 0x02, 0x0C, 2, fid, 0, NULL, 0, &SW1SW2); if (rc < 0) { FUNC_FAILS(rc, "transmitAPDU failed"); } if (SW1SW2 != 0x9000) { FUNC_FAILS(-1, "File not found"); } // Read record, but leave 3 bytes to add encapsulating 30 81 FF later rc = transmitAPDU(token->slot, 0x00, 0xB2, recref, 0x04, 0, NULL, 0, rec, sizeof(rec) - 3, &SW1SW2); if (rc < 0) { FUNC_FAILS(rc, "transmitAPDU failed"); } if (SW1SW2 != 0x9000) { FUNC_FAILS(-1, "Record not found"); } rc = asn1Encap(0x30, rec, rc); rc = (int)asn1Validate(rec, rc); if (rc > 0) { FUNC_FAILS(rc, "ASN.1 structure invalid"); } *useCounter = 0; p = asn1Find(rec, ucpath, ucpathlen); if (p) { asn1Tag(&p); asn1Length(&p); *useCounter = (*p == 0xFF ? 0 : *p); } p = asn1Find(rec, (unsigned char *)"\x30\x8A", 2); if (p) { asn1Tag(&p); asn1Length(&p); *lifeCycle = *p; } FUNC_RETURNS(CKR_OK); }