up8-ticket

0.2.0 • Public • Published

up8-ticket

Build Status License: MIT npm

Securely generate UP8-compatible, @q-encoded master tickets. Split and combine tickets via a k/n Shamir's Secret Sharing scheme.

If you plan on generating a master ticket for a galaxy wallet, for example, you might want to use gen_ticket_drbg(384) to generate the ticket, and then shard(.., 5, 3) to split it into five shares (any three of which can be used to recover it).

Install

Grab it from npm like so:

npm install up8-ticket

To include in your node project, use:

const up8 = require('up8-ticket')

To use in the browser, you can use e.g. rollup and the rollup-plugin-node-resolve plugin, and specify the following in your rollup.config.js or similar:

plugins: [
  ..,
  resolve({
    browser: true,
  }),
  ..
]

Examples

Boot a node repl with async/await support and require the library like so:

$ node --experimental-repl-await
Welcome to Node.js v12.18.3.
Type ".help" for more information.
> const up8 = require('up8-ticket')

gen_ticket_simple

Generate a 256-bit master ticket via a simple CSPRNG (crypto or window.crypto):

> up8.gen_ticket_simple(256)
'~mactug-digbyn-malnyr-tobset-solfyr-dozner-dolpen-barsum-locfur-pagduc-danseb-timlug-savwyn-latmug-disdyr-laddeg'

You can add your own entropy (generated elsewhere) by passing it in the second argument as a Buffer. It will simply be XOR'd with the random bytes produced internally:

> up8.gen_ticket_simple(256, Buffer.from("a very random string"))
'~donryd-mallur-wanrex-fidrex-nidwyt-dildul-padryd-talfen-panneb-nocbep-norwep-mispel-ralryc-fiddun-tomsup-toltex'

gen_ticket_more

Do the same thing, but also use more-entropy to produce additional entropy when generating the ticket. Note that it returns a Promise (and takes a little longer):

> await up8.gen_ticket_more(256)
'~morten-davnys-ronpes-hidtyd-pittev-donsug-fonpel-sornet-wacmeb-harbyl-monduc-linmur-racled-namdec-tildul-palmyn'

You can similarly pass your own entropy in as an additional Buffer here:

> let ticket = await up8.gen_ticket_more(256, Buffer.from('muh entropy'))
'~rivmer-ticnyd-mirfet-rolbyt-tarlus-ricrun-fitmec-losrul-barhep-misfet-pidfen-foshep-ronrem-natlyx-tarlet-sipdeb'

gen_ticket_drbg

Do the same thing, but use a HMAC-DRBG function to combine the entropy produced by the underlying CSPRNG and more-entropy. Like gen_ticket_more, it returns a Promise, and takes longer.

Note that you must use at least 192 bits of entropy for this method.

> await up8.gen_ticket_drbg(256)
'~morten-davnys-ronpes-hidtyd-pittev-donsug-fonpel-sornet-wacmeb-harbyl-monduc-linmur-racled-namdec-tildul-palmyn'

As with the other functions, you can pass your own entropy in as an additional Buffer:

> let ticket = await up8.gen_ticket_drbg(384, Buffer.from('a personalization string'))
'~siller-hopryc-ripfyn-laglec-linpur-mogpun-poldux-bicmul-radnum-dapnup-monnub-dilwex-pacrym-samrup-ragryc-samdyt-timdys-hartul-lonrun-posmev-molrum-miclur-doznus-fasnut'

shard

Split a ticket into 'shards' using a k/n Shamir's Secret Sharing scheme. Specify the number of shards to create and the number of shards required to reassemble the original ticket, along with the ticket itself:

> let ticket = await up8.gen_ticket_drbg(384)
> let shards = up8.shard(ticket, 3, 2)
> shards
[
  '~fidnec-topmud-pansul-lacbex-pinlet-finset-sonnyl-dovlud-sibdys-firtyd-walbep-ronlex-harmul-ligmeg-firryg-pidruc-masnup-havlud-tiplup-filrys-walsul-wicrum-narsem-mopdux-hilnev-raglun-doztep-picwes-dotten-micnyr-difwyt-donlys-lorref',
  '~fidbud-rabtel-hapwyn-sander-napwyl-hosnys-savrud-hobsyl-silmev-lonfen-darlup-sopper-mitled-radpeg-diswen-laslun-toglud-sonsun-fopfex-docwyd-botneb-tilfur-rovhes-nollep-hatwer-nimpun-ladmel-borpun-bollep-finluc-noprun-hopmun-dovnul',
  '~fidwes-witdur-nilbet-dolmug-pitpen-bacpyx-talrut-hanren-soltul-micdev-havneb-mildef-dilnec-bosdes-todsud-dopnex-rittyc-taplur-labrux-mogmun-togpeg-lagnel-tonweb-pidtyd-sablyn-sibsyx-linfex-lapteg-nolber-dovwel-nibteg-molsyd-macpec'
]

combine

Combine shards created via shard. Pass in at least the required number of shards as an array, with elements in any order:

> up8.combine(shards.slice(0, 2)) === ticket
true
> up8.combine(shards.slice(1, 3)) === ticket
true
> up8.combine([shards[0], shards[2]]) === ticket
true
> up8.combine(shards) === ticket
true

Readme

Keywords

Package Sidebar

Install

npm i up8-ticket

Weekly Downloads

7

Version

0.2.0

License

MIT

Unpacked Size

1.05 MB

Total Files

7

Last publish

Collaborators

  • jaredtobin