Skip to content

Commit

Permalink
fix: PEMに改行を含む
Browse files Browse the repository at this point in the history
  • Loading branch information
tamaina committed Mar 3, 2024
1 parent cf1c296 commit 33d18a2
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 9 deletions.
13 changes: 11 additions & 2 deletions dist/index.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ __export(src_exports, {
rsaASN1AlgorithmIdentifier: () => rsaASN1AlgorithmIdentifier,
signAsDraftToRequest: () => signAsDraftToRequest,
signatureHeaderIsDraft: () => signatureHeaderIsDraft,
splitPer64Chars: () => splitPer64Chars,
validateAndProcessParsedDraftSignatureHeader: () => validateAndProcessParsedDraftSignatureHeader,
validateRequestAndGetSignatureHeader: () => validateRequestAndGetSignatureHeader,
verifyDigestHeader: () => verifyDigestHeader,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -1007,6 +1015,7 @@ async function verifyDraftSignature(parsed, publicKeyPem, errorLogger) {
rsaASN1AlgorithmIdentifier,
signAsDraftToRequest,
signatureHeaderIsDraft,
splitPer64Chars,
validateAndProcessParsedDraftSignatureHeader,
validateRequestAndGetSignatureHeader,
verifyDigestHeader,
Expand Down
12 changes: 10 additions & 2 deletions dist/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -909,6 +916,7 @@ export {
rsaASN1AlgorithmIdentifier,
signAsDraftToRequest,
signatureHeaderIsDraft,
splitPer64Chars,
validateAndProcessParsedDraftSignatureHeader,
validateRequestAndGetSignatureHeader,
verifyDigestHeader,
Expand Down
1 change: 1 addition & 0 deletions dist/utils.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ export declare function genSignInfo(parsed: ParsedAlgorithmIdentifier, defaults?
hash: SignatureHashAlgorithmUpperSnake;
ec: 'DSA' | 'DH';
}): SignInfo;
export declare function splitPer64Chars(str: string): string[];
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
6 changes: 3 additions & 3 deletions src/keypair.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}

Expand Down
13 changes: 12 additions & 1 deletion src/utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { genASN1Length } from "./utils";
import { genASN1Length, splitPer64Chars } from "./utils";
import { rsa4096 } from "../test/keys";

describe(genASN1Length, () => {
test('10', () => {
Expand All @@ -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));
});
});
8 changes: 8 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

0 comments on commit 33d18a2

Please sign in to comment.