supa-seed
Version:
A constraint-aware, framework-agnostic database seeding framework with deep PostgreSQL business logic discovery and MakerKit integration support
116 lines • 3.97 kB
JavaScript
;
/**
* Crypto Utilities for MFA and Security Testing
* Provides TOTP generation, backup codes, and crypto functions for testing
* Part of Task 1.2: Add MFA Factor Support
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateTOTPSecret = generateTOTPSecret;
exports.generateTOTPCode = generateTOTPCode;
exports.generateBackupCodes = generateBackupCodes;
exports.isValidTOTPCode = isValidTOTPCode;
exports.isValidBackupCode = isValidBackupCode;
exports.generateSecureString = generateSecureString;
exports.hashPassword = hashPassword;
exports.generateTestPhoneNumber = generateTestPhoneNumber;
exports.generateTestJWT = generateTestJWT;
exports.generateChallengeId = generateChallengeId;
exports.generateFactorId = generateFactorId;
const crypto_1 = require("crypto");
/**
* Generate a secure TOTP secret
*/
function generateTOTPSecret(length = 32) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; // Base32 characters
let secret = '';
for (let i = 0; i < length; i++) {
secret += chars.charAt(Math.floor(Math.random() * chars.length));
}
return secret;
}
/**
* Generate TOTP code for testing
* This is a simplified implementation for testing purposes
*/
function generateTOTPCode(secret, timestamp) {
// Simplified TOTP algorithm for testing
// In production, use a proper TOTP library like 'otplib'
const timeStep = Math.floor(timestamp / 30000); // 30-second window
const hash = (0, crypto_1.createHash)('sha1');
hash.update(secret + timeStep.toString());
const hashDigest = hash.digest('hex');
// Extract 6-digit code from hash
const offset = parseInt(hashDigest.slice(-1), 16) & 0xf;
const code = parseInt(hashDigest.substr(offset * 2, 8), 16) & 0x7fffffff;
return (code % 1000000).toString().padStart(6, '0');
}
/**
* Generate backup codes for MFA recovery
*/
function generateBackupCodes(count = 10) {
const codes = [];
for (let i = 0; i < count; i++) {
// Generate 8-character alphanumeric backup code
const code = (0, crypto_1.randomBytes)(4).toString('hex').toUpperCase();
codes.push(code);
}
return codes;
}
/**
* Validate TOTP code format
*/
function isValidTOTPCode(code) {
return /^\d{6}$/.test(code);
}
/**
* Validate backup code format
*/
function isValidBackupCode(code) {
return /^[A-F0-9]{8}$/.test(code);
}
/**
* Generate secure random string
*/
function generateSecureString(length) {
return (0, crypto_1.randomBytes)(Math.ceil(length / 2)).toString('hex').slice(0, length);
}
/**
* Hash password for testing (simple implementation)
*/
function hashPassword(password) {
return (0, crypto_1.createHash)('sha256').update(password).digest('hex');
}
/**
* Generate realistic phone number for testing
*/
function generateTestPhoneNumber(countryCode = '+1') {
const areaCode = Math.floor(Math.random() * 900) + 100; // 100-999
const exchange = Math.floor(Math.random() * 900) + 100; // 100-999
const number = Math.floor(Math.random() * 9000) + 1000; // 1000-9999
return `${countryCode}${areaCode}${exchange}${number}`;
}
/**
* Generate JWT-like token for testing
*/
function generateTestJWT(payload) {
const header = { alg: 'HS256', typ: 'JWT' };
const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64url');
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64url');
const signature = (0, crypto_1.createHash)('sha256')
.update(encodedHeader + '.' + encodedPayload + 'test-secret')
.digest('base64url');
return `${encodedHeader}.${encodedPayload}.${signature}`;
}
/**
* Generate challenge ID for MFA testing
*/
function generateChallengeId() {
return 'challenge_' + generateSecureString(16);
}
/**
* Generate factor ID for MFA testing
*/
function generateFactorId(type) {
return `${type}_` + generateSecureString(16);
}
//# sourceMappingURL=crypto-utils.js.map