Crypt-SecurID

 view release on metacpan or  search on metacpan

securid.cpp  view on Meta::CPAN

	FILE *fi;
	char *s;
	int i, r;

	// open file
	fi = fopen(f, "rt");
	if (fi == NULL) {
		sprintf(errmsg, "Cannot open file '%s' for reading.", f);
		return 0;
	}

	// process serial number
	serial = strtoul(sernum, &s, 16); // base-16 decimal number
	if (*s) {
		sprintf(errmsg, "%s: %s.",
			"Bad serial number",
			"must be sequence of decimal digits"
		);
		return 0;
	}
	serial = sid_bswap32(serial);

	// scan file for the given serial number
	for (;;) {
		if ((r = read_line(fi, data)) < 0) break; // eof
		if (!r) return 0; // reading error
		curser = data->D[1]; 
		if ((r = read_line(fi, data)) < 0) { // eof
			sprintf(errmsg, "No matching key line for serial number");
			return 0;
		}
		if (!r) return 0; // reading error
		if (curser == serial) {
			keyoct.Q[0] = data->Q[0];
			break;
		}
	}
	fclose(fi);

	if (curser != serial) {
		sprintf(errmsg, "Token not found corresponding to serial number.");
		return 0;
	}

	// if all is good, form the hexkey and return
	for (i = 0; i < 8; i++)
		sprintf(&hexkey[2*i], "%02x", keyoct.B[i]);
	return 1;
}

// export key to a secret token file
int SecurID::exportToken(const char *f, const char *sernum) {
	struct stat statbuf;
	FILE *fo;
	long i, serial;
	SID_OCTET data[5];
	char outs[80], *s;
	unsigned int l;

	// stat and bail if file exists
	if (!stat(f, &statbuf)) {
		sprintf(errmsg, "Cannot export to existing file: '%s'.", f);
		return 0;
	}

	// open file, creating if necessary
	fo = fopen(f, "w+");
	if (fo == NULL) {
		sprintf(errmsg, "Cannot create token secret file: '%s'.", f);
		return 0;
	}

	// process serial number
	serial = strtoul(sernum, &s, 16); // base-16 decimal number
	if (*s) {
		sprintf(errmsg, "%s: %s.",
			"Bad serial number",
			"must be sequence of decimal digits"
		);
		return 0;
	}
	serial = sid_bswap32(serial);
	memset(data, 0, sizeof(data));
	data->D[1] = serial;

	// write serial number line
	for (i = 0; i < 9; i++) // pseudo-encrypt
		data->D[i] = sid_ror32(data->D[i] ^ 0x88BF88BF, 16);
	for (i = 0; i < 38; i++) // encode as hex
		sprintf(&outs[2*i], "%02x", data->B[i]);
	l = fprintf(fo, "%s\n", outs); // write line of output
	if (l != strlen(outs) + 1) {
		sprintf(errmsg, "Unknown problem printing to file.");
		return 0;
	}

	// process key 
	memset(data, 0, sizeof(data));
	for (i = 0; i < 2; i++)
		data->D[i] = keyoct.D[i];

	// write key line
	for (i = 0; i < 9; i++) // pseudo-encrypt
		data->D[i] = sid_ror32(data->D[i] ^ 0x88BF88BF, 16);
	for (i = 0; i < 38; i++) // encode as hex
		sprintf(&outs[2*i], "%02x", data->B[i]);
	l = fprintf(fo, "%s\n", outs); // write line of output
	if (l != strlen(outs) + 1) {
		sprintf(errmsg, "Unknown problem printing.");
		return 0;
	}
	fclose(fo);

	return 1;
}

// return human readable string error message
const char *SecurID::error() { return errmsg; }

/*
 * private members functions (utilities)



( run in 2.129 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )