⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 读写Smart卡加解密接口的程序
💻 C
字号:
#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <ctype.h>#include "util.h"int connect_card(struct sc_context *ctx, struct sc_card **cardp,		 int reader_id, int slot_id, int wait, int quiet){	struct sc_reader *reader;	int r;	if (wait) {		struct sc_reader *readers[16];		int slots[16];		int i, j, k, found;		unsigned int event;		for (i = k = 0; i < ctx->reader_count; i++) {			if (reader_id >= 0 && reader_id != i)				continue;			reader = ctx->reader[i];			for (j = 0; j < reader->slot_count; j++, k++) {				readers[k] = reader;				slots[k] = j;			}		}		printf("Waiting for card to be inserted...\n");		r = sc_wait_for_event(readers, slots, k,				SC_EVENT_CARD_INSERTED,				&found, &event, -1);		if (r < 0) {			fprintf(stderr,				"Error while waiting for card: %s\n",				sc_strerror(r));			return 3;		}		reader = readers[found];		slot_id = slots[found];	} else {		if (reader_id < 0)			reader_id = 0;		if (ctx->reader_count == 0) {			fprintf(stderr,				"No smart card readers configured.\n");			return 1;		}		if (reader_id >= ctx->reader_count) {			fprintf(stderr,				"Illegal reader number. "				"Only %d reader(s) configured.\n",				ctx->reader_count);			return 1;		}		reader = ctx->reader[reader_id];		slot_id = 0;		if (sc_detect_card_presence(reader, 0) <= 0) {			fprintf(stderr, "Card not present.\n");			return 3;		}	}	if (!quiet) {		fprintf(stderr, "Connecting to card in reader %s...\n",			reader->name);	}	if ((r = sc_connect_card(reader, slot_id, cardp)) < 0) {		fprintf(stderr,			"Failed to connect to card: %s\n",			sc_strerror(r));		return 1;	}	return 0;}void print_binary(FILE *f, const u8 *buf, int count){	int i;		for (i = 0; i < count; i++) {		unsigned char c = buf[i];		const char *format;		if (!isalnum(c) && !ispunct(c) && !isspace(c))			format = "\\x%02X";		else			format = "%c";		fprintf(f, format, c);	}	(void) fflush(f);}void hex_dump(FILE *f, const u8 *in, int len, const char *sep){	int i;		for (i = 0; i < len; i++) {		if (sep != NULL && i)			fprintf(f, "%s", sep);		fprintf(f, "%02X", in[i]);	}}void hex_dump_asc(FILE *f, const u8 *in, size_t count, int addr){	int lines = 0; 	while (count) {		char ascbuf[17];		int i;				if (addr >= 0) {			fprintf(f, "%08X: ", addr);			addr += 16;		}		for (i = 0; i < count && i < 16; i++) {			fprintf(f, "%02X ", *in);			if (isprint(*in))				ascbuf[i] = *in;			else				ascbuf[i] = '.';			in++;		}		count -= i;		ascbuf[i] = 0;		for (; i < 16 && lines; i++)			fprintf(f, "   ");		fprintf(f, "%s\n", ascbuf);		lines++;	}}void print_usage_and_die(void){	int i = 0;	printf("Usage: %s [OPTIONS]\nOptions:\n", app_name);	while (options[i].name) {		char buf[40], tmp[5];		const char *arg_str;				/* Skip "hidden" options */		if (option_help[i] == NULL) {			i++;			continue;		}		if (options[i].val > 0 && options[i].val < 128)			sprintf(tmp, ", -%c", options[i].val);		else			tmp[0] = 0;		switch (options[i].has_arg) {		case 1:			arg_str = " <arg>";			break;		case 2:			arg_str = " [arg]";			break;		default:			arg_str = "";			break;		}		sprintf(buf, "--%s%s%s", options[i].name, tmp, arg_str);		if (strlen(buf) > 29) {			printf("  %s\n", buf);			buf[0] = '\0';		}		printf("  %-29s %s\n", buf, option_help[i]);		i++;	}	exit(2);}const char * acl_to_str(const struct sc_acl_entry *e){	static char line[80], buf[10];	unsigned int acl;		if (e == NULL)		return "N/A";	line[0] = 0;	while (e != NULL) {		acl = e->method;		switch (acl) {		case SC_AC_UNKNOWN:			return "N/A";		case SC_AC_NEVER:			return "NEVR";		case SC_AC_NONE:			return "NONE";		case SC_AC_CHV:			strcpy(buf, "CHV");			if (e->key_ref != SC_AC_KEY_REF_NONE)				sprintf(buf + 3, "%d", e->key_ref);			break;		case SC_AC_TERM:			strcpy(buf, "TERM");			break;		case SC_AC_PRO:			strcpy(buf, "PROT");			break;		case SC_AC_AUT:			strcpy(buf, "AUTH");			if (e->key_ref != SC_AC_KEY_REF_NONE)				sprintf(buf + 4, "%d", e->key_ref);			break;		default:			strcpy(buf, "????");			break;		}		strcat(line, buf);		strcat(line, " ");		e = e->next;	}	line[strlen(line)-1] = 0; /* get rid of trailing space */	return line;}voidfatal(const char *fmt, ...){	va_list	ap;	va_start(ap, fmt);	fprintf(stderr, "error: ");	vfprintf(stderr, fmt, ap);	fprintf(stderr, "\nAborting.\n");	va_end(ap);	exit(1);}voiderror(const char *fmt, ...){	va_list	ap;	va_start(ap, fmt);	fprintf(stderr, "error: ");	vfprintf(stderr, fmt, ap);	fprintf(stderr, "\n");	va_end(ap);}voidwarn(const char *fmt, ...){	va_list	ap;	va_start(ap, fmt);	fprintf(stderr, "warning: ");	vfprintf(stderr, fmt, ap);	fprintf(stderr, "\n");	va_end(ap);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -