@bsv/sdk 1.9.30 → 1.9.31
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/dist/cjs/package.json +3 -2
- package/dist/cjs/src/messages/EncryptedMessage.js +19 -0
- package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -1
- package/dist/cjs/src/primitives/AESGCM.js +72 -27
- package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
- package/dist/cjs/src/primitives/PrivateKey.js +27 -0
- package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/messages/EncryptedMessage.js +19 -0
- package/dist/esm/src/messages/EncryptedMessage.js.map +1 -1
- package/dist/esm/src/primitives/AESGCM.js +71 -26
- package/dist/esm/src/primitives/AESGCM.js.map +1 -1
- package/dist/esm/src/primitives/PrivateKey.js +27 -0
- package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/src/messages/EncryptedMessage.d.ts +19 -0
- package/dist/types/src/messages/EncryptedMessage.d.ts.map +1 -1
- package/dist/types/src/primitives/AESGCM.d.ts +18 -0
- package/dist/types/src/primitives/AESGCM.d.ts.map +1 -1
- package/dist/types/src/primitives/PrivateKey.d.ts +27 -0
- package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +3 -3
- package/dist/umd/bundle.js.map +1 -1
- package/docs/reference/messages.md +24 -0
- package/package.json +3 -2
- package/src/messages/EncryptedMessage.ts +19 -0
- package/src/primitives/AESGCM.ts +75 -34
- package/src/primitives/PrivateKey.ts +27 -0
- package/src/primitives/__tests/AESGCM.test.ts +31 -0
|
@@ -8,6 +8,25 @@ import PrivateKey from '../primitives/PrivateKey.js';
|
|
|
8
8
|
*
|
|
9
9
|
* @returns The encrypted message
|
|
10
10
|
*/
|
|
11
|
+
/**
|
|
12
|
+
* SECURITY NOTE – NON-AUTHENTICATED KEY EXCHANGE
|
|
13
|
+
*
|
|
14
|
+
* This encrypted message protocol does NOT implement a formally authenticated
|
|
15
|
+
* key exchange (AKE). Session keys are deterministically derived from long-term
|
|
16
|
+
* identity keys and a sender-chosen invoice value.
|
|
17
|
+
*
|
|
18
|
+
* As a result, this protocol does NOT provide:
|
|
19
|
+
* - Forward secrecy
|
|
20
|
+
* - Replay protection
|
|
21
|
+
* - Explicit authentication of peer identity
|
|
22
|
+
*
|
|
23
|
+
* This scheme SHOULD NOT be used for high-value, long-lived, or sensitive
|
|
24
|
+
* communications. It is intended for lightweight messaging where both parties
|
|
25
|
+
* already possess each other's long-term public keys and accept these risks.
|
|
26
|
+
*
|
|
27
|
+
* Future versions may introduce a protocol upgrade based on a standard AKE
|
|
28
|
+
* (e.g. X3DH, Noise, or SIGMA).
|
|
29
|
+
*/
|
|
11
30
|
export declare const encrypt: (message: number[], sender: PrivateKey, recipient: PublicKey) => number[];
|
|
12
31
|
/**
|
|
13
32
|
* Decrypts a message from one party to another using the BRC-78 message encryption protocol.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EncryptedMessage.d.ts","sourceRoot":"","sources":["../../../../src/messages/EncryptedMessage.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,4BAA4B,CAAA;AAClD,OAAO,UAAU,MAAM,6BAA6B,CAAA;AAOpD;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAClB,SAAS,MAAM,EAAE,EACjB,QAAQ,UAAU,EAClB,WAAW,SAAS,KACnB,MAAM,EAkBR,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,EAAE,EAAE,WAAW,UAAU,KAAG,MAAM,EA0BxE,CAAA"}
|
|
1
|
+
{"version":3,"file":"EncryptedMessage.d.ts","sourceRoot":"","sources":["../../../../src/messages/EncryptedMessage.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,4BAA4B,CAAA;AAClD,OAAO,UAAU,MAAM,6BAA6B,CAAA;AAOpD;;;;;;;GAOG;AACH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GAClB,SAAS,MAAM,EAAE,EACjB,QAAQ,UAAU,EAClB,WAAW,SAAS,KACnB,MAAM,EAkBR,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,EAAE,EAAE,WAAW,UAAU,KAAG,MAAM,EA0BxE,CAAA"}
|
|
@@ -5,6 +5,24 @@ export declare const getBytes64: (numericValue: number) => number[];
|
|
|
5
5
|
type Bytes = Uint8Array;
|
|
6
6
|
export declare const exclusiveOR: (block0: Bytes, block1: Bytes) => Bytes;
|
|
7
7
|
export declare const rightShift: (block: Bytes) => Bytes;
|
|
8
|
+
/**
|
|
9
|
+
* SECURITY NOTE – TIMING SIDE-CHANNEL MITIGATION
|
|
10
|
+
*
|
|
11
|
+
* This GHASH multiplication implementation avoids data-dependent conditional
|
|
12
|
+
* branches by using mask-based operations instead. This reduces timing
|
|
13
|
+
* side-channel leakage compared to a naive implementation that branches on
|
|
14
|
+
* secret bits.
|
|
15
|
+
*
|
|
16
|
+
* IMPORTANT: JavaScript and TypedArray operations do NOT provide constant-time
|
|
17
|
+
* execution guarantees. While this implementation mitigates obvious control-
|
|
18
|
+
* flow timing leaks, it must not be considered constant-time in a strict
|
|
19
|
+
* cryptographic sense and is not suitable for hostile shared-CPU or
|
|
20
|
+
* multi-tenant environments.
|
|
21
|
+
*
|
|
22
|
+
* Applications requiring strict constant-time AES-GCM SHOULD use a dedicated,
|
|
23
|
+
* audited cryptographic library (e.g. noble-ciphers, WebCrypto, or BearSSL
|
|
24
|
+
* bindings).
|
|
25
|
+
*/
|
|
8
26
|
export declare const multiply: (block0: Bytes, block1: Bytes) => Bytes;
|
|
9
27
|
export declare const incrementLeastSignificantThirtyTwoBits: (block: Bytes) => Bytes;
|
|
10
28
|
export declare function ghash(input: Bytes, hashSubKey: Bytes): Bytes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AESGCM.d.ts","sourceRoot":"","sources":["../../../../src/primitives/AESGCM.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AESGCM.d.ts","sourceRoot":"","sources":["../../../../src/primitives/AESGCM.ts"],"names":[],"mappings":"AAoKA,wBAAgB,GAAG,CAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAgD7D;AAED,eAAO,MAAM,QAAQ,GACnB,WAAW,MAAM,EAAE,EACnB,WAAW,MAAM,EACjB,UAAU,MAAM,KACf,CAAC,GAAG,CAEN,CAAA;AAED,eAAO,MAAM,QAAQ,GAAa,cAAc,MAAM,KAAG,MAAM,EAO9D,CAAA;AAED,eAAO,MAAM,UAAU,GAAa,cAAc,MAAM,KAAG,MAAM,EAkBhE,CAAA;AAED,KAAK,KAAK,GAAG,UAAU,CAAA;AA2BvB,eAAO,MAAM,WAAW,GAAa,QAAQ,KAAK,EAAE,QAAQ,KAAK,KAAG,KAOnE,CAAA;AAED,eAAO,MAAM,UAAU,GAAa,OAAO,KAAK,KAAG,KAelD,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,QAAQ,GAAa,QAAQ,KAAK,EAAE,QAAQ,KAAK,KAAG,KAyBhE,CAAA;AAED,eAAO,MAAM,sCAAsC,GACjD,OAAO,KAAK,KACX,KASF,CAAA;AAED,wBAAgB,KAAK,CAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,GAAG,KAAK,CAa7D;AAqED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,MAAM,CACpB,SAAS,EAAE,KAAK,EAChB,oBAAoB,EAAE,KAAK,EAC3B,GAAG,EAAE,KAAK,GACT;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,iBAAiB,EAAE,KAAK,CAAA;CAAE,CAiD7C;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,KAAK,EACjB,oBAAoB,EAAE,KAAK,EAC3B,iBAAiB,EAAE,KAAK,EACxB,GAAG,EAAE,KAAK,GACT,KAAK,GAAG,IAAI,CAoEd"}
|
|
@@ -220,6 +220,33 @@ export default class PrivateKey extends BigNumber {
|
|
|
220
220
|
* const sharedSecret = privateKey.deriveSharedSecret(publicKey);
|
|
221
221
|
*/
|
|
222
222
|
deriveSharedSecret(key: PublicKey): Point;
|
|
223
|
+
/**
|
|
224
|
+
* SECURITY NOTE – DETERMINISTIC CHILD KEY DERIVATION
|
|
225
|
+
*
|
|
226
|
+
* This method derives child private keys deterministically from the caller’s
|
|
227
|
+
* long-term private key, the counterparty’s public key, and a caller-supplied
|
|
228
|
+
* invoice number using HMAC over an ECDH shared secret (BRC-42 style derivation).
|
|
229
|
+
*
|
|
230
|
+
* This construction does NOT implement a formally authenticated key exchange
|
|
231
|
+
* (AKE) and does NOT provide the following security properties:
|
|
232
|
+
*
|
|
233
|
+
* - Forward secrecy: Compromise of a long-term private key compromises all
|
|
234
|
+
* past and future child keys derived from it.
|
|
235
|
+
* - Replay protection: Child keys are deterministic for a given invoice
|
|
236
|
+
* number and key pair; previously observed messages can be replayed.
|
|
237
|
+
* - Explicit authentication / identity binding: Possession of a public key
|
|
238
|
+
* alone does not guarantee the intended peer identity, enabling potential
|
|
239
|
+
* identity misbinding attacks if higher-level identity verification is absent.
|
|
240
|
+
*
|
|
241
|
+
* This derivation is intended for lightweight, deterministic key hierarchies
|
|
242
|
+
* where both parties already possess and trust each other’s long-term public
|
|
243
|
+
* keys. It SHOULD NOT be used as a drop-in replacement for a standard
|
|
244
|
+
* authenticated key exchange (e.g. X3DH, Noise, or SIGMA) in high-security or
|
|
245
|
+
* high-value contexts.
|
|
246
|
+
*
|
|
247
|
+
* Any future protocol providing forward secrecy, replay protection, or strong
|
|
248
|
+
* peer authentication will require a versioned, breaking change.
|
|
249
|
+
*/
|
|
223
250
|
/**
|
|
224
251
|
* Derives a child key with BRC-42.
|
|
225
252
|
* @param publicKey The public key of the other party
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrivateKey.d.ts","sourceRoot":"","sources":["../../../../src/primitives/PrivateKey.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PrivateKey.d.ts","sourceRoot":"","sources":["../../../../src/primitives/PrivateKey.ts"],"names":[],"mappings":"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"}
|