oktz-curve25519 0.0.4-native.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.
Binary file
package/index.cjs ADDED
@@ -0,0 +1,100 @@
1
+ // curve25519-js drop-in replacement (native Rust untuk XEdDSA sign/verify).
2
+ //
3
+ // Prinsip: yang Node.js sudah native → lewati, pakai node:crypto.
4
+ // - generateKeyPair (X25519) → node:crypto.generateKeyPairSync('x25519')
5
+ // - sharedKey (X25519 DH) → node:crypto.diffieHellman
6
+ // Yang Node.js TIDAK punya (XEdDSA) → native Rust .node:
7
+ // - sign (XEdDSA, Signal)
8
+ // - verify (XEdDSA, Signal)
9
+ //
10
+ // signMessage/openMessage = wrapper tipis atas sign/verify (API parity
11
+ // curve25519-js; tidak dipakai libsignal).
12
+ 'use strict';
13
+
14
+ const { generateKeyPairSync, diffieHellman, createPrivateKey, createPublicKey } = require('crypto');
15
+
16
+ const native = require('./curve25519.linux-x64-gnu.node');
17
+
18
+ // DER prefixes untuk X25519 (sama dengan libsignal/src/curve.js).
19
+ const PUBLIC_KEY_DER_PREFIX = Buffer.from([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0]);
20
+ const PRIVATE_KEY_DER_PREFIX = Buffer.from([48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32]);
21
+
22
+ function checkLen(v, n, what) {
23
+ if (v.length !== n) throw new Error(`wrong ${what} length`);
24
+ if (!(v instanceof Uint8Array)) throw new TypeError('unexpected type, use Uint8Array');
25
+ }
26
+
27
+ /**
28
+ * X25519 keypair dari node:crypto (Node native).
29
+ * @param {Uint8Array} seed 32-byte (diabaikan — Node keygen random; libsignal
30
+ * hanya memanggil ini sebagai fallback dengan randomBytes).
31
+ */
32
+ function generateKeyPair(seed) {
33
+ checkLen(seed, 32, 'seed');
34
+ const { publicKey, privateKey } = generateKeyPairSync('x25519', {
35
+ publicKeyEncoding: { format: 'der', type: 'spki' },
36
+ privateKeyEncoding: { format: 'der', type: 'pkcs8' },
37
+ });
38
+ const pub = publicKey.subarray(
39
+ PUBLIC_KEY_DER_PREFIX.length,
40
+ PUBLIC_KEY_DER_PREFIX.length + 32
41
+ );
42
+ const priv = privateKey.subarray(
43
+ PRIVATE_KEY_DER_PREFIX.length,
44
+ PRIVATE_KEY_DER_PREFIX.length + 32
45
+ );
46
+ return { public: pub, private: priv };
47
+ }
48
+
49
+ /** X25519 Diffie-Hellman dari node:crypto (Node native). */
50
+ function sharedKey(secretKey, publicKey) {
51
+ checkLen(publicKey, 32, 'public key');
52
+ checkLen(secretKey, 32, 'secret key');
53
+ const priv = createPrivateKey({
54
+ key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, secretKey]),
55
+ format: 'der',
56
+ type: 'pkcs8',
57
+ });
58
+ const pub = createPublicKey({
59
+ key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, publicKey]),
60
+ format: 'der',
61
+ type: 'spki',
62
+ });
63
+ return new Uint8Array(diffieHellman({ privateKey: priv, publicKey: pub }));
64
+ }
65
+
66
+ /** XEdDSA sign (native Rust). Mengembalikan signature 64 byte. */
67
+ function sign(secretKey, msg, opt_random) {
68
+ checkLen(secretKey, 32, 'secret key');
69
+ if (opt_random !== undefined && opt_random !== null) {
70
+ checkLen(opt_random, 64, 'random data');
71
+ }
72
+ return new Uint8Array(native.sign(secretKey, msg, opt_random));
73
+ }
74
+
75
+ /** XEdDSA verify (native Rust). true/false. */
76
+ function verify(publicKey, msg, signature) {
77
+ checkLen(publicKey, 32, 'public key');
78
+ checkLen(signature, 64, 'signature');
79
+ return native.verify(publicKey, msg, signature);
80
+ }
81
+
82
+ /** signature(64) || msg — parity API, tidak dipakai libsignal. */
83
+ function signMessage(secretKey, msg, opt_random) {
84
+ const sig = sign(secretKey, msg, opt_random);
85
+ const out = new Uint8Array(64 + msg.length);
86
+ out.set(sig, 0);
87
+ out.set(msg, 64);
88
+ return out;
89
+ }
90
+
91
+ /** verify signedMsg (sig||msg) → msg | null. */
92
+ function openMessage(publicKey, signedMsg) {
93
+ if (signedMsg.length < 64) return null;
94
+ const sig = signedMsg.subarray(0, 64);
95
+ const msg = signedMsg.subarray(64);
96
+ if (!verify(publicKey, msg, sig)) return null;
97
+ return msg;
98
+ }
99
+
100
+ module.exports = { generateKeyPair, sharedKey, sign, verify, signMessage, openMessage, default: {} };
package/package.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "oktz-curve25519",
3
+ "version": "0.0.4-native.1",
4
+ "description": "curve25519-js replacement — XEdDSA sign/verify native Rust, X25519 node:crypto",
5
+ "main": "index.cjs",
6
+ "license": "MIT",
7
+ "files": [
8
+ "index.cjs",
9
+ "curve25519.linux-x64-gnu.node"
10
+ ],
11
+ "engines": {
12
+ "node": ">=20.0.0"
13
+ }
14
+ }