hypercore-signing-request 3.1.1 → 4.0.0

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.
Files changed (3) hide show
  1. package/README.md +6 -2
  2. package/index.js +117 -31
  3. package/package.json +3 -1
package/README.md CHANGED
@@ -16,10 +16,14 @@ const { generate, decode, signable } = require('hypercore-signing-request')
16
16
 
17
17
  ## API
18
18
 
19
- #### `requestBuffer = await generate(core, { length = core.length })`
19
+ #### `requestBuffer = await generate(coreOrDrive, { length = core.length })`
20
20
 
21
21
  Generate a signing request, returned as a buffer so it can be shared.
22
- Only works for non-compat cores (ie manifest backed)
22
+ Only works for non-compat cores (ie manifest backed).
23
+
24
+ Alternatvely a Hyperdrive can be passed and a joint request for signing both metadata and blob cores will be generated.
25
+ Only works for v1 manifest backed Hyperdrives.
26
+
23
27
 
24
28
  #### `req = decode(requestBuffer)`
25
29
 
package/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  const HypercoreID = require('hypercore-id-encoding')
2
+ const Hyperdrive = require('hyperdrive')
2
3
  const Verifier = require('hypercore/lib/verifier')
3
4
  const caps = require('hypercore/lib/caps')
4
5
  const m = require('hypercore/lib/messages')
5
6
  const c = require('compact-encoding')
6
7
 
7
- const VERSION = 1
8
+ const VERSION = 2
9
+ const FLAG_DRIVE = 1
8
10
 
9
11
  const Request = {
10
12
  preencode (state, req) {
@@ -13,6 +15,13 @@ const Request = {
13
15
  c.uint.preencode(state, req.fork)
14
16
  c.fixed32.preencode(state, req.treeHash)
15
17
  m.manifest.preencode(state, req.manifest)
18
+
19
+ c.uint.preencode(state, 0) // flags
20
+
21
+ if (req.content) {
22
+ c.uint.preencode(state, req.content.length)
23
+ c.fixed32.preencode(state, req.content.treeHash)
24
+ }
16
25
  },
17
26
  encode (state, req) {
18
27
  c.uint.encode(state, req.version)
@@ -20,10 +29,19 @@ const Request = {
20
29
  c.uint.encode(state, req.fork)
21
30
  c.fixed32.encode(state, req.treeHash)
22
31
  m.manifest.encode(state, req.manifest)
32
+
33
+ let flags = 0
34
+ if (req.content) flags |= FLAG_DRIVE
35
+ c.uint.encode(state, flags)
36
+
37
+ if (req.content) {
38
+ c.uint.encode(state, req.content.length)
39
+ c.fixed32.encode(state, req.content.treeHash)
40
+ }
23
41
  },
24
42
  decode (state) {
25
43
  const version = c.uint.decode(state)
26
- if (version !== VERSION) throw new Error('Unknown signing request version: ' + version)
44
+ if (version > VERSION) throw new Error('Unknown signing request version: ' + version)
27
45
 
28
46
  const length = c.uint.decode(state)
29
47
  const fork = c.uint.decode(state)
@@ -33,6 +51,18 @@ const Request = {
33
51
  const key = Verifier.manifestHash(manifest)
34
52
  const id = HypercoreID.normalize(key)
35
53
 
54
+ const flags = state.start !== state.end ? c.uint.decode(state) : 0
55
+
56
+ let content = null
57
+
58
+ const isHyperdrive = flags & FLAG_DRIVE
59
+ if (isHyperdrive) {
60
+ content = {
61
+ length: c.uint.decode(state),
62
+ treeHash: c.fixed32.decode(state)
63
+ }
64
+ }
65
+
36
66
  return {
37
67
  version,
38
68
  id,
@@ -40,44 +70,100 @@ const Request = {
40
70
  length,
41
71
  fork,
42
72
  treeHash,
43
- manifest
73
+ manifest,
74
+ isHyperdrive,
75
+ content
44
76
  }
45
77
  }
46
78
  }
47
79
 
48
80
  module.exports = {
49
- async generate (core, { length = core.length, fork = core.fork, manifest = null } = {}) {
50
- if (!core.opened) await core.ready()
81
+ generate,
82
+ generateDrive,
83
+ decode,
84
+ signable
85
+ }
51
86
 
52
- if (core.core.compat && !manifest) throw new Error('Cannot generate signing requests for compat cores')
53
- if (core.fork !== fork) throw new Error('Core should have the same fork')
54
- if (!manifest) manifest = core.manifest
87
+ async function generate (core, { length = core.length, fork = core.fork, manifest = null } = {}) {
88
+ if (!core.opened) await core.ready()
55
89
 
56
- return c.encode(Request, {
57
- version: VERSION,
58
- length,
59
- fork,
60
- treeHash: await core.treeHash(length),
61
- manifest
62
- })
63
- },
64
- decode (buffer) {
65
- const state = { start: 0, end: buffer.byteLength, buffer }
66
- const req = Request.decode(state)
90
+ if (core.blobs) return generateDrive(core, { length, fork, manifest })
67
91
 
68
- if (req.length === 0) throw new Error('Refusing to sign length = 0')
69
- if (state.start < state.end) throw new Error('Unparsed padding left in request, bailing')
92
+ if (core.core.compat && !manifest) throw new Error('Cannot generate signing requests for compat cores')
93
+ if (core.fork !== fork) throw new Error('Core should have the same fork')
94
+ if (!manifest) manifest = core.manifest
70
95
 
71
- return req
72
- },
73
- signable (pub, req) {
74
- const v = req.manifest.version
75
- for (const s of req.manifest.signers) {
76
- if (s.publicKey.equals(pub)) {
77
- return caps.treeSignable(v === 0 ? s.namespace : req.key, req.treeHash, req.length, req.fork)
78
- }
79
- }
96
+ return c.encode(Request, {
97
+ version: VERSION,
98
+ length,
99
+ fork,
100
+ treeHash: await core.treeHash(length),
101
+ manifest,
102
+ content: null
103
+ })
104
+ }
105
+
106
+ async function generateDrive (drive, { length = drive.core.length, fork = drive.core.fork, manifest = null }) {
107
+ if (drive.core.core.compat && !manifest) throw new Error('Cannot generate signing requests for compat cores')
80
108
 
81
- throw new Error('Public key is not a declared signer for this request')
109
+ if (!manifest) manifest = drive.core.manifest
110
+ if (manifest < 1) throw new Error('Only v1 manifests are supported')
111
+
112
+ const last = await drive.db.getBySeq(length - 1)
113
+ const { blockOffset, blockLength } = last.value.blob
114
+
115
+ const contentLength = blockOffset + blockLength
116
+ const content = {
117
+ length: contentLength,
118
+ treeHash: await drive.blobs.core.treeHash(contentLength)
82
119
  }
120
+
121
+ return c.encode(Request, {
122
+ version: VERSION,
123
+ length,
124
+ fork,
125
+ treeHash: await drive.core.treeHash(length),
126
+ manifest,
127
+ content
128
+ })
129
+ }
130
+
131
+ function decode (buffer) {
132
+ const state = { start: 0, end: buffer.byteLength, buffer }
133
+ const req = Request.decode(state)
134
+
135
+ if (req.length === 0) throw new Error('Refusing to sign length = 0')
136
+ if (state.start < state.end) throw new Error('Unparsed padding left in request, bailing')
137
+
138
+ return req
139
+ }
140
+
141
+ function signable (pub, req) {
142
+ const v = req.manifest.version
143
+
144
+ for (const s of req.manifest.signers) {
145
+ if (!s.publicKey.equals(pub)) continue
146
+
147
+ if (req.isHyperdrive) return driveSignable(pub, req)
148
+
149
+ const signable = caps.treeSignable(v === 0 ? s.namespace : req.key, req.treeHash, req.length, req.fork)
150
+ return [signable]
151
+ }
152
+
153
+ throw new Error('Public key is not a declared signer for this request')
154
+ }
155
+
156
+ function driveSignable (pub, req) {
157
+ const contentKey = Hyperdrive.getContentKey(req.manifest)
158
+ if (!contentKey) {
159
+ throw new Error('Drive is not compatible, needs v1 manifest')
160
+ }
161
+
162
+ const signable = caps.treeSignable(req.key, req.treeHash, req.length, req.fork)
163
+ const content = caps.treeSignable(contentKey, req.content.treeHash, req.content.length, req.fork)
164
+
165
+ return [
166
+ signable,
167
+ content
168
+ ]
83
169
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hypercore-signing-request",
3
- "version": "3.1.1",
3
+ "version": "4.0.0",
4
4
  "description": "Generate shareable signing requests for Hypercore",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -12,6 +12,7 @@
12
12
  "dependencies": {
13
13
  "compact-encoding": "^2.13.0",
14
14
  "hypercore": "^10.32.8",
15
+ "hyperdrive": "^11.7.0",
15
16
  "hypercore-id-encoding": "^1.2.0"
16
17
  },
17
18
  "repository": {
@@ -26,6 +27,7 @@
26
27
  "homepage": "https://github.com/holepunchto/hypercore-signing-request",
27
28
  "devDependencies": {
28
29
  "brittle": "^3.4.0",
30
+ "corestore": "^6.17.0",
29
31
  "random-access-memory": "^6.2.0",
30
32
  "standard": "^17.1.0"
31
33
  }