import { defineEventHandler } from 'h3' import { config } from '~~/server/utils/config'; import { generate_challenge, kCTFChallengeConfig, Argon2ChallengeConfig, SHA256ChallengeConfig } from '@impost/lib/validator'; import { ChallengeStrategy, ChallengeAlgorithm } from '@impost/lib'; import { CHALLENGE_TIMEOUT_MS, outstandingChallenges } from '~~/server/utils/pow'; export default defineEventHandler(async () => { let challenge_config; switch (config.algorithm) { case ChallengeAlgorithm.SHA256: switch (config.strategy) { case ChallengeStrategy.LeadingZeroes: challenge_config = { algorithm: ChallengeAlgorithm.SHA256, strategy: ChallengeStrategy.LeadingZeroes, difficulty: config.leading_zeroes.difficulty, parameters: { expires_at: Date.now() + CHALLENGE_TIMEOUT_MS }, } as SHA256ChallengeConfig; break; case ChallengeStrategy.TargetNumber: challenge_config = { algorithm: ChallengeAlgorithm.SHA256, strategy: ChallengeStrategy.TargetNumber, difficulty: config.target_number.max_number, parameters: { expires_at: Date.now() + CHALLENGE_TIMEOUT_MS }, } as SHA256ChallengeConfig; break; } break; case ChallengeAlgorithm.Argon2id: switch (config.strategy) { case ChallengeStrategy.LeadingZeroes: challenge_config = { algorithm: ChallengeAlgorithm.Argon2id, strategy: ChallengeStrategy.LeadingZeroes, difficulty: config.leading_zeroes.difficulty, parameters: { expires_at: Date.now() + CHALLENGE_TIMEOUT_MS }, } as Argon2ChallengeConfig; break; case ChallengeStrategy.TargetNumber: challenge_config = { algorithm: ChallengeAlgorithm.Argon2id, strategy: ChallengeStrategy.TargetNumber, difficulty: config.target_number.max_number, parameters: { expires_at: Date.now() + CHALLENGE_TIMEOUT_MS }, } as Argon2ChallengeConfig; break; } break; case ChallengeAlgorithm.kCTF: challenge_config = { algorithm: ChallengeAlgorithm.kCTF, difficulty: config.kctf.difficulty, parameters: { expires_at: Date.now() + CHALLENGE_TIMEOUT_MS }, } as kCTFChallengeConfig; break; } let challenge = await generate_challenge(challenge_config); if (challenge === null) { throw createError({ statusCode: 500, statusMessage: 'Failed to generate challenge' }); } outstandingChallenges.set(challenge.salt, { challenge, timeout: setTimeout(() => { console.log("Challenge timed out:", challenge.salt); outstandingChallenges.delete(challenge.salt); }, CHALLENGE_TIMEOUT_MS) }); return { challenge, } })