const derive = (prv, api) => {
const prv8 = new Uint8Array(prv.match(/.{2}/g).map(b => parseInt(b, 16)))
switch (api) {
- case 'nano25519': {
+ case 'nano25519':
+ case 'nano25519 with bulk block verification': {
const pub8 = nano25519.derive(prv8)
return [...pub8].map(b => b.toString(16).padStart(2, '0')).join('')
}
const pub8 = new Uint8Array(pub.match(/.{2}/g).map(b => parseInt(b, 16)))
const sk8 = new Uint8Array((prv + pub).match(/.{2}/g).map(b => parseInt(b, 16)))
switch (api) {
- case 'nano25519': {
+ case 'nano25519':
+ case 'nano25519 with bulk block verification': {
const sig8 = nano25519.sign(msg8, prv8, pub8)
return [...sig8].map(b => b.toString(16).padStart(2, '0')).join('')
}
case 'nano25519': {
return nano25519.verify(sig8, msg8, pub8)
}
+ case 'nano25519 with bulk block verification': {
+ const blocks = []
+ for (let i = 0; i < 256; i++) blocks[i] = { hash: msg8, signature: sig8 }
+ const verified = nano25519.verify_blocks(pub8, blocks)
+ return verified.every(v => v === true)
+ }
case 'NanocurrencyWeb': {
return NanocurrencyWeb.tools.verify(pub, sig, msg)
}
}
end = performance.now()
duration = end - start
+ duration /= (api === 'nano25519 with bulk block verification') ? 256 : 1
verifyTimes[i].push(duration)
} catch (err) {
document.getElementById('output').innerHTML += `Error: ${err.message}<br/>`
<label for="api">API</label>
<select id="api">
<option>nano25519</option>
+ <option>nano25519 with bulk block verification</option>
<option>NanocurrencyWeb</option>
<option>Sodium</option>
<option>TweetNaCl.js</option>