Documentation
¶
Index ¶
Examples ¶
Constants ¶
const ( // PresentationSubmissionJSONLDContext is the JSONLD context of presentation submissions. PresentationSubmissionJSONLDContext = "https://identity.foundation/presentation-exchange/submission/v1" // PresentationSubmissionJSONLDType is the JSONLD type of presentation submissions. PresentationSubmissionJSONLDType = "PresentationSubmission" )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type InputDescriptor ¶
type InputDescriptor struct { ID string `json:"id,omitempty"` Schema *Schema `json:"schema,omitempty"` }
InputDescriptor input descriptors.
type InputDescriptorMapping ¶
InputDescriptorMapping maps an InputDescriptor to a verifiable credential pointed to by the JSONPath in `Path`.
type MatchOption ¶
type MatchOption func(*MatchOptions)
MatchOption is an option that sets an option for when matching.
func WithJSONLDDocumentLoader ¶
func WithJSONLDDocumentLoader(l ld.DocumentLoader) MatchOption
WithJSONLDDocumentLoader sets the loader to use when parsing the embedded verifiable credentials.
type MatchOptions ¶
type MatchOptions struct {
JSONLDDocumentLoader ld.DocumentLoader
}
MatchOptions is a holder of options that can set when matching a submission against definitions.
type PresentationDefinitions ¶
type PresentationDefinitions struct { Name string `json:"name"` Purpose string `json:"purpose"` InputDescriptors []*InputDescriptor `json:"input_descriptors,omitempty"` }
PresentationDefinitions presentation definitions (https://identity.foundation/presentation-exchange/).
func (*PresentationDefinitions) Match ¶
func (p *PresentationDefinitions) Match(vp *verifiable.Presentation, options ...MatchOption) (map[string]*verifiable.Credential, error)
Match returns the credentials matched against the InputDescriptors ids.
Example ¶
Example of a Verifier verifying the presentation submission of a Holder.
package main import ( "encoding/json" "fmt" "strings" "github.com/piprate/json-gold/ld" "github.com/hyperledger/aries-framework-go/pkg/doc/verifiable" ) // Example of a Verifier verifying the presentation submission of a Holder. func main() { // verifier sends their presentation definitions to the holder verifierDefinitions := &PresentationDefinitions{ InputDescriptors: []*InputDescriptor{ { ID: "banking", Schema: &Schema{ URI: "https://example.context.jsonld/account", }, }, { ID: "residence", Schema: &Schema{ URI: "https://example.context.jsonld/address", }, }, }, } // holder fetches their credentials accountCredential := newVC([]string{"https://example.context.jsonld/account"}) addressCredential := newVC([]string{"https://example.context.jsonld/address"}) // holder builds their presentation submission against the verifier's definitions vp, err := newPresentationSubmission( &PresentationSubmission{DescriptorMap: []*InputDescriptorMapping{ { ID: "banking", Path: "$.verifiableCredential[0]", }, { ID: "residence", Path: "$.verifiableCredential[1]", }, }}, accountCredential, addressCredential, ) if err != nil { panic(err) } // holder sends VP over the wire to the verifier vpBytes, err := json.Marshal(vp) if err != nil { panic(err) } // verifier parses the vp // note: parsing this VP without verifying the proof just for example purposes. // Always verify proofs in production! receivedVP, err := verifiable.ParseUnverifiedPresentation(vpBytes) if err != nil { panic(err) } // verifier matches the received VP against their definitions matched, err := verifierDefinitions.Match( receivedVP, WithJSONLDDocumentLoader(cachedJSONLDContextLoader(map[string]string{ "https://example.context.jsonld/account": exampleJSONLDContext, "https://example.context.jsonld/address": exampleJSONLDContext})), ) if err != nil { panic(fmt.Errorf("presentation submission did not match definitions: %w", err)) } for _, descriptor := range verifierDefinitions.InputDescriptors { receivedCred := matched[descriptor.ID] fmt.Printf( "verifier received the '%s' credential for the input descriptor id '%s'\n", receivedCred.Context[1], descriptor.ID) } } func newPresentationSubmission( submission *PresentationSubmission, vcs ...*verifiable.Credential) (*verifiable.Presentation, error) { vp := &verifiable.Presentation{ Context: []string{ "https://www.w3.org/2018/credentials/v1", "https://identity.foundation/presentation-exchange/submission/v1", }, Type: []string{ "VerifiablePresentation", "PresentationSubmission", }, } if submission != nil { vp.CustomFields = make(map[string]interface{}) vp.CustomFields["presentation_submission"] = toExampleMap(submission) } if len(vcs) > 0 { creds := make([]interface{}, len(vcs)) for i := range vcs { creds[i] = vcs[i] } err := vp.SetCredentials(creds...) if err != nil { return nil, err } } return vp, nil } func toExampleMap(v interface{}) map[string]interface{} { bits, err := json.Marshal(v) if err != nil { panic(err) } m := make(map[string]interface{}) err = json.Unmarshal(bits, &m) if err != nil { panic(err) } return m } func cachedJSONLDContextLoader(ctxURLToVocab map[string]string) *ld.CachingDocumentLoader { loader := verifiable.CachingJSONLDLoader() for contextURL, vocab := range ctxURLToVocab { reader, err := ld.DocumentFromReader(strings.NewReader(vocab)) if err != nil { panic(err) } loader.AddDocument(contextURL, reader) } return loader } const exampleJSONLDContext = `{ "@context":{ "@version":1.1, "@protected":true, "name":"http://schema.org/name", "ex":"https://example.org/examples#", "xsd":"http://www.w3.org/2001/XMLSchema#" } }`
Output: verifier received the 'https://example.context.jsonld/account' credential for the input descriptor id 'banking' verifier received the 'https://example.context.jsonld/address' credential for the input descriptor id 'residence'
type PresentationSubmission ¶
type PresentationSubmission struct {
DescriptorMap []*InputDescriptorMapping `json:"descriptor_map"`
}
PresentationSubmission is the container for the descriptor_map: https://identity.foundation/presentation-exchange/#presentation-submission.