refactor: Use KeyStore as function. Export signMessage and verifyMessage to avoid clashes with similarly named functions.

This commit is contained in:
Hayden Young 2023-02-27 02:42:18 +00:00
parent 7cd2831a82
commit bf86156f9f
18 changed files with 72 additions and 73 deletions

View File

@ -2,7 +2,7 @@ import Identity, { isIdentity, isEqual, decodeIdentity } from './identity.js'
import OrbitDBIdentityProvider from './providers/orbitdb.js'
// import DIDIdentityProvider from './identity-providers/did.js'
// import EthIdentityProvider from './identity-providers/ethereum.js'
import * as KeyStore from '../key-store.js'
import KeyStore, { signMessage, verifyMessage } from '../key-store.js'
import { LRUStorage, IPFSBlockStorage, MemoryStorage } from '../storage/index.js'
import path from 'path'
@ -16,7 +16,7 @@ const supportedTypes = {
}
const Identities = async ({ keystore, identityKeysPath, storage, ipfs } = {}) => {
keystore = keystore || new KeyStore(identityKeysPath || DefaultIdentityKeysPath)
keystore = keystore || await KeyStore(identityKeysPath || DefaultIdentityKeysPath)
storage = storage || (ipfs ? await IPFSBlockStorage({ ipfs, pin: true }) : await MemoryStorage())
const verifiedIdentitiesCache = await LRUStorage({ size: 1000 })
@ -38,7 +38,7 @@ const Identities = async ({ keystore, identityKeysPath, storage, ipfs } = {}) =>
const privateKey = await keystore.getKey(id) || await keystore.createKey(id)
const publicKey = keystore.getPublic(privateKey)
const idSignature = await KeyStore.sign(privateKey, id)
const idSignature = await signMessage(privateKey, id)
const publicKeyAndIdSignature = await identityProvider.signIdentity(publicKey + idSignature, options)
const signatures = {
id: idSignature,
@ -86,11 +86,11 @@ const Identities = async ({ keystore, identityKeysPath, storage, ipfs } = {}) =>
throw new Error('Private signing key not found from KeyStore')
}
return KeyStore.sign(signingKey, data)
return await signMessage(signingKey, data)
}
const verify = async (signature, publicKey, data) => {
return KeyStore.verify(signature, publicKey, data)
return await verifyMessage(signature, publicKey, data)
}
return {

View File

@ -1,5 +1,5 @@
import IdentityProvider from './interface.js'
import * as KeyStore from '../../key-store.js'
import KeyStore, { signMessage, verifyMessage } from '../../key-store.js'
const type = 'orbitdb'
@ -35,13 +35,13 @@ class OrbitDBIdentityProvider extends IdentityProvider {
throw new Error(`Signing key for '${id}' not found`)
}
return KeyStore.sign(key, data)
return signMessage(key, data)
}
static async verifyIdentity (identity) {
const { id, publicKey, signatures } = identity
// Verify that identity was signed by the ID
return KeyStore.verify(signatures.publicKey, id, publicKey + signatures.id)
return verifyMessage(signatures.publicKey, id, publicKey + signatures.id)
}
}

View File

@ -38,7 +38,7 @@ const verifySignature = async (signature, publicKey, data) => {
return Promise.resolve(res)
}
const sign = async (key, data) => {
const signMessage = async (key, data) => {
if (!key) {
throw new Error('No signing key given')
}
@ -54,7 +54,7 @@ const sign = async (key, data) => {
return Buffer.from(await key.sign(data)).toString('hex')
}
const verify = async (signature, publicKey, data) => {
const verifyMessage = async (signature, publicKey, data) => {
// const cached = verifiedCache.get(signature)
const cached = null
let res = false
@ -222,6 +222,6 @@ const KeyStore = async ({ storage, cache } = {}) => {
export {
KeyStore as default,
verify,
sign
verifyMessage,
signMessage
}

View File

@ -1,8 +1,9 @@
import assert from 'assert'
import path from 'path'
import rmrf from 'rimraf'
import { KeyStore, Identities } from '../../src/index.js'
import { Identity, addIdentityProvider } from '../../src/identities/index.js'
import KeyStore, { signMessage, verifyMessage } from '../../src/key-store.js'
import Identities, { addIdentityProvider } from '../../src/identities/identities.js'
import Identity from '../../src/identities/identity.js'
import { Ed25519Provider } from 'key-did-provider-ed25519'
import KeyDidResolver from 'key-did-resolver'
import DIDIdentityProvider from '../../src/identities/providers/did.js'
@ -16,8 +17,7 @@ describe('DID Identity Provider', function () {
let identities
before(async () => {
keystore = new KeyStore()
await keystore.open()
keystore = await KeyStore()
DIDIdentityProvider.setDIDResolver(KeyDidResolver.getResolver())
addIdentityProvider(DIDIdentityProvider)
identities = await Identities({ keystore })
@ -56,15 +56,15 @@ describe('DID Identity Provider', function () {
it('has a signature for the id', async () => {
const signingKey = await keystore.getKey(didStr)
const idSignature = await KeyStore.sign(signingKey, didStr)
const verifies = await KeyStore.verify(idSignature, identity.publicKey, didStr)
const idSignature = await signMessage(signingKey, didStr)
const verifies = await verifyMessage(idSignature, identity.publicKey, didStr)
assert.strictEqual(verifies, true)
assert.strictEqual(identity.signatures.id, idSignature)
})
it('has a signature for the publicKey', async () => {
const signingKey = await keystore.getKey(didStr)
const idSignature = await KeyStore.sign(signingKey, didStr)
const idSignature = await signMessage(signingKey, didStr)
assert.notStrictEqual(idSignature, undefined)
})
})
@ -106,7 +106,7 @@ describe('DID Identity Provider', function () {
it('sign data', async () => {
const signingKey = await keystore.getKey(identity.id)
const expectedSignature = await KeyStore.sign(signingKey, data)
const expectedSignature = await signMessage(signingKey, data)
const signature = await identities.sign(identity, data, keystore)
assert.strictEqual(signature, expectedSignature)
})

View File

@ -1,8 +1,9 @@
import assert from 'assert'
import path from 'path'
import rmrf from 'rimraf'
import { KeyStore, Identities } from '../../src/index.js'
import { Identity, addIdentityProvider } from '../../src/identities/index.js'
import KeyStore, { signMessage, verifyMessage } from '../../src/key-store.js'
import Identities, { addIdentityProvider } from '../../src/identities/identities.js'
import Identity from '../../src/identities/identity.js'
import EthIdentityProvider from '../../src/identities/providers/ethereum.js'
const type = EthIdentityProvider.type
@ -12,8 +13,8 @@ describe('Ethereum Identity Provider', function () {
let identities
before(async () => {
keystore = new KeyStore()
await keystore.open()
keystore = await KeyStore()
addIdentityProvider(EthIdentityProvider)
identities = await Identities({ keystore })
})
@ -53,15 +54,15 @@ describe('Ethereum Identity Provider', function () {
it('has a signature for the id', async () => {
const signingKey = await keystore.getKey(wallet.address)
const idSignature = await KeyStore.sign(signingKey, wallet.address)
const verifies = await KeyStore.verify(idSignature, Buffer.from(signingKey.public.marshal()).toString('hex'), wallet.address)
const idSignature = await signMessage(signingKey, wallet.address)
const verifies = await verifyMessage(idSignature, Buffer.from(signingKey.public.marshal()).toString('hex'), wallet.address)
assert.strictEqual(verifies, true)
assert.strictEqual(identity.signatures.id, idSignature)
})
it('has a signature for the publicKey', async () => {
const signingKey = await keystore.getKey(wallet.address)
const idSignature = await KeyStore.sign(signingKey, wallet.address)
const idSignature = await signMessage(signingKey, wallet.address)
const publicKeyAndIdSignature = await wallet.signMessage(identity.publicKey + idSignature)
assert.strictEqual(identity.signatures.publicKey, publicKeyAndIdSignature)
})
@ -102,7 +103,7 @@ describe('Ethereum Identity Provider', function () {
it('sign data', async () => {
const signingKey = await keystore.getKey(identity.id)
const expectedSignature = await KeyStore.sign(signingKey, data)
const expectedSignature = await signMessage(signingKey, data)
const signature = await identities.sign(identity, data, keystore)
assert.strictEqual(signature, expectedSignature)
})

View File

@ -1,8 +1,9 @@
import assert from 'assert'
import path from 'path'
import rmrf from 'rimraf'
import { KeyStore, Identities } from '../../src/index.js'
import { Identity, addIdentityProvider } from '../../src/identities/index.js'
import KeyStore, { signMessage, verifyMessage } from '../../src/key-store.js'
import Identities, { addIdentityProvider } from '../../src/identities/identities.js'
import Identity from '../../src/identities/identity.js'
import fs from 'fs-extra'
const fixturesPath = path.resolve('./test/identities/fixtures/keys')
const savedKeysPath = path.resolve('./test/identities/fixtures/savedKeys')
@ -73,8 +74,8 @@ describe('Identities', function () {
let keystore
before(async () => {
keystore = new KeyStore(identityKeysPath)
await keystore.open()
keystore = await KeyStore(identityKeysPath)
identities = await Identities({ keystore })
})
@ -110,9 +111,9 @@ describe('Identities', function () {
const key = await keystore.getKey(id)
const externalId = Buffer.from(key.public.marshal()).toString('hex')
const signingKey = await keystore.getKey(externalId)
const idSignature = await KeyStore.sign(signingKey, externalId)
const idSignature = await signMessage(signingKey, externalId)
const publicKey = Buffer.from(signingKey.public.marshal()).toString('hex')
const verifies = await KeyStore.verify(idSignature, publicKey, externalId)
const verifies = await verifyMessage(idSignature, publicKey, externalId)
assert.strictEqual(verifies, true)
assert.strictEqual(identity.signatures.id, idSignature)
})
@ -121,9 +122,9 @@ describe('Identities', function () {
const key = await keystore.getKey(id)
const externalId = Buffer.from(key.public.marshal()).toString('hex')
const signingKey = await keystore.getKey(externalId)
const idSignature = await KeyStore.sign(signingKey, externalId)
const idSignature = await signMessage(signingKey, externalId)
const externalKey = await keystore.getKey(id)
const publicKeyAndIdSignature = await KeyStore.sign(externalKey, identity.publicKey + idSignature)
const publicKeyAndIdSignature = await signMessage(externalKey, identity.publicKey + idSignature)
assert.strictEqual(identity.signatures.publicKey, publicKeyAndIdSignature)
})
})
@ -142,8 +143,7 @@ describe('Identities', function () {
before(async () => {
await fs.copy(fixturesPath, savedKeysPath)
savedKeysKeyStore = new KeyStore(savedKeysPath)
await savedKeysKeyStore.open()
savedKeysKeyStore = await KeyStore(savedKeysPath)
identities = await Identities({ keystore: savedKeysKeyStore })
identity = await identities.createIdentity({ id })
@ -181,8 +181,8 @@ describe('Identities', function () {
it('has the correct signatures', async () => {
const internalSigningKey = await savedKeysKeyStore.getKey(identity.id)
const externalSigningKey = await savedKeysKeyStore.getKey(id)
const idSignature = await KeyStore.sign(internalSigningKey, identity.id)
const publicKeyAndIdSignature = await KeyStore.sign(externalSigningKey, identity.publicKey + idSignature)
const idSignature = await signMessage(internalSigningKey, identity.id)
const publicKeyAndIdSignature = await signMessage(externalSigningKey, identity.publicKey + idSignature)
const expectedSignature = { id: idSignature, publicKey: publicKeyAndIdSignature }
assert.deepStrictEqual(identity.signatures, expectedSignature)
})
@ -196,8 +196,7 @@ describe('Identities', function () {
let keystore
before(async () => {
keystore = new KeyStore(identityKeysPath)
await keystore.open()
keystore = await KeyStore(identityKeysPath)
})
after(async () => {
@ -209,14 +208,14 @@ describe('Identities', function () {
it('identity pkSignature verifies', async () => {
identities = await Identities({ keystore })
identity = await identities.createIdentity({ id, type })
const verified = await KeyStore.verify(identity.signatures.id, identity.publicKey, identity.id)
const verified = await verifyMessage(identity.signatures.id, identity.publicKey, identity.id)
assert.strictEqual(verified, true)
})
it('identity signature verifies', async () => {
identities = await Identities({ keystore })
identity = await identities.createIdentity({ id, type })
const verified = await KeyStore.verify(identity.signatures.publicKey, identity.id, identity.publicKey + identity.signatures.id)
const verified = await verifyMessage(identity.signatures.publicKey, identity.id, identity.publicKey + identity.signatures.id)
assert.strictEqual(verified, true)
})
@ -246,8 +245,8 @@ describe('Identities', function () {
let keystore
before(async () => {
keystore = new KeyStore(identityKeysPath)
await keystore.open()
keystore = await KeyStore(identityKeysPath)
identities = await Identities({ keystore })
})
@ -273,8 +272,8 @@ describe('Identities', function () {
let keystore
before(async () => {
keystore = new KeyStore(identityKeysPath)
await keystore.open()
keystore = await KeyStore(identityKeysPath)
identities = await Identities({ keystore })
identity = await identities.createIdentity({ id })
})
@ -287,7 +286,7 @@ describe('Identities', function () {
it('sign data', async () => {
const signingKey = await keystore.getKey(identity.id)
const expectedSignature = await KeyStore.sign(signingKey, data)
const expectedSignature = await signMessage(signingKey, data)
const signature = await identities.sign(identity, data, keystore)
assert.strictEqual(signature, expectedSignature)
})
@ -318,8 +317,7 @@ describe('Identities', function () {
let signature
before(async () => {
keystore = new KeyStore(identityKeysPath)
await keystore.open()
keystore = await KeyStore(identityKeysPath)
})
after(async () => {

View File

@ -1,6 +1,6 @@
import { strictEqual, deepStrictEqual } from 'assert'
import LevelStorage from '../src/storage/level.js'
import KeyStore, { sign, verify } from '../src/key-store.js'
import KeyStore, { signMessage, verifyMessage } from '../src/key-store.js'
import { testAPIs } from 'orbit-db-test-utils'
import path from 'path'
import fs from 'fs-extra'
@ -154,14 +154,14 @@ Object.keys(testAPIs).forEach((IPFS) => {
const expected = '304402207eb6e4f4b2c56665c505696c41ec0831c6c2998620589d4b6f405d49134dea5102207e71ba37d94b7a70e3d9fb3bea7c8d8b7082c3c880b6831e9613a0a3e7aabd9f'
const key = await keystore.getKey('userA')
const actual = await sign(key, 'data data data')
const actual = await signMessage(key, 'data data data')
strictEqual(actual, expected)
})
it('throws an error if no key is passed', async () => {
let err
try {
await sign(null, 'data data data')
await signMessage(null, 'data data data')
} catch (e) {
err = e.toString()
}
@ -173,7 +173,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
const key = 'key_1'
let err
try {
await sign(key)
await signMessage(key)
} catch (e) {
err = e.toString()
}
@ -258,17 +258,17 @@ Object.keys(testAPIs).forEach((IPFS) => {
it('verifies content', async () => {
const signature = '304402207eb6e4f4b2c56665c505696c41ec0831c6c2998620589d4b6f405d49134dea5102207e71ba37d94b7a70e3d9fb3bea7c8d8b7082c3c880b6831e9613a0a3e7aabd9f'
const verified = await verify(signature, publicKey, 'data data data')
const verified = await verifyMessage(signature, publicKey, 'data data data')
strictEqual(verified, true)
})
it('verifies content with cache', async () => {
const data = 'data'.repeat(1024 * 1024)
const signature = await sign(key, data)
const signature = await signMessage(key, data)
const startTime = new Date().getTime()
await verify(signature, publicKey, data)
await verifyMessage(signature, publicKey, data)
const first = new Date().getTime()
await verify(signature, publicKey, data)
await verifyMessage(signature, publicKey, data)
const after = new Date().getTime()
console.log('First pass:', first - startTime, 'ms', 'Cached:', after - first, 'ms')
strictEqual(first - startTime > after - first, true)
@ -276,7 +276,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
it('does not verify content with bad signature', async () => {
const signature = 'xxxxxx'
const verified = await verify(signature, publicKey, 'data data data')
const verified = await verifyMessage(signature, publicKey, 'data data data')
strictEqual(verified, false)
})
})

View File

@ -28,7 +28,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
const storage = await MemoryStorage()

View File

@ -28,7 +28,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
const storage = await MemoryStorage()

View File

@ -30,7 +30,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
identities = await Identities({ keystore, ipfs })
testIdentity = await identities.createIdentity({ id: 'userA' })

View File

@ -33,7 +33,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
const storage = await MemoryStorage()
identities = await Identities({ keystore, storage })

View File

@ -26,8 +26,8 @@ Object.keys(testAPIs).forEach((IPFS) => {
let testIdentity, testIdentity2, testIdentity3
before(async () => {
keystore = new KeyStore('./keys_1')
await keystore.open()
keystore = await KeyStore('./keys_1')
for (const [key, value] of Object.entries(identityKeys)) {
await keystore.addKey(key, value)
}

View File

@ -29,7 +29,7 @@ Object.keys(testAPIs).forEach(IPFS => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
const storage = await MemoryStorage()

View File

@ -26,8 +26,8 @@ Object.keys(testAPIs).forEach((IPFS) => {
let testIdentity, testIdentity2, testIdentity3, testIdentity4
before(async () => {
keystore = new KeyStore('./keys_1')
await keystore.open()
keystore = await KeyStore('./keys_1')
for (const [key, value] of Object.entries(identityKeys)) {
await keystore.addKey(key, value)
}

View File

@ -49,7 +49,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
testIdentity = await createIdentity({ id: 'userC', keystore })
testIdentity2 = await createIdentity({ id: 'userB', keystore })

View File

@ -28,7 +28,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
const storage = await MemoryStorage()

View File

@ -29,7 +29,7 @@ Object.keys(testAPIs).forEach((IPFS) => {
await copy(identityKeyFixtures, identityKeysPath)
await copy(signingKeyFixtures, identityKeysPath)
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
const storage = await MemoryStorage()

View File

@ -34,7 +34,7 @@ Object.keys(testAPIs).forEach((_) => {
// Start an IPFS instance
ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' })
keystore = new KeyStore(identityKeysPath)
keystore = await KeyStore(identityKeysPath)
const storage = await MemoryStorage()
const identities = await Identities({ keystore, storage })