gose/cose/sign1
COSE_Sign1 single-signer signing and verification (RFC 9052).
Example
import gose/algorithm
import gose/cose/sign1
import gose/key
import kryptos/ec
let k = key.generate_ec(ec.P256)
let payload = <<"hello":utf8>>
let assert Ok(signed) =
sign1.new(algorithm.Ecdsa(algorithm.EcdsaP256))
|> sign1.sign(k, payload)
let data = sign1.serialize(signed)
let assert Ok(parsed) = sign1.parse(data)
let assert Ok(verifier) =
sign1.verifier(algorithm.Ecdsa(algorithm.EcdsaP256), keys: [k])
let assert Ok(Nil) = sign1.verify(verifier, parsed)
Phantom Types
Sign1(state) uses a phantom type to track signing state:
Unsigned: created vianew, ready to signSigned: signed or parsed, can be serialized or verified
Algorithm Pinning
Each verifier is pinned to a single algorithm. The token’s protected
header alg must match the verifier’s expected algorithm.
Types
Values
pub fn content_type(
message: Sign1(Signed),
) -> Result(cose.ContentType, gose.GoseError)
Extract the content type from the message headers.
pub fn critical(
message: Sign1(Signed),
) -> Result(List(Int), gose.GoseError)
Extract the critical header labels from the message headers.
pub fn kid(
message: Sign1(Signed),
) -> Result(BitArray, gose.GoseError)
Extract the key ID from the message headers.
pub fn new(alg: algorithm.DigitalSignatureAlg) -> Sign1(Unsigned)
Create a new unsigned COSE_Sign1 message with the given signature algorithm in the protected header.
pub fn parse(
data: BitArray,
) -> Result(Sign1(Signed), gose.GoseError)
Decode a CBOR-encoded COSE_Sign1 message, accepting both tagged and untagged forms.
pub fn payload(message: Sign1(Signed)) -> Result(BitArray, Nil)
Return the payload from a signed message. Returns Error(Nil) if detached.
pub fn protected_headers(
message: Sign1(Signed),
) -> List(cose.Header)
Return the raw protected headers.
pub fn serialize(message: Sign1(Signed)) -> BitArray
Encode a signed message as an untagged CBOR COSE_Sign1 array.
pub fn serialize_tagged(message: Sign1(Signed)) -> BitArray
Encode a signed message as a CBOR-tagged (tag 18) COSE_Sign1 structure.
pub fn sign(
message: Sign1(Unsigned),
key key: key.Key(BitArray),
payload payload: BitArray,
) -> Result(Sign1(Signed), gose.GoseError)
Sign the payload with the given key, producing a signed COSE_Sign1 message.
pub fn unprotected_headers(
message: Sign1(Signed),
) -> List(cose.Header)
Return the raw unprotected headers.
pub fn verifier(
alg: algorithm.DigitalSignatureAlg,
keys keys: List(key.Key(BitArray)),
) -> Result(Verifier, gose.GoseError)
Build a verifier pinned to a single algorithm and one or more keys.
pub fn verify(
verifier: Verifier,
message message: Sign1(Signed),
) -> Result(Nil, gose.GoseError)
Verify the signature of a signed COSE_Sign1 message against the verifier’s expected algorithm and keys.
pub fn verify_detached(
verifier: Verifier,
message message: Sign1(Signed),
payload payload: BitArray,
) -> Result(Nil, gose.GoseError)
Verify the signature of a detached-payload COSE_Sign1 message.
The caller must supply the payload that was detached from the message. Returns an error if the message already contains an embedded payload.
pub fn verify_detached_with_aad(
verifier: Verifier,
message message: Sign1(Signed),
payload payload: BitArray,
aad aad: BitArray,
) -> Result(Nil, gose.GoseError)
Verify a detached-payload COSE_Sign1 message with external AAD.
pub fn verify_with_aad(
verifier: Verifier,
message message: Sign1(Signed),
aad aad: BitArray,
) -> Result(Nil, gose.GoseError)
Verify the signature with additional externally-supplied authenticated data (AAD).
pub fn with_aad(
message: Sign1(Unsigned),
aad aad: BitArray,
) -> Sign1(Unsigned)
Set external additional authenticated data (AAD) for the signing operation.
pub fn with_content_type(
message: Sign1(Unsigned),
ct ct: cose.ContentType,
) -> Sign1(Unsigned)
Add a content type to the unprotected headers.
RFC 9052 permits either bucket. Signed messages place it in unprotected,
consistent with with_kid.
pub fn with_critical(
message: Sign1(Unsigned),
labels labels: List(Int),
) -> Sign1(Unsigned)
Add critical header labels to the protected headers.