Files
impost/example-app/server/api/pow/challenge.get.ts
2025-11-28 14:53:06 -06:00

77 lines
3.3 KiB
TypeScript

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.Argon2:
switch (config.strategy) {
case ChallengeStrategy.LeadingZeroes:
challenge_config = {
algorithm: ChallengeAlgorithm.Argon2,
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.Argon2,
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,
}
})