ribaunt 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +32 -7
- package/dist/cjs/index.d.ts +59 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +340 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/solver.d.ts +2 -2
- package/dist/cjs/solver.d.ts.map +1 -1
- package/dist/cjs/solver.js +30 -24
- package/dist/cjs/solver.js.map +1 -1
- package/dist/cjs/widget-react.d.ts +2 -0
- package/dist/cjs/widget-react.d.ts.map +1 -1
- package/dist/cjs/widget-react.js +38 -12
- package/dist/cjs/widget-react.js.map +1 -1
- package/dist/cjs/widget.d.ts +6 -0
- package/dist/cjs/widget.d.ts.map +1 -1
- package/dist/cjs/widget.js +114 -22
- package/dist/cjs/widget.js.map +1 -1
- package/dist/index.d.ts +30 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +194 -31
- package/dist/index.js.map +1 -1
- package/dist/solver.d.ts +2 -2
- package/dist/solver.d.ts.map +1 -1
- package/dist/solver.js +30 -24
- package/dist/solver.js.map +1 -1
- package/dist/widget-react.d.ts +2 -0
- package/dist/widget-react.d.ts.map +1 -1
- package/dist/widget-react.js +38 -12
- package/dist/widget-react.js.map +1 -1
- package/dist/widget.d.ts +6 -0
- package/dist/widget.d.ts.map +1 -1
- package/dist/widget.js +114 -22
- package/dist/widget.js.map +1 -1
- package/package.json +10 -7
- package/scripts/prepare-cjs.mjs +11 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -8,10 +8,6 @@ exports.solveChallenge = solveChallenge;
|
|
|
8
8
|
exports.verifySolution = verifySolution;
|
|
9
9
|
const crypto_1 = __importDefault(require("crypto"));
|
|
10
10
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
11
|
-
const secret = process.env.RIBAUNT_SECRET;
|
|
12
|
-
if (!secret) {
|
|
13
|
-
throw new Error('RIBAUNT_SECRET environment variable is not set!');
|
|
14
|
-
}
|
|
15
11
|
function generateChallenge(length = 8) {
|
|
16
12
|
const buffer = crypto_1.default.randomBytes(length);
|
|
17
13
|
return buffer.toString('base64').slice(0, length);
|
|
@@ -23,8 +19,15 @@ function createChallengePayload(difficulty, ttlSeconds) {
|
|
|
23
19
|
expires: Math.floor(Date.now() / 1000) + ttlSeconds,
|
|
24
20
|
};
|
|
25
21
|
}
|
|
22
|
+
function getSecret() {
|
|
23
|
+
const secret = process.env.RIBAUNT_SECRET;
|
|
24
|
+
if (!secret) {
|
|
25
|
+
throw new Error('RIBAUNT_SECRET environment variable is not set!');
|
|
26
|
+
}
|
|
27
|
+
return secret;
|
|
28
|
+
}
|
|
26
29
|
function signChallenge(payload) {
|
|
27
|
-
return jsonwebtoken_1.default.sign(payload,
|
|
30
|
+
return jsonwebtoken_1.default.sign(payload, getSecret());
|
|
28
31
|
}
|
|
29
32
|
function assertValidAmount(amount) {
|
|
30
33
|
if (!Number.isFinite(amount)) {
|
|
@@ -36,6 +39,26 @@ function assertValidAmount(amount) {
|
|
|
36
39
|
}
|
|
37
40
|
return normalized;
|
|
38
41
|
}
|
|
42
|
+
function assertValidDifficulty(difficulty) {
|
|
43
|
+
if (!Number.isFinite(difficulty)) {
|
|
44
|
+
throw new Error('Challenge difficulty must be a finite number');
|
|
45
|
+
}
|
|
46
|
+
const normalized = Math.floor(difficulty);
|
|
47
|
+
if (normalized < 1) {
|
|
48
|
+
throw new Error('Challenge difficulty must be at least 1');
|
|
49
|
+
}
|
|
50
|
+
return normalized;
|
|
51
|
+
}
|
|
52
|
+
function assertValidTtl(ttlSeconds) {
|
|
53
|
+
if (!Number.isFinite(ttlSeconds)) {
|
|
54
|
+
throw new Error('Challenge TTL must be a finite number');
|
|
55
|
+
}
|
|
56
|
+
const normalized = Math.floor(ttlSeconds);
|
|
57
|
+
if (normalized < 1) {
|
|
58
|
+
throw new Error('Challenge TTL must be at least 1 second');
|
|
59
|
+
}
|
|
60
|
+
return normalized;
|
|
61
|
+
}
|
|
39
62
|
function createSingleChallenge(difficulty, ttlSeconds) {
|
|
40
63
|
const payload = createChallengePayload(difficulty, ttlSeconds);
|
|
41
64
|
return signChallenge(payload);
|
|
@@ -49,8 +72,10 @@ function createSingleChallenge(difficulty, ttlSeconds) {
|
|
|
49
72
|
* @returns An array of JWT challenge tokens
|
|
50
73
|
*/
|
|
51
74
|
function createChallenge(difficulty = 5, amount = 4, ttlSeconds = 30) {
|
|
75
|
+
const normalizedDifficulty = assertValidDifficulty(difficulty);
|
|
52
76
|
const normalizedAmount = assertValidAmount(amount);
|
|
53
|
-
const
|
|
77
|
+
const normalizedTtl = assertValidTtl(ttlSeconds);
|
|
78
|
+
const challenges = Array.from({ length: normalizedAmount }, () => createSingleChallenge(normalizedDifficulty, normalizedTtl));
|
|
54
79
|
return challenges;
|
|
55
80
|
}
|
|
56
81
|
function solveSingleChallenge(token) {
|
|
@@ -81,7 +106,7 @@ function verifySingleSolution(token, nonce) {
|
|
|
81
106
|
return false;
|
|
82
107
|
}
|
|
83
108
|
try {
|
|
84
|
-
const payload = jsonwebtoken_1.default.verify(token,
|
|
109
|
+
const payload = jsonwebtoken_1.default.verify(token, getSecret());
|
|
85
110
|
const now = Math.floor(Date.now() / 1000);
|
|
86
111
|
if (payload.expires < now)
|
|
87
112
|
return false;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export type ChallengeToken = string;
|
|
2
|
+
export interface ChallengeSolution {
|
|
3
|
+
nonce: string;
|
|
4
|
+
hash: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ReplayStore {
|
|
7
|
+
consume(jti: string, expiresAt: number): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
export type ReplayPreventionMode = 'disabled' | 'local' | 'remote';
|
|
10
|
+
export interface VerifySolutionOptions {
|
|
11
|
+
replayPrevention?: ReplayPreventionMode;
|
|
12
|
+
replayStore?: ReplayStore;
|
|
13
|
+
debug?: boolean;
|
|
14
|
+
onWarning?: (warning: VerifyWarning) => void;
|
|
15
|
+
}
|
|
16
|
+
export type VerifyWarningReason = 'invalid-token' | 'expired-token' | 'invalid-solution' | 'replay-detected' | 'configuration-error';
|
|
17
|
+
export interface VerifyWarning {
|
|
18
|
+
reason: VerifyWarningReason;
|
|
19
|
+
message: string;
|
|
20
|
+
error?: unknown;
|
|
21
|
+
}
|
|
22
|
+
export interface SolveChallengeOptions {
|
|
23
|
+
maxIterations?: number;
|
|
24
|
+
maxDurationMs?: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class LocalReplayStore implements ReplayStore {
|
|
27
|
+
private usedTokens;
|
|
28
|
+
consume(jti: string, expiresAt: number): Promise<boolean>;
|
|
29
|
+
private cleanup;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creates one or more PoW challenges and returns them as signed JWT tokens.
|
|
33
|
+
*
|
|
34
|
+
* @param difficulty - Number of leading zeros required in the hash (default 5)
|
|
35
|
+
* @param amount - Number of challenges to create (default 4)
|
|
36
|
+
* @param ttlSeconds - Time to live for each challenge in seconds (default 30)
|
|
37
|
+
* @returns An array of JWT challenge tokens
|
|
38
|
+
*/
|
|
39
|
+
export declare function createChallenge(difficulty?: number, amount?: number, ttlSeconds?: number): ChallengeToken[];
|
|
40
|
+
/**
|
|
41
|
+
* Solves one or more PoW challenges encoded in JWT tokens.
|
|
42
|
+
*
|
|
43
|
+
* @param token - The JWT challenge token or an array of tokens
|
|
44
|
+
* @param options - Optional guardrails for test/debug usage (`maxIterations`, `maxDurationMs`)
|
|
45
|
+
* @returns The nonce/hash pair for single input or an array of them for multiple tokens
|
|
46
|
+
*/
|
|
47
|
+
export declare function solveChallenge(token: ChallengeToken): ChallengeSolution | undefined;
|
|
48
|
+
export declare function solveChallenge(token: ChallengeToken, options?: SolveChallengeOptions): ChallengeSolution | undefined;
|
|
49
|
+
export declare function solveChallenge(token: ChallengeToken[]): ChallengeSolution[] | undefined;
|
|
50
|
+
export declare function solveChallenge(token: ChallengeToken[], options?: SolveChallengeOptions): ChallengeSolution[] | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Verifies a PoW solution returned by the client.
|
|
53
|
+
*
|
|
54
|
+
* @param token - The original JWT issued as the challenge (single token or array of tokens)
|
|
55
|
+
* @param nonce - The nonce/answer submitted by the client (single nonce, array of nonces, or array of solution objects)
|
|
56
|
+
* @returns true only if every provided solution is valid; otherwise false
|
|
57
|
+
*/
|
|
58
|
+
export declare function verifySolution(token: ChallengeToken | ChallengeToken[], nonce: number | string | Array<number | string> | ChallengeSolution | ChallengeSolution[], options?: VerifySolutionOptions): Promise<boolean>;
|
|
59
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,iBAAiB,GACjB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,UAAU,CAA6B;IAEzC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/D,OAAO,CAAC,OAAO;CAShB;AAsMD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,UAAU,GAAE,MAAU,EACtB,MAAM,GAAE,MAAU,EAClB,UAAU,GAAE,MAAW,GACtB,cAAc,EAAE,CAUlB;AA0FD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,GAAG,SAAS,CAAC;AACrF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,iBAAiB,GAAG,SAAS,CAAC;AACjC,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,GAAG,SAAS,CAAC;AACzF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,iBAAiB,EAAE,GAAG,SAAS,CAAC;AAwBnC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,GAAG,cAAc,EAAE,EACxC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,iBAAiB,GAAG,iBAAiB,EAAE,EACzF,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAuDlB"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LocalReplayStore = void 0;
|
|
7
|
+
exports.createChallenge = createChallenge;
|
|
8
|
+
exports.solveChallenge = solveChallenge;
|
|
9
|
+
exports.verifySolution = verifySolution;
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
12
|
+
class LocalReplayStore {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.usedTokens = new Map();
|
|
15
|
+
}
|
|
16
|
+
async consume(jti, expiresAt) {
|
|
17
|
+
this.cleanup();
|
|
18
|
+
if (this.usedTokens.has(jti)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
this.usedTokens.set(jti, expiresAt);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
cleanup() {
|
|
25
|
+
const now = Math.floor(Date.now() / 1000);
|
|
26
|
+
for (const [jti, expiresAt] of this.usedTokens.entries()) {
|
|
27
|
+
if (expiresAt < now) {
|
|
28
|
+
this.usedTokens.delete(jti);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.LocalReplayStore = LocalReplayStore;
|
|
34
|
+
const defaultLocalReplayStore = new LocalReplayStore();
|
|
35
|
+
const DEFAULT_SOLVE_MAX_DURATION_MS = 30000;
|
|
36
|
+
function generateChallenge(length = 8) {
|
|
37
|
+
const buffer = crypto_1.default.randomBytes(length);
|
|
38
|
+
return buffer.toString('base64').slice(0, length);
|
|
39
|
+
}
|
|
40
|
+
function createChallengePayload(difficulty, ttlSeconds) {
|
|
41
|
+
return {
|
|
42
|
+
challenge: generateChallenge(),
|
|
43
|
+
difficulty,
|
|
44
|
+
expires: Math.floor(Date.now() / 1000) + ttlSeconds,
|
|
45
|
+
jti: crypto_1.default.randomUUID(),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
let cachedSecret;
|
|
49
|
+
function getSecret() {
|
|
50
|
+
const secret = process.env.RIBAUNT_SECRET;
|
|
51
|
+
if (!secret) {
|
|
52
|
+
cachedSecret = undefined;
|
|
53
|
+
throw new Error('RIBAUNT_SECRET environment variable is not set!');
|
|
54
|
+
}
|
|
55
|
+
if (cachedSecret === secret) {
|
|
56
|
+
return cachedSecret;
|
|
57
|
+
}
|
|
58
|
+
cachedSecret = secret;
|
|
59
|
+
return cachedSecret;
|
|
60
|
+
}
|
|
61
|
+
function shouldDebugVerifyErrors(options) {
|
|
62
|
+
if (options?.debug !== undefined) {
|
|
63
|
+
return options.debug;
|
|
64
|
+
}
|
|
65
|
+
return process.env.NODE_ENV === 'development';
|
|
66
|
+
}
|
|
67
|
+
function logVerifyWarning(message, options, error) {
|
|
68
|
+
const warning = {
|
|
69
|
+
reason: classifyVerifyWarningReason(error),
|
|
70
|
+
message,
|
|
71
|
+
error,
|
|
72
|
+
};
|
|
73
|
+
options?.onWarning?.(warning);
|
|
74
|
+
if (!shouldDebugVerifyErrors(options)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const details = error instanceof Error ? error.message : error;
|
|
78
|
+
console.warn(`[ribaunt] ${message}`, details ?? '');
|
|
79
|
+
}
|
|
80
|
+
function emitVerifyWarning(reason, message, options, error) {
|
|
81
|
+
options?.onWarning?.({ reason, message, error });
|
|
82
|
+
if (!shouldDebugVerifyErrors(options)) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const details = error instanceof Error ? error.message : error;
|
|
86
|
+
console.warn(`[ribaunt] ${message}`, details ?? '');
|
|
87
|
+
}
|
|
88
|
+
function classifyVerifyWarningReason(error) {
|
|
89
|
+
if (error && typeof error === 'object' && 'name' in error) {
|
|
90
|
+
const name = String(error.name);
|
|
91
|
+
if (name === 'TokenExpiredError') {
|
|
92
|
+
return 'expired-token';
|
|
93
|
+
}
|
|
94
|
+
if (name === 'JsonWebTokenError' || name === 'NotBeforeError') {
|
|
95
|
+
return 'invalid-token';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (error instanceof Error && error.message.includes('replayStore')) {
|
|
99
|
+
return 'configuration-error';
|
|
100
|
+
}
|
|
101
|
+
return 'invalid-token';
|
|
102
|
+
}
|
|
103
|
+
function normalizeMaxIterations(options) {
|
|
104
|
+
if (options?.maxIterations === undefined) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
if (!Number.isFinite(options.maxIterations)) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const normalized = Math.floor(options.maxIterations);
|
|
111
|
+
if (normalized < 1) {
|
|
112
|
+
return 1;
|
|
113
|
+
}
|
|
114
|
+
return normalized;
|
|
115
|
+
}
|
|
116
|
+
function normalizeMaxDurationMs(options) {
|
|
117
|
+
if (options?.maxDurationMs === undefined) {
|
|
118
|
+
return DEFAULT_SOLVE_MAX_DURATION_MS;
|
|
119
|
+
}
|
|
120
|
+
if (!Number.isFinite(options.maxDurationMs)) {
|
|
121
|
+
return DEFAULT_SOLVE_MAX_DURATION_MS;
|
|
122
|
+
}
|
|
123
|
+
const normalized = Math.floor(options.maxDurationMs);
|
|
124
|
+
if (normalized < 1) {
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
return normalized;
|
|
128
|
+
}
|
|
129
|
+
function getReplayStore(options) {
|
|
130
|
+
const mode = options?.replayPrevention ?? 'disabled';
|
|
131
|
+
if (mode === 'disabled') {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
if (mode === 'local') {
|
|
135
|
+
return defaultLocalReplayStore;
|
|
136
|
+
}
|
|
137
|
+
if (!options?.replayStore) {
|
|
138
|
+
throw new Error('A replayStore is required when replayPrevention is set to "remote"');
|
|
139
|
+
}
|
|
140
|
+
return options.replayStore;
|
|
141
|
+
}
|
|
142
|
+
function signChallenge(payload) {
|
|
143
|
+
return jsonwebtoken_1.default.sign(payload, getSecret());
|
|
144
|
+
}
|
|
145
|
+
function assertValidAmount(amount) {
|
|
146
|
+
if (!Number.isFinite(amount)) {
|
|
147
|
+
throw new Error('Challenge amount must be a finite number');
|
|
148
|
+
}
|
|
149
|
+
const normalized = Math.floor(amount);
|
|
150
|
+
if (normalized < 1) {
|
|
151
|
+
throw new Error('Challenge amount must be at least 1');
|
|
152
|
+
}
|
|
153
|
+
return normalized;
|
|
154
|
+
}
|
|
155
|
+
function assertValidDifficulty(difficulty) {
|
|
156
|
+
if (!Number.isFinite(difficulty)) {
|
|
157
|
+
throw new Error('Challenge difficulty must be a finite number');
|
|
158
|
+
}
|
|
159
|
+
const normalized = Math.floor(difficulty);
|
|
160
|
+
if (normalized < 1) {
|
|
161
|
+
throw new Error('Challenge difficulty must be at least 1');
|
|
162
|
+
}
|
|
163
|
+
return normalized;
|
|
164
|
+
}
|
|
165
|
+
function assertValidTtl(ttlSeconds) {
|
|
166
|
+
if (!Number.isFinite(ttlSeconds)) {
|
|
167
|
+
throw new Error('Challenge TTL must be a finite number');
|
|
168
|
+
}
|
|
169
|
+
const normalized = Math.floor(ttlSeconds);
|
|
170
|
+
if (normalized < 1) {
|
|
171
|
+
throw new Error('Challenge TTL must be at least 1 second');
|
|
172
|
+
}
|
|
173
|
+
return normalized;
|
|
174
|
+
}
|
|
175
|
+
function createSingleChallenge(difficulty, ttlSeconds) {
|
|
176
|
+
const payload = createChallengePayload(difficulty, ttlSeconds);
|
|
177
|
+
return signChallenge(payload);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Creates one or more PoW challenges and returns them as signed JWT tokens.
|
|
181
|
+
*
|
|
182
|
+
* @param difficulty - Number of leading zeros required in the hash (default 5)
|
|
183
|
+
* @param amount - Number of challenges to create (default 4)
|
|
184
|
+
* @param ttlSeconds - Time to live for each challenge in seconds (default 30)
|
|
185
|
+
* @returns An array of JWT challenge tokens
|
|
186
|
+
*/
|
|
187
|
+
function createChallenge(difficulty = 5, amount = 4, ttlSeconds = 30) {
|
|
188
|
+
const normalizedDifficulty = assertValidDifficulty(difficulty);
|
|
189
|
+
const normalizedAmount = assertValidAmount(amount);
|
|
190
|
+
const normalizedTtl = assertValidTtl(ttlSeconds);
|
|
191
|
+
const challenges = Array.from({ length: normalizedAmount }, () => createSingleChallenge(normalizedDifficulty, normalizedTtl));
|
|
192
|
+
return challenges;
|
|
193
|
+
}
|
|
194
|
+
function solveSingleChallenge(token, options) {
|
|
195
|
+
try {
|
|
196
|
+
const payload = jsonwebtoken_1.default.decode(token);
|
|
197
|
+
if (!payload)
|
|
198
|
+
return undefined;
|
|
199
|
+
const { challenge, difficulty } = payload;
|
|
200
|
+
const prefix = '0'.repeat(difficulty);
|
|
201
|
+
const maxIterations = normalizeMaxIterations(options);
|
|
202
|
+
const maxDurationMs = normalizeMaxDurationMs(options);
|
|
203
|
+
const startedAt = Date.now();
|
|
204
|
+
let nonce = 0;
|
|
205
|
+
while (true) {
|
|
206
|
+
if (maxIterations !== undefined && nonce >= maxIterations) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
if (Date.now() - startedAt >= maxDurationMs) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
const hash = crypto_1.default
|
|
213
|
+
.createHash('sha256')
|
|
214
|
+
.update(`${challenge}${nonce}`)
|
|
215
|
+
.digest('hex');
|
|
216
|
+
if (hash.startsWith(prefix)) {
|
|
217
|
+
return { nonce: String(nonce), hash };
|
|
218
|
+
}
|
|
219
|
+
nonce++;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async function verifySingleSolution(token, nonce, options) {
|
|
227
|
+
if (nonce === undefined || nonce === null) {
|
|
228
|
+
emitVerifyWarning('invalid-solution', 'verifySolution received an empty nonce', options);
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
const replayStore = getReplayStore(options);
|
|
233
|
+
const payload = jsonwebtoken_1.default.verify(token, getSecret());
|
|
234
|
+
const now = Math.floor(Date.now() / 1000);
|
|
235
|
+
if (payload.expires < now) {
|
|
236
|
+
emitVerifyWarning('expired-token', 'verifySolution rejected an expired challenge token', options);
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
const nonceValue = typeof nonce === 'number' ? String(nonce) : nonce;
|
|
240
|
+
const hash = crypto_1.default
|
|
241
|
+
.createHash('sha256')
|
|
242
|
+
.update(`${payload.challenge}${nonceValue}`)
|
|
243
|
+
.digest('hex');
|
|
244
|
+
const prefix = '0'.repeat(payload.difficulty);
|
|
245
|
+
const isValid = hash.startsWith(prefix);
|
|
246
|
+
if (!isValid) {
|
|
247
|
+
emitVerifyWarning('invalid-solution', 'verifySolution rejected an invalid nonce', options);
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
if (replayStore && payload.jti) {
|
|
251
|
+
const consumed = await replayStore.consume(payload.jti, payload.expires);
|
|
252
|
+
if (!consumed) {
|
|
253
|
+
emitVerifyWarning('replay-detected', 'verifySolution rejected a replayed token', options);
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
logVerifyWarning('verifySolution rejected a token or nonce', options, err);
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function solveChallenge(token, options) {
|
|
265
|
+
if (Array.isArray(token)) {
|
|
266
|
+
const solutions = [];
|
|
267
|
+
for (const singleToken of token) {
|
|
268
|
+
const solution = solveSingleChallenge(singleToken, options);
|
|
269
|
+
if (!solution) {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
solutions.push(solution);
|
|
273
|
+
}
|
|
274
|
+
return solutions;
|
|
275
|
+
}
|
|
276
|
+
const solution = solveSingleChallenge(token, options);
|
|
277
|
+
return solution;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Verifies a PoW solution returned by the client.
|
|
281
|
+
*
|
|
282
|
+
* @param token - The original JWT issued as the challenge (single token or array of tokens)
|
|
283
|
+
* @param nonce - The nonce/answer submitted by the client (single nonce, array of nonces, or array of solution objects)
|
|
284
|
+
* @returns true only if every provided solution is valid; otherwise false
|
|
285
|
+
*/
|
|
286
|
+
function verifySolution(token, nonce, options) {
|
|
287
|
+
if (Array.isArray(token)) {
|
|
288
|
+
let nonces;
|
|
289
|
+
if (Array.isArray(nonce)) {
|
|
290
|
+
if (nonce.length !== token.length) {
|
|
291
|
+
return Promise.resolve(false);
|
|
292
|
+
}
|
|
293
|
+
if (nonce.length > 0 && typeof nonce[0] === 'object' && 'nonce' in nonce[0]) {
|
|
294
|
+
nonces = nonce.map(s => s.nonce);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
nonces = nonce;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
return Promise.resolve(false);
|
|
302
|
+
}
|
|
303
|
+
return (async () => {
|
|
304
|
+
for (let index = 0; index < token.length; index++) {
|
|
305
|
+
const challengeToken = token[index];
|
|
306
|
+
const nonceEntry = nonces[index];
|
|
307
|
+
if (challengeToken === undefined || nonceEntry === undefined) {
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
if (!await verifySingleSolution(challengeToken, nonceEntry, options)) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return true;
|
|
315
|
+
})();
|
|
316
|
+
}
|
|
317
|
+
let effectiveNonce;
|
|
318
|
+
if (Array.isArray(nonce)) {
|
|
319
|
+
if (nonce.length === 0) {
|
|
320
|
+
return Promise.resolve(false);
|
|
321
|
+
}
|
|
322
|
+
if (typeof nonce[0] === 'object' && 'nonce' in nonce[0]) {
|
|
323
|
+
effectiveNonce = nonce[0].nonce;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
effectiveNonce = nonce[0];
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else if (typeof nonce === 'object' && 'nonce' in nonce) {
|
|
330
|
+
effectiveNonce = nonce.nonce;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
effectiveNonce = nonce;
|
|
334
|
+
}
|
|
335
|
+
if (effectiveNonce === undefined) {
|
|
336
|
+
return Promise.resolve(false);
|
|
337
|
+
}
|
|
338
|
+
return verifySingleSolution(token, effectiveNonce, options);
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/solver.d.ts
CHANGED
|
@@ -8,9 +8,9 @@ export interface ChallengeSolution {
|
|
|
8
8
|
/**
|
|
9
9
|
* Solve a single challenge token (browser-compatible)
|
|
10
10
|
*/
|
|
11
|
-
export declare function solveSingleChallenge(token: string): Promise<ChallengeSolution | undefined>;
|
|
11
|
+
export declare function solveSingleChallenge(token: string, signal?: AbortSignal): Promise<ChallengeSolution | undefined>;
|
|
12
12
|
/**
|
|
13
13
|
* Solve multiple challenge tokens (browser-compatible)
|
|
14
14
|
*/
|
|
15
|
-
export declare function solveChallenge(tokens: string[], onProgress?: (progress: number) => void): Promise<ChallengeSolution[]>;
|
|
15
|
+
export declare function solveChallenge(tokens: string[], onProgress?: (progress: number) => void, signal?: AbortSignal): Promise<ChallengeSolution[]>;
|
|
16
16
|
//# sourceMappingURL=solver.d.ts.map
|
package/dist/cjs/solver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../../src/solver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../../src/solver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAgDD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CA0BxC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACvC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwB9B"}
|
package/dist/cjs/solver.js
CHANGED
|
@@ -13,7 +13,9 @@ function decodeJWT(token) {
|
|
|
13
13
|
const parts = token.split('.');
|
|
14
14
|
if (parts.length !== 3 || !parts[1])
|
|
15
15
|
return null;
|
|
16
|
-
const
|
|
16
|
+
const normalizedPayload = parts[1].replace(/-/g, '+').replace(/_/g, '/');
|
|
17
|
+
const paddedPayload = normalizedPayload.padEnd(normalizedPayload.length + ((4 - (normalizedPayload.length % 4)) % 4), '=');
|
|
18
|
+
const payload = JSON.parse(atob(paddedPayload));
|
|
17
19
|
return payload;
|
|
18
20
|
}
|
|
19
21
|
catch {
|
|
@@ -24,6 +26,12 @@ function decodeJWT(token) {
|
|
|
24
26
|
* SHA-256 hash using Web Crypto API
|
|
25
27
|
*/
|
|
26
28
|
async function sha256(message) {
|
|
29
|
+
if (typeof TextEncoder === 'undefined') {
|
|
30
|
+
throw new Error('TextEncoder is unavailable in this browser environment');
|
|
31
|
+
}
|
|
32
|
+
if (!globalThis.crypto?.subtle) {
|
|
33
|
+
throw new Error('Web Crypto API is unavailable. Use HTTPS or localhost.');
|
|
34
|
+
}
|
|
27
35
|
const msgBuffer = new TextEncoder().encode(message);
|
|
28
36
|
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
|
|
29
37
|
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
@@ -33,41 +41,39 @@ async function sha256(message) {
|
|
|
33
41
|
/**
|
|
34
42
|
* Solve a single challenge token (browser-compatible)
|
|
35
43
|
*/
|
|
36
|
-
async function solveSingleChallenge(token) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (!payload)
|
|
40
|
-
return undefined;
|
|
41
|
-
const { challenge, difficulty } = payload;
|
|
42
|
-
const prefix = '0'.repeat(difficulty);
|
|
43
|
-
let nonce = 0;
|
|
44
|
-
while (true) {
|
|
45
|
-
const hash = await sha256(`${challenge}${nonce}`);
|
|
46
|
-
if (hash.startsWith(prefix)) {
|
|
47
|
-
return { nonce: String(nonce), hash };
|
|
48
|
-
}
|
|
49
|
-
nonce++;
|
|
50
|
-
// Yield to prevent blocking the UI (every 1000 iterations)
|
|
51
|
-
if (nonce % 1000 === 0) {
|
|
52
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
44
|
+
async function solveSingleChallenge(token, signal) {
|
|
45
|
+
const payload = decodeJWT(token);
|
|
46
|
+
if (!payload)
|
|
57
47
|
return undefined;
|
|
48
|
+
const { challenge, difficulty } = payload;
|
|
49
|
+
const prefix = '0'.repeat(difficulty);
|
|
50
|
+
let nonce = 0;
|
|
51
|
+
while (true) {
|
|
52
|
+
if (signal?.aborted) {
|
|
53
|
+
throw new DOMException('Challenge solving aborted', 'AbortError');
|
|
54
|
+
}
|
|
55
|
+
const hash = await sha256(`${challenge}${nonce}`);
|
|
56
|
+
if (hash.startsWith(prefix)) {
|
|
57
|
+
return { nonce: String(nonce), hash };
|
|
58
|
+
}
|
|
59
|
+
nonce++;
|
|
60
|
+
// Yield to prevent blocking the UI (every 1000 iterations)
|
|
61
|
+
if (nonce % 1000 === 0) {
|
|
62
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
63
|
+
}
|
|
58
64
|
}
|
|
59
65
|
}
|
|
60
66
|
/**
|
|
61
67
|
* Solve multiple challenge tokens (browser-compatible)
|
|
62
68
|
*/
|
|
63
|
-
async function solveChallenge(tokens, onProgress) {
|
|
69
|
+
async function solveChallenge(tokens, onProgress, signal) {
|
|
64
70
|
const solutions = [];
|
|
65
71
|
for (let i = 0; i < tokens.length; i++) {
|
|
66
72
|
const token = tokens[i];
|
|
67
73
|
if (!token) {
|
|
68
74
|
throw new Error(`Invalid token at index ${i}`);
|
|
69
75
|
}
|
|
70
|
-
const solution = await solveSingleChallenge(token);
|
|
76
|
+
const solution = await solveSingleChallenge(token, signal);
|
|
71
77
|
if (!solution) {
|
|
72
78
|
throw new Error(`Failed to solve challenge ${i + 1}`);
|
|
73
79
|
}
|
package/dist/cjs/solver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../../src/solver.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../../src/solver.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,14 @@ export interface RibauntWidgetProps extends Omit<React.HTMLAttributes<RibauntWid
|
|
|
5
5
|
verifyEndpoint?: string;
|
|
6
6
|
showWarning?: boolean | string;
|
|
7
7
|
warningMessage?: string;
|
|
8
|
+
solveTimeout?: number | string;
|
|
8
9
|
disabled?: boolean | string;
|
|
9
10
|
onVerify?: (detail: {
|
|
10
11
|
solutions: any[];
|
|
11
12
|
}) => void;
|
|
12
13
|
onError?: (detail: {
|
|
13
14
|
error: string;
|
|
15
|
+
timeout?: boolean;
|
|
14
16
|
}) => void;
|
|
15
17
|
onStateChange?: (detail: {
|
|
16
18
|
state: WidgetState;
|