Skip to content

Commit 9e4d760

Browse files
authored
Merge pull request #727 from axone-protocol/feat/sign-purpose
🔐 Allow choose proof purpose when signing VC
2 parents 6832b9a + 643dab4 commit 9e4d760

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

client/credential/sign.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const (
3636
flagOverwrite = "overwrite"
3737
flagDate = "date"
3838
flagSchemaMap = "schema-map"
39+
flagPurpose = "purpose"
3940
)
4041

4142
const (
@@ -65,6 +66,9 @@ It will read a verifiable credential from a file (or stdin), sign it, and print
6566
"Multiple mappings can be provided by repeating the flag. Example usage: "+
6667
"--%[1]s originalURI1=alternativeURI1 --%[1]s originalURI2=alternativeURI2",
6768
flagSchemaMap))
69+
cmd.Flags().String(flagPurpose, "assertionMethod", "Proof that describes credential purpose, helps prevent it from being "+
70+
"misused for some other purpose. Example of commonly used proof purpose values: "+
71+
"authentication, assertionMethod, keyAgreement, capabilityDelegation, capabilityInvocation.")
6872

6973
_ = cmd.MarkFlagRequired(flags.FlagFrom)
7074

@@ -102,7 +106,6 @@ func runSignCmd(cmd *cobra.Command, args []string) error {
102106
return err
103107
}
104108
documentLoader := newDocumentLoader(schemaMap)
105-
106109
vc, err := loadVerifiableCredential(documentLoader, bs)
107110
if err != nil {
108111
return errorsmod.Wrapf(sdkerr.ErrInvalidRequest, "failed to load verifiable credential: %v", err)
@@ -115,12 +118,15 @@ func runSignCmd(cmd *cobra.Command, args []string) error {
115118
if overrideProofs {
116119
vc.Proofs = nil
117120
}
118-
119121
date, err := parseStringAsDate(cmd, flagDate)
120122
if err != nil {
121-
return err
123+
return errorsmod.Wrapf(sdkerr.ErrInvalidType, "%s is not a valid date: %v", flagDate, err)
124+
}
125+
purpose, err := cmd.Flags().GetString(flagPurpose)
126+
if err != nil {
127+
return errorsmod.Wrapf(sdkerr.ErrInvalidType, "%s is not a valid string: %v", flagPurpose, err)
122128
}
123-
err = signVerifiableCredential(documentLoader, vc, signer, date)
129+
err = signVerifiableCredential(documentLoader, vc, signer, date, purpose)
124130
if err != nil {
125131
return errorsmod.Wrapf(sdkerr.ErrInvalidRequest, "failed to sign: %v", err)
126132
}
@@ -245,7 +251,7 @@ func loadVerifiableCredential(documentLoader ld.DocumentLoader, bs []byte) (*ver
245251
}
246252

247253
func signVerifiableCredential(
248-
documentLoader ld.DocumentLoader, vc *verifiable.Credential, signer KeyringSigner, date time.Time,
254+
documentLoader ld.DocumentLoader, vc *verifiable.Credential, signer KeyringSigner, date time.Time, purpose string,
249255
) error {
250256
didKeyID, err := signer.DIDKeyID()
251257
if err != nil {
@@ -265,6 +271,7 @@ func signVerifiableCredential(
265271
Suite: ed25519signature2020.New(suite.WithSigner(signer)),
266272
SignatureRepresentation: verifiable.SignatureProofValue,
267273
VerificationMethod: didKeyID,
274+
Purpose: purpose,
268275
}, jsonld.WithDocumentLoader(documentLoader))
269276
case *secp256k1.PubKey:
270277
return vc.AddLinkedDataProof(&verifiable.LinkedDataProofContext{
@@ -273,6 +280,7 @@ func signVerifiableCredential(
273280
Suite: ecdsasecp256k1signature2019.New(suite.WithSigner(signer)),
274281
SignatureRepresentation: verifiable.SignatureJWS,
275282
VerificationMethod: didKeyID,
283+
Purpose: purpose,
276284
}, jsonld.WithDocumentLoader(documentLoader))
277285
default:
278286
return fmt.Errorf("invalid pubkey type: %s; expected oneof %+q",

docs/command/axoned_credential_sign.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ axoned credential sign [file] [flags]
2121
--keyring-backend string Select keyring's backend (os|file|kwallet|pass|test|memory) (default "test")
2222
--keyring-dir string The client Keyring directory; if omitted, the default 'home' directory will be used
2323
--overwrite Overwrite existing signatures with a new one. If disabled, new signature will be appended
24+
--purpose string Proof that describes credential purpose, helps prevent it from being misused for some other purpose. Example of commonly used proof purpose values: authentication, assertionMethod, keyAgreement, capabilityDelegation, capabilityInvocation. (default "assertionMethod")
2425
--schema-map strings Map original URIs to alternative URIs for resolving JSON-LD schemas. Useful for redirecting network-based URIs to local filesystem paths or other URIs. Each mapping should be in the format 'originalURI=alternativeURI'. Multiple mappings can be provided by repeating the flag. Example usage: --schema-map originalURI1=alternativeURI1 --schema-map originalURI2=alternativeURI2
2526
```
2627

0 commit comments

Comments
 (0)