Skip to content

Commit da08e01

Browse files
committed
fix: Coordinated #put to signature match in case of external controllers present
1 parent 02d8eb9 commit da08e01

File tree

4 files changed

+91
-10
lines changed

4 files changed

+91
-10
lines changed

cjs/src/modules/did.ts

+45-2
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,13 @@ export class DIDModule extends AbstractCheqdSDKModule {
257257
throw new Error(`DID payload is not spec compliant: ${error}`);
258258
}
259259

260+
const { valid: authenticationValid, error: authenticationError } =
261+
await DIDModule.validateAuthenticationAgainstSignatures(didPayload, signInputs as SignInfo[], this.querier);
262+
263+
if (!authenticationValid) {
264+
throw new Error(`DID authentication is not valid: ${authenticationError}`);
265+
}
266+
260267
const payload = MsgCreateDidDocPayload.fromPartial({
261268
context: <string[]>didPayload?.['@context'],
262269
id: didPayload.id,
@@ -328,6 +335,17 @@ export class DIDModule extends AbstractCheqdSDKModule {
328335
throw new Error(`DID payload is not spec compliant: ${error}`);
329336
}
330337

338+
const { valid: authenticationValid, error: authenticationError } =
339+
await DIDModule.validateAuthenticationAgainstSignaturesKeyRotation(
340+
didPayload,
341+
signInputs as SignInfo[],
342+
this.querier
343+
);
344+
345+
if (!authenticationValid) {
346+
throw new Error(`DID authentication is not valid: ${authenticationError}`);
347+
}
348+
331349
const payload = MsgUpdateDidDocPayload.fromPartial({
332350
context: <string[]>didPayload?.['@context'],
333351
id: didPayload.id,
@@ -342,9 +360,27 @@ export class DIDModule extends AbstractCheqdSDKModule {
342360
alsoKnownAs: <string[]>didPayload.alsoKnownAs,
343361
versionId: versionId,
344362
});
363+
364+
// check whether external controller or not
365+
const externalController = (didPayload.controller as string[]).some((c) => c !== didPayload.id);
366+
367+
// get external controllers' documents, if any
368+
const externalControllersDocuments = externalController
369+
? (
370+
await Promise.all(
371+
(didPayload.controller as string[])
372+
.filter((c) => c !== didPayload.id)
373+
.map(async (c) => {
374+
const { didDoc } = await this.querier[defaultDidExtensionKey].didDoc(c);
375+
return didDoc;
376+
})
377+
)
378+
).filter((d) => d !== undefined) || []
379+
: [];
380+
345381
let signatures: SignInfo[];
346382
if (ISignInputs.isSignInput(signInputs)) {
347-
signatures = await this._signer.#dateDidDocTx(signInputs, payload);
383+
signatures = await this._signer.#dateDidDocTx(signInputs, payload, externalControllersDocuments);
348384
} else {
349385
signatures = signInputs;
350386
}
@@ -393,14 +429,21 @@ export class DIDModule extends AbstractCheqdSDKModule {
393429
throw new Error(`DID payload is not spec compliant: ${error}`);
394430
}
395431

432+
const { valid: authenticationValid, error: authenticationError } =
433+
await DIDModule.validateAuthenticationAgainstSignatures(didPayload, signInputs as SignInfo[], this.querier);
434+
435+
if (!authenticationValid) {
436+
throw new Error(`DID authentication is not valid: ${authenticationError}`);
437+
}
438+
396439
const payload = MsgDeactivateDidDocPayload.fromPartial({
397440
id: didPayload.id,
398441
versionId: versionId,
399442
});
400443

401444
let signatures: SignInfo[];
402445
if (ISignInputs.isSignInput(signInputs)) {
403-
signatures = await this._signer.signdeactivateDidDocTx(signInputs, payload, protobufVerificationMethod!);
446+
signatures = await this._signer.signDeactivateDidDocTx(signInputs, payload, protobufVerificationMethod!);
404447
} else {
405448
signatures = signInputs;
406449
}

cjs/src/signer.ts

+13-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
MsgUpdateDidDocPayload,
2424
MsgDeactivateDidDocPayload,
2525
VerificationMethod,
26+
DidDoc,
2627
} from '@cheqd/ts-proto-cjs/cheqd/did/v2';
2728
import { DidStdFee, ISignInputs, TSignerAlgo, VerificationMethods } from './types';
2829
import { base64ToBytes, EdDSASigner, hexToBytes, Signer, ES256Signer, ES256KSigner } from 'did-jwt-cjs';
@@ -235,7 +236,11 @@ export class CheqdSigningStargateClient extends SigningStargateClient {
235236
return signInfos;
236237
}
237238

238-
async #dateDidDocTx(signInputs: ISignInputs[], payload: MsgUpdateDidDocPayload): Promise<SignInfo[]> {
239+
async #dateDidDocTx(
240+
signInputs: ISignInputs[],
241+
payload: MsgUpdateDidDocPayload,
242+
externalControllers?: DidDoc[]
243+
): Promise<SignInfo[]> {
239244
await this.checkDidSigners(payload?.verificationMethod);
240245

241246
const signBytes = MsgUpdateDidDocPayload.encode(payload).finish();
@@ -245,7 +250,12 @@ export class CheqdSigningStargateClient extends SigningStargateClient {
245250
verificationMethodId: signInput.verificationMethodId,
246251
signature: base64ToBytes(
247252
(await (
248-
await this.getDidSigner(signInput.verificationMethodId, payload.verificationMethod)
253+
await this.getDidSigner(
254+
signInput.verificationMethodId,
255+
payload.verificationMethod.concat(
256+
externalControllers?.flatMap((controller) => controller.verificationMethod) ?? []
257+
)
258+
)
249259
)(hexToBytes(signInput.privateKeyHex))(signBytes)) as string
250260
),
251261
};
@@ -255,7 +265,7 @@ export class CheqdSigningStargateClient extends SigningStargateClient {
255265
return signInfos;
256266
}
257267

258-
async signdeactivateDidDocTx(
268+
async signDeactivateDidDocTx(
259269
signInputs: ISignInputs[],
260270
payload: MsgDeactivateDidDocPayload,
261271
verificationMethod: VerificationMethod[]

esm/src/modules/did.ts

+20-2
Original file line numberDiff line numberDiff line change
@@ -348,9 +348,27 @@ export class DIDModule extends AbstractCheqdSDKModule {
348348
alsoKnownAs: <string[]>didPayload.alsoKnownAs,
349349
versionId: versionId,
350350
});
351+
352+
// check whether external controller or not
353+
const externalController = (didPayload.controller as string[]).some((c) => c !== didPayload.id);
354+
355+
// get external controllers' documents, if any
356+
const externalControllersDocuments = externalController
357+
? (
358+
await Promise.all(
359+
(didPayload.controller as string[])
360+
.filter((c) => c !== didPayload.id)
361+
.map(async (c) => {
362+
const { didDoc } = await this.querier[defaultDidExtensionKey].didDoc(c);
363+
return didDoc;
364+
})
365+
)
366+
).filter((d) => d !== undefined) || []
367+
: [];
368+
351369
let signatures: SignInfo[];
352370
if (ISignInputs.isSignInput(signInputs)) {
353-
signatures = await this._signer.#dateDidDocTx(signInputs, payload);
371+
signatures = await this._signer.#dateDidDocTx(signInputs, payload, externalControllersDocuments);
354372
} else {
355373
signatures = signInputs;
356374
}
@@ -413,7 +431,7 @@ export class DIDModule extends AbstractCheqdSDKModule {
413431

414432
let signatures: SignInfo[];
415433
if (ISignInputs.isSignInput(signInputs)) {
416-
signatures = await this._signer.signdeactivateDidDocTx(signInputs, payload, protobufVerificationMethod!);
434+
signatures = await this._signer.signDeactivateDidDocTx(signInputs, payload, protobufVerificationMethod!);
417435
} else {
418436
signatures = signInputs;
419437
}

esm/src/signer.ts

+13-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
MsgUpdateDidDocPayload,
2424
MsgDeactivateDidDocPayload,
2525
VerificationMethod,
26+
DidDoc,
2627
} from '@cheqd/ts-proto/cheqd/did/v2/index.js';
2728
import { DidStdFee, ISignInputs, TSignerAlgo, VerificationMethods } from './types.js';
2829
import { base64ToBytes, EdDSASigner, hexToBytes, Signer, ES256Signer, ES256KSigner } from 'did-jwt';
@@ -230,7 +231,11 @@ export class CheqdSigningStargateClient extends SigningStargateClient {
230231
return signInfos;
231232
}
232233

233-
async #dateDidDocTx(signInputs: ISignInputs[], payload: MsgUpdateDidDocPayload): Promise<SignInfo[]> {
234+
async #dateDidDocTx(
235+
signInputs: ISignInputs[],
236+
payload: MsgUpdateDidDocPayload,
237+
externalControllers?: DidDoc[]
238+
): Promise<SignInfo[]> {
234239
await this.checkDidSigners(payload?.verificationMethod);
235240

236241
const signBytes = MsgUpdateDidDocPayload.encode(payload).finish();
@@ -240,7 +245,12 @@ export class CheqdSigningStargateClient extends SigningStargateClient {
240245
verificationMethodId: signInput.verificationMethodId,
241246
signature: base64ToBytes(
242247
(await (
243-
await this.getDidSigner(signInput.verificationMethodId, payload.verificationMethod)
248+
await this.getDidSigner(
249+
signInput.verificationMethodId,
250+
payload.verificationMethod.concat(
251+
externalControllers?.flatMap((controller) => controller.verificationMethod) ?? []
252+
)
253+
)
244254
)(hexToBytes(signInput.privateKeyHex))(signBytes)) as string
245255
),
246256
};
@@ -250,7 +260,7 @@ export class CheqdSigningStargateClient extends SigningStargateClient {
250260
return signInfos;
251261
}
252262

253-
async signdeactivateDidDocTx(
263+
async signDeactivateDidDocTx(
254264
signInputs: ISignInputs[],
255265
payload: MsgDeactivateDidDocPayload,
256266
verificationMethod: VerificationMethod[]

0 commit comments

Comments
 (0)