Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ jobs:
timeout-minutes: 10
strategy:
matrix:
node-version: [18.x]
node-version: [24.x]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm install
Expand All @@ -24,11 +24,11 @@ jobs:
timeout-minutes: 10
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
node-version: [20.x, 22.x, 24.x]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: |
Expand All @@ -45,11 +45,11 @@ jobs:
timeout-minutes: 10
strategy:
matrix:
node-version: [18.x]
node-version: [24.x]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: |
Expand All @@ -61,7 +61,9 @@ jobs:
cd test
npm run coverage-ci
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2
uses: codecov/codecov-action@v4
with:
file: ./test/coverage/lcov.info
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}

6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
- Lint module.
- Add `package.json` `files` field.

## 3.1.0 - 2025-09-dd

### Changed
- Update dependencies:
- `@digitalbazaar/did-method-key@5`.

## 3.0.1 - 2022-05-21

### Fixed
Expand Down
57 changes: 40 additions & 17 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,27 @@
* Copyright (c) 2020-2022 Digital Bazaar, Inc. All rights reserved.
*/
import * as bedrock from '@bedrock/core';
import * as Ed25519Multikey from '@digitalbazaar/ed25519-multikey';
import {decodeSecretKeySeed} from 'bnid';
import {driver} from '@digitalbazaar/did-method-key';
import {logger} from './logger.js';
import {
X25519KeyAgreementKey2020
} from '@digitalbazaar/x25519-key-agreement-key-2020';

import './config.js';

const {config, util: {BedrockError}} = bedrock;

const didKeyDriver = driver();
didKeyDriver.use({
multibaseMultikeyHeader: 'z6Mk',
fromMultibase: Ed25519Multikey.from
});
didKeyDriver.use({
multibaseMultikeyHeader: 'z6LS',
fromMultibase: X25519KeyAgreementKey2020.from
});

let APPLICATION_IDENTITY;
const SERVICE_IDENTITIES = new Map();
Expand Down Expand Up @@ -120,27 +133,37 @@ async function _generateKeys({seedMultibase}) {
// convert multibase seed to Uint8Array
const seed = decodeSecretKeySeed({secretKeySeed: seedMultibase});

// initialize key after bedrock configuration stage is complete
const didKey = await didKeyDriver.generate({seed});

const {didDocument: {
authentication, assertionMethod, capabilityDelegation, capabilityInvocation,
keyAgreement, id
}} = didKey;

const authenticationKey = didKey.keyPairs.get(authentication[0]);
const assertionMethodKey = didKey.keyPairs.get(assertionMethod[0]);
const capabilityDelegationKey = didKey.keyPairs.get(capabilityDelegation[0]);
const capabilityInvocationKey = didKey.keyPairs.get(capabilityInvocation[0]);
const keyAgreementKey = didKey.keyPairs.get(keyAgreement[0].id);
// initialize `did:key` DID after bedrock configuration stage is complete
const verificationKeyPair = await Ed25519Multikey.generate({seed});
const {
didDocument: {id}, methodFor
} = await didKeyDriver.fromKeyPair({verificationKeyPair});

// update verification key pair with `id` and `controller`
verificationKeyPair.id = methodFor({purpose: 'authentication'}).id;
verificationKeyPair.controller = id;
// for backwards compatibility, use legacy type `Ed25519VerificationKey2020`;
// to be replaced with `Multikey` in next major release
verificationKeyPair.type = 'Ed25519VerificationKey2020';

// for backwards compatibility, import key agreement key; to be removed
// in next major release
const keyAgreementKey = X25519KeyAgreementKey2020
.fromEd25519VerificationKey2020({
keyPair: {
...verificationKeyPair,
privateKeyMultibase: verificationKeyPair.secretKeyMultibase
}
});
keyAgreementKey.id = `${id}#${keyAgreementKey.publicKeyMultibase}`;

return {
id,
keys: {
authenticationKey,
assertionMethodKey,
capabilityDelegationKey,
capabilityInvocationKey,
authenticationKey: verificationKeyPair,
assertionMethodKey: verificationKeyPair,
capabilityDelegationKey: verificationKeyPair,
capabilityInvocationKey: verificationKeyPair,
keyAgreementKey
}
};
Expand Down
14 changes: 8 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@
},
"homepage": "https://github.com/digitalbazaar/bedrock-app-identity",
"dependencies": {
"@digitalbazaar/did-method-key": "^3.0.0",
"@digitalbazaar/did-method-key": "^5.2.0",
"@digitalbazaar/ed25519-multikey": "^1.3.1",
"@digitalbazaar/ed25519-signature-2020": "^5.4.0",
"@digitalbazaar/x25519-key-agreement-key-2020": "^3.0.1",
"bnid": "^3.0.0"
},
"peerDependencies": {
Expand All @@ -39,11 +42,10 @@
"lib": "./lib"
},
"devDependencies": {
"eslint": "^8.18.0",
"eslint-config-digitalbazaar": "^3.0.0",
"eslint-plugin-jsdoc": "^39.3.3",
"eslint-plugin-unicorn": "^42.0.0",
"jsdoc-to-markdown": "^7.1.1"
"eslint": "^8.57.1",
"eslint-config-digitalbazaar": "^5.2.0",
"eslint-plugin-jsdoc": "^50.8.0",
"eslint-plugin-unicorn": "^56.0.1"
},
"engines": {
"node": ">=16"
Expand Down
10 changes: 5 additions & 5 deletions test/mocha/10-api.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
/*!
* Copyright (c) 2020-2022 Digital Bazaar, Inc. All rights reserved.
* Copyright (c) 2020-2025 Digital Bazaar, Inc. All rights reserved.
*/
import * as bedrock from '@bedrock/core';
import {
getAppIdentity,
getServiceIdentities,
_resetApplicationIdentity,
_generateApplicationIdentity,
_generateServiceIdentity
_generateServiceIdentity,
_resetApplicationIdentity,
getAppIdentity,
getServiceIdentities
} from '@bedrock/app-identity';

describe('bedrock-app-identity API', () => {
Expand Down
16 changes: 12 additions & 4 deletions util/generate-seed.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
/*!
* Copyright (c) 2020-2022 Digital Bazaar, Inc. All rights reserved.
* Copyright (c) 2020-2025 Digital Bazaar, Inc. All rights reserved.
*/
import * as Ed25519Multikey from '@digitalbazaar/ed25519-multikey';
import {decodeSecretKeySeed, generateSecretKeySeed} from 'bnid';
import {driver} from '@digitalbazaar/did-method-key';
import {generateSecretKeySeed, decodeSecretKeySeed} from 'bnid';

const didKeyDriver = driver();
didKeyDriver.use({
multibaseMultikeyHeader: 'z6Mk',
fromMultibase: Ed25519Multikey.from
});

// generate a random seed
const secretKeySeed = await generateSecretKeySeed();
const seedBytes = await decodeSecretKeySeed({secretKeySeed});
const didKey = await didKeyDriver.generate({seed: seedBytes});

console.log('PUBLIC DID', didKey.didDocument.id);
// generate `did:key` DID
const verificationKeyPair = await Ed25519Multikey.generate({seed: seedBytes});
const {didDocument} = await didKeyDriver.fromKeyPair({verificationKeyPair});

console.log('PUBLIC DID', didDocument.id);
console.log(`SECRET seedMultibase: ${secretKeySeed}`);