1- import type {
2- AnonCredsProofFormat ,
3- AnonCredsCredentialsForProofRequest ,
4- AnonCredsGetCredentialsForProofRequestOptions ,
5- } from './AnonCredsProofFormat'
1+ import type { AnonCredsProofFormat , AnonCredsGetCredentialsForProofRequestOptions } from './AnonCredsProofFormat'
62import type {
73 AnonCredsCredentialDefinition ,
8- AnonCredsCredentialInfo ,
94 AnonCredsProof ,
10- AnonCredsRequestedAttribute ,
11- AnonCredsRequestedAttributeMatch ,
12- AnonCredsRequestedPredicate ,
13- AnonCredsRequestedPredicateMatch ,
145 AnonCredsSchema ,
156 AnonCredsSelectedCredentials ,
167 AnonCredsProofRequest ,
178} from '../models'
18- import type { AnonCredsHolderService , AnonCredsVerifierService , GetCredentialsForProofRequestReturn } from '../services'
9+ import type { AnonCredsHolderService , AnonCredsVerifierService } from '../services'
1910import type {
2011 ProofFormatService ,
2112 AgentContext ,
@@ -40,20 +31,17 @@ import { CredoError, Attachment, AttachmentData, JsonEncoder, ProofFormatSpec, J
4031import { AnonCredsProofRequest as AnonCredsProofRequestClass } from '../models/AnonCredsProofRequest'
4132import { AnonCredsVerifierServiceSymbol , AnonCredsHolderServiceSymbol } from '../services'
4233import {
43- sortRequestedCredentialsMatches ,
4434 createRequestFromPreview ,
4535 areAnonCredsProofRequestsEqual ,
46- assertBestPracticeRevocationInterval ,
4736 checkValidCredentialValueEncoding ,
4837 assertNoDuplicateGroupsNamesInProofRequest ,
4938 getRevocationRegistriesForRequest ,
5039 getRevocationRegistriesForProof ,
5140 fetchSchema ,
5241 fetchCredentialDefinition ,
53- fetchRevocationStatusList ,
5442} from '../utils'
5543import { encodeCredentialValue } from '../utils/credential'
56- import { dateToTimestamp } from '../utils/timestamp '
44+ import { getCredentialsForAnonCredsProofRequest } from '../utils/getCredentialsForAnonCredsRequest '
5745
5846const ANONCREDS_PRESENTATION_PROPOSAL = 'anoncreds/proof-request@v1.0'
5947const ANONCREDS_PRESENTATION_REQUEST = 'anoncreds/proof-request@v1.0'
@@ -254,7 +242,7 @@ export class AnonCredsProofFormatService implements ProofFormatService<AnonCreds
254242 // Set default values
255243 const { filterByNonRevocationRequirements = true } = proofFormats ?. anoncreds ?? { }
256244
257- const credentialsForRequest = await this . _getCredentialsForRequest ( agentContext , proofRequestJson , {
245+ const credentialsForRequest = await getCredentialsForAnonCredsProofRequest ( agentContext , proofRequestJson , {
258246 filterByNonRevocationRequirements,
259247 } )
260248
@@ -319,90 +307,12 @@ export class AnonCredsProofFormatService implements ProofFormatService<AnonCreds
319307 return supportedFormats . includes ( formatIdentifier )
320308 }
321309
322- private async _getCredentialsForRequest (
323- agentContext : AgentContext ,
324- proofRequest : AnonCredsProofRequest ,
325- options : AnonCredsGetCredentialsForProofRequestOptions
326- ) : Promise < AnonCredsCredentialsForProofRequest > {
327- const credentialsForProofRequest : AnonCredsCredentialsForProofRequest = {
328- attributes : { } ,
329- predicates : { } ,
330- }
331-
332- for ( const [ referent , requestedAttribute ] of Object . entries ( proofRequest . requested_attributes ) ) {
333- const credentials = await this . getCredentialsForProofRequestReferent ( agentContext , proofRequest , referent )
334-
335- credentialsForProofRequest . attributes [ referent ] = sortRequestedCredentialsMatches (
336- await Promise . all (
337- credentials . map ( async ( credential ) => {
338- const { isRevoked, timestamp } = await this . getRevocationStatus (
339- agentContext ,
340- proofRequest ,
341- requestedAttribute ,
342- credential . credentialInfo
343- )
344-
345- return {
346- credentialId : credential . credentialInfo . credentialId ,
347- revealed : true ,
348- credentialInfo : credential . credentialInfo ,
349- timestamp,
350- revoked : isRevoked ,
351- } satisfies AnonCredsRequestedAttributeMatch
352- } )
353- )
354- )
355-
356- // We only attach revoked state if non-revocation is requested. So if revoked is true it means
357- // the credential is not applicable to the proof request
358- if ( options . filterByNonRevocationRequirements ) {
359- credentialsForProofRequest . attributes [ referent ] = credentialsForProofRequest . attributes [ referent ] . filter (
360- ( r ) => ! r . revoked
361- )
362- }
363- }
364-
365- for ( const [ referent , requestedPredicate ] of Object . entries ( proofRequest . requested_predicates ) ) {
366- const credentials = await this . getCredentialsForProofRequestReferent ( agentContext , proofRequest , referent )
367-
368- credentialsForProofRequest . predicates [ referent ] = sortRequestedCredentialsMatches (
369- await Promise . all (
370- credentials . map ( async ( credential ) => {
371- const { isRevoked, timestamp } = await this . getRevocationStatus (
372- agentContext ,
373- proofRequest ,
374- requestedPredicate ,
375- credential . credentialInfo
376- )
377-
378- return {
379- credentialId : credential . credentialInfo . credentialId ,
380- credentialInfo : credential . credentialInfo ,
381- timestamp,
382- revoked : isRevoked ,
383- } satisfies AnonCredsRequestedPredicateMatch
384- } )
385- )
386- )
387-
388- // We only attach revoked state if non-revocation is requested. So if revoked is true it means
389- // the credential is not applicable to the proof request
390- if ( options . filterByNonRevocationRequirements ) {
391- credentialsForProofRequest . predicates [ referent ] = credentialsForProofRequest . predicates [ referent ] . filter (
392- ( r ) => ! r . revoked
393- )
394- }
395- }
396-
397- return credentialsForProofRequest
398- }
399-
400310 private async _selectCredentialsForRequest (
401311 agentContext : AgentContext ,
402312 proofRequest : AnonCredsProofRequest ,
403313 options : AnonCredsGetCredentialsForProofRequestOptions
404314 ) : Promise < AnonCredsSelectedCredentials > {
405- const credentialsForRequest = await this . _getCredentialsForRequest ( agentContext , proofRequest , options )
315+ const credentialsForRequest = await getCredentialsForAnonCredsProofRequest ( agentContext , proofRequest , options )
406316
407317 const selectedCredentials : AnonCredsSelectedCredentials = {
408318 attributes : { } ,
@@ -431,21 +341,6 @@ export class AnonCredsProofFormatService implements ProofFormatService<AnonCreds
431341 return selectedCredentials
432342 }
433343
434- private async getCredentialsForProofRequestReferent (
435- agentContext : AgentContext ,
436- proofRequest : AnonCredsProofRequest ,
437- attributeReferent : string
438- ) : Promise < GetCredentialsForProofRequestReturn > {
439- const holderService = agentContext . dependencyManager . resolve < AnonCredsHolderService > ( AnonCredsHolderServiceSymbol )
440-
441- const credentials = await holderService . getCredentialsForProofRequest ( agentContext , {
442- proofRequest,
443- attributeReferent,
444- } )
445-
446- return credentials
447- }
448-
449344 /**
450345 * Build schemas object needed to create and verify proof objects.
451346 *
@@ -486,49 +381,6 @@ export class AnonCredsProofFormatService implements ProofFormatService<AnonCreds
486381 return credentialDefinitions
487382 }
488383
489- private async getRevocationStatus (
490- agentContext : AgentContext ,
491- proofRequest : AnonCredsProofRequest ,
492- requestedItem : AnonCredsRequestedAttribute | AnonCredsRequestedPredicate ,
493- credentialInfo : AnonCredsCredentialInfo
494- ) {
495- const requestNonRevoked = requestedItem . non_revoked ?? proofRequest . non_revoked
496- const credentialRevocationId = credentialInfo . credentialRevocationId
497- const revocationRegistryId = credentialInfo . revocationRegistryId
498-
499- // If revocation interval is not present or the credential is not revocable then we
500- // don't need to fetch the revocation status
501- if ( ! requestNonRevoked || credentialRevocationId === null || ! revocationRegistryId ) {
502- return { isRevoked : undefined , timestamp : undefined }
503- }
504-
505- agentContext . config . logger . trace (
506- `Fetching credential revocation status for credential revocation id '${ credentialRevocationId } ' with revocation interval with from '${ requestNonRevoked . from } ' and to '${ requestNonRevoked . to } '`
507- )
508-
509- // Make sure the revocation interval follows best practices from Aries RFC 0441
510- assertBestPracticeRevocationInterval ( requestNonRevoked )
511-
512- const { revocationStatusList } = await fetchRevocationStatusList (
513- agentContext ,
514- revocationRegistryId ,
515- requestNonRevoked . to ?? dateToTimestamp ( new Date ( ) )
516- )
517-
518- const isRevoked = revocationStatusList . revocationList [ parseInt ( credentialRevocationId ) ] === 1
519-
520- agentContext . config . logger . trace (
521- `Credential with credential revocation index '${ credentialRevocationId } ' is ${
522- isRevoked ? '' : 'not '
523- } revoked with revocation interval with to '${ requestNonRevoked . to } ' & from '${ requestNonRevoked . from } '`
524- )
525-
526- return {
527- isRevoked,
528- timestamp : revocationStatusList . timestamp ,
529- }
530- }
531-
532384 /**
533385 * Create anoncreds proof from a given proof request and requested credential object.
534386 *
0 commit comments