@vex-chat/crypto 11.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 +14 -58
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -395
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
- package/src/__tests__/xAsyncApi.extended.test.ts +3 -44
- package/src/__tests__/xAsyncProfile.ts +6 -26
- package/src/index.ts +44 -616
- package/src/__tests__/cryptoProfile.ts +0 -74
- 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.
|
|
@@ -76,16 +51,13 @@ export declare class XUtils {
|
|
|
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
57
|
* Derive a purpose-separated 32-byte key for local at-rest encryption.
|
|
86
|
-
* The result never aliases raw identity-key bytes
|
|
58
|
+
* The result never aliases raw identity-key bytes.
|
|
87
59
|
*/
|
|
88
|
-
static deriveLocalAtRestAesKey(identitySk: Uint8Array
|
|
60
|
+
static deriveLocalAtRestAesKey(identitySk: Uint8Array): Uint8Array;
|
|
89
61
|
/**
|
|
90
62
|
* Returns the empty header (32 0's)
|
|
91
63
|
*
|
|
@@ -111,10 +83,7 @@ export declare class XUtils {
|
|
|
111
83
|
* @returns The encrypted key data as a Uint8Array.
|
|
112
84
|
*/
|
|
113
85
|
static encryptKeyData: (password: string, keyToSave: string, iterationOverride?: number) => Uint8Array;
|
|
114
|
-
/**
|
|
115
|
-
* Async variant of encryptKeyData for cross-runtime/FIPS backends.
|
|
116
|
-
* Format remains [iterations(6)|salt(24)|nonce(24)|ciphertext(N)].
|
|
117
|
-
*/
|
|
86
|
+
/** Async variant of encryptKeyData for cross-runtime callers. */
|
|
118
87
|
static encryptKeyDataAsync: (password: string, keyToSave: string, iterationOverride?: number) => Promise<Uint8Array>;
|
|
119
88
|
/**
|
|
120
89
|
* Returns a six bit Uint8Array representation of an integer.
|
|
@@ -171,7 +140,7 @@ export declare function xMessageKeySubkeys(messageKey: Uint8Array): {
|
|
|
171
140
|
*/
|
|
172
141
|
export declare function xMnemonic(entropy: Uint8Array, wordList?: string[]): string;
|
|
173
142
|
/** Domain-separated payload signed for X3DH signed and one-time prekeys. */
|
|
174
|
-
export declare function xPreKeySignaturePayload(publicKey: Uint8Array, kind: "one-time" | "signed"
|
|
143
|
+
export declare function xPreKeySignaturePayload(publicKey: Uint8Array, kind: "one-time" | "signed"): Uint8Array;
|
|
175
144
|
/**
|
|
176
145
|
* Constants for vex.
|
|
177
146
|
*/
|
|
@@ -196,20 +165,13 @@ export interface XConstants {
|
|
|
196
165
|
KEY_LENGTH: 32 | 57;
|
|
197
166
|
MIN_OTK_SUPPLY: number;
|
|
198
167
|
}
|
|
199
|
-
/**
|
|
200
|
-
* FIPS: `device.signKey` in the database is the P-256 ECDSA public key (SPKI),
|
|
201
|
-
* used for account/device signature verification. X3DH on the client expects
|
|
202
|
-
* the same curve point as Web Crypto "raw" P-256 ECDH public bytes for
|
|
203
|
-
* `importEcdhPublicKey`. This converts SPKI → raw without a private key.
|
|
204
|
-
*/
|
|
205
|
-
export declare function fipsEcdhRawPublicKeyFromEcdsaSpkiAsync(ecdsaSpki: Uint8Array): Promise<Uint8Array>;
|
|
206
168
|
/** Generate a fresh X25519 box key pair. */
|
|
207
169
|
export declare function xBoxKeyPair(): KeyPair;
|
|
208
|
-
/** Async box keypair generation
|
|
170
|
+
/** Async X25519 box keypair generation. */
|
|
209
171
|
export declare function xBoxKeyPairAsync(): Promise<KeyPair>;
|
|
210
172
|
/** Restore an X25519 box key pair from a 32-byte secret key. */
|
|
211
173
|
export declare function xBoxKeyPairFromSecret(secretKey: Uint8Array): KeyPair;
|
|
212
|
-
/** Async box key restore from private key material. */
|
|
174
|
+
/** Async X25519 box key restore from private key material. */
|
|
213
175
|
export declare function xBoxKeyPairFromSecretAsync(secretKey: Uint8Array): Promise<KeyPair>;
|
|
214
176
|
/**
|
|
215
177
|
* Concatanates multiple Uint8Arrays.
|
|
@@ -226,14 +188,8 @@ export declare function xConcat(...arrays: Uint8Array[]): Uint8Array;
|
|
|
226
188
|
* @returns The derived shared secret, SK.
|
|
227
189
|
*/
|
|
228
190
|
export declare function xDH(myPrivateKey: Uint8Array, theirPublicKey: Uint8Array): Uint8Array;
|
|
229
|
-
/** Async DH
|
|
191
|
+
/** Async X25519 DH. */
|
|
230
192
|
export declare function xDHAsync(myPrivateKey: Uint8Array, theirPublicKey: Uint8Array): Promise<Uint8Array>;
|
|
231
|
-
/**
|
|
232
|
-
* In `fips` mode only: derive a P-256 ECDH `KeyPair` (raw public + pkcs8 secret)
|
|
233
|
-
* from a P-256 ECDSA `KeyPair` (spki + pkcs8) using the same private scalar in Web Crypto.
|
|
234
|
-
* In `tweetnacl` mode, use `XKeyConvert.convertKeyPair` to map Ed25519 → X25519 instead.
|
|
235
|
-
*/
|
|
236
|
-
export declare function xEcdhKeyPairFromEcdsaKeyPairAsync(sign: KeyPair): Promise<KeyPair>;
|
|
237
193
|
/**
|
|
238
194
|
* Encode an X25519 or X448 public key PK into a byte sequence.
|
|
239
195
|
* The encoding consists of 0 or 1 to represent the type of curve, followed by l
|
|
@@ -257,26 +213,26 @@ export declare function xMakeNonce(): Uint8Array;
|
|
|
257
213
|
export declare function xRandomBytes(length: number): Uint8Array;
|
|
258
214
|
/** Encrypt with a shared secret key. */
|
|
259
215
|
export declare function xSecretbox(plaintext: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array;
|
|
260
|
-
/** Async
|
|
216
|
+
/** Async XSalsa20-Poly1305 encryption. */
|
|
261
217
|
export declare function xSecretboxAsync(plaintext: Uint8Array, nonce: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
|
|
262
218
|
/** Decrypt with a shared secret key. Returns null if authentication fails. */
|
|
263
219
|
export declare function xSecretboxOpen(ciphertext: Uint8Array, nonce: Uint8Array, key: Uint8Array): null | Uint8Array;
|
|
264
|
-
/** Async
|
|
220
|
+
/** Async XSalsa20-Poly1305 decryption. */
|
|
265
221
|
export declare function xSecretboxOpenAsync(ciphertext: Uint8Array, nonce: Uint8Array, key: Uint8Array): Promise<null | Uint8Array>;
|
|
266
222
|
/** Sign a message with an Ed25519 secret key. Returns signed message (64-byte signature prefix + message). */
|
|
267
223
|
export declare function xSign(message: Uint8Array, secretKey: Uint8Array): Uint8Array;
|
|
268
|
-
/** Async signing
|
|
224
|
+
/** Async Ed25519 signing. */
|
|
269
225
|
export declare function xSignAsync(message: Uint8Array, secretKey: Uint8Array): Promise<Uint8Array>;
|
|
270
226
|
/** Generate a fresh Ed25519 signing key pair. */
|
|
271
227
|
export declare function xSignKeyPair(): KeyPair;
|
|
272
|
-
/** Async keypair generation
|
|
228
|
+
/** Async Ed25519 keypair generation. */
|
|
273
229
|
export declare function xSignKeyPairAsync(): Promise<KeyPair>;
|
|
274
230
|
/** Restore an Ed25519 signing key pair from a 64-byte secret key. */
|
|
275
231
|
export declare function xSignKeyPairFromSecret(secretKey: Uint8Array): KeyPair;
|
|
276
|
-
/** Async restore of signing keypair
|
|
232
|
+
/** Async restore of an Ed25519 signing keypair. */
|
|
277
233
|
export declare function xSignKeyPairFromSecretAsync(secretKey: Uint8Array): Promise<KeyPair>;
|
|
278
234
|
/** Verify and open a signed message. Returns the original message, or null if verification fails. */
|
|
279
235
|
export declare function xSignOpen(signedMessage: Uint8Array, publicKey: Uint8Array): null | Uint8Array;
|
|
280
|
-
/** Async verify/open
|
|
236
|
+
/** Async Ed25519 verify/open. */
|
|
281
237
|
export declare function xSignOpenAsync(signedMessage: Uint8Array, publicKey: Uint8Array): Promise<null | Uint8Array>;
|
|
282
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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"}
|