-
Notifications
You must be signed in to change notification settings - Fork 30
Add support for CWT Claims & Type in Protected Headers #183
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
bc4610a
25991e9
203b417
adc1599
a379d94
1a0f2e1
c7cee92
026b364
a0aff97
65cbebc
9c30e67
51788e9
acc2fef
53cc3cc
479710f
c9f2ab1
4c57853
1980457
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| package cose | ||
|
|
||
| // https://www.iana.org/assignments/cwt/cwt.xhtml | ||
| const ( | ||
| CWTClaimIssuer int64 = 1 | ||
| CWTClaimSubject int64 = 2 | ||
| CWTClaimAudience int64 = 3 | ||
| CWTClaimExpirationTime int64 = 4 | ||
| CWTClaimNotBefore int64 = 5 | ||
| CWTClaimIssuedAt int64 = 6 | ||
| CWTClaimCWTID int64 = 7 | ||
| CWTClaimConfirmation int64 = 8 | ||
| CWTClaimScope int64 = 9 | ||
|
|
||
| // TODO: the rest upon request | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think it is smart to add the whole registry in the first PR.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Based on the above, it looks like we have the minimal code needed to proceed.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should add what is bare minimum required, and then extend it when a new point needs to be registered!
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Sorry, I have probably missed the right conversations, but I am not sure I get what the strategy is. There are 10's of claims already registered. What is the criterion for promoting them from the CWT Claims registry to I think we should explicitly document how to add new claims here. |
||
| ) | ||
|
|
||
| // CWTClaims contains parameters that are to be cryptographically | ||
| // protected. | ||
| type CWTClaims map[any]any | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| package cose_test | ||
|
|
||
| import ( | ||
| "crypto/ecdsa" | ||
| "crypto/elliptic" | ||
| "crypto/rand" | ||
| "fmt" | ||
|
|
||
| "github.com/veraison/go-cose" | ||
| ) | ||
|
|
||
| // This example demonstrates signing and verifying COSE_Sign1 signatures. | ||
| func ExampleCWTMessage() { | ||
|
|
||
OR13 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // create message to be signed | ||
| msgToSign := cose.NewSign1Message() | ||
| msgToSign.Payload = []byte("hello world") | ||
| msgToSign.Headers.Protected.SetAlgorithm(cose.AlgorithmES512) | ||
|
|
||
| msgToSign.Headers.Protected.SetType("application/cwt") | ||
| claims := make(cose.CWTClaims) | ||
| claims[cose.CWTClaimIssuer] = "issuer.example" | ||
| claims[cose.CWTClaimSubject] = "subject.example" | ||
SteveLasker marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| msgToSign.Headers.Protected.SetCWTClaims(claims) | ||
|
|
||
| msgToSign.Headers.Unprotected[cose.HeaderLabelKeyID] = []byte("1") | ||
|
|
||
| // create a signer | ||
| privateKey, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) | ||
| if err != nil { | ||
| panic(err) | ||
| } | ||
| signer, err := cose.NewSigner(cose.AlgorithmES512, privateKey) | ||
| if err != nil { | ||
| panic(err) | ||
| } | ||
|
|
||
| // sign message | ||
| err = msgToSign.Sign(rand.Reader, nil, signer) | ||
| if err != nil { | ||
| panic(err) | ||
| } | ||
| sig, err := msgToSign.MarshalCBOR() | ||
| // uncomment to review EDN | ||
| // coseSign1Diagnostic, err := cbor.Diagnose(sig) | ||
| // fmt.Println(coseSign1Diagnostic) | ||
OR13 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| if err != nil { | ||
| panic(err) | ||
| } | ||
| fmt.Println("message signed") | ||
|
|
||
| // create a verifier from a trusted public key | ||
| publicKey := privateKey.Public() | ||
| verifier, err := cose.NewVerifier(cose.AlgorithmES512, publicKey) | ||
| if err != nil { | ||
| panic(err) | ||
| } | ||
|
|
||
| // verify message | ||
| var msgToVerify cose.Sign1Message | ||
| err = msgToVerify.UnmarshalCBOR(sig) | ||
| if err != nil { | ||
| panic(err) | ||
| } | ||
| err = msgToVerify.Verify(nil, verifier) | ||
| if err != nil { | ||
| panic(err) | ||
| } | ||
| fmt.Println("message verified") | ||
|
|
||
| // tamper the message and verification should fail | ||
| msgToVerify.Payload = []byte("foobar") | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. for this test, it might be better to tamper with the protected header. |
||
| err = msgToVerify.Verify(nil, verifier) | ||
| if err != cose.ErrVerification { | ||
| panic(err) | ||
| } | ||
| fmt.Println("verification error as expected") | ||
| // Output: | ||
| // message signed | ||
| // message verified | ||
| // verification error as expected | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.