@unknownncat/curve25519-node 2.0.0 → 2.1.1
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 +1 -1
- package/NOTICE.md +89 -0
- package/README.en.md +149 -43
- package/README.md +141 -35
- package/SECURITY.md +34 -0
- package/THIRD_PARTY_NOTICE.md +3 -0
- package/THIRD_PARTY_NOTICES.md +5 -0
- package/dist/axlsign.d.ts.map +1 -1
- package/dist/axlsign.js +50 -7
- package/dist/axlsign.js.map +1 -1
- package/dist/cjs/axlsign.js +49 -6
- package/dist/cjs/axlsign.js.map +1 -1
- package/dist/cjs/ed25519.js +46 -10
- package/dist/cjs/ed25519.js.map +1 -1
- package/dist/cjs/index.js +27 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/assert.js.map +1 -1
- package/dist/cjs/internal/axlsign-wasm/LICENSE +1 -1
- package/dist/cjs/internal/curve25519-wasm/LICENSE +21 -0
- package/dist/cjs/internal/curve25519-wasm/curve25519_wasm.d.ts +12 -0
- package/dist/cjs/internal/curve25519-wasm/curve25519_wasm.js +165 -0
- package/dist/cjs/internal/curve25519-wasm/curve25519_wasm_bg.wasm +0 -0
- package/dist/cjs/internal/curve25519-wasm/curve25519_wasm_bg.wasm.d.ts +13 -0
- package/dist/cjs/internal/curve25519-wasm/package.json +17 -0
- package/dist/cjs/wasm.js +249 -0
- package/dist/cjs/wasm.js.map +1 -0
- package/dist/cjs/x25519.js +73 -12
- package/dist/cjs/x25519.js.map +1 -1
- package/dist/ed25519.d.ts +21 -0
- package/dist/ed25519.d.ts.map +1 -1
- package/dist/ed25519.js +44 -13
- package/dist/ed25519.js.map +1 -1
- package/dist/index.d.ts +87 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/assert.js.map +1 -1
- package/dist/internal/axlsign-wasm/LICENSE +1 -1
- package/dist/internal/curve25519-wasm/LICENSE +21 -0
- package/dist/internal/curve25519-wasm/curve25519_wasm.d.ts +12 -0
- package/dist/internal/curve25519-wasm/curve25519_wasm.js +165 -0
- package/dist/internal/curve25519-wasm/curve25519_wasm_bg.wasm +0 -0
- package/dist/internal/curve25519-wasm/curve25519_wasm_bg.wasm.d.ts +13 -0
- package/dist/internal/curve25519-wasm/package.json +17 -0
- package/dist/types.d.ts +2 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/wasm.d.ts +92 -0
- package/dist/wasm.d.ts.map +1 -0
- package/dist/wasm.js +225 -0
- package/dist/wasm.js.map +1 -0
- package/dist/x25519.d.ts +29 -0
- package/dist/x25519.d.ts.map +1 -1
- package/dist/x25519.js +66 -12
- package/dist/x25519.js.map +1 -1
- package/package.json +30 -4
package/dist/cjs/wasm.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ed25519 = exports.x25519 = void 0;
|
|
4
|
+
exports.isAllZero32 = isAllZero32;
|
|
5
|
+
exports.x25519CreatePrivateKeyObject = x25519CreatePrivateKeyObject;
|
|
6
|
+
exports.x25519CreatePublicKeyObject = x25519CreatePublicKeyObject;
|
|
7
|
+
exports.x25519PublicKeyFromPrivateKeyObject = x25519PublicKeyFromPrivateKeyObject;
|
|
8
|
+
exports.x25519PublicKey = x25519PublicKey;
|
|
9
|
+
exports.x25519SharedKeyFromKeyObjects = x25519SharedKeyFromKeyObjects;
|
|
10
|
+
exports.x25519SharedKey = x25519SharedKey;
|
|
11
|
+
exports.x25519SharedKeyStrictFromKeyObjects = x25519SharedKeyStrictFromKeyObjects;
|
|
12
|
+
exports.x25519SharedKeyStrict = x25519SharedKeyStrict;
|
|
13
|
+
exports.x25519GenerateKeyPair = x25519GenerateKeyPair;
|
|
14
|
+
exports.ed25519CreatePrivateKeyObject = ed25519CreatePrivateKeyObject;
|
|
15
|
+
exports.ed25519CreatePublicKeyObject = ed25519CreatePublicKeyObject;
|
|
16
|
+
exports.ed25519PublicKeyFromPrivateKeyObject = ed25519PublicKeyFromPrivateKeyObject;
|
|
17
|
+
exports.ed25519PublicKey = ed25519PublicKey;
|
|
18
|
+
exports.ed25519GenerateKeyPair = ed25519GenerateKeyPair;
|
|
19
|
+
exports.ed25519SignWithPrivateKey = ed25519SignWithPrivateKey;
|
|
20
|
+
exports.ed25519Sign = ed25519Sign;
|
|
21
|
+
exports.ed25519VerifyWithPublicKey = ed25519VerifyWithPublicKey;
|
|
22
|
+
exports.ed25519Verify = ed25519Verify;
|
|
23
|
+
exports.ed25519SignMessage = ed25519SignMessage;
|
|
24
|
+
exports.ed25519OpenMessage = ed25519OpenMessage;
|
|
25
|
+
const node_fs_1 = require("node:fs");
|
|
26
|
+
const node_path_1 = require("node:path");
|
|
27
|
+
const node_module_1 = require("node:module");
|
|
28
|
+
const assert_js_1 = require("./internal/assert.js");
|
|
29
|
+
const SELF_PACKAGE_NAME = "@unknownncat/curve25519-node";
|
|
30
|
+
const requireBase = typeof __filename === "string"
|
|
31
|
+
? __filename
|
|
32
|
+
: typeof process.argv[1] === "string" && (0, node_path_1.isAbsolute)(process.argv[1])
|
|
33
|
+
? process.argv[1]
|
|
34
|
+
: (0, node_path_1.join)(process.cwd(), "package.json");
|
|
35
|
+
const nodeRequire = (0, node_module_1.createRequire)(requireBase);
|
|
36
|
+
let wasmModulePath;
|
|
37
|
+
let wasmBindings;
|
|
38
|
+
function resolveWasmModulePath() {
|
|
39
|
+
const candidates = [];
|
|
40
|
+
try {
|
|
41
|
+
const packageJsonPath = nodeRequire.resolve(`${SELF_PACKAGE_NAME}/package.json`);
|
|
42
|
+
candidates.push((0, node_path_1.join)((0, node_path_1.dirname)(packageJsonPath), "dist", "internal", "curve25519-wasm", "curve25519_wasm.js"));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Fall back to local development paths below.
|
|
46
|
+
}
|
|
47
|
+
if (typeof __dirname === "string") {
|
|
48
|
+
candidates.push((0, node_path_1.join)(__dirname, "internal", "curve25519-wasm", "curve25519_wasm.js"));
|
|
49
|
+
}
|
|
50
|
+
candidates.push((0, node_path_1.join)(process.cwd(), "dist", "internal", "curve25519-wasm", "curve25519_wasm.js"));
|
|
51
|
+
candidates.push((0, node_path_1.join)(process.cwd(), "src", "internal", "curve25519-wasm", "curve25519_wasm.js"));
|
|
52
|
+
for (const candidate of candidates) {
|
|
53
|
+
if ((0, node_fs_1.existsSync)(candidate)) {
|
|
54
|
+
return candidate;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
throw new Error("Unable to locate modern curve25519 WASM module. Run `npm run build` before using wasm API in local dev.");
|
|
58
|
+
}
|
|
59
|
+
function getWasmBindings() {
|
|
60
|
+
if (wasmBindings !== undefined) {
|
|
61
|
+
return wasmBindings;
|
|
62
|
+
}
|
|
63
|
+
if (wasmModulePath === undefined) {
|
|
64
|
+
wasmModulePath = resolveWasmModulePath();
|
|
65
|
+
}
|
|
66
|
+
// Lazy-load WASM bindings so node:crypto users avoid startup overhead.
|
|
67
|
+
wasmBindings = nodeRequire(wasmModulePath);
|
|
68
|
+
return wasmBindings;
|
|
69
|
+
}
|
|
70
|
+
function copyBytes32(bytes32, label) {
|
|
71
|
+
const out = new Uint8Array(32);
|
|
72
|
+
out.set(bytes32);
|
|
73
|
+
return (0, assert_js_1.asBytes32)(out, label);
|
|
74
|
+
}
|
|
75
|
+
function clampScalar(seed32) {
|
|
76
|
+
const out = new Uint8Array(32);
|
|
77
|
+
out.set(seed32);
|
|
78
|
+
out[0] = (out[0] ?? 0) & 248;
|
|
79
|
+
const last = out[31] ?? 0;
|
|
80
|
+
out[31] = (last & 127) | 64;
|
|
81
|
+
return (0, assert_js_1.asBytes32)(out, "clamped scalar");
|
|
82
|
+
}
|
|
83
|
+
function isRecord(value) {
|
|
84
|
+
return typeof value === "object" && value !== null;
|
|
85
|
+
}
|
|
86
|
+
function assertWasmKeyObject(value, expectedType, label) {
|
|
87
|
+
if (!isRecord(value) || value.type !== expectedType || !(value.bytes instanceof Uint8Array)) {
|
|
88
|
+
throw new TypeError(`${label} must be a ${expectedType} key object`);
|
|
89
|
+
}
|
|
90
|
+
(0, assert_js_1.assertBytes32)(value.bytes, `${label}.bytes`);
|
|
91
|
+
}
|
|
92
|
+
function isAllZero32(bytes32) {
|
|
93
|
+
(0, assert_js_1.assertBytes32)(bytes32, "bytes32");
|
|
94
|
+
let acc = 0;
|
|
95
|
+
for (let i = 0; i < 32; i += 1) {
|
|
96
|
+
acc |= bytes32[i] ?? 0;
|
|
97
|
+
}
|
|
98
|
+
return acc === 0;
|
|
99
|
+
}
|
|
100
|
+
function x25519CreatePrivateKeyObject(secretKey32) {
|
|
101
|
+
(0, assert_js_1.assertBytes32)(secretKey32, "secretKey32");
|
|
102
|
+
return Object.freeze({
|
|
103
|
+
type: "x25519-private",
|
|
104
|
+
bytes: copyBytes32(secretKey32, "x25519 private key object bytes"),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function x25519CreatePublicKeyObject(publicKey32) {
|
|
108
|
+
(0, assert_js_1.assertBytes32)(publicKey32, "publicKey32");
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
type: "x25519-public",
|
|
111
|
+
bytes: copyBytes32(publicKey32, "x25519 public key object bytes"),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function x25519PublicKeyFromPrivateKeyObject(privateKey) {
|
|
115
|
+
assertWasmKeyObject(privateKey, "x25519-private", "privateKey");
|
|
116
|
+
return (0, assert_js_1.asBytes32)(getWasmBindings().x25519PublicKey(privateKey.bytes), "x25519 public key");
|
|
117
|
+
}
|
|
118
|
+
function x25519PublicKey(secretKey32) {
|
|
119
|
+
return x25519PublicKeyFromPrivateKeyObject(x25519CreatePrivateKeyObject(secretKey32));
|
|
120
|
+
}
|
|
121
|
+
function x25519SharedKeyFromKeyObjects(privateKey, publicKey) {
|
|
122
|
+
assertWasmKeyObject(privateKey, "x25519-private", "privateKey");
|
|
123
|
+
assertWasmKeyObject(publicKey, "x25519-public", "publicKey");
|
|
124
|
+
return (0, assert_js_1.asBytes32)(getWasmBindings().x25519SharedKey(privateKey.bytes, publicKey.bytes), "x25519 shared key");
|
|
125
|
+
}
|
|
126
|
+
function x25519SharedKey(secretKey32, publicKey32) {
|
|
127
|
+
const privateKey = x25519CreatePrivateKeyObject(secretKey32);
|
|
128
|
+
const publicKey = x25519CreatePublicKeyObject(publicKey32);
|
|
129
|
+
return x25519SharedKeyFromKeyObjects(privateKey, publicKey);
|
|
130
|
+
}
|
|
131
|
+
function x25519SharedKeyStrictFromKeyObjects(privateKey, publicKey) {
|
|
132
|
+
const shared = x25519SharedKeyFromKeyObjects(privateKey, publicKey);
|
|
133
|
+
if (isAllZero32(shared)) {
|
|
134
|
+
throw new Error("X25519 shared secret is all-zero; reject low-order/invalid peer public key in protocol flow.");
|
|
135
|
+
}
|
|
136
|
+
return shared;
|
|
137
|
+
}
|
|
138
|
+
function x25519SharedKeyStrict(secretKey32, publicKey32) {
|
|
139
|
+
const privateKey = x25519CreatePrivateKeyObject(secretKey32);
|
|
140
|
+
const publicKey = x25519CreatePublicKeyObject(publicKey32);
|
|
141
|
+
return x25519SharedKeyStrictFromKeyObjects(privateKey, publicKey);
|
|
142
|
+
}
|
|
143
|
+
function x25519GenerateKeyPair(seed32) {
|
|
144
|
+
(0, assert_js_1.assertBytes32)(seed32, "seed32");
|
|
145
|
+
const privateKey = clampScalar(seed32);
|
|
146
|
+
const publicKey32 = x25519PublicKey(privateKey);
|
|
147
|
+
return {
|
|
148
|
+
public: publicKey32,
|
|
149
|
+
private: privateKey,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function ed25519CreatePrivateKeyObject(secretSeed32) {
|
|
153
|
+
(0, assert_js_1.assertBytes32)(secretSeed32, "secretSeed32");
|
|
154
|
+
return Object.freeze({
|
|
155
|
+
type: "ed25519-private",
|
|
156
|
+
bytes: copyBytes32(secretSeed32, "ed25519 private key object bytes"),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function ed25519CreatePublicKeyObject(publicKey32) {
|
|
160
|
+
(0, assert_js_1.assertBytes32)(publicKey32, "publicKey32");
|
|
161
|
+
return Object.freeze({
|
|
162
|
+
type: "ed25519-public",
|
|
163
|
+
bytes: copyBytes32(publicKey32, "ed25519 public key object bytes"),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function ed25519PublicKeyFromPrivateKeyObject(privateKey) {
|
|
167
|
+
assertWasmKeyObject(privateKey, "ed25519-private", "privateKey");
|
|
168
|
+
return (0, assert_js_1.asBytes32)(getWasmBindings().ed25519PublicKey(privateKey.bytes), "ed25519 public key");
|
|
169
|
+
}
|
|
170
|
+
function ed25519PublicKey(secretSeed32) {
|
|
171
|
+
return ed25519PublicKeyFromPrivateKeyObject(ed25519CreatePrivateKeyObject(secretSeed32));
|
|
172
|
+
}
|
|
173
|
+
function ed25519GenerateKeyPair(seed32) {
|
|
174
|
+
(0, assert_js_1.assertBytes32)(seed32, "seed32");
|
|
175
|
+
return {
|
|
176
|
+
public: ed25519PublicKey(seed32),
|
|
177
|
+
private: seed32,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function ed25519SignWithPrivateKey(privateKey, msg) {
|
|
181
|
+
assertWasmKeyObject(privateKey, "ed25519-private", "privateKey");
|
|
182
|
+
(0, assert_js_1.assertUint8Array)(msg, "msg");
|
|
183
|
+
return (0, assert_js_1.asBytes64)(getWasmBindings().ed25519Sign(privateKey.bytes, msg), "ed25519 signature");
|
|
184
|
+
}
|
|
185
|
+
function ed25519Sign(secretSeed32, msg) {
|
|
186
|
+
return ed25519SignWithPrivateKey(ed25519CreatePrivateKeyObject(secretSeed32), msg);
|
|
187
|
+
}
|
|
188
|
+
function ed25519VerifyWithPublicKey(publicKey, msg, signature64) {
|
|
189
|
+
assertWasmKeyObject(publicKey, "ed25519-public", "publicKey");
|
|
190
|
+
(0, assert_js_1.assertUint8Array)(msg, "msg");
|
|
191
|
+
(0, assert_js_1.assertBytes64)(signature64, "signature64");
|
|
192
|
+
return getWasmBindings().ed25519Verify(publicKey.bytes, msg, signature64);
|
|
193
|
+
}
|
|
194
|
+
function ed25519Verify(publicKey32, msg, signature64) {
|
|
195
|
+
return ed25519VerifyWithPublicKey(ed25519CreatePublicKeyObject(publicKey32), msg, signature64);
|
|
196
|
+
}
|
|
197
|
+
function ed25519SignMessage(secretSeed32, msg) {
|
|
198
|
+
(0, assert_js_1.assertBytes32)(secretSeed32, "secretSeed32");
|
|
199
|
+
(0, assert_js_1.assertUint8Array)(msg, "msg");
|
|
200
|
+
const signature64 = ed25519Sign(secretSeed32, msg);
|
|
201
|
+
const signed = new Uint8Array(64 + msg.byteLength);
|
|
202
|
+
signed.set(signature64, 0);
|
|
203
|
+
signed.set(msg, 64);
|
|
204
|
+
return signed;
|
|
205
|
+
}
|
|
206
|
+
function ed25519OpenMessage(publicKey32, signedMsg) {
|
|
207
|
+
(0, assert_js_1.assertBytes32)(publicKey32, "publicKey32");
|
|
208
|
+
(0, assert_js_1.assertUint8Array)(signedMsg, "signedMsg");
|
|
209
|
+
if (signedMsg.byteLength < 64) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
const signature64 = (0, assert_js_1.asBytes64)(signedMsg.subarray(0, 64), "signedMsg signature");
|
|
213
|
+
const msg = signedMsg.subarray(64);
|
|
214
|
+
if (!ed25519Verify(publicKey32, msg, signature64)) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
return new Uint8Array(msg);
|
|
218
|
+
}
|
|
219
|
+
exports.x25519 = {
|
|
220
|
+
createPrivateKeyObject: x25519CreatePrivateKeyObject,
|
|
221
|
+
createPublicKeyObject: x25519CreatePublicKeyObject,
|
|
222
|
+
publicKeyFromPrivateKeyObject: x25519PublicKeyFromPrivateKeyObject,
|
|
223
|
+
publicKey: x25519PublicKey,
|
|
224
|
+
sharedKey: x25519SharedKey,
|
|
225
|
+
sharedKeyFromKeyObjects: x25519SharedKeyFromKeyObjects,
|
|
226
|
+
sharedKeyStrict: x25519SharedKeyStrict,
|
|
227
|
+
sharedKeyStrictFromKeyObjects: x25519SharedKeyStrictFromKeyObjects,
|
|
228
|
+
isAllZero32,
|
|
229
|
+
generateKeyPair: x25519GenerateKeyPair,
|
|
230
|
+
};
|
|
231
|
+
exports.ed25519 = {
|
|
232
|
+
createPrivateKeyObject: ed25519CreatePrivateKeyObject,
|
|
233
|
+
createPublicKeyObject: ed25519CreatePublicKeyObject,
|
|
234
|
+
publicKeyFromPrivateKeyObject: ed25519PublicKeyFromPrivateKeyObject,
|
|
235
|
+
publicKey: ed25519PublicKey,
|
|
236
|
+
generateKeyPair: ed25519GenerateKeyPair,
|
|
237
|
+
sign: ed25519Sign,
|
|
238
|
+
signWithPrivateKey: ed25519SignWithPrivateKey,
|
|
239
|
+
verify: ed25519Verify,
|
|
240
|
+
verifyWithPublicKey: ed25519VerifyWithPublicKey,
|
|
241
|
+
signMessage: ed25519SignMessage,
|
|
242
|
+
openMessage: ed25519OpenMessage,
|
|
243
|
+
};
|
|
244
|
+
const api = {
|
|
245
|
+
x25519: exports.x25519,
|
|
246
|
+
ed25519: exports.ed25519,
|
|
247
|
+
};
|
|
248
|
+
exports.default = api;
|
|
249
|
+
//# sourceMappingURL=wasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../src/wasm.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/x25519.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isAllZero32 = isAllZero32;
|
|
4
|
+
exports.createPrivateKeyObject = createPrivateKeyObject;
|
|
5
|
+
exports.createPublicKeyObject = createPublicKeyObject;
|
|
6
|
+
exports.publicKeyFromPrivateKeyObject = publicKeyFromPrivateKeyObject;
|
|
3
7
|
exports.publicKey = publicKey;
|
|
8
|
+
exports.sharedKeyFromKeyObjects = sharedKeyFromKeyObjects;
|
|
4
9
|
exports.sharedKey = sharedKey;
|
|
10
|
+
exports.sharedKeyStrict = sharedKeyStrict;
|
|
11
|
+
exports.sharedKeyStrictFromKeyObjects = sharedKeyStrictFromKeyObjects;
|
|
5
12
|
exports.generateKeyPair = generateKeyPair;
|
|
6
13
|
const node_crypto_1 = require("node:crypto");
|
|
7
14
|
const assert_js_1 = require("./internal/assert.js");
|
|
@@ -14,28 +21,82 @@ function clampScalar(seed32) {
|
|
|
14
21
|
clamped[31] = (last & 127) | 64;
|
|
15
22
|
return (0, assert_js_1.asBytes32)(clamped, "clamped scalar");
|
|
16
23
|
}
|
|
24
|
+
function normalizeSharedSecret(shared) {
|
|
25
|
+
if (shared.byteLength !== 32) {
|
|
26
|
+
throw new Error(`X25519 shared secret must be 32 bytes, received ${shared.byteLength}`);
|
|
27
|
+
}
|
|
28
|
+
return (0, assert_js_1.asBytes32)(new Uint8Array(shared.buffer, shared.byteOffset, shared.byteLength), "sharedKey");
|
|
29
|
+
}
|
|
17
30
|
/**
|
|
18
|
-
*
|
|
31
|
+
* Constant-time style 32-byte zero check for shared-secret hardening.
|
|
19
32
|
*/
|
|
20
|
-
function
|
|
33
|
+
function isAllZero32(bytes32) {
|
|
34
|
+
(0, assert_js_1.assertBytes32)(bytes32, "bytes32");
|
|
35
|
+
let acc = 0;
|
|
36
|
+
for (let i = 0; i < 32; i += 1) {
|
|
37
|
+
acc |= bytes32[i] ?? 0;
|
|
38
|
+
}
|
|
39
|
+
return acc === 0;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Builds a reusable X25519 private KeyObject from a raw 32-byte secret scalar.
|
|
43
|
+
*/
|
|
44
|
+
function createPrivateKeyObject(secretKey32) {
|
|
21
45
|
(0, assert_js_1.assertBytes32)(secretKey32, "secretKey32");
|
|
22
|
-
|
|
46
|
+
return (0, der_js_1.keyFromX25519Private)(secretKey32);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Builds a reusable X25519 public KeyObject from a raw 32-byte public key.
|
|
50
|
+
*/
|
|
51
|
+
function createPublicKeyObject(publicKey32) {
|
|
52
|
+
(0, assert_js_1.assertBytes32)(publicKey32, "publicKey32");
|
|
53
|
+
return (0, der_js_1.keyFromX25519Public)(publicKey32);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Derives raw 32-byte X25519 public key from a private KeyObject.
|
|
57
|
+
*/
|
|
58
|
+
function publicKeyFromPrivateKeyObject(privateKey) {
|
|
23
59
|
return (0, der_js_1.rawPublicFromX25519Spki)((0, node_crypto_1.createPublicKey)(privateKey));
|
|
24
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Derives an X25519 public key from a raw 32-byte secret scalar.
|
|
63
|
+
*/
|
|
64
|
+
function publicKey(secretKey32) {
|
|
65
|
+
return publicKeyFromPrivateKeyObject(createPrivateKeyObject(secretKey32));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Computes X25519 ECDH shared secret (raw 32 bytes) from reusable KeyObjects.
|
|
69
|
+
*/
|
|
70
|
+
function sharedKeyFromKeyObjects(privateKey, publicKey) {
|
|
71
|
+
return normalizeSharedSecret((0, node_crypto_1.diffieHellman)({ privateKey, publicKey }));
|
|
72
|
+
}
|
|
25
73
|
/**
|
|
26
74
|
* Computes X25519 ECDH shared secret (raw 32 bytes).
|
|
27
75
|
*/
|
|
28
76
|
function sharedKey(secretKey32, publicKey32) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
77
|
+
const privateKey = createPrivateKeyObject(secretKey32);
|
|
78
|
+
const publicKey = createPublicKeyObject(publicKey32);
|
|
79
|
+
return sharedKeyFromKeyObjects(privateKey, publicKey);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Strict X25519 ECDH: rejects all-zero shared secret.
|
|
83
|
+
*/
|
|
84
|
+
function sharedKeyStrict(secretKey32, publicKey32) {
|
|
85
|
+
const shared = sharedKey(secretKey32, publicKey32);
|
|
86
|
+
if (isAllZero32(shared)) {
|
|
87
|
+
throw new Error("X25519 shared secret is all-zero; reject low-order/invalid peer public key in protocol flow.");
|
|
37
88
|
}
|
|
38
|
-
return
|
|
89
|
+
return shared;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Strict X25519 ECDH from reusable KeyObjects: rejects all-zero shared secret.
|
|
93
|
+
*/
|
|
94
|
+
function sharedKeyStrictFromKeyObjects(privateKey, publicKey) {
|
|
95
|
+
const shared = sharedKeyFromKeyObjects(privateKey, publicKey);
|
|
96
|
+
if (isAllZero32(shared)) {
|
|
97
|
+
throw new Error("X25519 shared secret is all-zero; reject low-order/invalid peer public key in protocol flow.");
|
|
98
|
+
}
|
|
99
|
+
return shared;
|
|
39
100
|
}
|
|
40
101
|
/**
|
|
41
102
|
* Deterministically creates an X25519 key pair from a 32-byte seed.
|
package/dist/cjs/x25519.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x25519.js","sourceRoot":"","sources":["../../src/x25519.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"x25519.js","sourceRoot":"","sources":["../../src/x25519.ts"],"names":[],"mappings":"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"}
|
package/dist/ed25519.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
+
import { type KeyObject } from "node:crypto";
|
|
1
2
|
import type { Bytes32, Bytes64, KeyPair32 } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builds a reusable Ed25519 private KeyObject from a raw 32-byte seed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createPrivateKeyObject(secretSeed32: Bytes32): KeyObject;
|
|
7
|
+
/**
|
|
8
|
+
* Builds a reusable Ed25519 public KeyObject from a raw 32-byte public key.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createPublicKeyObject(publicKey32: Bytes32): KeyObject;
|
|
11
|
+
/**
|
|
12
|
+
* Derives raw 32-byte Ed25519 public key from a private KeyObject.
|
|
13
|
+
*/
|
|
14
|
+
export declare function publicKeyFromPrivateKeyObject(privateKey: KeyObject): Bytes32;
|
|
2
15
|
/**
|
|
3
16
|
* Derives an Ed25519 public key from a raw 32-byte seed.
|
|
4
17
|
*/
|
|
@@ -12,10 +25,18 @@ export declare function generateKeyPair(seed32: Bytes32): KeyPair32;
|
|
|
12
25
|
* Signs a message with Ed25519 and returns the 64-byte detached signature.
|
|
13
26
|
*/
|
|
14
27
|
export declare function sign(secretSeed32: Bytes32, msg: Uint8Array): Bytes64;
|
|
28
|
+
/**
|
|
29
|
+
* Signs a message with Ed25519 using a reusable private KeyObject.
|
|
30
|
+
*/
|
|
31
|
+
export declare function signWithPrivateKey(privateKey: KeyObject, msg: Uint8Array): Bytes64;
|
|
15
32
|
/**
|
|
16
33
|
* Verifies a detached Ed25519 signature.
|
|
17
34
|
*/
|
|
18
35
|
export declare function verify(publicKey32: Bytes32, msg: Uint8Array, signature64: Bytes64): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Verifies a detached Ed25519 signature using a reusable public KeyObject.
|
|
38
|
+
*/
|
|
39
|
+
export declare function verifyWithPublicKey(publicKey: KeyObject, msg: Uint8Array, signature64: Bytes64): boolean;
|
|
19
40
|
/**
|
|
20
41
|
* Returns signature || message.
|
|
21
42
|
*/
|
package/dist/ed25519.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ed25519.d.ts","sourceRoot":"","sources":["../src/ed25519.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ed25519.d.ts","sourceRoot":"","sources":["../src/ed25519.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,aAAa,CAAC;AAarB,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAY9D;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,OAAO,GAAG,SAAS,CAGvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,OAAO,GAAG,SAAS,CAGrE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAE5E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAExD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAM1D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAEpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAGlF;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAE3F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,UAAU,EACf,WAAW,EAAE,OAAO,GACnB,OAAO,CAIT;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAS9E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAgB1F"}
|
package/dist/ed25519.js
CHANGED
|
@@ -1,12 +1,37 @@
|
|
|
1
|
-
import { createPublicKey, sign as cryptoSign, verify as cryptoVerify } from "node:crypto";
|
|
2
|
-
import { asBytes64, assertBytes32, assertBytes64, assertUint8Array, toBufferView } from "./internal/assert.js";
|
|
3
|
-
import { keyFromEd25519Private, keyFromEd25519Public, rawPublicFromEd25519Spki } from "./internal/der.js";
|
|
1
|
+
import { createPublicKey, sign as cryptoSign, verify as cryptoVerify, } from "node:crypto";
|
|
2
|
+
import { asBytes64, assertBytes32, assertBytes64, assertUint8Array, toBufferView, } from "./internal/assert.js";
|
|
3
|
+
import { keyFromEd25519Private, keyFromEd25519Public, rawPublicFromEd25519Spki, } from "./internal/der.js";
|
|
4
|
+
function normalizeSignature(signature) {
|
|
5
|
+
if (signature.byteLength !== 64) {
|
|
6
|
+
throw new Error(`Ed25519 signature must be 64 bytes, received ${signature.byteLength}`);
|
|
7
|
+
}
|
|
8
|
+
return asBytes64(new Uint8Array(signature.buffer, signature.byteOffset, signature.byteLength), "signature");
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Builds a reusable Ed25519 private KeyObject from a raw 32-byte seed.
|
|
12
|
+
*/
|
|
13
|
+
export function createPrivateKeyObject(secretSeed32) {
|
|
14
|
+
assertBytes32(secretSeed32, "secretSeed32");
|
|
15
|
+
return keyFromEd25519Private(secretSeed32);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Builds a reusable Ed25519 public KeyObject from a raw 32-byte public key.
|
|
19
|
+
*/
|
|
20
|
+
export function createPublicKeyObject(publicKey32) {
|
|
21
|
+
assertBytes32(publicKey32, "publicKey32");
|
|
22
|
+
return keyFromEd25519Public(publicKey32);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Derives raw 32-byte Ed25519 public key from a private KeyObject.
|
|
26
|
+
*/
|
|
27
|
+
export function publicKeyFromPrivateKeyObject(privateKey) {
|
|
28
|
+
return rawPublicFromEd25519Spki(createPublicKey(privateKey));
|
|
29
|
+
}
|
|
4
30
|
/**
|
|
5
31
|
* Derives an Ed25519 public key from a raw 32-byte seed.
|
|
6
32
|
*/
|
|
7
33
|
export function publicKey(secretSeed32) {
|
|
8
|
-
|
|
9
|
-
return rawPublicFromEd25519Spki(createPublicKey(keyFromEd25519Private(secretSeed32)));
|
|
34
|
+
return publicKeyFromPrivateKeyObject(createPrivateKeyObject(secretSeed32));
|
|
10
35
|
}
|
|
11
36
|
/**
|
|
12
37
|
* Deterministically creates an Ed25519 key pair from a 32-byte seed.
|
|
@@ -23,22 +48,28 @@ export function generateKeyPair(seed32) {
|
|
|
23
48
|
* Signs a message with Ed25519 and returns the 64-byte detached signature.
|
|
24
49
|
*/
|
|
25
50
|
export function sign(secretSeed32, msg) {
|
|
26
|
-
|
|
51
|
+
return signWithPrivateKey(createPrivateKeyObject(secretSeed32), msg);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Signs a message with Ed25519 using a reusable private KeyObject.
|
|
55
|
+
*/
|
|
56
|
+
export function signWithPrivateKey(privateKey, msg) {
|
|
27
57
|
assertUint8Array(msg, "msg");
|
|
28
|
-
|
|
29
|
-
if (signature.byteLength !== 64) {
|
|
30
|
-
throw new Error(`Ed25519 signature must be 64 bytes, received ${signature.byteLength}`);
|
|
31
|
-
}
|
|
32
|
-
return asBytes64(new Uint8Array(signature.buffer, signature.byteOffset, signature.byteLength), "signature");
|
|
58
|
+
return normalizeSignature(cryptoSign(null, toBufferView(msg), privateKey));
|
|
33
59
|
}
|
|
34
60
|
/**
|
|
35
61
|
* Verifies a detached Ed25519 signature.
|
|
36
62
|
*/
|
|
37
63
|
export function verify(publicKey32, msg, signature64) {
|
|
38
|
-
|
|
64
|
+
return verifyWithPublicKey(createPublicKeyObject(publicKey32), msg, signature64);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Verifies a detached Ed25519 signature using a reusable public KeyObject.
|
|
68
|
+
*/
|
|
69
|
+
export function verifyWithPublicKey(publicKey, msg, signature64) {
|
|
39
70
|
assertUint8Array(msg, "msg");
|
|
40
71
|
assertBytes64(signature64, "signature64");
|
|
41
|
-
return cryptoVerify(null, toBufferView(msg),
|
|
72
|
+
return cryptoVerify(null, toBufferView(msg), publicKey, toBufferView(signature64));
|
|
42
73
|
}
|
|
43
74
|
/**
|
|
44
75
|
* Returns signature || message.
|
package/dist/ed25519.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ed25519.js","sourceRoot":"","sources":["../src/ed25519.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ed25519.js","sourceRoot":"","sources":["../src/ed25519.ts"],"names":[],"mappings":"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"}
|