// Read out the lowest 255 bytes of data of a dumb memory-only smart card // using the PCSC Lite framework and an Athena USB smart card reader device // on Mac OS X. // // cc -Wall -o cardtest -framework PCSC cardtest.c // // Written by Marc Liyanage // #include #include #include #include #include #define RCVBUF_SIZE 500 int main() { SCARDCONTEXT hContext; SCARDHANDLE hCard; int i; long rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext); // try to connect unsigned long dwActiveProtocol; rv = SCardConnect(hContext, "AseIIIeUSB 0 0", SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol); assert(rv == SCARD_S_SUCCESS); long dwSendLength, pcbRecvLength = RCVBUF_SIZE; SCARD_IO_REQUEST pioRecvPci; SCARD_IO_REQUEST pioSendPci; pioRecvPci.dwProtocol = SCARD_PROTOCOL_RAW; pioSendPci.dwProtocol = SCARD_PROTOCOL_RAW; unsigned char pbRecvBuffer[RCVBUF_SIZE]; bzero(pbRecvBuffer, RCVBUF_SIZE); // this command would be used for smarter smart cards than not so smart memory cards :-) // char pbSendBuffer[] = {0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00}; // CLA = 0 (instruction class) // INS = 0xb0 (read binary) // P1 = 0 (desired read start address MSB = zero) // P2 = 0 (desired read start address LSB = zero) // P3 / L = 0 (desired amount of data to read, zero = default of 255 bytes) char pbSendBuffer[] = {0x00, 0xB0, 0x00, 0x00, 0x00}; dwSendLength = 5; rv = SCardTransmit(hCard, &pioSendPci, pbSendBuffer, dwSendLength, &pioRecvPci, pbRecvBuffer, &pcbRecvLength ); fprintf(stderr, "rv: %lx %s\n", rv, pcsc_stringify_error(rv)); assert(rv == SCARD_S_SUCCESS); fprintf(stderr, "rcvbuf (%ld): ", pcbRecvLength); for (i = 0; i < pcbRecvLength; i++) { unsigned char c; unsigned char s[5]; if (pbRecvBuffer[i] == 31) { sprintf(s, "^"); } else if (pbRecvBuffer[i] >= 32 && pbRecvBuffer[i] < 128) { sprintf(s, "%c", pbRecvBuffer[i]); } else { sprintf(s, "<%02x>", pbRecvBuffer[i]); } fprintf(stderr, "%s ", s); } fprintf(stderr, "\n"); SCardDisconnect(hCard, SCARD_UNPOWER_CARD); return 0; }