UNPKG

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
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();