104 lines
3.1 KiB
Go
104 lines
3.1 KiB
Go
package didkey
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/url"
|
|
|
|
"github.com/INFURA/go-did"
|
|
)
|
|
|
|
var _ did.Document = &document{}
|
|
|
|
type document struct {
|
|
id did.DID
|
|
signature did.VerificationMethodSignature
|
|
keyAgreement did.VerificationMethodKeyAgreement
|
|
}
|
|
|
|
func (d document) MarshalJSON() ([]byte, error) {
|
|
// It's unclear where the KeyAgreement should be.
|
|
// Maybe it doesn't matter, but the spec contradict itself.
|
|
// See https://github.com/w3c-ccg/did-key-spec/issues/71
|
|
|
|
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 []did.VerificationMethod `json:"keyAgreement,omitempty"`
|
|
CapabilityInvocation []string `json:"capabilityInvocation,omitempty"`
|
|
CapabilityDelegation []string `json:"capabilityDelegation,omitempty"`
|
|
}{
|
|
Context: stringSet(
|
|
did.JsonLdContext,
|
|
d.signature.JsonLdContext(),
|
|
d.keyAgreement.JsonLdContext(),
|
|
),
|
|
ID: d.id.String(),
|
|
AlsoKnownAs: nil,
|
|
VerificationMethod: []did.VerificationMethod{d.signature},
|
|
Authentication: []string{d.signature.ID()},
|
|
AssertionMethod: []string{d.signature.ID()},
|
|
KeyAgreement: []did.VerificationMethod{d.keyAgreement},
|
|
CapabilityInvocation: []string{d.signature.ID()},
|
|
CapabilityDelegation: []string{d.signature.ID()},
|
|
})
|
|
}
|
|
|
|
func (d document) ID() did.DID {
|
|
return d.id
|
|
}
|
|
|
|
func (d document) Controllers() []did.DID {
|
|
// no controller for did:key, no changes are possible
|
|
return nil
|
|
}
|
|
|
|
func (d document) AlsoKnownAs() []url.URL {
|
|
return nil
|
|
}
|
|
|
|
func (d document) VerificationMethods() map[string]did.VerificationMethod {
|
|
return map[string]did.VerificationMethod{
|
|
d.signature.ID(): d.signature,
|
|
d.keyAgreement.ID(): d.keyAgreement,
|
|
}
|
|
}
|
|
|
|
func (d document) Authentication() []did.VerificationMethodSignature {
|
|
return []did.VerificationMethodSignature{d.signature}
|
|
}
|
|
|
|
func (d document) Assertion() []did.VerificationMethodSignature {
|
|
return []did.VerificationMethodSignature{d.signature}
|
|
}
|
|
|
|
func (d document) KeyAgreement() []did.VerificationMethodKeyAgreement {
|
|
return []did.VerificationMethodKeyAgreement{d.keyAgreement}
|
|
}
|
|
|
|
func (d document) CapabilityInvocation() []did.VerificationMethodSignature {
|
|
return []did.VerificationMethodSignature{d.signature}
|
|
}
|
|
|
|
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
|
|
}
|