@did-btcr2/keypair 0.10.0 → 0.11.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.
@@ -1,8 +1,9 @@
1
- import { BIP340_PUBLIC_KEY_MULTIBASE_PREFIX, BIP340_PUBLIC_KEY_MULTIBASE_PREFIX_HASH, CURVE, PublicKeyError } from '@did-btcr2/common';
2
- import { sha256 } from '@noble/hashes/sha2';
3
- import { base58btc } from 'multiformats/bases/base58';
4
- import * as tinysecp from 'tiny-secp256k1';
5
- import { Secp256k1SecretKey } from './secret.js';
1
+ import { PublicKeyError } from '@did-btcr2/common';
2
+ /** Fixed public key header bytes per the Data Integrity BIP340 Cryptosuite spec: [0xe7, 0x01] */
3
+ export const BIP340_PUBLIC_KEY_MULTIBASE_PREFIX = new Uint8Array([0xe7, 0x01]);
4
+ import { secp256k1, schnorr } from '@noble/curves/secp256k1.js';
5
+ import { timingSafeEqual } from 'crypto';
6
+ import { base58 } from '@scure/base';
6
7
  /**
7
8
  * Encapsulates a secp256k1 public key compliant to BIP-340 BIP schnorr signature scheme.
8
9
  * Provides get methods for different formats (compressed, x-only, multibase).
@@ -38,11 +39,11 @@ export class CompressedSecp256k1PublicKey {
38
39
  throw new PublicKeyError('Invalid argument: byte length must be 33 (compressed)', 'CONSTRUCTOR_ERROR', { keyBytes });
39
40
  }
40
41
  // Validate the point is on curve and in compressed form
41
- if (!tinysecp.isPoint(keyBytes)) {
42
+ if (!secp256k1.utils.isValidPublicKey(keyBytes)) {
42
43
  throw new PublicKeyError('Invalid argument: not a valid secp256k1 compressed point', 'CONSTRUCTOR_ERROR', { keyBytes });
43
44
  }
44
- // Set the bytes
45
- this.#bytes = keyBytes;
45
+ // Defensive copy — caller cannot mutate internal state
46
+ this.#bytes = new Uint8Array(keyBytes);
46
47
  // Set multibase
47
48
  this.#multibase.encoded = this.encode();
48
49
  this.#multibase.key = [...this.#multibase.prefix, ...this.compressed];
@@ -61,8 +62,7 @@ export class CompressedSecp256k1PublicKey {
61
62
  * @returns {Uint8Array} The 65-byte uncompressed public key (0x04, x, y).
62
63
  */
63
64
  get uncompressed() {
64
- const uncompressed = this.liftX();
65
- return uncompressed;
65
+ return secp256k1.Point.fromBytes(this.compressed).toBytes(false);
66
66
  }
67
67
  /**
68
68
  * X-only (32-byte) view of the public key per BIP-340.
@@ -111,8 +111,11 @@ export class CompressedSecp256k1PublicKey {
111
111
  * @returns {MultibaseObject} An object containing the multibase bytes, address and prefix.
112
112
  */
113
113
  get multibase() {
114
- const multibase = this.#multibase;
115
- return multibase;
114
+ return {
115
+ prefix: new Uint8Array(this.#multibase.prefix),
116
+ key: [...this.#multibase.key],
117
+ encoded: this.#multibase.encoded
118
+ };
116
119
  }
117
120
  /**
118
121
  * Returns the raw public key as a hex string.
@@ -144,40 +147,17 @@ export class CompressedSecp256k1PublicKey {
144
147
  * @returns {KeyBytes} The decoded public key: prefix and public key bytes
145
148
  */
146
149
  decode() {
147
- // Decode the public key multibase string
148
- const decoded = base58btc.decode(this.multibase.encoded);
149
- // If the public key bytes are not 35 bytes, throw an error
150
- if (decoded.length !== 35) {
151
- throw new PublicKeyError('Invalid argument: must be 35 byte publicKeyMultibase', 'DECODE_MULTIBASE_ERROR');
152
- }
153
- // Grab the prefix bytes
154
- const prefix = decoded.slice(0, 2);
155
- // Compute the prefix hash
156
- const prefixHash = Buffer.from(sha256(prefix)).toString('hex');
157
- // If the prefix hash does not equal the BIP340 prefix hash, throw an error
158
- if (prefixHash !== BIP340_PUBLIC_KEY_MULTIBASE_PREFIX_HASH) {
159
- throw new PublicKeyError(`Invalid prefix: malformed multibase prefix ${prefix}`, 'DECODE_MULTIBASE_ERROR');
160
- }
161
- // Return the decoded public key bytes
162
- return decoded;
150
+ return base58.decode(this.multibase.encoded.slice(1));
163
151
  }
164
152
  /**
165
153
  * Encodes compressed secp256k1 public key from bytes to BIP340 multibase format.
166
154
  * @returns {string} The public key encoded in base-58-btc multibase format.
167
155
  */
168
156
  encode() {
169
- // Convert public key bytes to an array
170
157
  const pk = Array.from(this.compressed);
171
- // Ensure the public key is 33-byte secp256k1 compressed public key
172
- if (pk.length !== 33) {
173
- throw new PublicKeyError('Invalid argument: must be 33-byte (compressed) public key', 'ENCODE_MULTIBASE_ERROR');
174
- }
175
- // Convert prefix to an array
176
158
  const publicKeyMultibase = Array.from(BIP340_PUBLIC_KEY_MULTIBASE_PREFIX);
177
- // Push the public key bytes at the end of the prefix
178
159
  publicKeyMultibase.push(...pk);
179
- // Encode the bytes in base58btc format and return
180
- return base58btc.encode(Uint8Array.from(publicKeyMultibase));
160
+ return 'z' + base58.encode(Uint8Array.from(publicKeyMultibase));
181
161
  }
182
162
  /**
183
163
  * Verify a signature using schnorr or ecdsa.
@@ -190,24 +170,22 @@ export class CompressedSecp256k1PublicKey {
190
170
  verify(signature, data, opts) {
191
171
  // Default to schnorr scheme
192
172
  opts ??= { scheme: 'schnorr' };
193
- // If scheme is ecdsa, verify using ecdsa
194
173
  if (opts.scheme === 'ecdsa') {
195
- return tinysecp.verify(data, this.compressed, signature);
174
+ return secp256k1.verify(signature, data, this.compressed);
196
175
  }
197
- // If scheme is schnorr, verify using schnorr
198
176
  else if (opts.scheme === 'schnorr') {
199
- return tinysecp.verifySchnorr(data, this.x, signature);
177
+ return schnorr.verify(signature, data, this.x);
200
178
  }
201
179
  // If scheme is neither ecdsa nor schnorr, throw an error
202
180
  throw new PublicKeyError(`Invalid scheme: ${opts.scheme}.`, 'VERIFY_SIGNATURE_ERROR', opts);
203
181
  }
204
182
  /**
205
183
  * Compares this public key to another public key.
206
- * @param {CompressedSecp256k1PublicKey} other The other public key to compare
184
+ * @param {PublicKey} other The other public key to compare
207
185
  * @returns {boolean} True if the public keys are equal, false otherwise.
208
186
  */
209
187
  equals(other) {
210
- return this.hex === other.hex;
188
+ return timingSafeEqual(this.compressed, other.compressed);
211
189
  }
212
190
  /**
213
191
  * JSON representation of a CompressedSecp256k1PublicKey object.
@@ -224,61 +202,6 @@ export class CompressedSecp256k1PublicKey {
224
202
  },
225
203
  };
226
204
  }
227
- /**
228
- * Computes modular exponentiation: (base^exp) % mod.
229
- * Used for computing modular square roots.
230
- * @param {bigint} base The base value
231
- * @param {bigint} exp The exponent value
232
- * @param {bigint} mod The modulus value
233
- * @returns {bigint} The result of the modular exponentiation
234
- */
235
- modPow(base, exp, mod) {
236
- let result = 1n;
237
- while (exp > 0n) {
238
- if (exp & 1n)
239
- result = (result * base) % mod;
240
- base = (base * base) % mod;
241
- exp >>= 1n;
242
- }
243
- return result;
244
- }
245
- ;
246
- /**
247
- * Computes `sqrt(a) mod p` using Tonelli-Shanks algorithm.
248
- * This finds `y` such that `y^2 ≡ a mod p`.
249
- * @param {bigint} a The value to find the square root of
250
- * @param {bigint} p The prime modulus
251
- * @returns {bigint} The square root of `a` mod `p`
252
- */
253
- sqrtMod(a, p) {
254
- return this.modPow(a, (p + 1n) >> 2n, p);
255
- }
256
- ;
257
- /**
258
- * Lifts a 32-byte x-only coordinate into a full secp256k1 point (x, y).
259
- * @param xBytes 32-byte x-coordinate
260
- * @returns {Uint8Array} 65-byte uncompressed public key (starts with `0x04`)
261
- */
262
- liftX() {
263
- // Ensure x-coordinate is 32 bytes
264
- if (this.x.length !== 32) {
265
- throw new PublicKeyError('Invalid argument: x-coordinate length must be 32 bytes', 'LIFT_X_ERROR');
266
- }
267
- // Convert x from Uint8Array → BigInt
268
- const x = BigInt('0x' + Buffer.from(this.x).toString('hex'));
269
- if (x <= 0n || x >= CURVE.p) {
270
- throw new PublicKeyError('Invalid conversion: x out of range as BigInt', 'LIFT_X_ERROR');
271
- }
272
- // Compute y² = x³ + 7 mod p
273
- const ySquared = BigInt((x ** 3n + CURVE.b) % CURVE.p);
274
- // Compute y (do not enforce parity)
275
- const y = this.sqrtMod(ySquared, CURVE.p);
276
- // Convert x and y to Uint8Array
277
- const yBytes = Buffer.from(y.toString(16).padStart(64, '0'), 'hex');
278
- // Return 65-byte uncompressed public key: `0x04 || x || y`
279
- return new Uint8Array(Buffer.concat([Buffer.from([0x04]), Buffer.from(this.x), yBytes]));
280
- }
281
- ;
282
205
  /**
283
206
  * Static method to validate a public key.
284
207
  * @param {Hex} pk The public key in hex (Uint8Array or string) format.
@@ -293,53 +216,13 @@ export class CompressedSecp256k1PublicKey {
293
216
  return false;
294
217
  }
295
218
  }
296
- /**
297
- * Returns the point of the public key.
298
- * @param {Hex} pk The public key in hex (Uint8Array or string) format.
299
- * @returns {Point} The point of the public key.
300
- * @throws {PublicKeyError} If the public key is not a valid hex string or byte array.
301
- */
302
- static point(pk) {
303
- // If the public key is a hex string, convert it to a CompressedSecp256k1PublicKey object and return the point
304
- if (typeof pk === 'string' && /^[0-9a-fA-F]+$/.test(pk)) {
305
- const publicKey = new CompressedSecp256k1PublicKey(Buffer.from(pk, 'hex'));
306
- return publicKey.point;
307
- }
308
- // If the public key is a byte array or ArrayBuffer, convert it to a CompressedSecp256k1PublicKey object and return the point
309
- if (pk instanceof Uint8Array || ArrayBuffer.isView(pk)) {
310
- const publicKey = new CompressedSecp256k1PublicKey(pk);
311
- return publicKey.point;
312
- }
313
- // If the public key is neither a hex string nor a byte array, throw an error
314
- throw new PublicKeyError('Invalid publicKey: must be a hex string or byte array', 'POINT_ERROR', { publicKey: pk });
315
- }
316
219
  /**
317
220
  * Creates a CompressedSecp256k1PublicKey object from a JSON representation.
318
221
  * @param {PublicKeyObject} json The JSON object to initialize the CompressedSecp256k1PublicKey.
319
222
  * @returns {CompressedSecp256k1PublicKey} The initialized CompressedSecp256k1PublicKey object.
320
223
  */
321
224
  static fromJSON(json) {
322
- json.point.x.unshift(json.point.parity);
323
- return new CompressedSecp256k1PublicKey(Uint8Array.from(json.point.x));
324
- }
325
- /**
326
- * Computes the deterministic public key for a given secret key.
327
- * @param {Secp256k1SecretKey | KeyBytes} sk The Secp256k1SecretKey object or the secret key bytes
328
- * @returns {CompressedSecp256k1PublicKey} A new CompressedSecp256k1PublicKey object
329
- */
330
- static fromSecretKey(sk) {
331
- // If the secret key is a Secp256k1SecretKey object, get the raw bytes else use the bytes
332
- const bytes = sk instanceof Secp256k1SecretKey ? sk.bytes : sk;
333
- // Throw error if the secret key is not 32 bytes
334
- if (bytes.length !== 32) {
335
- throw new PublicKeyError('Invalid arg: must be 32 byte secret key', 'FROM_SECRET_KEY_ERROR');
336
- }
337
- // Compute the public key from the secret key
338
- const secret = sk instanceof Secp256k1SecretKey
339
- ? sk
340
- : new Secp256k1SecretKey(sk);
341
- // Return a new CompressedSecp256k1PublicKey object
342
- return secret.computePublicKey();
225
+ return new CompressedSecp256k1PublicKey(Uint8Array.from([json.point.parity, ...json.point.x]));
343
226
  }
344
227
  }
345
228
  //# sourceMappingURL=public.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/public.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/public.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,14 @@
1
- import { BIP340_SECRET_KEY_MULTIBASE_PREFIX, BIP340_SECRET_KEY_MULTIBASE_PREFIX_HASH, CURVE, SecretKeyError } from '@did-btcr2/common';
1
+ import { SecretKeyError } from '@did-btcr2/common';
2
2
  import { sha256 } from '@noble/hashes/sha2';
3
- import { getRandomValues, randomBytes } from 'crypto';
4
- import { base58btc } from 'multiformats/bases/base58';
5
- import * as tinysecp from 'tiny-secp256k1';
6
- import { SchnorrKeyPair } from './pair.js';
3
+ import { bytesToHex } from '@noble/hashes/utils';
4
+ import { secp256k1, schnorr } from '@noble/curves/secp256k1.js';
5
+ import { getRandomValues, timingSafeEqual } from 'crypto';
6
+ import { base58 } from '@scure/base';
7
7
  import { CompressedSecp256k1PublicKey } from './public.js';
8
+ /** Fixed secret key header bytes per the Data Integrity BIP340 Cryptosuite spec: [0x81, 0x26] */
9
+ const BIP340_SECRET_KEY_MULTIBASE_PREFIX = new Uint8Array([0x81, 0x26]);
10
+ /** Hash of the BIP-340 Multikey secret key prefix */
11
+ const BIP340_SECRET_KEY_MULTIBASE_PREFIX_HASH = bytesToHex(sha256(BIP340_SECRET_KEY_MULTIBASE_PREFIX));
8
12
  /**
9
13
  * Encapsulates a secp256k1 secret key
10
14
  * Provides get methods for different formats (raw, secret, point).
@@ -32,25 +36,35 @@ export class Secp256k1SecretKey {
32
36
  if (!isBytes && !isSecret) {
33
37
  throw new SecretKeyError('Invalid entropy: must be a valid byte array (32) or bigint', 'CONSTRUCTOR_ERROR');
34
38
  }
35
- // If bytes and bytes are not length 32
39
+ // If bytes and length is 32, defensive-copy and derive seed
36
40
  if (isBytes && entropy.length === 32) {
37
- this.#bytes = entropy;
38
- this.#seed = Secp256k1SecretKey.toSecret(entropy);
41
+ this.#bytes = new Uint8Array(entropy);
42
+ this.#seed = Secp256k1SecretKey.toSecret(this.#bytes);
39
43
  }
40
- // If secret and secret is not a valid bigint, throw error
41
- if (isSecret && !(entropy < 1n || entropy >= CURVE.n)) {
44
+ // If bigint in valid range [1, n), convert to bytes
45
+ if (isSecret && entropy >= 1n && entropy < secp256k1.Point.Fn.ORDER) {
42
46
  this.#bytes = Secp256k1SecretKey.toBytes(entropy);
43
47
  this.#seed = entropy;
44
48
  }
45
49
  if (!this.#bytes || this.#bytes.length !== 32) {
46
50
  throw new SecretKeyError('Invalid bytes: must be a valid 32-byte secret key', 'CONSTRUCTOR_ERROR');
47
51
  }
48
- if (!this.#seed || (this.#seed < 1n || this.#seed >= CURVE.n)) {
49
- throw new SecretKeyError('Invalid seed: must must be valid bigint', 'CONSTRUCTOR_ERROR');
52
+ if (!this.#seed || this.#seed < 1n || this.#seed >= secp256k1.Point.Fn.ORDER) {
53
+ throw new SecretKeyError('Invalid seed: must be valid bigint', 'CONSTRUCTOR_ERROR');
50
54
  }
51
55
  // Set the secret key multibase
52
56
  this.#multibase = this.encode();
53
57
  }
58
+ /**
59
+ * Zeros out secret key material from memory.
60
+ * The instance should not be used after calling this method.
61
+ */
62
+ destroy() {
63
+ if (this.#bytes)
64
+ this.#bytes.fill(0);
65
+ this.#seed = undefined;
66
+ this.#multibase = '';
67
+ }
54
68
  /**
55
69
  * Get the secret key entropy as a byte array.
56
70
  * @returns {KeyBytes} The secret key bytes as a Uint8Array
@@ -90,75 +104,71 @@ export class Secp256k1SecretKey {
90
104
  * @returns {string} The secret key in BIP340 multibase format.
91
105
  */
92
106
  encode() {
93
- // Convert Uint8Array bytes to an Array
94
107
  const secretKeyBytes = Array.from(this.bytes);
95
- if (secretKeyBytes.length !== 32) {
96
- throw new SecretKeyError('Invalid secret key: must be a valid 32-byte secret key', 'ENCODE_MULTIBASE_ERROR');
97
- }
98
- // Convert prefix to an array
99
108
  const mbaseBytes = Array.from(BIP340_SECRET_KEY_MULTIBASE_PREFIX);
100
- // Push the secret key bytes at the end of the prefix
101
109
  mbaseBytes.push(...secretKeyBytes);
102
- // Encode the bytes in base58btc format and return
103
- return base58btc.encode(Uint8Array.from(mbaseBytes));
110
+ return 'z' + base58.encode(Uint8Array.from(mbaseBytes));
104
111
  }
105
112
  /**
106
113
  * Checks if this secret key is equal to another.
107
- * @param {Secp256k1SecretKey} other The other secret key
114
+ * @param {SecretKey} other The other secret key
108
115
  * @returns {boolean} True if the private keys are equal, false otherwise
109
116
  */
110
117
  equals(other) {
111
- // Compare the hex strings of the private keys
112
- return this.hex === other.hex;
118
+ return timingSafeEqual(this.bytes, other.bytes);
113
119
  }
114
120
  /**
115
121
  * Computes the public key from the secret key bytes.
116
122
  * @returns {CompressedSecp256k1PublicKey} The computed public key
117
123
  */
118
124
  computePublicKey() {
119
- // Derive the public key from the secret key
120
- const publicKeyBytes = tinysecp.pointFromScalar(this.bytes, true);
121
- // If no public key, throw error
122
- if (!publicKeyBytes) {
123
- throw new SecretKeyError('Invalid compute: failed to derive public key', 'COMPUTE_PUBLIC_KEY_ERROR');
124
- }
125
- // If public key is not compressed, throw error
126
- if (publicKeyBytes.length !== 33) {
127
- throw new SecretKeyError('Invalid compute: public key not compressed format', 'COMPUTE_PUBLIC_KEY_ERROR');
128
- }
129
- return new CompressedSecp256k1PublicKey(publicKeyBytes);
125
+ return new CompressedSecp256k1PublicKey(secp256k1.getPublicKey(this.bytes));
130
126
  }
131
127
  /**
132
- * Converts the secret key to a JSON object.
133
- * @returns {SecretKeyObject} The secret key as a JSON object
128
+ * Safe JSON representation. Does not expose secret material.
129
+ * Called implicitly by JSON.stringify(). Use exportJSON() for full serialization.
134
130
  */
135
131
  toJSON() {
132
+ return { type: 'Secp256k1SecretKey' };
133
+ }
134
+ /**
135
+ * Exports the secret key as a JSON object. Contains sensitive material.
136
+ * @returns {SecretKeyObject} The secret key as a JSON object
137
+ */
138
+ exportJSON() {
136
139
  return {
137
140
  bytes: Array.from(this.bytes),
138
141
  seed: this.seed.toString(),
139
142
  hex: this.hex,
140
143
  };
141
144
  }
145
+ /** @override Prevents secret material from appearing in console.log */
146
+ toString() {
147
+ return '[Secp256k1SecretKey]';
148
+ }
149
+ /** @override Prevents secret material from appearing in Node.js inspect */
150
+ [Symbol.for('nodejs.util.inspect.custom')]() {
151
+ return '[Secp256k1SecretKey]';
152
+ }
142
153
  /**
143
154
  * Checks if the secret key is valid.
144
155
  * @returns {boolean} True if the secret key is valid, false otherwise
145
156
  */
146
157
  isValid() {
147
- return tinysecp.isPrivate(this.bytes);
158
+ return secp256k1.utils.isValidSecretKey(this.bytes);
148
159
  }
149
160
  /**
150
161
  * Checks if the public key is a valid secp256k1 point.
151
162
  * @returns {boolean} True if the public key is valid, false otherwise
152
163
  */
153
164
  hasValidPublicKey() {
154
- // Compute the public key from the secret key and compress it
155
- const pk = this.computePublicKey();
156
- // If the public key is not valid, return false
157
- if (!tinysecp.isPoint(pk.compressed)) {
165
+ try {
166
+ this.computePublicKey();
167
+ return true;
168
+ }
169
+ catch {
158
170
  return false;
159
171
  }
160
- // Return true if the computed public key equals the provided public key
161
- return true;
162
172
  }
163
173
  /**
164
174
  * Produce a signature over arbitrary data using schnorr or ecdsa.
@@ -171,13 +181,11 @@ export class Secp256k1SecretKey {
171
181
  sign(data, opts) {
172
182
  // Set default options if not provided
173
183
  opts ??= { scheme: 'schnorr' };
174
- // Sign ecdsa and return
175
184
  if (opts.scheme === 'ecdsa') {
176
- return tinysecp.sign(data, this.bytes);
185
+ return secp256k1.sign(data, this.bytes);
177
186
  }
178
- // Sign schnorr and return
179
187
  if (opts.scheme === 'schnorr') {
180
- return tinysecp.signSchnorr(data, this.bytes, randomBytes(32));
188
+ return schnorr.sign(data, this.bytes);
181
189
  }
182
190
  throw new SecretKeyError(`Invalid scheme: ${opts.scheme}.`, 'SIGN_ERROR', opts);
183
191
  }
@@ -188,7 +196,7 @@ export class Secp256k1SecretKey {
188
196
  */
189
197
  static decode(multibase) {
190
198
  // Decode the public key multibase string
191
- const decoded = base58btc.decode(multibase);
199
+ const decoded = base58.decode(multibase.slice(1));
192
200
  // If the public key bytes are not 35 bytes, throw an error
193
201
  if (decoded.length !== 34) {
194
202
  throw new SecretKeyError('Invalid argument: must be 34 byte secretKeyMultibase', 'DECODE_MULTIBASE_ERROR');
@@ -212,20 +220,6 @@ export class Secp256k1SecretKey {
212
220
  static fromJSON(json) {
213
221
  return new Secp256k1SecretKey(new Uint8Array(json.bytes));
214
222
  }
215
- /**
216
- * Converts a Secp256k1SecretKey or KeyBytes to a SchnorrKeyPair.
217
- * @param {KeyBytes} bytes The secret key bytes
218
- * @returns {SchnorrKeyPair} The SchnorrKeyPair object containing the public and private keys
219
- * @throws {SecretKeyError} If the secret key is not valid
220
- */
221
- static toKeyPair(bytes) {
222
- // Create a new Secp256k1SecretKey from the bytes
223
- const secretKey = new Secp256k1SecretKey(bytes);
224
- // Compute the public key from the secret key
225
- const publicKey = secretKey.computePublicKey();
226
- // Create a new Pair from the public key and secret key
227
- return new SchnorrKeyPair({ publicKey, secretKey });
228
- }
229
223
  /**
230
224
  * Convert a bigint secret to secret key bytes.
231
225
  * @param {KeyBytes} bytes The secret key bytes
@@ -243,42 +237,30 @@ export class Secp256k1SecretKey {
243
237
  // Ensure it’s a valid 32-byte value in [1, n-1] and convert bigint to Uint8Array
244
238
  const bytes = Uint8Array.from({ length: 32 }, (_, i) => Number(secret >> BigInt(8 * (31 - i)) & BigInt(0xff)));
245
239
  // If bytes are not a valid secp256k1 secret key, throw error
246
- if (!tinysecp.isPrivate(bytes)) {
240
+ if (!secp256k1.utils.isValidSecretKey(bytes)) {
247
241
  throw new SecretKeyError('Invalid secret key: secret out of valid range', 'SET_PRIVATE_KEY_ERROR');
248
242
  }
249
243
  return new Uint8Array(bytes);
250
244
  }
251
- /**
252
- * Creates a new Secp256k1SecretKey object from random bytes.
253
- * @param {KeyBytes} bytes The secret key bytes
254
- * @returns {Secp256k1SecretKey} A new Secp256k1SecretKey object
255
- */
256
- static fromBytes(bytes) {
257
- // Return a new Secp256k1SecretKey object
258
- return new Secp256k1SecretKey(bytes);
259
- }
260
245
  /**
261
246
  * Creates a new Secp256k1SecretKey object from a bigint secret.
262
247
  * @param {bigint} bint The secret bigint
263
248
  * @returns {Secp256k1SecretKey} A new Secp256k1SecretKey object
264
249
  */
265
250
  static fromBigInt(bint) {
266
- // Convert the secret bigint to a hex string
267
- const hexsecret = bint.toString(16).padStart(64, '0');
268
- // Convert the hex string to a Uint8Array
269
- const bytes = new Uint8Array(hexsecret.match(/.{2}/g).map(byte => parseInt(byte, 16)));
270
- // Return a new Secp256k1SecretKey object
271
- return new Secp256k1SecretKey(bytes);
251
+ return new Secp256k1SecretKey(Secp256k1SecretKey.toBytes(bint));
272
252
  }
273
253
  /**
274
254
  * Generates random secret key bytes.
275
255
  * @returns {KeyBytes} Uint8Array of 32 random bytes.
276
256
  */
277
257
  static random() {
278
- // Generate empty 32-byte array
279
258
  const byteArray = new Uint8Array(32);
280
- // Use the getRandomValues function to fill the byteArray with random values
281
- return getRandomValues(byteArray);
259
+ // Retry until bytes fall in valid scalar range [1, n)
260
+ do {
261
+ getRandomValues(byteArray);
262
+ } while (!secp256k1.utils.isValidSecretKey(byteArray));
263
+ return byteArray;
282
264
  }
283
265
  /**
284
266
  * Creates a new Secp256k1SecretKey from random secret key bytes.
@@ -1 +1 @@
1
- {"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/secret.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/secret.ts"],"names":[],"mappings":"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"}
@@ -2,3 +2,4 @@ export * from './pair.js';
2
2
  export * from './secret.js';
3
3
  export * from './public.js';
4
4
  export * from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import { Hex, HexString, KeyBytes, SchnorrKeyPairObject } from '@did-btcr2/common';
1
+ import { Hex, HexString, KeyBytes, PublicKeyObject, SchnorrKeyPairObject } from '@did-btcr2/common';
2
2
  import { CompressedSecp256k1PublicKey, PublicKey } from './public.js';
3
3
  import { Secp256k1SecretKey, SecretKey } from './secret.js';
4
4
  import { HexSchnorrKeyPair, MultibaseKeys, RawSchnorrKeyPair, SchnorrKeyPairParams } from './types.js';
@@ -51,6 +51,11 @@ export declare class SchnorrKeyPair implements KeyPair {
51
51
  * @returns {CompressedSecp256k1PublicKey} The CompressedSecp256k1PublicKey object
52
52
  */
53
53
  get publicKey(): CompressedSecp256k1PublicKey;
54
+ /**
55
+ * Whether this key pair contains a secret key.
56
+ * @returns {boolean} True if the secret key is present.
57
+ */
58
+ get hasSecretKey(): boolean;
54
59
  /**
55
60
  * Get the `raw` bytes of each key in the SchnorrKeyPair.
56
61
  * @returns {RawSchnorrKeyPair} JSON object with the SchnorrKeyPair raw bytes.
@@ -67,10 +72,19 @@ export declare class SchnorrKeyPair implements KeyPair {
67
72
  */
68
73
  get multibase(): MultibaseKeys;
69
74
  /**
70
- * JSON representation of a Keys.
71
- * @returns {SchnorrKeyPairObject} The Keys as a JSON object
75
+ * Safe JSON representation. Only includes the public key.
76
+ * Called implicitly by JSON.stringify(). Use exportJSON() for full serialization.
77
+ * @returns {{ publicKey: PublicKeyObject }} The JSON representation of the public key
78
+ */
79
+ toJSON(): {
80
+ publicKey: PublicKeyObject;
81
+ };
82
+ /**
83
+ * Exports the full key pair as a JSON object. Contains sensitive material.
84
+ * @returns {SchnorrKeyPairObject} The key pair as a JSON object
85
+ * @throws {KeyPairError} If the secret key is not available
72
86
  */
73
- toJSON(): SchnorrKeyPairObject;
87
+ exportJSON(): SchnorrKeyPairObject;
74
88
  /**
75
89
  * Static method creates a new Keys from a JSON object.
76
90
  * @param {SchnorrKeyPairObject} keys The JSON object to initialize the Keys.
@@ -108,3 +122,4 @@ export declare class SchnorrKeyPair implements KeyPair {
108
122
  */
109
123
  static generate(): SchnorrKeyPair;
110
124
  }
125
+ //# sourceMappingURL=pair.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,SAAS,EACT,QAAQ,EAER,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvG;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,OAAO;;IAqB5C;;;;;;;;OAQG;gBACS,MAAM,GAAE,oBAAyB;IA0B7C;;;;OAIG;IACH,IAAI,SAAS,IAAI,kBAAkB,CAYlC;IAED;;;;OAIG;IACH,IAAI,SAAS,CAAC,SAAS,EAAE,4BAA4B,EAapD;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,4BAA4B,CAG5C;IAED;;;OAGG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAK3B;IAED;;;OAGG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAK3B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,aAAa,CAK7B;IAED;;;OAGG;IACH,MAAM,IAAI,oBAAoB;IAO9B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,cAAc;IAO3D;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,cAAc;IAsB7D;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAM/C;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG;IAIrC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO;IAqBnE;;;OAGG;IACH,MAAM,CAAC,QAAQ,IAAI,cAAc;CAalC"}
1
+ {"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,SAAS,EACT,QAAQ,EAER,eAAe,EACf,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvG;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,OAAO;;IAI5C;;;;;;;;OAQG;gBACS,MAAM,GAAE,oBAAyB;IA+B7C;;;;OAIG;IACH,IAAI,SAAS,IAAI,kBAAkB,CAYlC;IAED;;;;OAIG;IACH,IAAI,SAAS,CAAC,SAAS,EAAE,4BAA4B,EAQpD;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,4BAA4B,CAE5C;IAED;;;OAGG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;;OAGG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAK3B;IAED;;;OAGG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAK3B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,aAAa,CAK7B;IAED;;;;OAIG;IACH,MAAM,IAAI;QAAE,SAAS,EAAE,eAAe,CAAA;KAAE;IAIxC;;;;OAIG;IACH,UAAU,IAAI,oBAAoB;IAkBlC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,cAAc;IAO3D;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,cAAc;IAsB7D;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAM/C;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG;IAIrC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO;IAInE;;;OAGG;IACH,MAAM,CAAC,QAAQ,IAAI,cAAc;CAalC"}