├── .gitignore ├── LICENSE ├── README.md ├── example.js ├── index.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | sandbox.js 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Mathias Buus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # derived-key-storage 2 | 3 | Derive a key and secret key file from a name. 4 | 5 | ``` 6 | npm install derived-key-storage 7 | ``` 8 | 9 | ## Usage 10 | 11 | ``` js 12 | const derivedStorage = require('derived-key-storage') 13 | const raf = require('random-access-file') 14 | 15 | const { key, secretKey } = derivedStorage(name => raf(name), (name, cb) => { 16 | // derive your keypair here ... 17 | // if name is null, this keypair is fresh, otherwise derive from that name 18 | // you can optionally return a secret key without a name, and that will be stored instead. 19 | cb(null, { 20 | name, 21 | publicKey, 22 | secretKey 23 | }) 24 | }) 25 | 26 | key.read(0, 32, (err, buf) => { 27 | console.log('public key is', err, buf) 28 | }) 29 | ``` 30 | 31 | ## API 32 | 33 | #### `{ key, secretKey } = derivedStorage(storage, deriver)` 34 | 35 | Create a new key pair instance. Returns two random-access-storage instances, one for the public key and one for the secret key. 36 | The storage function you pass in will be used to store the name of the keypair. The deriver function should look like this: 37 | 38 | ``` 39 | function (name, cb) { 40 | cb(null, { 41 | name, 42 | publicKey, 43 | secretKey 44 | }) 45 | } 46 | ``` 47 | 48 | Where `name` is a buffer or null containing the name of the keypair. If the name is null you need to return the name of the keypair 49 | back to the callback as it still will be written along with a length prefix to the storage you pass in. 50 | 51 | If you do not with to derive your secret key from a name, you can override the derivation by returning a secret key and a `null` 52 | name from this function. 53 | 54 | ## License 55 | 56 | MIT 57 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | const raf = require('random-access-file') 2 | const hypercore = require('hypercore') 3 | const hypercoreCrypto = require('hypercore-crypto') 4 | const derive = require('derive-key') 5 | const derivedStorage = require('.') 6 | 7 | const masterKey = Buffer.alloc(32) 8 | 9 | const storage = name => raf(name, { directory: './tmp' }) 10 | const { key, secretKey } = derivedStorage(storage, (name, cb) => { 11 | console.log('name:', name) 12 | if (!name) name = hypercoreCrypto.randomBytes(32) 13 | const seed = derive('hypercore', masterKey, name) 14 | const { publicKey, secretKey } = hypercoreCrypto.keyPair(seed) 15 | return cb(null, { name, publicKey, secretKey }) 16 | }) 17 | 18 | const core = hypercore(p => { 19 | if (p === 'key') return key 20 | if (p === 'secret') return secretKey 21 | return storage(p) 22 | }) 23 | core.on('ready', () => console.log('ready')) 24 | core.on('error', (err) => console.log('error', err)) 25 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const RAS = require('random-access-storage') 2 | const thunky = require('thunky') 3 | const varint = require('varint') 4 | 5 | module.exports = keyPair 6 | 7 | function keyPair (storage, derive) { 8 | const keyStorage = storage('key') 9 | const nameStorage = storage('name') 10 | const secretKeyStorage = storage('secret_key') 11 | 12 | const load = thunky(function (cb) { 13 | keyStorage.read(0, 32, (err, key) => { 14 | if (err) return createNew() 15 | readName((err, name) => { 16 | if (err) return cb(err) 17 | if (name) return derive(name, cb) 18 | secretKeyStorage.read(0, 64, (err, secretKey) => { 19 | if (err) return cb(null, { publicKey: key, secretKey: null, name: null }) 20 | return cb(null, { publicKey: key, secretKey, name: null }) 21 | }) 22 | }) 23 | }) 24 | 25 | function readName (cb) { 26 | nameStorage.stat((err, st) => { 27 | if (err) return cb(null, null) 28 | if (st.size < 2) return cb(null, null) 29 | 30 | nameStorage.read(0, st.size, (err, buf) => { 31 | if (err) return cb(err, null) 32 | let len = 0 33 | 34 | try { 35 | len = varint.decode(buf, 0) 36 | } catch (err) { 37 | return cb(null, null) 38 | } 39 | 40 | const offset = varint.decode.bytes 41 | if (offset + len !== buf.length) return cb(null, null) 42 | const name = buf.slice(offset) 43 | return cb(null, name) 44 | }) 45 | }) 46 | } 47 | 48 | function writeName (name, cb) { 49 | if (!name) return cb(null) 50 | const buf = Buffer.allocUnsafe(varint.encodingLength(name.length) + name.length) 51 | varint.encode(name.length, buf, 0) 52 | name.copy(buf, varint.encode.bytes) 53 | nameStorage.write(0, buf, cb) 54 | } 55 | 56 | function createNew () { 57 | derive(null, (err, res) => { 58 | if (err) return cb(err) 59 | keyStorage.write(0, res.publicKey, err => { 60 | if (err) return cb(err) 61 | if (res.name) return writeName(res.name, done) 62 | else if (res.secretKey) return secretKeyStorage.write(0, res.secretKey, done) 63 | else return done(new Error('The derivation function did not provide a name or a secret key.')) 64 | }) 65 | 66 | function done (err) { 67 | if (err) return cb(err) 68 | return cb(null, res) 69 | } 70 | }) 71 | } 72 | }) 73 | 74 | const key = new RAS({ 75 | stat (req) { 76 | load((err, res) => { 77 | if (err) return req.callback(err) 78 | req.callback(null, { size: 32 }) 79 | }) 80 | }, 81 | read (req) { 82 | load((err, res) => { 83 | if (err) return req.callback(err) 84 | req.callback(null, res.publicKey) 85 | }) 86 | }, 87 | close (req) { 88 | keyStorage.close(err => req.callback(err)) 89 | } 90 | }) 91 | 92 | const secretKey = new RAS({ 93 | stat (req) { 94 | load((err, res) => { 95 | if (err) return req.callback(err) 96 | if (!res.secretKey) return req.callback(new Error('No secret key.')) 97 | req.callback(null, { size: 64 }) 98 | }) 99 | }, 100 | read (req) { 101 | load((err, res) => { 102 | if (err) return req.callback(err) 103 | if (!res.secretKey) return req.callback(new Error('No secret key.')) 104 | req.callback(null, res.secretKey) 105 | }) 106 | }, 107 | close (req) { 108 | nameStorage.close(err => req.callback(err)) 109 | } 110 | }) 111 | 112 | return { key, secretKey } 113 | } 114 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "derived-key-storage", 3 | "version": "2.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "array-lru": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/array-lru/-/array-lru-1.1.1.tgz", 10 | "integrity": "sha1-DH4bTgIq4Wb/HoRIxZXzGB/NMzc=", 11 | "dev": true 12 | }, 13 | "atomic-batcher": { 14 | "version": "1.0.2", 15 | "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", 16 | "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=", 17 | "dev": true 18 | }, 19 | "bitfield-rle": { 20 | "version": "2.2.1", 21 | "resolved": "https://registry.npmjs.org/bitfield-rle/-/bitfield-rle-2.2.1.tgz", 22 | "integrity": "sha512-wrDhHe7LUkqaytxgbsFXoemzHRv6e8FrVNWWsQCgUfmuVYW6ke44hoGc9VdpjgfIsJ/ejmCFA8wDtDqACNAvyw==", 23 | "dev": true, 24 | "requires": { 25 | "buffer-alloc-unsafe": "^1.1.0", 26 | "varint": "^4.0.0" 27 | }, 28 | "dependencies": { 29 | "varint": { 30 | "version": "4.0.1", 31 | "resolved": "https://registry.npmjs.org/varint/-/varint-4.0.1.tgz", 32 | "integrity": "sha1-SQgpuULSSEY7KzUJeZXDv3NxmOk=", 33 | "dev": true 34 | } 35 | } 36 | }, 37 | "blake2b": { 38 | "version": "2.1.3", 39 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", 40 | "integrity": "sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==", 41 | "dev": true, 42 | "requires": { 43 | "blake2b-wasm": "^1.1.0", 44 | "nanoassert": "^1.0.0" 45 | } 46 | }, 47 | "blake2b-wasm": { 48 | "version": "1.1.7", 49 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", 50 | "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", 51 | "dev": true, 52 | "requires": { 53 | "nanoassert": "^1.0.0" 54 | } 55 | }, 56 | "buffer-alloc": { 57 | "version": "1.2.0", 58 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 59 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 60 | "dev": true, 61 | "requires": { 62 | "buffer-alloc-unsafe": "^1.1.0", 63 | "buffer-fill": "^1.0.0" 64 | } 65 | }, 66 | "buffer-alloc-unsafe": { 67 | "version": "1.1.0", 68 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 69 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", 70 | "dev": true 71 | }, 72 | "buffer-fill": { 73 | "version": "1.0.0", 74 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 75 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", 76 | "dev": true 77 | }, 78 | "buffer-from": { 79 | "version": "1.1.1", 80 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 81 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 82 | "dev": true 83 | }, 84 | "bulk-write-stream": { 85 | "version": "1.1.4", 86 | "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-1.1.4.tgz", 87 | "integrity": "sha512-GtKwd/4etuk1hNeprXoESBO1RSeRYJMXKf+O0qHmWdUomLT8ysNEfX/4bZFXr3BK6eukpHiEnhY2uMtEHDM2ng==", 88 | "dev": true, 89 | "requires": { 90 | "buffer-from": "^1.0.0", 91 | "inherits": "^2.0.1", 92 | "readable-stream": "^2.1.4" 93 | } 94 | }, 95 | "codecs": { 96 | "version": "2.0.0", 97 | "resolved": "https://registry.npmjs.org/codecs/-/codecs-2.0.0.tgz", 98 | "integrity": "sha512-WXvpJRAgc693oqYvZte9uYEiL5YHtfrxyEq12uVny9oBJ1k37zSva5vVz7trsnt6R9Y15hEgOSC7VFZT2pfYnA==", 99 | "dev": true 100 | }, 101 | "core-util-is": { 102 | "version": "1.0.2", 103 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 104 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 105 | "dev": true 106 | }, 107 | "count-trailing-zeros": { 108 | "version": "1.0.1", 109 | "resolved": "https://registry.npmjs.org/count-trailing-zeros/-/count-trailing-zeros-1.0.1.tgz", 110 | "integrity": "sha1-q6bFgzvkENRbHso+bVg4RM5oLHc=", 111 | "dev": true 112 | }, 113 | "derive-key": { 114 | "version": "1.0.0", 115 | "resolved": "https://registry.npmjs.org/derive-key/-/derive-key-1.0.0.tgz", 116 | "integrity": "sha512-q9PUocwaEFEC8roslBrCF/sSOUMs9iuOnTckTKL8hEPchogQUcBlFPO4k+cd/nx3CIYN0fIV9k4OGJSmkv+hAA==", 117 | "dev": true, 118 | "requires": { 119 | "sodium-universal": "^2.0.0" 120 | } 121 | }, 122 | "fast-bitfield": { 123 | "version": "1.2.2", 124 | "resolved": "https://registry.npmjs.org/fast-bitfield/-/fast-bitfield-1.2.2.tgz", 125 | "integrity": "sha512-t8HYqkuE3YEqNcyWlAfh55479aTxO+GpYwvQvJppYqyBfSmRdNIhzY2m09FKN/MENTzq4wH6heHOIvsPyMAwvQ==", 126 | "dev": true, 127 | "requires": { 128 | "count-trailing-zeros": "^1.0.1" 129 | } 130 | }, 131 | "fd-lock": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/fd-lock/-/fd-lock-1.0.2.tgz", 134 | "integrity": "sha512-8O4zSv6rlNNghVfzVkj/p7LUIeBm7Xxk6QnhfmR1WJm/W4kwS8IyShy4X1peRnFUYZUYLlcwEMKXF8QWxJCMvg==", 135 | "dev": true, 136 | "optional": true, 137 | "requires": { 138 | "napi-macros": "^1.8.2", 139 | "node-gyp-build": "^3.8.0" 140 | }, 141 | "dependencies": { 142 | "node-gyp-build": { 143 | "version": "3.9.0", 144 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", 145 | "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", 146 | "dev": true, 147 | "optional": true 148 | } 149 | } 150 | }, 151 | "flat-tree": { 152 | "version": "1.6.0", 153 | "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.6.0.tgz", 154 | "integrity": "sha1-/KMM3bkAb7ZW6168ea6ydOf96e0=", 155 | "dev": true 156 | }, 157 | "from2": { 158 | "version": "2.3.0", 159 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 160 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 161 | "dev": true, 162 | "requires": { 163 | "inherits": "^2.0.1", 164 | "readable-stream": "^2.0.0" 165 | } 166 | }, 167 | "hypercore": { 168 | "version": "7.6.1", 169 | "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-7.6.1.tgz", 170 | "integrity": "sha512-ZQ1HdFXa9D5cSwXiu6vldYSE5ro6OBtyWdnFr8L/U3PFDCEpIyhyLvoRTscmP+7U2U9ZYSV3NoNHjWlNPIA8Gw==", 171 | "dev": true, 172 | "requires": { 173 | "array-lru": "^1.1.0", 174 | "atomic-batcher": "^1.0.2", 175 | "bitfield-rle": "^2.2.1", 176 | "bulk-write-stream": "^1.1.3", 177 | "codecs": "^2.0.0", 178 | "fast-bitfield": "^1.2.2", 179 | "fd-lock": "^1.0.2", 180 | "flat-tree": "^1.6.0", 181 | "from2": "^2.3.0", 182 | "hypercore-crypto": "^1.0.0", 183 | "hypercore-protocol": "^6.5.0", 184 | "inherits": "^2.0.3", 185 | "inspect-custom-symbol": "^1.1.0", 186 | "last-one-wins": "^1.0.4", 187 | "memory-pager": "^1.0.2", 188 | "merkle-tree-stream": "^3.0.3", 189 | "pretty-hash": "^1.0.1", 190 | "random-access-file": "^2.1.0", 191 | "sodium-universal": "^2.0.0", 192 | "sparse-bitfield": "^3.0.0", 193 | "thunky": "^1.0.1", 194 | "uint64be": "^2.0.1", 195 | "unordered-array-remove": "^1.0.2", 196 | "unordered-set": "^2.0.0" 197 | } 198 | }, 199 | "hypercore-crypto": { 200 | "version": "1.0.0", 201 | "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-1.0.0.tgz", 202 | "integrity": "sha512-xFwOnNlOt8L+SovC7dTNchKaNYJb5l8rKZZwpWQnCme1r7CU4Hlhp1RDqPES6b0OpS7DkTo9iU0GltQGkpsjMw==", 203 | "dev": true, 204 | "requires": { 205 | "buffer-alloc-unsafe": "^1.1.0", 206 | "buffer-from": "^1.1.0", 207 | "sodium-universal": "^2.0.0", 208 | "uint64be": "^2.0.2" 209 | } 210 | }, 211 | "hypercore-protocol": { 212 | "version": "6.12.0", 213 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-6.12.0.tgz", 214 | "integrity": "sha512-T3oy9/7QFejqJX2RGcCUU1944e5/eKbLlSz9JPTNN1QbYFJgat/r7eTyOO8SMSLUimUmQx6YBMKhgYbdKzp7Bw==", 215 | "dev": true, 216 | "requires": { 217 | "buffer-alloc-unsafe": "^1.0.0", 218 | "buffer-from": "^1.0.0", 219 | "inherits": "^2.0.3", 220 | "protocol-buffers-encodings": "^1.1.0", 221 | "readable-stream": "^2.2.6", 222 | "sodium-universal": "^2.0.0", 223 | "sorted-indexof": "^1.0.0", 224 | "varint": "^5.0.0" 225 | } 226 | }, 227 | "inherits": { 228 | "version": "2.0.4", 229 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 230 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 231 | }, 232 | "ini": { 233 | "version": "1.3.5", 234 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 235 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 236 | "dev": true, 237 | "optional": true 238 | }, 239 | "inspect-custom-symbol": { 240 | "version": "1.1.0", 241 | "resolved": "https://registry.npmjs.org/inspect-custom-symbol/-/inspect-custom-symbol-1.1.0.tgz", 242 | "integrity": "sha512-vtI2YXBRZBkU6DlfHfd0GtZENfiEiTacAXUd0ZY6HA+X7aPznpFfPmzSC+tHKXAkz9KDSdI4AYfwAMXR5t+isg==", 243 | "dev": true 244 | }, 245 | "is-options": { 246 | "version": "1.0.1", 247 | "resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.1.tgz", 248 | "integrity": "sha512-2Xj8sA0zDrAcaoWfBiNmc6VPWAgKDpim0T3J9Djq7vbm1UjwbUWzeuLu/FwC46g3cBbAn0E5R0xwVtOobM6Xxg==", 249 | "dev": true 250 | }, 251 | "isarray": { 252 | "version": "1.0.0", 253 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 254 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 255 | "dev": true 256 | }, 257 | "last-one-wins": { 258 | "version": "1.0.4", 259 | "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", 260 | "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=", 261 | "dev": true 262 | }, 263 | "memory-pager": { 264 | "version": "1.5.0", 265 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 266 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 267 | "dev": true 268 | }, 269 | "merkle-tree-stream": { 270 | "version": "3.0.3", 271 | "resolved": "https://registry.npmjs.org/merkle-tree-stream/-/merkle-tree-stream-3.0.3.tgz", 272 | "integrity": "sha1-+KBkdg0355eK1fn208EZpJT1cIE=", 273 | "dev": true, 274 | "requires": { 275 | "flat-tree": "^1.3.0", 276 | "readable-stream": "^2.0.5" 277 | } 278 | }, 279 | "minimist": { 280 | "version": "0.0.8", 281 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 282 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 283 | "dev": true 284 | }, 285 | "mkdirp": { 286 | "version": "0.5.1", 287 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 288 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 289 | "dev": true, 290 | "requires": { 291 | "minimist": "0.0.8" 292 | } 293 | }, 294 | "nan": { 295 | "version": "2.14.0", 296 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 297 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", 298 | "dev": true, 299 | "optional": true 300 | }, 301 | "nanoassert": { 302 | "version": "1.1.0", 303 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 304 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=", 305 | "dev": true 306 | }, 307 | "napi-macros": { 308 | "version": "1.8.2", 309 | "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-1.8.2.tgz", 310 | "integrity": "sha512-Tr0DNY4RzTaBG2W2m3l7ZtFuJChTH6VZhXVhkGGjF/4cZTt+i8GcM9ozD+30Lmr4mDoZ5Xx34t2o4GJqYWDGcg==", 311 | "dev": true, 312 | "optional": true 313 | }, 314 | "node-gyp-build": { 315 | "version": "4.1.1", 316 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", 317 | "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", 318 | "dev": true, 319 | "optional": true 320 | }, 321 | "pretty-hash": { 322 | "version": "1.0.1", 323 | "resolved": "https://registry.npmjs.org/pretty-hash/-/pretty-hash-1.0.1.tgz", 324 | "integrity": "sha1-FuBXkYje9WvbVliSvNBaXWUySAc=", 325 | "dev": true 326 | }, 327 | "process-nextick-args": { 328 | "version": "2.0.1", 329 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 330 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 331 | "dev": true 332 | }, 333 | "protocol-buffers-encodings": { 334 | "version": "1.1.0", 335 | "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.0.tgz", 336 | "integrity": "sha512-SmjEuAf3hc3h3rWZ6V1YaaQw2MNJWK848gLJgzx/sefOJdNLujKinJVXIS0q2cBQpQn2Q32TinawZyDZPzm4kQ==", 337 | "dev": true, 338 | "requires": { 339 | "signed-varint": "^2.0.1", 340 | "varint": "^5.0.0" 341 | } 342 | }, 343 | "random-access-file": { 344 | "version": "2.1.3", 345 | "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.1.3.tgz", 346 | "integrity": "sha512-AE0Z1ywR5gIkzACMC1lCsR6LP8g4ynNm7oYWYdKPSSU6Y3H+mGDJxBqfcV9B9KstfHNemhfX3nYmx99ZC9f/yg==", 347 | "dev": true, 348 | "requires": { 349 | "mkdirp": "^0.5.1", 350 | "random-access-storage": "^1.1.1" 351 | } 352 | }, 353 | "random-access-memory": { 354 | "version": "3.1.1", 355 | "resolved": "https://registry.npmjs.org/random-access-memory/-/random-access-memory-3.1.1.tgz", 356 | "integrity": "sha512-Qy1MliJDozZ1A6Hx3UbEnm8PPCfkiG/8CArbnhrxXMx1YRJPWipgPTB9qyhn4Z7WlLvCEqPb6Bd98OayyVuwrA==", 357 | "dev": true, 358 | "requires": { 359 | "inherits": "^2.0.3", 360 | "is-options": "^1.0.1", 361 | "random-access-storage": "^1.1.1" 362 | } 363 | }, 364 | "random-access-storage": { 365 | "version": "1.4.0", 366 | "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.4.0.tgz", 367 | "integrity": "sha512-7oszloM/+PdqWp/oFGyL6SeI14liqo8AAisHAZQGkWdHISyAnngKjNPL0JYIazeLxbHPY6oed2yUffowdq/o6A==", 368 | "requires": { 369 | "inherits": "^2.0.3" 370 | } 371 | }, 372 | "readable-stream": { 373 | "version": "2.3.6", 374 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 375 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 376 | "dev": true, 377 | "requires": { 378 | "core-util-is": "~1.0.0", 379 | "inherits": "~2.0.3", 380 | "isarray": "~1.0.0", 381 | "process-nextick-args": "~2.0.0", 382 | "safe-buffer": "~5.1.1", 383 | "string_decoder": "~1.1.1", 384 | "util-deprecate": "~1.0.1" 385 | } 386 | }, 387 | "safe-buffer": { 388 | "version": "5.1.2", 389 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 390 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 391 | "dev": true 392 | }, 393 | "signed-varint": { 394 | "version": "2.0.1", 395 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 396 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 397 | "dev": true, 398 | "requires": { 399 | "varint": "~5.0.0" 400 | } 401 | }, 402 | "siphash24": { 403 | "version": "1.1.1", 404 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.1.tgz", 405 | "integrity": "sha512-dKKwjIoTOa587TARYLlBRXq2lkbu5Iz35XrEVWpelhBP1m8r2BGOy1QlaZe84GTFHG/BTucEUd2btnNc8QzIVA==", 406 | "dev": true, 407 | "requires": { 408 | "nanoassert": "^1.0.0" 409 | } 410 | }, 411 | "sodium-javascript": { 412 | "version": "0.5.5", 413 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.5.tgz", 414 | "integrity": "sha512-UMmCHovws/sxIBZsIRhIl8uRPou/RFDD0vVop81T1hG106NLLgqajKKuHAOtAP6hflnZ0UrVA2VFwddTd/NQyA==", 415 | "dev": true, 416 | "requires": { 417 | "blake2b": "^2.1.1", 418 | "nanoassert": "^1.0.0", 419 | "siphash24": "^1.0.1", 420 | "xsalsa20": "^1.0.0" 421 | } 422 | }, 423 | "sodium-native": { 424 | "version": "2.4.6", 425 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-2.4.6.tgz", 426 | "integrity": "sha512-Ro9lhTjot8M01nwKLXiqLSmjR7B8o+Wg4HmJUjEShw/q6XPlNMzjPkA1VJKaMH8SO8fJ/sggAKVwreTaFszS2Q==", 427 | "dev": true, 428 | "optional": true, 429 | "requires": { 430 | "ini": "^1.3.5", 431 | "nan": "^2.14.0", 432 | "node-gyp-build": "^4.1.0" 433 | } 434 | }, 435 | "sodium-universal": { 436 | "version": "2.0.0", 437 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-2.0.0.tgz", 438 | "integrity": "sha512-csdVyakzHJRyCevY4aZC2Eacda8paf+4nmRGF2N7KxCLKY2Ajn72JsExaQlJQ2BiXJncp44p3T+b80cU+2TTsg==", 439 | "dev": true, 440 | "requires": { 441 | "sodium-javascript": "~0.5.0", 442 | "sodium-native": "^2.0.0" 443 | } 444 | }, 445 | "sorted-indexof": { 446 | "version": "1.0.0", 447 | "resolved": "https://registry.npmjs.org/sorted-indexof/-/sorted-indexof-1.0.0.tgz", 448 | "integrity": "sha1-F8dC/3zxh+L1mhXfm4HxemLOCJk=", 449 | "dev": true 450 | }, 451 | "sparse-bitfield": { 452 | "version": "3.0.3", 453 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 454 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 455 | "dev": true, 456 | "requires": { 457 | "memory-pager": "^1.0.2" 458 | } 459 | }, 460 | "string_decoder": { 461 | "version": "1.1.1", 462 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 463 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 464 | "dev": true, 465 | "requires": { 466 | "safe-buffer": "~5.1.0" 467 | } 468 | }, 469 | "thunky": { 470 | "version": "1.0.3", 471 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", 472 | "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" 473 | }, 474 | "uint64be": { 475 | "version": "2.0.2", 476 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-2.0.2.tgz", 477 | "integrity": "sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==", 478 | "dev": true, 479 | "requires": { 480 | "buffer-alloc": "^1.1.0" 481 | } 482 | }, 483 | "unordered-array-remove": { 484 | "version": "1.0.2", 485 | "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", 486 | "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=", 487 | "dev": true 488 | }, 489 | "unordered-set": { 490 | "version": "2.0.1", 491 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", 492 | "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==", 493 | "dev": true 494 | }, 495 | "util-deprecate": { 496 | "version": "1.0.2", 497 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 498 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 499 | "dev": true 500 | }, 501 | "varint": { 502 | "version": "5.0.0", 503 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 504 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 505 | }, 506 | "xsalsa20": { 507 | "version": "1.0.2", 508 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.0.2.tgz", 509 | "integrity": "sha512-g1DFmZ5JJ9Qzvt4dMw6m9IydqoCSP381ucU5zm46Owbk3bwmqAr8eEJirOPc7PrXRn45drzOpAyDp8jsnoyXyw==", 510 | "dev": true 511 | } 512 | } 513 | } 514 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "derived-key-storage", 3 | "version": "2.1.0", 4 | "description": "Derive a key and secret key file from a name", 5 | "main": "index.js", 6 | "dependencies": { 7 | "random-access-storage": "^1.4.0", 8 | "thunky": "^1.0.3", 9 | "varint": "^5.0.0" 10 | }, 11 | "devDependencies": { 12 | "derive-key": "^1.0.0", 13 | "hypercore": "^7.6.1", 14 | "hypercore-crypto": "^1.0.0", 15 | "random-access-file": "^2.1.3", 16 | "random-access-memory": "^3.1.1" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/mafintosh/derived-key-storage.git" 21 | }, 22 | "author": "Mathias Buus (@mafintosh)", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/mafintosh/derived-key-storage/issues" 26 | }, 27 | "homepage": "https://github.com/mafintosh/derived-key-storage" 28 | } 29 | --------------------------------------------------------------------------------