@siglo/crypto 0.0.0-stage → 1.0.1
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/LICENSE +21 -0
- package/README.md +123 -2
- package/dist/cipher/aes-gcm.d.ts +43 -0
- package/dist/cipher/aes-gcm.d.ts.map +1 -0
- package/dist/cipher/aes-gcm.js +152 -0
- package/dist/cipher/aes-gcm.js.map +1 -0
- package/dist/cipher/decrypt-step.d.ts +13 -0
- package/dist/cipher/decrypt-step.d.ts.map +1 -0
- package/dist/cipher/decrypt-step.js +113 -0
- package/dist/cipher/decrypt-step.js.map +1 -0
- package/dist/cipher/encrypt-step.d.ts +13 -0
- package/dist/cipher/encrypt-step.d.ts.map +1 -0
- package/dist/cipher/encrypt-step.js +84 -0
- package/dist/cipher/encrypt-step.js.map +1 -0
- package/dist/cipher/key-ring.d.ts +24 -0
- package/dist/cipher/key-ring.d.ts.map +1 -0
- package/dist/cipher/key-ring.js +67 -0
- package/dist/cipher/key-ring.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/redaction/mask-step.d.ts +28 -0
- package/dist/redaction/mask-step.d.ts.map +1 -0
- package/dist/redaction/mask-step.js +85 -0
- package/dist/redaction/mask-step.js.map +1 -0
- package/dist/redaction/paths.d.ts +28 -0
- package/dist/redaction/paths.d.ts.map +1 -0
- package/dist/redaction/paths.js +149 -0
- package/dist/redaction/paths.js.map +1 -0
- package/dist/registry.d.ts +14 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +44 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +115 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/webhooks/dedup.d.ts +24 -0
- package/dist/webhooks/dedup.d.ts.map +1 -0
- package/dist/webhooks/dedup.js +69 -0
- package/dist/webhooks/dedup.js.map +1 -0
- package/dist/webhooks/protocols/base.d.ts +15 -0
- package/dist/webhooks/protocols/base.d.ts.map +1 -0
- package/dist/webhooks/protocols/base.js +42 -0
- package/dist/webhooks/protocols/base.js.map +1 -0
- package/dist/webhooks/protocols/generic-hmac.d.ts +16 -0
- package/dist/webhooks/protocols/generic-hmac.d.ts.map +1 -0
- package/dist/webhooks/protocols/generic-hmac.js +68 -0
- package/dist/webhooks/protocols/generic-hmac.js.map +1 -0
- package/dist/webhooks/protocols/github.d.ts +9 -0
- package/dist/webhooks/protocols/github.d.ts.map +1 -0
- package/dist/webhooks/protocols/github.js +49 -0
- package/dist/webhooks/protocols/github.js.map +1 -0
- package/dist/webhooks/protocols/shopify.d.ts +9 -0
- package/dist/webhooks/protocols/shopify.d.ts.map +1 -0
- package/dist/webhooks/protocols/shopify.js +37 -0
- package/dist/webhooks/protocols/shopify.js.map +1 -0
- package/dist/webhooks/protocols/slack.d.ts +9 -0
- package/dist/webhooks/protocols/slack.d.ts.map +1 -0
- package/dist/webhooks/protocols/slack.js +52 -0
- package/dist/webhooks/protocols/slack.js.map +1 -0
- package/dist/webhooks/protocols/stripe.d.ts +9 -0
- package/dist/webhooks/protocols/stripe.d.ts.map +1 -0
- package/dist/webhooks/protocols/stripe.js +56 -0
- package/dist/webhooks/protocols/stripe.js.map +1 -0
- package/dist/webhooks/protocols/svix.d.ts +9 -0
- package/dist/webhooks/protocols/svix.d.ts.map +1 -0
- package/dist/webhooks/protocols/svix.js +85 -0
- package/dist/webhooks/protocols/svix.js.map +1 -0
- package/dist/webhooks/timing.d.ts +6 -0
- package/dist/webhooks/timing.d.ts.map +1 -0
- package/dist/webhooks/timing.js +25 -0
- package/dist/webhooks/timing.js.map +1 -0
- package/dist/webhooks/verify-step.d.ts +25 -0
- package/dist/webhooks/verify-step.d.ts.map +1 -0
- package/dist/webhooks/verify-step.js +351 -0
- package/dist/webhooks/verify-step.js.map +1 -0
- package/package.json +52 -4
|
@@ -0,0 +1,85 @@
|
|
|
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.svixProtocol = exports.SvixWebhookProtocol = void 0;
|
|
7
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
8
|
+
const timing_1 = require("../timing");
|
|
9
|
+
const base_1 = require("./base");
|
|
10
|
+
class SvixWebhookProtocol {
|
|
11
|
+
name = 'svix';
|
|
12
|
+
parseHeaders(headers = {}, signatureHeader = '') {
|
|
13
|
+
const normalized = (0, base_1.normalizeHeaders)(headers);
|
|
14
|
+
const rawHeader = signatureHeader ||
|
|
15
|
+
normalized['svix-signature'] ||
|
|
16
|
+
normalized['webhook-signature'] ||
|
|
17
|
+
'';
|
|
18
|
+
const rawTimestamp = normalized['svix-timestamp'] || normalized['webhook-timestamp'];
|
|
19
|
+
const timestamp = rawTimestamp ? Number(rawTimestamp) : undefined;
|
|
20
|
+
const signatures = [];
|
|
21
|
+
const parts = rawHeader.trim().split(/\s+/);
|
|
22
|
+
for (const part of parts) {
|
|
23
|
+
if (part.startsWith('v1,')) {
|
|
24
|
+
signatures.push(part.slice(3));
|
|
25
|
+
}
|
|
26
|
+
else if (part.startsWith('v1=')) {
|
|
27
|
+
signatures.push(part.slice(3));
|
|
28
|
+
}
|
|
29
|
+
else if (part) {
|
|
30
|
+
signatures.push(part);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
timestamp: !Number.isNaN(timestamp) ? timestamp : undefined,
|
|
35
|
+
signatures,
|
|
36
|
+
version: 'v1'
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
formatSignedPayload(rawBody, timestamp, svixId) {
|
|
40
|
+
const bodyStr = (0, base_1.payloadToString)(rawBody);
|
|
41
|
+
return `${svixId || ''}.${timestamp !== undefined ? timestamp : ''}.${bodyStr}`;
|
|
42
|
+
}
|
|
43
|
+
verify({ secret, rawPayload, headers, signatureHeader, toleranceSeconds = 300, clock }) {
|
|
44
|
+
const normalized = (0, base_1.normalizeHeaders)(headers);
|
|
45
|
+
const parsed = this.parseHeaders(headers, signatureHeader);
|
|
46
|
+
if (parsed.timestamp === undefined || parsed.signatures.length === 0) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const nowSec = clock ? Math.floor(clock.now() / 1000) : Math.floor(Date.now() / 1000);
|
|
50
|
+
if (!(0, base_1.isTimestampValid)(parsed.timestamp, toleranceSeconds, nowSec)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const svixId = normalized['svix-id'] || normalized['webhook-id'] || '';
|
|
54
|
+
const toSign = `${svixId}.${parsed.timestamp}.${(0, base_1.payloadToString)(rawPayload)}`;
|
|
55
|
+
// Asymmetric Public Key (Ed25519 or RSA) check
|
|
56
|
+
const secretStr = typeof secret === 'string' ? secret : '';
|
|
57
|
+
if (secretStr.includes('-----BEGIN PUBLIC KEY-----')) {
|
|
58
|
+
try {
|
|
59
|
+
const toSignBuf = Buffer.from(toSign, 'utf8');
|
|
60
|
+
return parsed.signatures.some(sig => {
|
|
61
|
+
try {
|
|
62
|
+
const sigBuf = Buffer.from(sig, 'base64');
|
|
63
|
+
return node_crypto_1.default.verify(null, toSignBuf, secret, sigBuf);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Symmetric HMAC verification
|
|
75
|
+
let secretKey = secret;
|
|
76
|
+
if (typeof secret === 'string' && secret.startsWith('whsec_')) {
|
|
77
|
+
secretKey = Buffer.from(secret.slice(6), 'base64');
|
|
78
|
+
}
|
|
79
|
+
const expected = node_crypto_1.default.createHmac('sha256', secretKey).update(toSign).digest('base64');
|
|
80
|
+
return parsed.signatures.some(sig => (0, timing_1.timingSafeCompare)(expected, sig, 'base64'));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.SvixWebhookProtocol = SvixWebhookProtocol;
|
|
84
|
+
exports.svixProtocol = new SvixWebhookProtocol();
|
|
85
|
+
//# sourceMappingURL=svix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svix.js","sourceRoot":"","sources":["../../../src/webhooks/protocols/svix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant-time equality check to prevent side-channel timing attacks.
|
|
3
|
+
* Uses `crypto.timingSafeEqual` with strict buffer length checks.
|
|
4
|
+
*/
|
|
5
|
+
export declare function timingSafeCompare(computed: string | Buffer, provided: string | Buffer, encoding?: BufferEncoding): boolean;
|
|
6
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/webhooks/timing.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,QAAQ,GAAE,cAAsB,GAC/B,OAAO,CAaT"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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.timingSafeCompare = timingSafeCompare;
|
|
7
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
8
|
+
/**
|
|
9
|
+
* Constant-time equality check to prevent side-channel timing attacks.
|
|
10
|
+
* Uses `crypto.timingSafeEqual` with strict buffer length checks.
|
|
11
|
+
*/
|
|
12
|
+
function timingSafeCompare(computed, provided, encoding = 'hex') {
|
|
13
|
+
try {
|
|
14
|
+
const bufA = Buffer.isBuffer(computed) ? computed : Buffer.from(computed, encoding);
|
|
15
|
+
const bufB = Buffer.isBuffer(provided) ? provided : Buffer.from(provided, encoding);
|
|
16
|
+
if (bufA.length === 0 || bufB.length === 0 || bufA.length !== bufB.length) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return node_crypto_1.default.timingSafeEqual(bufA, bufB);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/webhooks/timing.ts"],"names":[],"mappings":";;;;;AAMA,8CAiBC;AAvBD,8DAAiC;AAEjC;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,QAAyB,EACzB,QAAyB,EACzB,WAA2B,KAAK;IAEhC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,qBAAM,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Step, ExecutionOptions } from '@siglo/core';
|
|
2
|
+
import { WebhookVerifyOptions, WebhookVerificationResult } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Checks if a value is a readable stream or async iterable of chunks.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isStreamPayload(val: unknown): val is NodeJS.ReadableStream | AsyncIterable<Buffer>;
|
|
7
|
+
/**
|
|
8
|
+
* Validates whether a value is a raw string, Buffer, Uint8Array, serialized Buffer object, or stream.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isRawPayload(val: unknown): val is string | Buffer | NodeJS.ReadableStream | AsyncIterable<Buffer>;
|
|
11
|
+
/**
|
|
12
|
+
* Normalizes synchronous raw payload into string or Buffer.
|
|
13
|
+
*/
|
|
14
|
+
export declare function normalizeRawPayload(val: unknown): string | Buffer;
|
|
15
|
+
export declare class WebhookVerifyStep<TInput = any, TName extends string = string> extends Step<TInput, WebhookVerificationResult, TName> {
|
|
16
|
+
private verifyOptions;
|
|
17
|
+
constructor(name: TName, options: WebhookVerifyOptions<TInput>);
|
|
18
|
+
execute(param?: TInput, options?: ExecutionOptions): Promise<WebhookVerificationResult>;
|
|
19
|
+
run(param?: TInput, options?: ExecutionOptions): Promise<WebhookVerificationResult>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Factory for generating typed webhook verification steps.
|
|
23
|
+
*/
|
|
24
|
+
export declare function verifyWebhookStep<const TName extends string, TInput>(name: TName, options: WebhookVerifyOptions<TInput>): WebhookVerifyStep<TInput, TName>;
|
|
25
|
+
//# sourceMappingURL=verify-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-step.d.ts","sourceRoot":"","sources":["../../src/webhooks/verify-step.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAuB,gBAAgB,EAA2D,MAAM,aAAa,CAAC;AACnI,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EAG1B,MAAM,UAAU,CAAC;AAkBlB;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAMlG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAWjH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAcjE;AAkGD,qBAAa,iBAAiB,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,GAAG,MAAM,CACxE,SAAQ,IAAI,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,CAAC;IAEtD,OAAO,CAAC,aAAa,CAA+B;gBAExC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC;IAkOrD,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAKvF,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAG7F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,KAAK,SAAS,MAAM,EAAE,MAAM,EAClE,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,GACpC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAElC"}
|
|
@@ -0,0 +1,351 @@
|
|
|
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.WebhookVerifyStep = void 0;
|
|
7
|
+
exports.isStreamPayload = isStreamPayload;
|
|
8
|
+
exports.isRawPayload = isRawPayload;
|
|
9
|
+
exports.normalizeRawPayload = normalizeRawPayload;
|
|
10
|
+
exports.verifyWebhookStep = verifyWebhookStep;
|
|
11
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
12
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
13
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
|
+
const core_1 = require("@siglo/core");
|
|
15
|
+
const registry_1 = require("../registry");
|
|
16
|
+
const base_1 = require("./protocols/base");
|
|
17
|
+
const dedup_1 = require("./dedup");
|
|
18
|
+
function sanitizeStepInput(param) {
|
|
19
|
+
if (!param || typeof param !== 'object' || Array.isArray(param)) {
|
|
20
|
+
return param;
|
|
21
|
+
}
|
|
22
|
+
const clean = {};
|
|
23
|
+
for (const [key, val] of Object.entries(param)) {
|
|
24
|
+
if (key !== '$steps' && key !== '$history' && key !== '$stackId') {
|
|
25
|
+
clean[key] = val;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return clean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Checks if a value is a readable stream or async iterable of chunks.
|
|
32
|
+
*/
|
|
33
|
+
function isStreamPayload(val) {
|
|
34
|
+
return (typeof val === 'object' &&
|
|
35
|
+
val !== null &&
|
|
36
|
+
(typeof val[Symbol.asyncIterator] === 'function' || typeof val.pipe === 'function'));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validates whether a value is a raw string, Buffer, Uint8Array, serialized Buffer object, or stream.
|
|
40
|
+
*/
|
|
41
|
+
function isRawPayload(val) {
|
|
42
|
+
if (typeof val === 'string' || Buffer.isBuffer(val) || val instanceof Uint8Array || isStreamPayload(val)) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
if (val && typeof val === 'object' && !Array.isArray(val)) {
|
|
46
|
+
const keys = Object.keys(val);
|
|
47
|
+
if (keys.length > 0 && keys.every((k, i) => k === String(i) && typeof val[k] === 'number')) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Normalizes synchronous raw payload into string or Buffer.
|
|
55
|
+
*/
|
|
56
|
+
function normalizeRawPayload(val) {
|
|
57
|
+
if (typeof val === 'string' || Buffer.isBuffer(val)) {
|
|
58
|
+
return val;
|
|
59
|
+
}
|
|
60
|
+
if (val instanceof Uint8Array) {
|
|
61
|
+
return Buffer.from(val.buffer, val.byteOffset, val.byteLength);
|
|
62
|
+
}
|
|
63
|
+
if (val && typeof val === 'object' && !Array.isArray(val)) {
|
|
64
|
+
const keys = Object.keys(val);
|
|
65
|
+
if (keys.length > 0 && keys.every((k, i) => k === String(i) && typeof val[k] === 'number')) {
|
|
66
|
+
return Buffer.from(Object.values(val));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return String(val ?? '');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolves raw payload and handles optional stream reading, size limits, and disk spooling.
|
|
73
|
+
*/
|
|
74
|
+
async function resolvePayloadData(val, options, stepName) {
|
|
75
|
+
const maxBytes = options.maxBodyBytes ?? 10 * 1024 * 1024; // 10MB default
|
|
76
|
+
const spoolThreshold = options.spoolThresholdBytes ?? 5 * 1024 * 1024; // 5MB default
|
|
77
|
+
if (isStreamPayload(val)) {
|
|
78
|
+
const chunks = [];
|
|
79
|
+
let totalBytes = 0;
|
|
80
|
+
let fileStream;
|
|
81
|
+
let filePath;
|
|
82
|
+
for await (const chunk of val) {
|
|
83
|
+
const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
84
|
+
totalBytes += buf.length;
|
|
85
|
+
if (maxBytes > 0 && totalBytes > maxBytes) {
|
|
86
|
+
if (fileStream) {
|
|
87
|
+
fileStream.close();
|
|
88
|
+
try {
|
|
89
|
+
node_fs_1.default.unlinkSync(filePath);
|
|
90
|
+
}
|
|
91
|
+
catch { }
|
|
92
|
+
}
|
|
93
|
+
throw new core_1.ValidationException([{ field: 'payload', message: `Payload exceeds maximum allowed size of ${maxBytes} bytes` }], { stepName, phase: 'action', retryable: false });
|
|
94
|
+
}
|
|
95
|
+
if (totalBytes > spoolThreshold && !fileStream) {
|
|
96
|
+
const spoolDir = options.spoolDir || node_os_1.default.tmpdir();
|
|
97
|
+
filePath = node_path_1.default.join(spoolDir, `siglo-wh-${Date.now()}-${Math.random().toString(36).slice(2)}.bin`);
|
|
98
|
+
fileStream = node_fs_1.default.createWriteStream(filePath);
|
|
99
|
+
for (const prev of chunks) {
|
|
100
|
+
fileStream.write(prev);
|
|
101
|
+
}
|
|
102
|
+
chunks.length = 0;
|
|
103
|
+
}
|
|
104
|
+
if (fileStream) {
|
|
105
|
+
fileStream.write(buf);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
chunks.push(buf);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (fileStream) {
|
|
112
|
+
await new Promise((resolve, reject) => {
|
|
113
|
+
fileStream.end(resolve);
|
|
114
|
+
fileStream.on('error', reject);
|
|
115
|
+
});
|
|
116
|
+
const fileBuf = node_fs_1.default.readFileSync(filePath);
|
|
117
|
+
return {
|
|
118
|
+
rawPayload: fileBuf,
|
|
119
|
+
payloadRef: {
|
|
120
|
+
storage: 'file',
|
|
121
|
+
path: filePath,
|
|
122
|
+
bytes: totalBytes
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const rawPayload = Buffer.concat(chunks);
|
|
127
|
+
return {
|
|
128
|
+
rawPayload,
|
|
129
|
+
payloadRef: {
|
|
130
|
+
storage: 'memory',
|
|
131
|
+
bytes: totalBytes
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const rawPayload = normalizeRawPayload(val);
|
|
136
|
+
const byteLen = Buffer.isBuffer(rawPayload) ? rawPayload.length : Buffer.byteLength(rawPayload);
|
|
137
|
+
if (maxBytes > 0 && byteLen > maxBytes) {
|
|
138
|
+
throw new core_1.ValidationException([{ field: 'payload', message: `Payload exceeds maximum allowed size of ${maxBytes} bytes` }], { stepName, phase: 'action', retryable: false });
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
rawPayload,
|
|
142
|
+
payloadRef: {
|
|
143
|
+
storage: 'memory',
|
|
144
|
+
bytes: byteLen
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
class WebhookVerifyStep extends core_1.Step {
|
|
149
|
+
verifyOptions;
|
|
150
|
+
constructor(name, options) {
|
|
151
|
+
const diagnostic = () => ({ version: 1, kind: 'crypto', outcome: 'failure',
|
|
152
|
+
provider: typeof options.provider === 'string' && (0, registry_1.getWebhookProtocol)(options.provider) ? options.provider : undefined,
|
|
153
|
+
category: 'rejected', timestampCheck: 'unavailable', replayCheck: 'unavailable' });
|
|
154
|
+
const action = async (ctx, inspection) => {
|
|
155
|
+
// 1. Resolve raw payload (supports Buffers, strings, and streaming chunks)
|
|
156
|
+
const rawPayloadInput = options.payload(ctx);
|
|
157
|
+
if (!isRawPayload(rawPayloadInput)) {
|
|
158
|
+
inspection.category = 'invalid-payload';
|
|
159
|
+
throw new core_1.ValidationException([{ field: 'payload', message: 'Payload must be a Buffer or raw unparsed string to prevent JSON serialization skew' }], { stepName: name, phase: 'action', retryable: false });
|
|
160
|
+
}
|
|
161
|
+
const { rawPayload, payloadRef } = await resolvePayloadData(rawPayloadInput, options, name).catch(error => {
|
|
162
|
+
if (error instanceof core_1.ValidationException)
|
|
163
|
+
inspection.category = 'payload-too-large';
|
|
164
|
+
throw error;
|
|
165
|
+
});
|
|
166
|
+
inspection.payloadBytes = payloadRef.bytes;
|
|
167
|
+
inspection.category = 'rejected';
|
|
168
|
+
// 2. Resolve secret
|
|
169
|
+
const secret = typeof options.secret === 'function' ? options.secret(ctx) : options.secret;
|
|
170
|
+
if (!secret) {
|
|
171
|
+
inspection.category = 'missing-secret';
|
|
172
|
+
throw new core_1.ValidationException([{ field: 'secret', message: 'Webhook secret is required' }], { stepName: name, phase: 'action', retryable: false });
|
|
173
|
+
}
|
|
174
|
+
// 3. Resolve protocol
|
|
175
|
+
let providerOrProtocol = options.provider;
|
|
176
|
+
if (typeof providerOrProtocol === 'function') {
|
|
177
|
+
providerOrProtocol = providerOrProtocol(ctx);
|
|
178
|
+
}
|
|
179
|
+
if (!providerOrProtocol) {
|
|
180
|
+
providerOrProtocol = 'generic-hmac';
|
|
181
|
+
}
|
|
182
|
+
let protocol;
|
|
183
|
+
if (typeof providerOrProtocol === 'string') {
|
|
184
|
+
protocol = (0, registry_1.getWebhookProtocol)(providerOrProtocol);
|
|
185
|
+
if (!protocol) {
|
|
186
|
+
inspection.category = 'unknown-provider';
|
|
187
|
+
throw new core_1.ValidationException([{ field: 'provider', message: `Unknown webhook provider '${providerOrProtocol}'` }], { stepName: name, phase: 'action', retryable: false });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
protocol = providerOrProtocol;
|
|
192
|
+
}
|
|
193
|
+
// 4. Resolve headers and signature header
|
|
194
|
+
inspection.provider = protocol.name;
|
|
195
|
+
const signatureOrHeaders = options.signature(ctx);
|
|
196
|
+
let headers = {};
|
|
197
|
+
let signatureHeader = '';
|
|
198
|
+
if (options.headers) {
|
|
199
|
+
headers = options.headers(ctx);
|
|
200
|
+
}
|
|
201
|
+
if (typeof signatureOrHeaders === 'string') {
|
|
202
|
+
signatureHeader = signatureOrHeaders;
|
|
203
|
+
if (Object.keys(headers).length === 0 && ctx?.headers && typeof ctx.headers === 'object') {
|
|
204
|
+
headers = ctx.headers;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (typeof signatureOrHeaders === 'object' && signatureOrHeaders !== null) {
|
|
208
|
+
headers = signatureOrHeaders;
|
|
209
|
+
}
|
|
210
|
+
else if (ctx?.headers && typeof ctx.headers === 'object') {
|
|
211
|
+
headers = ctx.headers;
|
|
212
|
+
}
|
|
213
|
+
const normalized = (0, base_1.normalizeHeaders)(headers);
|
|
214
|
+
// If signatureHeader is empty, resolve from common header keys based on provider
|
|
215
|
+
if (!signatureHeader) {
|
|
216
|
+
if (protocol.name === 'stripe') {
|
|
217
|
+
signatureHeader = normalized['stripe-signature'] || '';
|
|
218
|
+
}
|
|
219
|
+
else if (protocol.name === 'github') {
|
|
220
|
+
signatureHeader = normalized['x-hub-signature-256'] || normalized['x-hub-signature'] || '';
|
|
221
|
+
}
|
|
222
|
+
else if (protocol.name === 'shopify') {
|
|
223
|
+
signatureHeader = normalized['x-shopify-hmac-sha256'] || '';
|
|
224
|
+
}
|
|
225
|
+
else if (protocol.name === 'slack') {
|
|
226
|
+
signatureHeader = normalized['x-slack-signature'] || '';
|
|
227
|
+
}
|
|
228
|
+
else if (protocol.name === 'svix') {
|
|
229
|
+
signatureHeader = normalized['svix-signature'] || normalized['webhook-signature'] || '';
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
signatureHeader = normalized['signature'] || normalized['x-signature'] || normalized['x-hub-signature-256'] || '';
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// 5. Parse headers & enforce replay attack tolerance
|
|
236
|
+
const toleranceSeconds = options.toleranceSeconds ?? 300;
|
|
237
|
+
let parsedTimestamp;
|
|
238
|
+
if (protocol.parseHeaders) {
|
|
239
|
+
const parsed = protocol.parseHeaders(headers, signatureHeader);
|
|
240
|
+
if (!signatureHeader && parsed.signatures.length === 0) {
|
|
241
|
+
inspection.category = 'missing-signature';
|
|
242
|
+
throw new core_1.ValidationException([{ field: 'signature', message: 'Webhook signature header is missing' }], { stepName: name, phase: 'action', retryable: false });
|
|
243
|
+
}
|
|
244
|
+
if (parsed.timestamp !== undefined) {
|
|
245
|
+
parsedTimestamp = parsed.timestamp;
|
|
246
|
+
const nowSec = options.clock ? Math.floor(options.clock.now() / 1000) : Math.floor(Date.now() / 1000);
|
|
247
|
+
let tsSec = parsed.timestamp;
|
|
248
|
+
if (tsSec > 1e11) {
|
|
249
|
+
tsSec = Math.floor(tsSec / 1000);
|
|
250
|
+
}
|
|
251
|
+
if (toleranceSeconds > 0 && Math.abs(nowSec - tsSec) > toleranceSeconds) {
|
|
252
|
+
inspection.category = 'timestamp-rejected';
|
|
253
|
+
inspection.timestampCheck = 'failed';
|
|
254
|
+
throw new core_1.ValidationException([{ field: 'timestamp', message: `Webhook timestamp '${parsed.timestamp}' outside tolerance window (${toleranceSeconds}s)` }], { stepName: name, phase: 'action', retryable: false });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (parsed.timestamp !== undefined && toleranceSeconds > 0)
|
|
258
|
+
inspection.timestampCheck = 'passed';
|
|
259
|
+
}
|
|
260
|
+
else if (!signatureHeader) {
|
|
261
|
+
inspection.category = 'missing-signature';
|
|
262
|
+
throw new core_1.ValidationException([{ field: 'signature', message: 'Webhook signature header is missing' }], { stepName: name, phase: 'action', retryable: false });
|
|
263
|
+
}
|
|
264
|
+
// 6. Enforce intra-window replay defense via dedupStore
|
|
265
|
+
const dedupKey = (0, dedup_1.createDedupKey)(protocol.name, signatureHeader, parsedTimestamp);
|
|
266
|
+
if (options.dedupStore) {
|
|
267
|
+
const claimed = await options.dedupStore.claim(dedupKey, toleranceSeconds);
|
|
268
|
+
if (!claimed) {
|
|
269
|
+
inspection.category = 'replay-detected';
|
|
270
|
+
inspection.replayCheck = 'failed';
|
|
271
|
+
throw new core_1.ValidationException([{ field: 'signature', message: `Replay detected: duplicate webhook signature within tolerance window (${toleranceSeconds}s)` }], { stepName: name, phase: 'action', retryable: false });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (options.dedupStore)
|
|
275
|
+
inspection.replayCheck = 'passed';
|
|
276
|
+
// 7. Execute protocol verification
|
|
277
|
+
const isValid = await protocol.verify({
|
|
278
|
+
secret,
|
|
279
|
+
rawPayload,
|
|
280
|
+
headers,
|
|
281
|
+
signatureHeader,
|
|
282
|
+
toleranceSeconds,
|
|
283
|
+
clock: options.clock,
|
|
284
|
+
algorithm: options.algorithm
|
|
285
|
+
});
|
|
286
|
+
if (!isValid) {
|
|
287
|
+
inspection.category = 'invalid-signature';
|
|
288
|
+
throw new core_1.ValidationException([{ field: 'signature', message: `Webhook signature verification failed for provider '${protocol.name}'` }], { stepName: name, phase: 'action', retryable: false });
|
|
289
|
+
}
|
|
290
|
+
const verifiedAt = parsedTimestamp !== undefined
|
|
291
|
+
? parsedTimestamp
|
|
292
|
+
: (options.clock ? Math.floor(options.clock.now() / 1000) : Math.floor(Date.now() / 1000));
|
|
293
|
+
return {
|
|
294
|
+
webhookVerified: true,
|
|
295
|
+
verifiedAt,
|
|
296
|
+
provider: protocol.name,
|
|
297
|
+
idempotencyKey: dedupKey,
|
|
298
|
+
payloadRef
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
super(name, ((ctx) => {
|
|
302
|
+
const inspection = diagnostic();
|
|
303
|
+
return (0, core_1.observeEcosystem)(inspection, () => action(ctx, inspection), result => ({
|
|
304
|
+
provider: result.provider, payloadBytes: result.payloadRef?.bytes, category: 'verified'
|
|
305
|
+
}));
|
|
306
|
+
}));
|
|
307
|
+
this.verifyOptions = options;
|
|
308
|
+
// 1. BEFORE Phase: Early assertions
|
|
309
|
+
this.onBefore(async (ctx) => {
|
|
310
|
+
const inspection = diagnostic();
|
|
311
|
+
try {
|
|
312
|
+
const payload = options.payload(ctx);
|
|
313
|
+
if (!isRawPayload(payload)) {
|
|
314
|
+
inspection.category = 'invalid-payload';
|
|
315
|
+
throw new core_1.ValidationException([{ field: 'payload', message: 'Payload must be a Buffer or raw unparsed string to prevent JSON serialization skew' }], { stepName: name, phase: 'before', retryable: false });
|
|
316
|
+
}
|
|
317
|
+
let provider = options.provider;
|
|
318
|
+
if (typeof provider === 'function') {
|
|
319
|
+
provider = provider(ctx);
|
|
320
|
+
}
|
|
321
|
+
if (typeof provider === 'string') {
|
|
322
|
+
const protocol = (0, registry_1.getWebhookProtocol)(provider);
|
|
323
|
+
if (!protocol) {
|
|
324
|
+
inspection.category = 'unknown-provider';
|
|
325
|
+
throw new core_1.ValidationException([{ field: 'provider', message: `Unknown webhook provider '${provider}'` }], { stepName: name, phase: 'before', retryable: false });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
(0, core_1.recordInspection)(inspection);
|
|
332
|
+
throw error;
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
execute(param, options) {
|
|
337
|
+
const cleanParam = param ? sanitizeStepInput(param) : param;
|
|
338
|
+
return super.execute(cleanParam, { pojo: true, ...options });
|
|
339
|
+
}
|
|
340
|
+
run(param, options) {
|
|
341
|
+
return this.execute(param, options);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.WebhookVerifyStep = WebhookVerifyStep;
|
|
345
|
+
/**
|
|
346
|
+
* Factory for generating typed webhook verification steps.
|
|
347
|
+
*/
|
|
348
|
+
function verifyWebhookStep(name, options) {
|
|
349
|
+
return new WebhookVerifyStep(name, options);
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=verify-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-step.js","sourceRoot":"","sources":["../../src/webhooks/verify-step.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@siglo/crypto",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Zero-dependency cryptographic step package for Siglo workflows: timing-safe webhook verification, AEAD envelope field encryption, and context redaction",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public",
|
|
23
|
+
"registry": "https://registry.npmjs.org/"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc -p tsconfig.json",
|
|
27
|
+
"prepublishOnly": "npm run build",
|
|
28
|
+
"test": "npm run build && mocha -r tsx 'test/**/*.test.ts' 'src/**/*.test.ts' --exit"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/jsoftgem/siglo.git",
|
|
33
|
+
"directory": "packages/crypto"
|
|
34
|
+
},
|
|
35
|
+
"author": "Jerico de Guzman",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/jsoftgem/siglo/issues"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/jsoftgem/siglo#readme",
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@siglo/core": "^1.0.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@siglo/testing": "^1.0.0",
|
|
46
|
+
"@types/chai": "^5.2.3",
|
|
47
|
+
"@types/mocha": "^10.0.10",
|
|
48
|
+
"@types/node": "^26.6.5",
|
|
49
|
+
"chai": "^3.5.0",
|
|
50
|
+
"mocha": "^12.0.3",
|
|
51
|
+
"tsx": "^4.23.15",
|
|
52
|
+
"typescript": "~5.7.0"
|
|
53
|
+
}
|
|
54
|
+
}
|