mirror of
https://github.com/orbitdb/orbitdb.git
synced 2025-06-25 15:32:30 +00:00

Fix sync Fix linter Fix tests Clean up Set default references count to 0 Fix sync Use address instead of databaseId Sync protocol Keep references to open databases in OrbitDB Fix append benchmark Initial version of heads exchange Remove Feed Fix KeyValuePersisted iterator Refactor OrbitDBAddress a bit more Add rest of the database types Refactor OrbitDB addresses Initial version for the full circle Initial structure and tests for new OrbitDB Make sure KeyStore is open when a Database is created Re-organize OrbitDB Use new databases and Log More clean up Add 'drop' event to Database Clean up OrbitDB Remove id from OrbitDB Use new KeyStore and Identities Remove storage from OrbitDB Remove migrations from OrbitDB Remove caches from OrbitDB Remove pubsub from OrbitDB
159 lines
5.3 KiB
JavaScript
159 lines
5.3 KiB
JavaScript
import assert from 'assert'
|
|
import rmrf from 'rimraf'
|
|
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'
|
|
|
|
const seed = new Uint8Array([157, 94, 116, 198, 19, 248, 93, 239, 173, 82, 245, 222, 199, 7, 183, 177, 123, 238, 83, 240, 143, 188, 87, 191, 33, 95, 58, 136, 46, 218, 219, 245])
|
|
const didStr = 'did:key:z6MkpnTJwrrVuphNh1uKb5DB7eRxvqniVaSDUHU6jtGVmn3r'
|
|
const type = DIDIdentityProvider.type
|
|
|
|
describe('DID Identity Provider', function () {
|
|
let keystore
|
|
let identities
|
|
|
|
before(async () => {
|
|
keystore = await KeyStore()
|
|
DIDIdentityProvider.setDIDResolver(KeyDidResolver.getResolver())
|
|
addIdentityProvider(DIDIdentityProvider)
|
|
identities = await Identities({ keystore })
|
|
})
|
|
|
|
after(async () => {
|
|
if (keystore) {
|
|
await keystore.close()
|
|
}
|
|
rmrf.sync('./keystore')
|
|
rmrf.sync('./orbitdb')
|
|
})
|
|
|
|
describe('create an DID identity', () => {
|
|
let identity
|
|
|
|
before(async () => {
|
|
const didProvider = new Ed25519Provider(seed)
|
|
identity = await identities.createIdentity({ type, keystore, didProvider })
|
|
})
|
|
|
|
it('has the correct id', async () => {
|
|
assert.strictEqual(identity.id, didStr)
|
|
})
|
|
|
|
it('created a key for id in keystore', async () => {
|
|
const key = await keystore.getKey(didStr)
|
|
assert.notStrictEqual(key, undefined)
|
|
})
|
|
|
|
it('has the correct public key', async () => {
|
|
const signingKey = await keystore.getKey(didStr)
|
|
assert.notStrictEqual(signingKey, undefined)
|
|
assert.strictEqual(identity.publicKey, keystore.getPublic(signingKey))
|
|
})
|
|
|
|
it('has a signature for the id', async () => {
|
|
const signingKey = await keystore.getKey(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 signMessage(signingKey, didStr)
|
|
assert.notStrictEqual(idSignature, undefined)
|
|
})
|
|
})
|
|
|
|
describe('verify identity', () => {
|
|
let identity
|
|
|
|
before(async () => {
|
|
const didProvider = new Ed25519Provider(seed)
|
|
identity = await identities.createIdentity({ type, keystore, didProvider })
|
|
})
|
|
|
|
it('DID identity verifies', async () => {
|
|
const verified = await identities.verifyIdentity(identity)
|
|
assert.strictEqual(verified, true)
|
|
})
|
|
|
|
it('DID identity with incorrect id does not verify', async () => {
|
|
const { publicKey, signatures, type } = identity
|
|
const identity2 = await Identity({
|
|
id: 'NotAnId',
|
|
publicKey,
|
|
signatures,
|
|
type
|
|
})
|
|
const verified = await identities.verifyIdentity(identity2)
|
|
assert.strictEqual(verified, false)
|
|
})
|
|
})
|
|
|
|
describe('sign data with an identity', () => {
|
|
let identity
|
|
const data = 'hello friend'
|
|
|
|
before(async () => {
|
|
const didProvider = new Ed25519Provider(seed)
|
|
identity = await identities.createIdentity({ type, keystore, didProvider })
|
|
})
|
|
|
|
it('sign data', async () => {
|
|
const signingKey = await keystore.getKey(identity.id)
|
|
const expectedSignature = await signMessage(signingKey, data)
|
|
const signature = await identities.sign(identity, data, keystore)
|
|
assert.strictEqual(signature, expectedSignature)
|
|
})
|
|
|
|
it('throws an error if private key is not found from keystore', async () => {
|
|
// Remove the key from the keystore (we're using a mock storage in these tests)
|
|
const { publicKey, signatures, type } = identity
|
|
const modifiedIdentity = await Identity({
|
|
id: 'this id does not exist',
|
|
publicKey,
|
|
signatures: {
|
|
id: '<sig>',
|
|
publicKey: signatures.publicKey
|
|
},
|
|
type
|
|
})
|
|
let signature
|
|
let err
|
|
try {
|
|
signature = await identities.sign(modifiedIdentity, data, keystore)
|
|
} catch (e) {
|
|
err = e.toString()
|
|
}
|
|
assert.strictEqual(signature, undefined)
|
|
assert.strictEqual(err, 'Error: Private signing key not found from KeyStore')
|
|
})
|
|
|
|
describe('verify data signed by an identity', () => {
|
|
const data = 'hello friend'
|
|
let identity
|
|
let signature
|
|
|
|
before(async () => {
|
|
const didProvider = new Ed25519Provider(seed)
|
|
identity = await identities.createIdentity({ type, keystore, didProvider })
|
|
signature = await identities.sign(identity, data, keystore)
|
|
})
|
|
|
|
it('verifies that the signature is valid', async () => {
|
|
const verified = await identities.verify(signature, identity.publicKey, data)
|
|
assert.strictEqual(verified, true)
|
|
})
|
|
|
|
it('doesn\'t verify invalid signature', async () => {
|
|
const verified = await identities.verify('invalid', identity.publicKey, data)
|
|
assert.strictEqual(verified, false)
|
|
})
|
|
})
|
|
})
|
|
})
|