Files
did-it/methods/did-key/document.go

118 lines
3.4 KiB
Go
Raw Normal View History

2025-03-16 12:17:33 +01:00
package didkey
2025-03-12 14:13:31 +01:00
import (
2025-03-13 11:26:39 +01:00
"encoding/json"
2025-03-12 14:13:31 +01:00
"net/url"
"github.com/ucan-wg/go-did-it"
2025-03-12 14:13:31 +01:00
)
var _ did.Document = &document{}
type document struct {
id did.DID
2025-03-16 12:17:33 +01:00
signature did.VerificationMethodSignature
keyAgreement did.VerificationMethodKeyAgreement
2025-03-12 14:13:31 +01:00
}
func (d document) MarshalJSON() ([]byte, error) {
// It's unclear where the KeyAgreement should be.
// Maybe it doesn't matter, but the spec contradicts itself.
// See https://github.com/w3c-ccg/did-key-spec/issues/71
vms := []did.VerificationMethod{d.signature}
if d.signature != did.VerificationMethod(d.keyAgreement) {
vms = append(vms, d.keyAgreement)
}
2025-03-13 11:26:39 +01:00
return json.Marshal(struct {
Context []string `json:"@context"`
ID string `json:"id"`
AlsoKnownAs []string `json:"alsoKnownAs,omitempty"`
Controller string `json:"controller,omitempty"`
VerificationMethod []did.VerificationMethod `json:"verificationMethod,omitempty"`
Authentication []string `json:"authentication,omitempty"`
AssertionMethod []string `json:"assertionMethod,omitempty"`
KeyAgreement []string `json:"keyAgreement,omitempty"`
2025-03-13 11:26:39 +01:00
CapabilityInvocation []string `json:"capabilityInvocation,omitempty"`
CapabilityDelegation []string `json:"capabilityDelegation,omitempty"`
}{
2025-05-08 08:15:04 +02:00
Context: d.Context(),
2025-03-13 11:26:39 +01:00
ID: d.id.String(),
AlsoKnownAs: nil,
VerificationMethod: vms,
2025-03-16 12:17:33 +01:00
Authentication: []string{d.signature.ID()},
AssertionMethod: []string{d.signature.ID()},
KeyAgreement: []string{d.keyAgreement.ID()},
2025-03-16 12:17:33 +01:00
CapabilityInvocation: []string{d.signature.ID()},
CapabilityDelegation: []string{d.signature.ID()},
2025-03-13 11:26:39 +01:00
})
2025-03-12 14:13:31 +01:00
}
2025-05-08 08:15:04 +02:00
func (d document) Context() []string {
return stringSet(
did.JsonLdContext,
d.signature.JsonLdContext(),
d.keyAgreement.JsonLdContext(),
)
}
func (d document) ID() string {
return d.id.String()
2025-03-12 14:13:31 +01:00
}
func (d document) Controllers() []string {
2025-04-09 14:16:59 +02:00
// no controller for did:key, no changes are possible
return nil
2025-03-12 14:13:31 +01:00
}
2025-05-08 08:15:04 +02:00
func (d document) AlsoKnownAs() []*url.URL {
2025-03-12 14:13:31 +01:00
return nil
}
func (d document) VerificationMethods() map[string]did.VerificationMethod {
if d.signature == did.VerificationMethod(d.keyAgreement) {
return map[string]did.VerificationMethod{
d.signature.ID(): d.signature,
}
}
2025-03-12 14:13:31 +01:00
return map[string]did.VerificationMethod{
2025-03-16 12:17:33 +01:00
d.signature.ID(): d.signature,
d.keyAgreement.ID(): d.keyAgreement,
2025-03-12 14:13:31 +01:00
}
}
2025-03-16 12:17:33 +01:00
func (d document) Authentication() []did.VerificationMethodSignature {
return []did.VerificationMethodSignature{d.signature}
2025-03-12 14:13:31 +01:00
}
2025-03-16 12:17:33 +01:00
func (d document) Assertion() []did.VerificationMethodSignature {
return []did.VerificationMethodSignature{d.signature}
2025-03-12 14:13:31 +01:00
}
2025-03-16 12:17:33 +01:00
func (d document) KeyAgreement() []did.VerificationMethodKeyAgreement {
return []did.VerificationMethodKeyAgreement{d.keyAgreement}
2025-03-12 14:13:31 +01:00
}
2025-03-16 12:17:33 +01:00
func (d document) CapabilityInvocation() []did.VerificationMethodSignature {
return []did.VerificationMethodSignature{d.signature}
2025-03-12 14:13:31 +01:00
}
2025-03-16 12:17:33 +01:00
func (d document) CapabilityDelegation() []did.VerificationMethodSignature {
return []did.VerificationMethodSignature{d.signature}
}
func stringSet(values ...string) []string {
res := make([]string, 0, len(values))
loop:
for _, str := range values {
for _, item := range res {
if str == item {
continue loop
}
}
res = append(res, str)
}
return res
2025-03-12 14:13:31 +01:00
}