orbitdb/test/identities/did-identity-provider.test.js
haad a063b3fb4a Refactor OrbitDB
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
2023-03-01 16:21:07 +02:00

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)
})
})
})
})