@smartledger/bsv 3.2.1 → 3.3.2

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +147 -0
  2. package/README.md +289 -55
  3. package/architecture_demo.js +247 -0
  4. package/bsv-covenant.min.js +10 -0
  5. package/bsv-gdaf.min.js +37 -0
  6. package/bsv-ltp.min.js +37 -0
  7. package/bsv-script-helper.min.js +10 -0
  8. package/bsv-security.min.js +31 -0
  9. package/bsv-shamir.min.js +12 -0
  10. package/bsv-smartcontract.min.js +37 -0
  11. package/bsv.bundle.js +9 -9
  12. package/bsv.min.js +3 -3
  13. package/build/bsv-covenant.min.js +10 -0
  14. package/build/bsv-script-helper.min.js +10 -0
  15. package/build/bsv-security.min.js +31 -0
  16. package/build/bsv-smartcontract.min.js +39 -0
  17. package/build/bsv.bundle.js +39 -0
  18. package/build/bsv.min.js +39 -0
  19. package/build/webpack.bundle.config.js +22 -0
  20. package/build/webpack.config.js +18 -0
  21. package/build/webpack.covenant.config.js +27 -0
  22. package/build/webpack.gdaf.config.js +54 -0
  23. package/build/webpack.ltp.config.js +17 -0
  24. package/build/webpack.script-helper.config.js +27 -0
  25. package/build/webpack.security.config.js +23 -0
  26. package/build/webpack.smartcontract.config.js +25 -0
  27. package/build/webpack.subproject.config.js +6 -0
  28. package/bundle-entry.js +341 -0
  29. package/complete_ltp_demo.js +511 -0
  30. package/covenant-entry.js +44 -0
  31. package/docs/pushtx-key-insights.md +106 -0
  32. package/gdaf-entry.js +54 -0
  33. package/index.js +272 -5
  34. package/lib/crypto/shamir.js +360 -0
  35. package/lib/gdaf/attestation-signer.js +461 -0
  36. package/lib/gdaf/attestation-verifier.js +600 -0
  37. package/lib/gdaf/did-resolver.js +382 -0
  38. package/lib/gdaf/index.js +471 -0
  39. package/lib/gdaf/schema-validator.js +682 -0
  40. package/lib/gdaf/smartledger-anchor.js +486 -0
  41. package/lib/gdaf/zk-prover.js +507 -0
  42. package/lib/ltp/anchor.js +438 -0
  43. package/lib/ltp/claim.js +1026 -0
  44. package/lib/ltp/index.js +470 -0
  45. package/lib/ltp/obligation.js +945 -0
  46. package/lib/ltp/proof.js +828 -0
  47. package/lib/ltp/registry.js +702 -0
  48. package/lib/ltp/right.js +765 -0
  49. package/lib/smart_contract/API_REFERENCE.md +1 -1
  50. package/lib/smart_contract/EXAMPLES.md +2 -2
  51. package/lib/smart_contract/QUICK_START.md +2 -2
  52. package/lib/smart_contract/README.md +1 -1
  53. package/lib/smart_contract/index.js +4 -0
  54. package/ltp-entry.js +92 -0
  55. package/package.json +91 -20
  56. package/script-helper-entry.js +49 -0
  57. package/security-entry.js +70 -0
  58. package/shamir-entry.js +173 -0
  59. package/shamir_demo.js +121 -0
  60. package/simple_demo.js +204 -0
  61. package/smartcontract-entry.js +133 -0
  62. package/test_shamir.js +221 -0
  63. package/test_standalone_shamir.html +83 -0
  64. package/tests/bundle-completeness-test.html +131 -0
  65. package/tests/bundle-demo.html +476 -0
  66. package/tests/smartcontract-test.html +239 -0
  67. package/tests/standalone-modules-test.html +260 -0
  68. package/tests/test.html +612 -0
  69. package/tests/unpkg-demo.html +194 -0
  70. package/docs/nchain.md +0 -958
@@ -0,0 +1,360 @@
1
+ 'use strict'
2
+
3
+ var BN = require('./bn')
4
+ var Random = require('./random')
5
+ var Hash = require('./hash')
6
+ var _ = require('../util/_')
7
+
8
+ /**
9
+ * Shamir Secret Sharing implementation for secure secret distribution
10
+ * Based on Shamir's Secret Sharing algorithm using finite field arithmetic
11
+ *
12
+ * Features:
13
+ * - Split secrets into N shares with K threshold
14
+ * - Reconstruct secret from any K shares
15
+ * - Cryptographically secure random polynomial generation
16
+ * - Support for arbitrary secret sizes via byte-level processing
17
+ * - Compatible with BSV cryptographic primitives
18
+ */
19
+
20
+ /**
21
+ * Prime number for finite field operations
22
+ * Using a large prime that's suitable for byte operations (2^31 - 1)
23
+ */
24
+ var PRIME = new BN(2147483647) // Mersenne prime 2^31 - 1
25
+
26
+ /**
27
+ * Shamir Secret Sharing constructor
28
+ * @param {Object} options - Configuration options
29
+ */
30
+ function Shamir(options) {
31
+ if (!(this instanceof Shamir)) {
32
+ return new Shamir(options)
33
+ }
34
+
35
+ this.options = options || {}
36
+ return this
37
+ }
38
+
39
+ /**
40
+ * Split a secret into shares using Shamir's Secret Sharing
41
+ * @param {Buffer|String} secret - The secret to split
42
+ * @param {Number} threshold - Minimum number of shares needed to reconstruct
43
+ * @param {Number} shares - Total number of shares to generate
44
+ * @param {Object} options - Additional options
45
+ * @returns {Array} Array of share objects with {x, y} coordinates
46
+ */
47
+ Shamir.split = function(secret, threshold, shares, options) {
48
+ options = options || {}
49
+
50
+ if (!secret) {
51
+ throw new Error('Secret is required')
52
+ }
53
+
54
+ if (threshold < 2) {
55
+ throw new Error('Threshold must be at least 2')
56
+ }
57
+
58
+ if (shares < threshold) {
59
+ throw new Error('Number of shares must be at least threshold')
60
+ }
61
+
62
+ if (threshold > 255 || shares > 255) {
63
+ throw new Error('Threshold and shares must be <= 255')
64
+ }
65
+
66
+ // Convert secret to buffer if string
67
+ var secretBuffer = Buffer.isBuffer(secret) ? secret : Buffer.from(secret, 'utf8')
68
+
69
+ // Process each byte of the secret
70
+ var allShares = []
71
+
72
+ for (var i = 0; i < secretBuffer.length; i++) {
73
+ var byte = secretBuffer[i]
74
+ var byteShares = Shamir._splitByte(byte, threshold, shares)
75
+ allShares.push(byteShares)
76
+ }
77
+
78
+ // Combine shares across bytes
79
+ var result = []
80
+ for (var j = 0; j < shares; j++) {
81
+ var shareData = {
82
+ id: j + 1,
83
+ threshold: threshold,
84
+ shares: shares,
85
+ length: secretBuffer.length,
86
+ bytes: []
87
+ }
88
+
89
+ for (var k = 0; k < allShares.length; k++) {
90
+ shareData.bytes.push(allShares[k][j])
91
+ }
92
+
93
+ result.push(shareData)
94
+ }
95
+
96
+ return result
97
+ }
98
+
99
+ /**
100
+ * Combine shares to reconstruct the original secret
101
+ * @param {Array} shares - Array of share objects
102
+ * @returns {Buffer} The reconstructed secret
103
+ */
104
+ Shamir.combine = function(shares) {
105
+ if (!shares || shares.length === 0) {
106
+ throw new Error('Shares array is required')
107
+ }
108
+
109
+ // Validate shares
110
+ var threshold = shares[0].threshold
111
+ var totalShares = shares[0].shares
112
+ var secretLength = shares[0].length
113
+
114
+ if (shares.length < threshold) {
115
+ throw new Error('Insufficient shares: need ' + threshold + ', got ' + shares.length)
116
+ }
117
+
118
+ // Verify all shares have same parameters
119
+ for (var i = 0; i < shares.length; i++) {
120
+ if (shares[i].threshold !== threshold || shares[i].shares !== totalShares) {
121
+ throw new Error('Shares have inconsistent parameters')
122
+ }
123
+ if (shares[i].length !== secretLength) {
124
+ throw new Error('Shares have different secret lengths')
125
+ }
126
+ }
127
+
128
+ var reconstructedBytes = []
129
+
130
+ // Reconstruct each byte
131
+ for (var j = 0; j < secretLength; j++) {
132
+ var byteShares = []
133
+ for (var k = 0; k < Math.min(shares.length, threshold); k++) {
134
+ byteShares.push(shares[k].bytes[j])
135
+ }
136
+
137
+ var byte = Shamir._combineByte(byteShares)
138
+ reconstructedBytes.push(byte)
139
+ }
140
+
141
+ // Create buffer from reconstructed bytes
142
+ return Buffer.from(reconstructedBytes)
143
+ }
144
+
145
+ /**
146
+ * Split a single byte using polynomial interpolation
147
+ * @private
148
+ */
149
+ Shamir._splitByte = function(secretByte, threshold, shares) {
150
+ // Convert byte to big number
151
+ var secret = new BN(secretByte)
152
+
153
+ // Generate random polynomial coefficients
154
+ var coefficients = [secret] // a0 = secret
155
+
156
+ for (var i = 1; i < threshold; i++) {
157
+ var coeff = Shamir._randomFieldElement()
158
+ coefficients.push(coeff)
159
+ }
160
+
161
+ // Generate shares by evaluating polynomial at different points
162
+ var result = []
163
+ for (var x = 1; x <= shares; x++) {
164
+ var y = Shamir._evaluatePolynomial(coefficients, new BN(x))
165
+ result.push({
166
+ x: x,
167
+ y: y.toString(16)
168
+ })
169
+ }
170
+
171
+ return result
172
+ }
173
+
174
+ /**
175
+ * Combine shares for a single byte using Lagrange interpolation
176
+ * @private
177
+ */
178
+ Shamir._combineByte = function(shares) {
179
+ if (shares.length === 0) {
180
+ throw new Error('No shares provided')
181
+ }
182
+
183
+ var result = new BN(0)
184
+
185
+ for (var i = 0; i < shares.length; i++) {
186
+ var xi = new BN(shares[i].x)
187
+ var yi = new BN(shares[i].y, 16)
188
+
189
+ // Calculate Lagrange basis polynomial
190
+ var numerator = new BN(1)
191
+ var denominator = new BN(1)
192
+
193
+ for (var j = 0; j < shares.length; j++) {
194
+ if (i !== j) {
195
+ var xj = new BN(shares[j].x)
196
+ // For Lagrange interpolation at x=0 (to get the constant term)
197
+ var numFactor = new BN(0).sub(xj)
198
+ if (numFactor.lt(new BN(0))) {
199
+ numFactor = numFactor.add(PRIME)
200
+ }
201
+ numerator = numerator.mul(numFactor).mod(PRIME)
202
+
203
+ var denFactor = xi.sub(xj)
204
+ if (denFactor.lt(new BN(0))) {
205
+ denFactor = denFactor.add(PRIME)
206
+ }
207
+ denominator = denominator.mul(denFactor).mod(PRIME)
208
+ }
209
+ }
210
+
211
+ // Calculate modular inverse of denominator
212
+ var inverse = Shamir._modInverse(denominator, PRIME)
213
+ var lagrange = numerator.mul(inverse).mod(PRIME)
214
+
215
+ // Add to result
216
+ result = result.add(yi.mul(lagrange)).mod(PRIME)
217
+ }
218
+
219
+ // Convert back to byte (0-255) - ensure positive result
220
+ var finalResult = result.mod(PRIME).mod(new BN(256))
221
+ return finalResult.toNumber()
222
+ }
223
+
224
+ /**
225
+ * Evaluate polynomial at given point
226
+ * @private
227
+ */
228
+ Shamir._evaluatePolynomial = function(coefficients, x) {
229
+ var result = new BN(0)
230
+ var xPower = new BN(1)
231
+
232
+ for (var i = 0; i < coefficients.length; i++) {
233
+ result = result.add(coefficients[i].mul(xPower)).mod(PRIME)
234
+ xPower = xPower.mul(x).mod(PRIME)
235
+ }
236
+
237
+ return result
238
+ }
239
+
240
+ /**
241
+ * Generate random field element
242
+ * @private
243
+ */
244
+ Shamir._randomFieldElement = function() {
245
+ var bytes = Random.getRandomBuffer(32)
246
+ var num = new BN(bytes)
247
+ return num.mod(PRIME.sub(new BN(1))).add(new BN(1))
248
+ }
249
+
250
+ /**
251
+ * Calculate modular inverse using extended Euclidean algorithm
252
+ * @private
253
+ */
254
+ Shamir._modInverse = function(a, m) {
255
+ if (a.lt(new BN(0))) {
256
+ a = a.mod(m).add(m)
257
+ }
258
+
259
+ var g = Shamir._extendedGCD(a, m)
260
+
261
+ if (!g.gcd.eq(new BN(1))) {
262
+ throw new Error('Modular inverse does not exist')
263
+ }
264
+
265
+ return g.x.mod(m).add(m).mod(m)
266
+ }
267
+
268
+ /**
269
+ * Extended Euclidean algorithm
270
+ * @private
271
+ */
272
+ Shamir._extendedGCD = function(a, b) {
273
+ if (a.eq(new BN(0))) {
274
+ return { gcd: b, x: new BN(0), y: new BN(1) }
275
+ }
276
+
277
+ var g = Shamir._extendedGCD(b.mod(a), a)
278
+
279
+ return {
280
+ gcd: g.gcd,
281
+ x: g.y.sub(b.div(a).mul(g.x)),
282
+ y: g.x
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Verify share integrity
288
+ * @param {Object} share - Share to verify
289
+ * @returns {Boolean} True if share is valid
290
+ */
291
+ Shamir.verifyShare = function(share) {
292
+ try {
293
+ if (!share || typeof share !== 'object') {
294
+ return false
295
+ }
296
+
297
+ if (!share.id || !share.threshold || !share.shares || !share.bytes || typeof share.length !== 'number') {
298
+ return false
299
+ }
300
+
301
+ if (share.threshold < 2 || share.shares < share.threshold) {
302
+ return false
303
+ }
304
+
305
+ if (!Array.isArray(share.bytes) || share.bytes.length !== share.length) {
306
+ return false
307
+ }
308
+
309
+ // Verify each byte share
310
+ for (var i = 0; i < share.bytes.length; i++) {
311
+ var byteShare = share.bytes[i]
312
+ if (!byteShare.x || !byteShare.y) {
313
+ return false
314
+ }
315
+
316
+ if (byteShare.x < 1 || byteShare.x > share.shares) {
317
+ return false
318
+ }
319
+
320
+ // Verify y is valid hex
321
+ try {
322
+ var testHex = byteShare.y
323
+ if (!/^[0-9a-fA-F]+$/.test(testHex)) {
324
+ return false
325
+ }
326
+ new BN(testHex, 16)
327
+ } catch (e) {
328
+ return false
329
+ }
330
+ }
331
+
332
+ return true
333
+ } catch (e) {
334
+ return false
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Generate test vectors for validation
340
+ * @returns {Object} Test data
341
+ */
342
+ Shamir.generateTestVectors = function() {
343
+ var secret = 'Hello, Bitcoin SV!'
344
+ var threshold = 3
345
+ var shares = 5
346
+
347
+ var splitShares = Shamir.split(secret, threshold, shares)
348
+ var reconstructed = Shamir.combine(splitShares.slice(0, threshold))
349
+
350
+ return {
351
+ secret: secret,
352
+ threshold: threshold,
353
+ totalShares: shares,
354
+ shares: splitShares,
355
+ reconstructed: reconstructed.toString('utf8'),
356
+ valid: reconstructed.toString('utf8') === secret
357
+ }
358
+ }
359
+
360
+ module.exports = Shamir