Documentation
¶
Overview ¶
Package presentproof provides support for the Present Proof Protocol 2.0: https://github.com/hyperledger/aries-rfcs/blob/master/features/0454-present-proof-v2/README.md.
A protocol supporting a general purpose verifiable presentation exchange regardless of the specifics of the underlying verifiable presentation request and verifiable presentation format.
1. Create your client:
client, err := presentproof.New(ctx)
if err != nil {
panic(err)
}
2. Register an action event channel.
actions := make(chan service.DIDCommAction) client.RegisterActionEvent(actions)
3. Handle incoming actions.
for {
select {
case event := <-actions:
piid := e.Properties.All()["piid"].(string)
if event.Message.Type() == presentproof.ProposePresentationMsgType {
// If Verifier is willing to accept the proposal.
client.AcceptProposePresentation(piid, &RequestPresentation{})
// If Verifier is not willing to accept the proposal.
client.DeclineProposePresentation(piid, reason)
}
if event.Message.Type() == presentproof.RequestPresentationMsgType {
// If Prover is willing to accept a request.
client.AcceptRequestPresentation(piid, &Presentation{})
// If Prover wants to counter a request they received with a proposal.
client.NegotiateRequestPresentation(piid, &ProposePresentation{})
// If Prover is not willing to accept a request.
client.DeclineRequestPresentation(piid, reason)
}
if event.Message.Type() == presentproof.PresentationMsgType {
// If Verifier is willing to accept the presentation.
client.AcceptPresentation(piid, names)
// If Verifier is not willing to accept the presentation.
client.DeclinePresentation(piid, reason)
}
if event.Message.Type() == presentproof.ProblemReportMsgType {
Problem report message is triggered to notify client about the error.
In that case, there is only one option - accept it.
client.AcceptProblemReport(piid)
}
}
}
How to initiate the protocol? The protocol can be initiated by the Verifier or by the Prover. Prover initiates the protocol.
client.SendProposePresentation(&ProposePresentation{}, myDID, theirDID)
Verifier initiates the protocol.
client.SendRequestPresentation(&RequestPresentation{}, myDID, theirDID)
Index ¶
- func WithAddProofFn(sign addProof) presentproof.Opt
- func WithFriendlyNames(names ...string) presentproof.Opt
- func WithMultiOptions(opts ...presentproof.Opt) presentproof.Opt
- func WithPresentation(msg *Presentation) presentproof.Opt
- func WithPresentationV3(msg *PresentationV3) presentproof.Opt
- func WithProposePresentation(msg *ProposePresentation) presentproof.Opt
- func WithProposePresentationV3(msg *ProposePresentationV3) presentproof.Opt
- func WithRequestPresentation(msg *RequestPresentation) presentproof.Opt
- func WithRequestPresentationV3(msg *RequestPresentationV3) presentproof.Opt
- type Action
- type Client
- func (c *Client) AcceptPresentation(piID string, names ...string) error
- func (c *Client) AcceptProblemReport(piID string) error
- func (c *Client) AcceptProposePresentation(piID string, msg *RequestPresentation) error
- func (c *Client) AcceptProposePresentationV3(piID string, msg *RequestPresentationV3) error
- func (c *Client) AcceptRequestPresentation(piID string, msg *Presentation, sign addProof) error
- func (c *Client) AcceptRequestPresentationV3(piID string, msg *PresentationV3, sign addProof) error
- func (c *Client) Actions() ([]Action, error)
- func (c *Client) DeclinePresentation(piID, reason string) error
- func (c *Client) DeclineProposePresentation(piID, reason string) error
- func (c *Client) DeclineRequestPresentation(piID, reason string) error
- func (c *Client) NegotiateRequestPresentation(piID string, msg *ProposePresentation) error
- func (c *Client) NegotiateRequestPresentationV3(piID string, msg *ProposePresentationV3) error
- func (c *Client) SendProposePresentation(msg *ProposePresentation, myDID, theirDID string) (string, error)
- func (c *Client) SendProposePresentationV3(msg *ProposePresentationV3, myDID, theirDID string) (string, error)
- func (c *Client) SendRequestPresentation(msg *RequestPresentation, myDID, theirDID string) (string, error)
- func (c *Client) SendRequestPresentationV3(msg *RequestPresentationV3, myDID, theirDID string) (string, error)
- type Presentation
- type PresentationV3
- type ProposePresentation
- type ProposePresentationV3
- type ProtocolService
- type Provider
- type RequestPresentation
- type RequestPresentationV3
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func WithAddProofFn ¶ added in v0.1.6
func WithAddProofFn(sign addProof) presentproof.Opt
WithAddProofFn allows providing function that will sign the Presentation. Use this option to respond to RequestPresentation.
func WithFriendlyNames ¶ added in v0.1.4
func WithFriendlyNames(names ...string) presentproof.Opt
WithFriendlyNames allows providing names for the presentations.
func WithMultiOptions ¶ added in v0.1.6
func WithMultiOptions(opts ...presentproof.Opt) presentproof.Opt
WithMultiOptions allows combining several options into one.
func WithPresentation ¶
func WithPresentation(msg *Presentation) presentproof.Opt
WithPresentation allows providing Presentation message Use this option to respond to RequestPresentation.
func WithPresentationV3 ¶ added in v0.1.7
func WithPresentationV3(msg *PresentationV3) presentproof.Opt
WithPresentationV3 allows providing PresentationV3 message Use this option to respond to RequestPresentationV3.
func WithProposePresentation ¶
func WithProposePresentation(msg *ProposePresentation) presentproof.Opt
WithProposePresentation allows providing ProposePresentation message Use this option to respond to RequestPresentation.
func WithProposePresentationV3 ¶ added in v0.1.7
func WithProposePresentationV3(msg *ProposePresentationV3) presentproof.Opt
WithProposePresentationV3 allows providing ProposePresentationV3 message Use this option to respond to RequestPresentation.
func WithRequestPresentation ¶
func WithRequestPresentation(msg *RequestPresentation) presentproof.Opt
WithRequestPresentation allows providing RequestPresentation message Use this option to respond to ProposePresentation.
func WithRequestPresentationV3 ¶ added in v0.1.7
func WithRequestPresentationV3(msg *RequestPresentationV3) presentproof.Opt
WithRequestPresentationV3 allows providing RequestPresentation message Use this option to respond to ProposePresentation.
Types ¶
type Client ¶
Client enable access to presentproof API https://github.com/hyperledger/aries-rfcs/tree/master/features/0037-present-proof
func (*Client) AcceptPresentation ¶
AcceptPresentation is used by the Verifier to accept a presentation.
func (*Client) AcceptProblemReport ¶ added in v0.1.4
AcceptProblemReport accepts problem report action.
func (*Client) AcceptProposePresentation ¶
func (c *Client) AcceptProposePresentation(piID string, msg *RequestPresentation) error
AcceptProposePresentation is used when the Verifier is willing to accept the propose presentation.
func (*Client) AcceptProposePresentationV3 ¶ added in v0.1.7
func (c *Client) AcceptProposePresentationV3(piID string, msg *RequestPresentationV3) error
AcceptProposePresentationV3 is used when the Verifier is willing to accept the propose presentation.
func (*Client) AcceptRequestPresentation ¶
func (c *Client) AcceptRequestPresentation(piID string, msg *Presentation, sign addProof) error
AcceptRequestPresentation is used by the Prover is to accept a presentation request.
func (*Client) AcceptRequestPresentationV3 ¶ added in v0.1.7
func (c *Client) AcceptRequestPresentationV3(piID string, msg *PresentationV3, sign addProof) error
AcceptRequestPresentationV3 is used by the Prover is to accept a presentation request.
func (*Client) DeclinePresentation ¶
DeclinePresentation is used by the Verifier to decline a presentation.
func (*Client) DeclineProposePresentation ¶
DeclineProposePresentation is used when the Verifier does not want to accept the propose presentation.
func (*Client) DeclineRequestPresentation ¶
DeclineRequestPresentation is used when the Prover does not want to accept the request presentation.
func (*Client) NegotiateRequestPresentation ¶
func (c *Client) NegotiateRequestPresentation(piID string, msg *ProposePresentation) error
NegotiateRequestPresentation is used by the Prover to counter a presentation request they received with a proposal.
func (*Client) NegotiateRequestPresentationV3 ¶ added in v0.1.7
func (c *Client) NegotiateRequestPresentationV3(piID string, msg *ProposePresentationV3) error
NegotiateRequestPresentationV3 is used by the Prover to counter a presentation request they received with a proposal.
func (*Client) SendProposePresentation ¶
func (c *Client) SendProposePresentation(msg *ProposePresentation, myDID, theirDID string) (string, error)
SendProposePresentation is used by the Prover to send a propose presentation. It returns the threadID of the new instance of the protocol.
Example ¶
nolint: gocyclo
transport := map[string]chan payload{
Alice: make(chan payload),
Bob: make(chan payload),
}
// Alice creates client
clientAlice, err := New(mockContext(Alice, transport))
if err != nil {
panic(err)
}
// Alice registers channel for actions
actionsAlice := make(chan service.DIDCommAction)
err = clientAlice.RegisterActionEvent(actionsAlice)
if err != nil {
panic(err)
}
// Bob creates client
clientBob, err := New(mockContext(Bob, transport))
if err != nil {
panic(err)
}
// Bob registers channel for actions
actionsBob := make(chan service.DIDCommAction)
err = clientBob.RegisterActionEvent(actionsBob)
if err != nil {
panic(err)
}
go func() {
for {
var acceptErr error
var e service.DIDCommAction
select {
case e = <-actionsAlice:
case e = <-actionsBob:
}
piid, ok := e.Properties.All()["piid"].(string)
if !ok {
fmt.Println("empty piid")
}
if e.Message.Type() == presentproof.PresentationMsgTypeV2 {
acceptErr = clientBob.AcceptPresentation(piid)
}
if e.Message.Type() == presentproof.ProposePresentationMsgTypeV2 {
acceptErr = clientBob.AcceptProposePresentation(piid, &RequestPresentation{WillConfirm: true})
}
if e.Message.Type() == presentproof.RequestPresentationMsgTypeV2 {
acceptErr = clientAlice.AcceptRequestPresentation(piid, &Presentation{}, nil)
}
if acceptErr != nil {
fmt.Println(acceptErr)
}
}
}()
// Alice
waitForAlice := waitForFn(clientAlice)
// Bob
waitForBob := waitForFn(clientBob)
_, err = clientAlice.SendProposePresentation(&ProposePresentation{}, Alice, Bob)
if err != nil {
fmt.Println(err)
}
waitForAlice()
waitForBob()
Output: Bob received https://didcomm.org/present-proof/2.0/propose-presentation from Alice Alice received https://didcomm.org/present-proof/2.0/request-presentation from Bob Bob received https://didcomm.org/present-proof/2.0/presentation from Alice Alice received https://didcomm.org/present-proof/2.0/ack from Bob
func (*Client) SendProposePresentationV3 ¶ added in v0.1.7
func (c *Client) SendProposePresentationV3(msg *ProposePresentationV3, myDID, theirDID string) (string, error)
SendProposePresentationV3 is used by the Prover to send a propose presentation. It returns the threadID of the new instance of the protocol.
Example ¶
nolint: gocyclo
transport := map[string]chan payload{
Alice: make(chan payload),
Bob: make(chan payload),
}
// Alice creates client
clientAlice, err := New(mockContext(Alice, transport))
if err != nil {
panic(err)
}
// Alice registers channel for actions
actionsAlice := make(chan service.DIDCommAction)
err = clientAlice.RegisterActionEvent(actionsAlice)
if err != nil {
panic(err)
}
// Bob creates client
clientBob, err := New(mockContext(Bob, transport))
if err != nil {
panic(err)
}
// Bob registers channel for actions
actionsBob := make(chan service.DIDCommAction)
err = clientBob.RegisterActionEvent(actionsBob)
if err != nil {
panic(err)
}
go func() {
for {
var acceptErr error
var e service.DIDCommAction
select {
case e = <-actionsAlice:
case e = <-actionsBob:
}
piid, ok := e.Properties.All()["piid"].(string)
if !ok {
fmt.Println("empty piid")
}
if e.Message.Type() == presentproof.PresentationMsgTypeV3 {
acceptErr = clientBob.AcceptPresentation(piid)
}
if e.Message.Type() == presentproof.ProposePresentationMsgTypeV3 {
rp3 := &RequestPresentationV3{}
rp3.Body.WillConfirm = true
acceptErr = clientBob.AcceptProposePresentationV3(piid, rp3)
}
if e.Message.Type() == presentproof.RequestPresentationMsgTypeV3 {
acceptErr = clientAlice.AcceptRequestPresentationV3(piid, &PresentationV3{}, nil)
}
if acceptErr != nil {
fmt.Println(acceptErr)
}
}
}()
// Alice
waitForAlice := waitForFn(clientAlice)
// Bob
waitForBob := waitForFn(clientBob)
_, err = clientAlice.SendProposePresentationV3(&ProposePresentationV3{}, Alice, Bob)
if err != nil {
fmt.Println(err)
}
waitForAlice()
waitForBob()
Output: Bob received https://didcomm.org/present-proof/3.0/propose-presentation from Alice Alice received https://didcomm.org/present-proof/3.0/request-presentation from Bob Bob received https://didcomm.org/present-proof/3.0/presentation from Alice Alice received https://didcomm.org/present-proof/3.0/ack from Bob
func (*Client) SendRequestPresentation ¶
func (c *Client) SendRequestPresentation(msg *RequestPresentation, myDID, theirDID string) (string, error)
SendRequestPresentation is used by the Verifier to send a request presentation. It returns the threadID of the new instance of the protocol.
Example ¶
transport := map[string]chan payload{
Alice: make(chan payload),
Bob: make(chan payload),
}
// Alice creates client
clientAlice, err := New(mockContext(Alice, transport))
if err != nil {
panic(err)
}
// Alice registers channel for actions
actionsAlice := make(chan service.DIDCommAction)
err = clientAlice.RegisterActionEvent(actionsAlice)
if err != nil {
panic(err)
}
// Bob creates client
clientBob, err := New(mockContext(Bob, transport))
if err != nil {
panic(err)
}
// Bob registers channel for actions
actionsBob := make(chan service.DIDCommAction)
err = clientBob.RegisterActionEvent(actionsBob)
if err != nil {
panic(err)
}
go func() {
for {
var acceptErr error
select {
case e := <-actionsAlice:
acceptErr = clientAlice.AcceptPresentation(e.Properties.All()["piid"].(string))
case e := <-actionsBob:
acceptErr = clientBob.AcceptRequestPresentation(e.Properties.All()["piid"].(string), &Presentation{}, nil)
}
if acceptErr != nil {
fmt.Println(acceptErr)
}
}
}()
// Alice
waitForAlice := waitForFn(clientAlice)
// Bob
waitForBob := waitForFn(clientBob)
_, err = clientAlice.SendRequestPresentation(&RequestPresentation{}, Alice, Bob)
if err != nil {
fmt.Println(err)
}
waitForAlice()
waitForBob()
Output: Bob received https://didcomm.org/present-proof/2.0/request-presentation from Alice Alice received https://didcomm.org/present-proof/2.0/presentation from Bob
Example (Second) ¶
transport := map[string]chan payload{
Alice: make(chan payload),
Bob: make(chan payload),
}
// Alice creates client
clientAlice, err := New(mockContext(Alice, transport))
if err != nil {
panic(err)
}
// Alice registers channel for actions
actionsAlice := make(chan service.DIDCommAction)
err = clientAlice.RegisterActionEvent(actionsAlice)
if err != nil {
panic(err)
}
// Bob creates client
clientBob, err := New(mockContext(Bob, transport))
if err != nil {
panic(err)
}
// Bob registers channel for actions
actionsBob := make(chan service.DIDCommAction)
err = clientBob.RegisterActionEvent(actionsBob)
if err != nil {
panic(err)
}
go func() {
for {
var acceptErr error
select {
case e := <-actionsAlice:
acceptErr = clientAlice.AcceptPresentation(e.Properties.All()["piid"].(string))
case e := <-actionsBob:
acceptErr = clientBob.AcceptRequestPresentation(e.Properties.All()["piid"].(string), &Presentation{}, nil)
}
if acceptErr != nil {
fmt.Println(acceptErr)
}
}
}()
// Alice
waitForAlice := waitForFn(clientAlice)
// Bob
waitForBob := waitForFn(clientBob)
_, err = clientAlice.SendRequestPresentation(&RequestPresentation{WillConfirm: true}, Alice, Bob)
if err != nil {
fmt.Println(err)
}
waitForAlice()
waitForBob()
Output: Bob received https://didcomm.org/present-proof/2.0/request-presentation from Alice Alice received https://didcomm.org/present-proof/2.0/presentation from Bob Bob received https://didcomm.org/present-proof/2.0/ack from Alice
func (*Client) SendRequestPresentationV3 ¶ added in v0.1.7
func (c *Client) SendRequestPresentationV3(msg *RequestPresentationV3, myDID, theirDID string) (string, error)
SendRequestPresentationV3 is used by the Verifier to send a request presentation. It returns the threadID of the new instance of the protocol.
Example ¶
transport := map[string]chan payload{
Alice: make(chan payload),
Bob: make(chan payload),
}
// Alice creates client
clientAlice, err := New(mockContext(Alice, transport))
if err != nil {
panic(err)
}
// Alice registers channel for actions
actionsAlice := make(chan service.DIDCommAction)
err = clientAlice.RegisterActionEvent(actionsAlice)
if err != nil {
panic(err)
}
// Bob creates client
clientBob, err := New(mockContext(Bob, transport))
if err != nil {
panic(err)
}
// Bob registers channel for actions
actionsBob := make(chan service.DIDCommAction)
err = clientBob.RegisterActionEvent(actionsBob)
if err != nil {
panic(err)
}
go func() {
for {
var acceptErr error
select {
case e := <-actionsAlice:
acceptErr = clientAlice.AcceptPresentation(e.Properties.All()["piid"].(string))
case e := <-actionsBob:
acceptErr = clientBob.AcceptRequestPresentationV3(e.Properties.All()["piid"].(string), &PresentationV3{}, nil)
}
if acceptErr != nil {
fmt.Println(acceptErr)
}
}
}()
// Alice
waitForAlice := waitForFn(clientAlice)
// Bob
waitForBob := waitForFn(clientBob)
_, err = clientAlice.SendRequestPresentationV3(&RequestPresentationV3{}, Alice, Bob)
if err != nil {
fmt.Println(err)
}
waitForAlice()
waitForBob()
Output: Bob received https://didcomm.org/present-proof/3.0/request-presentation from Alice Alice received https://didcomm.org/present-proof/3.0/presentation from Bob
Example (Second) ¶
transport := map[string]chan payload{
Alice: make(chan payload),
Bob: make(chan payload),
}
// Alice creates client
clientAlice, err := New(mockContext(Alice, transport))
if err != nil {
panic(err)
}
// Alice registers channel for actions
actionsAlice := make(chan service.DIDCommAction)
err = clientAlice.RegisterActionEvent(actionsAlice)
if err != nil {
panic(err)
}
// Bob creates client
clientBob, err := New(mockContext(Bob, transport))
if err != nil {
panic(err)
}
// Bob registers channel for actions
actionsBob := make(chan service.DIDCommAction)
err = clientBob.RegisterActionEvent(actionsBob)
if err != nil {
panic(err)
}
go func() {
for {
var acceptErr error
select {
case e := <-actionsAlice:
acceptErr = clientAlice.AcceptPresentation(e.Properties.All()["piid"].(string))
case e := <-actionsBob:
acceptErr = clientBob.AcceptRequestPresentationV3(e.Properties.All()["piid"].(string), &PresentationV3{}, nil)
}
if acceptErr != nil {
fmt.Println(acceptErr)
}
}
}()
// Alice
waitForAlice := waitForFn(clientAlice)
// Bob
waitForBob := waitForFn(clientBob)
_, err = clientAlice.SendRequestPresentationV3(&RequestPresentationV3{
Body: presentproof.RequestPresentationV3Body{WillConfirm: true},
}, Alice, Bob)
if err != nil {
fmt.Println(err)
}
waitForAlice()
waitForBob()
Output: Bob received https://didcomm.org/present-proof/3.0/request-presentation from Alice Alice received https://didcomm.org/present-proof/3.0/presentation from Bob Bob received https://didcomm.org/present-proof/3.0/ack from Alice
type Presentation ¶
type Presentation presentproof.Presentation
Presentation is a response to a RequestPresentation message and contains signed presentations.
type PresentationV3 ¶ added in v0.1.7
type PresentationV3 presentproof.PresentationV3
PresentationV3 is a response to a RequestPresentationV3 message and contains signed presentations.
type ProposePresentation ¶
type ProposePresentation presentproof.ProposePresentation
ProposePresentation is an optional message sent by the Prover to the verifier to initiate a proof presentation process, or in response to a request-presentation message when the Prover wants to propose using a different presentation format.
type ProposePresentationV3 ¶ added in v0.1.7
type ProposePresentationV3 presentproof.ProposePresentationV3
ProposePresentationV3 is an optional message sent by the Prover to the verifier to initiate a proof presentation process, or in response to a request-presentation message when the Prover wants to propose using a different presentation format.
type ProtocolService ¶
type ProtocolService interface {
service.DIDComm
Actions() ([]presentproof.Action, error)
ActionContinue(piID string, opt presentproof.Opt) error
ActionStop(piID string, err error) error
}
ProtocolService defines the presentproof service.
type Provider ¶
Provider contains dependencies for the protocol and is typically created by using aries.Context().
type RequestPresentation ¶
type RequestPresentation presentproof.RequestPresentation
RequestPresentation describes values that need to be revealed and predicates that need to be fulfilled.
type RequestPresentationV3 ¶ added in v0.1.7
type RequestPresentationV3 presentproof.RequestPresentationV3
RequestPresentationV3 describes values that need to be revealed and predicates that need to be fulfilled.