@vex-chat/crypto 10.0.0 → 12.0.0
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 +5 -20
- package/dist/index.d.ts +43 -80
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +160 -450
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
- package/src/__tests__/XUtils/stringEncoding.ts +6 -0
- package/src/__tests__/xAsyncApi.extended.test.ts +32 -35
- package/src/__tests__/xAsyncProfile.ts +6 -26
- package/src/__tests__/xHMAC.ts +12 -1
- package/src/index.ts +230 -677
- package/src/__tests__/cryptoProfile.ts +0 -64
- package/src/__tests__/cryptoProfileScope.test.ts +0 -77
package/README.md
CHANGED
|
@@ -24,8 +24,7 @@ Crypto primitives for the [Vex](https://vex.wtf) protocol. Sign, encrypt, hash,
|
|
|
24
24
|
- **Text & byte encoding** — `XUtils` hex/base64/UTF-8 helpers (`@stablelib/base64`, `@stablelib/utf8`).
|
|
25
25
|
- **Mnemonics** — `xMnemonic()` (BIP39 via `bip39`).
|
|
26
26
|
- **Utilities** — `xConcat()`, `xMakeNonce()`, `xRandomBytes()`, `XUtils.bytesEqual` (constant-time when lengths match), and `XKeyConvert` (Ed25519 ↔ X25519 via `ed2curve`).
|
|
27
|
-
- **
|
|
28
|
-
- **Async portable crypto** — `xSignAsync()`, `xSignOpenAsync()`, `xSignKeyPairAsync()`, `xBoxKeyPairAsync()`, `xDHAsync()`, `xSecretboxAsync()`, `xSecretboxOpenAsync()` for cross-runtime WebCrypto-backed flows.
|
|
27
|
+
- **Async convenience APIs** — `xSignAsync()`, `xSignOpenAsync()`, `xSignKeyPairAsync()`, `xBoxKeyPairAsync()`, `xDHAsync()`, `xSecretboxAsync()`, `xSecretboxOpenAsync()` expose the same TweetNaCl operations to async callers.
|
|
29
28
|
|
|
30
29
|
**HKDF, PBKDF2, HMAC, and SHA-512 / SHA-256** all run through **`@noble/hashes`**. **`tweetnacl`** supplies CSPRNG, box, sign, and secretbox.
|
|
31
30
|
|
|
@@ -45,8 +44,6 @@ npm install @vex-chat/types @vex-chat/crypto
|
|
|
45
44
|
|
|
46
45
|
```ts
|
|
47
46
|
import {
|
|
48
|
-
getCryptoProfile,
|
|
49
|
-
setCryptoProfile,
|
|
50
47
|
xSignAsync,
|
|
51
48
|
xSignOpenAsync,
|
|
52
49
|
xSignKeyPairAsync,
|
|
@@ -61,10 +58,6 @@ import {
|
|
|
61
58
|
XUtils,
|
|
62
59
|
} from "@vex-chat/crypto";
|
|
63
60
|
|
|
64
|
-
// Optional: select backend profile once at process startup.
|
|
65
|
-
setCryptoProfile("tweetnacl");
|
|
66
|
-
console.log(getCryptoProfile()); // "tweetnacl"
|
|
67
|
-
|
|
68
61
|
// Generate identity keys
|
|
69
62
|
const signKeys = xSignKeyPair();
|
|
70
63
|
const boxKeys = xBoxKeyPair();
|
|
@@ -90,20 +83,12 @@ const wire = XUtils.packMessage({
|
|
|
90
83
|
});
|
|
91
84
|
const [, body] = XUtils.unpackMessage(wire);
|
|
92
85
|
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
const
|
|
97
|
-
const fipsOpened = await xSignOpenAsync(fipsSigned, fipsKeys.publicKey);
|
|
86
|
+
// The async APIs have the same Ed25519 semantics.
|
|
87
|
+
const asyncKeys = await xSignKeyPairAsync();
|
|
88
|
+
const asyncSigned = await xSignAsync(message, asyncKeys.secretKey);
|
|
89
|
+
const asyncOpened = await xSignOpenAsync(asyncSigned, asyncKeys.publicKey);
|
|
98
90
|
```
|
|
99
91
|
|
|
100
|
-
## Crypto profiles
|
|
101
|
-
|
|
102
|
-
- `tweetnacl` (default): current behavior for signing, key exchange, secretbox, and random bytes.
|
|
103
|
-
- `fips`:
|
|
104
|
-
- sync NaCl-shaped APIs (`xSign`, `xDH`, `xSecretbox`, etc.) still throw (to avoid silent semantic drift),
|
|
105
|
-
- async APIs (`...Async`) use WebCrypto-backed P-256 ECDSA, P-256 ECDH, and AES-GCM, plus WebCrypto random bytes.
|
|
106
|
-
|
|
107
92
|
Outside contributors should follow [CONTRIBUTING.md](./CONTRIBUTING.md) (including the [CLA](./CLA.md)). Release workflow: [AGENTS.md](./AGENTS.md).
|
|
108
93
|
|
|
109
94
|
## License
|
package/dist/index.d.ts
CHANGED
|
@@ -12,31 +12,6 @@ import type { BaseMsg } from "@vex-chat/types";
|
|
|
12
12
|
import { decode as decodeBase64, encode as encodeBase64 } from "@stablelib/base64";
|
|
13
13
|
import { encode as decodeUTF8, decode as encodeUTF8 } from "@stablelib/utf8";
|
|
14
14
|
import ed2curve from "ed2curve";
|
|
15
|
-
/** Runtime crypto profile selector. */
|
|
16
|
-
export type CryptoProfile = "fips" | "tweetnacl";
|
|
17
|
-
/** Returns the currently configured crypto profile. */
|
|
18
|
-
export declare function getCryptoProfile(): CryptoProfile;
|
|
19
|
-
/**
|
|
20
|
-
* Sets the runtime crypto profile.
|
|
21
|
-
*
|
|
22
|
-
* `tweetnacl` preserves existing behavior.
|
|
23
|
-
* `fips` currently enables only backend-agnostic helpers; NaCl-coupled
|
|
24
|
-
* primitives throw until a FIPS backend implementation is wired in.
|
|
25
|
-
*/
|
|
26
|
-
export declare function setCryptoProfile(profile: CryptoProfile): void;
|
|
27
|
-
/**
|
|
28
|
-
* Saves the current profile and switches to `profile`. Pair every call with
|
|
29
|
-
* {@link leaveCryptoProfileScope} in a `finally` block.
|
|
30
|
-
*
|
|
31
|
-
* **Why:** `setCryptoProfile` is process-wide. Several async libvex `Client`s
|
|
32
|
-
* can overlap on `readMail`; a naive save/restore in `finally` can reset the
|
|
33
|
-
* profile while another client still needs FIPS — `xSecretboxOpenAsync` then
|
|
34
|
-
* reads `tweetnacl` and fails to decrypt AES-GCM payloads. Nesting this stack
|
|
35
|
-
* fixes that.
|
|
36
|
-
*/
|
|
37
|
-
export declare function enterCryptoProfileScope(profile: CryptoProfile): void;
|
|
38
|
-
/** Restores the profile saved by the innermost {@link enterCryptoProfileScope}. */
|
|
39
|
-
export declare function leaveCryptoProfileScope(): void;
|
|
40
15
|
/**
|
|
41
16
|
* Provides an interface that can map an ed25519 keypair to its equivalent
|
|
42
17
|
* X25519 keypair.
|
|
@@ -55,8 +30,8 @@ export declare class XUtils {
|
|
|
55
30
|
* Checks if two buffer-like objects are equal.
|
|
56
31
|
* When lengths match, comparison is constant-time in the inputs (no early exit on first differing byte).
|
|
57
32
|
*
|
|
58
|
-
* @param buf1
|
|
59
|
-
* @param buf2
|
|
33
|
+
* @param buf1 - First buffer to compare.
|
|
34
|
+
* @param buf2 - Second buffer to compare.
|
|
60
35
|
*
|
|
61
36
|
* @returns True if equal, else false.
|
|
62
37
|
*/
|
|
@@ -71,23 +46,18 @@ export declare class XUtils {
|
|
|
71
46
|
* Decrypts a secret key from the binary format produced by encryptKeyData().
|
|
72
47
|
* No I/O — the caller handles reading the data.
|
|
73
48
|
*
|
|
74
|
-
* @param keyData The encrypted key data as a Uint8Array.
|
|
75
|
-
* @param password The password used to encrypt.
|
|
49
|
+
* @param keyData - The encrypted key data as a Uint8Array.
|
|
50
|
+
* @param password - The password used to encrypt.
|
|
76
51
|
* @returns The hex-encoded secret key.
|
|
77
52
|
*/
|
|
78
53
|
static decryptKeyData: (keyData: Uint8Array, password: string) => string;
|
|
79
|
-
/**
|
|
80
|
-
* Async variant of decryptKeyData for cross-runtime/FIPS backends.
|
|
81
|
-
* Supports both profile formats emitted by encryptKeyDataAsync.
|
|
82
|
-
*/
|
|
54
|
+
/** Async variant of decryptKeyData for cross-runtime callers. */
|
|
83
55
|
static decryptKeyDataAsync: (keyData: Uint8Array, password: string) => Promise<string>;
|
|
84
56
|
/**
|
|
85
|
-
* 32-byte
|
|
86
|
-
*
|
|
87
|
-
* For `fips` the identity secret is PKCS#8; HKDF is applied so AES keys never
|
|
88
|
-
* equal the raw private key material.
|
|
57
|
+
* Derive a purpose-separated 32-byte key for local at-rest encryption.
|
|
58
|
+
* The result never aliases raw identity-key bytes.
|
|
89
59
|
*/
|
|
90
|
-
static deriveLocalAtRestAesKey(identitySk: Uint8Array
|
|
60
|
+
static deriveLocalAtRestAesKey(identitySk: Uint8Array): Uint8Array;
|
|
91
61
|
/**
|
|
92
62
|
* Returns the empty header (32 0's)
|
|
93
63
|
*
|
|
@@ -107,38 +77,35 @@ export declare class XUtils {
|
|
|
107
77
|
*
|
|
108
78
|
* Format: [iterations(6)|salt(24)|nonce(24)|ciphertext(N)]
|
|
109
79
|
*
|
|
110
|
-
* @param password The password to derive the encryption key from.
|
|
111
|
-
* @param keyToSave The hex-encoded secret key to encrypt.
|
|
112
|
-
* @param iterationOverride Optional PBKDF2 iteration count (
|
|
80
|
+
* @param password - The password to derive the encryption key from.
|
|
81
|
+
* @param keyToSave - The hex-encoded secret key to encrypt.
|
|
82
|
+
* @param iterationOverride - Optional PBKDF2 iteration count (220,000 if omitted).
|
|
113
83
|
* @returns The encrypted key data as a Uint8Array.
|
|
114
84
|
*/
|
|
115
85
|
static encryptKeyData: (password: string, keyToSave: string, iterationOverride?: number) => Uint8Array;
|
|
116
|
-
/**
|
|
117
|
-
* Async variant of encryptKeyData for cross-runtime/FIPS backends.
|
|
118
|
-
* Format remains [iterations(6)|salt(24)|nonce(24)|ciphertext(N)].
|
|
119
|
-
*/
|
|
86
|
+
/** Async variant of encryptKeyData for cross-runtime callers. */
|
|
120
87
|
static encryptKeyDataAsync: (password: string, keyToSave: string, iterationOverride?: number) => Promise<Uint8Array>;
|
|
121
88
|
/**
|
|
122
89
|
* Returns a six bit Uint8Array representation of an integer.
|
|
123
90
|
* The integer must be positive, and it must be able to be stored
|
|
124
91
|
* in six bytes.
|
|
125
92
|
*
|
|
126
|
-
* @param n The number to convert.
|
|
93
|
+
* @param n - The number to convert.
|
|
127
94
|
* @returns The Uint8Array representation of n.
|
|
128
95
|
*/
|
|
129
96
|
static numberToUint8Arr(n: number): Uint8Array;
|
|
130
97
|
/**
|
|
131
98
|
* Packs a javascript object and a 32 byte header into a vex message.
|
|
132
99
|
*
|
|
133
|
-
* @param msg Message body (msgpack-serialized).
|
|
134
|
-
* @param header Optional 32-byte header; defaults to an empty header.
|
|
100
|
+
* @param msg - Message body (msgpack-serialized).
|
|
101
|
+
* @param header - Optional 32-byte header; defaults to an empty header.
|
|
135
102
|
* @returns the packed message.
|
|
136
103
|
*/
|
|
137
104
|
static packMessage(msg: unknown, header?: Uint8Array): Uint8Array<ArrayBufferLike>;
|
|
138
105
|
/**
|
|
139
106
|
* Converts a Uint8Array representation of an integer back into a number.
|
|
140
107
|
*
|
|
141
|
-
* @param arr The array to convert.
|
|
108
|
+
* @param arr - The array to convert.
|
|
142
109
|
* @returns the number representation of arr.
|
|
143
110
|
*/
|
|
144
111
|
static uint8ArrToNumber(arr: Uint8Array): number;
|
|
@@ -146,25 +113,34 @@ export declare class XUtils {
|
|
|
146
113
|
* Takes a vex message and unpacks it into its header and a javascript object
|
|
147
114
|
* representation of its body.
|
|
148
115
|
*
|
|
149
|
-
* @param msg Full wire message (32-byte header + msgpack body).
|
|
116
|
+
* @param msg - Full wire message (32-byte header + msgpack body).
|
|
150
117
|
* @returns [32 byte header, message body]
|
|
151
118
|
*/
|
|
152
119
|
static unpackMessage(msg: Buffer | Uint8Array): [Uint8Array, BaseMsg];
|
|
120
|
+
private static readKeyDataIterations;
|
|
121
|
+
private static validateKeyDataIterations;
|
|
153
122
|
}
|
|
154
123
|
/**
|
|
155
124
|
* Returns a 32 byte HMAC of a javscript object.
|
|
156
125
|
*
|
|
157
|
-
* @param msg
|
|
158
|
-
* @param SK
|
|
126
|
+
* @param msg - The message to create the HMAC of.
|
|
127
|
+
* @param SK - The secret key to create the HMAC with.
|
|
159
128
|
*/
|
|
160
129
|
export declare function xHMAC(msg: unknown, SK: Uint8Array): Uint8Array<ArrayBufferLike> & Uint8Array<ArrayBuffer>;
|
|
130
|
+
/** Derive independent payload-encryption and envelope-authentication keys. */
|
|
131
|
+
export declare function xMessageKeySubkeys(messageKey: Uint8Array): {
|
|
132
|
+
authenticationKey: Uint8Array;
|
|
133
|
+
encryptionKey: Uint8Array;
|
|
134
|
+
};
|
|
161
135
|
/**
|
|
162
136
|
* Gets a word list representation of a byte sequence.
|
|
163
137
|
*
|
|
164
|
-
* @param entropy The bytes to derive the wordlist from.
|
|
165
|
-
* @param wordList Optional
|
|
138
|
+
* @param entropy - The bytes to derive the wordlist from.
|
|
139
|
+
* @param wordList - Optional override for the wordlist. See bip39 docs for details.
|
|
166
140
|
*/
|
|
167
141
|
export declare function xMnemonic(entropy: Uint8Array, wordList?: string[]): string;
|
|
142
|
+
/** Domain-separated payload signed for X3DH signed and one-time prekeys. */
|
|
143
|
+
export declare function xPreKeySignaturePayload(publicKey: Uint8Array, kind: "one-time" | "signed"): Uint8Array;
|
|
168
144
|
/**
|
|
169
145
|
* Constants for vex.
|
|
170
146
|
*/
|
|
@@ -189,44 +165,31 @@ export interface XConstants {
|
|
|
189
165
|
KEY_LENGTH: 32 | 57;
|
|
190
166
|
MIN_OTK_SUPPLY: number;
|
|
191
167
|
}
|
|
192
|
-
/**
|
|
193
|
-
* FIPS: `device.signKey` in the database is the P-256 ECDSA public key (SPKI),
|
|
194
|
-
* used for account/device signature verification. X3DH on the client expects
|
|
195
|
-
* the same curve point as Web Crypto "raw" P-256 ECDH public bytes for
|
|
196
|
-
* `importEcdhPublicKey`. This converts SPKI → raw without a private key.
|
|
197
|
-
*/
|
|
198
|
-
export declare function fipsEcdhRawPublicKeyFromEcdsaSpkiAsync(ecdsaSpki: Uint8Array): Promise<Uint8Array>;
|
|
199
168
|
/** Generate a fresh X25519 box key pair. */
|
|
200
169
|
export declare function xBoxKeyPair(): KeyPair;
|
|
201
|
-
/** Async box keypair generation
|
|
170
|
+
/** Async X25519 box keypair generation. */
|
|
202
171
|
export declare function xBoxKeyPairAsync(): Promise<KeyPair>;
|
|
203
172
|
/** Restore an X25519 box key pair from a 32-byte secret key. */
|
|
204
173
|
export declare function xBoxKeyPairFromSecret(secretKey: Uint8Array): KeyPair;
|
|
205
|
-
/** Async box key restore from private key material. */
|
|
174
|
+
/** Async X25519 box key restore from private key material. */
|
|
206
175
|
export declare function xBoxKeyPairFromSecretAsync(secretKey: Uint8Array): Promise<KeyPair>;
|
|
207
176
|
/**
|
|
208
177
|
* Concatanates multiple Uint8Arrays.
|
|
209
178
|
*
|
|
210
|
-
* @param arrays
|
|
179
|
+
* @param arrays - The Uint8Arrays to concatenate.
|
|
211
180
|
*/
|
|
212
181
|
export declare function xConcat(...arrays: Uint8Array[]): Uint8Array;
|
|
213
182
|
/**
|
|
214
183
|
* Derives a shared Secret Key from a known private key and
|
|
215
184
|
* a peer's known public key.
|
|
216
185
|
*
|
|
217
|
-
* @param myPrivateKey Your own private key
|
|
218
|
-
* @param theirPublicKey Their public key
|
|
186
|
+
* @param myPrivateKey - Your own private key.
|
|
187
|
+
* @param theirPublicKey - Their public key.
|
|
219
188
|
* @returns The derived shared secret, SK.
|
|
220
189
|
*/
|
|
221
190
|
export declare function xDH(myPrivateKey: Uint8Array, theirPublicKey: Uint8Array): Uint8Array;
|
|
222
|
-
/** Async DH
|
|
191
|
+
/** Async X25519 DH. */
|
|
223
192
|
export declare function xDHAsync(myPrivateKey: Uint8Array, theirPublicKey: Uint8Array): Promise<Uint8Array>;
|
|
224
|
-
/**
|
|
225
|
-
* In `fips` mode only: derive a P-256 ECDH `KeyPair` (raw public + pkcs8 secret)
|
|
226
|
-
* from a P-256 ECDSA `KeyPair` (spki + pkcs8) using the same private scalar in Web Crypto.
|
|
227
|
-
* In `tweetnacl` mode, use `XKeyConvert.convertKeyPair` to map Ed25519 → X25519 instead.
|
|
228
|
-
*/
|
|
229
|
-
export declare function xEcdhKeyPairFromEcdsaKeyPairAsync(sign: KeyPair): Promise<KeyPair>;
|
|
230
193
|
/**
|
|
231
194
|
* Encode an X25519 or X448 public key PK into a byte sequence.
|
|
232
195
|
* The encoding consists of 0 or 1 to represent the type of curve, followed by l
|
|
@@ -237,7 +200,7 @@ export declare function xEncode(curveType: "X448" | "X25519", publicKey: Uint8Ar
|
|
|
237
200
|
/**
|
|
238
201
|
* Hashes some data.
|
|
239
202
|
*
|
|
240
|
-
* @param data
|
|
203
|
+
* @param data - The data to hash.
|
|
241
204
|
* @returns The hash of the data.
|
|
242
205
|
*/
|
|
243
206
|
export declare function xHash(data: Uint8Array): string;
|
|
@@ -250,26 +213,26 @@ export declare function xMakeNonce(): Uint8Array;
|
|
|
250
213
|
export declare function xRandomBytes(length: number): Uint8Array;
|
|
251
214
|
/** Encrypt with a shared secret key. */
|
|
252
215
|
export declare function xSecretbox(plaintext: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array;
|
|
253
|
-
/** Async
|
|
216
|
+
/** Async XSalsa20-Poly1305 encryption. */
|
|
254
217
|
export declare function xSecretboxAsync(plaintext: Uint8Array, nonce: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
|
|
255
218
|
/** Decrypt with a shared secret key. Returns null if authentication fails. */
|
|
256
219
|
export declare function xSecretboxOpen(ciphertext: Uint8Array, nonce: Uint8Array, key: Uint8Array): null | Uint8Array;
|
|
257
|
-
/** Async
|
|
220
|
+
/** Async XSalsa20-Poly1305 decryption. */
|
|
258
221
|
export declare function xSecretboxOpenAsync(ciphertext: Uint8Array, nonce: Uint8Array, key: Uint8Array): Promise<null | Uint8Array>;
|
|
259
222
|
/** Sign a message with an Ed25519 secret key. Returns signed message (64-byte signature prefix + message). */
|
|
260
223
|
export declare function xSign(message: Uint8Array, secretKey: Uint8Array): Uint8Array;
|
|
261
|
-
/** Async signing
|
|
224
|
+
/** Async Ed25519 signing. */
|
|
262
225
|
export declare function xSignAsync(message: Uint8Array, secretKey: Uint8Array): Promise<Uint8Array>;
|
|
263
226
|
/** Generate a fresh Ed25519 signing key pair. */
|
|
264
227
|
export declare function xSignKeyPair(): KeyPair;
|
|
265
|
-
/** Async keypair generation
|
|
228
|
+
/** Async Ed25519 keypair generation. */
|
|
266
229
|
export declare function xSignKeyPairAsync(): Promise<KeyPair>;
|
|
267
230
|
/** Restore an Ed25519 signing key pair from a 64-byte secret key. */
|
|
268
231
|
export declare function xSignKeyPairFromSecret(secretKey: Uint8Array): KeyPair;
|
|
269
|
-
/** Async restore of signing keypair
|
|
232
|
+
/** Async restore of an Ed25519 signing keypair. */
|
|
270
233
|
export declare function xSignKeyPairFromSecretAsync(secretKey: Uint8Array): Promise<KeyPair>;
|
|
271
234
|
/** Verify and open a signed message. Returns the original message, or null if verification fails. */
|
|
272
235
|
export declare function xSignOpen(signedMessage: Uint8Array, publicKey: Uint8Array): null | Uint8Array;
|
|
273
|
-
/** Async verify/open
|
|
236
|
+
/** Async Ed25519 verify/open. */
|
|
274
237
|
export declare function xSignOpenAsync(signedMessage: Uint8Array, publicKey: Uint8Array): Promise<null | Uint8Array>;
|
|
275
238
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|