This commit implements every algorithm I have played with so far. It also allows for you to switch which algorithm you want to use at runtime.
66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
import { readFileSync } from 'fs';
|
|
import { load } from 'js-toml';
|
|
import z from 'zod';
|
|
import { ChallengeAlgorithm, ChallengeStrategy } from "@impost/lib";
|
|
|
|
const SHA256Schema = z.discriminatedUnion("strategy", [
|
|
z.object({
|
|
algorithm: z.literal(ChallengeAlgorithm.SHA256),
|
|
strategy: z.literal(ChallengeStrategy.LeadingZeroes),
|
|
leading_zeroes: z.object({
|
|
difficulty: z.number().int().min(1).max(64),
|
|
}),
|
|
}),
|
|
z.object({
|
|
algorithm: z.literal(ChallengeAlgorithm.SHA256),
|
|
strategy: z.literal(ChallengeStrategy.TargetNumber),
|
|
target_number: z.object({
|
|
max_number: z.number().int().min(1).max(100_000),
|
|
}),
|
|
}),
|
|
]);
|
|
|
|
const Argon2idSchema = z.discriminatedUnion("strategy", [
|
|
z.object({
|
|
algorithm: z.literal(ChallengeAlgorithm.Argon2id),
|
|
strategy: z.literal(ChallengeStrategy.LeadingZeroes),
|
|
leading_zeroes: z.object({
|
|
difficulty: z.number().int().min(1).max(64),
|
|
}),
|
|
}),
|
|
z.object({
|
|
algorithm: z.literal(ChallengeAlgorithm.Argon2id),
|
|
strategy: z.literal(ChallengeStrategy.TargetNumber),
|
|
target_number: z.object({
|
|
max_number: z.number().int().min(1).max(100_000),
|
|
}),
|
|
}),
|
|
]);
|
|
|
|
const KCTFSchema = z.object({
|
|
algorithm: z.literal(ChallengeAlgorithm.kCTF),
|
|
kctf: z.object({
|
|
difficulty: z.number().int().min(1),
|
|
}),
|
|
});
|
|
|
|
export const Config = z.union([SHA256Schema, Argon2idSchema, KCTFSchema]);
|
|
|
|
export type Config = z.infer<typeof Config>;
|
|
|
|
export let config: Config;
|
|
|
|
try {
|
|
config = Config.parse(load(readFileSync('./config.toml', 'utf-8')));
|
|
} catch (error: any) {
|
|
if (error instanceof z.ZodError) {
|
|
console.error("Failed to parse config:");
|
|
for (const issue of error.issues) {
|
|
console.error(issue.message, issue.path);
|
|
}
|
|
} else {
|
|
console.error("Failed to parse config:", error);
|
|
}
|
|
process.exit(1);
|
|
}
|