@vex-chat/crypto 1.0.11-rc.11 → 1.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/README.md CHANGED
@@ -10,9 +10,9 @@ All of the crypto functions for the key exchange are contained in here.
10
10
 
11
11
  This library utilizes native Node.js crypto where possible for performance and security.
12
12
 
13
- - **tweetnacl**: Primitives for signing and encryption (X25519 / Ed25519).
14
- - **ed2curve**: Ed25519 signing key to X25519 encryption key conversion.
15
- - **msgpackr**: High-performance MessagePack serialization (replacing `msgpack-lite`).
16
- - **bip39**: Mnemonic generation for keys.
17
- - **Node Crypto**: Native implementations for HKDF, PBKDF2, HMAC, and SHA hashing (replacing `futoin-hkdf`, `create-hmac`, and `sha.js`).
18
- - **@stablelib**: Constant-time encoding for Base64 and UTF8.
13
+ - **tweetnacl**: Primitives for signing and encryption (X25519 / Ed25519).
14
+ - **ed2curve**: Ed25519 signing key to X25519 encryption key conversion.
15
+ - **msgpackr**: High-performance MessagePack serialization (replacing `msgpack-lite`).
16
+ - **bip39**: Mnemonic generation for keys.
17
+ - **Node Crypto**: Native implementations for HKDF, PBKDF2, HMAC, and SHA hashing (replacing `futoin-hkdf`, `create-hmac`, and `sha.js`).
18
+ - **@stablelib**: Constant-time encoding for Base64 and UTF8.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { decode as decodeBase64, encode as encodeBase64 } from "@stablelib/base64";
2
2
  import { decode as encodeUTF8, encode as decodeUTF8 } from "@stablelib/utf8";
3
- import { IBaseMsg } from "@vex-chat/types";
3
+ import type { IBaseMsg } from "@vex-chat/types";
4
4
  import ed2curve from "ed2curve";
5
5
  /**
6
6
  * Provides an interface that can map an ed25519 keypair to its equivalent
@@ -24,7 +24,7 @@ export declare class XUtils {
24
24
  *
25
25
  * @returns True if equal, else false.
26
26
  */
27
- static bytesEqual(buf1: ArrayBufferLike, buf2: ArrayBufferLike): boolean;
27
+ static bytesEqual(buf1: Uint8Array | ArrayBuffer, buf2: Uint8Array | ArrayBuffer): boolean;
28
28
  /**
29
29
  * Returns a six bit Uint8Array representation of an integer.
30
30
  * The integer must be positive, and it must be able to be stored
@@ -63,22 +63,31 @@ export declare class XUtils {
63
63
  */
64
64
  static emptyHeader(): Uint8Array<ArrayBuffer>;
65
65
  /**
66
- * Encrypts a secret key with a password and saves it as a file.
67
- *
68
- * @param path The path to save the keyfile.
69
- * @param password The password to encrypt the keyfile with.
70
- * @param keyToSave The key to encrypt.
71
- * @param iterationOverride An optional override if you'd prefer to manually
72
- * select your iterations rather than having a random amount selected.
73
- */
74
- static saveKeyFile: (path: string, password: string, keyToSave: string, iterationOverride?: number) => void;
66
+ * Encrypts a secret key with a password and saves it as a file.
67
+ *
68
+ * @param path The path to save the keyfile.
69
+ /**
70
+ * Encrypts a secret key into a portable binary format.
71
+ * The result can be written to disk, sent over the network, etc.
72
+ * No I/O the caller handles persistence.
73
+ *
74
+ * Format: [iterations(6)|salt(24)|nonce(24)|ciphertext(N)]
75
+ *
76
+ * @param password The password to derive the encryption key from.
77
+ * @param keyToSave The hex-encoded secret key to encrypt.
78
+ * @param iterationOverride Optional PBKDF2 iteration count (random if omitted).
79
+ * @returns The encrypted key data as a Uint8Array.
80
+ */
81
+ static encryptKeyData: (password: string, keyToSave: string, iterationOverride?: number) => Uint8Array;
75
82
  /**
76
- * Decrypts and returns a secret key stored in a file with saveKeyFile().
83
+ * Decrypts a secret key from the binary format produced by encryptKeyData().
84
+ * No I/O — the caller handles reading the data.
77
85
  *
78
- * @param path The path of the file.
79
- * @param password The password the file was encrypted with.
86
+ * @param keyData The encrypted key data as a Uint8Array.
87
+ * @param password The password used to encrypt.
88
+ * @returns The hex-encoded secret key.
80
89
  */
81
- static loadKeyFile: (path: string, password: string) => string;
90
+ static decryptKeyData: (keyData: Uint8Array, password: string) => string;
82
91
  /**
83
92
  * Decodes a hex string into a Uint8Array.
84
93
  *
@@ -105,7 +114,7 @@ export declare function xMnemonic(entropy: Uint8Array, wordList?: string[] | und
105
114
  * @param msg the message to create the HMAC of
106
115
  * @param SK the secret key to create the HMAC with
107
116
  */
108
- export declare function xHMAC(msg: any, SK: Uint8Array): Uint8Array<ArrayBuffer>;
117
+ export declare function xHMAC(msg: any, SK: Uint8Array): Uint8Array<ArrayBufferLike>;
109
118
  /**
110
119
  * Constants for vex.
111
120
  */
@@ -162,3 +171,4 @@ interface XConstants {
162
171
  HEADER_SIZE: 32;
163
172
  }
164
173
  export {};
174
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,IAAI,YAAY,EACtB,MAAM,IAAI,YAAY,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAMhD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAWhC;;;GAGG;AACH,eAAO,MAAM,WAAW,iBAAW,CAAC;AAEpC;;;GAGG;AACH,qBAAa,MAAM;IACf,OAAc,UAAU,oBAAc;IAEtC,OAAc,UAAU,oBAAc;IAEtC,OAAc,YAAY,sBAAgB;IAE1C,OAAc,YAAY,sBAAgB;IAE1C;;;;;;;OAOG;WACW,UAAU,CACpB,IAAI,EAAE,UAAU,GAAG,WAAW,EAC9B,IAAI,EAAE,UAAU,GAAG,WAAW;IAelC;;;;;;;OAOG;WACW,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;IAcrD;;;;;OAKG;WACW,gBAAgB,CAAC,GAAG,EAAE,UAAU;IAQ9C;;;;;;OAMG;WACW,aAAa,CACvB,GAAG,EAAE,UAAU,GAAG,MAAM,GACzB,CAAC,UAAU,EAAE,QAAQ,CAAC;IAUzB;;;;;OAKG;WACW,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU;IAMvD;;;;OAIG;WACW,WAAW;IAIzB;;;;;;;;;;;;;;;KAeC;IACD,OAAc,cAAc,GACxB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,oBAAoB,MAAM,KAC3B,UAAU,CAqCX;IAEF;;;;;;;OAOG;IACH,OAAc,cAAc,GACxB,SAAS,UAAU,EACnB,UAAU,MAAM,KACjB,MAAM,CAmBP;IAEF;;;;OAIG;WACW,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAUtD;;;;OAIG;WACW,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;CAMrD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACrB,OAAO,EAAE,UAAU,EACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,UAGlC;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,+BAG7C;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,UAOxB,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,IAAI,UAAU,CAEvC;AAED;;;;;GAKG;AAWH,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAQhD;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,UAErC;AAED;;;;;;;GAOG;AACH,wBAAgB,GAAG,CACf,YAAY,EAAE,UAAU,EACxB,cAAc,EAAE,UAAU,GAC3B,UAAU,CAEZ;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAkB3D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACnB,SAAS,EAAE,QAAQ,GAAG,MAAM,EAC5B,SAAS,EAAE,UAAU,GACtB,UAAU,CAiCZ;AAkCD;;GAEG;AACH,UAAU,UAAU;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,EAAE,CAAC;CACnB"}
package/dist/index.js CHANGED
@@ -1,77 +1,33 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.xConstants = exports.XUtils = exports.XKeyConvert = void 0;
40
- exports.xMnemonic = xMnemonic;
41
- exports.xHMAC = xHMAC;
42
- exports.xMakeNonce = xMakeNonce;
43
- exports.xKDF = xKDF;
44
- exports.xHash = xHash;
45
- exports.xDH = xDH;
46
- exports.xConcat = xConcat;
47
- exports.xEncode = xEncode;
48
- const base64_1 = require("@stablelib/base64");
49
- const utf8_1 = require("@stablelib/utf8");
50
- const bip39 = __importStar(require("bip39"));
51
- const node_crypto_1 = require("node:crypto");
52
- const ed2curve_1 = __importDefault(require("ed2curve"));
53
- const fs_1 = __importDefault(require("fs"));
54
- const node_crypto_2 = require("node:crypto");
55
- const msgpackr_1 = require("msgpackr");
56
- const tweetnacl_1 = __importDefault(require("tweetnacl"));
57
- const packer = new msgpackr_1.Packr({
58
- useRecords: false,
59
- moreTypes: true,
60
- });
1
+ import { decode as decodeBase64, encode as encodeBase64, } from "@stablelib/base64";
2
+ import { decode as encodeUTF8, encode as decodeUTF8 } from "@stablelib/utf8";
3
+ import * as bip39 from "bip39";
4
+ import { hmac } from "@noble/hashes/hmac.js";
5
+ import { sha256, sha512 } from "@noble/hashes/sha2.js";
6
+ import { hkdf } from "@noble/hashes/hkdf.js";
7
+ import { pbkdf2 as noblePbkdf2 } from "@noble/hashes/pbkdf2.js";
8
+ import ed2curve from "ed2curve";
9
+ import { Packr } from "msgpackr";
10
+ import nacl from "tweetnacl";
11
+ // msgpackr with useRecords:false emits standard msgpack (no nonstandard record extension).
12
+ // moreTypes:false keeps the extension set to only what other decoders understand.
13
+ // pack() returns Node Buffer (tight view) so consumers like axios send the correct bytes.
14
+ const packer = new Packr({ useRecords: false, moreTypes: false });
15
+ const msgpackEncode = packer.pack.bind(packer);
16
+ const msgpackDecode = packer.unpack.bind(packer);
61
17
  /**
62
18
  * Provides an interface that can map an ed25519 keypair to its equivalent
63
19
  * X25519 keypair.
64
20
  */
65
- exports.XKeyConvert = ed2curve_1.default;
21
+ export const XKeyConvert = ed2curve;
66
22
  /**
67
23
  * Provides several methods that are useful in working with bytes and
68
24
  * vex messages.
69
25
  */
70
- class XUtils {
71
- static encodeUTF8 = utf8_1.decode;
72
- static decodeUTF8 = utf8_1.encode;
73
- static encodeBase64 = base64_1.encode;
74
- static decodeBase64 = base64_1.decode;
26
+ export class XUtils {
27
+ static encodeUTF8 = encodeUTF8;
28
+ static decodeUTF8 = decodeUTF8;
29
+ static encodeBase64 = encodeBase64;
30
+ static decodeBase64 = decodeBase64;
75
31
  /**
76
32
  * Checks if two buffer-like objects are equal.
77
33
  *
@@ -81,13 +37,13 @@ class XUtils {
81
37
  * @returns True if equal, else false.
82
38
  */
83
39
  static bytesEqual(buf1, buf2) {
84
- if (buf1.byteLength !== buf2.byteLength) {
40
+ const a = buf1 instanceof Uint8Array ? buf1 : new Uint8Array(buf1);
41
+ const b = buf2 instanceof Uint8Array ? buf2 : new Uint8Array(buf2);
42
+ if (a.byteLength !== b.byteLength) {
85
43
  return false;
86
44
  }
87
- const dv1 = new Int8Array(buf1);
88
- const dv2 = new Int8Array(buf2);
89
- for (let i = 0; i !== buf1.byteLength; i++) {
90
- if (dv1[i] !== dv2[i]) {
45
+ for (let i = 0; i !== a.byteLength; i++) {
46
+ if (a[i] !== b[i]) {
91
47
  return false;
92
48
  }
93
49
  }
@@ -118,7 +74,11 @@ class XUtils {
118
74
  * @returns the number representation of arr.
119
75
  */
120
76
  static uint8ArrToNumber(arr) {
121
- return Buffer.from(arr).readUIntBE(0, arr.length);
77
+ let n = 0;
78
+ for (let i = 0; i < arr.length; i++) {
79
+ n = n * 256 + arr[i];
80
+ }
81
+ return n;
122
82
  }
123
83
  /**
124
84
  * Takes a vex message and unpacks it into its header and a javascript object
@@ -129,9 +89,8 @@ class XUtils {
129
89
  */
130
90
  static unpackMessage(msg) {
131
91
  const msgp = Uint8Array.from(msg);
132
- const msgh = msgp.slice(0, exports.xConstants.HEADER_SIZE);
133
- // UPDATED: Use msgpackr
134
- const msgb = packer.unpack(msgp.slice(exports.xConstants.HEADER_SIZE));
92
+ const msgh = msgp.slice(0, xConstants.HEADER_SIZE);
93
+ const msgb = msgpackDecode(msgp.slice(xConstants.HEADER_SIZE));
135
94
  return [msgh, msgb];
136
95
  }
137
96
  /**
@@ -141,8 +100,7 @@ class XUtils {
141
100
  * @returns the packed message.
142
101
  */
143
102
  static packMessage(msg, header) {
144
- // UPDATED: Use msgpackr
145
- const msgb = packer.pack(msg);
103
+ const msgb = msgpackEncode(msg);
146
104
  const msgh = header || XUtils.emptyHeader();
147
105
  return xConcat(msgh, msgb);
148
106
  }
@@ -152,30 +110,41 @@ class XUtils {
152
110
  * @returns The empty header.
153
111
  */
154
112
  static emptyHeader() {
155
- return new Uint8Array(exports.xConstants.HEADER_SIZE);
113
+ return new Uint8Array(xConstants.HEADER_SIZE);
156
114
  }
157
115
  /**
158
- * Encrypts a secret key with a password and saves it as a file.
159
- *
160
- * @param path The path to save the keyfile.
161
- * @param password The password to encrypt the keyfile with.
162
- * @param keyToSave The key to encrypt.
163
- * @param iterationOverride An optional override if you'd prefer to manually
164
- * select your iterations rather than having a random amount selected.
165
- */
166
- static saveKeyFile = (path, password, keyToSave, iterationOverride) => {
116
+ * Encrypts a secret key with a password and saves it as a file.
117
+ *
118
+ * @param path The path to save the keyfile.
119
+ /**
120
+ * Encrypts a secret key into a portable binary format.
121
+ * The result can be written to disk, sent over the network, etc.
122
+ * No I/O the caller handles persistence.
123
+ *
124
+ * Format: [iterations(6)|salt(24)|nonce(24)|ciphertext(N)]
125
+ *
126
+ * @param password The password to derive the encryption key from.
127
+ * @param keyToSave The hex-encoded secret key to encrypt.
128
+ * @param iterationOverride Optional PBKDF2 iteration count (random if omitted).
129
+ * @returns The encrypted key data as a Uint8Array.
130
+ */
131
+ static encryptKeyData = (password, keyToSave, iterationOverride) => {
167
132
  const UNENCRYPTED_SIGNKEY = XUtils.decodeHex(keyToSave);
168
133
  const OFFSET = 1000;
169
- // generate random amount of iterations using Native Crypto
170
- const rand = (0, node_crypto_1.randomBytes)(2);
134
+ const rand = nacl.randomBytes(2);
171
135
  const N1 = rand[0];
172
136
  const N2 = rand[1];
173
- const iterations = iterationOverride ? iterationOverride : N1 * N2 + OFFSET;
137
+ const iterations = iterationOverride
138
+ ? iterationOverride
139
+ : N1 * N2 + OFFSET;
174
140
  const ITERATIONS = XUtils.numberToUint8Arr(iterations);
175
141
  const PKBDF_SALT = xMakeNonce();
176
- const ENCRYPTION_KEY = (0, node_crypto_1.pbkdf2Sync)(password, PKBDF_SALT, iterations, 32, "sha512");
142
+ const ENCRYPTION_KEY = noblePbkdf2(sha512, password, PKBDF_SALT, {
143
+ c: iterations,
144
+ dkLen: 32,
145
+ });
177
146
  const NONCE = xMakeNonce();
178
- const ENCRYPTED_SIGNKEY = tweetnacl_1.default.secretbox(UNENCRYPTED_SIGNKEY, NONCE, new Uint8Array(ENCRYPTION_KEY));
147
+ const ENCRYPTED_SIGNKEY = nacl.secretbox(UNENCRYPTED_SIGNKEY, NONCE, ENCRYPTION_KEY);
179
148
  const result = new Uint8Array(ITERATIONS.length +
180
149
  PKBDF_SALT.length +
181
150
  NONCE.length +
@@ -188,28 +157,30 @@ class XUtils {
188
157
  result.set(NONCE, offset);
189
158
  offset += NONCE.length;
190
159
  result.set(ENCRYPTED_SIGNKEY, offset);
191
- fs_1.default.writeFileSync(path, result);
160
+ return result;
192
161
  };
193
162
  /**
194
- * Decrypts and returns a secret key stored in a file with saveKeyFile().
163
+ * Decrypts a secret key from the binary format produced by encryptKeyData().
164
+ * No I/O — the caller handles reading the data.
195
165
  *
196
- * @param path The path of the file.
197
- * @param password The password the file was encrypted with.
166
+ * @param keyData The encrypted key data as a Uint8Array.
167
+ * @param password The password used to encrypt.
168
+ * @returns The hex-encoded secret key.
198
169
  */
199
- static loadKeyFile = (path, password) => {
200
- const keyFile = Uint8Array.from(fs_1.default.readFileSync(path));
201
- const ITERATIONS = XUtils.uint8ArrToNumber(keyFile.slice(0, 6));
202
- const PKBDF_SALT = keyFile.slice(6, 30);
203
- const ENCRYPTION_NONCE = keyFile.slice(30, 54);
204
- const ENCRYPTED_KEY = keyFile.slice(54);
205
- const DERIVED_KEY = (0, node_crypto_1.pbkdf2Sync)(password, PKBDF_SALT, ITERATIONS, 32, "sha512");
206
- const DECRYPTED_SIGNKEY = tweetnacl_1.default.secretbox.open(ENCRYPTED_KEY, ENCRYPTION_NONCE, new Uint8Array(DERIVED_KEY));
170
+ static decryptKeyData = (keyData, password) => {
171
+ const ITERATIONS = XUtils.uint8ArrToNumber(keyData.slice(0, 6));
172
+ const PKBDF_SALT = keyData.slice(6, 30);
173
+ const ENCRYPTION_NONCE = keyData.slice(30, 54);
174
+ const ENCRYPTED_KEY = keyData.slice(54);
175
+ const DERIVED_KEY = noblePbkdf2(sha512, password, PKBDF_SALT, {
176
+ c: ITERATIONS,
177
+ dkLen: 32,
178
+ });
179
+ const DECRYPTED_SIGNKEY = nacl.secretbox.open(ENCRYPTED_KEY, ENCRYPTION_NONCE, DERIVED_KEY);
207
180
  if (!DECRYPTED_SIGNKEY) {
208
181
  throw new Error("Decryption failed. Wrong password?");
209
182
  }
210
- else {
211
- return XUtils.encodeHex(DECRYPTED_SIGNKEY);
212
- }
183
+ return XUtils.encodeHex(DECRYPTED_SIGNKEY);
213
184
  };
214
185
  /**
215
186
  * Decodes a hex string into a Uint8Array.
@@ -231,15 +202,14 @@ class XUtils {
231
202
  return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
232
203
  }
233
204
  }
234
- exports.XUtils = XUtils;
235
205
  /**
236
206
  * Gets a word list representation of a byte sequence.
237
207
  *
238
208
  * @param entropy The bytes to derive the wordlist from.
239
209
  * @param wordList Optional, override the wordlist. See bip39 docs for details.
240
210
  */
241
- function xMnemonic(entropy, wordList) {
242
- return bip39.entropyToMnemonic(Buffer.from(entropy), wordList);
211
+ export function xMnemonic(entropy, wordList) {
212
+ return bip39.entropyToMnemonic(XUtils.encodeHex(entropy), wordList);
243
213
  }
244
214
  /**
245
215
  * Returns a 32 byte HMAC of a javscript object.
@@ -247,17 +217,14 @@ function xMnemonic(entropy, wordList) {
247
217
  * @param msg the message to create the HMAC of
248
218
  * @param SK the secret key to create the HMAC with
249
219
  */
250
- function xHMAC(msg, SK) {
251
- const packedMsg = packer.pack(msg);
252
- const hmacGen = (0, node_crypto_1.createHmac)("sha256", Buffer.from(SK));
253
- hmacGen.update(packedMsg);
254
- const hmac = Uint8Array.from(hmacGen.digest());
255
- return hmac;
220
+ export function xHMAC(msg, SK) {
221
+ const packedMsg = msgpackEncode(msg);
222
+ return hmac(sha256, SK, packedMsg);
256
223
  }
257
224
  /**
258
225
  * Constants for vex.
259
226
  */
260
- exports.xConstants = {
227
+ export const xConstants = {
261
228
  CURVE: "X25519",
262
229
  HASH: "SHA-512",
263
230
  KEY_LENGTH: 32,
@@ -268,8 +235,8 @@ exports.xConstants = {
268
235
  /**
269
236
  * Returns a 24 byte random nonce of cryptographic quality.
270
237
  */
271
- function xMakeNonce() {
272
- return tweetnacl_1.default.randomBytes(24);
238
+ export function xMakeNonce() {
239
+ return nacl.randomBytes(24);
273
240
  }
274
241
  /**
275
242
  * Derives a 32 byte secret key from some initial key material.
@@ -286,8 +253,8 @@ function xMakeNonce() {
286
253
  // })
287
254
  // );
288
255
  // }
289
- function xKDF(IKM) {
290
- return new Uint8Array((0, node_crypto_2.hkdfSync)("sha512", IKM, xMakeSalt(exports.xConstants.CURVE), exports.xConstants.INFO, exports.xConstants.KEY_LENGTH));
256
+ export function xKDF(IKM) {
257
+ return hkdf(sha512, IKM, xMakeSalt(xConstants.CURVE), new TextEncoder().encode(xConstants.INFO), xConstants.KEY_LENGTH);
291
258
  }
292
259
  /**
293
260
  * Hashes some data.
@@ -295,9 +262,8 @@ function xKDF(IKM) {
295
262
  * @param data the data to hash.
296
263
  * @returns The hash of the data.
297
264
  */
298
- function xHash(data) {
299
- const hash = (0, node_crypto_1.createHash)("sha512");
300
- return hash.update(data).digest("hex");
265
+ export function xHash(data) {
266
+ return XUtils.encodeHex(sha512(data));
301
267
  }
302
268
  /**
303
269
  * Derives a shared Secret Key from a known private key and
@@ -307,15 +273,15 @@ function xHash(data) {
307
273
  * @param theirPublicKey Their public key
308
274
  * @returns The derived shared secret, SK.
309
275
  */
310
- function xDH(myPrivateKey, theirPublicKey) {
311
- return tweetnacl_1.default.box.before(theirPublicKey, myPrivateKey);
276
+ export function xDH(myPrivateKey, theirPublicKey) {
277
+ return nacl.box.before(theirPublicKey, myPrivateKey);
312
278
  }
313
279
  /**
314
280
  * Concatanates multiple Uint8Arrays.
315
281
  *
316
282
  * @param arrays As many Uint8Arrays as you would like to concatanate.
317
283
  */
318
- function xConcat(...arrays) {
284
+ export function xConcat(...arrays) {
319
285
  const totalLength = arrays.reduce((acc, value) => acc + value.length, 0);
320
286
  if (!arrays.length) {
321
287
  return new Uint8Array();
@@ -336,7 +302,7 @@ function xConcat(...arrays) {
336
302
  * ittle-endian encoding of the u-coordinate. See [rfc 7748](https://www.ietf.org/rfc/rfc7748.txt) for more
337
303
  * details.
338
304
  */
339
- function xEncode(curveType, publicKey) {
305
+ export function xEncode(curveType, publicKey) {
340
306
  if (publicKey.length !== 32) {
341
307
  throw new Error("Invalid key length, received key of length " +
342
308
  publicKey.length +
@@ -391,3 +357,4 @@ function isEven(value) {
391
357
  return false;
392
358
  }
393
359
  }
360
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,76 +1,84 @@
1
1
  {
2
- "name": "@vex-chat/crypto",
3
- "version": "1.0.11-rc.11",
4
- "description": "Crypto primitives for Vex",
5
- "main": "./dist/index.js",
6
- "types": "./dist/index.d.ts",
7
- "author": "Extra <extrahash@protonmail.com>",
8
- "license": "AGPL-3.0-or-later",
9
- "scripts": {
10
- "build": "rimraf dist && tsc",
11
- "prepack": "yarn build",
12
- "prettier": "prettier '**/*.{ts,tsx,json,md}' --ignore-path .gitignore --write",
13
- "lint": "eslint src/**/*.ts",
14
- "lint-fix": "eslint src/**/*.ts --fix",
15
- "push": "yarn build && yalc push",
16
- "prepublish": "yarn build",
17
- "test": "npx jest --runInBand --forceExit"
18
- },
19
- "peerDependencies": {
20
- "typescript": ">=5.9.0"
21
- },
22
- "peerDependenciesMeta": {
23
- "typescript": {
24
- "optional": true
2
+ "name": "@vex-chat/crypto",
3
+ "version": "1.1.1",
4
+ "description": "Crypto primitives for Vex",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "author": "Extra <extrahash@protonmail.com>",
19
+ "license": "AGPL-3.0-or-later",
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "build:clean": "rimraf dist && tsc",
23
+ "prepack": "npm run build",
24
+ "format": "prettier --write .",
25
+ "format:check": "prettier --check .",
26
+ "lint": "eslint src/",
27
+ "lint:fix": "eslint src/ --fix",
28
+ "prepublish": "npm run build",
29
+ "test": "vitest run"
30
+ },
31
+ "peerDependencies": {
32
+ "@vex-chat/types": "^1.0.0-rc.1",
33
+ "typescript": ">=5.9.0 || >=6.0.0"
34
+ },
35
+ "peerDependenciesMeta": {
36
+ "typescript": {
37
+ "optional": true
38
+ }
39
+ },
40
+ "dependencies": {
41
+ "@noble/hashes": "^2.0.1",
42
+ "@stablelib/base64": "^2.0.1",
43
+ "@stablelib/utf8": "^2.1.0",
44
+ "bip39": "^3.1.0",
45
+ "ed2curve": "^0.3.0",
46
+ "msgpackr": "1.11.8",
47
+ "tweetnacl": "^1.0.3"
48
+ },
49
+ "devDependencies": {
50
+ "@changesets/cli": "^2.29.8",
51
+ "@types/create-hmac": "^1.1.3",
52
+ "@types/ed2curve": "^0.2.4",
53
+ "@types/node": "^24.12.2",
54
+ "@typescript-eslint/eslint-plugin": "^8.57.1",
55
+ "@typescript-eslint/parser": "^8.57.1",
56
+ "@vex-chat/types": "^1.0.1",
57
+ "eslint": "^10.1.0",
58
+ "eslint-config-prettier": "^9.0.0",
59
+ "husky": "^9.0.0",
60
+ "lint-staged": "^15.2.0",
61
+ "prettier": "^3.2.0",
62
+ "rimraf": "^6.1.3",
63
+ "typescript": "^6.0.2",
64
+ "vitest": "^3.0.0"
65
+ },
66
+ "lint-staged": {
67
+ "*.ts": [
68
+ "eslint --fix",
69
+ "prettier --write"
70
+ ]
71
+ },
72
+ "repository": {
73
+ "type": "git",
74
+ "url": "git+https://github.com/vex-chat/libvex-js.git"
75
+ },
76
+ "bugs": {
77
+ "url": "https://github.com/vex-chat/libvex-js/issues"
78
+ },
79
+ "homepage": "https://github.com/vex-chat/libvex-js#readme",
80
+ "publishConfig": {
81
+ "access": "public",
82
+ "registry": "https://registry.npmjs.org/"
25
83
  }
26
- },
27
- "dependencies": {
28
- "@stablelib/base64": "^1.0.1",
29
- "@stablelib/utf8": "^1.0.1",
30
- "@vex-chat/types": "1.0.0-rc.0",
31
- "bip39": "^3.1.0",
32
- "ed2curve": "^0.3.0",
33
- "msgpackr": "^1.10.1",
34
- "tweetnacl": "^1.0.3",
35
- "uuid": "^9.0.0"
36
- },
37
- "devDependencies": {
38
- "@changesets/cli": "^2.29.8",
39
- "@types/create-hmac": "^1.1.3",
40
- "@types/ed2curve": "^0.2.4",
41
- "@types/jest": "^30.0.0",
42
- "@types/lodash": "^4.17.21",
43
- "@types/node": "^22.15.3",
44
- "@typescript-eslint/eslint-plugin": "^8.57.1",
45
- "@typescript-eslint/parser": "^8.57.1",
46
- "eslint": "^10.1.0",
47
- "eslint-config-prettier": "^9.0.0",
48
- "husky": "^9.0.0",
49
- "jest": "^30.3.0",
50
- "lint-staged": "^15.2.0",
51
- "lodash": "^4.17.23",
52
- "prettier": "^3.2.0",
53
- "rimraf": "^6.1.3",
54
- "ts-jest": "^29.4.6",
55
- "typescript": "^5.9.0"
56
- },
57
- "lint-staged": {
58
- "src/**/*.{ts}": [
59
- "eslint --fix"
60
- ]
61
- },
62
- "repository": {
63
- "type": "git",
64
- "url": "git+https://github.com/vex-chat/libvex-js.git"
65
- },
66
- "resolutions": {
67
- "minimatch": "^9.0.7",
68
- "flatted": "^3.4.2",
69
- "ajv": "^6.14.0",
70
- "lodash": "^4.17.21"
71
- },
72
- "bugs": {
73
- "url": "https://github.com/vex-chat/libvex-js/issues"
74
- },
75
- "homepage": "https://github.com/vex-chat/libvex-js#readme"
76
84
  }
@@ -1,8 +0,0 @@
1
- # Changesets
2
-
3
- Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
4
- with multi-package repos, or single-package repos to help you version and publish your code. You can
5
- find the full documentation for it [in the changesets repo](https://github.com/changesets/changesets)
6
-
7
- We have a quick list of common questions to get you started engaging with this project in
8
- [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@changesets/config@3.1.2/schema.json",
3
- "changelog": "@changesets/cli/changelog",
4
- "commit": false,
5
- "fixed": [],
6
- "linked": [],
7
- "access": "public",
8
- "baseBranch": "master",
9
- "updateInternalDependencies": "patch",
10
- "ignore": []
11
- }
@@ -1,5 +0,0 @@
1
- ---
2
- "@vex-chat/crypto": major
3
- ---
4
-
5
- Migrate to msgpackr and native node:crypto, replacing msgpack-lite, create-hmac, sha.js, pbkdf2, and futoin-hkdf with built-in Node.js crypto primitives. Add release tooling with changesets, mise, and updated CI workflows.
@@ -1,10 +0,0 @@
1
- {
2
- "mode": "pre",
3
- "tag": "rc",
4
- "initialVersions": {
5
- "@vex-chat/crypto": "0.8.0"
6
- },
7
- "changesets": [
8
- "migrate-to-native-crypto"
9
- ]
10
- }
package/CHANGELOG.md DELETED
@@ -1,7 +0,0 @@
1
- # @vex-chat/crypto
2
-
3
- ## 1.0.0-rc.0
4
-
5
- ### Major Changes
6
-
7
- - 19b36ca: Migrate to msgpackr and native node:crypto, replacing msgpack-lite, create-hmac, sha.js, pbkdf2, and futoin-hkdf with built-in Node.js crypto primitives. Add release tooling with changesets, mise, and updated CI workflows.
package/RELEASING.md DELETED
@@ -1,85 +0,0 @@
1
- # Releasing @vex-chat/crypto
2
-
3
- This repo uses [Changesets](https://github.com/changesets/changesets) for versioning and publishing.
4
-
5
- ## Dependency Chain
6
-
7
- ```
8
- @vex-chat/types
9
- └─ @vex-chat/crypto ← you are here
10
- └─ @vex-chat/libvex
11
- └─ vex-desktop
12
- ```
13
-
14
- **Publish types first** if it has changes, then publish crypto.
15
-
16
- ## Day-to-Day Workflow
17
-
18
- ### 1. Work on a feature branch
19
-
20
- ```bash
21
- git checkout -b my-feature
22
- # ... make changes ...
23
- ```
24
-
25
- ### 2. Add a changeset before pushing
26
-
27
- ```bash
28
- npx changeset
29
- ```
30
-
31
- This prompts you to:
32
- - Select the package (`@vex-chat/crypto`)
33
- - Choose bump type (patch / minor / major)
34
- - Write a short summary of the change
35
-
36
- It creates a file in `.changeset/` — commit it with your code.
37
-
38
- ### 3. Push and open a PR
39
-
40
- ```bash
41
- git add .
42
- git commit -m "my feature"
43
- git push -u origin my-feature
44
- ```
45
-
46
- ### 4. Merge to master
47
-
48
- After merge, the **Release** GitHub Action will:
49
- 1. Detect pending changesets
50
- 2. Open a **"chore: version packages"** PR with bumped version + updated CHANGELOG.md
51
- 3. When you merge that PR, it publishes to npm automatically
52
-
53
- ```
54
-
55
- ## Release Candidates
56
-
57
- ```bash
58
- npx changeset pre enter rc # enter RC mode
59
- npx changeset version # produces e.g. 0.9.0-rc.0
60
- npx changeset publish # publishes with --tag rc
61
-
62
- # ... more changes + changesets ...
63
- npx changeset version # produces 0.9.0-rc.1
64
- npx changeset publish
65
-
66
- # ready for stable:
67
- npx changeset pre exit
68
- npx changeset version # produces 0.9.0
69
- npx changeset publish # publishes as @latest
70
- ```
71
-
72
- ## GitHub Secrets Required
73
-
74
- - `NPM_TOKEN` — npm access token with publish permission for `@vex-chat` scope
75
- - `GITHUB_TOKEN` — provided automatically by GitHub Actions
76
-
77
- ## Local Development
78
-
79
- You can still use `yalc` for local cross-repo development:
80
-
81
- ```bash
82
- yarn push # builds and pushes to yalc for local consumers
83
- ```
84
-
85
- When publishing for real, changesets handles versioning — yalc is just for local dev loops.
package/jest.config.js DELETED
@@ -1,16 +0,0 @@
1
- module.exports = {
2
- roots: ["<rootDir>/src"],
3
- testMatch: [
4
- "**/__tests__/**/*.+(ts|tsx|js)",
5
- "**/?(*.)+(spec|test).+(ts|tsx|js)",
6
- ],
7
- transform: {
8
- "^.+\\.(ts|tsx)$": [
9
- "ts-jest",
10
- {
11
- diagnostics: false,
12
- isolatedModules: true,
13
- },
14
- ],
15
- },
16
- };
package/mise.toml DELETED
@@ -1,3 +0,0 @@
1
- [tools]
2
- node = "20"
3
- "npm:yarn" = "latest"
package/tsdoc.json DELETED
@@ -1,34 +0,0 @@
1
- {
2
- "tags": {
3
- "allowUnknownTags": true
4
- },
5
- "plugins": [
6
- "plugins/markdown",
7
- "/home/ender/.npm/_npx/229717/lib/node_modules/tsdoc/template/plugins/TSDoc.js"
8
- ],
9
- "opts": {
10
- "template": "/home/ender/.npm/_npx/229717/lib/node_modules/tsdoc/template",
11
- "recurse": "true"
12
- },
13
- "templates": {
14
- "cleverLinks": false,
15
- "monospaceLinks": false
16
- },
17
- "source": {
18
- "includePattern": "(\\.d)?\\.ts$"
19
- },
20
- "markdown": {
21
- "parser": "gfm",
22
- "hardwrap": true
23
- },
24
- "tsdoc": {
25
- "source": "/home/ender/code/crypto-js/src/",
26
- "destination": "/home/ender/code/crypto-js/docs",
27
- "tutorials": "",
28
- "systemName": "crypto-js",
29
- "footer": "",
30
- "copyright": "crypto-js Copyright © 2020 ender.",
31
- "outputSourceFiles": true,
32
- "commentsOnly": true
33
- }
34
- }