keybase-proofs 2.3.34 → 2.3.35

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.
@@ -1,321 +0,0 @@
1
- {sig3,alloc_v3,team_hidden,errors,constants} = require '../../'
2
- {EncKeyManager,KeyManager} = require('kbpgp').kb
3
- {make_esc} = require 'iced-error'
4
- {new_sig_arg_v3} = require './util'
5
- {prng} = require 'crypto'
6
- {pack,unpack} = require 'purepack'
7
- parse = require '../../lib/parse3'
8
- pgp_utils = require('pgp-utils')
9
- {unix_time} = pgp_utils.util
10
-
11
- twiddle = (b) -> b[0] ^= 1
12
- twiddle_hex = (b) ->
13
- buf = Buffer.from(b, 'hex')
14
- twiddle buf
15
- buf.toString('hex')
16
-
17
- _to_check_params = (a) ->
18
- return {
19
- user : a.user
20
- seqno : a.seqno
21
- prev : a.prev
22
- }
23
-
24
- seed_check = (ptk) -> ptk.seed_check = { h : prng(32), v : 1 }
25
-
26
- exports.test_generate_team_hidden_rotate = (T,cb) ->
27
- esc = make_esc cb
28
- await gen { T }, esc defer { km, ret, arg }
29
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, esc defer()
30
- cb null, ret
31
-
32
- exports.test_generate_team_hidden_rotate_with_implicit_admin = (T,cb) ->
33
- esc = make_esc cb
34
- admin = {
35
- id : prng(16)
36
- seqno : 20
37
- chain_type : 3
38
- }
39
- f = (arg) -> arg.team.admin = admin
40
- await gen { T, f }, esc defer { km, ret, arg }
41
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, esc defer ret
42
- T.equal ret.objs.inner.team.admin, admin, "admin is right"
43
- cb null
44
-
45
- gen = ({T,f},cb) ->
46
- esc = make_esc cb
47
- await KeyManager.generate {}, esc defer km
48
- ptk = { generation : 10, ptk_type : constants.ptk_types.reader }
49
- arg = new_sig_arg_v3 { mk_prev : true, km }
50
- arg.per_team_keys = [ ptk ]
51
- arg.team = { id : prng(16) }
52
- await EncKeyManager.generate {}, esc defer ptk.enc_km
53
- await KeyManager.generate {}, esc defer ptk.sig_km
54
- seed_check ptk
55
- f? arg
56
- obj = new team_hidden.RotateKey arg
57
- await obj.generate {}, esc defer ret
58
- cb null, {ret, km, arg }
59
-
60
- exports.test_head = (T,cb) ->
61
- esc = make_esc cb
62
- f = (arg) ->
63
- arg.seqno = 1
64
- arg.prev = null
65
- await gen { T, f }, esc defer { km, ret, arg }
66
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, esc defer()
67
- cb null
68
-
69
- exports.test_many_ptks = (T,cb) ->
70
- esc = make_esc cb
71
- await KeyManager.generate {}, esc defer km
72
- arg = new_sig_arg_v3 { mk_prev : true, km }
73
- arg.team = { id : prng(16) }
74
- arg.per_team_keys = []
75
- constants.ptk_types.bot = 999
76
- constants.ptk_types.admin = 9999
77
- for i in Object.values(constants.ptk_types)
78
- ptk = { generation : 10, ptk_type : i }
79
- await EncKeyManager.generate {}, esc defer ptk.enc_km
80
- await KeyManager.generate {}, esc defer ptk.sig_km
81
- seed_check ptk
82
- arg.per_team_keys.push ptk
83
- obj = new team_hidden.RotateKey arg
84
- await obj.generate {}, esc defer ret
85
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, esc defer { objs }
86
- T.equal objs.inner.per_team_keys.length, 3, "3 ptks"
87
-
88
- arg.per_team_keys[0].ptk_type = 0
89
- arg.per_team_keys[1].ptk_type = 0
90
- await obj.generate {}, esc defer ret
91
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
92
- T.assert err?, "got an error back if repeating the type"
93
- T.equal err.message, "Repeated PTK type 0 not allowed", "right message"
94
-
95
- arg.per_team_keys[1].ptk_type = 100
96
- await obj.generate {}, esc defer ret
97
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
98
- T.assert err?, "got an error back if using a bad PTK type"
99
- T.equal err.message, "At inner.b.k.1.t: value must be a PTK type"
100
-
101
- cb null
102
-
103
- exports.test_generate_verify_team_hidden_rotate = (T,cb) ->
104
- esc = make_esc cb
105
- await gen { T }, esc defer {ret, km, arg }
106
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, esc defer { objs }
107
- await KeyManager.generate {}, esc defer km2
108
- await alloc_v3 { km : km2, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
109
- T.assert err?, "got an error"
110
- T.equal err.message, "Signature failed to verify", "right error message"
111
-
112
- arg.user.local.uid = twiddle_hex arg.user.local.uid
113
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
114
- T.assert err?, "got an error"
115
- T.equal err.message, "bad UID", "got the wrong UID"
116
- arg.user.local.uid = twiddle_hex arg.user.local.uid
117
-
118
- arg.user.local.eldest_seqno++
119
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
120
- T.assert err?, "got an error"
121
- T.equal err.message, "bad eldest_seqno", "got the wrong eldest"
122
- arg.user.local.eldest_seqno--
123
-
124
- twiddle arg.prev
125
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
126
- T.assert err?, "got an error"
127
- T.assert (err instanceof errors.BadPrevError), "right error type"
128
- twiddle arg.prev
129
-
130
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg), now : unix_time()+1000000 }, defer err
131
- T.assert err?, "got an error"
132
- T.assert (err instanceof errors.ClockSkewError), "right error type"
133
-
134
- inner_armored = ret.armored.inner
135
- inner = unpack(Buffer.from(ret.armored.inner, "base64"))
136
- inner.c++
137
- ret.armored.inner = pack(inner).toString('base64')
138
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
139
- T.assert err?, "got an error ack"
140
- T.equal err.message, "outer's body hash doesn't match inner link", "right message"
141
- ret.armored.inner = inner_armored
142
-
143
- cb null
144
-
145
- exports.test_bad_encoding = (T,cb) ->
146
- esc = make_esc cb
147
- await KeyManager.generate {}, esc defer km
148
- ptk = { generation : 10, ptk_type : constants.ptk_types.reader }
149
- arg = new_sig_arg_v3 { mk_prev : true, km }
150
- arg.per_team_keys = [ ptk ]
151
- arg.team = { id : prng(16) }
152
- await EncKeyManager.generate {}, esc defer ptk.enc_km
153
- await KeyManager.generate {}, esc defer ptk.sig_km
154
- seed_check ptk
155
- obj = new team_hidden.RotateKey arg
156
- await obj.generate {}, esc defer ret
157
- s = ret.armored.inner
158
- n = 30
159
- ret.armored.inner = s[0...n] + " " + s[n...]
160
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
161
- T.assert err?, "error"
162
- T.equal err.message, "non-canonical base64-encoding in inner", "right message"
163
- cb null
164
-
165
- exports.test_bad_outer = (T,cb) ->
166
- esc = make_esc cb
167
- run = (f, msg, cb) ->
168
- await KeyManager.generate {}, esc defer km
169
- ptk = { generation : 10, ptk_type : constants.ptk_types.reader }
170
- arg = new_sig_arg_v3 { mk_prev : true, km }
171
- arg.per_team_keys = [ ptk ]
172
- arg.team = { id : prng(16) }
173
- await EncKeyManager.generate {}, esc defer ptk.enc_km
174
- await KeyManager.generate {}, esc defer ptk.sig_km
175
- ptk.seed_check = { h : prng(32), v : 1 }
176
- obj = new team_hidden.RotateKey arg
177
- obj._generate_outer = ({inner}) ->
178
- ret = (new sig3.OuterLink {
179
- version: obj._version()
180
- seqno : obj.seqno
181
- prev : parse.unhex(obj.prev)
182
- inner_hash : obj._hash(inner)
183
- link_type : obj._v_link_type_v3()
184
- chain_type : obj._v_chain_type_v3()
185
- ignore_if_unsupported : obj.ignore_if_unsupported
186
- }).encode()
187
- f ret
188
- ret
189
- await obj.generate {}, esc defer ret
190
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
191
- T.assert err?, "error"
192
- T.equal err.message, msg, "right message"
193
- cb null
194
-
195
- await run ((v) -> v.push "foo"), "At outer: need an array with 8 fields", defer()
196
- await run ((v) -> v.pop()), "At outer: need an array with 8 fields", defer()
197
- await run ((v) -> v[0]++), "At outer.0: must be set to value 3", defer()
198
- await run ((v) -> v[1] = ["hi"]), "At outer.1: value must be a seqno (sequence number)", defer()
199
- await run ((v) -> v[2] = Buffer.alloc(33)), "At outer.2: value needs to be buffer of length 32", defer()
200
- await run ((v) -> v[3] = Buffer.alloc(33)), "At outer.3: value needs to be buffer of length 32", defer()
201
- await run ((v) -> v[4] = 1000), "At outer.4: value must be a valid link type", defer()
202
- await run ((v) -> v[5] = 1000), "At outer.5: value must be a valid chain type", defer()
203
- await run ((v) -> v[5] = 3), "bad chain/link type combo", defer()
204
-
205
- cb null
206
-
207
- exports.test_bad_inner = (T,cb) ->
208
-
209
- esc = make_esc cb
210
- ptk = { generation : 10, ptk_type : constants.ptk_types.reader }
211
- await KeyManager.generate {}, esc defer km
212
- await EncKeyManager.generate {}, esc defer ptk.enc_km
213
- await KeyManager.generate {}, esc defer ptk.sig_km
214
- seed_check ptk
215
-
216
- run = (f, msg, cb) ->
217
- arg = new_sig_arg_v3 { mk_prev : true, km }
218
- arg.per_team_keys = [ ptk ]
219
- arg.team = { id : prng(16), admin : { id : prng(16), seqno : 19, chain_type : 3 } }
220
- obj = new team_hidden.RotateKey arg
221
- obj._generate_inner = (opts, cb) ->
222
- await obj._generate_inner_impl opts, defer err, json
223
- f json
224
- cb err, json
225
- await obj.generate {}, esc defer ret
226
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
227
- T.assert err?, "error"
228
- T.equal err.message, msg, "right message"
229
- cb null
230
-
231
- await run ((o) -> o.c = "blah"), "At inner.c: value must be a UTC timestamp", defer()
232
- await run ((o) -> o.e = Buffer.alloc(13)), "At inner.e: value needs to be buffer of length 16", defer()
233
- await run ((o) -> o.m = [1]), "At inner.m: need a dictionary", defer()
234
- await run ((o) -> o.m.c = [1]), "At inner.m.c: value must be a UTC timestamp", defer()
235
- await run ((o) -> o.m.h = Buffer.alloc(40)), "At inner.m.h: value needs to be buffer of length 32", defer()
236
- await run ((o) -> o.m.s = -1), "At inner.m.s: value must be a seqno (sequence number)", defer()
237
- await run ((o) -> delete o.s), "At inner.s: key is missing but is mandatory", defer()
238
- await run ((o) -> o.s.e = "foo"), "At inner.s.e: value must be a seqno (sequence number)", defer()
239
- await run ((o) -> o.s.e++), "bad eldest_seqno", defer()
240
- await run ((o) -> o.s.k = Buffer.alloc(30)), "At inner.s.k: value needs to be buffer of length 35", defer()
241
- await run ((o) -> o.s.u = [1]), "At inner.s.u: value needs to be buffer of length 16", defer()
242
- await run ((o) -> o.s.u = Buffer.alloc(16)), "bad UID", defer()
243
- await run ((o) -> o.p.h = Buffer.alloc(30)), "At inner.p.h: value needs to be buffer of length 32", defer()
244
- await run ((o) -> o.p.s = {}), "At inner.p.s: value must be a seqno (sequence number)", defer()
245
- await run ((o) -> o.i.d = 10), "At inner.i.d: value must be a string", defer()
246
- await run ((o) -> o.i.v = 10), "At inner.i.v: value must be a string", defer()
247
- await run ((o) -> o.x = 10), "At inner.x: key is not supported", defer()
248
- await run ((o) -> o.i.x = 10), "At inner.i.x: key is not supported", defer()
249
- await run ((o) -> o.m.x = 10), "At inner.m.x: key is not supported", defer()
250
- await run ((o) -> o.t.i = 10), "At inner.t.i: value needs to be buffer of length 16", defer()
251
- await run ((o) -> o.t = 10), "At inner.t: need a dictionary", defer()
252
- await run ((o) -> o.b.k[0].x = 10), "At inner.b.k.0.x: key is not supported", defer()
253
- await run ((o) -> o.b.k[0].s = Buffer.alloc(32)), "At inner.b.k.0.s: value needs to be buffer of length 35" , defer()
254
- await run ((o) -> o.b.k[0].e = Buffer.alloc(32)), "At inner.b.k.0.e: value needs to be buffer of length 35" , defer()
255
- await run ((o) -> o.b.k[0].g = Buffer.alloc(3)), "At inner.b.k.0.g: value must be a seqno (sequence number)" , defer()
256
- await run ((o) -> o.b.k[0].a = 4), "At inner.b.k.0.a: must be set to value 1" , defer()
257
- await run ((o) -> o.t.a = 10), "At inner.t.a: need a dictionary", defer()
258
- await run ((o) -> o.t.a.i = 10), "At inner.t.a.i: value needs to be buffer of length 16", defer()
259
- await run ((o) -> o.t.a.t = 4), "At inner.t.a.t: value must be a valid chain type", defer()
260
- await run ((o) -> o.t.a.s = "f"), "At inner.t.a.s: value must be a seqno (sequence number)", defer()
261
-
262
- cb null
263
-
264
- exports.test_bad_reverse_sig = (T,cb) ->
265
- esc = make_esc cb
266
- await KeyManager.generate {}, esc defer km
267
- ptk = { generation : 10, ptk_type : constants.ptk_types.reader }
268
- arg = new_sig_arg_v3 { mk_prev : true, km }
269
- arg.per_team_keys = [ ptk ]
270
- arg.team = { id : prng(16) }
271
- await EncKeyManager.generate {}, esc defer ptk.enc_km
272
- await KeyManager.generate {}, esc defer ptk.sig_km
273
- seed_check ptk
274
- obj = new team_hidden.RotateKey arg
275
-
276
- # Hack - instead of assigning the right reverse sig, assign a twiddled
277
- # signature (with one bit off).
278
- obj._v_reverse_sign = ({inner, outer}, cb) ->
279
- esc = make_esc cb
280
- for k,i in obj.per_team_keys
281
- await obj._sign { sig_eng : k.sig_km.make_sig_eng(), outer }, esc defer sig
282
- twiddle sig
283
- inner.b.k[i].r = sig
284
- outer = obj._generate_outer { inner }
285
- cb null, { inner, outer }
286
-
287
- await obj.generate {}, esc defer ret
288
- await alloc_v3 { km, armored : ret.armored, check_params : _to_check_params(arg) }, defer err
289
- T.assert err?, "got an error"
290
- T.equal err.message, "Signature failed to verify", "right error"
291
- T.assert (err.stack.indexOf("_v_verify_reverse_sig") > 0), "we find a reverse sig in the stack"
292
- cb null
293
-
294
- exports.test_schema_localize = (T, cb) ->
295
- esc = make_esc cb
296
- await gen { T }, esc defer { km, ret, arg }
297
- [err, outer_obj] = sig3.OuterLink.decode ret.raw.outer
298
- T.no_error err
299
-
300
- obj = new team_hidden.RotateKey {}
301
- await obj.decode_inner { json: ret.raw.inner, outer_obj }, esc defer()
302
- localized = obj.get_schema().debug_localize(ret.raw.inner)
303
-
304
- for f in ['ctime', 'entropy', 'merkle_root', 'signer', 'parent_chain_tail', 'client_info', 'team', 'body']
305
- T.assert localized[f]?, "looking for field #{f}"
306
- for f in ['ctime', 'hash_meta', 'seqno']
307
- T.assert localized.merkle_root?[f]?, "looking for field merkle_root.#{f}"
308
- for f in ['eldest_seqno', 'kid', 'uid']
309
- T.assert localized.signer?[f]?, "looking for field signer.#{f}"
310
- for f in ['tail', 'seqno', 'chain_type']
311
- T.assert localized.parent_chain_tail?[f]?, "looking for field parent_chain_tail.#{f}"
312
- for f in ['description', 'version']
313
- T.assert localized.client_info?[f]?, "looking for field client_info.#{f}"
314
- for f in ['team_id', 'is_implicit', 'is_public']
315
- T.assert localized.team?[f]?, "looking for field team.#{f}"
316
- T.assert localized.body?.keys?, "looking for localized.body.keys"
317
- for k in localized.body?.keys ? []
318
- for f in ['appkey_derivation_version', 'seed_check', 'encryption_kid', 'generation', 'reverse_sig', 'signing_kid', 'ptk_type']
319
- T.assert k[f]?, "looking for field body.keys.#{f}"
320
-
321
- cb null
@@ -1,55 +0,0 @@
1
- {prng} = require 'crypto'
2
- {constants} = require '../..'
3
- pgp_utils = require('pgp-utils')
4
- {unix_time} = pgp_utils.util
5
- {KeyManager} = require('kbpgp').kb
6
- {make_esc} = require 'iced-error'
7
-
8
- exports.new_uid = new_uid = () -> Buffer.concat([ prng(15), Buffer.from([0x19])]).toString('hex')
9
- exports.new_sig_id = new_sig_id = () -> Buffer.concat([ prng(32), Buffer.from([0x22])]).toString('hex')
10
- exports.new_username = new_username = () -> "u_" + prng(5).toString('hex')
11
- exports.new_payload_hash = new_payload_hash = () -> prng(32).toString('hex')
12
-
13
- exports.skip = 1
14
-
15
- exports.new_sig_arg = new_sig_arg = ({km}) ->
16
- arg =
17
- user :
18
- local :
19
- uid : new_uid()
20
- username : new_username()
21
- host : "keybase.io"
22
- sig_eng : km.make_sig_eng()
23
- seqno : 0
24
- seq_type : constants.seq_types.PUBLIC
25
- prev : null
26
-
27
- exports.new_sig_arg_v3 = new_sig_arg_v3 = ({km, mk_prev, eldest_seqno, seqno, parent_chain_tail}) ->
28
- arg =
29
- user :
30
- local :
31
- uid : new_uid()
32
- eldest_seqno : eldest_seqno or 1
33
- sig_eng : km.make_sig_eng()
34
- seqno : seqno or 7
35
- prev : (if mk_prev then prng(32) else null)
36
- parent_chain_tail : (parent_chain_tail or {
37
- hash : prng(32)
38
- seqno : 10
39
- chain_type : constants.seq_types.SEMIPRIVATE
40
- })
41
- client :
42
- name : "go darwin"
43
- version : "4.1.0"
44
- ctime : unix_time()
45
- ignore_if_unsupported : false
46
- merkle_root :
47
- ctime : unix_time() - 10
48
- hash_meta : "db951e27435ec22ac266f6880dcedeb6f57cbed28f014a0f774a54b932fcb153"
49
- seqno : 4768147
50
-
51
- exports.new_km_and_sig_arg = (opts, cb) ->
52
- esc = make_esc cb
53
- await KeyManager.generate {}, esc defer km
54
- arg = new_sig_arg { km }
55
- cb null, arg