/*
 * SmartKey Demo Program
 * Copyright EUTRON 1993-2004
 */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "clink.h"

static void print_error(int err)
{
	switch (err) {
		case ST_NONE_KEY :
			printf("ST_NONE_KEY : Key Not Found\n");
			break;
		case ST_SYNT_ERR :
			printf("ST_SYNT_ERR : Syntax Error\n");
			break;
		case ST_LABEL_FAILED :
			printf("ST_LABEL_FAILED : Wrong Label\n");
			break;
		case ST_PW_DATA_FAILED :
			printf("ST_PW_DATA_FAILED : Wrong Password\n");
			break;
		case ST_HW_FAILURE :
			printf("ST_HW_FAILURE : Hardware failure\n");
			break;
		default:
			printf("%04x : Unrecognizable Status\n", err);
			break;
	}
}

int main(void)
{
	SKEY_DATA skey;
	int i;
	unsigned model;

	printf("SmartKey Demo Program\n\n");

	/* Initialize */
	memset(&skey,0,sizeof(skey));

	/* Set the Label */
	strncpy(skey.label, "SMARTKEY", LABEL_LENGTH);

	/* Locating */
	printf("Locating : ");
	skey.command = LOCATING_MODE;

	clink(&skey);
	if (skey.status != ST_OK) {
		print_error(skey.status);
		exit(EXIT_FAILURE);
	}

	printf("SmartKey found on port %d\n", (unsigned)skey.lpt);

	/* Scrambling */
	printf("Scrambling ");

	memcpy(skey.data, "12345678", SCRAMBLE_LENGTH);
	skey.command = SCRAMBLING_MODE;

	for(i=0;i<SCRAMBLE_LENGTH;++i)
		printf("%02x", (unsigned)skey.data[i]);

	printf(" : ");

	clink(&skey);
	if (skey.status != ST_OK) {
		print_error(skey.status);
		exit(EXIT_FAILURE);
	}

	for(i=0;i<SCRAMBLE_LENGTH;++i)
		printf("%02x", (unsigned)skey.data[i]);

	printf("\n");

	/* Serial */
	printf("Serial : ");
	skey.command = SERIAL_NUMBER_READING_MODE;

	clink(&skey);
	if (skey.status != ST_OK) {
		print_error(skey.status);
		exit(EXIT_FAILURE);
	}

	printf("%02x%02x%02x%02x\n", (unsigned)skey.data[3], (unsigned)skey.data[2], (unsigned)skey.data[1], (unsigned)skey.data[0]);

	/* Model */
	printf("Model : ");
	skey.command = MODEL_READING_MODE;

	clink(&skey);
	if (skey.status != ST_OK) {
		print_error(skey.status);
		exit(EXIT_FAILURE);
	}

	switch (skey.data[0]) {
		case SKEY_FX : printf("model FX"); break;
		case SKEY_PR : printf("model PR"); break;
		case SKEY_EP : printf("model EP"); break;
		case SKEY_SP : printf("model SP"); break;
		case SKEY_NET : printf("model NET"); break;
		default : printf("model unknown"); break;
	}
	switch (skey.data[1]) {
		case '0' : printf(", memory 0 byte"); break;
		case '1' : printf(", memory 64 byte"); break;
		case '2' : printf(", memory 192 byte"); break;
		case '3' : printf(", memory 416 byte"); break;
		case '4' : printf(", memory 896 byte"); break;
		default : printf(", memory unknown"); break;
	}
	printf("\n");

	/* Ext Model */
	printf("Ext Model : ");
	skey.command = EXT_MODEL_READING_MODE;

	clink(&skey);
	if (skey.status != ST_OK) {
		print_error(skey.status);
		exit(EXIT_FAILURE);
	}

	model = skey.data[0];

	switch (skey.data[0]) {
		case SKEY_FX : printf("model FX"); break;
		case SKEY_PR : printf("model PR"); break;
		case SKEY_EP : printf("model EP"); break;
		case SKEY_SP : printf("model SP"); break;
		case SKEY_NET : printf("model NET"); break;
		default : printf("model unknown"); break;
	}
	switch (skey.data[1]) {
		case '0' : printf(", memory 0 byte"); break;
		case '1' : printf(", memory 64 byte"); break;
		case '2' : printf(", memory 192 byte"); break;
		case '3' : printf(", memory 416 byte"); break;
		case '4' : printf(", memory 896 byte"); break;
		default : printf(", memory unknown"); break;
	}
	switch (skey.data[2]) {
		case 0 : printf(", type A"); break;
		case 1 : printf(", type B"); break;
		case 2 : printf(", type ASIC"); break;
		case 3 : printf(", type USB"); break;
		default : printf(", type unknown"); break;
	}
	printf("\n");

	/* set the password */
	strncpy(skey.password, "EUTRON", PASSWORD_LENGTH);

	if (model == SKEY_EP || model == SKEY_SP || model == SKEY_NET) {

		/* Fix */
		printf("Fix : ");
		skey.command = FIX_READING_MODE;

		clink(&skey);
		if (skey.status != ST_OK) {
			print_error(skey.status);
			exit(EXIT_FAILURE);
		}

		printf("%s\n", skey.data[0]!=0 ? "yes" : "no" );
	}

	if (model == SKEY_EP || model == SKEY_SP || model == SKEY_NET) {

		/* Fail Counter */
		printf("Fail Counter : ");
		skey.command = FAIL_COUNTER_READING_MODE;

		clink(&skey);
		if (skey.status != ST_OK) {
			print_error(skey.status);
			exit(EXIT_FAILURE);
		}

		printf("%d\n",skey.fail_counter);
	}

	if (model == SKEY_PR || model == SKEY_EP || model == SKEY_SP || model == SKEY_NET) {

		/* Reading */
		printf("Reading: ");

		skey.command = READING_MODE;

		clink(&skey);
		if (skey.status != ST_OK) {
			print_error(skey.status);
			exit(EXIT_FAILURE);
		}

		for(i=0;i<DATA_LENGTH;++i)
			if (skey.data[i] >= 32 && skey.data[i] <= 127)
				printf("%c", (char)skey.data[i]);
			else
				printf(" ");

		printf("\n");

		/* Reading */
		printf("Writing: ");

		skey.command = WRITING_MODE;
		memset(skey.data,0,DATA_LENGTH);
		strncpy(skey.data,"SECURITY DATA",DATA_LENGTH);

		clink(&skey);
		if (skey.status != ST_OK) {
			print_error(skey.status);
			exit(EXIT_FAILURE);
		}

		for(i=0;i<DATA_LENGTH;++i)
			if (skey.data[i] >= 32 && skey.data[i] <= 127)
				printf("%c", (char)skey.data[i]);
			else
				printf(" ");

		printf("\n");
	}

	return EXIT_SUCCESS;
}