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.
- package/CHANGELOG.md +4 -0
- package/lib/base.js +64 -62
- package/lib/subkey.js +16 -14
- package/package.json +7 -2
- package/src/base.iced +6 -3
- package/src/subkey.iced +6 -4
- package/.github/workflows/ci.yml +0 -37
- package/.z-scratch/codex-session-01a08545-90c5-73c0-b2c2-68d94481fb63.md +0 -9075
- package/CONTRIBUTORS.md +0 -5
- package/Makefile +0 -69
- package/teams_sample.cson +0 -211
- package/test/files/alloc.iced +0 -40
- package/test/files/auth.iced +0 -132
- package/test/files/b64.iced +0 -58
- package/test/files/errsan.iced +0 -13
- package/test/files/expand.iced +0 -128
- package/test/files/generic_social.iced +0 -67
- package/test/files/parse3.iced +0 -61
- package/test/files/per_user_key.iced +0 -74
- package/test/files/schema3.iced +0 -258
- package/test/files/sibkey.iced +0 -60
- package/test/files/team.iced +0 -118
- package/test/files/team_hidden.iced +0 -321
- package/test/files/util.iced +0 -55
- package/test/files/v2.iced +0 -410
- package/test/files/wallet.iced +0 -110
- package/test/run.iced +0 -1
- package/test_scraper.iced +0 -49
|
@@ -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
|
-
|
package/test/files/parse3.iced
DELETED
|
@@ -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
|
package/test/files/schema3.iced
DELETED
|
@@ -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
|
package/test/files/sibkey.iced
DELETED
|
@@ -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
|
package/test/files/team.iced
DELETED
|
@@ -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
|