Hide code cell source
const plantumlEncoder = require('plantuml-encoder')
const tslab = require("tslab");
import jwt_decode from "jwt-decode";

Howto Share VC with Verifier#

We already know about classical triangle of roles. It is user centric

  • holder - user that own a VCs

  • issuer - party that issue a VC

  • verifier - could aks holder for a VCs to Verify

We need a protocol that could proof the identity and autorship for every role. As we know our identities is our keypairs so we should sign some entities to proof our identity Affinidi SDK offer transport agnostic protocols for excanges based on JWT tokens

Follow a video#

More information about verifiable presentations

Hide code cell source
const encodedTriangle = plantumlEncoder.encode(`
@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person_Ext(issuer, "Issuer")
Boundary(b1,"Verification") {
Person(holder, "Holder", $sprite="person2")
Person(verifier, "Verifier")
}

Rel_L(issuer, holder, "issue VC", "Request for offer")
Rel(holder, issuer, "claim", "Response for offer")
Rel_R(verifier, holder, "ask for VCs", "Request for sharing (Presentation Challenge)")
Rel(holder, verifier, "issue signed VP", "VP", $sprite = "&envelope-closed")

@enduml
`)
 
const urlTriangle = 'http://www.plantuml.com/plantuml/svg/' + encodedTriangle
tslab.display.html(`<img src="${urlTriangle}"/>`)

Flow#

Hide code cell source
const encodedFlow = plantumlEncoder.encode(`
title: Affinidi: Share VC Flow
participant "Verifier Service" as verifier
actor  "Verifier client , sdk" as client
actor "SDK Holder" as holder
database "Wallet storage" as wallet
participant "Registry" as registry


client -> verifier: BuildCredentialRequest (credentialRequirements)
verifier -> client: 200 [credentialShareRequest]

note over client, verifier: credentialShareRequest signing and credentialShareRequestToken generated
client -> holder: some way deliver (credentialShareRequestToken)
note over client, verifier: deliver way could be as QR code which posted on web, as PN in internal App logic implementation, etc
note over client, verifier: Generating CredentialShareResponseToken based on the credentialShareRequestToken
note over client, verifier
Verification of the Verifier signature on the credentialShareRequestToken
1. Resolve Verifier DID (get publicKey)
2. Verify Verifier signature (using publicKey)
end note
holder -> registry: resolveDid(VerifierDid)
registry -> holder: 200 [DidDocument]
holder -> wallet: getCredentials(credentialShareRequestToken)
wallet -> holder: 200 [credentials]

holder -> holder: Generating VP with credentials inside
holder -> client: some way to call back (VP)

note over verifier, holder
Verifier validate credentials:
1. Resolve Holder DID (get publicKey)
2. Verify Holder signature on JWT (using publicKey)
3. Validate that Holder its a Subject in credentials(optional)
4. Resolve Issuer DID(get publicKey)
5. Verify Issuer signature on each credentials (using publicKey)

Executing internall App logic
end note
client -> registry: resolveDid(HolderDid)
registry -> client: 200 [DidDocument]
client -> registry: resolveDid(IssuerDid)
registry -> client: 200 [DidDocument]
client -> client : do VP Validation
client -> client : do VC Validation

`)
 
const urlFlow = 'http://www.plantuml.com/plantuml/svg/' + encodedFlow
tslab.display.html(`<img src="${urlFlow}"/>`)

Lets import SDK

const { createWallet } = require('@affinidi/wallet-node-sdk')
const walletFactory = createWallet('AffinityCore')

Lets setup wallets

const accessApiKey = '<your key use affinidi cli to generate a key>'
const options = {
    env: 'prod',
    accessApiKey:accessApiKey,
}
  const verifierWallet = await walletFactory.createWallet(options, 'P@55word!!!')
  const holderWallet = await walletFactory.createWallet(options, 'P@55word!!!')

Verifier create Presentation Challenge#

   const presentationChallenge = await verifierWallet.generatePresentationChallenge([
      { type: ['VerifiableCredential', 'ContentLike'] },
    ])
JSON.stringify(jwt_decode(presentationChallenge),null,2)
{
  "interactionToken": {
    "credentialRequirements": [
      {
        "type": [
          "VerifiableCredential",
          "ContentLike"
        ],
        "constraints": []
      }
    ],
    "callbackURL": ""
  },
  "exp": 1663398268356,
  "typ": "credentialRequest",
  "jti": "038e7a1d81ae3d05",
  "iss": "did:elem:EiBsQ5S0kNYU-CkVLHFVQQxSp58gpcQP9zg1nFGTr-avjQ;elem:initial-state=eyJwcm90ZWN0ZWQiOiJleUp2Y0dWeVlYUnBiMjRpT2lKamNtVmhkR1VpTENKcmFXUWlPaUlqY0hKcGJXRnllU0lzSW1Gc1p5STZJa1ZUTWpVMlN5SjkiLCJwYXlsb2FkIjoiZXlKQVkyOXVkR1Y0ZENJNkltaDBkSEJ6T2k4dmR6TnBaQzV2Y21jdmMyVmpkWEpwZEhrdmRqSWlMQ0p3ZFdKc2FXTkxaWGtpT2x0N0ltbGtJam9pSTNCeWFXMWhjbmtpTENKMWMyRm5aU0k2SW5OcFoyNXBibWNpTENKMGVYQmxJam9pVTJWamNESTFObXN4Vm1WeWFXWnBZMkYwYVc5dVMyVjVNakF4T0NJc0luQjFZbXhwWTB0bGVVaGxlQ0k2SWpBeVptVmxZbU16WkdJNE1UYzJPRGc0TXpRek9EWmxOVFJqTkRKalpqTmtOMll3TjJFMU1UWTVOVEJqWm1NNFpUYzJPRGcxTTJZek56a3dNbVkwWlRZNE1TSjlMSHNpYVdRaU9pSWpjbVZqYjNabGNua2lMQ0oxYzJGblpTSTZJbkpsWTI5MlpYSjVJaXdpZEhsd1pTSTZJbE5sWTNBeU5UWnJNVlpsY21sbWFXTmhkR2x2Ymt0bGVUSXdNVGdpTENKd2RXSnNhV05MWlhsSVpYZ2lPaUl3TWpjMk9HVXpNVFUwWlRWallXWTJabVppWm1FM1pHVm1PVE15TXpNMU1EWTJOalU0T0dWaU9HUTROemhqTVdFMk1qRXhaR1kxWXpneVpHUmpNalJpT1dVaWZWMHNJbUYxZEdobGJuUnBZMkYwYVc5dUlqcGJJaU53Y21sdFlYSjVJbDBzSW1GemMyVnlkR2x2YmsxbGRHaHZaQ0k2V3lJamNISnBiV0Z5ZVNKZGZRIiwic2lnbmF0dXJlIjoiRnNnRUdlWVhOLTdKN2pPUUpyNjRoaHV5ZmNUWmxuVHRKeXl6SEhXelhRRmVDRTQ4dnYxM0c5TkZXOFo2MElyTHJmTkFtWEpaU0c1cXpMZlRLMDNhSVEifQ",
  "kid": "did:elem:EiBsQ5S0kNYU-CkVLHFVQQxSp58gpcQP9zg1nFGTr-avjQ#primary"
}

Lest prepare credential#

const jsonSchema = 'https://schema.affinidi.com/ContentLikeV1-0.json'
const jsonContext = 'https://schema.affinidi.com/ContentLikeV1-0.jsonld'
const id = `claimId:${(Math.random() + 1).toString(36).substring(2)}`
const unsignedVC = {
    '@context': ['https://www.w3.org/2018/credentials/v1', jsonContext],
    id,
    type: ['VerifiableCredential', 'ContentLike'],
    holder: {
      id: holderWallet.did
    },
    credentialSubject: {
      data: {
        url: 'https://www.youtube.com/watch?v=owbkzvLhblk',
        date: new Date().toISOString(),
        like: true,
        score: 10
      },
    },
    credentialSchema: {
      id:  jsonSchema,
      type: 'JsonSchemaValidator2018',
    },
    issuanceDate: new Date().toISOString(),
    expirationDate: '2065-09-10T00:00:00.000Z',
  }   
const signedCredential = await holderWallet.signUnsignedCredential(unsignedVC)

Create Verifiable Presentation#

const vp = await holderWallet.createPresentationFromChallenge(
      presentationChallenge,
      [signedCredential],
      'youtube.com',
    )
JSON.stringify(vp,null,2)
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "id": "presentationId:f461e8a2b035d689",
  "type": [
    "VerifiablePresentation"
  ],
  "holder": {
    "id": "did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw;elem:initial-state=eyJwcm90ZWN0ZWQiOiJleUp2Y0dWeVlYUnBiMjRpT2lKamNtVmhkR1VpTENKcmFXUWlPaUlqY0hKcGJXRnllU0lzSW1Gc1p5STZJa1ZUTWpVMlN5SjkiLCJwYXlsb2FkIjoiZXlKQVkyOXVkR1Y0ZENJNkltaDBkSEJ6T2k4dmR6TnBaQzV2Y21jdmMyVmpkWEpwZEhrdmRqSWlMQ0p3ZFdKc2FXTkxaWGtpT2x0N0ltbGtJam9pSTNCeWFXMWhjbmtpTENKMWMyRm5aU0k2SW5OcFoyNXBibWNpTENKMGVYQmxJam9pVTJWamNESTFObXN4Vm1WeWFXWnBZMkYwYVc5dVMyVjVNakF4T0NJc0luQjFZbXhwWTB0bGVVaGxlQ0k2SWpBelpXRTJZamsyT1dabU1qZG1ZelppWlRKaE56TTFNREExTW1FMFpqWTNaamt4WWpjelltRmpNemMxT0RCak9UQTJabVUxTnpWbFpEVXpPVEpsTURWaVlTSjlMSHNpYVdRaU9pSWpjbVZqYjNabGNua2lMQ0oxYzJGblpTSTZJbkpsWTI5MlpYSjVJaXdpZEhsd1pTSTZJbE5sWTNBeU5UWnJNVlpsY21sbWFXTmhkR2x2Ymt0bGVUSXdNVGdpTENKd2RXSnNhV05MWlhsSVpYZ2lPaUl3TWpSaU9Ea3pNRFJoWmpObE9XTTNaRGxtT0RRNU5qTTJZalUyWldGa056azRNalkyWldNMFlqWTNOR0pqTlRZNE1qVXpZalF6WVdRNE9UVTVNRGt6TURZaWZWMHNJbUYxZEdobGJuUnBZMkYwYVc5dUlqcGJJaU53Y21sdFlYSjVJbDBzSW1GemMyVnlkR2x2YmsxbGRHaHZaQ0k2V3lJamNISnBiV0Z5ZVNKZGZRIiwic2lnbmF0dXJlIjoiNl9OUjRVUl83clFHV2gwUzViVy05eXAyY1JSTEpVbTd2TXVaVmxPOHZLdHBMR1FMNTRqZHNkOTNzZ1ladGRTRGJWY2ZCQkROYlRncmNwUGNKRHFIOUEifQ"
  },
  "verifiableCredential": [
    {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://schema.affinidi.com/ContentLikeV1-0.jsonld"
      ],
      "id": "claimId:3ei8jmbf5u",
      "type": [
        "VerifiableCredential",
        "ContentLike"
      ],
      "holder": {
        "id": "did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw;elem:initial-state=eyJwcm90ZWN0ZWQiOiJleUp2Y0dWeVlYUnBiMjRpT2lKamNtVmhkR1VpTENKcmFXUWlPaUlqY0hKcGJXRnllU0lzSW1Gc1p5STZJa1ZUTWpVMlN5SjkiLCJwYXlsb2FkIjoiZXlKQVkyOXVkR1Y0ZENJNkltaDBkSEJ6T2k4dmR6TnBaQzV2Y21jdmMyVmpkWEpwZEhrdmRqSWlMQ0p3ZFdKc2FXTkxaWGtpT2x0N0ltbGtJam9pSTNCeWFXMWhjbmtpTENKMWMyRm5aU0k2SW5OcFoyNXBibWNpTENKMGVYQmxJam9pVTJWamNESTFObXN4Vm1WeWFXWnBZMkYwYVc5dVMyVjVNakF4T0NJc0luQjFZbXhwWTB0bGVVaGxlQ0k2SWpBelpXRTJZamsyT1dabU1qZG1ZelppWlRKaE56TTFNREExTW1FMFpqWTNaamt4WWpjelltRmpNemMxT0RCak9UQTJabVUxTnpWbFpEVXpPVEpsTURWaVlTSjlMSHNpYVdRaU9pSWpjbVZqYjNabGNua2lMQ0oxYzJGblpTSTZJbkpsWTI5MlpYSjVJaXdpZEhsd1pTSTZJbE5sWTNBeU5UWnJNVlpsY21sbWFXTmhkR2x2Ymt0bGVUSXdNVGdpTENKd2RXSnNhV05MWlhsSVpYZ2lPaUl3TWpSaU9Ea3pNRFJoWmpObE9XTTNaRGxtT0RRNU5qTTJZalUyWldGa056azRNalkyWldNMFlqWTNOR0pqTlRZNE1qVXpZalF6WVdRNE9UVTVNRGt6TURZaWZWMHNJbUYxZEdobGJuUnBZMkYwYVc5dUlqcGJJaU53Y21sdFlYSjVJbDBzSW1GemMyVnlkR2x2YmsxbGRHaHZaQ0k2V3lJamNISnBiV0Z5ZVNKZGZRIiwic2lnbmF0dXJlIjoiNl9OUjRVUl83clFHV2gwUzViVy05eXAyY1JSTEpVbTd2TXVaVmxPOHZLdHBMR1FMNTRqZHNkOTNzZ1ladGRTRGJWY2ZCQkROYlRncmNwUGNKRHFIOUEifQ"
      },
      "credentialSubject": {
        "data": {
          "url": "https://www.youtube.com/watch?v=owbkzvLhblk",
          "date": "2022-09-17T06:54:31.010Z",
          "like": true,
          "score": 10
        }
      },
      "credentialSchema": {
        "id": "https://schema.affinidi.com/ContentLikeV1-0.json",
        "type": "JsonSchemaValidator2018"
      },
      "issuanceDate": "2022-09-17T06:54:31.010Z",
      "expirationDate": "2065-09-10T00:00:00.000Z",
      "issuer": "did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw;elem:initial-state=eyJwcm90ZWN0ZWQiOiJleUp2Y0dWeVlYUnBiMjRpT2lKamNtVmhkR1VpTENKcmFXUWlPaUlqY0hKcGJXRnllU0lzSW1Gc1p5STZJa1ZUTWpVMlN5SjkiLCJwYXlsb2FkIjoiZXlKQVkyOXVkR1Y0ZENJNkltaDBkSEJ6T2k4dmR6TnBaQzV2Y21jdmMyVmpkWEpwZEhrdmRqSWlMQ0p3ZFdKc2FXTkxaWGtpT2x0N0ltbGtJam9pSTNCeWFXMWhjbmtpTENKMWMyRm5aU0k2SW5OcFoyNXBibWNpTENKMGVYQmxJam9pVTJWamNESTFObXN4Vm1WeWFXWnBZMkYwYVc5dVMyVjVNakF4T0NJc0luQjFZbXhwWTB0bGVVaGxlQ0k2SWpBelpXRTJZamsyT1dabU1qZG1ZelppWlRKaE56TTFNREExTW1FMFpqWTNaamt4WWpjelltRmpNemMxT0RCak9UQTJabVUxTnpWbFpEVXpPVEpsTURWaVlTSjlMSHNpYVdRaU9pSWpjbVZqYjNabGNua2lMQ0oxYzJGblpTSTZJbkpsWTI5MlpYSjVJaXdpZEhsd1pTSTZJbE5sWTNBeU5UWnJNVlpsY21sbWFXTmhkR2x2Ymt0bGVUSXdNVGdpTENKd2RXSnNhV05MWlhsSVpYZ2lPaUl3TWpSaU9Ea3pNRFJoWmpObE9XTTNaRGxtT0RRNU5qTTJZalUyWldGa056azRNalkyWldNMFlqWTNOR0pqTlRZNE1qVXpZalF6WVdRNE9UVTVNRGt6TURZaWZWMHNJbUYxZEdobGJuUnBZMkYwYVc5dUlqcGJJaU53Y21sdFlYSjVJbDBzSW1GemMyVnlkR2x2YmsxbGRHaHZaQ0k2V3lJamNISnBiV0Z5ZVNKZGZRIiwic2lnbmF0dXJlIjoiNl9OUjRVUl83clFHV2gwUzViVy05eXAyY1JSTEpVbTd2TXVaVmxPOHZLdHBMR1FMNTRqZHNkOTNzZ1ladGRTRGJWY2ZCQkROYlRncmNwUGNKRHFIOUEifQ",
      "proof": {
        "type": "EcdsaSecp256k1Signature2019",
        "created": "2022-09-17T06:54:31Z",
        "verificationMethod": "did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw#primary",
        "proofPurpose": "assertionMethod",
        "jws": "eyJhbGciOiJFUzI1NksiLCJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdfQ..qUwDsQXYF008YwMn1MFG9JQbD8VF7hZYauJf-3bqYMMifqN6J6x7DIXQY6cOHSw3zwLLRRgmVtktJiG1Gd3eXg"
      }
    }
  ],
  "proof": {
    "type": "EcdsaSecp256k1Signature2019",
    "created": "2022-09-17T06:54:36Z",
    "verificationMethod": "did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw#primary",
    "proofPurpose": "authentication",
    "challenge": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJpbnRlcmFjdGlvblRva2VuIjp7ImNyZWRlbnRpYWxSZXF1aXJlbWVudHMiOlt7InR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJDb250ZW50TGlrZSJdLCJjb25zdHJhaW50cyI6W119XSwiY2FsbGJhY2tVUkwiOiIifSwiZXhwIjoxNjYzMzk4MjY4MzU2LCJ0eXAiOiJjcmVkZW50aWFsUmVxdWVzdCIsImp0aSI6IjAzOGU3YTFkODFhZTNkMDUiLCJpc3MiOiJkaWQ6ZWxlbTpFaUJzUTVTMGtOWVUtQ2tWTEhGVlFReFNwNThncGNRUDl6ZzFuRkdUci1hdmpRO2VsZW06aW5pdGlhbC1zdGF0ZT1leUp3Y205MFpXTjBaV1FpT2lKbGVVcDJZMGRXZVZsWVVuQmlNalJwVDJsS2FtTnRWbWhrUjFWcFRFTktjbUZYVVdsUGFVbHFZMGhLY0dKWFJubGxVMGx6U1cxR2MxcDVTVFpKYTFaVVRXcFZNbE41U2praUxDSndZWGxzYjJGa0lqb2laWGxLUVZreU9YVmtSMVkwWkVOSk5rbHRhREJrU0VKNlQyazRkbVI2VG5CYVF6VjJZMjFqZG1NeVZtcGtXRXB3WkVocmRtUnFTV2xNUTBwM1pGZEtjMkZYVGt4YVdHdHBUMngwTjBsdGJHdEphbTlwU1ROQ2VXRlhNV2hqYm10cFRFTktNV015Um01YVUwazJTVzVPY0ZveU5YQmliV05wVEVOS01HVllRbXhKYW05cFZUSldhbU5FU1RGT2JYTjRWbTFXZVdGWFduQlpNa1l3WVZjNWRWTXlWalZOYWtGNFQwTkpjMGx1UWpGWmJYaHdXVEIwYkdWVmFHeGxRMGsyU1dwQmVWcHRWbXhaYlUxNldrZEpORTFVWXpKUFJHYzBUWHBSZWs5RVdteE9WRkpxVGtSS2FscHFUbXRPTWxsM1RqSkZNVTFVV1RWT1ZFSnFXbTFOTkZwVVl6SlBSR2N4VFRKWmVrNTZhM2ROYlZrd1dsUlpORTFUU2psTVNITnBZVmRSYVU5cFNXcGpiVlpxWWpOYWJHTnVhMmxNUTBveFl6SkdibHBUU1RaSmJrcHNXVEk1TWxwWVNqVkphWGRwWkVoc2QxcFRTVFpKYkU1c1dUTkJlVTVVV25KTlZscHNZMjFzYldGWFRtaGtSMngyWW10MGJHVlVTWGROVkdkcFRFTktkMlJYU25OaFYwNU1XbGhzU1ZwWVoybFBhVWwzVFdwak1rOUhWWHBOVkZVd1dsUldhbGxYV1RKYWJWcHBXbTFGTTFwSFZtMVBWRTE1VFhwTk1VMUVXVEpPYWxVMFQwZFdhVTlIVVRST2VtaHFUVmRGTWsxcVJYaGFSMWt4V1hwbmVWcEhVbXBOYWxKcFQxZFZhV1pXTUhOSmJVWXhaRWRvYkdKdVVuQlpNa1l3WVZjNWRVbHFjR0pKYVU1M1kyMXNkRmxZU2pWSmJEQnpTVzFHZW1NeVZubGtSMngyWW1zeGJHUkhhSFphUTBrMlYzbEphbU5JU25CaVYwWjVaVk5LWkdaUklpd2ljMmxuYm1GMGRYSmxJam9pUm5OblJVZGxXVmhPTFRkS04ycFBVVXB5TmpSb2FIVjVabU5VV214dVZIUktlWGw2U0VoWGVsaFJSbVZEUlRRNGRuWXhNMGM1VGtaWE9GbzJNRWx5VEhKbVRrRnRXRXBhVTBjMWNYcE1abFJMTUROaFNWRWlmUSIsImtpZCI6ImRpZDplbGVtOkVpQnNRNVMwa05ZVS1Da1ZMSEZWUVF4U3A1OGdwY1FQOXpnMW5GR1RyLWF2alEjcHJpbWFyeSJ9.91747dcc293f1040f74337a3d0f584c9ef3df1d79c79b71d2e5c5bdfbeaf25a22a1f73cf96b4e26931496d837cb5d1044c81a0f745608225abf32ea5f8805c1c",
    "domain": "youtube.com",
    "jws": "eyJhbGciOiJFUzI1NksiLCJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdfQ..-651IUOrbZTWW7z86eC7ED7ivLfdzyYw4sNnLDvq_Ilu4wMJQDVMo1hWp--GRO8Lxk0H3Ntg1_5veAjOqmye7Q"
  }
}

Verification#

   const result = await verifierWallet.verifyPresentation(vp)
  result
{
  isValid: true,
  did: 'did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw;elem:initial-state=eyJwcm90ZWN0ZWQiOiJleUp2Y0dWeVlYUnBiMjRpT2lKamNtVmhkR1VpTENKcmFXUWlPaUlqY0hKcGJXRnllU0lzSW1Gc1p5STZJa1ZUTWpVMlN5SjkiLCJwYXlsb2FkIjoiZXlKQVkyOXVkR1Y0ZENJNkltaDBkSEJ6T2k4dmR6TnBaQzV2Y21jdmMyVmpkWEpwZEhrdmRqSWlMQ0p3ZFdKc2FXTkxaWGtpT2x0N0ltbGtJam9pSTNCeWFXMWhjbmtpTENKMWMyRm5aU0k2SW5OcFoyNXBibWNpTENKMGVYQmxJam9pVTJWamNESTFObXN4Vm1WeWFXWnBZMkYwYVc5dVMyVjVNakF4T0NJc0luQjFZbXhwWTB0bGVVaGxlQ0k2SWpBelpXRTJZamsyT1dabU1qZG1ZelppWlRKaE56TTFNREExTW1FMFpqWTNaamt4WWpjelltRmpNemMxT0RCak9UQTJabVUxTnpWbFpEVXpPVEpsTURWaVlTSjlMSHNpYVdRaU9pSWpjbVZqYjNabGNua2lMQ0oxYzJGblpTSTZJbkpsWTI5MlpYSjVJaXdpZEhsd1pTSTZJbE5sWTNBeU5UWnJNVlpsY21sbWFXTmhkR2x2Ymt0bGVUSXdNVGdpTENKd2RXSnNhV05MWlhsSVpYZ2lPaUl3TWpSaU9Ea3pNRFJoWmpObE9XTTNaRGxtT0RRNU5qTTJZalUyWldGa056azRNalkyWldNMFlqWTNOR0pqTlRZNE1qVXpZalF6WVdRNE9UVTVNRGt6TURZaWZWMHNJbUYxZEdobGJuUnBZMkYwYVc5dUlqcGJJaU53Y21sdFlYSjVJbDBzSW1GemMyVnlkR2x2YmsxbGRHaHZaQ0k2V3lJamNISnBiV0Z5ZVNKZGZRIiwic2lnbmF0dXJlIjoiNl9OUjRVUl83clFHV2gwUzViVy05eXAyY1JSTEpVbTd2TXVaVmxPOHZLdHBMR1FMNTRqZHNkOTNzZ1ladGRTRGJWY2ZCQkROYlRncmNwUGNKRHFIOUEifQ',
  challenge: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJpbnRlcmFjdGlvblRva2VuIjp7ImNyZWRlbnRpYWxSZXF1aXJlbWVudHMiOlt7InR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJDb250ZW50TGlrZSJdLCJjb25zdHJhaW50cyI6W119XSwiY2FsbGJhY2tVUkwiOiIifSwiZXhwIjoxNjYzMzk4MjY4MzU2LCJ0eXAiOiJjcmVkZW50aWFsUmVxdWVzdCIsImp0aSI6IjAzOGU3YTFkODFhZTNkMDUiLCJpc3MiOiJkaWQ6ZWxlbTpFaUJzUTVTMGtOWVUtQ2tWTEhGVlFReFNwNThncGNRUDl6ZzFuRkdUci1hdmpRO2VsZW06aW5pdGlhbC1zdGF0ZT1leUp3Y205MFpXTjBaV1FpT2lKbGVVcDJZMGRXZVZsWVVuQmlNalJwVDJsS2FtTnRWbWhrUjFWcFRFTktjbUZYVVdsUGFVbHFZMGhLY0dKWFJubGxVMGx6U1cxR2MxcDVTVFpKYTFaVVRXcFZNbE41U2praUxDSndZWGxzYjJGa0lqb2laWGxLUVZreU9YVmtSMVkwWkVOSk5rbHRhREJrU0VKNlQyazRkbVI2VG5CYVF6VjJZMjFqZG1NeVZtcGtXRXB3WkVocmRtUnFTV2xNUTBwM1pGZEtjMkZYVGt4YVdHdHBUMngwTjBsdGJHdEphbTlwU1ROQ2VXRlhNV2hqYm10cFRFTktNV015Um01YVUwazJTVzVPY0ZveU5YQmliV05wVEVOS01HVllRbXhKYW05cFZUSldhbU5FU1RGT2JYTjRWbTFXZVdGWFduQlpNa1l3WVZjNWRWTXlWalZOYWtGNFQwTkpjMGx1UWpGWmJYaHdXVEIwYkdWVmFHeGxRMGsyU1dwQmVWcHRWbXhaYlUxNldrZEpORTFVWXpKUFJHYzBUWHBSZWs5RVdteE9WRkpxVGtSS2FscHFUbXRPTWxsM1RqSkZNVTFVV1RWT1ZFSnFXbTFOTkZwVVl6SlBSR2N4VFRKWmVrNTZhM2ROYlZrd1dsUlpORTFUU2psTVNITnBZVmRSYVU5cFNXcGpiVlpxWWpOYWJHTnVhMmxNUTBveFl6SkdibHBUU1RaSmJrcHNXVEk1TWxwWVNqVkphWGRwWkVoc2QxcFRTVFpKYkU1c1dUTkJlVTVVV25KTlZscHNZMjFzYldGWFRtaGtSMngyWW10MGJHVlVTWGROVkdkcFRFTktkMlJYU25OaFYwNU1XbGhzU1ZwWVoybFBhVWwzVFdwak1rOUhWWHBOVkZVd1dsUldhbGxYV1RKYWJWcHBXbTFGTTFwSFZtMVBWRTE1VFhwTk1VMUVXVEpPYWxVMFQwZFdhVTlIVVRST2VtaHFUVmRGTWsxcVJYaGFSMWt4V1hwbmVWcEhVbXBOYWxKcFQxZFZhV1pXTUhOSmJVWXhaRWRvYkdKdVVuQlpNa1l3WVZjNWRVbHFjR0pKYVU1M1kyMXNkRmxZU2pWSmJEQnpTVzFHZW1NeVZubGtSMngyWW1zeGJHUkhhSFphUTBrMlYzbEphbU5JU25CaVYwWjVaVk5LWkdaUklpd2ljMmxuYm1GMGRYSmxJam9pUm5OblJVZGxXVmhPTFRkS04ycFBVVXB5TmpSb2FIVjVabU5VV214dVZIUktlWGw2U0VoWGVsaFJSbVZEUlRRNGRuWXhNMGM1VGtaWE9GbzJNRWx5VEhKbVRrRnRXRXBhVTBjMWNYcE1abFJMTUROaFNWRWlmUSIsImtpZCI6ImRpZDplbGVtOkVpQnNRNVMwa05ZVS1Da1ZMSEZWUVF4U3A1OGdwY1FQOXpnMW5GR1RyLWF2alEjcHJpbWFyeSJ9.91747dcc293f1040f74337a3d0f584c9ef3df1d79c79b71d2e5c5bdfbeaf25a22a1f73cf96b4e26931496d837cb5d1044c81a0f745608225abf32ea5f8805c1c',
  suppliedPresentation: {
    '@context': [ 'https://www.w3.org/2018/credentials/v1' ],
    id: 'presentationId:f461e8a2b035d689',
    type: [ 'VerifiablePresentation' ],
    holder: {
      id: 'did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw;elem:initial-state=eyJwcm90ZWN0ZWQiOiJleUp2Y0dWeVlYUnBiMjRpT2lKamNtVmhkR1VpTENKcmFXUWlPaUlqY0hKcGJXRnllU0lzSW1Gc1p5STZJa1ZUTWpVMlN5SjkiLCJwYXlsb2FkIjoiZXlKQVkyOXVkR1Y0ZENJNkltaDBkSEJ6T2k4dmR6TnBaQzV2Y21jdmMyVmpkWEpwZEhrdmRqSWlMQ0p3ZFdKc2FXTkxaWGtpT2x0N0ltbGtJam9pSTNCeWFXMWhjbmtpTENKMWMyRm5aU0k2SW5OcFoyNXBibWNpTENKMGVYQmxJam9pVTJWamNESTFObXN4Vm1WeWFXWnBZMkYwYVc5dVMyVjVNakF4T0NJc0luQjFZbXhwWTB0bGVVaGxlQ0k2SWpBelpXRTJZamsyT1dabU1qZG1ZelppWlRKaE56TTFNREExTW1FMFpqWTNaamt4WWpjelltRmpNemMxT0RCak9UQTJabVUxTnpWbFpEVXpPVEpsTURWaVlTSjlMSHNpYVdRaU9pSWpjbVZqYjNabGNua2lMQ0oxYzJGblpTSTZJbkpsWTI5MlpYSjVJaXdpZEhsd1pTSTZJbE5sWTNBeU5UWnJNVlpsY21sbWFXTmhkR2x2Ymt0bGVUSXdNVGdpTENKd2RXSnNhV05MWlhsSVpYZ2lPaUl3TWpSaU9Ea3pNRFJoWmpObE9XTTNaRGxtT0RRNU5qTTJZalUyWldGa056azRNalkyWldNMFlqWTNOR0pqTlRZNE1qVXpZalF6WVdRNE9UVTVNRGt6TURZaWZWMHNJbUYxZEdobGJuUnBZMkYwYVc5dUlqcGJJaU53Y21sdFlYSjVJbDBzSW1GemMyVnlkR2x2YmsxbGRHaHZaQ0k2V3lJamNISnBiV0Z5ZVNKZGZRIiwic2lnbmF0dXJlIjoiNl9OUjRVUl83clFHV2gwUzViVy05eXAyY1JSTEpVbTd2TXVaVmxPOHZLdHBMR1FMNTRqZHNkOTNzZ1ladGRTRGJWY2ZCQkROYlRncmNwUGNKRHFIOUEifQ'
    },
    verifiableCredential: [ [Object] ],
    proof: {
      type: 'EcdsaSecp256k1Signature2019',
      created: '2022-09-17T06:54:36Z',
      verificationMethod: 'did:elem:EiC5XYylCfH47s7dcJt2SpdBg1yS2lyuJpR6J8WAY0swRw#primary',
      proofPurpose: 'authentication',
      challenge: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJpbnRlcmFjdGlvblRva2VuIjp7ImNyZWRlbnRpYWxSZXF1aXJlbWVudHMiOlt7InR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJDb250ZW50TGlrZSJdLCJjb25zdHJhaW50cyI6W119XSwiY2FsbGJhY2tVUkwiOiIifSwiZXhwIjoxNjYzMzk4MjY4MzU2LCJ0eXAiOiJjcmVkZW50aWFsUmVxdWVzdCIsImp0aSI6IjAzOGU3YTFkODFhZTNkMDUiLCJpc3MiOiJkaWQ6ZWxlbTpFaUJzUTVTMGtOWVUtQ2tWTEhGVlFReFNwNThncGNRUDl6ZzFuRkdUci1hdmpRO2VsZW06aW5pdGlhbC1zdGF0ZT1leUp3Y205MFpXTjBaV1FpT2lKbGVVcDJZMGRXZVZsWVVuQmlNalJwVDJsS2FtTnRWbWhrUjFWcFRFTktjbUZYVVdsUGFVbHFZMGhLY0dKWFJubGxVMGx6U1cxR2MxcDVTVFpKYTFaVVRXcFZNbE41U2praUxDSndZWGxzYjJGa0lqb2laWGxLUVZreU9YVmtSMVkwWkVOSk5rbHRhREJrU0VKNlQyazRkbVI2VG5CYVF6VjJZMjFqZG1NeVZtcGtXRXB3WkVocmRtUnFTV2xNUTBwM1pGZEtjMkZYVGt4YVdHdHBUMngwTjBsdGJHdEphbTlwU1ROQ2VXRlhNV2hqYm10cFRFTktNV015Um01YVUwazJTVzVPY0ZveU5YQmliV05wVEVOS01HVllRbXhKYW05cFZUSldhbU5FU1RGT2JYTjRWbTFXZVdGWFduQlpNa1l3WVZjNWRWTXlWalZOYWtGNFQwTkpjMGx1UWpGWmJYaHdXVEIwYkdWVmFHeGxRMGsyU1dwQmVWcHRWbXhaYlUxNldrZEpORTFVWXpKUFJHYzBUWHBSZWs5RVdteE9WRkpxVGtSS2FscHFUbXRPTWxsM1RqSkZNVTFVV1RWT1ZFSnFXbTFOTkZwVVl6SlBSR2N4VFRKWmVrNTZhM2ROYlZrd1dsUlpORTFUU2psTVNITnBZVmRSYVU5cFNXcGpiVlpxWWpOYWJHTnVhMmxNUTBveFl6SkdibHBUU1RaSmJrcHNXVEk1TWxwWVNqVkphWGRwWkVoc2QxcFRTVFpKYkU1c1dUTkJlVTVVV25KTlZscHNZMjFzYldGWFRtaGtSMngyWW10MGJHVlVTWGROVkdkcFRFTktkMlJYU25OaFYwNU1XbGhzU1ZwWVoybFBhVWwzVFdwak1rOUhWWHBOVkZVd1dsUldhbGxYV1RKYWJWcHBXbTFGTTFwSFZtMVBWRTE1VFhwTk1VMUVXVEpPYWxVMFQwZFdhVTlIVVRST2VtaHFUVmRGTWsxcVJYaGFSMWt4V1hwbmVWcEhVbXBOYWxKcFQxZFZhV1pXTUhOSmJVWXhaRWRvYkdKdVVuQlpNa1l3WVZjNWRVbHFjR0pKYVU1M1kyMXNkRmxZU2pWSmJEQnpTVzFHZW1NeVZubGtSMngyWW1zeGJHUkhhSFphUTBrMlYzbEphbU5JU25CaVYwWjVaVk5LWkdaUklpd2ljMmxuYm1GMGRYSmxJam9pUm5OblJVZGxXVmhPTFRkS04ycFBVVXB5TmpSb2FIVjVabU5VV214dVZIUktlWGw2U0VoWGVsaFJSbVZEUlRRNGRuWXhNMGM1VGtaWE9GbzJNRWx5VEhKbVRrRnRXRXBhVTBjMWNYcE1abFJMTUROaFNWRWlmUSIsImtpZCI6ImRpZDplbGVtOkVpQnNRNVMwa05ZVS1Da1ZMSEZWUVF4U3A1OGdwY1FQOXpnMW5GR1RyLWF2alEjcHJpbWFyeSJ9.91747dcc293f1040f74337a3d0f584c9ef3df1d79c79b71d2e5c5bdfbeaf25a22a1f73cf96b4e26931496d837cb5d1044c81a0f745608225abf32ea5f8805c1c',
      domain: 'youtube.com',
      jws: 'eyJhbGciOiJFUzI1NksiLCJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdfQ..-651IUOrbZTWW7z86eC7ED7ivLfdzyYw4sNnLDvq_Ilu4wMJQDVMo1hWp--GRO8Lxk0H3Ntg1_5veAjOqmye7Q'
    }
  }
}