Documentation
¶
Index ¶
- Constants
- Variables
- func AutoExecute(p Provider, next chan service.DIDCommAction) func(chan service.DIDCommAction)
- func CreateIssueCredentialMsg(p Provider, spec *CredentialSpec) (*issuecredential.IssueCredentialV2, error)
- func FindAttachment(formatType string, formats []issuecredential.Format, ...) (*decorator.Attachment, error)
- func RegisterMiddleware(mw Middleware, p ServiceProvider) error
- func ValidateVCMatchesSpecOptions(vc *verifiable.Credential, options *CredentialSpecOptions) error
- func VerifyCredential(p Provider, options *CredentialSpecOptions, name string, ...) (interface{}, error)
- type CredentialSpec
- type CredentialSpecOptions
- func IssueCredential(p Provider, msg service.DIDCommMsg) (interface{}, *CredentialSpecOptions, error)
- func ReplayOffer(p JSONLDDocumentLoaderProvider, msg service.DIDCommMsg) (interface{}, *CredentialSpecOptions, error)
- func ReplayProposal(p JSONLDDocumentLoaderProvider, msg service.DIDCommMsg) (interface{}, *CredentialSpecOptions, error)
- type CredentialStatus
- type IssueCredentialService
- type JSONLDDocumentLoaderProvider
- type Middleware
- type Provider
- type ServiceProvider
- type SignatureSuiteSpec
- type Signer
- type TransientStorage
Constants ¶
const ( // ProofVCDetailFormat is the attachment format used in the proposal, offer, and request message attachments. ProofVCDetailFormat = "aries/ld-proof-vc-detail@v1.0" // ProofVCFormat is the attachment format used in the issue-credential message attachment. ProofVCFormat = "aries/ld-proof-vc@v1.0" // StoreName is the name of the transient store used by AutoExecute. StoreName = "RFC0593TransientStore" )
Variables ¶
var DefaultSignatureSuiteSpecs = map[string]SignatureSuiteSpec{ ed25519signature2018.SignatureType: { KeyType: kms.ED25519Type, KeyMultiCodec: fingerprint.ED25519PubKeyMultiCodec, Suite: func(opts ...suite.Opt) signer.SignatureSuite { return ed25519signature2018.New(opts...) }, SignatureRepresentation: verifiable.SignatureJWS, Signer: func(p Provider, kh interface{}) Signer { return suite.NewCryptoSigner(p.Crypto(), kh) }, }, bbsblssignature2020.SignatureType: { KeyType: kms.BLS12381G2Type, KeyMultiCodec: fingerprint.BLS12381g2PubKeyMultiCodec, Suite: func(opts ...suite.Opt) signer.SignatureSuite { return bbsblssignature2020.New(opts...) }, SignatureRepresentation: verifiable.SignatureProofValue, Signer: func(p Provider, kh interface{}) Signer { return newBBSSigner(p.KMS(), p.Crypto(), kh) }, }, }
DefaultSignatureSuiteSpecs are the signature suites supported by default. TODO make signaturesuite specs configurable.
var ErrRFC0593NotApplicable = errors.New("RFC0593 is not applicable")
ErrRFC0593NotApplicable indicates RFC0593 does not apply to the message being handled because it does not contain an attachment with the proof format identifiers.
See also: ProofVCDetailFormat, ProofVCFormat.
Functions ¶
func AutoExecute ¶
func AutoExecute(p Provider, next chan service.DIDCommAction) func(chan service.DIDCommAction)
AutoExecute will automatically execute the issue-credential V2 protocol using ReplayProposal, ReplayOffer, and IssueCredential by handling the associated actions if they contain RFC0593 attachments. Other actions are passed through to 'next'.
Usage:
client := issuecredential.Client = ...
events = make(chan service.DIDCommAction)
err := client.RegisterActionEvent(events)
if err != nil {
panic(err)
}
var p Provider = ...
next := make(chan service.DIDCommAction)
go AutoExecute(p, next)(events)
for event := range next {
// handle events from issue-credential that do not conform to RFC0593
}
Note: use the protocol Middleware if the protocol needs to be started with a request-credential message.
See also: service.AutoExecuteActionEvent.
func CreateIssueCredentialMsg ¶
func CreateIssueCredentialMsg(p Provider, spec *CredentialSpec) (*issuecredential.IssueCredentialV2, error)
CreateIssueCredentialMsg creates an issue-credential message using the credential spec.
func FindAttachment ¶
func FindAttachment(formatType string, formats []issuecredential.Format, attachments []decorator.Attachment) (*decorator.Attachment, error)
FindAttachment returns the attachment corresponding to the RFC0593 format entry.
func RegisterMiddleware ¶
func RegisterMiddleware(mw Middleware, p ServiceProvider) error
RegisterMiddleware registers the Middleware in the IssueCredentialService looked up from the ServiceProvider.
See also: NewMiddleware.
func ValidateVCMatchesSpecOptions ¶
func ValidateVCMatchesSpecOptions(vc *verifiable.Credential, options *CredentialSpecOptions) error
ValidateVCMatchesSpecOptions ensures the vc matches the spec.
func VerifyCredential ¶
func VerifyCredential(p Provider, options *CredentialSpecOptions, name string, msg service.DIDCommMsg) (interface{}, error)
VerifyCredential verifies the credential received in an RFC0593 issue-credential message.
The credential is validated to ensure it complies with the given CredentialSpecOptions.
The credential will then be saved with the given name.
Usage:
var p Provider = ...
client := issuecredential.Client = ...
var events chan service.DIDCommAction = ...
err := client.RegisterActionEvent(events)
if err != nil {
panic(err)
}
var options *CredentialSpecOptions
for event := range events {
switch event.Message.Type() {
case issuecredential.OfferCredentialMsgType:
arg, opts, err := ReplayOffer(p, event.Message)
if err != nil {
event.Stop(err)
}
options = opts
event.Continue(arg)
case issuecredential.IssueCredentialMsgType:
arg, err := VerifyCredential(p, options, "my_vc", event.Message)
if errors.Is(err, ErrRFC0593NotApplicable) {
// inspect and handle the event yourself
arg, err = handleEvent(event)
}
if err != nil {
event.Stop(err)
}
event.Continue(arg)
}
}
Types ¶
type CredentialSpec ¶
type CredentialSpec struct {
Template json.RawMessage `json:"credential"`
Options *CredentialSpecOptions `json:"options"`
}
CredentialSpec is the attachment payload in messages conforming to the RFC0593 format.
func GetCredentialSpec ¶
func GetCredentialSpec(p JSONLDDocumentLoaderProvider, formats []issuecredential.Format, attachments []decorator.Attachment) (*CredentialSpec, error)
GetCredentialSpec extracts the CredentialSpec from the formats and attachments.
type CredentialSpecOptions ¶
type CredentialSpecOptions struct {
ProofPurpose string `json:"proofPurpose"`
Created string `json:"created"`
Domain string `json:"domain"`
Challenge string `json:"challenge"`
Status *CredentialStatus `json:"credentialStatus"`
ProofType string `json:"proofType"`
}
CredentialSpecOptions are the options for issuance of the credential. TODO support CredentialStatus.
func IssueCredential ¶
func IssueCredential(p Provider, msg service.DIDCommMsg) (interface{}, *CredentialSpecOptions, error)
IssueCredential attaches an LD proof to the template VC in the inbound request message and attaches the verifiable credential to an outbound issue-credential message.
Usage:
var p Provider = ...
client := issuecredential.Client = ...
var events chan service.DIDCommAction = ...
err := client.RegisterActionEvent(events)
if err != nil {
panic(err)
}
for event := range events {
if event.Message.Type() == issuecredential.RequestCredentialMsgType {
arg, options, err := IssueCredential(p, event.Message)
if errors.Is(err, ErrRFC0593NotApplicable) {
// inspect and handle the event yourself
arg, err = handleEvent(event)
}
if err != nil {
event.Stop(err)
}
// inspect options
event.Continue(arg)
}
}
func ReplayOffer ¶
func ReplayOffer(p JSONLDDocumentLoaderProvider, msg service.DIDCommMsg) (interface{}, *CredentialSpecOptions, error)
ReplayOffer replays the inbound offered CredentialSpec as an outbound request that can be sent back to the original sender.
Usage:
var p JSONLDDocumentLoaderProvider = ...
client := issuecredential.Client = ...
var events chan service.DIDCommAction = ...
err := client.RegisterActionEvent(events)
if err != nil {
panic(err)
}
for event := range events {
if event.Message.Type() == issuecredential.OfferCredentialMsgType {
arg, options, err := ReplayOffer(p, event.Message)
if errors.Is(err, ErrRFC0593NotApplicable) {
// inspect and handle the event yourself
arg, err = handleEvent(event)
}
if err != nil {
event.Stop(err)
}
// inspect options
event.Continue(arg)
}
}
func ReplayProposal ¶
func ReplayProposal(p JSONLDDocumentLoaderProvider, msg service.DIDCommMsg) (interface{}, *CredentialSpecOptions, error)
ReplayProposal replays the inbound proposed CredentialSpec as an outbound offer that can be sent back to the original sender.
Usage:
var p JSONLDDocumentLoaderProvider = ...
client := issuecredential.Client = ...
var events chan service.DIDCommAction = ...
err := client.RegisterActionEvent(events)
if err != nil {
panic(err)
}
for event := range events {
if event.Message.Type() == issuecredential.ProposeCredentialMsgType {
arg, options, err := ReplayProposal(p, event.Message)
if errors.Is(err, ErrRFC0593NotApplicable) {
// inspect and handle the event yourself
arg, err = handleEvent(event)
}
if err != nil {
event.Stop(err)
}
// inspect options
event.Continue(arg)
}
}
type CredentialStatus ¶
type CredentialStatus struct {
Type string `json:"type"`
}
CredentialStatus is the requested status for the credential.
type IssueCredentialService ¶
type IssueCredentialService interface {
AddMiddleware(...issuecredential.Middleware)
}
IssueCredentialService defines the API required on the issue-credential protocol service implementation.
type JSONLDDocumentLoaderProvider ¶
type JSONLDDocumentLoaderProvider interface {
JSONLDDocumentLoader() ld.DocumentLoader
}
JSONLDDocumentLoaderProvider provides an ld.DocumentLoader.
See also: context.Provider.
type Middleware ¶
type Middleware issuecredential.Middleware
Middleware is the RFC0593 issuecredential.Middleware that can be injected into the protocol service.
func NewMiddleware ¶
func NewMiddleware(p TransientStorage) (Middleware, error)
NewMiddleware returns a new Middleware that can be used with the issuecredential protocol service in conjunction with AutoExecute when the protocol needs to be started with a request-credential message.
Usage:
framework, err := aries.New()
if err != nil {
panic(err)
}
ctx, err := framework.Context()
if err != nil {
panic(err)
}
mw, err := NewMiddleware(ctx)
if err != nil {
panic(err)
}
err = RegisterMiddleware(mw, ctx)
if err != nil {
panic(err)
}
client := issuecredential.Client = ...
events = make(chan service.DIDCommAction)
err := client.RegisterActionEvent(events)
if err != nil {
panic(err)
}
next := make(chan service.DIDCommAction)
go AutoExecute(ctx, next)(events)
for event := range next {
// handle events from issue-credential that do not conform to RFC0593
}
See also: AutoExecute.
type Provider ¶
type Provider interface {
JSONLDDocumentLoaderProvider
TransientStorage
KMS() kms.KeyManager
Crypto() crypto.Crypto
VDRegistry() vdr.Registry
}
Provider provides all dependencies.
See also: context.Provider.
type ServiceProvider ¶
ServiceProvider is used to lookup the issuecredential service.
type SignatureSuiteSpec ¶
type SignatureSuiteSpec struct {
KeyType kms.KeyType
KeyMultiCodec uint64
SignatureRepresentation verifiable.SignatureRepresentation
Suite func(...suite.Opt) signer.SignatureSuite
Signer func(Provider, interface{}) Signer
}
SignatureSuiteSpec specifies how to instantiate a signature suite and its proof.
type TransientStorage ¶
TransientStorage provides transient storage.