diff --git a/dist/index.cjs b/dist/index.cjs index 7be0246..6c8cf8f 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -87,6 +87,7 @@ __export(src_exports, { rsaASN1AlgorithmIdentifier: () => rsaASN1AlgorithmIdentifier, signAsDraftToRequest: () => signAsDraftToRequest, signatureHeaderIsDraft: () => signatureHeaderIsDraft, + splitPer64Chars: () => splitPer64Chars, validateAndProcessParsedDraftSignatureHeader: () => validateAndProcessParsedDraftSignatureHeader, validateRequestAndGetSignatureHeader: () => validateRequestAndGetSignatureHeader, verifyDigestHeader: () => verifyDigestHeader, @@ -349,6 +350,13 @@ function genSignInfo(parsed, defaults = { } throw new KeyValidationError("Unknown algorithm"); } +function splitPer64Chars(str) { + const result = []; + for (let i = 0; i < str.length; i += 64) { + result.push(str.slice(i, i + 64)); + } + return result; +} // src/pem/pkcs8.ts var import_asn1js3 = __toESM(require("@lapo/asn1js"), 1); @@ -719,11 +727,11 @@ function parseRequestSignature(request, options) { // src/keypair.ts async function exportPublicKeyPem(key) { const ab = await globalThis.crypto.subtle.exportKey("spki", key); - return "-----BEGIN PUBLIC KEY-----\n" + encodeArrayBufferToBase64(ab) + "\n-----END PUBLIC KEY-----\n"; + return "-----BEGIN PUBLIC KEY-----\n" + splitPer64Chars(encodeArrayBufferToBase64(ab)).join("\n") + "\n-----END PUBLIC KEY-----\n"; } async function exportPrivateKeyPem(key) { const ab = await globalThis.crypto.subtle.exportKey("pkcs8", key); - return "-----BEGIN PRIVATE KEY-----\n" + encodeArrayBufferToBase64(ab) + "\n-----END PRIVATE KEY-----\n"; + return "-----BEGIN PRIVATE KEY-----\n" + splitPer64Chars(encodeArrayBufferToBase64(ab)).join("\n") + "\n-----END PRIVATE KEY-----\n"; } async function genRsaKeyPair(modulusLength = 4096, keyUsage = ["sign", "verify"]) { const keyPair = await globalThis.crypto.subtle.generateKey( @@ -1007,6 +1015,7 @@ async function verifyDraftSignature(parsed, publicKeyPem, errorLogger) { rsaASN1AlgorithmIdentifier, signAsDraftToRequest, signatureHeaderIsDraft, + splitPer64Chars, validateAndProcessParsedDraftSignatureHeader, validateRequestAndGetSignatureHeader, verifyDigestHeader, diff --git a/dist/index.mjs b/dist/index.mjs index 38a5b21..48c5ace 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -252,6 +252,13 @@ function genSignInfo(parsed, defaults = { } throw new KeyValidationError("Unknown algorithm"); } +function splitPer64Chars(str) { + const result = []; + for (let i = 0; i < str.length; i += 64) { + result.push(str.slice(i, i + 64)); + } + return result; +} // src/pem/pkcs8.ts import ASN13 from "@lapo/asn1js"; @@ -622,11 +629,11 @@ function parseRequestSignature(request, options) { // src/keypair.ts async function exportPublicKeyPem(key) { const ab = await globalThis.crypto.subtle.exportKey("spki", key); - return "-----BEGIN PUBLIC KEY-----\n" + encodeArrayBufferToBase64(ab) + "\n-----END PUBLIC KEY-----\n"; + return "-----BEGIN PUBLIC KEY-----\n" + splitPer64Chars(encodeArrayBufferToBase64(ab)).join("\n") + "\n-----END PUBLIC KEY-----\n"; } async function exportPrivateKeyPem(key) { const ab = await globalThis.crypto.subtle.exportKey("pkcs8", key); - return "-----BEGIN PRIVATE KEY-----\n" + encodeArrayBufferToBase64(ab) + "\n-----END PRIVATE KEY-----\n"; + return "-----BEGIN PRIVATE KEY-----\n" + splitPer64Chars(encodeArrayBufferToBase64(ab)).join("\n") + "\n-----END PRIVATE KEY-----\n"; } async function genRsaKeyPair(modulusLength = 4096, keyUsage = ["sign", "verify"]) { const keyPair = await globalThis.crypto.subtle.generateKey( @@ -909,6 +916,7 @@ export { rsaASN1AlgorithmIdentifier, signAsDraftToRequest, signatureHeaderIsDraft, + splitPer64Chars, validateAndProcessParsedDraftSignatureHeader, validateRequestAndGetSignatureHeader, verifyDigestHeader, diff --git a/dist/utils.d.ts b/dist/utils.d.ts index 572c7c8..bea5185 100644 --- a/dist/utils.d.ts +++ b/dist/utils.d.ts @@ -32,3 +32,4 @@ export declare function genSignInfo(parsed: ParsedAlgorithmIdentifier, defaults? hash: SignatureHashAlgorithmUpperSnake; ec: 'DSA' | 'DH'; }): SignInfo; +export declare function splitPer64Chars(str: string): string[]; diff --git a/package.json b/package.json index ce9164b..7a06864 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@misskey-dev/node-http-message-signatures", - "version": "0.0.0-alpha.16", + "version": "0.0.0-alpha.17", "description": "", "type": "module", "keywords": [ diff --git a/src/keypair.ts b/src/keypair.ts index 389d64b..4c55b0d 100644 --- a/src/keypair.ts +++ b/src/keypair.ts @@ -4,20 +4,20 @@ */ import type { webcrypto as crypto } from 'node:crypto'; -import { encodeArrayBufferToBase64 } from './utils'; +import { encodeArrayBufferToBase64, splitPer64Chars } from './utils'; import { ECNamedCurve } from './types'; export async function exportPublicKeyPem(key: crypto.CryptoKey) { const ab = await globalThis.crypto.subtle.exportKey('spki', key); return '-----BEGIN PUBLIC KEY-----\n' + - encodeArrayBufferToBase64(ab) + + splitPer64Chars(encodeArrayBufferToBase64(ab)).join('\n') + '\n-----END PUBLIC KEY-----\n'; } export async function exportPrivateKeyPem(key: crypto.CryptoKey) { const ab = await globalThis.crypto.subtle.exportKey('pkcs8', key); return '-----BEGIN PRIVATE KEY-----\n' + - encodeArrayBufferToBase64(ab) + + splitPer64Chars(encodeArrayBufferToBase64(ab)).join('\n') + '\n-----END PRIVATE KEY-----\n'; } diff --git a/src/utils.test.ts b/src/utils.test.ts index a515e51..16131ec 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -1,4 +1,5 @@ -import { genASN1Length } from "./utils"; +import { genASN1Length, splitPer64Chars } from "./utils"; +import { rsa4096 } from "../test/keys"; describe(genASN1Length, () => { test('10', () => { @@ -14,3 +15,13 @@ describe(genASN1Length, () => { expect(genASN1Length(1145141919810)).toEqual(Uint8Array.from([0x86, 1, 10, 159, 199, 0, 66])); }); }); + +describe(splitPer64Chars, () => { + test('short', () => { + expect(splitPer64Chars('a').length).toBe(1); + expect(splitPer64Chars('a')[0]).toBe('a'); + }); + test('normal', () => { + expect(splitPer64Chars(rsa4096.privateKey).length).toBe(Math.ceil(rsa4096.privateKey.length / 64)); + }); +}); diff --git a/src/utils.ts b/src/utils.ts index 93471ff..9ac1fa9 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -113,3 +113,11 @@ export function genSignInfo( } throw new KeyValidationError('Unknown algorithm'); } + +export function splitPer64Chars(str: string): string[] { + const result = [] as string[]; + for (let i = 0; i < str.length; i += 64) { + result.push(str.slice(i, i + 64)); + } + return result; +}