Skip to content

Commit d1ce8bd

Browse files
authored
test(keychain): add fixtures of keychains written by the current version (#3670)
Covers no password, a password with the default dek and a password with a custom dek, for each key type, so later keychain versions can be tested against existing stored keys.
1 parent 95392ef commit d1ce8bd

2 files changed

Lines changed: 176 additions & 0 deletions

File tree

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/* spell-checker:disable */
2+
/**
3+
* Datastores written by @libp2p/keychain 6.1.9, one per keychain
4+
* configuration. Values are stored verbatim so later keychain versions can be
5+
* tested against data written by this one. Do not regenerate.
6+
*/
7+
8+
export interface LegacyKeychain {
9+
name: string
10+
init: { pass?: string, dek?: { hash: string, keyLength: number, iterationCount: number, salt: string } }
11+
keys: Array<{ name: string, id: string, type: string, publicKey: string }>
12+
entries: Record<string, string>
13+
}
14+
15+
export const legacyKeychains: LegacyKeychain[] = [
16+
{
17+
name: 'no password',
18+
init: {},
19+
keys: [
20+
{
21+
name: 'self',
22+
id: 'QmXmJ5msbmAkY9PkhLDFaRZJZpqXUV4uQcVMjdXnZdcZfr',
23+
type: 'Ed25519',
24+
publicKey: 'CAESIJTRuwJhJKbkzlvsFOlRoCxKCaMl8SIiqBcEoXkKeQcV'
25+
},
26+
{
27+
name: 'secp256k1-key',
28+
id: 'QmawNT4BUiu6ixdrWNqwGvkQU24Z3hgou5e4EJft1XNMdZ',
29+
type: 'secp256k1',
30+
publicKey: 'CAISIQJTTZPHDQXgsI2rcTY0GUe083kZgcDM0ubzZSKCdSl4DA'
31+
},
32+
{
33+
name: 'ecdsa-key',
34+
id: 'QmZUDTHUk7aqfxhmpkax6wQ75JM5MWbwnCZRV4P7H8jtSP',
35+
type: 'ECDSA',
36+
publicKey: 'CAMSVzBVAgEBoAoGCCqGSM49AwEHoUQDQgAEiAGC3ilyk6QHqsyapaNUQXr2VOurJ9wg9AGZpLIi7UHBgkxxUq+a1oYOSSrBzoysrvrs14J7V9ZnjWcLy7rrfg'
37+
},
38+
{
39+
name: 'rsa-key',
40+
id: 'QmVfX8PGcGDDPHcrXc1NS16kDRuFFUQsGVcBE2gRreNhmg',
41+
type: 'RSA',
42+
publicKey: 'CAASogEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL2nGx/aOZgu8rqVj2AhyWXWO53MMfB8kihfa7g1nTBYdEKpFEEs6tIWgq4avwZ99lvKERMymZdrfmdbdPSEmL1us/BoD6Zlt5MF3cAzofCYbOp8YY+gEwwMVz7eUZ8A4x4PEXT9WseXRFFQBqsmomfjGdsR1O6bzcNY5oJo5HXHAgMBAAE'
43+
}
44+
],
45+
entries: {
46+
'/info/ecdsa-key': '{"name":"ecdsa-key","id":"QmZUDTHUk7aqfxhmpkax6wQ75JM5MWbwnCZRV4P7H8jtSP"}',
47+
'/info/rsa-key': '{"name":"rsa-key","id":"QmVfX8PGcGDDPHcrXc1NS16kDRuFFUQsGVcBE2gRreNhmg"}',
48+
'/info/secp256k1-key': '{"name":"secp256k1-key","id":"QmawNT4BUiu6ixdrWNqwGvkQU24Z3hgou5e4EJft1XNMdZ"}',
49+
'/info/self': '{"name":"self","id":"QmXmJ5msbmAkY9PkhLDFaRZJZpqXUV4uQcVMjdXnZdcZfr"}',
50+
'/pkcs8/ecdsa-key': 'mmZvshboSSFEOYBP/iau9+6Q6npaqfWdrbXljA7CRkmRkVyNKvTWfN/JgT/MvZBQSHmtjYWxMXx1OTzdUKSYtAMoY8tREX6M/IBBMJu6vvl0whomYjdnUHRldNXKqVVKEQ4NJH4eeDz2dQb8nccuVBNoXmsOLVNmTnBOLzd6OIIn+JdbB2nRiFqHbjTv0YKm3Fn/voL4V3yN5J0mAHfrEhiJ1+Cv+Lw7JhQ',
51+
'/pkcs8/rsa-key': '-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIC6DBiBgkqhkiG9w0BBQ0wVTA0BgkqhkiG9w0BBQwwJwQQx1so1ABJiQitetrE\nUhnyBAICJxACASAwDAYIKoZIhvcNAgsFADAdBglghkgBZQMEASoEEP7IiTRPR09x\nJOrY9CVDjzYEggKAvVfl+Yss/BPCuFrWW/P1EBrsnGMk6NfaSXioEG2v/kVfw+8l\nIIL4iPh9nau6TEMRIQp9votuVAPLa7NTo3EiGi83uTMkSfGXm5YZPZj9z54C1qU2\nfwV6l3b/YJsQafWE2FHuGszugcSk/8UD0o0HVAja7cuMHjLTMw4K2JS65Cgr1x2T\nWi5CXmkRuRc+mMEsYxm4hmMcHupIm3JaWSeEvOR5eXkwYI1MNMYcYhceN/IweizE\nF5IX95U/ecsepr62W54s0Wx3SJcJFe5wgpJugKdrpo7fCxlSEJl7Y6bVomsr31jJ\nhF1MDTIEUm7d9ckzEZEQNMDyUo6+BAso13sU8stI74hhB2sJAdWk0Vmsb1GgSyBM\niOQ52iqt8hDEzuYWc+vEL9yRVQoVw7AfcTZgVcqlKvavTXfXMPu/QdsEFx41hSEb\nyt/Vtssba5styKPlyZw3PXJtCmaiI2996ZROAvvNDMcJ/A6rrH5GI8B1HHizbta/\nXwBI9jJAB4cSBmMTXMCVh4FZR+ryvx3c339Vj6S1m+nzZlikfrSkQ501RvZzxvQ5\nhaHk5GVlbTAQhcZG71CBBr5ItBhGJO8S/7of5JOSBusAqaMitwruC0BurLYy0qZU\ncHY08CEXkv8VPT9tdaSU70RRfZkVgzqtVM5QHLOw6HmdRQvK3CLYpmiagPs8pA3M\n1PZP/nxjWKkGC5I1gbNNIFM7zqBY3EhVPlYgSeO3yJ/UMBTMwkwP9BQVKzEpDtqB\n4VztTQglgGAOug9FnDAKPQ88tVZ/QfG4+HVVl4LFNCQN3YK33ZwESzWA/xqNnhff\np5nxKlZaQeuowwEukvkWoLSTWRwc+9onmNLicg==\n-----END ENCRYPTED PRIVATE KEY-----',
52+
'/pkcs8/secp256k1-key': 'mYB/65ODdHNAPt1lbu0HBSwmH9uQR7lYJa996iAOdhAsCSe/pkjcb08qFYNMtx6AOb/d1RWpKDP1eULT18KZ40gap7IruH0WoLvZSmGBZP60',
53+
'/pkcs8/self': 'mxMZRXaCiF0D7jWKl3rsUMeyx7CLS7bNTwyC7DwRR1seFXc6bhQ74HvtLTafhjOa5zrtxKb17DOl8EGWOl68hp3msU8gWgeV9jZLTiDu64crYxoM8gtbNOMrxEONvjtrrYaHJCnvqmJWGSeoRwd0LrQ'
54+
}
55+
},
56+
{
57+
name: 'password with default dek',
58+
init: {
59+
pass: 'this is a fixture keychain password'
60+
},
61+
keys: [
62+
{
63+
name: 'self',
64+
id: 'QmSJ5gjuNXx8LqDk6yvEdntdn4V7HjCcyALd9DGXu1QpWa',
65+
type: 'Ed25519',
66+
publicKey: 'CAESIBv3GcbAKFXDum4I/UflxgMoO07kTbXNpB9lBqHPMbV5'
67+
},
68+
{
69+
name: 'secp256k1-key',
70+
id: 'QmVYg2sNuEs6hwAT3bA1EEd6u19vrEQvUUysucN25XqZ5o',
71+
type: 'secp256k1',
72+
publicKey: 'CAISIQN90KwnB7E2ewRzOUL70VE4WF6Oxs9MJYzi+I0StPSxNA'
73+
},
74+
{
75+
name: 'ecdsa-key',
76+
id: 'QmT4Mh2TnwXufWwY7FkbvWKJaAuVXkSpvpkEK8CKo22xCc',
77+
type: 'ECDSA',
78+
publicKey: 'CAMSVzBVAgEBoAoGCCqGSM49AwEHoUQDQgAEiNhBS+sTqEtYhBllpyH6o2Hac64d6w1qBsKyjQ8Z9W2ul9LOcrnakHqglgzfStky5OdEFXWO+1W4mKiS3qDD7w'
79+
},
80+
{
81+
name: 'rsa-key',
82+
id: 'QmRmFd3ZRyatExkVtE1KkUhdW6f1pJRjfjA4SJnEX9Gxqf',
83+
type: 'RSA',
84+
publicKey: 'CAASogEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO5BwszoNvNBsDIy8lV+1xyGP3VA4TZNQhG4BH3cGMsgy25sUZmVdO8oY2v5tealpykeys0ONL/kuvPi7If/AR+1cNwbpniBXrv0eNp92qaetCnW9B9gvmy9lFZ9/+XTTVyzRqcbVrF1g7E9eAkxfLwtfaAQsgqwuKKRhxUk2EBnAgMBAAE'
85+
}
86+
],
87+
entries: {
88+
'/info/ecdsa-key': '{"name":"ecdsa-key","id":"QmT4Mh2TnwXufWwY7FkbvWKJaAuVXkSpvpkEK8CKo22xCc"}',
89+
'/info/rsa-key': '{"name":"rsa-key","id":"QmRmFd3ZRyatExkVtE1KkUhdW6f1pJRjfjA4SJnEX9Gxqf"}',
90+
'/info/secp256k1-key': '{"name":"secp256k1-key","id":"QmVYg2sNuEs6hwAT3bA1EEd6u19vrEQvUUysucN25XqZ5o"}',
91+
'/info/self': '{"name":"self","id":"QmSJ5gjuNXx8LqDk6yvEdntdn4V7HjCcyALd9DGXu1QpWa"}',
92+
'/pkcs8/ecdsa-key': 'mRSmVo3NzqJuNF/ToycoLxtKRS0esEk637Rj9CPcAXmRSCU15IEBxPBBZCCFPhvWHp+G8tmYS/CQSqBv4F43obdj6kGhOIpu+JIqRuPEMEuqO/bpZaLm9Omj+viNfU4KeGQs3p/7rvPn1GKpIQRsGyTmM0npn3swB+bpVfAxPSGKKmVlk4jZKbwV7OIwEjrtFu3do0tiPP47NvkDgtEeZk+PQmhZFEGZQCg',
93+
'/pkcs8/rsa-key': '-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIC6DBiBgkqhkiG9w0BBQ0wVTA0BgkqhkiG9w0BBQwwJwQQJiZ1ITCJf5Qlzk0p\nzkjO2QICJxACASAwDAYIKoZIhvcNAgsFADAdBglghkgBZQMEASoEEKomqau7YIZs\nc1c2BATT91QEggKAy7xECCJ4lzoWNdVePiZsqV/vlV3wdKN0CBzWy7+32A3+U5bl\n4SADcbZSoODgvTnPpn5IxgvQ/dgTIEcC5y+REPsecGBy+gNmaLLNsy5zZpFrYgKR\nDwf7zymDn2D+Ze4ID+P34vjPRxZWkuvNYHDBrBc/mVKs9GHsyrTt8E5i3fCPJv41\nvxCyXEm7SpM/kW/Z6FIVusynIfukpFq2qIdAWv1KnpfmLajtYLecojhG/6gcX+26\nljHh+m/1INmx7JFROZ7eA+0j3eqyPRKZexNXh9XymAurQyOmi3n2YIxAfVoW7FoR\neCB9ujXH//66oNOV+6CCYyxIQg5yz6j29HqBxNacFMLOPlyUWgkNv+ryV4SZa/33\nzx/IlxfEaTUnH64lkKHuv9MNx69yD4Ex56Q7ls35sUxNPhvI4+m9mDQN7b3eX6HF\ndB6jbSLEl3bS+O9OGSxXYZAYLkc4SEnJtrlYSDnoX4JQL5PrOesUMDvTvmu84j3+\nLoIhIW1x2IVwcNF0qsrppGFWNawcJ7U7qi98L2SGCbyIHBYLfj0J7KfaMPWo28ll\nkQ8qMSqCjIhkAVQYMnR/hLYnLEdGD9+GRaDwo7TkXKiH0Ezj9acXKTs4Si8LLj5u\nM3L7O1yYvLZwb/FWKvFKJGAnC9sjHlFnWDeq2jHOW0/sUTTpurussrtrKKijNKWW\nKqpCAffjRqyNMxxvF4jY8FMcRmbbe7jCHP6IRFgmB2vPQx2MNiAzWjE7/UBqpbIV\nSO7HpWPAMLj1z6jM/OyEfWX/XAyxEWfcSgBV1LcpQxmU2EjFtCimmrU5TX8LKFfk\n8S1Ck+5FLeTcAHiK6jKkVhsflSK6ibXJlDt2UA==\n-----END ENCRYPTED PRIVATE KEY-----',
94+
'/pkcs8/secp256k1-key': 'm6CN8Zw2ust6ls9cxfS4qMS71DqubN1sdFi7WBxPAsi5KxvNKihaHdo3X6mTjrZbzOQVDd9ansLzCth5unLx3MrBlZUiw31I03BqwKiV5Dkk',
95+
'/pkcs8/self': 'mreJijjwyV/WRrEXD3uoBl+mI4A7U00SMG42e1neSzJHKjMMJvCVS3Ne5QBjaa7w8oJTV2iKlh4RT0siPZqTdBquuS4TcvwEIYDGwJQw1vEU3RZ1Kkw+vusWpEhLSXIR86nBZwkykj2VNHvDjzpJexA'
96+
}
97+
},
98+
{
99+
name: 'password with custom dek',
100+
init: {
101+
pass: 'this is a fixture keychain password',
102+
dek: {
103+
hash: 'sha2-256',
104+
keyLength: 32,
105+
iterationCount: 2000,
106+
salt: 'a custom fixture keychain salt'
107+
}
108+
},
109+
keys: [
110+
{
111+
name: 'self',
112+
id: 'QmXbjDyFQir6x7PFbhZghWQfXwcyJdxhdhHF8QGeeVzwot',
113+
type: 'Ed25519',
114+
publicKey: 'CAESIHgkTxT134T/4RJKq+cTb8SpICk0zRuTnopxAczQfMpC'
115+
},
116+
{
117+
name: 'rsa-key',
118+
id: 'QmdYZijf99H71P6xbdX9gxMAGiqfcPxh9NXM2kqNSNQJ9Q',
119+
type: 'RSA',
120+
publicKey: 'CAASogEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALnhb517ttWophDc2mpduQOGdSFLX8EF9oRP/RxYAibecMJukdgW6JQZqdvbDAH3Q3umYWkjlxxOL3d3rUE4nYlReTpcxhghb6OIr8742yk0IG1m/MNJk3g1mZJD6i/EOh/JlB96E8JdpE2zQByScN4d5pov1UPmP65DqBaFJJ1HAgMBAAE'
121+
}
122+
],
123+
entries: {
124+
'/info/rsa-key': '{"name":"rsa-key","id":"QmdYZijf99H71P6xbdX9gxMAGiqfcPxh9NXM2kqNSNQJ9Q"}',
125+
'/info/self': '{"name":"self","id":"QmXbjDyFQir6x7PFbhZghWQfXwcyJdxhdhHF8QGeeVzwot"}',
126+
'/pkcs8/rsa-key': '-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIC6DBiBgkqhkiG9w0BBQ0wVTA0BgkqhkiG9w0BBQwwJwQQKRdN3oOWooooWnUx\nAc7TvwICJxACASAwDAYIKoZIhvcNAgsFADAdBglghkgBZQMEASoEELysdvWpZur2\nhDFkIHt2W3cEggKACOcnNdpssevNiRhUWL7TXIRpb0Hp9j9IiUSPcVT50nk0mupD\ngCk1HFim2vydQk4aRurNlLifoIb+0J5ZJ1gNuPr3eh/vulEUwhYiEktJbZ5IESYy\nNCcUqodoZ0TFprVg7n+UH0CS7Ta1mCk8BR9uwlGyWax9RVfXy9FqsZBMh510tOu6\nGz3GVAwC9fxemg3LHOB+xSTxItdMovhTw9Kuv/DrNPRso8vxZrfpOphdvpYnPN7c\nHhIiFSHNQaaY/VSpxMdNmsAEBQIESaBmrMSGDV9RJBXgoKbcDIx+bWGm/7ZC95rz\nd0CyKerecbyElxjAtDLSlM/RsVXHiPrU8RoauJGoF8CuHsM4FiN38VkDKK4OzYeW\nE8gxxkvPayWFI1IfhdoB8amPjlpf7lglbxt+RT1l495Md4+2VgPtUsGEH/fEyz0k\nSCtIeW6UQbhtVcZTKYplIOubiaKoquLpuJz+d2FY3t8OIxOGbSWZorys6yBV/64C\n7w7Z8+JTY2wHCvtgLLCywnyFMP232YxBr4+TzLTTAmdp6AjOhqpnEiKEBbW3hLJd\nih9iMWESZVr+ARLWUBOYQWg8Kcgr8g4uEo8yvHNryAZsoaSboWdDIPCHMRtlBxQO\n4b4cZRZWdRoBYRlQ97Gq/f3pwiIkG1JuqBzjcRbumfWzEnuPoXK43tnY1/gz/do5\nkW3YC/b4G1Dmfi/wREM1PNbLPrWi+YoCgEgW68AVge/QARnfbPRfYX5BBWqh8KxB\nzldNdG4opEc7J44ZkXWVPBDAXxLypzyO7pM+7rUdk3tsc2p5OMwCm3AiEatYYbs7\n1bWB9BFnadjQ1u/Mg9Dg+lxac9qodkEn7QYFhA==\n-----END ENCRYPTED PRIVATE KEY-----',
127+
'/pkcs8/self': 'mSACGewhK/kjj4O/bZS60va+cUdHVn5yHep3+cSOtRhYUc04vxxtR/CyDDkwy4ZFN86RxHodR7LixVfOiWrQtKJi3P0XKtXcrvPw9I7X+VqGU6dAx8AuCL30w6vt6iO6WkabXsBrDEHAl7Gnm4I/XgQ'
128+
}
129+
}
130+
]
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { publicKeyToProtobuf } from '@libp2p/crypto/keys'
2+
import { defaultLogger } from '@libp2p/logger'
3+
import { expect } from 'aegir/chai'
4+
import { MemoryDatastore } from 'datastore-core/memory'
5+
import { Key } from 'interface-datastore/key'
6+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
7+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
8+
import { Keychain } from '../src/keychain.ts'
9+
import { legacyKeychains } from './fixtures/legacy-keychains.ts'
10+
import type { LegacyKeychain } from './fixtures/legacy-keychains.ts'
11+
12+
async function openKeychain (fixture: LegacyKeychain): Promise<Keychain> {
13+
const datastore = new MemoryDatastore()
14+
15+
for (const [key, value] of Object.entries(fixture.entries)) {
16+
await datastore.put(new Key(key), uint8ArrayFromString(value))
17+
}
18+
19+
return new Keychain({ datastore, logger: defaultLogger() }, fixture.init)
20+
}
21+
22+
describe('legacy keychains', () => {
23+
for (const fixture of legacyKeychains) {
24+
describe(fixture.name, () => {
25+
it('lists the stored keys', async () => {
26+
const keychain = await openKeychain(fixture)
27+
const keys = await keychain.listKeys()
28+
29+
expect(keys.map(({ name, id }) => ({ name, id })).sort((a, b) => a.name.localeCompare(b.name)))
30+
.to.deep.equal(fixture.keys.map(({ name, id }) => ({ name, id })).sort((a, b) => a.name.localeCompare(b.name)))
31+
})
32+
33+
for (const expected of fixture.keys) {
34+
it(`exports the ${expected.type} key`, async () => {
35+
const keychain = await openKeychain(fixture)
36+
const key = await keychain.exportKey(expected.name)
37+
const data = uint8ArrayFromString('hello world')
38+
39+
expect(key.type).to.equal(expected.type)
40+
expect(uint8ArrayToString(publicKeyToProtobuf(key.publicKey), 'base64')).to.equal(expected.publicKey)
41+
expect(await key.publicKey.verify(data, await key.sign(data))).to.be.true()
42+
})
43+
}
44+
})
45+
}
46+
})

0 commit comments

Comments
 (0)