Skip to content

Commit 15ae1e5

Browse files
committed
✌️
1 parent 70d3163 commit 15ae1e5

File tree

7 files changed

+68
-11
lines changed

7 files changed

+68
-11
lines changed

dist/index.cjs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ __export(src_exports, {
4545
UnknownSignatureHeaderFormatError: () => UnknownSignatureHeaderFormatError,
4646
asn1ToArrayBuffer: () => asn1ToArrayBuffer,
4747
checkClockSkew: () => checkClockSkew,
48+
decodeBase64ToUint8Array: () => decodeBase64ToUint8Array,
4849
decodePem: () => decodePem,
4950
detectAndVerifyAlgorithm: () => detectAndVerifyAlgorithm,
5051
digestHashAlgosForDecoding: () => digestHashAlgosForDecoding,
@@ -268,6 +269,14 @@ function encodeArrayBufferToBase64(buffer) {
268269
const binary = String.fromCharCode(...uint8Array);
269270
return btoa(binary);
270271
}
272+
function decodeBase64ToUint8Array(base64) {
273+
const binary = atob(base64);
274+
const uint8Array = new Uint8Array(binary.length);
275+
for (let i = 0; i < binary.length; i++) {
276+
uint8Array[i] = binary.charCodeAt(i);
277+
}
278+
return uint8Array;
279+
}
271280

272281
// src/pem/pkcs8.ts
273282
var import_asn1js3 = __toESM(require("@lapo/asn1js"), 1);
@@ -471,7 +480,7 @@ function genSignOrVerifyAlgorithm(parsed, defaults = {
471480
if (!algorithm)
472481
throw new SpkiParseError("Unknown algorithm");
473482
if (algorithm === "RSASSA-PKCS1-v1_5") {
474-
return { name: "RSASSA-PKCS1-v1_5" };
483+
return "RSASSA-PKCS1-v1_5";
475484
}
476485
if (algorithm === "EC") {
477486
return {
@@ -970,7 +979,6 @@ function detectAndVerifyAlgorithm(algorithm, publicKey, errorLogger) {
970979

971980
// src/draft/verify.ts
972981
var ncrypto2 = __toESM(require("node:crypto"), 1);
973-
var import_base642 = __toESM(require("@lapo/asn1js/base64.js"), 1);
974982
function verifyDraftSignature(parsed, publicKeyPem, errorLogger) {
975983
const publicKey = ncrypto2.createPublicKey(publicKeyPem);
976984
try {
@@ -988,7 +996,7 @@ async function webVerifyDraftSignature(parsed, publicKeyPem, errorLogger) {
988996
try {
989997
const parsedSpki = parsePublicKey(publicKeyPem);
990998
const publicKey = await crypto.subtle.importKey("spki", parsedSpki.der, genKeyImportParams(parsedSpki), false, ["verify"]);
991-
const verify2 = await crypto.subtle.verify(genSignOrVerifyAlgorithm(parsedSpki), publicKey, import_base642.default.decode(parsed.params.signature), new TextEncoder().encode(parsed.signingString));
999+
const verify2 = await crypto.subtle.verify(genSignOrVerifyAlgorithm(parsedSpki), publicKey, decodeBase64ToUint8Array(parsed.params.signature), new TextEncoder().encode(parsed.signingString));
9921000
return verify2;
9931001
} catch (e) {
9941002
if (errorLogger)
@@ -1013,6 +1021,7 @@ async function webVerifyDraftSignature(parsed, publicKeyPem, errorLogger) {
10131021
UnknownSignatureHeaderFormatError,
10141022
asn1ToArrayBuffer,
10151023
checkClockSkew,
1024+
decodeBase64ToUint8Array,
10161025
decodePem,
10171026
detectAndVerifyAlgorithm,
10181027
digestHashAlgosForDecoding,

dist/index.mjs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,14 @@ function encodeArrayBufferToBase64(buffer) {
172172
const binary = String.fromCharCode(...uint8Array);
173173
return btoa(binary);
174174
}
175+
function decodeBase64ToUint8Array(base64) {
176+
const binary = atob(base64);
177+
const uint8Array = new Uint8Array(binary.length);
178+
for (let i = 0; i < binary.length; i++) {
179+
uint8Array[i] = binary.charCodeAt(i);
180+
}
181+
return uint8Array;
182+
}
175183

176184
// src/pem/pkcs8.ts
177185
import ASN13 from "@lapo/asn1js";
@@ -375,7 +383,7 @@ function genSignOrVerifyAlgorithm(parsed, defaults = {
375383
if (!algorithm)
376384
throw new SpkiParseError("Unknown algorithm");
377385
if (algorithm === "RSASSA-PKCS1-v1_5") {
378-
return { name: "RSASSA-PKCS1-v1_5" };
386+
return "RSASSA-PKCS1-v1_5";
379387
}
380388
if (algorithm === "EC") {
381389
return {
@@ -874,7 +882,6 @@ function detectAndVerifyAlgorithm(algorithm, publicKey, errorLogger) {
874882

875883
// src/draft/verify.ts
876884
import * as ncrypto2 from "node:crypto";
877-
import Base642 from "@lapo/asn1js/base64.js";
878885
function verifyDraftSignature(parsed, publicKeyPem, errorLogger) {
879886
const publicKey = ncrypto2.createPublicKey(publicKeyPem);
880887
try {
@@ -892,7 +899,7 @@ async function webVerifyDraftSignature(parsed, publicKeyPem, errorLogger) {
892899
try {
893900
const parsedSpki = parsePublicKey(publicKeyPem);
894901
const publicKey = await crypto.subtle.importKey("spki", parsedSpki.der, genKeyImportParams(parsedSpki), false, ["verify"]);
895-
const verify2 = await crypto.subtle.verify(genSignOrVerifyAlgorithm(parsedSpki), publicKey, Base642.decode(parsed.params.signature), new TextEncoder().encode(parsed.signingString));
902+
const verify2 = await crypto.subtle.verify(genSignOrVerifyAlgorithm(parsedSpki), publicKey, decodeBase64ToUint8Array(parsed.params.signature), new TextEncoder().encode(parsed.signingString));
896903
return verify2;
897904
} catch (e) {
898905
if (errorLogger)
@@ -916,6 +923,7 @@ export {
916923
UnknownSignatureHeaderFormatError,
917924
asn1ToArrayBuffer,
918925
checkClockSkew,
926+
decodeBase64ToUint8Array,
919927
decodePem,
920928
detectAndVerifyAlgorithm,
921929
digestHashAlgosForDecoding,

dist/utils.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,7 @@ export declare function genASN1Length(length: number | bigint): Uint8Array;
2828
* For web
2929
*/
3030
export declare function encodeArrayBufferToBase64(buffer: ArrayBuffer): string;
31+
/**
32+
* for Web
33+
*/
34+
export declare function decodeBase64ToUint8Array(base64: string): Uint8Array;

src/draft/verify.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { detectAndVerifyAlgorithm } from '../shared/verify.js';
22
import * as ncrypto from 'node:crypto';
33
import type { ParsedDraftSignature } from '../types.js';
44
import { genKeyImportParams, genSignOrVerifyAlgorithm, parsePublicKey } from '../pem/spki.js';
5-
import Base64 from '@lapo/asn1js/base64.js';
5+
import { decodeBase64ToUint8Array } from '../utils.js';
66

77
export function verifyDraftSignature(parsed: ParsedDraftSignature['value'], publicKeyPem: string, errorLogger?: ((message: any) => any)) {
88
const publicKey = ncrypto.createPublicKey(publicKeyPem);
@@ -25,7 +25,7 @@ export async function webVerifyDraftSignature(parsed: ParsedDraftSignature['valu
2525
const parsedSpki = parsePublicKey(publicKeyPem);
2626
const publicKey = await crypto.subtle.importKey('spki', parsedSpki.der, genKeyImportParams(parsedSpki), false, ['verify']);
2727

28-
const verify = await crypto.subtle.verify(genSignOrVerifyAlgorithm(parsedSpki), publicKey, Base64.decode(parsed.params.signature), (new TextEncoder()).encode(parsed.signingString));
28+
const verify = await crypto.subtle.verify(genSignOrVerifyAlgorithm(parsedSpki), publicKey, decodeBase64ToUint8Array(parsed.params.signature), (new TextEncoder()).encode(parsed.signingString));
2929
return verify;
3030
} catch (e) {
3131
if (errorLogger) errorLogger(e);

src/pem/spki.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ export function genSignOrVerifyAlgorithm(
225225
if (!algorithm) throw new SpkiParseError('Unknown algorithm');
226226

227227
if (algorithm === 'RSASSA-PKCS1-v1_5') {
228-
return { name: 'RSASSA-PKCS1-v1_5' };
228+
return 'RSASSA-PKCS1-v1_5';
229229
}
230230
if (algorithm === 'EC') {
231231
return {

src/utils.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,15 @@ export function encodeArrayBufferToBase64(buffer: ArrayBuffer): string {
126126
const binary = String.fromCharCode(...uint8Array);
127127
return btoa(binary);
128128
}
129+
130+
/**
131+
* for Web
132+
*/
133+
export function decodeBase64ToUint8Array(base64: string): Uint8Array {
134+
const binary = atob(base64);
135+
const uint8Array = new Uint8Array(binary.length);
136+
for (let i = 0; i < binary.length; i++) {
137+
uint8Array[i] = binary.charCodeAt(i);
138+
}
139+
return uint8Array;
140+
}

test/performance/draft.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ console.log('Performance test, TRYES:', TRYES);
5757
}
5858
logPerf('web Sign RSA4096, SHA-256', process.hrtime(start));
5959
}
60+
{
61+
const start = process.hrtime();
62+
await Promise.all(Array(TRYES).fill().map(() => signAsDraftToRequestWeb(request, { keyId: 'test', privateKeyPem: rsa4096.privateKey }, basicIncludeHeaders, { hashAlgorithm: 'sha256' })));
63+
logPerf('web(Promise.all) Sign RSA4096, SHA-256', process.hrtime(start));
64+
}
6065

6166
/**
6267
* Ed25519
@@ -75,6 +80,11 @@ console.log('Performance test, TRYES:', TRYES);
7580
}
7681
logPerf('web Sign Ed25519', process.hrtime(start));
7782
}
83+
{
84+
const start = process.hrtime();
85+
await Promise.all(Array(TRYES).fill().map(() => signAsDraftToRequestWeb(request, { keyId: 'test', privateKeyPem: ed25519.privateKey }, basicIncludeHeaders, { hashAlgorithm: null })));
86+
logPerf('web(Promise.all) Sign Ed25519', process.hrtime(start));
87+
}
7888
}
7989

8090
/**
@@ -97,7 +107,6 @@ console.log('Performance test, TRYES:', TRYES);
97107
}
98108
logPerf(testCase, process.hrtime(start));
99109
}
100-
101110
{
102111
const testCase = 'web Verify RSA4096, SHA-256';
103112
const start = process.hrtime();
@@ -109,6 +118,14 @@ console.log('Performance test, TRYES:', TRYES);
109118
}
110119
logPerf(testCase, process.hrtime(start));
111120
}
121+
{
122+
const testCase = 'web(Promise.all) Verify RSA4096, SHA-256';
123+
const start = process.hrtime();
124+
await Promise.all(Array(TRYES).fill().map(() =>
125+
webVerifyDraftSignature(parsed.value, rsa4096.publicKey)
126+
.then(r => r ? true : Promise.reject(new Error('failed')))));
127+
logPerf(testCase, process.hrtime(start));
128+
}
112129

113130
request.headers = lcObjectKey(request.headers);
114131
const parsedJ = httpSignature.parseRequest(request);
@@ -145,7 +162,6 @@ console.log('Performance test, TRYES:', TRYES);
145162
}
146163
logPerf(testCase, process.hrtime(start));
147164
}
148-
149165
{
150166
const testCase = 'web Verify Ed25519';
151167
const start = process.hrtime();
@@ -158,6 +174,14 @@ console.log('Performance test, TRYES:', TRYES);
158174
const end = performance.now();
159175
logPerf(testCase, process.hrtime(start));
160176
}
177+
{
178+
const testCase = 'web(Promise.all) Verify Ed25519';
179+
const start = process.hrtime();
180+
await Promise.all(Array(TRYES).fill().map(() =>
181+
webVerifyDraftSignature(parsed.value, ed25519.publicKey)
182+
.then(r => r ? true : Promise.reject(new Error('failed')))));
183+
logPerf(testCase, process.hrtime(start));
184+
}
161185

162186
request.headers = lcObjectKey(request.headers);
163187
const parsedJ = httpSignature.parseRequest(request);

0 commit comments

Comments
 (0)