UNPKG

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
"use strict"; /** * 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