-
Notifications
You must be signed in to change notification settings - Fork 383
/
verifiable.go
96 lines (79 loc) · 2.44 KB
/
verifiable.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package bertyvcissuer
import (
"crypto/ed25519"
"fmt"
"time"
"github.com/hyperledger/aries-framework-go/component/storageutil/mem"
ariesDocLD "github.com/hyperledger/aries-framework-go/pkg/doc/ld"
"github.com/hyperledger/aries-framework-go/pkg/doc/ldcontext/embed"
"github.com/hyperledger/aries-framework-go/pkg/doc/util"
"github.com/hyperledger/aries-framework-go/pkg/doc/util/signature"
"github.com/hyperledger/aries-framework-go/pkg/doc/verifiable"
"github.com/hyperledger/aries-framework-go/pkg/framework/context"
ariesld "github.com/hyperledger/aries-framework-go/pkg/store/ld"
)
type CredentialSubject struct {
ID string `json:"id"`
}
func (i *VCIssuer) initContextStore() error {
contextStore, err := ariesld.NewContextStore(mem.NewProvider())
if err != nil {
return err
}
remoteProviderStore, err := ariesld.NewRemoteProviderStore(mem.NewProvider())
if err != nil {
return err
}
err = contextStore.Import(embed.Contexts)
if err != nil {
return err
}
ariesContext, err := context.New(
context.WithJSONLDContextStore(contextStore),
context.WithJSONLDRemoteProviderStore(remoteProviderStore),
)
if err != nil {
return err
}
documentLoader, err := ariesDocLD.NewDocumentLoader(ariesContext)
if err != nil {
return err
}
i.ariesDocumentLoader = documentLoader
return nil
}
func (i *VCIssuer) CreateSignedProofForPeriod(bertyID string, identifier string, issued time.Time, expired time.Time) ([]byte, error) {
vc := &verifiable.Credential{
Context: []string{
"https://www.w3.org/2018/credentials/v1",
},
ID: bertyID,
Types: []string{
"VerifiableCredential",
},
Subject: CredentialSubject{
ID: identifier,
},
Issuer: verifiable.Issuer{
ID: i.issuerID,
},
Proofs: []verifiable.Proof{},
Issued: util.NewTime(issued),
Expired: util.NewTime(expired),
Schemas: []verifiable.TypedID{},
}
signer := signature.GetEd25519Signer(i.issuerSignKey, i.issuerSignKey.Public().(ed25519.PublicKey))
jwtClaims, err := vc.JWTClaims(true)
if err != nil {
return nil, fmt.Errorf("failed to marshal JWT claims of VC: %w", err)
}
jws, err := jwtClaims.MarshalJWS(verifiable.EdDSA, signer, i.issuerID)
if err != nil {
return nil, fmt.Errorf("failed to sign VC inside JWT: %w", err)
}
return []byte(jws), nil
}
func (i *VCIssuer) CreateSignedProof(bertyID string, identifier string) ([]byte, error) {
now := time.Now()
return i.CreateSignedProofForPeriod(bertyID, identifier, now, now.AddDate(1, 0, 0))
}