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,410 +0,0 @@
1
-
2
- {KeyManager} = require('kbpgp').kb
3
- {prng} = require 'crypto'
4
- {constants,errors,alloc,Eldest,Cryptocurrency} = require '../../'
5
- {make_esc} = require 'iced-error'
6
- {createHash} = require 'crypto'
7
- {make_ids} = require '../../lib/base'
8
- {pack,unpack} = require 'purepack'
9
- pgp_utils = require('pgp-utils')
10
- {json_stringify_sorted} = pgp_utils.util
11
-
12
- new_uid = () -> prng(16).toString('hex')
13
- new_username = () -> "u_" + prng(5).toString('hex')
14
- new_device = () ->
15
- sha256 = (x) -> createHash('SHA256').update(x).digest('hex')
16
-
17
- #-------------
18
-
19
- class User
20
-
21
- constructor : ({@uid, @username, @km}) ->
22
- @generate : (cb) ->
23
- esc = make_esc cb, "@generate"
24
- await KeyManager.generate {}, esc defer km
25
- uid = new_uid()
26
- username = new_username()
27
- cb null, new User { uid, username, km }
28
- to_json : () -> { @uid, @username }
29
- to_constructor_arg : ({seq_type} = {}) -> {
30
- user :
31
- local :
32
- username : @username
33
- uid : @uid
34
- host : 'keybase.io'
35
- sig_eng : @km.make_sig_eng()
36
- seq_type : seq_type
37
- }
38
-
39
-
40
- #-------------
41
-
42
- class Chain
43
- constructor : ({@user}) -> @links = []
44
- prev : () -> @links[-1...][0]
45
- push : (l) -> @links.push l
46
- copy : () -> new Chain { @user, links : [].concat(@links) }
47
-
48
- to_constructor_arg : (opts = {}) ->
49
- arg = @user.to_constructor_arg(opts)
50
- if (p = @prev())? then p.populate_next arg
51
- else
52
- arg.seqno = 1
53
- arg.prev = null
54
- for k, v of opts.extra_params
55
- arg[k] = v
56
- arg
57
-
58
- to_btc_constructor_arg : (opts) ->
59
- ret = @to_constructor_arg(opts)
60
- ret.cryptocurrency = {
61
- address: "1BjgMvwVkpmmJ5HFGZ3L3H1G6fcKLNGT5h"
62
- type: "bitcoin"
63
- }
64
- ret
65
-
66
- #-------------
67
-
68
- class LinkV2
69
- constructor : ({@inner, @armored, @raw, @id, @short_id, @outer}) ->
70
- populate_next : (arg) ->
71
- arg.seqno = @inner.obj.seqno+1
72
- arg.prev = @chain_link_id()
73
- chain_link_id : () -> sha256 @outer
74
- full_type : () -> @inner.obj.body.type
75
- prev : () -> @inner.obj.prev
76
-
77
- verify : ({chain, opts}, cb) ->
78
- # Client provides but server doesn't...
79
- carg = chain.user.to_constructor_arg(opts)
80
- if (m = opts?.extra_params)?
81
- for k, v of m
82
- carg[k] = v
83
- verifier = alloc @full_type(), carg
84
- varg = { @armored, skip_ids : true, make_ids : true, inner : @inner.str }
85
- await verifier.verify_v2 varg, defer err
86
- cb err
87
-
88
- verify_v1 : ({chain, opts}, cb) ->
89
- carg = chain.user.to_constructor_arg(opts)
90
- verifier = alloc @full_type(), carg
91
- varg = { @armored, skip_ids : true, make_ids : true, inner : @inner.str }
92
- await verifier.verify varg, defer err
93
- cb err
94
-
95
- #-------------
96
-
97
- chain = null
98
- user = null
99
-
100
- #-------------
101
-
102
- exports.init = (T,cb) ->
103
- await User.generate T.esc(defer(u), cb)
104
- user = u
105
- chain = new Chain { user : u }
106
- cb()
107
-
108
- #-------------
109
-
110
- exports.gen_1 = (T,cb) ->
111
- arg = chain.to_constructor_arg()
112
- eldest = new Eldest arg
113
- await eldest.generate_v2 T.esc(defer(out), cb)
114
- link = new LinkV2 out
115
- chain.push link
116
- cb()
117
-
118
- #-------------
119
-
120
- check_valid_link = ({T, chain, link, i, opts}, cb) ->
121
- link.verify { chain, opts }, cb
122
-
123
- check_valid_link_v1 = ({T, chain, link, i}, cb) ->
124
- link.verify_v1 { chain }, cb
125
-
126
- check_valid_linkage = ({T, curr, prev}, cb) ->
127
- err = if not(prev) and not curr.prev() then null
128
- else if not(prev) or not curr.prev() then new Error "got nil/non-nil clash in checking for linkage"
129
- else if (a = prev.chain_link_id()) is (b = curr.prev()) then null
130
- else new Error "bad linkage: #{a} != #{b}"
131
- cb err
132
-
133
- #-------------
134
-
135
- check_valid_chain = ({T, chain}, cb) ->
136
- esc = make_esc cb, "check_valid_chain"
137
- for link, i in chain.links
138
- await check_valid_link {T, chain, link, i}, esc defer()
139
- await check_valid_linkage { T, curr : link, prev : chain.links[i-1] }, esc defer()
140
- cb null
141
-
142
- #-------------
143
-
144
- exports.check_chain_1 = (T,cb) ->
145
- check_valid_chain {T, chain}, cb
146
-
147
- #-------------
148
-
149
- exports.gen_2 = (T,cb) ->
150
- arg = chain.to_btc_constructor_arg()
151
- btc = new Cryptocurrency arg
152
- await btc.generate_v2 T.esc(defer(out), cb)
153
- link = new LinkV2 out
154
- chain.push link
155
- cb()
156
-
157
- #-------------
158
-
159
- exports.check_chain_2 = (T,cb) ->
160
- check_valid_chain {T, chain}, cb
161
-
162
- #-------------
163
-
164
- exports.gen_3 = (T,cb) ->
165
- arg = chain.to_btc_constructor_arg()
166
- arg.revoke = { sig_id : "aabb" }
167
- btc = new Cryptocurrency arg
168
- await btc.generate_v2 T.esc(defer(out), cb)
169
- link = new LinkV2 out
170
- chain.push link
171
- cb()
172
-
173
- #-------------
174
-
175
- exports.check_chain_3 = (T,cb) ->
176
- check_valid_chain {T, chain}, cb
177
-
178
- #-------------
179
-
180
- forge_bad_link = ({link,h1,h2}, cb) ->
181
- esc = make_esc cb, "forge_bad_link"
182
- await link._v_generate {}, esc defer()
183
- await link.generate_json { version : 2}, esc defer s, o
184
- inner = { str : s, obj : o }
185
- if h1? then h1 { inner }
186
- await link.generate_outer {inner }, esc defer outer
187
- if h2? then outer = h2 { inner, outer }
188
- await link.sig_eng.box outer, esc defer {pgp, raw, armored}
189
- {short_id, id} = make_ids raw
190
- out = { pgp, id, short_id, raw, armored, inner, outer}
191
- cb null, out
192
-
193
- #-------------
194
-
195
- exports.check_bad_type_1 = (T,cb) ->
196
- arg = chain.to_btc_constructor_arg()
197
-
198
- btc = new Cryptocurrency arg
199
- h1 = ({inner}) -> inner.obj.body.type = "eldest"
200
- await forge_bad_link { link : btc, h1 }, T.esc(defer(out), cb)
201
- link = new LinkV2 out
202
- await check_valid_link { T, chain, link }, defer err
203
- T.assert err?, "should get a verification failure"
204
- T.equal err.toString(), "Error: Wrong signature type; got 'eldest' but wanted 'cryptocurrency'", "right error text"
205
- cb()
206
-
207
- #-------------
208
-
209
- exports.check_v2_link_with_inner_version_v1 = (T,cb) ->
210
- arg = chain.to_btc_constructor_arg()
211
-
212
- btc = new Cryptocurrency arg
213
- h1 = ({inner}) ->
214
- inner.obj.body.version = 1
215
- inner.str = json_stringify_sorted inner.obj
216
- await forge_bad_link { link : btc, h1 }, T.esc(defer(out), cb)
217
- link = new LinkV2 out
218
- await check_valid_link { T, chain, link }, defer err
219
- T.assert err?, "should get a version failure"
220
- T.equal err.toString(), "Error: Version mismatch: 2 != 1"
221
- cb()
222
-
223
- #-------------
224
-
225
- exports.check_v1_link_with_inner_version_v2 = (T,cb) ->
226
- esc = make_esc cb, "check_v1_link_with_inner_version_v2"
227
- arg = chain.to_btc_constructor_arg()
228
- btc = new Cryptocurrency arg
229
- await btc._v_generate {}, esc defer()
230
- await btc.generate_json { version : 2}, esc defer _, obj
231
- obj.body.version = 2
232
- json = json_stringify_sorted obj
233
- inner = { str : json, obj : obj }
234
- await btc.sig_eng.box json, esc defer {pgp, raw, armored}
235
- out = { pgp, json, raw, armored, inner }
236
- link = new LinkV2 out
237
- await check_valid_link_v1 { T, chain, link }, defer err
238
- T.assert err?, "should get a version failure"
239
- T.equal err.toString(), "Error: Expected inner signature version 1 but got 2"
240
- cb()
241
-
242
- #-------------
243
-
244
- check_bad_link = (T,arg,f,msg,cb) ->
245
- arg or= chain.to_btc_constructor_arg()
246
- btc = new Cryptocurrency arg
247
- out = null
248
- h2 = ({outer}) ->
249
- o = unpack outer
250
- f o
251
- pack o
252
- await forge_bad_link { link : btc, h2 }, T.esc(defer(out), cb)
253
- link = new LinkV2 out
254
- await check_valid_link { T, chain, link }, defer err
255
- T.assert err?, "should get a verification failure"
256
- # Sometimes we need late binding of what the error message will be
257
- # (as a function of what f does above), so use this hack.
258
- if typeof(msg) is 'function' then msg = msg()
259
- T.equal err.toString(), msg, "right error"
260
-
261
- cb()
262
-
263
- #-------------
264
-
265
- exports.check_bad_type_2 = (T,cb) ->
266
- f = (o) -> o[4] = constants.sig_types_v2.subkey
267
- check_bad_link T, null, f, "Error: Type mismatch: 12 != 6", cb
268
-
269
- #-------------
270
-
271
- exports.check_bad_type_3 = (T,cb) ->
272
- arg = chain.to_btc_constructor_arg()
273
- arg.revoke = { sig_id : "aabb" }
274
- f = (o) -> o[4] = constants.sig_types_v2.cryptocurrency
275
- check_bad_link T, arg, f, "Error: Type mismatch: 6 != 10", cb
276
-
277
- #-------------
278
-
279
- exports.check_bad_version_outer = (T,cb) ->
280
- f = (o) -> o[0] = 1
281
- check_bad_link T, null, f, "Error: Bad version: 1 != 2", cb
282
-
283
- #-------------
284
-
285
- exports.check_bad_xss = (T,cb) ->
286
- f = (o) -> o[0] = "<script>alert()</script>"
287
- check_bad_link T, null, f, "Error: Bad version: &lt;script&gt;alert()&lt;&#x2F;script&gt; != 2", cb
288
-
289
- #-------------
290
-
291
- exports.check_bad_hash = (T,cb) ->
292
- msg = null
293
- f = (o) ->
294
- msg = "Error: hash mismatch: #{o[2].toString('hex')} != #{o[3].toString('hex')}"
295
- o[3] = o[2]
296
- msg_fn = () -> msg
297
- check_bad_link T, null, f, msg_fn, cb
298
-
299
- #-------------
300
-
301
- exports.check_bad_seqno = (T,cb) ->
302
- f = (o) -> o[1]++
303
- msg = "WrongSeqnoError: wrong seqno: 5 != 4"
304
- check_bad_link T, null, f, msg, cb
305
-
306
- #-------------
307
-
308
- exports.check_bad_seq_type = (T,cb) ->
309
- f = (o) -> o[5] = constants.seq_types.SEMIPRIVATE
310
- msg = "Error: wrong seq type: 3 != 1"
311
- check_bad_link T, null, f, msg, cb
312
-
313
- #-------------
314
-
315
- exports.check_bad_prev = (T,cb) ->
316
- msg = null
317
- f = (o) ->
318
- msg = "Error: wrong prev: #{o[3].toString('hex')} != #{o[2].toString('hex')}"
319
- o[2] = o[3]
320
- msg_fn = () -> msg
321
- check_bad_link T, null, f, msg_fn, cb
322
-
323
- #-------------
324
-
325
- exports.semiprivate_link = (T,cb) ->
326
- esc = make_esc cb, "semiprivate_link"
327
- semipriv_chain = new Chain { user }
328
- arg = semipriv_chain.to_constructor_arg({seq_type : constants.seq_types.SEMIPRIVATE})
329
- eldest = new Eldest arg
330
- await eldest.generate_v2 esc defer out
331
- T.equal out.inner.obj.seq_type, constants.seq_types.SEMIPRIVATE, "right inner seqtype"
332
- T.equal unpack(out.outer)[5], constants.seq_types.SEMIPRIVATE, "right outer seqtype"
333
- link = new LinkV2 out
334
- semipriv_chain.push link
335
- await check_valid_chain {T, chain: semipriv_chain}, esc defer()
336
- cb null
337
-
338
- #-------------
339
-
340
- exports.high_skip_ingest = (T, cb) ->
341
- esc = make_esc cb, "high_skip_ingest"
342
-
343
- await User.generate T.esc(defer(user), cb)
344
- high_skip_chain = new Chain { user }
345
-
346
- arg = high_skip_chain.to_constructor_arg({})
347
- eldest = new Eldest arg
348
- await eldest.generate_v2 esc defer out
349
- outer = out.outer
350
- T.assert not outer.high_skip?, "An older client did include high_skip_seqno; should not be returned."
351
-
352
- new_eldest_from_params = (extra_params, corruptor, cb) ->
353
- arg = high_skip_chain.to_constructor_arg({ extra_params })
354
- eldest = new Eldest arg
355
- await eldest.generate_v2 defer err, out
356
- return cb err, null if err?
357
- link = new LinkV2 out
358
- if corruptor?
359
- extra_params = corruptor extra_params
360
- await check_valid_link {T, chain: high_skip_chain, link, opts: {extra_params}}, defer err
361
- cb err, link, out
362
-
363
- gen_params = (seqno, hash, corruptor) -> { high_skip : { seqno, hash } }
364
-
365
- T.waypoint 'high_skip sanity checking'
366
- hash_val = "7f1dbeb3db94c01b64948973c1d04a87bf6ff89eec4ae61a593f81c5a0ff1700"
367
- await new_eldest_from_params (gen_params hash_val, null), null, defer err, link, out
368
- T.assert err?, 'no high_skip hash without high_skip seqno'
369
- T.assert err instanceof errors.BadHighSkipError
370
- await new_eldest_from_params (gen_params 0, hash_val), null, defer err, link, out
371
- T.assert err?, 'no high_skip hash with zero high_skip seqno'
372
- T.assert err instanceof errors.BadHighSkipError
373
- await new_eldest_from_params (gen_params 1, null), null, defer err, link, out
374
- T.assert err?, 'must provide high_skip_hash with positive high_skip_seqno'
375
- T.assert err instanceof errors.BadHighSkipError
376
- await new_eldest_from_params (gen_params 15, null), null, defer err, link, out
377
- T.assert err?, 'must provide high_skip_hash with positive high_skip_seqno'
378
- T.assert err instanceof errors.BadHighSkipError
379
- await new_eldest_from_params (gen_params 1, null), null, defer err, link, out
380
- T.assert err?, 'if seqno 1, cannot set high_skip seqno, part 1 (no hash).'
381
- T.assert err instanceof errors.BadHighSkipError
382
- await new_eldest_from_params (gen_params 1, hash_val), null, defer err, link, out
383
- T.assert err?, 'if seqno 1, cannot set high_skip seqno, part 2 (with hash).'
384
- T.assert err instanceof errors.BadHighSkipError
385
- await new_eldest_from_params (gen_params -4, hash_val), null, defer err, link, out
386
- T.assert err?, 'no negative seqno'
387
- T.assert err instanceof errors.BadHighSkipError
388
-
389
- unhex_hash_val = "qf1dbeb3db94c01b64948973c1d04a87bf6ff89eec4ae61a593f81c5a0ff1700"
390
- await new_eldest_from_params (gen_params 5, hash_val), null, defer err, link, out
391
- T.assert err?, 'hash_val must be valid hex'
392
-
393
- T.waypoint 'high_skip happy path'
394
-
395
- # Note that the second link is only acceptable because seqno is greater than 1.
396
- for [seqno, hash] in [[0, null], [1, hash_val], [2, hash_val]]
397
- await new_eldest_from_params (gen_params seqno, hash), null, esc defer link, out
398
- high_skip_chain.push link
399
-
400
- wrong_hash_val = "9e52faf4c08d21b4fa87f0561cfd415fb72ae6962b523e4b5897c3f48c5f2f97"
401
- corruptor = (extra_params) ->
402
- extra_params.high_skip.hash = wrong_hash_val
403
- return extra_params
404
- await new_eldest_from_params (gen_params 4, hash_val), corruptor, defer err, link, out
405
- T.assert err?, "client returned unexpected hash"
406
- T.assert err instanceof errors.BadHighSkipError
407
-
408
- cb null
409
-
410
- #------------
@@ -1,110 +0,0 @@
1
- {alloc,Stellar} = require '../../'
2
- {EncKeyManager,KeyManager} = require('kbpgp').kb
3
- {make_esc} = require 'iced-error'
4
- {new_sig_arg} = require './util'
5
- pgp_utils = require('pgp-utils')
6
- {json_stringify_sorted} = pgp_utils.util
7
- bitcoyne = require 'bitcoyne'
8
-
9
- exports.test_wallet_key_happy_path = (T,cb) ->
10
- esc = make_esc cb, "test_sibkey_happy_path"
11
- await KeyManager.generate {}, esc defer device
12
- await KeyManager.generate {}, esc defer stellar
13
- arg = new_sig_arg { km : device }
14
- arg.wallet =
15
- km : stellar
16
- network : "stellar"
17
- name : "default"
18
- obj = new Stellar arg
19
- await obj.generate esc defer out
20
- typ = out.inner.obj.body.type
21
- obj2 = alloc typ, arg
22
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
23
- await obj2.verify varg, esc defer()
24
- cb null
25
-
26
- round_trip_with_corrupted_reverse_sig = ({T, corrupt}, cb) ->
27
- esc = make_esc cb, "round_trip_with_corrupted_reverse_sig"
28
- await KeyManager.generate {}, esc defer device
29
- await KeyManager.generate {}, esc defer stellar
30
- arg = new_sig_arg { km : device }
31
- arg.wallet =
32
- km : stellar
33
- network : "stellar"
34
- name : "foo"
35
- obj = new Stellar arg
36
-
37
- obj._v_generate = (opts, cb) ->
38
- esc = make_esc cb, "_v_generate"
39
- x = { reverse_sig: null }
40
- @set_new_key_section x
41
- x.kid = @get_new_km().get_ekid().toString('hex')
42
- eng = @get_new_km().make_sig_eng()
43
- await @generate_json { version : opts.version }, esc defer msg
44
- msg2 = JSON.parse msg
45
- msg2.foo = "bar" if corrupt
46
- msg = json_stringify_sorted(msg2)
47
- await eng.box msg, esc defer { armored, type }
48
- x.reverse_sig = armored
49
- cb null
50
-
51
- await obj.generate esc defer out
52
- typ = out.inner.obj.body.type
53
- obj2 = alloc typ, arg
54
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
55
- await obj2.verify varg, defer err
56
- if corrupt
57
- T.assert err?, "got an error back"
58
- T.assert (err.message.indexOf('Reverse sig json mismatch') >= 0), "found right error message"
59
- else
60
- T.no_error err, "in the success case, don't expect an error"
61
- cb null
62
-
63
- exports.test_corruption_mechanism = (T,cb) ->
64
- round_trip_with_corrupted_reverse_sig { T, corrupt : false }, cb
65
-
66
- exports.test_reverse_sig_failure = (T,cb) ->
67
- round_trip_with_corrupted_reverse_sig { T, corrupt : true }, cb
68
-
69
- round_trip_with_dropped_accountID = ({T, corrupt}, cb) ->
70
- esc = make_esc cb, "round_trip_with_corrupted_reverse_sig"
71
- await KeyManager.generate {}, esc defer device
72
- await KeyManager.generate {}, esc defer stellar
73
- await KeyManager.generate {}, esc defer stellar2
74
- arg = new_sig_arg { km : device }
75
- arg.wallet =
76
- km : stellar
77
- network : "stellar"
78
- name : "foo"
79
- obj = new Stellar arg
80
-
81
- km_to_base = (k) -> k.get_ekid()[2...-1]
82
-
83
- obj._v_customize_json = (ret) ->
84
- ret.body[@get_key_field()] = @get_new_key_section()
85
- ret.body.device = @device if @device?
86
- ret.body.wallet =
87
- network : "stellar"
88
- name : "foo"
89
- if corrupt
90
- ret.body.wallet.address = bitcoyne.stellar.public_key.encode km_to_base stellar2
91
- else
92
- ret.body.wallet.address = bitcoyne.stellar.public_key.encode km_to_base stellar
93
-
94
- await obj.generate esc defer out
95
- typ = out.inner.obj.body.type
96
- obj2 = alloc typ, arg
97
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
98
- await obj2.verify varg, defer err
99
- if corrupt
100
- T.assert err?, "got an error back"
101
- T.assert (err.message.indexOf("Stellar Account ID didn't match given KID") >= 0), "found right error message"
102
- else
103
- T.no_error err, "in the success case, don't expect an error"
104
- cb null
105
-
106
- exports.test_dropped_accountID_mechanism = (T,cb) ->
107
- round_trip_with_dropped_accountID { T, corrupt : false }, cb
108
-
109
- exports.test_dropped_account_ID = (T,cb) ->
110
- round_trip_with_dropped_accountID { T, corrupt : true }, cb
package/test/run.iced DELETED
@@ -1 +0,0 @@
1
- require('iced-test').main { mainfile : __filename }
package/test_scraper.iced DELETED
@@ -1,49 +0,0 @@
1
- TwitterScraper = require './src/twitter_scraper.iced'
2
-
3
- # -------------------------------------------------------------------------------------------------
4
-
5
- scraper = new TwitterScraper()
6
-
7
- # -------------------------------------------------------------------------------------------------
8
-
9
- console.log "Testing direct lookup."
10
- await scraper.check_status "malgorithms", "400699000954699777", "bitcoin", defer err
11
- if err?
12
- console.log "Error: #{err}"
13
-
14
- # -------------------------------------------------------------------------------------------------
15
-
16
- console.log "Testing hunt method."
17
- await scraper.hunt "malgorithms", "Beer", defer err, tweet_id
18
- if err?
19
- console.log "Error: #{err}"
20
- else
21
- console.log " -- Testing found post."
22
- await scraper.check_status "malgorithms", tweet_id, "Beer", defer err
23
- if err?
24
- console.log "Error: #{err}"
25
-
26
- # -------------------------------------------------------------------------------------------------
27
-
28
- console.log "Testing bad case on username."
29
- await scraper.hunt "MALGORITHMS", "Beer", defer err, tweet_id
30
- if err?
31
- console.log "Error: #{err}"
32
- else
33
- console.log " -- Testing found post."
34
- await scraper.check_status "MALGORITHMS", tweet_id, "Beer", defer err
35
- if err?
36
- console.log "Error: #{err}"
37
-
38
- console.log "Testing protected user."
39
- await scraper.hunt "foo", "Beer", defer err, tweet_id
40
- console.log "Response: #{err}, #{tweet_id}"
41
-
42
-
43
- # -------------------------------------------------------------------------------------------------
44
-
45
- console.log "Testing hunting for shit which doesn't exist."
46
- await scraper.hunt "malgorithms", "BOOYEAH WHOO HAH.", defer err, tweet_id
47
- console.log "Response: #{err}, #{tweet_id}"
48
-
49
-