Did you know? A coding or document-processing agent can receive a correctly formatted binary message and still have no trustworthy reason to act on it. CBOR Object Signing and Encryption (COSE) provides standard structures for signing and verifying concise binary messages, but reliable agent engineering must also decide which key is trusted, which exact bytes were signed, what purpose the message is authorised for, and whether it is still fresh. A valid signature authenticates a defined input under a key; it does not automatically grant the sender permission to trigger a payment, deployment or other external action.
The short answer is to parse the expected COSE object type, enforce an application-specific algorithm and key policy, rebuild the exact signature input specified by RFC 9052, verify the signature with a trusted verifier, check external authenticated context and detached payload bytes where applicable, and then independently apply authorisation, freshness and idempotency rules. Never let an unprotected header choose an arbitrary new trust anchor. Never call a successful cryptographic verification a completed business transaction without inspecting the external system’s result.
This guide addresses existing AI-agent systems that exchange structured data, not a claim that artificial superintelligence exists. It shows the mechanics, numerical worked cases, deceptive failure states, practical recovery paths and responsible use of the relevant IETF standards. Every fictional service, token and test result is labelled as an illustration rather than reported as an actual implementation.
Contents
- One signature check cannot stand in for an entire trust decision
- CBOR is a data representation, not a source of truth
- COSE_Sign and COSE_Sign1 solve related but different jobs
- Protected headers must be evaluated differently from unprotected headers
- The Sig_structure is the actual item passed to the signature algorithm
- External AAD binds context without adding it to the payload
- Detached payloads require exact bytes and strict association
- Algorithm identifiers and keys need a locally enforced policy
- Worked case: one signed instruction and twelve separately delivered manifests
- Replays and freshness require application data outside the signature equation
- Trusted key lookup is a security boundary, not a search task
- A precise verify-before-act workflow for agent systems
- Ten failure modes and what each repair actually changes
- Transfer exercise: the same signed bytes arrive in the wrong tenant
- Limits of COSE and evidence a reviewer should demand
- Frequently asked questions
- Primary standards and useful related reading
One signature check cannot stand in for an entire trust decision
Picture an agent receiving a signed instruction to approve a batch of invoices. The binary envelope decodes neatly and the signature verifies. A rushed implementation jumps from that result to the approval API. But the signer could be a legitimate testing key with no authority over production invoices. The envelope could be a replay of an older approval. The application might be verifying a general-purpose signature while treating its contents as a payment authorisation. The cryptographic fact is necessary only when the business contract says it is, and it is never the whole contract.
A better design separates four questions. Was the signed input constructed and verified correctly? Is the verifying key an acceptable trust anchor for this source and purpose? Does the verified payload request an operation that is authorised in this context? Is the request fresh and safe to perform once? These questions can be answered by separate deterministic components with explicit evidence. Combining them into a model-generated sentence such as ‘the certificate looks fine’ is too coarse for a consequential action.
COSE is a standard family of serialisation and cryptographic structures defined by the IETF. Its RFC 9052 describes the structures and processing, while RFC 9053 defines initial cryptographic algorithms. The object format helps parties agree on what data a signature covers. The parties still need a secure distribution and rotation policy for keys, a purpose-specific schema and control of the effects caused by verified data.
That separation is especially important for AI agents. A document may be genuine yet contain incorrect instructions, a valid developer message may refer to a stale version of a policy, and a signed message may not authorise the model to access additional accounts. Treat COSE verification as one well-defined tool receipt that the agent can consult, not a conversation-level claim of omniscient certainty.
The standards do not require an AI agent to be involved; conventional applications can use the same structures. Here the useful reader problem is orchestration: how to stop a language-driven workflow from treating cryptographic authenticity, current authority and completed execution as interchangeable states.
CBOR is a data representation, not a source of truth
Concise Binary Object Representation, or CBOR, represents structured data using compact binary encodings. It supports numbers, strings, arrays, maps and additional types. COSE builds signing and encryption structures around CBOR. A valid CBOR decode tells you how bytes are interpreted as data under a particular decoder. It does not tell you whether the decoded fields are honest, whether they mean what the sender claims, or whether they were signed by the key expected for the task.
A human often sees JSON or readable text in logs, but that view may not preserve original CBOR bytes. Diagnostic JSON can reorder fields, flatten tags or alter how binary byte strings appear. If a signature is defined over a particular byte string, verifying a reconstructed text display is the wrong operation. Keep the original received bytes or the exact protected-byte and payload-byte components needed by the protocol.
Within a COSE object, fields can include protected headers, unprotected headers, a payload and a signature or signatures. The term protected has a protocol meaning: a protected-header map is serialised into a byte string and included in the cryptographic signing input. An unprotected header is carried as metadata but is not itself authenticated by the signature. If a verifier relies on an unprotected value for a security-critical decision, it must use a separate trusted rule for that value.
RFC 9052 specifies that COSE messages may be tagged or untagged as allowed by context. A tag is a clue about object type, not a permit to ignore other validation. An attacker could provide bytes that decode as a different structure from what the application expected. Bind an endpoint or workflow to the precise COSE structure it accepts, and fail closed on unexpected or ambiguous types.
Do not invent your own interchangeable ‘binary JSON’ canonicalisation to make signatures pass. COSE’s signed structure and CBOR’s encoding rules are specific. Where an application needs deterministic CBOR encoding for interoperability, consult the applicable deterministic encoding profile and the actual signed bytes. A convenient pretty-printed form is useful for a person but not a substitute for the protocol’s defined verification input.
COSE_Sign and COSE_Sign1 solve related but different jobs
COSE supports more than one signing structure. COSE_Sign can carry one or more signatures associated with the same content. COSE_Sign1 is the compact single-signer form. The object is an array with protocol-defined positions, not a free-form bag of names that can be rearranged at will. The relevant section of RFC 9052 gives the exact array layouts and tags.
For the single-signer case, COSE_Sign1 contains the protected header bytes, an unprotected map, the payload or a null marker for detached content, and the signature bytes. A tagged Sign1 object uses CBOR tag 18. In a multi-signer COSE_Sign object, the outer structure contains shared headers and payload plus an array of signature structures. Each signature has its own applicable header information.
It would be a serious mistake to take a valid COSE_Sign1 signature byte string, place it in a COSE_Sign wrapper and conclude that the new wrapper has the same authenticity. The signing context differs. RFC 9052 explicitly defines context strings inside the to-be-signed structure, including ‘Signature1’ for the one-signer structure and ‘Signature’ for an individual signature in the multi-signer structure. These distinctions bind a valid signature to the intended format.
An agent receiving a vendor’s signed policy bundle should know in advance whether one authorised signer is sufficient or whether a separate multi-party policy applies. Simply counting the signatures present does not establish which signers were required. A two-signature object can still be unacceptable if both signatures are from unauthorised keys or if the application expected another provenance.
Use separate schema and verification test cases for Sign1 and Sign rather than a generic ‘verify any COSE’ entry point with permissive defaults. The complexity of multiple signers can be useful for provenance and migration, but should only be enabled when the recipient’s contract explains how many and which signatures must succeed.
Protected headers must be evaluated differently from unprotected headers
Both header buckets can describe content and algorithms, but a verifier must understand their distinct trust levels. Protected headers are encoded and included in what is signed; unprotected headers are transmitted alongside the payload without equivalent signature protection. An unprotected key identifier may be useful as a lookup hint, yet it must not override an application-defined list of acceptable keys or issuers.
Suppose an attacker changes an unprotected routing hint from ‘analytics’ to ‘billing’. The protected payload and signature might remain valid, depending on the envelope, but the receiving system must not allow that unauthenticated hint to switch the operation to billing. Route according to trusted endpoint context and fields that are properly authenticated and authorised. Even an authenticated field can be outside the sender’s privilege.
Algorithm selection is another sensitive boundary. The application should allow only the algorithms and key families appropriate to its trust contract. It should validate that the protected and unprotected header parameters are consistent with the selected verification policy, including the restrictions on where particular parameters may appear under the standard. Do not silently choose whichever algorithm a caller suggests merely because the cryptographic library recognises it.
A key identifier is not itself a public key. It can help locate an entry in a trusted, maintained key registry. The verification process must bind that entry to the expected issuer, audience, operation and active lifecycle. A matching name on an attacker-controlled key server is not equivalent to an authorised local trust anchor.
Test conflicting header cases. If two buckets make incompatible assertions or a parameter appears where it is not allowed, the verifier should reject the message according to the standard and application policy. A successful CBOR parse with an inconsistent security meaning should not be reported to the agent as verified.
The Sig_structure is the actual item passed to the signature algorithm
The signing input is not simply the raw payload and not simply the transmitted envelope. RFC 9052 defines a Sig_structure array whose fields include a context string, protected-header bytes, externally supplied authenticated data and the payload bytes. In the multiple-signer structure, the signer-specific protected headers are also represented. The array is encoded to a byte string called ToBeSigned, and the selected signature algorithm operates on those bytes.
For a single-signer Sign1 message, the context is ‘Signature1’. The body protected parameter is a byte string containing the serialised protected map, or an empty byte string when no protected parameters are present. External additional authenticated data is a byte string supplied by the application; absent application data means a zero-length byte string, not an arbitrary string representing an empty object. The payload is the byte string to be protected, even when it is transported separately.
This construction prevents several tempting mistakes. A verifier that signs a JSON display of the payload rather than the actual payload bytes checks a different statement. A verifier that changes the context to ‘Signature’ changes the signed input. A verifier that drops external authenticated data changes the signed input. Each difference can make verification fail or, worse, hide an interoperability bug when both ends implement the same nonstandard shortcut.
Do not assume that reserialising a decoded protected map with another encoder always recreates the exact original protected-byte field. Preserve and use the protected byte string as required by the verification rules. Application data included in external AAD must also be constructed identically on both sides, with specified field encodings and lengths. Such byte-exact expectations should be unit-tested with published vectors.
Security reviews should examine the step that assembles the Sig_structure, not just the call to a cryptographic primitive. Cryptography libraries can correctly verify the bytes they are given while the application has constructed the wrong bytes. The standard helps teams know which exact input the signature is intended to protect.
External AAD binds context without adding it to the payload
External additional authenticated data, usually called external AAD, lets the application bind context to the signature while carrying that context outside the COSE object. Consider the same signed instruction used in two possible systems: a staging simulator and an authorised production service. If the sender and recipient agree to include a deployment-context identifier as external AAD, copying an otherwise identical envelope into the wrong context causes verification to fail.
That protection works only when the receiver obtains the AAD from trusted local context rather than allowing the message itself to declare the context it wishes to be checked against. If the message can choose between ‘staging’ and ‘production’, the separation has no value. The same principle applies to tenant identity, protocol version and a purpose-specific endpoint identifier.
The exact AAD bytes are part of the signature input, so byte order and field encoding matter. A string ‘team-7’ encoded in UTF-8 is not automatically equivalent to a CBOR object containing that string, and a zero-length byte string is not the same as a four-byte textual ‘null’. Define one application serialisation and test it across language runtimes.
Do not treat AAD as a confidentiality mechanism. It authenticates context under the signature when verified correctly; it does not encrypt the payload or hide the context from observers. If confidential data is needed, use an appropriate encryption and access-control design that meets the data’s threat model.
A useful testing matrix signs one payload under context A and tries to verify it under A and B. The expected outcome is success for the authorised matching context and failure for the changed context. These tests are more diagnostic than a single ‘signature verifies’ assertion because they exercise the binding that gives external AAD its purpose.
Detached payloads require exact bytes and strict association
COSE allows the payload to travel separately from the signed object. A detached Sign1 message carries a null value in the payload position, and the application supplies the real payload bytes to the verifier. This saves a redundant copy when the data is already distributed through another channel, but increases the risk of pairing the signature with the wrong version or object.
Imagine an agent that retrieves a policy manifest from object storage and receives a COSE signature from a separate metadata service. The policy was revised while the agent was working. If the agent verifies the signature over yesterday’s bytes but displays today’s policy, or verifies today’s bytes but acts on a cached earlier interpretation, it has lost the link between authenticated content and action. The signed payload bytes must be the very bytes parsed for the decision.
Treat payload retrieval as a bounded, versioned operation. Record the expected object identity, byte length or digest under trusted policy where available, fetch the content without silently changing line endings or encodings, verify the COSE signature against that exact byte string, and parse those verified bytes. Avoid a second unguarded fetch between verification and execution that could return a different version.
The detached-payload rule is not equivalent to signing a hash unless the application specifically defines a signature over a hash representation as its payload. The COSE signature input includes the designated payload bytes. If a system signs a digest in an application-specific payload field, that design needs additional rules and security review to associate the digest with the content.
One practical error is treating a null payload slot as an instruction to sign the empty string. For detached content, the verifier must supply the actual payload to the Sig_structure. Testing both attached and detached cases with the same known content can reveal this mistake before it affects production.
Algorithm identifiers and keys need a locally enforced policy
RFC 9053 provides initial COSE algorithm definitions. For instance, its table defines ES256 with value −7, combining ECDSA and SHA-256 under the specified key and curve conventions. The number is an algorithm identifier, not a universal indicator of strength, suitability or authorisation. A receiving agent must know which algorithms it accepts for each issuing authority and purpose.
Cryptographic agility does not mean enabling every library algorithm. A verifier should reject unexpected algorithm identifiers, incompatible key types, inadequate key material and attempts to downgrade to weaker or irrelevant schemes. The choice of accepted algorithms belongs to the trusted application configuration. An untrusted payload or an unprotected hint should never expand that policy.
Key lifecycle matters. A key can be valid cryptographically yet revoked, expired under a local policy, reassigned to another tenant or compromised. Bind verification to the key’s trusted issuer identity and authorisation scope, track active and previous keys during approved rotation, and reject signatures that cannot be placed inside the required validity context. COSE alone does not define the complete business rules for that lifecycle.
For interoperability, use tested cryptographic libraries and the official test vectors. Manual implementation of ECDSA, EdDSA or elliptic curve arithmetic is almost never warranted in a document-processing agent. Even a correct mathematical primitive can fail to meet protocol needs if signature encoding, key encoding or algorithm restrictions differ from the RFC.
Record which verifier and key-set version accepted the message, without exposing secret key material. This makes later incident analysis possible when a key is revoked and historical actions need review. Avoid logging raw sensitive payloads unnecessarily; a digest and controlled access to the original evidence can be more appropriate for an audit.
Worked case: one signed instruction and twelve separately delivered manifests
Consider a fictional deployment coordinator. It receives twelve policy manifests, each 512 bytes long, for a total of 12 × 512 = 6,144 bytes of content. This is only a teaching example; the actual COSE signature length depends on the selected algorithm and representation. Suppose each manifest has its own separately associated COSE_Sign1 message, and the recipient already has a trusted key record for the correct policy issuer.
The verification pipeline checks the application contract, obtains the exact 512 bytes for each detached payload, constructs the prescribed Sig_structure including the agreed environment AAD, validates the signature and then checks the policy authorisation and freshness. In a contrived test, nine manifests pass every gate, two fail cryptographic verification because their bytes were changed, and one has a valid signature but names a production operation outside the signer’s assigned scope.
Cryptographic signature acceptance is therefore ten of twelve, or 10/12 = 83.33%, in this invented batch. Operational acceptance is only nine of twelve, or 9/12 = 75%. The difference matters: one instruction was authentically signed but still lacked permission. Reporting ‘ten authorised changes’ would be false, and reporting ‘three forged signatures’ would also be false. The two altered payloads failed authentication; the third item failed authorisation.
Suppose the operator later rechecks the changed documents using the exact bytes and determines that the two signature failures came from a transport transformation. That would explain the mismatch but would not make the old verification result valid. The proper repair is a new, verified distribution of the authorised bytes, not a request to ignore signature failure because a human can visually recognise the document.
Now calculate the impact of an agent incorrectly batching all twelve operations into one side-effectful call before checking authorisation. Three unsafe operations might be attempted even though the verifier had enough information to stop them. The safer order is verify and authorise each unit, then submit only the nine permitted operations. If the external service accepts only a batch, the application needs its own atomicity and partial-result contract.
Nothing in this example claims an actual incident or suggests COSE determines the business policy. It shows why a correct cryptographic percentage and a correct operational success percentage can be different, and why transparent denominators make a safety review more useful.
Replays and freshness require application data outside the signature equation
A correct COSE signature can be replayed unchanged if an attacker can copy a previously signed envelope. The signature still verifies because the signed content and key are unchanged. Whether that replay is acceptable depends on the application. A signed public software release announcement may be safely read many times; a signed one-time transfer instruction may not be safely executed twice.
Build replay controls around a signed or externally authenticated identifier, issuer, purpose, expected recipient and validity interval, with a durable record of completed actions where needed. The acceptable window should account for clock skew and the threat model. A nonce provides little protection if the recipient does not remember or independently validate it. Likewise, a timestamp in an unprotected header cannot be trusted merely because a signature elsewhere in the envelope verifies.
Consider a fictional expiry rule: a command is accepted only if it is no more than 15 seconds old according to an authenticated issue time and a reliable local clock. A message issued at a monotonic-equivalent reference of 35,000 milliseconds and received at 45,000 milliseconds is 10,000 milliseconds old and within the 15,000-millisecond allowance. The same message received at 70,000 milliseconds is 35,000 milliseconds old and should be rejected. These comparisons are arithmetic illustrations; real systems must define wall-clock, skew, delayed delivery and trust in the signed timestamp.
Even during the allowed time window, one signed command might be accepted twice unless the recipient uses a durable operation identifier and idempotency policy. Network retries after uncertain outcomes require reading the original operation’s status before calling it again. Replay prevention and idempotent execution are related but distinct: one stops unauthorised repeats, while the other handles legitimate repeated delivery predictably.
Do not store every raw signed message indefinitely as a shortcut. Retain only the identifiers and evidence necessary for the risk model, according to data-retention requirements. Define how logs survive service restarts and replication, or a fresh server may unintentionally accept a repeat that a previous instance already processed.
Trusted key lookup is a security boundary, not a search task
An untrusted envelope may carry a key identifier or issuer hint. A naive agent treats the hint as a URL, fetches a public key from that location and accepts the signature. An attacker can then sign with their own key and supply their own location. The cryptographic operation succeeds, but it authenticates only the attacker’s self-selected key, not an approved sender.
Key discovery must start from a separately established trust anchor or authenticated metadata policy. A locally configured issuer may have a defined key-distribution endpoint, expected key types and rotation rules. The agent may query that trusted source through controlled tools, but an arbitrary link inside the signed message does not define a new issuer. This is a common form of confusion between syntax and authority.
Multi-tenant systems need additional checks. A key valid for tenant A cannot authorise operations for tenant B just because both tenants use the same signature format. Tenant identity, resource scope and operation type should be bound to trusted authenticated context and then checked by the recipient. Audit receipts should include the effective issuer and tenant after policy evaluation rather than just a free-form claim from the payload.
When key rotation is in progress, both old and new keys may be acceptable for a carefully bounded transition. The verifier needs an explicit policy about issue times, revocations, overlap windows and proof of activation. A signature that was created before a revocation may require a different handling policy from a new message signed after the key should no longer be trusted. The standard encoding cannot decide those policy questions.
The external system that finally performs a side effect must enforce its own authorisation too. An AI agent’s approval text is not a credential. A verifier’s receipt should become a scoped input to a trusted execution component, not an unlimited pass allowing the agent to perform any action the payload describes.
A precise verify-before-act workflow for agent systems
Begin with a trusted task contract: expected origin, accepted COSE object family, payload content type, maximum size, signature algorithm and key registry, external AAD construction, freshness rules, replay policy and allowed downstream actions. Reject anything that cannot be mapped to one explicit contract. The contract should come from configuration and the user’s authorised request, not from instructions hidden inside an incoming document.
Parse the structure under resource limits. A malicious message can be oversized, recursively complex or otherwise crafted to exhaust resources even before signature verification. Validate CBOR structure and COSE object type using a well-maintained implementation; put bounds on field sizes, nesting and permitted extensions. Distinguish malformed transport data from a validly formed message with a bad signature.
Resolve a verifier from trusted local policy and assemble the RFC-defined signature input using the original protected bytes, actual payload bytes and correct external AAD. Verify the algorithm under the accepted key constraints. If it fails, stop before the application acts. Do not try alternative contexts, fallback keys or transforms repeatedly until something passes unless a narrowly specified protocol requires that behaviour.
Next parse and validate the authenticated payload into a typed domain object. Enforce required fields, ranges, identities, purpose, recipient and version. Check whether the signer is authorised for this requested operation at the effective time. Apply replay and idempotency guards, then call the downstream service using scoped credentials and separately verify its response.
Maintain distinct receipts for received, parsed, signature-verified, authorisation-approved, submitted, externally confirmed and completed. A timeout after submission is an uncertain state, not evidence that the side effect failed. Reconcile through the downstream system’s authoritative operation identifier rather than treating the signature receipt as proof of completion.
Ten failure modes and what each repair actually changes
Failure one is verifying the visible JSON rendering instead of the CBOR-defined signature input. Repair it by using the required Sig_structure and byte strings. Failure two is substituting an empty payload when detached content is present. Supply the exact detached bytes and verify before parsing. Failure three is confusing COSE_Sign with COSE_Sign1. Require the expected object type and its context string.
Failure four is trusting an unprotected algorithm or key-location hint as permission to choose a new key. Repair it with a local allowlist and issuer-key mapping. Failure five is reserialising protected headers in an incompatible way. Preserve and process the actual protected bytes as the standard specifies. Failure six is omitting external AAD and accidentally accepting the same signature in the wrong tenant or environment. Bind the intended context through a byte-exact contract.
Failure seven is assuming a valid signature means the operation is authorised. Check signer privileges, recipient and resource scope separately. Failure eight is accepting an old but valid command repeatedly. Add signed freshness data and durable replay or idempotency checks appropriate to the task. Failure nine is reporting a successful payment because verification passed. Read the authoritative payment result and distinguish accepted, pending, rejected and uncertain states.
Failure ten is trying to repair a signature failure by lowering cryptographic policy or using an unauthorised alternative key. Fail closed and diagnose the actual mismatch through test vectors and logged byte-level metadata. A developer can repair the sender’s encoding or distribution while preserving the policy; a failed gate should not be weakened simply to satisfy a demo.
Across these failures, the repeated misconception is treating one useful signal as an all-purpose verdict. Precise receipts let maintainers see the first broken gate and prevent an agent from converting partial evidence into a confident narrative of success.
Transfer exercise: the same signed bytes arrive in the wrong tenant
Imagine two authorised customers, North and South, using the same receiving service. North sends a properly signed 1,024-byte inventory instruction; the signature is correct under North’s configured key. A forwarding mistake delivers its COSE object to South’s tenant endpoint. South recognises the algorithm and verifies the signature against a shared unrestricted key pool. Should it execute the instruction? No: cryptographic validity alone does not prove tenant-specific authorisation.
The first repair is separate trust selection. South’s endpoint resolves accepted issuer keys from its own trusted contract and checks a signed or externally authenticated audience and tenant binding. If the correct North key is not authorised for South, the instruction fails authorisation even though a general-purpose signature primitive would return true under that key. If external AAD includes a tenant-specific context, using South’s correct AAD can also make the signature itself fail.
Change the case again: the instruction is legitimately intended for both customers and has been signed by an authorised platform key. The application still needs a clear multi-tenant business policy that allows that platform issuer to operate on both inventories, and an unambiguous target resource in the authenticated payload. A universal platform key does not make every possible action safe.
Suppose South processes 40 validly formatted messages in a demonstration. Thirty-six have signatures that verify under the relevant allowed keys, but only 34 have valid South-scope permissions, and two fail the tenant check. Signature acceptance is 36/40 = 90%; application authorisation is 34/40 = 85%. These figures are invented to practise separate denominators, not observed platform reliability numbers.
The lesson transfers from binary envelopes to any signed resource: a valid proof says something precise about bytes and keys, while safe action requires identity, purpose, audience, freshness and verified downstream outcome. None of those missing decisions can be supplied merely by a language model’s confident answer.
Limits of COSE and evidence a reviewer should demand
COSE can provide message-authentication and encryption structures under chosen algorithms; it cannot, by format alone, certify that a payload is truthful or safe. An attacker who steals an authorised private key can generate valid signatures. A legitimate signer can issue a mistaken instruction. A correct signature can accompany stale data. Application validation and organisational controls must address each problem separately.
Not every application needs COSE. Text-oriented protocols may use other established signing profiles with different trade-offs. Choosing CBOR and COSE can be sensible for constrained devices or machine-readable structured records, but it introduces requirements for binary diagnostics, exact byte handling and interoperable key management. Do not replace a working, well-understood profile simply because a concise binary encoding looks technically sophisticated.
This guide does not specify a production key-management architecture or promise compliance with a security standard. Choice of algorithm, key storage, trust roots and replay windows must follow the system’s actual threat model and applicable standards. Cryptographic implementation should rely on reviewed libraries and current guidance, not hand-written arithmetic copied from an article.
Source dates matter. RFC 9052 and RFC 9053 were published in August 2022, and relevant updates, errata or algorithm registry entries may affect later implementation choices. A project must confirm the version and current registry rules at implementation time. General explanations here are anchored to these primary documents, not an unverified claim that every platform implements them identically.
The examples deliberately use fictional bytes, timestamps and authorisation outcomes. No live signature, cloud account, deployment or invoice was generated or verified for this article. The responsible operational claim is bounded by the evidence actually available to the verifier.
Frequently asked questions
Does COSE work only for artificial intelligence? No. It is an IETF family of CBOR-based security structures usable by conventional systems. An AI agent may consume a verification receipt, but the cryptographic decision should be made by tested deterministic code.
What does COSE_Sign1 contain? It contains protected header bytes, an unprotected header map, a payload or detached marker, and a signature. Its signing context differs from multi-signer COSE_Sign.
Are unprotected headers useless? No. They can carry useful routing or metadata hints. But an application must not trust their unauthenticated values to grant authority or select arbitrary trust anchors.
What is external AAD? It is application-supplied additional authenticated data included in the signature computation even though it is not part of the transported COSE object’s payload. Both sides must use the correct exact bytes.
Can a detached payload be empty? The transport can carry a null marker for detached content. The verifier must supply the actual content bytes for the signature input. Empty content is a separate deliberate case, not an automatic interpretation of detached mode.
Does a valid signature stop replay? No. An unchanged signed message can still be replayed. Recipients must define freshness, nonce, operation identity and idempotency rules if repeat execution is unsafe.
Can the sender choose any public key that verifies? No. The verifier must start from trusted application policy and expected issuer scope, not a new key URL in the untrusted envelope.
What does a verified message prove? It proves that the selected cryptographic verification over the defined input succeeded under the chosen key and algorithm. It does not by itself prove business authorisation, content truth or completed side effects.
Where should implementers start? Read the actual RFC 9052 signing structures and RFC 9053 algorithm restrictions, implement published test vectors, and write negative tests for wrong context, modified payload, changed AAD, expired authority and replay.
Primary standards and useful related reading
The central standards are RFC 9052, COSE Structures and Process and RFC 9053, Initial Algorithms. These explain structure, protected and unprotected headers, Sig_structure formation, detached payloads and algorithm/key requirements. For foundational CBOR representation, see RFC 8949, Concise Binary Object Representation. Check official errata and applicability for any implementation.
If you already use signed HTTP requests, compare this distinct binary-envelope mechanism with HTTP Message Signatures. That profile signs specified HTTP components; it is not a drop-in replacement for a COSE Sign1 envelope. For text payloads and deterministic serialisation, JSON canonicalisation addresses a different byte-consistency problem.
Agent operators can turn the concepts into a review checklist: exact object type, trusted key, allowed algorithm, protected-header handling, actual payload bytes, external AAD, schema/authority, freshness, replay control, and externally verified outcome. If the agent cannot name the gate at which a check failed, it should report uncertainty rather than claim a generic success.
Continue through the verified How Super Intelligence Works hub and the Gold Standard of Education for broader first-principles reasoning and transfer. The standards define the technology; the worked service and numerical examples are original teaching illustrations only.