Skip to content
Snippets Groups Projects
Commit 7780ca2d authored by Steffen Schulze's avatar Steffen Schulze
Browse files

Merge branch 'did-configuration' into 'main'

feat(ssi): added did configuration for all dids

See merge request !26
parents 29bb32bb de7a69c3
No related branches found
No related tags found
1 merge request!26feat(ssi): added did configuration for all dids
......@@ -42,3 +42,28 @@ export class EventDidsRegisterIndyFromSeed extends BaseEvent<Array<string>> {
);
}
}
export type DidConfiguration = {
entries: Array<{ did: string; jwt: string }>;
};
export type EventDidsDidConfigurationInput = BaseEventInput<{
domain: string;
expiryTime: number;
}>;
export class EventDidsDidConfiguration extends BaseEvent<DidConfiguration> {
public static token = 'dids.didConfiguration';
public get instance() {
return this.data;
}
public static fromEvent(e: EventDidsDidConfiguration) {
return new EventDidsDidConfiguration(
e.data,
e.tenantId,
e.id,
e.type,
e.timestamp,
);
}
}
import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';
import {
EventDidsDidConfiguration,
EventDidsDidConfigurationInput,
EventDidsRegisterIndyFromSeed,
EventDidsRegisterIndyFromSeedInput,
EventDidsResolve,
......@@ -21,6 +23,14 @@ export class DidsController {
);
}
@MessagePattern(EventDidsDidConfiguration.token)
public async getDidConfiguration(options: EventDidsDidConfigurationInput) {
return new EventDidsDidConfiguration(
await this.didsService.getDidConfiguration(options),
options.tenantId,
);
}
@MessagePattern(EventDidsResolve.token)
public async resolve(options: EventDidsResolveInput) {
return new EventDidsResolve(
......
......@@ -7,10 +7,17 @@ import type {
EventDidsRegisterIndyFromSeed,
EventDidsRegisterIndyFromSeedInput,
EventDidsResolve,
DidConfiguration,
EventDidsDidConfiguration,
EventDidsDidConfigurationInput,
EventDidsResolveInput,
} from '@ocm/shared';
import {
JsonEncoder,
JwaSignatureAlgorithm,
JwsService,
getKeyFromVerificationMethod,
DidDocumentService,
Hasher,
KeyType,
......@@ -51,6 +58,61 @@ export class DidsService {
});
}
public async getDidConfiguration({
domain,
expiryTime,
tenantId,
}: EventDidsDidConfigurationInput): Promise<
EventDidsDidConfiguration['data']
> {
return this.withTenantService.invoke(tenantId, async (t) => {
const indyDids = t.dids.getCreatedDids({method: 'indy'});
const sovDids = t.dids.getCreatedDids({method: 'sov'});
const webDids = t.dids.getCreatedDids({method: 'web'});
const dids = (await Promise.all([indyDids, sovDids, webDids])).flatMap((d) => d)
const jwtEntries: DidConfiguration['entries'] = [];
const jwsService = t.dependencyManager.resolve(JwsService);
for (const { did, didDocument } of dids) {
const payload = {
iss: did,
exp: expiryTime,
domain,
};
const encodedPayload = TypedArrayEncoder.fromString(
JsonEncoder.toString(payload),
);
if (
!didDocument ||
!didDocument.verificationMethod ||
!didDocument.verificationMethod[0]
) {
continue;
}
const vm = didDocument.verificationMethod[0];
const key = getKeyFromVerificationMethod(vm);
const jws = await jwsService.createJwsCompact(t.context, {
key,
payload: encodedPayload,
protectedHeaderOptions: {
alg: JwaSignatureAlgorithm.EdDSA,
kid: did,
},
});
jwtEntries.push({ did, jwt: jws });
}
return { entries: jwtEntries };
});
}
public async registerDidIndyFromSeed({
tenantId,
seed,
......
import type { INestApplication } from '@nestjs/common';
import type { ClientProxy } from '@nestjs/microservices';
import type {
EventDidsDidConfigurationInput,
EventDidsRegisterIndyFromSeedInput,
EventDidsResolveInput,
} from '@ocm/shared';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { Test } from '@nestjs/testing';
import { EventDidsRegisterIndyFromSeed, EventDidsResolve } from '@ocm/shared';
import {
EventDidsDidConfiguration,
EventDidsRegisterIndyFromSeed,
EventDidsResolve,
} from '@ocm/shared';
import { randomBytes } from 'crypto';
import { firstValueFrom } from 'rxjs';
......@@ -78,6 +83,29 @@ describe('Dids', () => {
).toBeTruthy();
});
it(EventDidsDidConfiguration.token, async () => {
const response$ = client.send<
EventDidsDidConfiguration,
EventDidsDidConfigurationInput
>(EventDidsDidConfiguration.token, {
domain: 'https://example.org',
expiryTime: new Date().getTime() / 1000 + 3600,
tenantId,
});
const response = await firstValueFrom(response$);
const eventInstance = EventDidsDidConfiguration.fromEvent(response);
expect(eventInstance.instance).toMatchObject({
entries: expect.arrayContaining([
expect.objectContaining({
did: 'did:indy:bcovrin:test:9MMeff63VnCpogD2FWfKnJ',
jwt: expect.any(String),
}),
]),
});
});
it(EventDidsResolve.token, async () => {
const response$ = client.send<EventDidsResolve, EventDidsResolveInput>(
EventDidsResolve.token,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment