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,67 +0,0 @@
1
- {alloc,GenericSocialBinding,constants} = require '../../'
2
- {EncKeyManager,KeyManager} = require('kbpgp').kb
3
- {make_esc} = require 'iced-error'
4
- {new_sig_arg} = require './util'
5
-
6
- generic_name_regexp = /^[a-z0-9_-]{2,15}$/
7
-
8
- exports.test_generic_social_proof = (T, cb) ->
9
- esc = make_esc cb, "test_generic_social_proof"
10
- await KeyManager.generate {}, esc defer device
11
- arg = new_sig_arg { km : device }
12
- arg.user.remote = "al1ce"
13
- arg.remote_service = "api.crypto_pals.social"
14
- arg.name_regexp = generic_name_regexp
15
- obj = new GenericSocialBinding arg
16
- await obj.generate esc defer out
17
-
18
- obj2 = alloc "web_service_binding.generic_social", arg
19
- err = obj2.check_inputs()
20
- T.assert not(err?), "expects check_inputs not to return error, returned: #{err?.toString()}"
21
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
22
- await obj2.verify varg, esc defer err
23
-
24
- T.equal obj2.service_obj(), { name : arg.remote_service, username : arg.user.remote }
25
- T.equal obj2.proof_type(), constants.proof_types.generic_social, "got right proof_type"
26
- T.equal obj2.service_name(), arg.remote_service, "got right service_name"
27
- T.equal obj2.single_occupancy(), false, "got right single_occupancy"
28
-
29
- cb null
30
-
31
- exports.test_generic_social_inputs = (T, cb) ->
32
- assert_err = (err, str) ->
33
- err_str = err?.toString()
34
- T.assert err_str?.indexOf(str) isnt -1, "Expecting error to contain '#{str}', got: #{err_str}"
35
-
36
- esc = make_esc cb, "test_generic_social_proof"
37
- await KeyManager.generate {}, esc defer device
38
- arg = new_sig_arg { km : device }
39
- arg.user.remote = "b0b"
40
- arg.remote_service = "cryptopals"
41
- arg.name_regexp = generic_name_regexp
42
- obj = new GenericSocialBinding arg
43
- err = obj.check_inputs()
44
- assert_err err, "invalid remote_service"
45
-
46
- arg.remote_service = "cryptopals.club"
47
- arg.user.remote = "HelloBobby$$$"
48
- obj = new GenericSocialBinding arg
49
- err = obj.check_inputs()
50
- assert_err err, "Bad remote_username given"
51
-
52
- arg = new_sig_arg { km : device }
53
- arg.user.remote = "b0b"
54
- arg.remote_service = "cryptopals.club"
55
- obj = new GenericSocialBinding arg
56
- err = obj.check_inputs()
57
- assert_err err, "No name_regexp given"
58
-
59
- # Invalid regexp
60
- arg.name_regexp = "[1-.]{1,5}"
61
- obj = new GenericSocialBinding arg
62
- err = obj.check_inputs()
63
- assert_err err, "No name_regexp given"
64
-
65
- cb null
66
-
67
-
@@ -1,61 +0,0 @@
1
- parse3 = require '../../lib/parse3'
2
- schema = require '../../lib/schema3'
3
-
4
- exports.hex_rejects_trailing_junk = (T, cb) ->
5
- uid = "00".repeat(15) + "19"
6
- hash = "00".repeat(32)
7
-
8
- uid_upper = "AA".repeat(15) + "19"
9
-
10
- T.assert parse3.is_hex(uid, 16), "valid uid hex is accepted"
11
- T.assert parse3.is_hex(uid_upper, 16), "uppercase uid hex is accepted"
12
- T.assert not parse3.is_hex(uid + "zz", 16), "uid hex plus junk is rejected"
13
- T.assert not parse3.is_hex(uid + "a", 16), "odd-length uid hex is rejected"
14
- T.assert not parse3.is_hex(hash + "nothex", 32), "hash hex plus junk is rejected"
15
-
16
- T.assert not parse3.is_uid(hash), "length has to match"
17
-
18
- err = schema.uid().convert().check uid
19
- T.assert not err?, "valid uid converts"
20
-
21
- err = schema.uid().convert().check uid_upper
22
- T.assert not err?, "uppercase uid converts"
23
-
24
- err = schema.uid().convert().check hash
25
- T.assert err?, "length has to match"
26
-
27
- err = schema.uid().convert().check uid + "zz"
28
- T.assert err?, "uid with trailing junk is rejected"
29
-
30
- err = schema.uid().convert().check uid + "a"
31
- T.assert err?, "odd-length uid is rejected"
32
-
33
- err = schema.hash().convert().check hash + "zz"
34
- T.assert err?, "hash with trailing junk is rejected"
35
-
36
- out = parse3.unhex uid
37
- T.assert Buffer.isBuffer(out) and out.length is 16, "unhex accepts valid uid"
38
-
39
- out = parse3.unhex uid_upper
40
- T.assert Buffer.isBuffer(out) and out.length is 16, "unhex accepts uppercase uid"
41
-
42
- for bad in [uid + "zz", uid + "a"]
43
- err = null
44
- try
45
- parse3.unhex bad
46
- catch e
47
- err = e
48
- T.assert err?, "unhex rejects #{bad}"
49
- T.assert err.toString().indexOf("bad binary or hex string") >= 0, "unhex error message"
50
-
51
- cb null
52
-
53
- exports.hex_rejects_length_like_objects = (T, cb) ->
54
- uid_buf = Buffer.alloc 16
55
- T.assert parse3.is_hex(uid_buf, 16), "buffer of the right length is accepted"
56
- T.assert not parse3.is_hex(Buffer.alloc(15), 16), "buffer of the wrong length is rejected"
57
- T.assert not parse3.is_hex({length : 16}, 16), "plain object with length is rejected"
58
- T.assert not parse3.is_hex((0 for i in [0...16]), 16), "array of the right length is rejected"
59
- T.assert not parse3.is_uid({length : 16}), "is_uid rejects a length-like object"
60
-
61
- cb null
@@ -1,74 +0,0 @@
1
- {EncKeyManager,KeyManager} = require('kbpgp').kb
2
- {make_esc} = require 'iced-error'
3
- {alloc,PerUserKey} = require '../../'
4
- {prng} = require 'crypto'
5
- {new_sig_arg} = require './util'
6
- pgp_utils = require('pgp-utils')
7
- {json_stringify_sorted} = pgp_utils.util
8
-
9
- exports.test_per_user_key = (T,cb) ->
10
- esc = make_esc cb, "test_per_user_key"
11
- await EncKeyManager.generate {}, esc defer ekm
12
- await KeyManager.generate {}, esc defer skm
13
- await KeyManager.generate {}, esc defer pkm
14
- arg = new_sig_arg { km : pkm }
15
- arg.kms =
16
- encryption : ekm
17
- signing : skm
18
- arg.generation = 1
19
- pf = new PerUserKey arg
20
- await pf.generate_v2 esc defer out
21
- pf2 = alloc out.inner.obj.body.type, arg
22
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
23
- await pf2.verify_v2 varg, esc defer()
24
- cb()
25
-
26
- round_trip_with_corrupted_reverse_sig = ({T, corrupt, skip_reverse_sig}, cb) ->
27
- esc = make_esc cb, "round_trip_with_corrupted_reverse_sig"
28
- await KeyManager.generate {}, esc defer elder
29
- await KeyManager.generate {}, esc defer skm
30
- await EncKeyManager.generate {}, esc defer ekm
31
- arg = new_sig_arg { km : elder }
32
- arg.kms =
33
- encryption : ekm
34
- signing : skm
35
- arg.generation = 3
36
- obj = new PerUserKey arg
37
-
38
- obj._v_generate = (opts, cb) ->
39
- esc = make_esc cb, "_v_generate"
40
- x = { reverse_sig: null }
41
- @set_new_key_section x
42
- x.signing_kid = @get_new_km().get_ekid().toString('hex')
43
- eng = @get_new_km().make_sig_eng()
44
- await @generate_json { version : opts.version }, esc defer msg
45
- msg2 = JSON.parse msg
46
- msg2.foo = "bar" if corrupt
47
- msg = json_stringify_sorted(msg2)
48
- await eng.box msg, esc defer { armored, type }
49
- x.reverse_sig = armored unless skip_reverse_sig
50
- cb null
51
-
52
- await obj.generate esc defer out
53
- typ = out.inner.obj.body.type
54
- obj2 = alloc typ, arg
55
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
56
- await obj2.verify varg, defer err
57
- if corrupt
58
- T.assert err?, "got an error back"
59
- T.assert (err.message.indexOf('Reverse sig json mismatch') >= 0), "found right error message"
60
- else if skip_reverse_sig
61
- T.assert err?, "got an error back"
62
- T.assert (err.message.indexOf("Need a reverse sig, but didn't find one") >= 0), "found right error message"
63
- else
64
- T.no_error err, "in the success case, don't expect an error"
65
- cb null
66
-
67
- exports.test_corruption_mechanism = (T,cb) ->
68
- round_trip_with_corrupted_reverse_sig { T, corrupt : false }, cb
69
-
70
- exports.test_reverse_sig_failure = (T,cb) ->
71
- round_trip_with_corrupted_reverse_sig { T, corrupt : true }, cb
72
-
73
- exports.test_reverse_sig_failure = (T,cb) ->
74
- round_trip_with_corrupted_reverse_sig { T, skip_reverse_sig : true }, cb
@@ -1,258 +0,0 @@
1
- schema = require '../../lib/schema3'
2
- {pack,unpack} = require 'purepack'
3
-
4
- # These collide with Object.prototype and with lookups like obj[k] /
5
- # obj.hasOwnProperty(k).
6
- _object_proto_names = [
7
- "__proto__"
8
- "constructor"
9
- "hasOwnProperty"
10
- "isPrototypeOf"
11
- "propertyIsEnumerable"
12
- "toLocaleString"
13
- "toString"
14
- "valueOf"
15
- ]
16
- # "Weird key names" - Object prototype keys but handled by schema3 library.
17
- # With the exception of __proto__ - this one is banned because it requires
18
- # extra care to get right and has more footguns. See src/schema3.iced
19
- # is_reserved_key_name
20
- _weird_key_names = (n for n in _object_proto_names when n isnt "__proto__")
21
-
22
- exports.prototype_pollution_json = (T, cb) ->
23
- # parsing "__proto__" property should not change resulting object's
24
- # prototype.
25
- obj = JSON.parse('{"__proto__":1}')
26
- T.assert Object.getPrototypeOf(obj) is Object.prototype, "is Object.prototype"
27
- T.assert Object::hasOwnProperty.call(obj, '__proto__'), "hasOwnProperty __proto__"
28
-
29
- cb null
30
-
31
- exports.prototype_pollution_purepack = (T, cb) ->
32
- # purepack does not allow __proto__ keys, although accidentially.
33
-
34
- # Create a purepack with aaaaaaaaa property
35
- aaa = Buffer.from (pack { aaaaaaaaa : 1 })
36
-
37
- # Sanity check, 'aaaaaaaaa' is just a normal key in an unpacked object.
38
- obj = unpack aaa
39
- T.assert Object.getPrototypeOf(obj) is Object.prototype, "is Object.prototype"
40
- T.assert Object::hasOwnProperty.call(obj, 'aaaaaaaaa'), "hasOwnProperty aaaaaaaaa"
41
-
42
- # Str-replace aaaaaaaaa into __proto__
43
- bin = Buffer.from(aaa.toString('binary').replace('aaaaaaaaa', '__proto__'), 'binary')
44
- err = null
45
- try
46
- unpack(bin)
47
- catch e
48
- err = e
49
- T.assert err?
50
- T.equal err?.message, "duplicate key '__proto__'"
51
-
52
- cb null
53
-
54
- exports.or_combinator = (T, cb) ->
55
- schm = schema.or([
56
- schema.dict({
57
- name : schema.string()
58
- username : schema.string()
59
- })
60
- schema.dict({
61
- protocol : schema.string()
62
- hostname : schema.string()
63
- })
64
- ])
65
-
66
- err = schm.check { name : "reddit", username : "alice" }
67
- T.assert not err?, "object matching first term is accepted"
68
-
69
- err = schm.check { protocol : "https:", hostname : "example.com" }
70
- T.assert not err?, "object matching second term is accepted"
71
-
72
- err = schm.check { invalid : 1, obj : 2 }
73
- T.assert err?, "object matching no term is rejected"
74
- T.equal err?.message, "At <top>: no structure worked"
75
-
76
- cb null
77
-
78
- exports.required_null_rejected = (T, cb) ->
79
- for val in [null, undefined]
80
- err = schema.array(schema.obj()).check [val]
81
- T.assert err?, "array of obj() rejects null"
82
- T.equal err?.message, "At <top>.0: value cannot be null"
83
-
84
- err = schema.array(schema.string()).check [val]
85
- T.assert err?, "array of obj() rejects null"
86
- T.equal err?.message, "At <top>.0: value cannot be null"
87
-
88
- err = schema.struct([schema.obj()]).check [val]
89
- T.assert err?, "struct of obj() rejects null"
90
- T.equal err?.message, "At <top>.0: value cannot be null"
91
-
92
- err = schema.struct([schema.string()]).check [val]
93
- T.assert err?, "struct of obj() rejects null"
94
- T.equal err?.message, "At <top>.0: value cannot be null"
95
-
96
- err = schema.dict({ x : schema.obj() }).check { x : val }
97
- T.assert err?, "dict required obj() null is rejected"
98
- T.equal err?.message, "At <top>.x: value cannot be null"
99
-
100
- err = schema.dict({ x : schema.string() }).check { x : val }
101
- T.assert err?, "dict required string null is rejected"
102
- T.equal err?.message, "At <top>.x: value cannot be null"
103
-
104
- err = schema.dict({ x : schema.string().optional() }).check { x : val }
105
- T.assert not err?, "dict optional string null is accepted"
106
-
107
- cb null
108
-
109
- exports.dict_missing_mandatory_key = (T, cb) ->
110
- schm = schema.dict({
111
- n : schema.string().name("name")
112
- nick : schema.string().optional()
113
- })
114
-
115
- err = schm.check { n : "alice" }
116
- T.assert not err?, "optional key may be omitted"
117
-
118
- err = schm.check { nick : "a" }
119
- T.assert err?, "missing mandatory key is rejected"
120
- T.equal err?.message, "At <top>.n: key is missing but is mandatory"
121
-
122
- err = schm.check {}
123
- T.assert err?, "empty dict missing mandatory key is rejected"
124
- T.equal err?.message, "At <top>.n: key is missing but is mandatory"
125
-
126
- localized = schm.debug_localize { n : "alice" }
127
- T.equal localized.name, "alice", "debug_localize uses schema names"
128
- T.assert not localized.n?, "short key is replaced"
129
-
130
- cb null
131
-
132
- exports.string_enum_rejects_unknown_weird_names = (T, cb) ->
133
- schm = schema.string_enum ["in_person", "proofs", "video"]
134
- err = schm.check "video"
135
- T.assert not err?, "listed enum value is accepted"
136
-
137
- err = schm.check "nope"
138
- T.assert err?, "unknown enum value is rejected"
139
-
140
- # Make sure that Object prototype names are not bugging out with string enum check.
141
- for name in _object_proto_names
142
- err = schm.check name
143
- T.assert err?, "#{name} is not an enum value just because it is a prototype name"
144
- T.assert (err?.message.indexOf("unknown enum value") >= 0), "#{name} error message"
145
-
146
- cb null
147
-
148
- exports.string_enum_allows_weird_names = (T, cb) ->
149
- for name in _weird_key_names
150
- # Allow a string enum with weird name.
151
- schm = schema.string_enum [name]
152
- # And it can also be checked properly
153
- err = schm.check name
154
- T.assert not err?, "#{name} can be an enum value"
155
- err = schm.check "nope"
156
- T.assert err?, "other values still rejected next to #{name}"
157
-
158
- # Do not allow banned __proto__ name.
159
- threw = null
160
- try
161
- schema.string_enum ["__proto__"]
162
- catch e
163
- threw = e
164
- T.assert threw?, "__proto__ is not a valid enum value"
165
- T.equal threw?.message, "enum value is not allowed: __proto__"
166
-
167
- cb null
168
-
169
- exports.dict_rejects_unknown_weird_keys = (T, cb) ->
170
- schm = schema.dict { name : schema.string() }
171
- err = schm.check { name : "ok" }
172
- T.assert not err?, "valid dict is accepted"
173
-
174
- err = schm.check { name : "ok", extra : 1 }
175
- T.assert err?, "unknown key is rejected"
176
- T.equal err?.message, "At <top>.extra: key is not supported"
177
-
178
- # Allow weird key names to be checked against the schema, they are just not
179
- # defined as dict fields and payloads with these fields are correctly
180
- # rejected. They are not rejected / banned, and are treated as any other name
181
- # (also see next test).
182
- for name in _weird_key_names
183
- obj = JSON.parse "{\"name\":\"ok\",\"#{name}\":1}"
184
- err = null
185
- threw = null
186
- try
187
- err = schm.check obj
188
- catch e
189
- threw = e
190
- T.assert not threw?, "#{name} should not throw"
191
- T.assert err?, "#{name} extra key is not a schema field"
192
- T.equal err?.message, "At <top>.#{name}: key is not supported"
193
-
194
- obj = JSON.parse '{"name":"ok","__proto__":1}'
195
- err = schm.check obj
196
- T.assert err?, "__proto__ extra key is rejected"
197
- T.equal err?.message, "At <top>.__proto__: key name is not allowed"
198
-
199
- schm = schema.dict({ name : schema.string() }).allow_extra_keys()
200
- obj = JSON.parse '{"name":"ok","constructor":1}'
201
- err = schm.check obj
202
- T.assert not err?, "constructor extra key is allowed when extra keys are allowed"
203
-
204
- obj = JSON.parse '{"name":"ok","__proto__":1}'
205
- err = schm.check obj
206
- T.assert err?, "__proto__ is rejected even with allow_extra_keys"
207
- T.equal err?.message, "At <top>.__proto__: key name is not allowed"
208
-
209
- cb null
210
-
211
- exports.dict_weird_schema_keys = (T, cb) ->
212
- # Weird keys can be used in the schema as well, and objects with these
213
- # keys can be checked against the schemas.
214
- for name in _weird_key_names
215
- keys = {}
216
- keys[name] = schema.string()
217
- schm = schema.dict keys
218
-
219
- own = JSON.parse "{\"#{name}\":\"ok\"}"
220
- err = schm.check own
221
- T.assert not err?, "own #{name} key is accepted"
222
-
223
- err = schm.check {}
224
- T.assert err?, "inherited #{name} does not satisfy a required schema key"
225
- T.equal err?.message, "At <top>.#{name}: key is missing but is mandatory"
226
-
227
- localized = schm.debug_localize {}
228
- T.assert not Object::hasOwnProperty.call(localized, name), "debug_localize ignores inherited #{name}"
229
- localized = schm.debug_localize own
230
- T.equal localized[name], "ok", "own #{name} key is localized"
231
-
232
- schm = schema.dict { name : schema.string() }
233
- schm.set_key name, schema.string()
234
- obj = JSON.parse "{\"name\":\"ok\",\"#{name}\":\"ok\"}"
235
- err = schm.check obj
236
- T.assert not err?, "set_key can install #{name}"
237
-
238
- # With the exception of __proto__ which is rejected in the schema construction stage.
239
- keys = {}
240
- Object.defineProperty keys, "__proto__", { value : schema.string(), enumerable : true }
241
- threw = null
242
- try
243
- schema.dict keys
244
- catch e
245
- threw = e
246
- T.assert threw?, "__proto__ is not a valid schema key"
247
- T.equal threw?.message, "schema key name is not allowed: __proto__"
248
-
249
- schm = schema.dict { name : schema.string() }
250
- threw = null
251
- try
252
- schm.set_key "__proto__", schema.string()
253
- catch e
254
- threw = e
255
- T.assert threw?, "set_key rejects __proto__"
256
- T.equal threw?.message, "schema key name is not allowed: __proto__"
257
-
258
- cb null
@@ -1,60 +0,0 @@
1
- {alloc,Sibkey} = 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
-
8
- exports.test_sibkey_happy_path = (T,cb) ->
9
- esc = make_esc cb, "test_sibkey_happy_path"
10
- await KeyManager.generate {}, esc defer elder
11
- await KeyManager.generate {}, esc defer sib
12
- arg = new_sig_arg { km : elder }
13
- arg.sibkm = sib
14
- obj = new Sibkey arg
15
- await obj.generate esc defer out
16
- typ = out.inner.obj.body.type
17
- obj2 = alloc typ, arg
18
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
19
- await obj2.verify varg, esc defer()
20
- cb null
21
-
22
- round_trip_with_corrupted_reverse_sig = ({T, corrupt}, cb) ->
23
- esc = make_esc cb, "round_trip_with_corrupted_reverse_sig"
24
- await KeyManager.generate {}, esc defer elder
25
- await KeyManager.generate {}, esc defer sib
26
- arg = new_sig_arg { km : elder }
27
- arg.sibkm = sib
28
- obj = new Sibkey arg
29
-
30
- obj._v_generate = (opts, cb) ->
31
- esc = make_esc cb, "_v_generate"
32
- x = { reverse_sig: null }
33
- @set_new_key_section x
34
- x.kid = @get_new_km().get_ekid().toString('hex')
35
- eng = @get_new_km().make_sig_eng()
36
- await @generate_json { version : opts.version }, esc defer msg
37
- msg2 = JSON.parse msg
38
- msg2.foo = "bar" if corrupt
39
- msg = json_stringify_sorted(msg2)
40
- await eng.box msg, esc defer { armored, type }
41
- x.reverse_sig = armored
42
- cb null
43
-
44
- await obj.generate esc defer out
45
- typ = out.inner.obj.body.type
46
- obj2 = alloc typ, arg
47
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str }
48
- await obj2.verify varg, defer err
49
- if corrupt
50
- T.assert err?, "got an error back"
51
- T.assert (err.message.indexOf('Reverse sig json mismatch') >= 0), "found right error message"
52
- else
53
- T.no_error err, "in the success case, don't expect an error"
54
- cb null
55
-
56
- exports.test_corruption_mechanism = (T,cb) ->
57
- round_trip_with_corrupted_reverse_sig { T, corrupt : false }, cb
58
-
59
- exports.test_reverse_sig_failure = (T,cb) ->
60
- round_trip_with_corrupted_reverse_sig { T, corrupt : true }, cb
@@ -1,118 +0,0 @@
1
- {alloc,team} = 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
-
8
- test_klass = ({T,arg, klass, keys}, cb) ->
9
- esc = make_esc cb, "test_klass"
10
- delete arg.kms
11
- delete arg.team.per_team_key
12
- if keys
13
- arg.kms = {}
14
- await EncKeyManager.generate {}, esc defer arg.kms.encryption
15
- await KeyManager.generate {}, esc defer arg.kms.signing
16
- arg.kms.generation = 10
17
- obj = new klass arg
18
- await obj.generate_v2 esc(defer(out)), {dohash:true}
19
- typ = out.inner.obj.body.type
20
- obj2 = alloc typ, arg
21
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str, require_packet_hash : true }
22
- await obj2.verify_v2 varg, esc defer()
23
- T.waypoint "checked #{typ} #{if keys then 'with' else 'without'} keys"
24
- cb null
25
-
26
- exports.test_all_classes = (T,cb) ->
27
- esc = make_esc cb, "test_all_classes"
28
- klasses = [team.Index, team.Root, team.ChangeMembership, team.RotateKey,
29
- team.NewSubteam, team.Leave, team.SubteamHead, team.RenameSubteam,
30
- team.Invite, team.RenameUpPointer, team.DeleteSubteam, team.DeleteRoot,
31
- team.DeleteUpPointer, team.KBFS, team.Settings, team.BotSettings]
32
- await KeyManager.generate {}, esc defer km
33
- arg = new_sig_arg { km }
34
- arg.team = { members : { admin : ["a"] } }
35
- for klass in klasses
36
- await test_klass { T, arg, klass, keys : true }, esc defer()
37
- await test_klass { T, arg, klass, keys : false }, esc defer()
38
- cb()
39
-
40
- exports.test_key_section_bad_and_good = (T,cb) ->
41
- esc = make_esc cb, "test_bad_key_section"
42
- await KeyManager.generate {}, esc defer km
43
- arg = new_sig_arg { km }
44
- arg.team = { members : { admin : ["a"] } }
45
- arg.kms = {}
46
- await EncKeyManager.generate {}, esc defer arg.kms.encryption
47
- await KeyManager.generate {}, esc defer arg.kms.signing
48
-
49
- verify_from_arg = ({arg}, cb) ->
50
- obj = new team.RotateKey arg
51
- await obj.generate_v2 esc(defer(out)), {dohash:true}
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, require_packet_hash : true }
55
- await obj2.verify_v2 varg, defer err
56
- cb err
57
- await verify_from_arg { arg }, defer err
58
- T.assert err?, "we got an error back"
59
- T.equal err.message, "Need per_team_key.generation to be an integer > 0 (got undefined)", "right message"
60
-
61
- arg.kms.generation = 10
62
- arg.kms.appkey_derivation_version = "foo"
63
- await verify_from_arg { arg }, defer err
64
- T.assert err?, "we got an error back"
65
- T.equal err.message, "Need per_team_key.appkey_derivation_version to be an integer >= 1 (got foo)", "right message"
66
-
67
- arg.kms.appkey_derivation_version = 0
68
- await verify_from_arg { arg }, defer err
69
- T.assert err?, "we got an error back"
70
- T.equal err.message, "Need per_team_key.appkey_derivation_version to be an integer >= 1 (got 0)", "right message"
71
-
72
- arg.kms.appkey_derivation_version = 2
73
- await verify_from_arg { arg }, defer err
74
- T.no_error err, "should work"
75
-
76
- cb null
77
-
78
- round_trip_with_corrupted_reverse_sig = ({T, corrupt}, cb) ->
79
- esc = make_esc cb, "test_bad_key_section"
80
- await KeyManager.generate {}, esc defer km
81
- arg = new_sig_arg { km }
82
- arg.team = { members : { admin : ["a"] } }
83
- arg.kms = {}
84
- await EncKeyManager.generate {}, esc defer arg.kms.encryption
85
- await KeyManager.generate {}, esc defer arg.kms.signing
86
- arg.kms.generation = 10
87
- obj = new team.RotateKey arg
88
-
89
- obj._v_generate = (opts, cb) ->
90
- esc = make_esc cb, "_v_generate"
91
- x = { reverse_sig: null }
92
- @set_new_key_section x
93
- eng = @get_new_km().make_sig_eng()
94
- await @generate_json { version : opts.version }, esc defer msg
95
- msg2 = JSON.parse msg
96
- msg2.foo = "bar" if corrupt
97
- msg = json_stringify_sorted(msg2)
98
- await eng.box msg, esc defer { armored, type }
99
- x.reverse_sig = armored
100
- cb null
101
-
102
- await obj.generate_v2 esc(defer(out)), {dohash:true}
103
- typ = out.inner.obj.body.type
104
- obj2 = alloc typ, arg
105
- varg = { armored : out.armored, skip_ids : true, make_ids : true, inner : out.inner.str, require_packet_hash : true }
106
- await obj2.verify_v2 varg, defer err
107
- if corrupt
108
- T.assert err?, "got an error back"
109
- T.assert (err.message.indexOf('Reverse sig json mismatch') >= 0), "found right error message"
110
- else
111
- T.no_error err, "in the success case, don't expect an error"
112
- cb null
113
-
114
- exports.test_corruption_mechanism = (T,cb) ->
115
- round_trip_with_corrupted_reverse_sig { T, corrupt : false }, cb
116
-
117
- exports.test_reverse_sig_failure = (T,cb) ->
118
- round_trip_with_corrupted_reverse_sig { T, corrupt : true }, cb