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 )