hc_seed_bundle 0.2.3

SeedBundle parsing and generation library.
Documentation
# hc_seed_bundle

SeedBundle parsing and generation library.

[![Project](https://img.shields.io/badge/project-holochain-blue.svg?style=flat-square)](http://holochain.org/)
[![Forum](https://img.shields.io/badge/chat-forum%2eholochain%2enet-blue.svg?style=flat-square)](https://forum.holochain.org)
[![Chat](https://img.shields.io/badge/chat-chat%2eholochain%2enet-blue.svg?style=flat-square)](https://chat.holochain.org)

[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![License: Apache-2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)

#### Links

- [Git Repo - https://github.com/holochain/lair]https://github.com/holochain/lair
- [API Documentation - https://docs.rs/hc_seed_bundle]https://docs.rs/hc_seed_bundle
- [Javascript Implementation - https://holochain.github.io/hcSeedBundle/]https://holochain.github.io/hcSeedBundle/

#### Rationale

- Applications like Holochain have different requirements than classic
blockchain systems in terms of key management. Namely there is no need
for read-only or hardened wallets (Holochain handles these concepts
through capabilities and membranes).
- Applications like Holochain still have need of hierarchy and determinism
in key (or in this case seed) derivation.
- Since we're using libsodium for hashing, signature, and encryption
algorithms, let's use it for derivation as well.
- To be psychologically compatible with the
[Bitcoin "HD Wallet" spec]https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki,
we will do away with the "context" part of sodium KDF by always setting
it to `b"SeedBndl"` and focusing on the `subkey_id` and can declare a
chain of subsequent derivations of a 32 byte seed in the form
`m/68/1/65/8` where we apply `subkey_id`s 68, 1, 65, then 8 in turn.

#### hcSeedBundle Encoding Spec

Encoded in [MSGPACK](https://msgpack.org/index.html) binary format.

To better facilitate rust/javascript interoperability, the rust library
will treat msgpack "ext" types as binary data.

##### SeedBundle

```
// seed_bundle is a top-level array
'seed_bundle':array [
  // literal 'hcsb0' version / heuristic marker
  'id_ver':str,

  // list of SeedCiphers define how to decrypt
  'cipher_list':array [
    'cipher_1':SeedCipher,
    'cipher_2':SeedCipher,
    // ..
    'cipher_N':SeedCipher,
  ],

  // associated application data
  'app_data':bin,
]
```

##### SeedCipher::PwHash

```
// the PwHash type SeedCipher defines a straight-forward
// pwhash secret that is use to secretstream encrypt a seed
'seed_cipher':array [
  // literal 'pw' indicates the pw hash cipher type
  'type':str,

  // argon2id 16 byte salt
  'salt':bin,

  // argon2id mem limit capped to u32 for js compatibility
  'mem_limit':int,

  // argon2id ops limit capped to u32 for js compatibility
  'ops_limit':int,

  // secretstream 24 byte header
  'header':bin,

  // secretstream 49 byte cipher
  'cipher':bin,
]
```

##### SeedCipher::SecurityQuestions

```
// Security Questions SeedCipher defines a pwhash cipher
// based on concatonating 3 answers that are lcased/trimmed
'seed_cipher':array [
  // literal 'qa' indicates the security question cipher type
  'type':str,

  // argon2id 16 byte salt
  'salt':bin,

  // argon2id mem limit capped to u32 for js compatibility
  'mem_limit':int,

  // argon2id ops limit capped to u32 for js compatibility
  'ops_limit':int,

  // the first security question to be answered
  'question_1':str,

  // the second security question to be answered
  'question_2':str,

  // the third security question to be answered
  'question_3':str,

  // secretstream 24 byte header
  'header':bin,

  // secretstream 49 byte cipher
  'cipher':bin,
]
```

#### Algorithms

- `sodium_kdf32` - seed derivation
  - set to output 32 bytes (`[32 byte sub-seed]`)
  - context bytes - fixed `b"SeedBndl"`
  - subkey_id clamped to u32 to better support javascript
- `argon2id32` - generates secret for seed secretstream encryption
  - set to output 32 bytes (`[32 secret bytes]`)
  - salt: `[16 salt bytes from bundle]`
  - mem_limit: default `MODERATE`
  - ops_limit: default `MODERATE`
  - passphrase: user-supplied
- `secretstream_xchacha20poly1305`
  - single `push_final/pull_final` with entire contents

License: MIT OR Apache-2.0