@totemsdk/core 1.0.8 → 1.0.10
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/LICENSE +21 -0
- package/README.md +5 -5
- package/dist/Streamable.js +54 -31
- package/dist/adapters/index.js +18 -8
- package/dist/adapters/types.js +19 -8
- package/dist/binio.js +5 -1
- package/dist/bip39.js +24 -14
- package/dist/derive.js +11 -7
- package/dist/index.js +130 -22
- package/dist/javaStreamables.js +49 -30
- package/dist/lease/LeaseMonitor.js +7 -3
- package/dist/lease/LeaseStore.js +7 -3
- package/dist/lease/WatermarkStore.js +7 -3
- package/dist/lease/index.js +13 -4
- package/dist/lease-client.js +8 -3
- package/dist/minima32.js +22 -13
- package/dist/minimaWireSerializer.js +20 -14
- package/dist/mmr.js +35 -23
- package/dist/mx.js +10 -1
- package/dist/params.js +9 -5
- package/dist/script.js +12 -7
- package/dist/scripts/contract-helpers.js +37 -26
- package/dist/scripts/dapp-types.js +11 -6
- package/dist/scripts/index.js +38 -4
- package/dist/scripts/types.js +26 -12
- package/dist/scripts/witness-serializer.js +48 -30
- package/dist/transaction.js +55 -46
- package/dist/treekey.js +74 -58
- package/dist/tx/TransactionLifecycle.js +11 -5
- package/dist/tx/TransactionReceiptStore.js +7 -3
- package/dist/tx/TransactionService.js +14 -10
- package/dist/tx/index.js +11 -3
- package/dist/tx/types.js +2 -1
- package/dist/util.js +5 -1
- package/dist/utils.js +12 -5
- package/dist/verify.js +36 -25
- package/dist/version.js +5 -2
- package/dist/wots.js +94 -64
- package/package.json +35 -6
- package/src/Streamable.d.ts +0 -265
- package/src/Streamable.js +0 -431
- package/src/Streamable.ts +0 -567
- package/src/__tests__/Streamable.parity.test.ts +0 -422
- package/src/__tests__/perAddressDerivation.parity.test.ts +0 -152
- package/src/__tests__/roottree-prepare.test.ts +0 -101
- package/src/__tests__/wots-parity.test.ts +0 -289
- package/src/adapters/index.d.ts +0 -190
- package/src/adapters/index.js +0 -117
- package/src/adapters/index.ts +0 -301
- package/src/adapters/types.ts +0 -235
- package/src/addr.oracle.test.ts +0 -25
- package/src/address.test.ts +0 -55
- package/src/binio.ts +0 -21
- package/src/bip39.d.ts +0 -91
- package/src/bip39.js +0 -427
- package/src/bip39.ts +0 -432
- package/src/derive.d.ts +0 -2
- package/src/derive.js +0 -13
- package/src/derive.ts +0 -11
- package/src/index.d.ts +0 -26
- package/src/index.js +0 -128
- package/src/index.test.ts +0 -5
- package/src/index.ts +0 -221
- package/src/javaStreamables.d.ts +0 -233
- package/src/javaStreamables.js +0 -328
- package/src/javaStreamables.ts +0 -403
- package/src/lease/LeaseMonitor.d.ts +0 -44
- package/src/lease/LeaseMonitor.js +0 -111
- package/src/lease/LeaseMonitor.ts +0 -157
- package/src/lease/LeaseStore.d.ts +0 -57
- package/src/lease/LeaseStore.js +0 -148
- package/src/lease/LeaseStore.ts +0 -203
- package/src/lease/WatermarkStore.d.ts +0 -61
- package/src/lease/WatermarkStore.js +0 -206
- package/src/lease/WatermarkStore.ts +0 -270
- package/src/lease/index.d.ts +0 -14
- package/src/lease/index.js +0 -22
- package/src/lease/index.ts +0 -41
- package/src/lease-client.d.ts +0 -31
- package/src/lease-client.js +0 -44
- package/src/lease-client.ts +0 -69
- package/src/minima32.d.ts +0 -10
- package/src/minima32.js +0 -113
- package/src/minima32.test.ts +0 -11
- package/src/minima32.ts +0 -127
- package/src/minimaWireSerializer.d.ts +0 -189
- package/src/minimaWireSerializer.js +0 -311
- package/src/minimaWireSerializer.test.ts +0 -466
- package/src/minimaWireSerializer.ts +0 -117
- package/src/mmr.d.ts +0 -159
- package/src/mmr.js +0 -352
- package/src/mmr.oracle.test.ts +0 -28
- package/src/mmr.ts +0 -429
- package/src/mx.test.ts +0 -25
- package/src/mx.ts +0 -1
- package/src/params.d.ts +0 -29
- package/src/params.d.ts.map +0 -1
- package/src/params.js +0 -20
- package/src/params.js.map +0 -1
- package/src/params.ts +0 -44
- package/src/script.d.ts +0 -7
- package/src/script.js +0 -27
- package/src/script.ts +0 -24
- package/src/scripts/contract-helpers.ts +0 -609
- package/src/scripts/dapp-types.ts +0 -240
- package/src/scripts/index.ts +0 -22
- package/src/scripts/types.ts +0 -247
- package/src/scripts/witness-serializer.ts +0 -384
- package/src/transaction.ts +0 -430
- package/src/treekey.d.ts +0 -383
- package/src/treekey.js +0 -774
- package/src/treekey.parity.test.ts +0 -459
- package/src/treekey.ts +0 -975
- package/src/tx/TransactionLifecycle.d.ts +0 -55
- package/src/tx/TransactionLifecycle.js +0 -188
- package/src/tx/TransactionLifecycle.ts +0 -280
- package/src/tx/TransactionReceiptStore.d.ts +0 -36
- package/src/tx/TransactionReceiptStore.js +0 -89
- package/src/tx/TransactionReceiptStore.ts +0 -112
- package/src/tx/TransactionService.d.ts +0 -31
- package/src/tx/TransactionService.js +0 -140
- package/src/tx/TransactionService.ts +0 -252
- package/src/tx/index.d.ts +0 -13
- package/src/tx/index.js +0 -20
- package/src/tx/index.ts +0 -44
- package/src/tx/types.d.ts +0 -80
- package/src/tx/types.js +0 -6
- package/src/tx/types.ts +0 -130
- package/src/util.d.ts +0 -1
- package/src/util.js +0 -5
- package/src/util.ts +0 -1
- package/src/utils.d.ts +0 -8
- package/src/utils.js +0 -42
- package/src/utils.ts +0 -38
- package/src/verify.ts +0 -210
- package/src/version.ts +0 -13
- package/src/wots.d.ts +0 -224
- package/src/wots.d.ts.map +0 -1
- package/src/wots.js +0 -565
- package/src/wots.js.map +0 -1
- package/src/wots.ts +0 -651
- package/test-vectors.json +0 -45
package/src/wots.js
DELETED
|
@@ -1,565 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* WOTS Implementation - BouncyCastle Compatible
|
|
4
|
-
*
|
|
5
|
-
* This implementation matches BouncyCastle's WinternitzOTSignature exactly,
|
|
6
|
-
* which is used by Minima's Winternitz.java class.
|
|
7
|
-
*
|
|
8
|
-
* Key differences from standard WOTS/WOTS+:
|
|
9
|
-
* - w=8 means 8 BITS per digit (not base-8), so each byte is one digit (0-255)
|
|
10
|
-
* - Stateful PRNG (GMSSRandom) for chain seed derivation, not stateless H(i||seed)
|
|
11
|
-
* - 34 total chains (32 message + 2 checksum), not 89
|
|
12
|
-
* - Each chain hashed up to 255 times (2^8 - 1)
|
|
13
|
-
*
|
|
14
|
-
* Source: org.bouncycastle.pqc.crypto.gmss.util.{WinternitzOTSignature, WinternitzOTSVerify, GMSSRandom}
|
|
15
|
-
*/
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.GMSSRandom = exports.h = exports.u32be = exports.u16be = exports.concatBytes = exports.fromHex = exports.hex = exports.F = void 0;
|
|
18
|
-
exports.setWotsLogger = setWotsLogger;
|
|
19
|
-
exports.disableWotsLogger = disableWotsLogger;
|
|
20
|
-
exports.isWotsDebugEnabled = isWotsDebugEnabled;
|
|
21
|
-
exports.assert32 = assert32;
|
|
22
|
-
exports.getLog = getLog;
|
|
23
|
-
exports.expandPrivateKey = expandPrivateKey;
|
|
24
|
-
exports.toWinternitzDigits = toWinternitzDigits;
|
|
25
|
-
exports.baseWWithChecksum = baseWWithChecksum;
|
|
26
|
-
exports.hashChain = hashChain;
|
|
27
|
-
exports.deriveIndexedSeed = deriveIndexedSeed;
|
|
28
|
-
exports.derivePKdigest = derivePKdigest;
|
|
29
|
-
exports.deriveFullPublicKey = deriveFullPublicKey;
|
|
30
|
-
exports.wotsKeypairFromSeed = wotsKeypairFromSeed;
|
|
31
|
-
exports.wotsSign = wotsSign;
|
|
32
|
-
exports.wotsSignLegacy = wotsSignLegacy;
|
|
33
|
-
exports.wotsPkFromSig = wotsPkFromSig;
|
|
34
|
-
exports.wotsVerify = wotsVerify;
|
|
35
|
-
exports.wotsVerifyDigest = wotsVerifyDigest;
|
|
36
|
-
exports.wotsPublicKeyFromSeed = wotsPublicKeyFromSeed;
|
|
37
|
-
exports.prfChainSeed = prfChainSeed;
|
|
38
|
-
const sha3_1 = require("@noble/hashes/sha3");
|
|
39
|
-
const params_1 = require("./params");
|
|
40
|
-
const javaStreamables_1 = require("./javaStreamables");
|
|
41
|
-
const adapters_1 = require("./adapters");
|
|
42
|
-
// Module-level debug logger - can be set externally for parity testing
|
|
43
|
-
let wotsLogger = new adapters_1.NoopLogger();
|
|
44
|
-
let wotsDebugEnabled = false;
|
|
45
|
-
/**
|
|
46
|
-
* Enable WOTS debug logging with a custom logger
|
|
47
|
-
* Use this for parity testing to capture all intermediate values
|
|
48
|
-
*
|
|
49
|
-
* WARNING: Debug logging outputs sensitive cryptographic material including
|
|
50
|
-
* private key chains and seeds. NEVER enable in production builds.
|
|
51
|
-
* This is intended for development/testing parity verification only.
|
|
52
|
-
*/
|
|
53
|
-
function setWotsLogger(logger) {
|
|
54
|
-
wotsLogger = logger;
|
|
55
|
-
wotsDebugEnabled = true;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Disable WOTS debug logging
|
|
59
|
-
*/
|
|
60
|
-
function disableWotsLogger() {
|
|
61
|
-
wotsLogger = new adapters_1.NoopLogger();
|
|
62
|
-
wotsDebugEnabled = false;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Check if WOTS debug logging is enabled
|
|
66
|
-
*/
|
|
67
|
-
function isWotsDebugEnabled() {
|
|
68
|
-
return wotsDebugEnabled;
|
|
69
|
-
}
|
|
70
|
-
// === Canonical helpers ===
|
|
71
|
-
const F = (x) => (0, sha3_1.sha3_256)(x);
|
|
72
|
-
exports.F = F;
|
|
73
|
-
const hex = (u) => { let s = ''; for (let i = 0; i < u.length; i++) s += u[i].toString(16).padStart(2, '0'); return s; };
|
|
74
|
-
exports.hex = hex;
|
|
75
|
-
const fromHex = (h) => { const s = h.replace(/^0x/, ''); const out = new Uint8Array(s.length >> 1); for (let i = 0; i < out.length; i++) out[i] = parseInt(s.slice(i * 2, i * 2 + 2), 16); return out; };
|
|
76
|
-
exports.fromHex = fromHex;
|
|
77
|
-
const concatBytes = (...arrs) => {
|
|
78
|
-
const len = arrs.reduce((n, a) => n + a.length, 0);
|
|
79
|
-
const out = new Uint8Array(len);
|
|
80
|
-
let o = 0;
|
|
81
|
-
for (const a of arrs) {
|
|
82
|
-
out.set(a, o);
|
|
83
|
-
o += a.length;
|
|
84
|
-
}
|
|
85
|
-
return out;
|
|
86
|
-
};
|
|
87
|
-
exports.concatBytes = concatBytes;
|
|
88
|
-
const u16be = (n) => new Uint8Array([(n >>> 8) & 0xff, n & 0xff]);
|
|
89
|
-
exports.u16be = u16be;
|
|
90
|
-
const u32be = (n) => new Uint8Array([(n >>> 24) & 255, (n >>> 16) & 255, (n >>> 8) & 255, n & 255]);
|
|
91
|
-
exports.u32be = u32be;
|
|
92
|
-
function assert32(u, label = 'value') {
|
|
93
|
-
if (!(u instanceof Uint8Array))
|
|
94
|
-
throw new Error(`${label} must be a Uint8Array`);
|
|
95
|
-
if (u.length !== 32)
|
|
96
|
-
throw new Error(`${label} must be exactly 32 bytes; got ${u.length}`);
|
|
97
|
-
}
|
|
98
|
-
// Legacy aliases
|
|
99
|
-
const u8 = (len) => new Uint8Array(len);
|
|
100
|
-
exports.h = exports.F;
|
|
101
|
-
const concat = exports.concatBytes;
|
|
102
|
-
const defaultParamSet = (0, params_1.getParamSet)();
|
|
103
|
-
/**
|
|
104
|
-
* GMSSRandom - BouncyCastle's stateful PRNG for WOTS chain seed derivation
|
|
105
|
-
*
|
|
106
|
-
* Algorithm from GMSSRandom.java:
|
|
107
|
-
* rand = H(state)
|
|
108
|
-
* state = state + rand + 1 (byte-wise addition with carry)
|
|
109
|
-
* return rand
|
|
110
|
-
*
|
|
111
|
-
* The state is MUTATED in place after each call.
|
|
112
|
-
*/
|
|
113
|
-
class GMSSRandom {
|
|
114
|
-
/**
|
|
115
|
-
* Generate next random value and update state
|
|
116
|
-
*
|
|
117
|
-
* @param state - 32-byte state array (MUTATED in place)
|
|
118
|
-
* @returns 32-byte random value
|
|
119
|
-
*/
|
|
120
|
-
static nextSeed(state) {
|
|
121
|
-
assert32(state, 'state');
|
|
122
|
-
// rand = H(state)
|
|
123
|
-
const rand = (0, exports.F)(state);
|
|
124
|
-
// state = state + rand (byte-wise addition with carry, little-endian)
|
|
125
|
-
GMSSRandom.addByteArrays(state, rand);
|
|
126
|
-
// state = state + 1
|
|
127
|
-
GMSSRandom.addOne(state);
|
|
128
|
-
return rand;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Add two byte arrays: a = a + b (little-endian, with carry)
|
|
132
|
-
* Matches GMSSRandom.addByteArrays()
|
|
133
|
-
*/
|
|
134
|
-
static addByteArrays(a, b) {
|
|
135
|
-
let overflow = 0;
|
|
136
|
-
for (let i = 0; i < a.length; i++) {
|
|
137
|
-
const temp = (a[i] & 0xff) + (b[i] & 0xff) + overflow;
|
|
138
|
-
a[i] = temp & 0xff;
|
|
139
|
-
overflow = temp >>> 8;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Add one to byte array: a = a + 1 (little-endian, with carry)
|
|
144
|
-
* Matches GMSSRandom.addOne()
|
|
145
|
-
*/
|
|
146
|
-
static addOne(a) {
|
|
147
|
-
let overflow = 1;
|
|
148
|
-
for (let i = 0; i < a.length; i++) {
|
|
149
|
-
const temp = (a[i] & 0xff) + overflow;
|
|
150
|
-
a[i] = temp & 0xff;
|
|
151
|
-
overflow = temp >>> 8;
|
|
152
|
-
if (overflow === 0)
|
|
153
|
-
break;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
exports.GMSSRandom = GMSSRandom;
|
|
158
|
-
/**
|
|
159
|
-
* getLog - Calculate ceil(log2(x))
|
|
160
|
-
*
|
|
161
|
-
* Matches WinternitzOTSignature.getLog():
|
|
162
|
-
* int log = 1;
|
|
163
|
-
* int i = 2;
|
|
164
|
-
* while (i < intValue) { i <<= 1; log++; }
|
|
165
|
-
* return log;
|
|
166
|
-
*/
|
|
167
|
-
function getLog(intValue) {
|
|
168
|
-
let log = 1;
|
|
169
|
-
let i = 2;
|
|
170
|
-
while (i < intValue) {
|
|
171
|
-
i <<= 1;
|
|
172
|
-
log++;
|
|
173
|
-
}
|
|
174
|
-
return log;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Expand master seed into L private key chains using GMSSRandom
|
|
178
|
-
*
|
|
179
|
-
* Matches WinternitzOTSignature constructor:
|
|
180
|
-
* byte[] dummy = new byte[mdsize];
|
|
181
|
-
* System.arraycopy(seed0, 0, dummy, 0, dummy.length);
|
|
182
|
-
* for (int i = 0; i < keysize; i++) {
|
|
183
|
-
* privateKeyOTS[i] = gmssRandom.nextSeed(dummy);
|
|
184
|
-
* }
|
|
185
|
-
*/
|
|
186
|
-
function expandPrivateKey(seed, ps = (0, params_1.getParamSet)()) {
|
|
187
|
-
assert32(seed, 'seed');
|
|
188
|
-
// Copy seed to mutable state
|
|
189
|
-
const state = new Uint8Array(seed);
|
|
190
|
-
if (wotsDebugEnabled) {
|
|
191
|
-
wotsLogger.debug(`[expandPrivateKey] Input seed: ${(0, exports.hex)(seed).substring(0, 64)}...`);
|
|
192
|
-
wotsLogger.debug(`[expandPrivateKey] Initial state: ${(0, exports.hex)(state).substring(0, 64)}...`);
|
|
193
|
-
}
|
|
194
|
-
// Generate L chain seeds using stateful PRNG
|
|
195
|
-
const privateKeys = [];
|
|
196
|
-
for (let i = 0; i < ps.L; i++) {
|
|
197
|
-
const pk = GMSSRandom.nextSeed(state);
|
|
198
|
-
privateKeys.push(pk);
|
|
199
|
-
// Log first few private keys for debugging
|
|
200
|
-
if (wotsDebugEnabled && i < 3) {
|
|
201
|
-
wotsLogger.debug(`[expandPrivateKey] pk[${i}]: ${(0, exports.hex)(pk)}`);
|
|
202
|
-
wotsLogger.debug(`[expandPrivateKey] state after pk[${i}]: ${(0, exports.hex)(state).substring(0, 32)}...`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
if (wotsDebugEnabled) {
|
|
206
|
-
wotsLogger.debug(`[expandPrivateKey] Generated ${privateKeys.length} private keys`);
|
|
207
|
-
wotsLogger.debug(`[expandPrivateKey] pk[33] (last): ${(0, exports.hex)(privateKeys[33])}`);
|
|
208
|
-
}
|
|
209
|
-
return privateKeys;
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Convert message hash to Winternitz digits with checksum
|
|
213
|
-
*
|
|
214
|
-
* For w=8 (8 bits per digit), since 8 % 8 == 0:
|
|
215
|
-
* - Each byte of the hash IS one digit (0-255)
|
|
216
|
-
* - messagesize = 32 digits
|
|
217
|
-
* - checksum = (messagesize << w) - sum = 8192 - sum
|
|
218
|
-
* - checksumsize = 14 bits, extracted as 2 digits
|
|
219
|
-
*
|
|
220
|
-
* Matches WinternitzOTSignature.getSignature() for w=8 case
|
|
221
|
-
*/
|
|
222
|
-
function toWinternitzDigits(hash32, ps = (0, params_1.getParamSet)()) {
|
|
223
|
-
assert32(hash32, 'hash');
|
|
224
|
-
if (ps.w !== 8) {
|
|
225
|
-
throw new Error(`Only w=8 is supported. Got w=${ps.w}`);
|
|
226
|
-
}
|
|
227
|
-
// For w=8: each byte IS a digit (0-255)
|
|
228
|
-
// d = 8 / w = 1 digit per byte
|
|
229
|
-
// k = (1 << w) - 1 = 255
|
|
230
|
-
const digits = [];
|
|
231
|
-
let c = 0; // checksum accumulator
|
|
232
|
-
for (let i = 0; i < hash32.length; i++) {
|
|
233
|
-
const digit = hash32[i] & 0xff;
|
|
234
|
-
digits.push(digit);
|
|
235
|
-
c += digit;
|
|
236
|
-
}
|
|
237
|
-
const digitSum = c;
|
|
238
|
-
// Checksum = (messagesize << w) - c = (32 << 8) - c = 8192 - c
|
|
239
|
-
c = (ps.messageSize << ps.w) - c;
|
|
240
|
-
const checksumBeforeExtract = c;
|
|
241
|
-
// Extract checksum digits: 2 digits, each 0-255
|
|
242
|
-
// checksumsize = 14 bits, iterate by w=8 bits
|
|
243
|
-
const checksumDigits = [];
|
|
244
|
-
const k = ps.maxDigit; // 255
|
|
245
|
-
for (let i = 0; i < ps.checksumSize; i += ps.w) {
|
|
246
|
-
checksumDigits.push(c & k);
|
|
247
|
-
c >>>= ps.w;
|
|
248
|
-
}
|
|
249
|
-
if (wotsDebugEnabled) {
|
|
250
|
-
wotsLogger.debug(`[toWinternitzDigits] Input hash: ${(0, exports.hex)(hash32)}`);
|
|
251
|
-
wotsLogger.debug(`[toWinternitzDigits] First 5 message digits: [${digits.slice(0, 5).join(', ')}]`);
|
|
252
|
-
wotsLogger.debug(`[toWinternitzDigits] Last 5 message digits: [${digits.slice(-5).join(', ')}]`);
|
|
253
|
-
wotsLogger.debug(`[toWinternitzDigits] Digit sum: ${digitSum}`);
|
|
254
|
-
wotsLogger.debug(`[toWinternitzDigits] Checksum formula: (${ps.messageSize} << ${ps.w}) - ${digitSum} = ${checksumBeforeExtract}`);
|
|
255
|
-
wotsLogger.debug(`[toWinternitzDigits] Checksum digits: [${checksumDigits.join(', ')}]`);
|
|
256
|
-
wotsLogger.debug(`[toWinternitzDigits] Total digits: ${digits.length + checksumDigits.length} (expected L=${ps.L})`);
|
|
257
|
-
}
|
|
258
|
-
return {
|
|
259
|
-
digits,
|
|
260
|
-
checksumDigits,
|
|
261
|
-
total: digits.length + checksumDigits.length
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Decompose digest into base-w digits + checksum
|
|
266
|
-
* Returns flat array of all L digits
|
|
267
|
-
*/
|
|
268
|
-
function baseWWithChecksum(msgHash, paramSet) {
|
|
269
|
-
const ps = paramSet || defaultParamSet;
|
|
270
|
-
const { digits, checksumDigits } = toWinternitzDigits(msgHash, ps);
|
|
271
|
-
const result = digits.concat(checksumDigits);
|
|
272
|
-
if (result.length !== ps.L) {
|
|
273
|
-
throw new Error(`Invalid digit length: expected ${ps.L}, got ${result.length}`);
|
|
274
|
-
}
|
|
275
|
-
return result;
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Hash a value k times
|
|
279
|
-
*
|
|
280
|
-
* Matches WinternitzOTSignature.hashPrivateKeyBlock():
|
|
281
|
-
* - If rounds < 1: return input unchanged
|
|
282
|
-
* - Otherwise: hash `rounds` times
|
|
283
|
-
*/
|
|
284
|
-
function hashChain(x, rounds) {
|
|
285
|
-
if (rounds < 1) {
|
|
286
|
-
return new Uint8Array(x);
|
|
287
|
-
}
|
|
288
|
-
let result = (0, exports.F)(x);
|
|
289
|
-
for (let i = 1; i < rounds; i++) {
|
|
290
|
-
result = (0, exports.F)(result);
|
|
291
|
-
}
|
|
292
|
-
return result;
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Derive unique seed for a specific key index
|
|
296
|
-
*
|
|
297
|
-
* DEPRECATED: Use deriveChainSeedJava for Java parity.
|
|
298
|
-
* This function is preserved for backward compatibility only.
|
|
299
|
-
*
|
|
300
|
-
* The correct derivation matching Minima's TreeKeyNode.java:
|
|
301
|
-
* MiniData seed = Crypto.getInstance().hashAllObjects(new MiniNumber(i), zPrivateSeed);
|
|
302
|
-
*
|
|
303
|
-
* This old implementation used H(seed || u32be(i)) which is NOT Java compatible.
|
|
304
|
-
* @deprecated Use deriveChainSeedJava from javaStreamables.ts
|
|
305
|
-
*/
|
|
306
|
-
function deriveIndexedSeed(seed, keyIndex) {
|
|
307
|
-
assert32(seed, 'seed');
|
|
308
|
-
// Use Java-compatible derivation: hashAllObjects(MiniNumber(i), MiniData(seed))
|
|
309
|
-
const result = (0, javaStreamables_1.deriveChainSeedJava)(seed, keyIndex);
|
|
310
|
-
if (wotsDebugEnabled) {
|
|
311
|
-
wotsLogger.debug(`[deriveIndexedSeed] seed=${(0, exports.hex)(seed).substring(0, 32)}..., keyIndex=${keyIndex} => ${(0, exports.hex)(result)}`);
|
|
312
|
-
}
|
|
313
|
-
return result;
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Derive WOTS public key digest from seed and key index
|
|
317
|
-
*
|
|
318
|
-
* The key index is mixed into the seed first (deriveIndexedSeed),
|
|
319
|
-
* then expanded using GMSSRandom to get unique chain seeds.
|
|
320
|
-
*
|
|
321
|
-
* Matches WinternitzOTSignature.getPublicKey():
|
|
322
|
-
* int rounds = (1 << w) - 1; // 255 for w=8
|
|
323
|
-
* for (int i = 0; i < keysize; i++) {
|
|
324
|
-
* hashPrivateKeyBlock(i, rounds, buf, pos);
|
|
325
|
-
* }
|
|
326
|
-
* return H(buf);
|
|
327
|
-
*/
|
|
328
|
-
function derivePKdigest(seed, i, ps = (0, params_1.getParamSet)()) {
|
|
329
|
-
assert32(seed, 'seed');
|
|
330
|
-
// Derive unique seed for this key index
|
|
331
|
-
const indexedSeed = deriveIndexedSeed(seed, i);
|
|
332
|
-
// Expand indexed seed into private keys
|
|
333
|
-
const privateKeys = expandPrivateKey(indexedSeed, ps);
|
|
334
|
-
// Hash each chain 255 times to get chain tops
|
|
335
|
-
const rounds = ps.maxDigit; // 255
|
|
336
|
-
const buf = new Uint8Array(ps.L * 32);
|
|
337
|
-
for (let j = 0; j < ps.L; j++) {
|
|
338
|
-
const top = hashChain(privateKeys[j], rounds);
|
|
339
|
-
buf.set(top, j * 32);
|
|
340
|
-
}
|
|
341
|
-
// Return H(all chain tops)
|
|
342
|
-
return (0, exports.F)(buf);
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Derive full WOTS public key (L × 32 bytes) without final hash
|
|
346
|
-
*
|
|
347
|
-
* Returns the concatenation of all chain tops BEFORE hashing.
|
|
348
|
-
* Required by Minima's SignatureProof which expects the full public key.
|
|
349
|
-
*/
|
|
350
|
-
function deriveFullPublicKey(seed, i, ps = (0, params_1.getParamSet)()) {
|
|
351
|
-
assert32(seed, 'seed');
|
|
352
|
-
if (wotsDebugEnabled) {
|
|
353
|
-
wotsLogger.debug(`[deriveFullPublicKey] ========== PK DERIVATION START ==========`);
|
|
354
|
-
wotsLogger.debug(`[deriveFullPublicKey] Master seed: ${(0, exports.hex)(seed).substring(0, 32)}..., keyIndex: ${i}`);
|
|
355
|
-
}
|
|
356
|
-
// Derive unique seed for this key index
|
|
357
|
-
const indexedSeed = deriveIndexedSeed(seed, i);
|
|
358
|
-
if (wotsDebugEnabled) {
|
|
359
|
-
wotsLogger.debug(`[deriveFullPublicKey] Indexed seed: ${(0, exports.hex)(indexedSeed)}`);
|
|
360
|
-
}
|
|
361
|
-
const privateKeys = expandPrivateKey(indexedSeed, ps);
|
|
362
|
-
const rounds = ps.maxDigit; // 255
|
|
363
|
-
const buf = new Uint8Array(ps.L * 32);
|
|
364
|
-
for (let j = 0; j < ps.L; j++) {
|
|
365
|
-
const top = hashChain(privateKeys[j], rounds);
|
|
366
|
-
buf.set(top, j * 32);
|
|
367
|
-
// Log first few chain tops for debugging
|
|
368
|
-
if (wotsDebugEnabled && j < 3) {
|
|
369
|
-
wotsLogger.debug(`[deriveFullPublicKey] chain[${j}]: pk=${(0, exports.hex)(privateKeys[j]).substring(0, 16)}... rounds=${rounds} => top=${(0, exports.hex)(top).substring(0, 16)}...`);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
if (wotsDebugEnabled) {
|
|
373
|
-
wotsLogger.debug(`[deriveFullPublicKey] Full public key (${buf.length}B): ${(0, exports.hex)(buf).substring(0, 64)}...${(0, exports.hex)(buf).substring((0, exports.hex)(buf).length - 32)}`);
|
|
374
|
-
wotsLogger.debug(`[deriveFullPublicKey] ========== PK DERIVATION END ==========`);
|
|
375
|
-
}
|
|
376
|
-
return buf; // L * 32 = 1088 bytes
|
|
377
|
-
}
|
|
378
|
-
function wotsKeypairFromSeed(seed, index, paramSet) {
|
|
379
|
-
assert32(seed, 'seed');
|
|
380
|
-
const ps = paramSet || defaultParamSet;
|
|
381
|
-
const pkDigest = derivePKdigest(seed, index, ps);
|
|
382
|
-
return { seed, index, pk: pkDigest };
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Sign a message hash using WOTS
|
|
386
|
-
*
|
|
387
|
-
* Matches WinternitzOTSignature.getSignature() for w=8:
|
|
388
|
-
* for each digit d[i]:
|
|
389
|
-
* sig[i] = hash(privateKey[i], d[i] times)
|
|
390
|
-
*
|
|
391
|
-
* @returns Flat signature (L × 32 = 1088 bytes)
|
|
392
|
-
*/
|
|
393
|
-
function wotsSign(seed, i, msgHash, ps = (0, params_1.getParamSet)()) {
|
|
394
|
-
assert32(seed, 'seed');
|
|
395
|
-
assert32(msgHash, 'msgHash');
|
|
396
|
-
if (wotsDebugEnabled) {
|
|
397
|
-
wotsLogger.debug(`[wotsSign] ========== WOTS SIGN START ==========`);
|
|
398
|
-
wotsLogger.debug(`[wotsSign] Master seed: ${(0, exports.hex)(seed)}`);
|
|
399
|
-
wotsLogger.debug(`[wotsSign] Key index: ${i}`);
|
|
400
|
-
wotsLogger.debug(`[wotsSign] Message hash: ${(0, exports.hex)(msgHash)}`);
|
|
401
|
-
}
|
|
402
|
-
// Derive unique seed for this key index
|
|
403
|
-
const indexedSeed = deriveIndexedSeed(seed, i);
|
|
404
|
-
if (wotsDebugEnabled) {
|
|
405
|
-
wotsLogger.debug(`[wotsSign] Indexed seed (after deriveIndexedSeed): ${(0, exports.hex)(indexedSeed)}`);
|
|
406
|
-
}
|
|
407
|
-
const privateKeys = expandPrivateKey(indexedSeed, ps);
|
|
408
|
-
// CRITICAL: Hash the message internally to match Java/BouncyCastle Winternitz behavior
|
|
409
|
-
// Java's WinternitzOTSignature.getSignature() always hashes the message first
|
|
410
|
-
const hashedMsg = (0, exports.F)(msgHash);
|
|
411
|
-
const { digits, checksumDigits } = toWinternitzDigits(hashedMsg, ps);
|
|
412
|
-
const allDigits = digits.concat(checksumDigits);
|
|
413
|
-
if (allDigits.length !== ps.L) {
|
|
414
|
-
throw new Error(`Digit length mismatch: got ${allDigits.length}, want ${ps.L}`);
|
|
415
|
-
}
|
|
416
|
-
if (wotsDebugEnabled) {
|
|
417
|
-
wotsLogger.debug(`[wotsSign] All ${allDigits.length} digits: [${allDigits.join(', ')}]`);
|
|
418
|
-
}
|
|
419
|
-
const out = new Uint8Array(ps.L * 32);
|
|
420
|
-
for (let j = 0; j < ps.L; j++) {
|
|
421
|
-
const rounds = allDigits[j];
|
|
422
|
-
const sigPart = hashChain(privateKeys[j], rounds);
|
|
423
|
-
out.set(sigPart, j * 32);
|
|
424
|
-
// Log first few and last signature chains for debugging
|
|
425
|
-
if (wotsDebugEnabled && (j < 3 || j >= ps.L - 2)) {
|
|
426
|
-
wotsLogger.debug(`[wotsSign] chain[${j}]: pk=${(0, exports.hex)(privateKeys[j]).substring(0, 16)}... rounds=${rounds} => sig=${(0, exports.hex)(sigPart).substring(0, 16)}...`);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
if (wotsDebugEnabled) {
|
|
430
|
-
wotsLogger.debug(`[wotsSign] Signature output (${out.length} bytes): ${(0, exports.hex)(out).substring(0, 64)}...${(0, exports.hex)(out).substring((0, exports.hex)(out).length - 64)}`);
|
|
431
|
-
wotsLogger.debug(`[wotsSign] ========== WOTS SIGN END ==========`);
|
|
432
|
-
}
|
|
433
|
-
return out;
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* Legacy wrapper returning structured signature
|
|
437
|
-
*/
|
|
438
|
-
function wotsSignLegacy(msgHash, seed, index, paramSet) {
|
|
439
|
-
const ps = paramSet || (0, params_1.getParamSet)();
|
|
440
|
-
const sig = wotsSign(seed, index, msgHash, ps);
|
|
441
|
-
const chunks = [];
|
|
442
|
-
for (let i = 0; i < ps.L; i++) {
|
|
443
|
-
chunks.push(sig.subarray(i * 32, (i + 1) * 32));
|
|
444
|
-
}
|
|
445
|
-
return { index, w: ps.w, sig: chunks };
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Recover public key from signature
|
|
449
|
-
*
|
|
450
|
-
* Matches WinternitzOTSVerify.Verify():
|
|
451
|
-
* 1. Hash the message: hashedMsg = SHA3-256(message)
|
|
452
|
-
* 2. for each digit d[i]:
|
|
453
|
-
* top[i] = hash(sig[i], (255 - d[i]) times)
|
|
454
|
-
* 3. return H(concat(tops))
|
|
455
|
-
*
|
|
456
|
-
* CRITICAL: This function hashes the message internally to match Java/BouncyCastle
|
|
457
|
-
* Winternitz behavior. Both wotsSign and wotsPkFromSig hash internally for parity.
|
|
458
|
-
*/
|
|
459
|
-
function wotsPkFromSig(message, signature, paramSet) {
|
|
460
|
-
const ps = paramSet || defaultParamSet;
|
|
461
|
-
// CRITICAL: Hash the message internally to match Java/BouncyCastle Winternitz behavior
|
|
462
|
-
const hashedMsg = (0, exports.F)(message);
|
|
463
|
-
const allDigits = baseWWithChecksum(hashedMsg, ps);
|
|
464
|
-
if (signature.sig.length !== ps.L) {
|
|
465
|
-
throw new Error(`Wrong signature length: expected ${ps.L}, got ${signature.sig.length}`);
|
|
466
|
-
}
|
|
467
|
-
const buf = new Uint8Array(ps.L * 32);
|
|
468
|
-
for (let i = 0; i < ps.L; i++) {
|
|
469
|
-
const stepsUp = ps.maxDigit - allDigits[i]; // 255 - d[i]
|
|
470
|
-
const top = hashChain(signature.sig[i], stepsUp);
|
|
471
|
-
buf.set(top, i * 32);
|
|
472
|
-
}
|
|
473
|
-
return (0, exports.F)(buf);
|
|
474
|
-
}
|
|
475
|
-
/**
|
|
476
|
-
* Verify WOTS signature against a FULL 1088-byte public key
|
|
477
|
-
*
|
|
478
|
-
* Matches Java's Winternitz.verify():
|
|
479
|
-
* 1. Recover FULL public key from signature using the msgHash (1088 bytes)
|
|
480
|
-
* 2. Compare FULL reconstructed key to expected FULL public key
|
|
481
|
-
*
|
|
482
|
-
* CRITICAL: Java's Winternitz.verify() compares the FULL 1088-byte reconstructed
|
|
483
|
-
* public key against the FULL 1088-byte stored public key, NOT a 32-byte digest!
|
|
484
|
-
*
|
|
485
|
-
* IMPORTANT: This function expects a PRE-HASHED message (32-byte digest),
|
|
486
|
-
* just like wotsSign. The caller should hash the message before passing it.
|
|
487
|
-
*
|
|
488
|
-
* @param sig - The 1088-byte WOTS signature
|
|
489
|
-
* @param msgHash - The pre-hashed message (32-byte digest)
|
|
490
|
-
* @param pkFull - The FULL 1088-byte WOTS public key (L=34 × 32 bytes)
|
|
491
|
-
* @param ps - WOTS parameter set (default: minima)
|
|
492
|
-
*/
|
|
493
|
-
function wotsVerify(sig, message, pkFull, ps = (0, params_1.getParamSet)()) {
|
|
494
|
-
// CRITICAL: Java verifies against FULL 1088-byte public key, not 32-byte digest
|
|
495
|
-
const expectedLen = ps.L * 32;
|
|
496
|
-
if (pkFull.length !== expectedLen) {
|
|
497
|
-
throw new Error(`pkFull must be exactly ${expectedLen} bytes (L=${ps.L} × 32); got ${pkFull.length}`);
|
|
498
|
-
}
|
|
499
|
-
if (sig.length !== expectedLen) {
|
|
500
|
-
return false;
|
|
501
|
-
}
|
|
502
|
-
// CRITICAL: Hash the message internally to match Java/BouncyCastle Winternitz behavior
|
|
503
|
-
const hashedMsg = (0, exports.F)(message);
|
|
504
|
-
const allDigits = baseWWithChecksum(hashedMsg, ps);
|
|
505
|
-
const buf = new Uint8Array(expectedLen);
|
|
506
|
-
for (let j = 0; j < ps.L; j++) {
|
|
507
|
-
const sigPart = sig.subarray(j * 32, (j + 1) * 32);
|
|
508
|
-
const stepsUp = ps.maxDigit - allDigits[j];
|
|
509
|
-
const top = hashChain(sigPart, stepsUp);
|
|
510
|
-
buf.set(top, j * 32);
|
|
511
|
-
}
|
|
512
|
-
// Compare FULL 1088-byte reconstructed key to expected FULL public key
|
|
513
|
-
// This matches Java: resp.isEqual(zPublicKey) where both are 1088 bytes
|
|
514
|
-
if (buf.length !== pkFull.length) return false;
|
|
515
|
-
let diff = 0;
|
|
516
|
-
for (let i = 0; i < buf.length; i++) diff |= buf[i] ^ pkFull[i];
|
|
517
|
-
return diff === 0;
|
|
518
|
-
}
|
|
519
|
-
/**
|
|
520
|
-
* Legacy verify function that accepts a 32-byte digest
|
|
521
|
-
* @deprecated Use wotsVerify with full 1088-byte public key instead
|
|
522
|
-
*/
|
|
523
|
-
function wotsVerifyDigest(sig, message, pkDigest, ps = (0, params_1.getParamSet)()) {
|
|
524
|
-
assert32(pkDigest, 'pkDigest');
|
|
525
|
-
const expectedLen = ps.L * 32;
|
|
526
|
-
if (sig.length !== expectedLen) {
|
|
527
|
-
return false;
|
|
528
|
-
}
|
|
529
|
-
const msgHash = (0, exports.F)(message);
|
|
530
|
-
const allDigits = baseWWithChecksum(msgHash, ps);
|
|
531
|
-
const buf = new Uint8Array(expectedLen);
|
|
532
|
-
for (let j = 0; j < ps.L; j++) {
|
|
533
|
-
const sigPart = sig.subarray(j * 32, (j + 1) * 32);
|
|
534
|
-
const stepsUp = ps.maxDigit - allDigits[j];
|
|
535
|
-
const top = hashChain(sigPart, stepsUp);
|
|
536
|
-
buf.set(top, j * 32);
|
|
537
|
-
}
|
|
538
|
-
const recomputed = (0, exports.F)(buf);
|
|
539
|
-
if (recomputed.length !== pkDigest.length) return false;
|
|
540
|
-
let diff = 0;
|
|
541
|
-
for (let i = 0; i < recomputed.length; i++) diff |= recomputed[i] ^ pkDigest[i];
|
|
542
|
-
return diff === 0;
|
|
543
|
-
}
|
|
544
|
-
/**
|
|
545
|
-
* Generate WOTS public key from seed (convenience wrapper)
|
|
546
|
-
*/
|
|
547
|
-
function wotsPublicKeyFromSeed(seed, index = 0, paramSet) {
|
|
548
|
-
assert32(seed, 'seed');
|
|
549
|
-
const keypair = wotsKeypairFromSeed(seed, index, paramSet);
|
|
550
|
-
return keypair.pk;
|
|
551
|
-
}
|
|
552
|
-
// === Legacy compatibility exports ===
|
|
553
|
-
// These are kept for backwards compatibility but use the BC-compatible implementation
|
|
554
|
-
/**
|
|
555
|
-
* @deprecated Use expandPrivateKey instead
|
|
556
|
-
*/
|
|
557
|
-
function prfChainSeed(seed, i, j, _paramSet) {
|
|
558
|
-
// This function no longer makes sense with stateful PRNG
|
|
559
|
-
// For compatibility, derive the j-th chain seed for key i
|
|
560
|
-
const privateKeys = expandPrivateKey(seed, _paramSet);
|
|
561
|
-
if (j >= privateKeys.length) {
|
|
562
|
-
throw new Error(`Chain index ${j} out of range (max ${privateKeys.length - 1})`);
|
|
563
|
-
}
|
|
564
|
-
return privateKeys[j];
|
|
565
|
-
}
|
package/src/wots.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wots.js","sourceRoot":"","sources":["wots.ts"],"names":[],"mappings":"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"}
|