@reallyme/codec 0.1.9
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 +201 -0
- package/README.md +54 -0
- package/dist/baseEncoding.d.ts +7 -0
- package/dist/baseEncoding.js +33 -0
- package/dist/cbor.d.ts +42 -0
- package/dist/cbor.js +189 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.js +11 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.js +63 -0
- package/dist/jcs.d.ts +2 -0
- package/dist/jcs.js +71 -0
- package/dist/multiformat.d.ts +40 -0
- package/dist/multiformat.js +169 -0
- package/dist/pem.d.ts +21 -0
- package/dist/pem.js +88 -0
- package/dist/proto/generated/reallyme/codec/v1/codec_pb.d.ts +492 -0
- package/dist/proto/generated/reallyme/codec/v1/codec_pb.js +256 -0
- package/dist/proto.d.ts +2 -0
- package/dist/proto.js +4 -0
- package/dist/readOutput.d.ts +21 -0
- package/dist/readOutput.js +109 -0
- package/dist/wasm/LICENSE +17 -0
- package/dist/wasm/reallyme_codec_wasm.d.ts +302 -0
- package/dist/wasm/reallyme_codec_wasm.js +984 -0
- package/dist/wasm/reallyme_codec_wasm_bg.wasm +0 -0
- package/dist/wasmProvider.d.ts +67 -0
- package/dist/wasmProvider.js +178 -0
- package/package.json +47 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
export { ReallyMeCodecError } from "./errors.js";
|
|
5
|
+
export { base64Decode, base64Encode, base64urlDecode, base64urlDecodeBytes, base64urlEncode, bytesToLowerHex, lowerHexToBytes, } from "./baseEncoding.js";
|
|
6
|
+
export { base58btcDecode, base58btcEncode, bindingTypeMatchesCodec, multibaseBase58btcEncode, multibaseBase64urlEncode, multibaseDecode, multicodecLookupPrefixProto, multicodecLookupPrefixProtoResult, multicodecLookupPrefix, multicodecPrefixForNameProto, multicodecPrefixForNameProtoResult, multicodecPrefixForName, multicodecStripPrefix, multicodecTable, multicodecTableProto, multicodecTableProtoResult, multikeyEncode, multikeyParse, multikeyParseProto, multikeyParseProtoResult, requireSupportedMulticodec, validateKeyBinding, } from "./multiformat.js";
|
|
7
|
+
export { dagCborCodecCode, dagCborComputeCid, dagCborDecode, dagCborEncode, dagCborMultihash, dagCborSha256ContentHash, dagCborVerifyCid, dagCborVerifyCidProto, dagCborVerifyCidProtoResult, isValidCidString, tryParseCid, } from "./cbor.js";
|
|
8
|
+
export { canonicalizeJson, canonicalizeJsonText } from "./jcs.js";
|
|
9
|
+
export { decodePem, decodePemProto, decodePemProtoResult, encodePem } from "./pem.js";
|
|
10
|
+
export { REALLYME_CODEC_WASM_EXPORTS, installReallyMeCodecWasmProvider, requireReallyMeCodecWasmProvider, } from "./wasmProvider.js";
|
|
11
|
+
import { base64Decode, base64Encode, base64urlDecode, base64urlDecodeBytes, base64urlEncode, bytesToLowerHex, lowerHexToBytes, } from "./baseEncoding.js";
|
|
12
|
+
import { dagCborCodecCode, dagCborComputeCid, dagCborDecode, dagCborEncode, dagCborMultihash, dagCborSha256ContentHash, dagCborVerifyCid, dagCborVerifyCidProto, dagCborVerifyCidProtoResult, isValidCidString, tryParseCid, } from "./cbor.js";
|
|
13
|
+
import { canonicalizeJson, canonicalizeJsonText } from "./jcs.js";
|
|
14
|
+
import { base58btcDecode, base58btcEncode, bindingTypeMatchesCodec, multibaseBase58btcEncode, multibaseBase64urlEncode, multibaseDecode, multicodecLookupPrefixProto, multicodecLookupPrefixProtoResult, multicodecLookupPrefix, multicodecPrefixForNameProto, multicodecPrefixForNameProtoResult, multicodecPrefixForName, multicodecStripPrefix, multicodecTable, multicodecTableProto, multicodecTableProtoResult, multikeyEncode, multikeyParse, multikeyParseProto, multikeyParseProtoResult, requireSupportedMulticodec, validateKeyBinding, } from "./multiformat.js";
|
|
15
|
+
import { decodePem, decodePemProto, decodePemProtoResult, encodePem } from "./pem.js";
|
|
16
|
+
export const ReallyMeCodec = {
|
|
17
|
+
base64Decode,
|
|
18
|
+
base64Encode,
|
|
19
|
+
base64urlDecode,
|
|
20
|
+
base64urlDecodeBytes,
|
|
21
|
+
base64urlEncode,
|
|
22
|
+
bytesToLowerHex,
|
|
23
|
+
lowerHexToBytes,
|
|
24
|
+
base58btcDecode,
|
|
25
|
+
base58btcEncode,
|
|
26
|
+
bindingTypeMatchesCodec,
|
|
27
|
+
multibaseBase58btcEncode,
|
|
28
|
+
multibaseBase64urlEncode,
|
|
29
|
+
multibaseDecode,
|
|
30
|
+
multicodecLookupPrefixProto,
|
|
31
|
+
multicodecLookupPrefixProtoResult,
|
|
32
|
+
multicodecLookupPrefix,
|
|
33
|
+
multicodecPrefixForNameProto,
|
|
34
|
+
multicodecPrefixForNameProtoResult,
|
|
35
|
+
multicodecPrefixForName,
|
|
36
|
+
multicodecStripPrefix,
|
|
37
|
+
multicodecTable,
|
|
38
|
+
multicodecTableProto,
|
|
39
|
+
multicodecTableProtoResult,
|
|
40
|
+
multikeyEncode,
|
|
41
|
+
multikeyParse,
|
|
42
|
+
multikeyParseProto,
|
|
43
|
+
multikeyParseProtoResult,
|
|
44
|
+
requireSupportedMulticodec,
|
|
45
|
+
validateKeyBinding,
|
|
46
|
+
dagCborCodecCode,
|
|
47
|
+
dagCborComputeCid,
|
|
48
|
+
dagCborDecode,
|
|
49
|
+
dagCborEncode,
|
|
50
|
+
dagCborMultihash,
|
|
51
|
+
dagCborSha256ContentHash,
|
|
52
|
+
dagCborVerifyCid,
|
|
53
|
+
dagCborVerifyCidProto,
|
|
54
|
+
dagCborVerifyCidProtoResult,
|
|
55
|
+
isValidCidString,
|
|
56
|
+
tryParseCid,
|
|
57
|
+
canonicalizeJson,
|
|
58
|
+
canonicalizeJsonText,
|
|
59
|
+
decodePem,
|
|
60
|
+
decodePemProto,
|
|
61
|
+
decodePemProtoResult,
|
|
62
|
+
encodePem,
|
|
63
|
+
};
|
package/dist/jcs.d.ts
ADDED
package/dist/jcs.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import { ReallyMeCodecError } from "./errors.js";
|
|
5
|
+
import { readStringOutput } from "./readOutput.js";
|
|
6
|
+
import { requireReallyMeCodecWasmProvider } from "./wasmProvider.js";
|
|
7
|
+
const maxJsonContainerDepth = 128;
|
|
8
|
+
const validateJsonCompatible = (value, depth = 0, seen = new WeakSet()) => {
|
|
9
|
+
if (value === null) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
switch (typeof value) {
|
|
13
|
+
case "boolean":
|
|
14
|
+
case "string":
|
|
15
|
+
return;
|
|
16
|
+
case "number":
|
|
17
|
+
if (!Number.isFinite(value)) {
|
|
18
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
19
|
+
}
|
|
20
|
+
return;
|
|
21
|
+
case "bigint":
|
|
22
|
+
case "function":
|
|
23
|
+
case "symbol":
|
|
24
|
+
case "undefined":
|
|
25
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
26
|
+
case "object":
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
if (seen.has(value)) {
|
|
30
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
31
|
+
}
|
|
32
|
+
if (depth >= maxJsonContainerDepth) {
|
|
33
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
34
|
+
}
|
|
35
|
+
if (typeof Reflect.get(value, "toJSON") === "function") {
|
|
36
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
37
|
+
}
|
|
38
|
+
const prototype = Object.getPrototypeOf(value);
|
|
39
|
+
if (prototype !== Object.prototype && prototype !== null && !Array.isArray(value)) {
|
|
40
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
41
|
+
}
|
|
42
|
+
seen.add(value);
|
|
43
|
+
try {
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
for (const entry of value) {
|
|
46
|
+
validateJsonCompatible(entry, depth + 1, seen);
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
for (const key of Object.keys(value)) {
|
|
51
|
+
validateJsonCompatible(Reflect.get(value, key), depth + 1, seen);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
seen.delete(value);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
export const canonicalizeJson = (value) => {
|
|
59
|
+
validateJsonCompatible(value);
|
|
60
|
+
const encoded = JSON.stringify(value);
|
|
61
|
+
if (encoded === undefined) {
|
|
62
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
63
|
+
}
|
|
64
|
+
return readStringOutput(requireReallyMeCodecWasmProvider().canonicalizeJson(encoded));
|
|
65
|
+
};
|
|
66
|
+
export const canonicalizeJsonText = (json) => {
|
|
67
|
+
if (typeof json !== "string" || json.length === 0) {
|
|
68
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
69
|
+
}
|
|
70
|
+
return readStringOutput(requireReallyMeCodecWasmProvider().canonicalizeJson(json));
|
|
71
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ReallyMeCodecProtoResult } from "./readOutput.js";
|
|
2
|
+
export type ReallyMeMulticodecTag = "encryption" | "hash" | "key" | "multihash" | "multikey";
|
|
3
|
+
export type ReallyMeKeyMaterialKind = "not-key" | "public-key" | "private-key" | "symmetric-key";
|
|
4
|
+
export type ReallyMeMulticodecMetadata = Readonly<{
|
|
5
|
+
name: string;
|
|
6
|
+
alg: string;
|
|
7
|
+
tag: ReallyMeMulticodecTag;
|
|
8
|
+
keyMaterial: ReallyMeKeyMaterialKind;
|
|
9
|
+
prefix: Uint8Array;
|
|
10
|
+
expectedKeyLength?: number;
|
|
11
|
+
}>;
|
|
12
|
+
export type ReallyMeParsedMultikey = Readonly<{
|
|
13
|
+
codecName: string;
|
|
14
|
+
algorithmName: string;
|
|
15
|
+
publicKey: Uint8Array;
|
|
16
|
+
expectedPublicKeyLength?: number;
|
|
17
|
+
}>;
|
|
18
|
+
export declare const readMulticodecMetadata: (value: unknown) => ReallyMeMulticodecMetadata;
|
|
19
|
+
export declare const base58btcEncode: (bytes: Uint8Array) => string;
|
|
20
|
+
export declare const base58btcDecode: (encoded: string) => Uint8Array;
|
|
21
|
+
export declare const multibaseBase64urlEncode: (bytes: Uint8Array) => string;
|
|
22
|
+
export declare const multibaseBase58btcEncode: (bytes: Uint8Array) => string;
|
|
23
|
+
export declare const multibaseDecode: (encoded: string) => Uint8Array;
|
|
24
|
+
export declare const multicodecPrefixForName: (codecName: string) => ReallyMeMulticodecMetadata;
|
|
25
|
+
export declare const multicodecPrefixForNameProto: (codecName: string) => Uint8Array;
|
|
26
|
+
export declare const multicodecPrefixForNameProtoResult: (codecName: string) => ReallyMeCodecProtoResult;
|
|
27
|
+
export declare const multicodecLookupPrefix: (bytes: Uint8Array) => ReallyMeMulticodecMetadata;
|
|
28
|
+
export declare const multicodecLookupPrefixProto: (bytes: Uint8Array) => Uint8Array;
|
|
29
|
+
export declare const multicodecLookupPrefixProtoResult: (bytes: Uint8Array) => ReallyMeCodecProtoResult;
|
|
30
|
+
export declare const multicodecStripPrefix: (bytes: Uint8Array) => Uint8Array;
|
|
31
|
+
export declare const multicodecTable: () => ReadonlyArray<ReallyMeMulticodecMetadata>;
|
|
32
|
+
export declare const multicodecTableProto: () => Uint8Array;
|
|
33
|
+
export declare const multicodecTableProtoResult: () => ReallyMeCodecProtoResult;
|
|
34
|
+
export declare const multikeyEncode: (codecName: string, publicKey: Uint8Array) => string;
|
|
35
|
+
export declare const multikeyParse: (multikey: string) => ReallyMeParsedMultikey;
|
|
36
|
+
export declare const multikeyParseProto: (multikey: string) => Uint8Array;
|
|
37
|
+
export declare const multikeyParseProtoResult: (multikey: string) => ReallyMeCodecProtoResult;
|
|
38
|
+
export declare const bindingTypeMatchesCodec: (bindingType: string, codecName: string) => boolean;
|
|
39
|
+
export declare const validateKeyBinding: (bindingType: string, algorithm: string | undefined, multikey: string) => void;
|
|
40
|
+
export declare const requireSupportedMulticodec: (codecName: string) => void;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import { ReallyMeCodecError } from "./errors.js";
|
|
5
|
+
import { ensureBytesInput, ensureStringInput, readBooleanOutput, readBytesOutput, readBytesProperty, readObjectOutput, readProtoResultOutput, readOptionalLengthProperty, readStringOutput, readStringProperty, } from "./readOutput.js";
|
|
6
|
+
import { requireReallyMeCodecWasmProvider } from "./wasmProvider.js";
|
|
7
|
+
const validTags = new Set([
|
|
8
|
+
"encryption",
|
|
9
|
+
"hash",
|
|
10
|
+
"key",
|
|
11
|
+
"multihash",
|
|
12
|
+
"multikey",
|
|
13
|
+
]);
|
|
14
|
+
const validKeyMaterialKinds = new Set([
|
|
15
|
+
"not-key",
|
|
16
|
+
"public-key",
|
|
17
|
+
"private-key",
|
|
18
|
+
"symmetric-key",
|
|
19
|
+
]);
|
|
20
|
+
const readTag = (object) => {
|
|
21
|
+
const tag = readStringProperty(object, "tag");
|
|
22
|
+
if (!validTags.has(tag)) {
|
|
23
|
+
throw new ReallyMeCodecError("provider-failure");
|
|
24
|
+
}
|
|
25
|
+
switch (tag) {
|
|
26
|
+
case "encryption":
|
|
27
|
+
case "hash":
|
|
28
|
+
case "key":
|
|
29
|
+
case "multihash":
|
|
30
|
+
case "multikey":
|
|
31
|
+
return tag;
|
|
32
|
+
default:
|
|
33
|
+
throw new ReallyMeCodecError("provider-failure");
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const readKeyMaterial = (object) => {
|
|
37
|
+
const keyMaterial = readStringProperty(object, "keyMaterial");
|
|
38
|
+
if (!validKeyMaterialKinds.has(keyMaterial)) {
|
|
39
|
+
throw new ReallyMeCodecError("provider-failure");
|
|
40
|
+
}
|
|
41
|
+
switch (keyMaterial) {
|
|
42
|
+
case "not-key":
|
|
43
|
+
case "public-key":
|
|
44
|
+
case "private-key":
|
|
45
|
+
case "symmetric-key":
|
|
46
|
+
return keyMaterial;
|
|
47
|
+
default:
|
|
48
|
+
throw new ReallyMeCodecError("provider-failure");
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
export const readMulticodecMetadata = (value) => {
|
|
52
|
+
const object = readObjectOutput(value);
|
|
53
|
+
const expectedKeyLength = readOptionalLengthProperty(object, "expectedKeyLength");
|
|
54
|
+
const metadata = {
|
|
55
|
+
name: readStringProperty(object, "name"),
|
|
56
|
+
alg: readStringProperty(object, "alg"),
|
|
57
|
+
tag: readTag(object),
|
|
58
|
+
keyMaterial: readKeyMaterial(object),
|
|
59
|
+
prefix: readBytesProperty(object, "prefix"),
|
|
60
|
+
};
|
|
61
|
+
if (expectedKeyLength === undefined) {
|
|
62
|
+
return metadata;
|
|
63
|
+
}
|
|
64
|
+
return { ...metadata, expectedKeyLength };
|
|
65
|
+
};
|
|
66
|
+
const readParsedMultikey = (value) => {
|
|
67
|
+
const object = readObjectOutput(value);
|
|
68
|
+
const expectedPublicKeyLength = readOptionalLengthProperty(object, "expectedPublicKeyLength");
|
|
69
|
+
const parsed = {
|
|
70
|
+
codecName: readStringProperty(object, "codecName"),
|
|
71
|
+
algorithmName: readStringProperty(object, "algorithmName"),
|
|
72
|
+
publicKey: readBytesProperty(object, "publicKey"),
|
|
73
|
+
};
|
|
74
|
+
if (expectedPublicKeyLength === undefined) {
|
|
75
|
+
return parsed;
|
|
76
|
+
}
|
|
77
|
+
return { ...parsed, expectedPublicKeyLength };
|
|
78
|
+
};
|
|
79
|
+
const readMulticodecTable = (value) => {
|
|
80
|
+
if (!Array.isArray(value)) {
|
|
81
|
+
throw new ReallyMeCodecError("provider-failure");
|
|
82
|
+
}
|
|
83
|
+
return value.map(readMulticodecMetadata);
|
|
84
|
+
};
|
|
85
|
+
export const base58btcEncode = (bytes) => {
|
|
86
|
+
ensureBytesInput(bytes);
|
|
87
|
+
return readStringOutput(requireReallyMeCodecWasmProvider().base58btcEncode(bytes));
|
|
88
|
+
};
|
|
89
|
+
export const base58btcDecode = (encoded) => {
|
|
90
|
+
ensureStringInput(encoded);
|
|
91
|
+
return readBytesOutput(requireReallyMeCodecWasmProvider().base58btcDecode(encoded));
|
|
92
|
+
};
|
|
93
|
+
export const multibaseBase64urlEncode = (bytes) => {
|
|
94
|
+
ensureBytesInput(bytes);
|
|
95
|
+
return readStringOutput(requireReallyMeCodecWasmProvider().multibaseBase64urlEncode(bytes));
|
|
96
|
+
};
|
|
97
|
+
export const multibaseBase58btcEncode = (bytes) => {
|
|
98
|
+
ensureBytesInput(bytes);
|
|
99
|
+
return readStringOutput(requireReallyMeCodecWasmProvider().multibaseBase58btcEncode(bytes));
|
|
100
|
+
};
|
|
101
|
+
export const multibaseDecode = (encoded) => {
|
|
102
|
+
ensureStringInput(encoded);
|
|
103
|
+
return readBytesOutput(requireReallyMeCodecWasmProvider().multibaseDecode(encoded));
|
|
104
|
+
};
|
|
105
|
+
export const multicodecPrefixForName = (codecName) => {
|
|
106
|
+
ensureStringInput(codecName);
|
|
107
|
+
return readMulticodecMetadata(requireReallyMeCodecWasmProvider().multicodecPrefixForName(codecName));
|
|
108
|
+
};
|
|
109
|
+
export const multicodecPrefixForNameProto = (codecName) => {
|
|
110
|
+
ensureStringInput(codecName);
|
|
111
|
+
return readBytesOutput(requireReallyMeCodecWasmProvider().multicodecPrefixForNameProto(codecName));
|
|
112
|
+
};
|
|
113
|
+
export const multicodecPrefixForNameProtoResult = (codecName) => {
|
|
114
|
+
ensureStringInput(codecName);
|
|
115
|
+
return readProtoResultOutput(requireReallyMeCodecWasmProvider().multicodecPrefixForNameProtoResult(codecName));
|
|
116
|
+
};
|
|
117
|
+
export const multicodecLookupPrefix = (bytes) => {
|
|
118
|
+
ensureBytesInput(bytes);
|
|
119
|
+
return readMulticodecMetadata(requireReallyMeCodecWasmProvider().multicodecLookupPrefix(bytes));
|
|
120
|
+
};
|
|
121
|
+
export const multicodecLookupPrefixProto = (bytes) => {
|
|
122
|
+
ensureBytesInput(bytes);
|
|
123
|
+
return readBytesOutput(requireReallyMeCodecWasmProvider().multicodecLookupPrefixProto(bytes));
|
|
124
|
+
};
|
|
125
|
+
export const multicodecLookupPrefixProtoResult = (bytes) => {
|
|
126
|
+
ensureBytesInput(bytes);
|
|
127
|
+
return readProtoResultOutput(requireReallyMeCodecWasmProvider().multicodecLookupPrefixProtoResult(bytes));
|
|
128
|
+
};
|
|
129
|
+
export const multicodecStripPrefix = (bytes) => {
|
|
130
|
+
ensureBytesInput(bytes);
|
|
131
|
+
return readBytesOutput(requireReallyMeCodecWasmProvider().multicodecStripPrefix(bytes));
|
|
132
|
+
};
|
|
133
|
+
export const multicodecTable = () => readMulticodecTable(requireReallyMeCodecWasmProvider().multicodecTable());
|
|
134
|
+
export const multicodecTableProto = () => readBytesOutput(requireReallyMeCodecWasmProvider().multicodecTableProto());
|
|
135
|
+
export const multicodecTableProtoResult = () => readProtoResultOutput(requireReallyMeCodecWasmProvider().multicodecTableProtoResult());
|
|
136
|
+
export const multikeyEncode = (codecName, publicKey) => {
|
|
137
|
+
ensureStringInput(codecName);
|
|
138
|
+
ensureBytesInput(publicKey);
|
|
139
|
+
return readStringOutput(requireReallyMeCodecWasmProvider().multikeyEncode(codecName, publicKey));
|
|
140
|
+
};
|
|
141
|
+
export const multikeyParse = (multikey) => {
|
|
142
|
+
ensureStringInput(multikey);
|
|
143
|
+
return readParsedMultikey(requireReallyMeCodecWasmProvider().multikeyParse(multikey));
|
|
144
|
+
};
|
|
145
|
+
export const multikeyParseProto = (multikey) => {
|
|
146
|
+
ensureStringInput(multikey);
|
|
147
|
+
return readBytesOutput(requireReallyMeCodecWasmProvider().multikeyParseProto(multikey));
|
|
148
|
+
};
|
|
149
|
+
export const multikeyParseProtoResult = (multikey) => {
|
|
150
|
+
ensureStringInput(multikey);
|
|
151
|
+
return readProtoResultOutput(requireReallyMeCodecWasmProvider().multikeyParseProtoResult(multikey));
|
|
152
|
+
};
|
|
153
|
+
export const bindingTypeMatchesCodec = (bindingType, codecName) => {
|
|
154
|
+
ensureStringInput(bindingType);
|
|
155
|
+
ensureStringInput(codecName);
|
|
156
|
+
return readBooleanOutput(requireReallyMeCodecWasmProvider().bindingTypeMatchesCodec(bindingType, codecName));
|
|
157
|
+
};
|
|
158
|
+
export const validateKeyBinding = (bindingType, algorithm, multikey) => {
|
|
159
|
+
ensureStringInput(bindingType);
|
|
160
|
+
if (algorithm !== undefined) {
|
|
161
|
+
ensureStringInput(algorithm);
|
|
162
|
+
}
|
|
163
|
+
ensureStringInput(multikey);
|
|
164
|
+
requireReallyMeCodecWasmProvider().validateKeyBinding(bindingType, algorithm, multikey);
|
|
165
|
+
};
|
|
166
|
+
export const requireSupportedMulticodec = (codecName) => {
|
|
167
|
+
ensureStringInput(codecName);
|
|
168
|
+
requireReallyMeCodecWasmProvider().requireSupportedMulticodec(codecName);
|
|
169
|
+
};
|
package/dist/pem.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReallyMeCodecProtoResult } from "./readOutput.js";
|
|
2
|
+
export type ReallyMePemLabel = "PRIVATE KEY" | "EC PRIVATE KEY" | "PUBLIC KEY";
|
|
3
|
+
export type ReallyMePemLineEnding = "lf" | "crlf";
|
|
4
|
+
export type ReallyMePemDecodePolicy = Readonly<{
|
|
5
|
+
allowedLabels?: ReadonlyArray<ReallyMePemLabel>;
|
|
6
|
+
maxInputLen?: number;
|
|
7
|
+
maxDerLen?: number;
|
|
8
|
+
}>;
|
|
9
|
+
export type ReallyMePemEncodeOptions = Readonly<{
|
|
10
|
+
maxDerLen?: number;
|
|
11
|
+
lineWidth?: number;
|
|
12
|
+
lineEnding?: ReallyMePemLineEnding;
|
|
13
|
+
}>;
|
|
14
|
+
export type ReallyMePemDocument = Readonly<{
|
|
15
|
+
label: ReallyMePemLabel;
|
|
16
|
+
der: Uint8Array;
|
|
17
|
+
}>;
|
|
18
|
+
export declare const decodePem: (input: string, policy?: ReallyMePemDecodePolicy) => ReallyMePemDocument;
|
|
19
|
+
export declare const decodePemProto: (input: string, policy?: ReallyMePemDecodePolicy) => Uint8Array;
|
|
20
|
+
export declare const decodePemProtoResult: (input: string, policy?: ReallyMePemDecodePolicy) => ReallyMeCodecProtoResult;
|
|
21
|
+
export declare const encodePem: (label: ReallyMePemLabel, der: Uint8Array, options?: ReallyMePemEncodeOptions) => string;
|
package/dist/pem.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import { ReallyMeCodecError } from "./errors.js";
|
|
5
|
+
import { ensureBytesInput, ensureStringInput, readBytesOutput, readBytesProperty, readObjectOutput, readProtoResultOutput, readStringOutput, readStringProperty, } from "./readOutput.js";
|
|
6
|
+
import { requireReallyMeCodecWasmProvider } from "./wasmProvider.js";
|
|
7
|
+
const validLabels = new Set([
|
|
8
|
+
"PRIVATE KEY",
|
|
9
|
+
"EC PRIVATE KEY",
|
|
10
|
+
"PUBLIC KEY",
|
|
11
|
+
]);
|
|
12
|
+
const requirePemLabel = (label) => {
|
|
13
|
+
if (!validLabels.has(label)) {
|
|
14
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
15
|
+
}
|
|
16
|
+
switch (label) {
|
|
17
|
+
case "PRIVATE KEY":
|
|
18
|
+
case "EC PRIVATE KEY":
|
|
19
|
+
case "PUBLIC KEY":
|
|
20
|
+
return label;
|
|
21
|
+
default:
|
|
22
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const requirePositiveInteger = (value) => {
|
|
26
|
+
if (value !== undefined &&
|
|
27
|
+
(!Number.isSafeInteger(value) || value <= 0)) {
|
|
28
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const encodeOptions = (options) => {
|
|
32
|
+
if (options === undefined) {
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
return JSON.stringify(options);
|
|
36
|
+
};
|
|
37
|
+
const readPemDocument = (value) => {
|
|
38
|
+
const object = readObjectOutput(value);
|
|
39
|
+
return {
|
|
40
|
+
label: requirePemLabel(readStringProperty(object, "label")),
|
|
41
|
+
der: readBytesProperty(object, "der"),
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export const decodePem = (input, policy) => {
|
|
45
|
+
ensureStringInput(input);
|
|
46
|
+
if (policy?.allowedLabels !== undefined) {
|
|
47
|
+
for (const label of policy.allowedLabels) {
|
|
48
|
+
requirePemLabel(label);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
requirePositiveInteger(policy?.maxInputLen);
|
|
52
|
+
requirePositiveInteger(policy?.maxDerLen);
|
|
53
|
+
return readPemDocument(requireReallyMeCodecWasmProvider().pemDecode(input, encodeOptions(policy)));
|
|
54
|
+
};
|
|
55
|
+
export const decodePemProto = (input, policy) => {
|
|
56
|
+
ensureStringInput(input);
|
|
57
|
+
if (policy?.allowedLabels !== undefined) {
|
|
58
|
+
for (const label of policy.allowedLabels) {
|
|
59
|
+
requirePemLabel(label);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
requirePositiveInteger(policy?.maxInputLen);
|
|
63
|
+
requirePositiveInteger(policy?.maxDerLen);
|
|
64
|
+
return readBytesOutput(requireReallyMeCodecWasmProvider().pemDecodeProto(input, encodeOptions(policy)));
|
|
65
|
+
};
|
|
66
|
+
export const decodePemProtoResult = (input, policy) => {
|
|
67
|
+
ensureStringInput(input);
|
|
68
|
+
if (policy?.allowedLabels !== undefined) {
|
|
69
|
+
for (const label of policy.allowedLabels) {
|
|
70
|
+
requirePemLabel(label);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
requirePositiveInteger(policy?.maxInputLen);
|
|
74
|
+
requirePositiveInteger(policy?.maxDerLen);
|
|
75
|
+
return readProtoResultOutput(requireReallyMeCodecWasmProvider().pemDecodeProtoResult(input, encodeOptions(policy)));
|
|
76
|
+
};
|
|
77
|
+
export const encodePem = (label, der, options) => {
|
|
78
|
+
requirePemLabel(label);
|
|
79
|
+
ensureBytesInput(der);
|
|
80
|
+
requirePositiveInteger(options?.maxDerLen);
|
|
81
|
+
requirePositiveInteger(options?.lineWidth);
|
|
82
|
+
if (options?.lineEnding !== undefined &&
|
|
83
|
+
options.lineEnding !== "lf" &&
|
|
84
|
+
options.lineEnding !== "crlf") {
|
|
85
|
+
throw new ReallyMeCodecError("invalid-input");
|
|
86
|
+
}
|
|
87
|
+
return readStringOutput(requireReallyMeCodecWasmProvider().pemEncode(label, der, encodeOptions(options)));
|
|
88
|
+
};
|