Major additions and fixes to core API

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
jey 2001-10-19 23:23:16 +00:00
parent f3bf3dc0b8
commit ce82fc7316
1 changed files with 23 additions and 88 deletions

View File

@ -9,115 +9,50 @@
#include "sc.h"
int main(int argc, char **argv) {
SCARDHANDLE sc_card;
SCARDCONTEXT sc_ctx;
SCARD_READERSTATE_A rgReaderStates[1];
DWORD dwState, dwProt, dwAtrLen;
DWORD dwPref;
BYTE pbAtr[MAX_ATR_SIZE];
BYTE r[MAX_BUFFER_SIZE];
LPCSTR mszGroups;
LONG rv;
DWORD reader_buf_size;
int i, reader_count;
char *p, *reader_buf;
char *readers[4];
struct sc_apdu apdu;
struct sc_context ctx;
struct sc_pkcs15_card card;
struct sc_context *ctx = NULL;
struct sc_card *card = NULL;
struct sc_pkcs15_card p15_card;
int i;
rv = SCardEstablishContext(SCARD_SCOPE_GLOBAL, "localhost", NULL, &sc_ctx);
if (rv != SCARD_S_SUCCESS) {
fprintf(stderr, "ERROR: Cannot connect to Resource Manager\n");
i = sc_establish_context(&ctx);
if (i < 0) {
printf("sc_establish_context() failed (%d)\n", i);
return 1;
}
i = sc_detect_card(ctx, 0);
fprintf(stderr, "Card %s.\n", i == 1 ? "present" : "absent");
if (i != 1) {
return 1;
}
ctx.sc_ctx = sc_ctx;
SCardListReaders(sc_ctx, NULL, NULL, (LPDWORD) &reader_buf_size);
reader_buf = (char *)malloc(sizeof(char)*reader_buf_size);
SCardListReaders(sc_ctx, mszGroups, reader_buf, (LPDWORD) &reader_buf_size);
p = reader_buf;
i = reader_count = 0;
do {
reader_count++;
readers[i] = strdup(p);
while (*p++ != 0);
p++;
} while (p < reader_buf + reader_buf_size);
for (i = 0; i < reader_count; i++)
printf("Reader %d - %s\n", i, readers[i]);
rgReaderStates[0].szReader = readers[0];
rgReaderStates[0].dwCurrentState = SCARD_STATE_EMPTY;
printf("Please insert a smartcard\n");
SCardGetStatusChange(sc_ctx, INFINITE, rgReaderStates, 1);
printf("Connecting... ");
fflush(stdout);
rv = SCardConnect(sc_ctx, readers[0],
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
&sc_card, &dwPref);
if (rv != SCARD_S_SUCCESS) {
SCardReleaseContext(sc_ctx);
fprintf(stderr, "Error connecting to reader %ld\n", rv);
i = sc_connect_card(ctx, 0, &card);
if (i != 0) {
printf("Connecting to card failed\n");
return 1;
}
printf("done.\n");
fflush(stdout);
reader_buf_size = strlen(readers[0])+1;
rv = SCardStatus(sc_card, readers[0], &reader_buf_size, &dwState,
&dwProt, pbAtr, &dwAtrLen);
if (rv != SCARD_S_SUCCESS) {
SCardDisconnect(sc_card, SCARD_UNPOWER_CARD);
SCardReleaseContext(sc_ctx);
fprintf(stderr, "Error receiving status info 0x%08X\n", (unsigned int) rv);
return 1;
}
ctx.sc_card = sc_card;
i = sc_pkcs15_init(&ctx, &card);
i = sc_pkcs15_init(card, &p15_card);
if (i != 0) {
fprintf(stderr, "PKCS#15 card init failed with %d\n", i);
SCardDisconnect(sc_card, SCARD_UNPOWER_CARD );
SCardReleaseContext( sc_ctx );
return 1;
}
i = sc_pkcs15_read_certificate(&card, 0);
i = sc_pkcs15_read_certificate(&p15_card, 0);
if (i) {
fprintf(stderr, "Certificate read failed with %d\n", i);
return 1;
}
i = sc_pkcs15_read_pin_object(&card, 1, NULL);
i = sc_pkcs15_read_pin_object(&p15_card, 1, NULL);
if (i) {
fprintf(stderr, "PIN object read failed with %d\n", i);
return 1;
}
/*
printf("Opening EF(DIR)...\n");
memcpy(r, "\x3f\x00", 2);
i = sc_select_file(&ctx, &file, r, 2, SC_SELECT_FILE_BY_FILE_ID);
if (i != 0) {
fprintf(stderr, "EF(DIR) open failed with %d\n", i);
SCardDisconnect(sc_card, SCARD_UNPOWER_CARD );
SCardReleaseContext( sc_ctx );
return 1;
}
printf("Cleaning up...\n");
sc_disconnect_card(card);
sc_destroy_context(ctx);
printf("Reading EF(DIR)...\n");
i = sc_read_binary(&ctx, 0, r, 0x60);
if (i < 0) {
fprintf(stderr, "EF(DIR) read failed with %d\n", i);
SCardDisconnect(sc_card, SCARD_UNPOWER_CARD );
SCardReleaseContext( sc_ctx );
return 1;
}
sc_print_tags(r, i);
*/
SCardDisconnect(sc_card, SCARD_UNPOWER_CARD);
SCardReleaseContext(sc_ctx);
return 0;
}