@@ -87,7 +87,13 @@ var cnUtil = function(currencyConfig) {
87
87
var l = JSBigInt (
88
88
"7237005577332262213973186563042994240857116359379907606001950938285454250989" ,
89
89
) ; //curve order (not RCT specific)
90
+
90
91
var I = "0100000000000000000000000000000000000000000000000000000000000000" ; //identity element
92
+ this . I = I ;
93
+ this . identity = function ( ) {
94
+ return I ;
95
+ } ;
96
+
91
97
var Z = "0000000000000000000000000000000000000000000000000000000000000000" ; //zero scalar
92
98
//H2 object to speed up some operations
93
99
var H2 = [
@@ -157,6 +163,8 @@ var cnUtil = function(currencyConfig) {
157
163
"f8fef05a3fa5c9f3eba41638b247b711a99f960fe73aa2f90136aeb20329b888" ,
158
164
] ;
159
165
166
+ this . H2 = H2 ;
167
+
160
168
//begin rct new functions
161
169
//creates a Pedersen commitment from an amount (in scalar form) and a mask
162
170
//C = bG + aH where b = mask, a = amount
@@ -222,6 +230,7 @@ var cnUtil = function(currencyConfig) {
222
230
223
231
//for most uses you'll also want to swapEndian after conversion
224
232
//mainly to convert integer "scalars" to usable hexadecimal strings
233
+ //uint long long to 32 byte key
225
234
function d2h ( integer ) {
226
235
if ( typeof integer !== "string" && integer . toString ( ) . length > 15 ) {
227
236
throw "integer should be entered as a string for precision" ;
@@ -237,12 +246,14 @@ var cnUtil = function(currencyConfig) {
237
246
. toLowerCase ( )
238
247
) . slice ( - 64 ) ;
239
248
}
249
+ this . d2h = d2h ;
240
250
241
251
//integer (string) to scalar
242
252
function d2s ( integer ) {
243
253
return swapEndian ( d2h ( integer ) ) ;
244
254
}
245
255
256
+ this . d2s = d2s ;
246
257
//scalar to integer (string)
247
258
function s2d ( scalar ) {
248
259
return JSBigInt . parse ( swapEndian ( scalar ) , 16 ) . toString ( ) ;
@@ -314,6 +325,7 @@ var cnUtil = function(currencyConfig) {
314
325
}
315
326
return res ;
316
327
}
328
+ this . hextobin = hextobin ;
317
329
318
330
function bintohex ( bin ) {
319
331
var out = [ ] ;
@@ -514,6 +526,8 @@ var cnUtil = function(currencyConfig) {
514
526
return this . sc_reduce32 ( this . rand_32 ( ) ) ;
515
527
} ;
516
528
529
+ // alias
530
+ this . skGen = random_scalar ;
517
531
/* no longer used
518
532
this.keccak = function(hex, inlen, outlen) {
519
533
var input = hextobin(hex);
@@ -869,6 +883,7 @@ var cnUtil = function(currencyConfig) {
869
883
CNCrypto . _free ( res2_m ) ;
870
884
return bintohex ( res ) ;
871
885
} ;
886
+ this . hashToPoint = hash_to_ec_2 ;
872
887
873
888
this . generate_key_image_2 = function ( pub , sec ) {
874
889
if ( ! pub || ! sec || pub . length !== 64 || sec . length !== 64 ) {
@@ -1248,8 +1263,8 @@ var cnUtil = function(currencyConfig) {
1248
1263
//xv: vector of secret keys, 1 per ring (nrings)
1249
1264
//pm: matrix of pubkeys, indexed by size first
1250
1265
//iv: vector of indexes, 1 per ring (nrings), can be a string
1251
- //size: ring size
1252
- //nrings: number of rings
1266
+ //size: ring size, default 2
1267
+ //nrings: number of rings, default 64
1253
1268
//extensible borromean signatures
1254
1269
this . genBorromean = function ( xv , pm , iv , size , nrings ) {
1255
1270
if ( xv . length !== nrings ) {
@@ -1272,6 +1287,8 @@ var cnUtil = function(currencyConfig) {
1272
1287
}
1273
1288
}
1274
1289
//signature struct
1290
+ // in the case of size 2 and nrings 64
1291
+ // bb.s = [[64], [64]]
1275
1292
var bb = {
1276
1293
s : [ ] ,
1277
1294
ee : "" ,
@@ -1323,6 +1340,37 @@ var cnUtil = function(currencyConfig) {
1323
1340
return bb ;
1324
1341
} ;
1325
1342
1343
+ this . verifyBorromean = function ( bb , P1 , P2 ) {
1344
+ let Lv1 = [ ] ;
1345
+ let chash ;
1346
+ let LL ;
1347
+
1348
+ let p2 = "" ;
1349
+ for ( let ii = 0 ; ii < 64 ; ii ++ ) {
1350
+ p2 = this . ge_double_scalarmult_base_vartime (
1351
+ bb . ee ,
1352
+ P1 [ ii ] ,
1353
+ bb . s [ 0 ] [ ii ] ,
1354
+ ) ;
1355
+ LL = p2 ;
1356
+ chash = this . hash_to_scalar ( LL ) ;
1357
+
1358
+ p2 = this . ge_double_scalarmult_base_vartime (
1359
+ chash ,
1360
+ P2 [ ii ] ,
1361
+ bb . s [ 1 ] [ ii ] ,
1362
+ ) ;
1363
+ Lv1 [ ii ] = p2 ;
1364
+ }
1365
+ const eeComputed = this . array_hash_to_scalar ( Lv1 ) ;
1366
+ const equalKeys = eeComputed === bb . ee ;
1367
+ console . log ( `Keys equal? ${ equalKeys }
1368
+ ${ eeComputed }
1369
+ ${ bb . ee } ` ) ;
1370
+
1371
+ return equalKeys ;
1372
+ } ;
1373
+
1326
1374
//proveRange
1327
1375
//proveRange gives C, and mask such that \sumCi = C
1328
1376
// c.f. http://eprint.iacr.org/2015/1098 section 5.1
@@ -1406,6 +1454,7 @@ var cnUtil = function(currencyConfig) {
1406
1454
}
1407
1455
return hash_to_scalar ( buf ) ;
1408
1456
}
1457
+ this . array_hash_to_scalar = array_hash_to_scalar ;
1409
1458
1410
1459
// Gen creates a signature which proves that for some column in the keymatrix "pk"
1411
1460
// the signer knows a secret key for each row in that column
@@ -1414,13 +1463,16 @@ var cnUtil = function(currencyConfig) {
1414
1463
// because we don't want to force same secret column for all inputs
1415
1464
this . MLSAG_Gen = function ( message , pk , xx , kimg , index ) {
1416
1465
var cols = pk . length ; //ring size
1466
+ // secret index
1417
1467
if ( index >= cols ) {
1418
1468
throw "index out of range" ;
1419
1469
}
1420
1470
var rows = pk [ 0 ] . length ; //number of signature rows (always 2)
1471
+ // [pub, com] = 2
1421
1472
if ( rows !== 2 ) {
1422
1473
throw "wrong row count" ;
1423
1474
}
1475
+ // check all are len 2
1424
1476
for ( var i = 0 ; i < cols ; i ++ ) {
1425
1477
if ( pk [ i ] . length !== rows ) {
1426
1478
throw "pk is not rectangular" ;
@@ -1444,9 +1496,14 @@ var cnUtil = function(currencyConfig) {
1444
1496
toHash [ 0 ] = message ;
1445
1497
1446
1498
//secret index (pubkey section)
1499
+
1447
1500
alpha [ 0 ] = random_scalar ( ) ; //need to save alphas for later
1448
1501
toHash [ 1 ] = pk [ index ] [ 0 ] ; //secret index pubkey
1449
- toHash [ 2 ] = ge_scalarmult_base ( alpha [ 0 ] ) ; //dsRow L
1502
+
1503
+ // this is the keyimg anyway const H1 = this.hashToPoint(pk[index][0]) // Hp(K_in)
1504
+ // rv.II[0] = this.ge_scalarmult(H1, xx[0]) // k_in.Hp(K_in)
1505
+
1506
+ toHash [ 2 ] = ge_scalarmult_base ( alpha [ 0 ] ) ; //dsRow L, a.G
1450
1507
toHash [ 3 ] = generate_key_image_2 ( pk [ index ] [ 0 ] , alpha [ 0 ] ) ; //dsRow R (key image check)
1451
1508
//secret index (commitment section)
1452
1509
alpha [ 1 ] = random_scalar ( ) ;
@@ -1495,6 +1552,51 @@ var cnUtil = function(currencyConfig) {
1495
1552
return rv ;
1496
1553
} ;
1497
1554
1555
+ this . MLSAG_ver = function ( message , pk , rv , kimg ) {
1556
+ // we assume that col, row, rectangular checks are already done correctly
1557
+ // in MLSAG_gen
1558
+ const cols = pk . length ;
1559
+ let c_old = rv . cc ;
1560
+ console . log ( `cols ${ cols } ` ) ;
1561
+ let i = 0 ;
1562
+ let toHash = [ ] ;
1563
+ toHash [ 0 ] = message ;
1564
+ while ( i < cols ) {
1565
+ //!secret index (pubkey section)
1566
+ toHash [ 1 ] = pk [ i ] [ 0 ] ;
1567
+ toHash [ 2 ] = ge_double_scalarmult_base_vartime (
1568
+ c_old ,
1569
+ pk [ i ] [ 0 ] ,
1570
+ rv . ss [ i ] [ 0 ] ,
1571
+ ) ;
1572
+ toHash [ 3 ] = ge_double_scalarmult_postcomp_vartime (
1573
+ rv . ss [ i ] [ 0 ] ,
1574
+ pk [ i ] [ 0 ] ,
1575
+ c_old ,
1576
+ kimg ,
1577
+ ) ;
1578
+
1579
+ //!secret index (commitment section)
1580
+ toHash [ 4 ] = pk [ i ] [ 1 ] ;
1581
+ toHash [ 5 ] = ge_double_scalarmult_base_vartime (
1582
+ c_old ,
1583
+ pk [ i ] [ 1 ] ,
1584
+ rv . ss [ i ] [ 1 ] ,
1585
+ ) ;
1586
+
1587
+ c_old = array_hash_to_scalar ( toHash ) ;
1588
+
1589
+ i = i + 1 ;
1590
+ }
1591
+
1592
+ const c = this . sc_sub ( c_old , rv . cc ) ;
1593
+ console . log ( `
1594
+ c_old: ${ c_old }
1595
+ rc.cc: ${ rv . cc }
1596
+ c: ${ c } ` ) ;
1597
+ return c ;
1598
+ } ;
1599
+
1498
1600
//prepares for MLSAG_Gen
1499
1601
this . proveRctMG = function ( message , pubs , inSk , kimg , mask , Cout , index ) {
1500
1602
var cols = pubs . length ;
@@ -2483,6 +2585,8 @@ var cnUtil = function(currencyConfig) {
2483
2585
return str ;
2484
2586
}
2485
2587
2588
+ this . padLeft = padLeft ;
2589
+
2486
2590
this . printDsts = function ( dsts ) {
2487
2591
for ( var i = 0 ; i < dsts . length ; i ++ ) {
2488
2592
console . log (
0 commit comments