# HG changeset patch # User Mychaela Falconia # Date 1615684163 0 # Node ID f7a03e53bb2cf3a847f6586c620967731cafd99a # Parent f4479a0d4ceabe8fdbb9498d7e716bb55cf466d1 fc-pcsc-atr ported over diff -r f4479a0d4cea -r f7a03e53bb2c .hgignore --- a/.hgignore Sun Mar 14 00:45:15 2021 +0000 +++ b/.hgignore Sun Mar 14 01:09:23 2021 +0000 @@ -2,4 +2,5 @@ \.[oa]$ +^pcsc/fc-pcsc-atr$ ^pcsc/fc-pcsc-list$ diff -r f4479a0d4cea -r f7a03e53bb2c pcsc/Makefile --- a/pcsc/Makefile Sun Mar 14 00:45:15 2021 +0000 +++ b/pcsc/Makefile Sun Mar 14 01:09:23 2021 +0000 @@ -1,15 +1,19 @@ CC= gcc CFLAGS= -O2 -I/usr/include/PCSC -PROGS= fc-pcsc-list +PROGS= fc-pcsc-atr fc-pcsc-list INSTALL_PREFIX= /opt/freecalypso INSTBIN=${INSTALL_PREFIX}/bin +ATR_OBJS= atrfunc.o atrmain.o connect.o context.o rdselect.o LIST_OBJS= context.o rdlist.o all: ${PROGS} +fc-pcsc-atr: ${ATR_OBJS} + ${CC} ${CFLAGS} -o $@ ${ATR_OBJS} -lpcsclite + fc-pcsc-list: ${LIST_OBJS} ${CC} ${CFLAGS} -o $@ ${LIST_OBJS} -lpcsclite diff -r f4479a0d4cea -r f7a03e53bb2c pcsc/atrfunc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pcsc/atrfunc.c Sun Mar 14 01:09:23 2021 +0000 @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +#include + +extern SCARDCONTEXT hContext; +extern SCARDHANDLE hCard; + +#define MAX_ATR_BYTES 33 + +retrieve_atr(decor) +{ + u_char atrbuf[MAX_ATR_BYTES]; + LONG rv; + DWORD dwAttrLen; + unsigned n; + + dwAttrLen = MAX_ATR_BYTES; + rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, atrbuf, &dwAttrLen); + if (rv != SCARD_S_SUCCESS) { + fprintf(stderr, "SCardGetAttrib for ATR: %s\n", + pcsc_stringify_error(rv)); + SCardReleaseContext(hContext); + exit(1); + } + if (decor) + printf("ATR:"); + for (n = 0; n < dwAttrLen; n++) { + if (decor) + putchar(' '); + printf("%02X", atrbuf[n]); + } + putchar('\n'); + return(0); +} diff -r f4479a0d4cea -r f7a03e53bb2c pcsc/atrmain.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pcsc/atrmain.c Sun Mar 14 01:09:23 2021 +0000 @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +extern SCARDCONTEXT hContext; +extern SCARDHANDLE hCard; +extern char *selected_reader; + +main(argc, argv) + char **argv; +{ + parse_reader_select_opt(argc, argv); + setup_pcsc_context(); + get_reader_list(); + select_reader_by_num(); + printf("Card reader name: %s\n", selected_reader); + connect_to_card(); + retrieve_atr(1); + SCardDisconnect(hCard, SCARD_UNPOWER_CARD); + SCardReleaseContext(hContext); + exit(0); +} diff -r f4479a0d4cea -r f7a03e53bb2c pcsc/connect.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pcsc/connect.c Sun Mar 14 01:09:23 2021 +0000 @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include + +extern SCARDCONTEXT hContext; +extern char *reader_list; +extern unsigned select_reader_num; + +SCARDHANDLE hCard; +char *selected_reader; + +select_reader_by_num() +{ + char *cp; + unsigned num; + + for (cp = reader_list, num = 0; *cp; num++) { + if (num == select_reader_num) { + selected_reader = cp; + return(0); + } + cp += strlen(cp) + 1; + } + fprintf(stderr, + "error: requested reader #%u, but only %u reader(s) found\n", + select_reader_num, num); + SCardReleaseContext(hContext); + exit(1); +} + +connect_to_card() +{ + LONG rv; + DWORD dwActiveProtocol; + + rv = SCardConnect(hContext, selected_reader, SCARD_SHARE_EXCLUSIVE, + SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol); + if (rv != SCARD_S_SUCCESS) { + fprintf(stderr, "SCardConnect: %s\n", pcsc_stringify_error(rv)); + SCardReleaseContext(hContext); + exit(1); + } + return(0); +} diff -r f4479a0d4cea -r f7a03e53bb2c pcsc/rdselect.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pcsc/rdselect.c Sun Mar 14 01:09:23 2021 +0000 @@ -0,0 +1,25 @@ +#include +#include +#include + +unsigned select_reader_num; + +parse_reader_select_opt(argc, argv) + char **argv; +{ + extern char *optarg; + int c; + + while ((c = getopt(argc, argv, "p:")) != EOF) { + switch (c) { + case 'p': + select_reader_num = atoi(optarg); + continue; + case '?': + default: + /* error msg already printed */ + exit(1); + } + } + return(0); +}