crypto-keygen-suite
Version:
Key generation utilities for cryptographic operations. YES I RENAMED IT. SIX STATE PROTOCOL!!! See its folder for all <3
74 lines (63 loc) • 2.29 kB
JavaScript
import { hotp, authenticator } from 'otplib';
import yargs from 'yargs/yargs';
import { hideBin } from 'yargs/helpers';
import fs from 'fs';
import base32 from 'base32.js';
const { Decoder } = base32;
function generateHOTPSecret(counter, outputFormat, secure) {
try {
const secretBase32 = authenticator.generateSecret();
const decoder = new Decoder();
const decoded = decoder.write(secretBase32).finalize();
let secret;
switch (outputFormat) {
case 'hex':
secret = Buffer.from(decoded).toString('hex');
break;
case 'raw':
secret = decoded;
break;
case 'base32':
default:
secret = secretBase32;
break;
}
const code = hotp.generate(secretBase32, counter);
console.log(`✅ HOTP Secret (${outputFormat.toUpperCase()}):`, secret);
console.log(`🔢 HOTP Code (counter=${counter}):`, code);
if (secure) {
console.log("🔒 Secure Mode Enabled: Saving secret and code to files.");
fs.writeFileSync(`hotp_secret.${outputFormat}`, secret.toString());
fs.writeFileSync(`hotp_code_${counter}.txt`, code);
}
return { secret, code };
} catch (error) {
console.error(`❌ HOTP Generation Failed: ${error.message}`);
}
}
async function main() {
const argv = yargs(hideBin(process.argv))
.option('counter', {
alias: 'c',
type: 'number',
demandOption: true,
describe: 'Counter value (integer) for HOTP code generation'
})
.option('format', {
alias: 'f',
type: 'string',
default: 'base32',
choices: ['base32', 'hex', 'raw'],
describe: 'Output format for the secret'
})
.option('secure', {
alias: 's',
type: 'boolean',
default: false,
describe: 'Save secret and code to files'
})
.argv;
generateHOTPSecret(argv.counter, argv.format, argv.secure);
}
console.log("🚀 Running HOTP generator CLI...");
main();