diff --git a/packages/anoncreds/src/updates/0.4-0.5/anonCredsCredentialRecord.ts b/packages/anoncreds/src/updates/0.4-0.5/anonCredsCredentialRecord.ts index 44536a414c..53073483a7 100644 --- a/packages/anoncreds/src/updates/0.4-0.5/anonCredsCredentialRecord.ts +++ b/packages/anoncreds/src/updates/0.4-0.5/anonCredsCredentialRecord.ts @@ -16,7 +16,6 @@ import { fetchCredentialDefinition } from '../../utils/anonCredsObjects' import { getIndyNamespaceFromIndyDid, getQualifiedDidIndyDid, - getUnQualifiedDidIndyDid, getUnqualifiedRevocationRegistryDefinitionId, isIndyDid, isUnqualifiedCredentialDefinitionId, diff --git a/packages/anoncreds/src/utils/w3cAnonCredsUtils.ts b/packages/anoncreds/src/utils/w3cAnonCredsUtils.ts index 243962a216..bf684e3696 100644 --- a/packages/anoncreds/src/utils/w3cAnonCredsUtils.ts +++ b/packages/anoncreds/src/utils/w3cAnonCredsUtils.ts @@ -222,7 +222,7 @@ export function getW3cRecordAnonCredsTags(options: { ...((isIndyDid(issuerId) || isUnqualifiedIndyDid(issuerId)) && { anonCredsUnqualifiedIssuerId: getUnQualifiedDidIndyDid(issuerId), anonCredsUnqualifiedCredentialDefinitionId: getUnQualifiedDidIndyDid(credentialDefinitionId), - anonCredsUnqualifiedSchemaId: getUnQualifiedDidIndyDid(schemaId), + anonCredsUnqualifiedSchemaId: getUnQualifiedDidIndyDid(issuerId), anonCredsUnqualifiedSchemaIssuerId: getUnQualifiedDidIndyDid(schema.issuerId), anonCredsUnqualifiedRevocationRegistryId: revocationRegistryId ? getUnQualifiedDidIndyDid(revocationRegistryId) diff --git a/packages/core/src/modules/connections/DidExchangeProtocol.ts b/packages/core/src/modules/connections/DidExchangeProtocol.ts index ce77b8b2eb..a735cfca8a 100644 --- a/packages/core/src/modules/connections/DidExchangeProtocol.ts +++ b/packages/core/src/modules/connections/DidExchangeProtocol.ts @@ -504,10 +504,13 @@ export class DidExchangeProtocol { message: DidExchangeRequestMessage | DidExchangeResponseMessage, invitationKeysBase58: string[] = [] ) { - // The only supported case where we expect to receive a did-document attachment is did:peer algo 1 - return isDid(message.did, 'peer') && getNumAlgoFromPeerDid(message.did) === PeerDidNumAlgo.GenesisDoc - ? this.extractAttachedDidDocument(agentContext, message, invitationKeysBase58) - : this.extractResolvableDidDocument(agentContext, message, invitationKeysBase58) + // Not all agents use didRotate yet, some may still send a didDoc attach with various did types + // we should check if the didDoc attach is there and if not require that the didRotate be present + if (message.didDoc) { + return this.extractAttachedDidDocument(agentContext, message, invitationKeysBase58) + } else { + return this.extractResolvableDidDocument(agentContext, message, invitationKeysBase58) + } } /** @@ -522,11 +525,11 @@ export class DidExchangeProtocol { // Validate did-rotate attachment in case of DID Exchange response if (message instanceof DidExchangeResponseMessage) { const didRotateAttachment = message.didRotate - if (!didRotateAttachment) { - throw new DidExchangeProblemReportError('DID Rotate attachment is missing.', { - problemCode: DidExchangeProblemReportReason.ResponseNotAccepted, - }) + throw new DidExchangeProblemReportError( + 'Either a DID Rotate attachment or a didDoc attachment must be provided to make a secure connection', + { problemCode: DidExchangeProblemReportReason.ResponseNotAccepted } + ) } const jws = didRotateAttachment.data.jws diff --git a/packages/core/src/modules/credentials/protocol/v2/messages/V2OfferCredentialMessage.ts b/packages/core/src/modules/credentials/protocol/v2/messages/V2OfferCredentialMessage.ts index d434367060..1558259e76 100644 --- a/packages/core/src/modules/credentials/protocol/v2/messages/V2OfferCredentialMessage.ts +++ b/packages/core/src/modules/credentials/protocol/v2/messages/V2OfferCredentialMessage.ts @@ -58,6 +58,7 @@ export class V2OfferCredentialMessage extends AgentMessage { @Expose({ name: 'credential_preview' }) @Type(() => V2CredentialPreview) + @IsOptional() @ValidateNested() @IsInstance(V2CredentialPreview) public credentialPreview?: V2CredentialPreview diff --git a/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G1Key2020.ts b/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G1Key2020.ts index 224a407856..7bd015cd58 100644 --- a/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G1Key2020.ts +++ b/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G1Key2020.ts @@ -32,9 +32,9 @@ export function isBls12381G1Key2020(verificationMethod: VerificationMethod): ver * Get a key from a Bls12381G1Key2020 verification method. */ export function getKeyFromBls12381G1Key2020(verificationMethod: Bls12381G1Key2020) { - if (!verificationMethod.publicKeyBase58) { - throw new CredoError('verification method is missing publicKeyBase58') + if (verificationMethod.publicKeyBase58) { + return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Bls12381g1) } - return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Bls12381g1) + throw new CredoError('verification method is missing publicKeyBase58') } diff --git a/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G2Key2020.ts b/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G2Key2020.ts index dc2c7bd6d7..8192f9adaf 100644 --- a/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G2Key2020.ts +++ b/packages/core/src/modules/dids/domain/verificationMethod/Bls12381G2Key2020.ts @@ -32,9 +32,9 @@ export function isBls12381G2Key2020(verificationMethod: VerificationMethod): ver * Get a key from a Bls12381G2Key2020 verification method. */ export function getKeyFromBls12381G2Key2020(verificationMethod: Bls12381G2Key2020) { - if (!verificationMethod.publicKeyBase58) { - throw new CredoError('verification method is missing publicKeyBase58') + if (verificationMethod.publicKeyBase58) { + return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Bls12381g2) } - return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Bls12381g2) + throw new CredoError('verification method is missing publicKeyBase58') } diff --git a/packages/core/src/modules/dids/domain/verificationMethod/EcdsaSecp256k1VerificationKey2019.ts b/packages/core/src/modules/dids/domain/verificationMethod/EcdsaSecp256k1VerificationKey2019.ts index 8de9e649ad..632f374be6 100644 --- a/packages/core/src/modules/dids/domain/verificationMethod/EcdsaSecp256k1VerificationKey2019.ts +++ b/packages/core/src/modules/dids/domain/verificationMethod/EcdsaSecp256k1VerificationKey2019.ts @@ -43,9 +43,9 @@ export function isEcdsaSecp256k1VerificationKey2019( * Get a key from a EcdsaSecp256k1VerificationKey2019 verification method. */ export function getKeyFromEcdsaSecp256k1VerificationKey2019(verificationMethod: EcdsaSecp256k1VerificationKey2019) { - if (!verificationMethod.publicKeyBase58) { - throw new CredoError('verification method is missing publicKeyBase58') + if (verificationMethod.publicKeyBase58) { + return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.K256) } - return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.K256) + throw new CredoError('verification method is missing publicKeyBase58') } diff --git a/packages/core/src/modules/dids/domain/verificationMethod/Ed25519VerificationKey2018.ts b/packages/core/src/modules/dids/domain/verificationMethod/Ed25519VerificationKey2018.ts index 3851d70b16..c973404ddd 100644 --- a/packages/core/src/modules/dids/domain/verificationMethod/Ed25519VerificationKey2018.ts +++ b/packages/core/src/modules/dids/domain/verificationMethod/Ed25519VerificationKey2018.ts @@ -34,9 +34,9 @@ export function isEd25519VerificationKey2018( * Get a key from a Ed25519VerificationKey2018 verification method. */ export function getKeyFromEd25519VerificationKey2018(verificationMethod: Ed25519VerificationKey2018) { - if (!verificationMethod.publicKeyBase58) { - throw new CredoError('verification method is missing publicKeyBase58') + if (verificationMethod.publicKeyBase58) { + return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Ed25519) } - return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Ed25519) + throw new CredoError('verification method is missing publicKeyBase58') } diff --git a/packages/core/src/modules/dids/domain/verificationMethod/Multikey.ts b/packages/core/src/modules/dids/domain/verificationMethod/Multikey.ts index e201f969ae..f817e10e8a 100644 --- a/packages/core/src/modules/dids/domain/verificationMethod/Multikey.ts +++ b/packages/core/src/modules/dids/domain/verificationMethod/Multikey.ts @@ -32,14 +32,20 @@ export function getMultikey({ did, key, verificationMethodId }: GetMultikeyOptio */ export function isMultikey( verificationMethod: VerificationMethod -): verificationMethod is VerificationMethod & { type: 'Multikey' } { +): verificationMethod is + | (VerificationMethod & { type: 'Multikey' }) + | (VerificationMethod & { publicKeyMultibase: string }) { return verificationMethod.type === VERIFICATION_METHOD_TYPE_MULTIKEY } /** * Get a key from a Multikey verification method. */ -export function getKeyFromMultikey(verificationMethod: VerificationMethod & { type: 'Multikey' }) { +export function getKeyFromMultikey( + verificationMethod: + | (VerificationMethod & { type: 'Multikey' }) + | (VerificationMethod & { publicKeyMultibase: string }) +) { if (!verificationMethod.publicKeyMultibase) { throw new CredoError( `Missing publicKeyMultibase on verification method with type ${VERIFICATION_METHOD_TYPE_MULTIKEY}` diff --git a/packages/core/src/modules/dids/domain/verificationMethod/X25519KeyAgreementKey2019.ts b/packages/core/src/modules/dids/domain/verificationMethod/X25519KeyAgreementKey2019.ts index 7df0c332f5..af232c5c1d 100644 --- a/packages/core/src/modules/dids/domain/verificationMethod/X25519KeyAgreementKey2019.ts +++ b/packages/core/src/modules/dids/domain/verificationMethod/X25519KeyAgreementKey2019.ts @@ -34,9 +34,17 @@ export function isX25519KeyAgreementKey2019( * Get a key from a X25519KeyAgreementKey2019 verification method. */ export function getKeyFromX25519KeyAgreementKey2019(verificationMethod: X25519KeyAgreementKey2019) { - if (!verificationMethod.publicKeyBase58) { - throw new CredoError('verification method is missing publicKeyBase58') + if (verificationMethod.publicKeyBase58) { + return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.X25519) + } + if (verificationMethod.publicKeyMultibase) { + const key = Key.fromFingerprint(verificationMethod.publicKeyMultibase) + if (key.keyType === KeyType.X25519) return key + else + throw new CredoError( + `Unexpected key type from resolving multibase encoding, key type was ${key.keyType} but expected ${KeyType.X25519}` + ) } - return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.X25519) + throw new CredoError('verification method is missing publicKeyBase58 or publicKeyMultibase') } diff --git a/packages/core/src/modules/dids/methods/peer/didPeer.ts b/packages/core/src/modules/dids/methods/peer/didPeer.ts index fb8aee487e..7e4b164888 100644 --- a/packages/core/src/modules/dids/methods/peer/didPeer.ts +++ b/packages/core/src/modules/dids/methods/peer/didPeer.ts @@ -3,7 +3,7 @@ import { CredoError } from '../../../../error' import { getAlternativeDidsForNumAlgo4Did } from './peerDidNumAlgo4' const PEER_DID_REGEX = new RegExp( - '^did:peer:(([01](z)([1-9a-km-zA-HJ-NP-Z]{5,200}))|(2((.[AEVID](z)([1-9a-km-zA-HJ-NP-Z]{5,200}))+(.(S)[0-9a-zA-Z=]*)?))|([4](z[1-9a-km-zA-HJ-NP-Z]{46})(:z[1-9a-km-zA-HJ-NP-Z]{6,}){0,1}))$' + '^did:peer:(([01](z)([1-9a-km-zA-HJ-NP-Z]{5,200}))|(2((.[AEVID](z)([1-9a-km-zA-HJ-NP-Z]{5,200}))+(.(S)[0-9a-zA-Z=]*)*))|([4](z[1-9a-km-zA-HJ-NP-Z]{46})(:z[1-9a-km-zA-HJ-NP-Z]{6,}){0,1}))$' ) export function isValidPeerDid(did: string): boolean { diff --git a/packages/core/src/modules/vc/data-integrity/W3cJsonLdCredentialService.ts b/packages/core/src/modules/vc/data-integrity/W3cJsonLdCredentialService.ts index 74d174e793..3f5622af6c 100644 --- a/packages/core/src/modules/vc/data-integrity/W3cJsonLdCredentialService.ts +++ b/packages/core/src/modules/vc/data-integrity/W3cJsonLdCredentialService.ts @@ -15,7 +15,7 @@ import { createWalletKeyPairClass } from '../../../crypto/WalletKeyPair' import { CredoError } from '../../../error' import { injectable } from '../../../plugins' import { asArray, JsonTransformer } from '../../../utils' -import { VerificationMethod } from '../../dids' +import { DidsApi, VerificationMethod } from '../../dids' import { getKeyFromVerificationMethod } from '../../dids/domain/key-type' import { W3cCredentialsModuleConfig } from '../W3cCredentialsModuleConfig' import { w3cDate } from '../util' @@ -339,12 +339,23 @@ export class W3cJsonLdCredentialService { agentContext: AgentContext, verificationMethod: string ): Promise { - const documentLoader = this.w3cCredentialsModuleConfig.documentLoader(agentContext) - const verificationMethodObject = await documentLoader(verificationMethod) - const verificationMethodClass = JsonTransformer.fromJSON(verificationMethodObject.document, VerificationMethod) - - const key = getKeyFromVerificationMethod(verificationMethodClass) - return key + if (!verificationMethod.startsWith('did:')) { + const documentLoader = this.w3cCredentialsModuleConfig.documentLoader(agentContext) + const verificationMethodObject = await documentLoader(verificationMethod) + const verificationMethodClass = JsonTransformer.fromJSON(verificationMethodObject.document, VerificationMethod) + + const key = getKeyFromVerificationMethod(verificationMethodClass) + return key + } else { + const [did, keyid] = verificationMethod.split('#') + const didsApi = agentContext.dependencyManager.resolve(DidsApi) + const doc = await didsApi.resolve(did) + if (doc.didDocument) { + const verificationMethodClass = doc.didDocument.dereferenceKey(keyid) + return getKeyFromVerificationMethod(verificationMethodClass) + } + throw new CredoError(`Could not resolve verification method with id ${verificationMethod}`) + } } private getSignatureSuitesForCredential(agentContext: AgentContext, credential: W3cJsonLdVerifiableCredential) { diff --git a/packages/indy-vdr/src/dids/didSovUtil.ts b/packages/indy-vdr/src/dids/didSovUtil.ts index c2bd6cdc6a..f5246ea283 100644 --- a/packages/indy-vdr/src/dids/didSovUtil.ts +++ b/packages/indy-vdr/src/dids/didSovUtil.ts @@ -6,6 +6,7 @@ import { DidCommV2Service, convertPublicKeyToX25519, CredoError, + Buffer, } from '@credo-ts/core' export type CommEndpointType = 'endpoint' | 'did-communication' | 'DIDComm'