Skip to content

Commit 3253937

Browse files
committed
add sync Functions for node
1 parent f73c4a5 commit 3253937

File tree

6 files changed

+68
-23
lines changed

6 files changed

+68
-23
lines changed

src/index.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
1-
export { sign } from "./node/sign";
2-
import { verify } from "./node/verify";
3-
export { verify };
1+
export { sign, signSync } from "./node/sign";
2+
import { verifySync } from "./node/verify";
3+
export { verify, verifySync } from "./node/verify";
44

55
export async function verifyWithFallback(
66
secret: string,
77
payload: string,
88
signature: string,
99
additionalSecrets: undefined | string[],
10-
): Promise<any> {
11-
const firstPass = await verify(secret, payload, signature);
10+
): Promise<boolean> {
11+
return verifyWithFallbackSync(secret, payload, signature, additionalSecrets);
12+
}
13+
14+
export function verifyWithFallbackSync(
15+
secret: string,
16+
payload: string,
17+
signature: string,
18+
additionalSecrets: undefined | string[],
19+
): boolean {
20+
const firstPass = verifySync(secret, payload, signature);
1221

1322
if (firstPass) {
1423
return true;
1524
}
1625

1726
if (additionalSecrets !== undefined) {
1827
for (const s of additionalSecrets) {
19-
const v: boolean = await verify(s, payload, signature);
28+
const v: boolean = verifySync(s, payload, signature);
2029
if (v) {
2130
return v;
2231
}

src/node/sign.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ export async function sign(
55
secret: string | Buffer,
66
payload: string,
77
): Promise<string> {
8+
return signSync(secret, payload);
9+
}
10+
11+
export function signSync(secret: string | Buffer, payload: string): string {
812
if (!secret || !payload) {
913
throw new TypeError(
1014
"[@octokit/webhooks-methods] secret & payload required for sign()",
@@ -15,3 +19,4 @@ export async function sign(
1519
}
1620

1721
sign.VERSION = VERSION;
22+
signSync.VERSION = VERSION;

src/node/verify.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ export async function verify(
99
eventPayload: string,
1010
signature: string,
1111
): Promise<boolean> {
12+
return verifySync(secret, eventPayload, signature);
13+
}
14+
15+
export function verifySync(
16+
secret: string | Buffer,
17+
eventPayload: string,
18+
signature: string,
19+
): boolean {
1220
if (!secret || !eventPayload || !signature) {
1321
throw new TypeError(
1422
"[@octokit/webhooks-methods] secret, eventPayload & signature required",
@@ -24,9 +32,9 @@ export async function verify(
2432
return false;
2533
}
2634

27-
const verificationBuffer = Buffer.from(
28-
createHmac("sha256", secret).update(eventPayload).digest(),
29-
);
35+
const verificationBuffer = createHmac("sha256", secret)
36+
.update(eventPayload)
37+
.digest().buffer as Buffer;
3038

3139
// constant time comparison to prevent timing attacks
3240
// https://stackoverflow.com/a/31096242/206879
@@ -35,3 +43,4 @@ export async function verify(
3543
}
3644

3745
verify.VERSION = VERSION;
46+
verifySync.VERSION = VERSION;

src/web.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { type SignOptions } from "./types";
2-
31
const enc = new TextEncoder();
42

53
function hexToUInt8Array(string: string) {
@@ -35,15 +33,7 @@ async function importKey(secret: string) {
3533
);
3634
}
3735

38-
export async function sign(options: SignOptions | string, payload: string) {
39-
const { secret, algorithm } =
40-
typeof options === "object"
41-
? {
42-
secret: options.secret,
43-
algorithm: "sha256",
44-
}
45-
: { secret: options, algorithm: "sha256" };
46-
36+
export async function sign(secret: string, payload: string) {
4737
if (!secret || !payload) {
4838
throw new TypeError(
4939
"[@octokit/webhooks-methods] secret & payload required for sign()",
@@ -56,7 +46,7 @@ export async function sign(options: SignOptions | string, payload: string) {
5646
enc.encode(payload),
5747
);
5848

59-
return `${algorithm}=${UInt8ArrayToHex(signature)}`;
49+
return `sha256=${UInt8ArrayToHex(signature)}`;
6050
}
6151

6252
export async function verify(

test/sign.test.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { sign } from "../src";
1+
import { sign, signSync } from "../src";
22

33
const eventPayload = {
44
foo: "bar",
@@ -60,3 +60,20 @@ describe("sign", () => {
6060
});
6161
});
6262
});
63+
64+
describe("signSync", () => {
65+
it("is a function", () => {
66+
expect(signSync).toBeInstanceOf(Function);
67+
});
68+
69+
it("signSync.VERSION is set", () => {
70+
expect(signSync.VERSION).toEqual("0.0.0-development");
71+
});
72+
73+
test("signSync(secret, eventPayload)", () => {
74+
const signature = signSync(secret, JSON.stringify(eventPayload));
75+
expect(signature).toBe(
76+
"sha256=4864d2759938a15468b5df9ade20bf161da9b4f737ea61794142f3484236bda3",
77+
);
78+
});
79+
});

test/verify.test.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { verify, verifyWithFallback } from "../src";
1+
import { verify, verifySync, verifyWithFallback } from "../src";
22

33
function toNormalizedJsonString(payload: object) {
44
// GitHub sends its JSON with an indentation of 2 spaces and a line break at the end
@@ -147,3 +147,18 @@ describe("verifyWithFallback", () => {
147147
expect(signatureMatches).toBe(false);
148148
});
149149
});
150+
151+
describe("verifySync", () => {
152+
it("is a function", () => {
153+
expect(verifySync).toBeInstanceOf(Function);
154+
});
155+
156+
it("verifySync.VERSION is set", () => {
157+
expect(verifySync.VERSION).toEqual("0.0.0-development");
158+
});
159+
160+
test("verifySync(secret, eventPayload, signature) returns true for correct signature", () => {
161+
const signatureMatches = verifySync(secret, eventPayload, signature);
162+
expect(signatureMatches).toBe(true);
163+
});
164+
});

0 commit comments

Comments
 (0)