@bitgo-beta/sdk-core 8.2.1-beta.2009 → 8.2.1-beta.2010

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.
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=derivableEd25519Pub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derivableEd25519Pub.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/safe/derivableEd25519Pub.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ require("should");
37
+ const src_1 = require("../../../../src");
38
+ // Cross-repo fixture: byte-identical to
39
+ // packages/wallet-platform/test/unit/base/safes/fixtures/derivableEd25519Pub.json.
40
+ // Four independent implementations of this split will otherwise drift, and the failure mode is an
41
+ // unrecoverable wallet.
42
+ const fixture = __importStar(require("./fixtures/derivableEd25519Pub.json"));
43
+ describe('derivableEd25519Pub', function () {
44
+ describe('format constants', function () {
45
+ it('matches the constants pinned in the shared fixture', function () {
46
+ src_1.DERIVABLE_ED25519_PUB_SPLIT_OFFSET.should.equal(fixture.splitOffset);
47
+ src_1.DERIVABLE_ED25519_CHAIN_CODE_LENGTH.should.equal(fixture.chainCodeLength);
48
+ src_1.DERIVABLE_ED25519_PUB_LENGTH.should.equal(fixture.compositeLength);
49
+ });
50
+ });
51
+ describe('encodeDerivableEd25519Pub', function () {
52
+ for (const v of fixture.valid) {
53
+ it(`composes ${v.name}`, function () {
54
+ (0, src_1.encodeDerivableEd25519Pub)(v.pub, v.chainCode).should.equal(v.composite);
55
+ });
56
+ }
57
+ for (const v of fixture.invalidEncodeInputs) {
58
+ it(`rejects ${v.name}`, function () {
59
+ (() => (0, src_1.encodeDerivableEd25519Pub)(v.pub, v.chainCode)).should.throw(/Invalid derivable ed25519 pub/);
60
+ });
61
+ }
62
+ });
63
+ describe('decodeDerivableEd25519Pub', function () {
64
+ for (const v of fixture.valid) {
65
+ it(`splits ${v.name}`, function () {
66
+ (0, src_1.decodeDerivableEd25519Pub)(v.composite).should.eql({ pub: v.pub, chainCode: v.chainCode });
67
+ });
68
+ }
69
+ for (const v of fixture.invalidComposite) {
70
+ it(`rejects ${v.name}`, function () {
71
+ (() => (0, src_1.decodeDerivableEd25519Pub)(v.composite)).should.throw(/Invalid derivable ed25519 pub/);
72
+ (0, src_1.isDerivableEd25519Pub)(v.composite).should.equal(false);
73
+ });
74
+ }
75
+ });
76
+ describe('round trip', function () {
77
+ for (const v of fixture.valid) {
78
+ it(`round-trips ${v.name}`, function () {
79
+ const composite = (0, src_1.encodeDerivableEd25519Pub)(v.pub, v.chainCode);
80
+ const decoded = (0, src_1.decodeDerivableEd25519Pub)(composite);
81
+ decoded.should.eql({ pub: v.pub, chainCode: v.chainCode });
82
+ (0, src_1.encodeDerivableEd25519Pub)(decoded.pub, decoded.chainCode).should.equal(composite);
83
+ (0, src_1.isDerivableEd25519Pub)(composite).should.equal(true);
84
+ });
85
+ }
86
+ });
87
+ describe('isValidEd25519ChainCode', function () {
88
+ const { chainCode } = fixture.valid[3];
89
+ it('accepts 64 lowercase hex characters', function () {
90
+ (0, src_1.isValidEd25519ChainCode)(chainCode).should.equal(true);
91
+ });
92
+ it('rejects uppercase hex', function () {
93
+ (0, src_1.isValidEd25519ChainCode)(chainCode.toUpperCase()).should.equal(false);
94
+ });
95
+ it('rejects a chain code of the wrong length', function () {
96
+ (0, src_1.isValidEd25519ChainCode)(chainCode.slice(0, 63)).should.equal(false);
97
+ (0, src_1.isValidEd25519ChainCode)(chainCode + '0').should.equal(false);
98
+ });
99
+ });
100
+ describe('isValidEd25519StrKeyPublicKey', function () {
101
+ for (const v of fixture.valid) {
102
+ it(`accepts the pub half of ${v.name}`, function () {
103
+ (0, src_1.isValidEd25519StrKeyPublicKey)(v.pub).should.equal(true);
104
+ });
105
+ }
106
+ it('rejects a bad checksum', function () {
107
+ // last character of a known-good pub flipped
108
+ (0, src_1.isValidEd25519StrKeyPublicKey)('GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYA').should.equal(false);
109
+ });
110
+ it('rejects a secret seed', function () {
111
+ (0, src_1.isValidEd25519StrKeyPublicKey)('SA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH').should.equal(false);
112
+ });
113
+ it('rejects a non-base32 character', function () {
114
+ (0, src_1.isValidEd25519StrKeyPublicKey)('GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKY1').should.equal(false);
115
+ });
116
+ it('rejects the empty string and a composite pub', function () {
117
+ (0, src_1.isValidEd25519StrKeyPublicKey)('').should.equal(false);
118
+ (0, src_1.isValidEd25519StrKeyPublicKey)(fixture.valid[3].composite).should.equal(false);
119
+ });
120
+ });
121
+ });
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIseUNBU3lCO0FBRXpCLHdDQUF3QztBQUN4QyxtRkFBbUY7QUFDbkYsa0dBQWtHO0FBQ2xHLHdCQUF3QjtBQUN4Qiw2RUFBK0Q7QUFFL0QsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsd0NBQWtDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckUseUNBQW1DLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUUsa0NBQTRCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtRQUNwQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUEsK0JBQXlCLEVBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMs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O1FBQ2hILENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELElBQUEsbUNBQTZCLEVBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFBLG1DQUE2QixFQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQge1xuICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0xFTkdUSCxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX1NQTElUX09GRlNFVCxcbiAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgaXNEZXJpdmFibGVFZDI1NTE5UHViLFxuICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZSxcbiAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG59IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5cbi8vIENyb3NzLXJlcG8gZml4dHVyZTogYnl0ZS1pZGVudGljYWwgdG9cbi8vIHBhY2thZ2VzL3dhbGxldC1wbGF0Zm9ybS90ZXN0L3VuaXQvYmFzZS9zYWZlcy9maXh0dXJlcy9kZXJpdmFibGVFZDI1NTE5UHViLmpzb24uXG4vLyBGb3VyIGluZGVwZW5kZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHNwbGl0IHdpbGwgb3RoZXJ3aXNlIGRyaWZ0LCBhbmQgdGhlIGZhaWx1cmUgbW9kZSBpcyBhblxuLy8gdW5yZWNvdmVyYWJsZSB3YWxsZXQuXG5pbXBvcnQgKiBhcyBmaXh0dXJlIGZyb20gJy4vZml4dHVyZXMvZGVyaXZhYmxlRWQyNTUxOVB1Yi5qc29uJztcblxuZGVzY3JpYmUoJ2Rlcml2YWJsZUVkMjU1MTlQdWInLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdmb3JtYXQgY29uc3RhbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdtYXRjaGVzIHRoZSBjb25zdGFudHMgcGlubmVkIGluIHRoZSBzaGFyZWQgZml4dHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X1BVQl9TUExJVF9PRkZTRVQuc2hvdWxkLmVxdWFsKGZpeHR1cmUuc3BsaXRPZmZzZXQpO1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9MRU5HVEguc2hvdWxkLmVxdWFsKGZpeHR1cmUuY2hhaW5Db2RlTGVuZ3RoKTtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X1BVQl9MRU5HVEguc2hvdWxkLmVxdWFsKGZpeHR1cmUuY29tcG9zaXRlTGVuZ3RoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VuY29kZURlcml2YWJsZUVkMjU1MTlQdWInLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChjb25zdCB2IG9mIGZpeHR1cmUudmFsaWQpIHtcbiAgICAgIGl0KGBjb21wb3NlcyAke3YubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIodi5wdWIsIHYuY2hhaW5Db2RlKS5zaG91bGQuZXF1YWwodi5jb21wb3NpdGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2IG9mIGZpeHR1cmUuaW52YWxpZEVuY29kZUlucHV0cykge1xuICAgICAgaXQoYHJlamVjdHMgJHt2Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2LnB1Yiwgdi5jaGFpbkNvZGUpKS5zaG91bGQudGhyb3coL0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViLyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViJywgZnVuY3Rpb24gKCkge1xuICAgIGZvciAoY29uc3QgdiBvZiBmaXh0dXJlLnZhbGlkKSB7XG4gICAgICBpdChgc3BsaXRzICR7di5uYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2LmNvbXBvc2l0ZSkuc2hvdWxkLmVxbCh7IHB1Yjogdi5wdWIsIGNoYWluQ29kZTogdi5jaGFpbkNvZGUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHYgb2YgZml4dHVyZS5pbnZhbGlkQ29tcG9zaXRlKSB7XG4gICAgICBpdChgcmVqZWN0cyAke3YubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHYuY29tcG9zaXRlKSkuc2hvdWxkLnRocm93KC9JbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1Yi8pO1xuICAgICAgICBpc0Rlcml2YWJsZUVkMjU1MTlQdWIodi5jb21wb3NpdGUpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyb3VuZCB0cmlwJywgZnVuY3Rpb24gKCkge1xuICAgIGZvciAoY29uc3QgdiBvZiBmaXh0dXJlLnZhbGlkKSB7XG4gICAgICBpdChgcm91bmQtdHJpcHMgJHt2Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb21wb3NpdGUgPSBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHYucHViLCB2LmNoYWluQ29kZSk7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKGNvbXBvc2l0ZSk7XG4gICAgICAgIGRlY29kZWQuc2hvdWxkLmVxbCh7IHB1Yjogdi5wdWIsIGNoYWluQ29kZTogdi5jaGFpbkNvZGUgfSk7XG4gICAgICAgIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoZGVjb2RlZC5wdWIsIGRlY29kZWQuY2hhaW5Db2RlKS5zaG91bGQuZXF1YWwoY29tcG9zaXRlKTtcbiAgICAgICAgaXNEZXJpdmFibGVFZDI1NTE5UHViKGNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgeyBjaGFpbkNvZGUgfSA9IGZpeHR1cmUudmFsaWRbM107XG5cbiAgICBpdCgnYWNjZXB0cyA2NCBsb3dlcmNhc2UgaGV4IGNoYXJhY3RlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZShjaGFpbkNvZGUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIHVwcGVyY2FzZSBoZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZShjaGFpbkNvZGUudG9VcHBlckNhc2UoKSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgY2hhaW4gY29kZSBvZiB0aGUgd3JvbmcgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUoY2hhaW5Db2RlLnNsaWNlKDAsIDYzKSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGlzVmFsaWRFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZSArICcwJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGZvciAoY29uc3QgdiBvZiBmaXh0dXJlLnZhbGlkKSB7XG4gICAgICBpdChgYWNjZXB0cyB0aGUgcHViIGhhbGYgb2YgJHt2Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSh2LnB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3JlamVjdHMgYSBiYWQgY2hlY2tzdW0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBsYXN0IGNoYXJhY3RlciBvZiBhIGtub3duLWdvb2QgcHViIGZsaXBwZWRcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZQScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHNlY3JldCBzZWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ1NBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgbm9uLWJhc2UzMiBjaGFyYWN0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSgnR0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWTEnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgdGhlIGVtcHR5IHN0cmluZyBhbmQgYSBjb21wb3NpdGUgcHViJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleShmaXh0dXJlLnZhbGlkWzNdLmNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,145 @@
1
+ {
2
+ "$comment": "Shared cross-repo fixture for the derivable slot-4 (ed25519Multisig) root pub format: composite = <56-char Stellar StrKey ed25519 public key> || <64 lowercase hex chain code>. Plain JSON with no repo-specific imports so wallet-platform, BitGoJS sdk-core, BitGoJS modules/key-card and WRW can all consume this identical file. Append new vectors rather than editing existing ones in place.",
3
+ "splitOffset": 56,
4
+ "chainCodeLength": 64,
5
+ "compositeLength": 120,
6
+ "valid": [
7
+ {
8
+ "name": "all-zero pub with all-zero chain code",
9
+ "pub": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF",
10
+ "chainCode": "0000000000000000000000000000000000000000000000000000000000000000",
11
+ "composite": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF0000000000000000000000000000000000000000000000000000000000000000"
12
+ },
13
+ {
14
+ "name": "all-ones pub with all-f chain code",
15
+ "pub": "GD7777777777777777777777777777777777777777777777777773DB",
16
+ "chainCode": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
17
+ "composite": "GD7777777777777777777777777777777777777777777777777773DBffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
18
+ },
19
+ {
20
+ "name": "low-order pub with a leading-zero chain code",
21
+ "pub": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6PV",
22
+ "chainCode": "0000000000000000000000000000000000000000000000000000000000000001",
23
+ "composite": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6PV0000000000000000000000000000000000000000000000000000000000000001"
24
+ },
25
+ {
26
+ "name": "typical pub with a mixed alphanumeric chain code",
27
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH",
28
+ "chainCode": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
29
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046"
30
+ },
31
+ {
32
+ "name": "typical pub with an all-digit chain code",
33
+ "pub": "GDD7GGYPJUX3BNVA6OPIXUFXYOY2FVHF6YDRQKJ2JNOG27UPSAJDJCMV",
34
+ "chainCode": "1234567890123456789012345678901234567890123456789012345678901234",
35
+ "composite": "GDD7GGYPJUX3BNVA6OPIXUFXYOY2FVHF6YDRQKJ2JNOG27UPSAJDJCMV1234567890123456789012345678901234567890123456789012345678901234"
36
+ }
37
+ ],
38
+ "invalidComposite": [
39
+ {
40
+ "name": "empty string",
41
+ "composite": "",
42
+ "reason": "length"
43
+ },
44
+ {
45
+ "name": "bare 56-char pub with no chain code",
46
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH",
47
+ "reason": "length"
48
+ },
49
+ {
50
+ "name": "bare chain code with no pub",
51
+ "composite": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
52
+ "reason": "length"
53
+ },
54
+ {
55
+ "name": "uppercase hex chain code",
56
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH9A0F3C7D1E5B28460AF3D92C6E81B7053FA4C2E98D17B60543A2FC8E19D7B046",
57
+ "reason": "chainCode"
58
+ },
59
+ {
60
+ "name": "mixed-case hex chain code",
61
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH9A0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
62
+ "reason": "chainCode"
63
+ },
64
+ {
65
+ "name": "non-hex character in chain code",
66
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYHga0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
67
+ "reason": "chainCode"
68
+ },
69
+ {
70
+ "name": "chain code one character short",
71
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b04",
72
+ "reason": "length"
73
+ },
74
+ {
75
+ "name": "chain code one character long",
76
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b0460",
77
+ "reason": "length"
78
+ },
79
+ {
80
+ "name": "pub half is not a valid StrKey (bad checksum)",
81
+ "composite": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYA9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
82
+ "reason": "pub"
83
+ },
84
+ {
85
+ "name": "pub half is a secret seed (S...) not a public key",
86
+ "composite": "SA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
87
+ "reason": "pub"
88
+ },
89
+ {
90
+ "name": "halves swapped",
91
+ "composite": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8eGA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH19d7b046",
92
+ "reason": "pub"
93
+ }
94
+ ],
95
+ "invalidEncodeInputs": [
96
+ {
97
+ "name": "empty pub",
98
+ "pub": "",
99
+ "chainCode": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
100
+ "reason": "pub"
101
+ },
102
+ {
103
+ "name": "pub with bad StrKey checksum",
104
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYA",
105
+ "chainCode": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
106
+ "reason": "pub"
107
+ },
108
+ {
109
+ "name": "composite passed as the pub half",
110
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
111
+ "chainCode": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
112
+ "reason": "pub"
113
+ },
114
+ {
115
+ "name": "empty chain code",
116
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH",
117
+ "chainCode": "",
118
+ "reason": "chainCode"
119
+ },
120
+ {
121
+ "name": "uppercase hex chain code",
122
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH",
123
+ "chainCode": "9A0F3C7D1E5B28460AF3D92C6E81B7053FA4C2E98D17B60543A2FC8E19D7B046",
124
+ "reason": "chainCode"
125
+ },
126
+ {
127
+ "name": "chain code with 0x prefix",
128
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH",
129
+ "chainCode": "0x0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b046",
130
+ "reason": "chainCode"
131
+ },
132
+ {
133
+ "name": "chain code too short",
134
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH",
135
+ "chainCode": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b04",
136
+ "reason": "chainCode"
137
+ },
138
+ {
139
+ "name": "chain code too long",
140
+ "pub": "GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH",
141
+ "chainCode": "9a0f3c7d1e5b28460af3d92c6e81b7053fa4c2e98d17b60543a2fc8e19d7b0460",
142
+ "reason": "chainCode"
143
+ }
144
+ ]
145
+ }