RFC 9052 COSE 结构 2022 年 8 月
Schaad 标准跟踪 [页]
流:
互联网工程任务组(IETF)
RFC:
9052
STD:
96
废止:
8152
类别:
标准跟踪
发布:
ISSN:
2070-1721
作者:
J. Schaad
August Cellars

RFC 9052

CBOR 对象签名与加密(COSE):结构与过程

摘要

简明二进制对象表示(CBOR)是一种为小代码量和小消息量而设计的数据格式。需要能够为这种数据 格式定义基本的安全服务。本文档定义了 CBOR 对象签名与加密(COSE)协议。本规范 描述了如何使用 CBOR 进行序列化来创建和处理签名、消息认证码和加密。本规范还 描述了如何使用 CBOR 表示加密密钥。

本文档与 RFC 9053 一起废止 RFC 8152。

本文档状态

这是一份互联网标准跟踪文档。

本文档是互联网工程任务组(IETF)的产物。它代表了 IETF 社群的共识。它已经 接受公开审查,并已由互联网工程指导组(IESG)批准发布。关于 互联网标准的更多信息可参见 RFC 7841 第 2 节。

有关本文档当前状态、任何勘误以及如何提供反馈的信息,可在 https://www.rfc-editor.org/info/rfc9052 获取。

目录

1. 引言

组成物联网(IoT)的小型受限设备受到了越来越多的关注。 这一过程中产生的标准之一是“简明二进制对象表示(CBOR)”[STD94]。CBOR 扩展了 JavaScript 对象表示法(JSON)[STD90] 的数据模型,允许使用二进制数据,以及其他一些变化。CBOR 已被若干处理 IoT 世界的 IETF 工作组采纳,作为它们编码数据结构的方法。CBOR 的设计目标 专门是在传输消息和实现规模两方面都保持小巧,并具备无模式解码器。存在为 IoT 提供消息安全服务的需求,而使用 CBOR 作为消息编码格式是合理的。

JOSE 工作组产出了一组文档 [RFC7515] [RFC7516] [RFC7517] [RFC7518],规定了如何使用 JSON 处理加密、签名和 消息认证码(MAC)操作,以及如何编码密钥。本文档定义了 CBOR 对象签名与加密(COSE)标准,它为 CBOR 编码 格式完成同样的工作。本文档与 [RFC9053] 结合使用, 后者提供了一组初始算法。虽然强烈尝试保留原始 JSON 对象签名与加密(JOSE)文档的风格,但考虑了 两个因素:

本文档包含:

本文档不包含使用具体加密算法的规则和过程。 有关具体算法的详细信息可见 [RFC9053][RFC8230]。 预计其他算法的细节将在未来文档中定义。

COSE 最初是作为一种为受限 RESTful 环境(CoRE)提供安全性的解决方案的一部分而设计的,这通过 [RFC8613][CORE-GROUPCOMM] 实现。 但是,COSE 并不限于这些情形,并且可以用于任何会考虑 JOSE 或加密消息语法(CMS)[RFC5652] 来提供安全服务的地方。 COSE 与 JOSE 和 CMS 一样,仅用于存储转发或离线协议。 在需要加密的在线协议中使用 COSE,要求在来回发送对象之前 完成一个在线密钥建立过程。任何将 COSE 用于安全服务的应用 首先需要确定所需的安全服务,然后基于这些需求选择适当的 COSE 结构和加密算法。 第 10 节提供了关于 应用在使用 COSE 时需要规定哪些内容的额外信息。

CMS 中存在而本标准中不存在的一项特性是摘要结构。 这种省略是有意的。 让各协议自行定义该结构更好,因为不同协议希望把 不同的字段集作为结构的一部分。 虽然算法标识符和摘要值将对所有应用通用,但这两个 值并不总是相邻,因为算法可以定义一次并带有多个值。 应用还可能希望把额外数据字段定义为该结构的一部分。 一个这样的应用特定元素,是包含 URI 或其他指针,以指出 可从何处获取正在被哈希的数据。 [RFC9054] 包含一种这样的可能结构,并 定义了一组摘要算法。

在将 COSE 推进为互联网标准的过程中,人们注意到 对 COSE_Sign1 结构中会签安全属性的描述是不正确的。 由于所描述的安全属性——真正会签的那些属性——正是 工作组所期望的属性,因此决定从本文档中移除所有会签文本, 并创建新文档 [COSE-COUNTERSIGN],以弃用旧的会签算法 和头部参数,并定义具有所需安全属性的新算法和头部参数。

1.1. 需求 术语

本文档中的关键词 “MUST”、“MUST NOT”、 “REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“NOT RECOMMENDED”、“MAY” 和 “OPTIONAL”,只有在如这里所示全部以大写形式出现时, 才应按 BCP 14 [RFC2119] [RFC8174] 中所述进行解释。

1.2. 相对于 RFC 8152 的变更

  • 将原始文档拆分为本文档和 [RFC9053]
  • 添加了一些文本,说明为什么 COSE 没有定义摘要结构。
  • 进行了文本澄清和术语变更。
  • 移除了与会签有关的所有细节,并将其放入 [COSE-COUNTERSIGN]

1.3. 相对于 JOSE 的设计变更

  • 已定义一个单一的总体消息结构,使得 加密、签名和 MACed 消息可以易于识别,同时仍具有 一致的视图。
  • 签名消息区分了与内容相关的 受保护和不受保护头部参数,以及与签名相关的那些参数。
  • MACed 消息与签名消息分离。
  • MACed 消息能够使用与封装消息相同的一组 接收方算法来获得 MAC 认证密钥。
  • 使用二进制编码,而不是 base64url 编码,来编码二进制数据。
  • 加密算法的认证标签 已与密文合并。
  • 加密算法集合在某些方向上扩展, 在另一些方向上裁剪。

1.4. 用于 CBOR 数据结构的 CDDL 语法

最初编写 COSE 时,简明数据定义 语言(CDDL)[RFC8610] 尚未作为 RFC 发布,因此不能用作数据描述 语言来规范性地描述 COSE 所采用的 CBOR 数据结构。 因此,这里定义的 CBOR 数据对象以散文形式描述。 下文所述的 CDDL 子集还提供了 COSE 数据对象的额外(非规范性)描述。

本文档的开发方式是先处理语法,然后开发与之配套的散文描述。 这种做法的一个产物是,散文使用了 简明数据定义语言(CDDL)[RFC8610] 定义的原始类型字符串。 本规范中使用以下原始类型:

any:
一种非特定值,允许在此处放置所有 CBOR 值。
bool:
布尔值(true:主类型 7,值 21;false:主类型 7,值 20)。
bstr:
字节字符串(主类型 2)。
int:
无符号整数或负整数。
nil:
空值(主类型 7,值 22)。
nint:
负整数(主类型 1)。
tstr:
UTF-8 文本字符串(主类型 3)。
uint:
无符号整数(主类型 0)。

本文档中出现了三种 CDDL 语法作为简写。它们是:

FOO / BAR:
表示这里可以出现 FOO 或 BAR。
[+ FOO]:
表示类型 FOO 在数组中出现一次或 多次。
* FOO:
表示类型 FOO 出现零次或 多次。

本文档还使用了 CDDL 定义的两种约束。它们是:

type1 .cbor type2:
表示 type1 的内容 (通常为 bstr)包含一个 type2 的值。
type1 .size integer:
表示 type1 的内容长度为 integer 个字节。

除散文描述外,还以前述 CDDL 子集给出了 CBOR 数据结构的语法。 CDDL 语法是资料性的;散文描述是规范性的。

可通过下面的 XPath 表达式从本文档的 XML 版本中 提取收集到的 CDDL。(取决于所使用的 XPath 求值器,可能 需要将 > 作为实体处理。)

//sourcecode[@type='cddl']/text()

CDDL 期望初始非终结符符号是 文件中的第一个符号。因此,第一个 CDDL 片段在此给出。

start = COSE_Messages / COSE_Key / COSE_KeySet / Internal_Types

; This is defined to make the tool quieter:
Internal_Types = Sig_structure / Enc_structure / MAC_structure

非终结符 Internal_Types 是为处理在编写本文档期间 使用的自动化验证工具而定义的。它引用那些 用于安全计算但不为传输而发出的非终结符。

在 JSON 中,映射被称为对象,并且只有一种映射键: 文本字符串。在 COSE 中,我们使用文本字符串、负整数和无符号整数作为映射键。 整数用于实现编码紧凑性和易于比较。包含文本字符串也允许使用 额外范围的短编码值。由于 “key” 这个词主要用于它的另一种含义,即 加密密钥,因此我们使用术语 “label” 来表示其作为映射键的这种用法。

在本规范定义的 CBOR 映射中,如果存在既不是文本字符串 也不是整数的标签,则为错误。 应用可以使处理失败,或者通过忽略不正确标签来处理消息; 但是,它们MUST NOT 创建带有不正确标签的消息。

一个 CDDL 语法片段定义了非终结符 “label”, 如上一段所述,以及 “values”,它允许使用任何值。

label = int / tstr
values = any

1.6. 文档术语

本文档中,我们使用以下术语:

Byte:
octet 的同义词。
受限应用协议(CoAP):
一种用于受限系统的专用 Web 传输协议。它定义于 [RFC7252]
认证加密(AE)算法 [RFC5116]
在提供加密服务的同时, 还对内容提供认证检查的加密算法。 COSE 中使用的一个 AE 算法示例是 AES Key Wrap [RFC3394]。 这些算法用于密钥加密,但 认证加密带关联数据(AEAD) 算法会更优先。
AEAD 算法 [RFC5116]
提供与 AE 算法相同的 内容认证服务的加密算法,并且还允许把 不属于加密主体的关联数据包含在认证服务中。COSE 中使用的一个 AEAD 算法示例是 AES-GCM [RFC5116]。 这些 算法用于内容加密,也可用于密钥 加密。

“Context” 在整个文档中用于表示不属于 COSE 消息的信息。 属于上下文的信息可以来自若干不同来源,包括 协议交互、关联的密钥结构和程序配置。 要使用的上下文可以是隐式的,可以使用 [RFC8613] 中定义的 “kid context” 头部参数标识, 也可以由协议特定标识符标识。 上下文通常应包含在加密构造中;更多细节见 第 4.3 节

术语 “byte string” 用于字节序列,而术语 “text string” 用于字符序列。

2. 基本 COSE 结构

COSE 对象结构的设计使得在解析和处理 不同类型安全消息时可以存在大量通用代码。 所有消息结构都构建在 CBOR 数组类型之上。 数组的前三个元素始终包含相同的信息:

  1. 受保护头部参数,经编码并包裹在 bstr 中。
  2. 作为映射的不受保护头部参数。
  3. 消息的内容。 内容是明文或密文,视情况而定。 内容可以是分离的(即与 COSE 结构分开传输),但该位置 仍会被使用。 内容存在时包裹在 bstr 中;分离时则为 nil 值。

此后的元素依赖于具体的消息类型。

COSE 消息使用层的概念来构建,以分离不同类型的 加密概念。作为其工作方式的示例,考虑 COSE_Encrypt 消息(第 5.1 节)。这种消息类型分解为两层: 内容层和接收方层。内容层包含加密后的明文和 关于加密消息的信息。接收方层为每个接收方包含 加密后的内容加密密钥(CEK)以及关于其如何被加密的信息。 对于 CEK 预共享的情况,提供了加密消息的单层版本 COSE_Encrypt0(第 5.2 节)。

识别已呈现哪种类型的消息,可通过以下 方法完成:

  1. 从上下文得知具体消息类型。这可以由包含结构中的 标记定义,或者由应用协议规定的限制定义。
  2. 消息类型由 CBOR 标签标识。在本规范中,带 CBOR 标签的消息 称为带标签消息,而不带 CBOR 标签的消息称为无标签 消息。本文档为每种消息结构定义一个 CBOR 标签。这些标签可见于 表 1
  3. 当 COSE 对象承载在媒体类型 “application/cose” 中时,可使用可选参数 “cose-type” 来标识嵌入的对象。 如果使用结构的带标签版本,该参数为 OPTIONAL。 如果使用结构的无标签版本,该参数为 REQUIRED。 每种结构应与该参数一起使用的值可见于 表 1
  4. 当 COSE 对象作为 CoAP 负载承载时,可以使用 CoAP Content-Format 选项 来标识消息内容。CoAP Content-Format 值可见于 表 2。消息结构的 CBOR 标签 不是必需的,因为每个安全消息都被唯一标识。
表 1COSE 消息标识
CBOR 标签 cose-type 数据项 语义
98 cose-sign COSE_Sign COSE 签名数据对象
18 cose-sign1 COSE_Sign1 COSE 单一签名者数据对象
96 cose-encrypt COSE_Encrypt COSE 加密数据对象
16 cose-encrypt0 COSE_Encrypt0 COSE 单一接收方加密数据对象
97 cose-mac COSE_Mac COSE MACed 数据对象
17 cose-mac0 COSE_Mac0 COSE 无接收方 MAC 对象
表 2用于 COSE 的 CoAP Content-Formats
媒体类型 编码 ID 参考文献
application/cose; cose-type="cose-sign" 98 RFC 9052
application/cose; cose-type="cose-sign1" 18 RFC 9052
application/cose; cose-type="cose-encrypt" 96 RFC 9052
application/cose; cose-type="cose-encrypt0" 16 RFC 9052
application/cose; cose-type="cose-mac" 97 RFC 9052
application/cose; cose-type="cose-mac0" 17 RFC 9052
application/cose-key 101 RFC 9052
application/cose-key-set 102 RFC 9052

下面的 CDDL 片段标识了本文档中定义的所有顶层消息。 为消息的带标签版本和无标签版本分别定义了非终结符。

COSE_Messages = COSE_Untagged_Message / COSE_Tagged_Message

COSE_Untagged_Message = COSE_Sign / COSE_Sign1 /
    COSE_Encrypt / COSE_Encrypt0 /
    COSE_Mac / COSE_Mac0

COSE_Tagged_Message = COSE_Sign_Tagged / COSE_Sign1_Tagged /
    COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged /
    COSE_Mac_Tagged / COSE_Mac0_Tagged

3. 头部参数

COSE 的结构被设计为具有两个信息桶,这些信息不 被视为负载本身的一部分,但用于保存关于内容、 算法、密钥或用于该层处理的评估提示的信息。这两个桶可 用于除密钥以外的所有结构。虽然这些桶存在,但它们并不总是 在所有实例中都可用。例如,尽管受保护桶被定义为接收方 结构的一部分,但用于接收方结构的一些算法并不提供认证数据。 如果是这种情况,受保护桶会留空。

两个桶都实现为 CBOR 映射。映射键是 “label”(第 1.5 节)。值部分取决于 label 的定义。两个 映射使用同一组 label/value 对。标签的整数值和文本字符串值 已被划分为若干区段,包括标准范围、私有使用范围以及 依赖于所选算法的范围。已定义的标签可见于 “COSE Header Parameters” IANA 注册表(第 11.1 节)。

这两个桶是:

protected:

包含关于当前层的、受加密保护的参数。 如果不会将此桶包含在 加密计算中,则该桶MUST 为空。 此桶在消息中被编码为二进制对象。 该值通过对受保护映射进行 CBOR 编码并将其包裹在 bstr 对象中获得。 发送方SHOULD 将零长度映射编码为零长度字节字符串, 而不是编码为零长度映射(编码为 h'a0')。 首选零长度字节字符串编码,因为它更短,并且也是 加密计算的序列化结构中使用的版本。 接收方MUST 接受零长度字节字符串以及 编码在字节字符串中的零长度映射。

用字节字符串包裹编码,使受保护映射在传输中有更大机会 不会被意外更改。 (行为不良的中间方可能会解码并重新编码,但这会导致验证失败, 除非重新编码的字节字符串与解码后的字节字符串完全相同。) 这避免了所有各方都需要能够对映射执行共同规范编码 以作为加密操作输入的问题。

unprotected:
包含关于当前层的、 不受加密保护的参数。

只应把处理当前层的头部参数放置在该层。举例来说, “content type” 头部参数描述消息中承载的消息内容。 因此,这个头部参数只放置在内容层中,不放置在 接收方层或签名层中。原则上,应能够处理任何给定层而 无需引用其他任何层。除 COSE_Sign 结构外,唯一需要 跨层传递的数据是加密密钥。

这些桶存在于本文档定义的所有安全对象中。字段按顺序为 “protected” 桶(作为 CBOR “bstr” 类型),然后是 “unprotected” 桶 (作为 CBOR “map” 类型)。两个桶都必须存在。进入这些桶的 头部参数来自 IANA “COSE Header Parameters” 注册表(第 11.1 节)。 下一节定义了一些头部参数。

每个映射中的标签MUST 唯一。处理 消息时,如果一个标签出现多次,该消息MUST 作为 格式错误被拒绝。应用SHOULD 验证同一标签不会 同时出现在受保护和不受保护头部参数中。如果 该消息未作为格式错误被拒绝,则属性MUST 从受保护桶取得,只有在受保护桶中找不到某属性时, 才能从不受保护桶取得该属性。

下面的 CDDL 片段表示两个头部参数桶。CDDL 中定义了一个 组 “Headers”,表示放置属性的两个桶。该组用于在所有位置 一致地提供这两个字段。还定义了一个类型,用于表示 通用头部参数的映射。

Headers = (
    protected : empty_or_serialized_map,
    unprotected : header_map
)

header_map = {
    Generic_Headers,
    * label => values
}

empty_or_serialized_map = bstr .cbor header_map / bstr .size 0

3.1. 通用 COSE 头部 参数

本节定义一组通用头部参数。这些 头部参数的摘要可见于 表 3。应查阅该表 以确定标签值和值的类型。

本节定义的头部参数集合如下:

alg:
此头部参数用于指示 安全处理所使用的算法。在存在这样能力的地方,此头部参数MUST 被认证。AEAD 算法或构造(例如 COSE_Sign 和 COSE_Mac0) 提供这种支持。这种认证可以通过将该头部参数放入 protected-header-parameters 桶来完成,也可以作为外部提供数据(第 4.3 节)的一部分来完成。该值取自 “COSE Algorithms” 注册表(见 [COSE.Algorithms])。
crit:

此头部参数用于指示 处理消息的应用需要理解哪些 受保护头部参数。本文档中定义的头部 参数不需要包含在内,因为所有 实现都应理解它们。此外,为了与 遵循 [RFC8152] 并假设所有实现都会理解它的 发送方保持兼容,新实现必须理解该文档定义的 “counter signature” 头部参数(标签 7)。当存在时,“crit” 头部 参数MUST 放在 protected-header-parameters 桶中。该数组 MUST 至少有一个值。

并非所有头部参数标签都需要包含在 “crit” 头部参数中。 决定哪些头部参数放入数组的规则是:

  • 0 到 7 范围内的整数标签SHOULD 被省略。
  • -1 到 -128 范围内的整数标签可以省略。 算法可以在此范围内分配标签,其中 处理标签内容的能力被认为是实现该算法的核心。 算法可以在此范围之外分配标签,并在 处理该标签内容的能力不被认为是算法核心功能、 但确实需要理解才能正确处理此实例时, 将它们包含在 “crit” 头部参数中。 -129 到 -65536 范围内的整数标签 SHOULD 被包含,因为这些会是 较不常见、可能并非普遍支持的头部参数。
  • 应用所需的头部参数标签 MAY 被省略。应用应有声明说明该 标签是否可以省略。

“crit” 指示的头部参数可以由 安全库代码处理,也可以由使用安全库的应用处理;唯一要求 是该头部参数被处理。如果 “crit” 值列表包含一个标签,而 对应头部参数不在 protected-header-parameters 桶中,这就是 处理该消息时的致命错误。

content type:
此头部参数用于指示 “payload” 或 “ciphertext” 字段中数据的内容类型。整数来自 “CoAP Content-Formats” IANA 注册表 [COAP.Formats]。文本值遵循 “<type-name>/<subtype-name>” 的语法,其中 <type-name> 和 <subtype-name> 定义于 [RFC6838] 第 4.2 节。不允许前导和尾随空白。 文本内容类型值及其参数和子参数可使用 IANA “Media Types” 注册表定位。如果内容结构可能存在歧义,应用SHOULD 提供此 头部参数。
kid:
此头部参数标识一段 可用作输入以查找所需加密密钥的数据。该 头部参数的值可以与 COSE_Key 结构中的 “kid” 成员匹配。其他 密钥分发方法可以定义一个等价字段进行匹配。应用MUST NOT 假设 “kid” 值是唯一的。可能存在多个 具有相同 “kid” 值的密钥,因此可能需要检查与该 “kid” 关联的所有密钥。 “kid” 值的内部结构未定义,应用不能依赖它。 密钥标识符值是关于使用哪个密钥的提示。这不是 安全关键字段。因此,它可以放在 unprotected-header-parameters 桶中。
IV:
此头部参数保存 初始化向量(IV)值。对于某些对称加密算法,这也可以 称为 nonce。IV 可以放在不受保护桶中,因为对于 AE 和 AEAD 算法,修改 IV 会导致解密失败。
Partial IV:

此头部参数保存 IV 值的一部分。 使用 COSE_Encrypt0 结构时,IV 的一部分可以是与密钥 关联的上下文的一部分(Context IV),而一部分可以随每条消息 改变(Partial IV)。 此字段用于承载一个值,使 IV 对每条消息发生改变。 Partial IV 可以放在不受保护桶中,因为修改该值会 导致解密产生容易检测为乱码的明文。 “Initialization Vector” 和 “Partial Initialization Vector” 头部参数MUST NOT 同时出现在同一安全层中。

消息 IV 通过以下步骤生成:

  1. 将 Partial IV 左侧补零至 IV 的长度 (由算法确定)。
  2. 将补齐后的 Partial IV 与 Context IV 进行 XOR。
表 3通用头部参数
名称 标签 值类型 值注册表 描述
alg 1 int / tstr COSE Algorithms 注册表 要使用的加密算法
crit 2 [+ label] COSE Header Parameters 注册表 需要被理解的关键头部 参数
content type 3 tstr / uint CoAP Content-Formats 或 Media Types 注册表 负载的内容类型
kid 4 bstr 密钥标识符
IV 5 bstr 完整初始化向量
Partial IV 6 bstr 部分初始化向量

下面给出了表示本节所定义头部参数集合的 CDDL 片段。每个头部参数都标记为可选,因为它们不 需要出现在每个映射中;特定映射中所需的头部参数在上文讨论。

Generic_Headers = (
    ? 1 => int / tstr,  ; algorithm identifier
    ? 2 => [+label],    ; criticality
    ? 3 => tstr / int,  ; content type
    ? 4 => bstr,        ; key identifier
    ? ( 5 => bstr //    ; IV
        6 => bstr )     ; Partial IV
)

4. 签名对象

COSE 支持两种不同的签名结构。COSE_Sign 允许对同一内容应用一个或多个 签名。COSE_Sign1 限定为单一签名者。这些 结构不能相互转换;由于签名计算包含一个用于 标识所使用结构的参数,转换后的结构将无法通过签名验证。

4.1. 使用一个或 多个签名者进行签名

COSE_Sign 结构允许对 消息负载应用一个或多个签名。与内容相关的头部参数以及与 签名相关的头部参数会随签名本身一起携带。这些头部参数可以由 签名认证,也可以只是存在。关于 内容的头部参数示例是内容类型头部参数。关于 签名的头部参数示例则是用于创建签名的算法和密钥。

[RFC5652] 指出:

当存在多个签名时,通常会把与给定签名者关联的一个签名验证成功 视为该签名者的签名成功。但是,也有一些应用环境 需要其他规则。采用并非“每个签名者一个有效签名”规则的应用 必须规定这些规则。此外,在简单匹配签名者标识符 不足以确定这些签名是否由同一签名者生成时,应用规范必须 描述如何确定哪些签名由同一签名者生成。支持不同接收方社群 是签名者选择包含多个签名的主要原因。

例如,COSE_Sign 结构可能包含使用 Edwards 曲线 数字签名算法(EdDSA)[RFC8032] 和椭圆曲线数字签名算法(ECDSA)[DSS] 生成的签名。这允许接收方验证 与其中一种算法关联的签名。关于多个签名评估的更多详细信息可见 [RFC5752]

签名结构可以编码为带标签或无标签,具体取决于 其使用上下文。带标签的 COSE_Sign 结构由 CBOR 标签 98 标识。表示这一点的 CDDL 片段为:

COSE_Sign_Tagged = #6.98(COSE_Sign)

COSE 签名消息分为两个部分定义。携带 主体和消息相关信息的 CBOR 对象称为 COSE_Sign 结构。携带 签名以及签名相关信息的 CBOR 对象称为 COSE_Signature 结构。COSE 签名消息示例可见 附录 C.1

COSE_Sign 结构是一个 CBOR 数组。数组字段按顺序 为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
payload:

此字段包含要签名的序列化内容。 如果消息中不存在负载,则要求应用单独提供 负载。 负载被包裹在 bstr 中,以确保其传输时不发生改变。 如果负载被单独传输(“分离内容”),则会在此位置放置一个 nil CBOR 对象, 并由应用负责确保其传输时不发生改变。

注:使用带消息恢复算法的签名时(第 8.1 节),可恢复的最大字节数是 原始负载的长度。 编码负载的大小会按将要恢复的字节数减少。 如果原始负载的所有字节都被消耗,则传输的负载 编码为零长度字节字符串,而不是作为不存在处理。

signatures:
此字段是一个签名数组。每个 签名都表示为一个 COSE_Signature 结构。

表示上述 COSE_Sign 文本的 CDDL 片段如下。

COSE_Sign = [
    Headers,
    payload : bstr / nil,
    signatures : [+ COSE_Signature]
]

COSE_Signature 结构是一个 CBOR 数组。数组字段 按顺序为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
signature:
此字段包含计算得到的签名 值。该字段类型为 bstr。如果签名值不是 8 位的倍数,算法MUST 规定 填充方式。

表示上述 COSE_Signature 文本的 CDDL 片段 如下。

COSE_Signature =  [
    Headers,
    signature : bstr
]

4.2. 使用一个签名者进行签名

当只有一个签名要放置到 消息上时,使用 COSE_Sign1 签名结构。处理内容和签名的头部参数被放在 同一对桶中,而不是像 COSE_Sign 那样分离。

该结构可以根据其使用上下文编码为带标签或无标签。 带标签的 COSE_Sign1 结构由 CBOR 标签 18 标识。表示这一点的 CDDL 片段为:

COSE_Sign1_Tagged = #6.18(COSE_Sign1)

携带主体、签名以及 主体和签名相关信息的 CBOR 对象称为 COSE_Sign1 结构。COSE_Sign1 消息示例可见 附录 C.2

COSE_Sign1 结构是一个 CBOR 数组。数组字段按顺序 为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
payload:
第 4.1 节所述。
signature:
此字段包含计算得到的签名 值。该字段类型为 bstr。

表示上述 COSE_Sign1 文本的 CDDL 片段如下。

COSE_Sign1 = [
    Headers,
    payload : bstr / nil,
    signature : bstr
]

4.3. 外部提供的 数据

COSE 提供的一项特性是,应用能够提供需要被认证但 不作为 COSE 对象一部分携带的额外数据。 支持这一点的主要原因可通过查看 CoAP 消息结构 [RFC7252] 看出,其中存在 在负载之前携带选项的机制。 可放置在此位置的数据示例包括 CoAP 代码或 CoAP 选项。 如果数据位于 CoAP 消息的头部中,则代理可使用这些数据来帮助 执行代理操作。 例如,代理可以使用 Accept 选项来确定 代理缓存中是否存在合适的值。 发送方可以使用 additional-data 功能来检测 代理或攻击者对 Accept 值集合所做的任何更改。通过 将该字段包含在外部提供的数据中,任何后续 修改都会导致服务器处理消息时 失败。

本文档描述了使用外部提供的认证数据字节数组的过程; 构造该字节数组的方法是应用的函数。 使用此特性的应用需要定义如何构造外部提供的认证数据。 这种构造需要考虑以下问题:

  • 如果包含多个项目,应用需要确保不同输入不会 生成同一字节字符串。 可能出现问题场景的一个示例是连接文本字符串 “AB” 和 “CDE”,或连接文本字符串 “ABC” 和 “DE”。 通常通过使字段具有固定宽度和/或把字段长度编码为 输出的一部分来解决这一问题。 以 CoAP [RFC7252] 中的选项为 例,这些字段使用 TLV 结构,因此它们可以连接而不会出现 问题。
  • 如果包含多个项目,则需要 定义这些项目的顺序。以 CoAP 选项为例,应用可以声明 字段应按选项编号排序。
  • 应用需要确保双方得到的字节字符串相同。 如果保留相同的相对编号,使用 CoAP 选项可能会产生问题。 中间节点可能插入或移除某个选项,从而改变相对编号 的方式。 应用需要规定必须重新编码相对编号,使其仅相对于 外部数据中的选项。

4.4. 签名与 验证过程

为了创建签名,需要一个定义良好的字节字符串。 Sig_structure 用于创建规范形式。 此签名与验证过程接收主体信息(COSE_Sign 或 COSE_Sign1)、 签名者信息(COSE_Signature)以及应用数据(外部来源)。 Sig_structure 是一个 CBOR 数组。 Sig_structure 的字段按顺序为:

  1. 一个用于标识签名上下文的上下文文本字符串。上下文文本字符串 是:

    • “Signature” 用于使用 COSE_Signature 结构的签名。
    • “Signature1” 用于使用 COSE_Sign1 结构的签名。
  2. 主体结构中的受保护属性,编码为 bstr 类型。如果没有受保护属性,则使用零长度字节字符串。
  3. 签名者结构中的受保护属性,编码为 bstr 类型。如果没有受保护属性,则使用零长度字节字符串。对于 COSE_Sign1 签名结构,将省略此字段。
  4. 来自应用的外部提供数据,编码为 bstr 类型。如果未提供此字段,则默认为零长度字节字符串。(有关构造 此字段的应用指南,见 第 4.3 节。)
  5. 要签名的负载,编码为 bstr 类型。这里使用完整负载, 与其如何传输无关。

描述上述文本的 CDDL 片段为:

Sig_structure = [
    context : "Signature" / "Signature1",
    body_protected : empty_or_serialized_map,
    ? sign_protected : empty_or_serialized_map,
    external_aad : bstr,
    payload : bstr
]

如何计算签名:

  1. 创建 Sig_structure,并用适当字段填充它。
  2. 通过将 Sig_structure 按 第 9 节所述编码方式编码为字节字符串,创建 ToBeSigned 值。
  3. 调用签名创建算法,传入 K(用于签名的密钥)、 alg(用于签名的算法)和 ToBeSigned(要签名的值)。
  4. 将所得签名值放置在正确位置。 这是 COSE_Signature 或 COSE_Sign1 结构中的 “signature” 字段。

验证签名的步骤为:

  1. 创建 Sig_structure,并用适当字段填充它。
  2. 通过将 Sig_structure 按 第 9 节所述编码方式编码为字节字符串,创建 ToBeSigned 值。
  3. 调用签名验证算法,传入 K(用于验证的密钥)、 alg(用于签名的算法)、ToBeSigned(要签名的值)以及 sig (要验证的签名)。

除执行签名验证外,应用还会执行适当检查,以确保密钥与签名身份 正确配对,并确保签名身份在执行操作之前已获得授权。

5. 加密对象

COSE 支持两种不同的加密结构。 当不需要接收方结构,因为要使用的密钥已隐式 知晓时,使用 COSE_Encrypt0。 其他时候使用 COSE_Encrypt。 这包括存在多个接收方,或使用直接 (即预共享秘密)以外的接收方算法的情况。

5.1. 封装的 COSE 结构

封装结构允许消息有一个或多个接收方。消息中 可携带关于内容的头部参数以及关于接收方 信息的头部参数。与内容关联的受保护头部参数由 内容加密算法认证。与接收方关联的受保护头部参数 (当算法支持时)由接收方算法认证。关于内容的 头部参数示例包括内容类型和内容加密算法。关于接收方的 头部参数示例包括接收方的密钥标识符和接收方的加密算法。

加密明文和加密密钥使用相同技术以及几乎相同的结构。 这不同于“加密消息语法(CMS)”[RFC5652] 和 “JSON Web Encryption(JWE)” [RFC7516] 所采用的方法,后者为 内容层和接收方层使用不同结构。 定义了两个结构:COSE_Encrypt 用于保存加密内容,COSE_recipient 用于 保存接收方的加密密钥。 封装消息示例可见 附录 C.3

COSE_Encrypt 结构可以根据其使用上下文编码为带标签或无标签。 带标签的 COSE_Encrypt 结构由 CBOR 标签 96 标识。表示这一点的 CDDL 片段为:

COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)

COSE_Encrypt 结构是一个 CBOR 数组。数组字段按顺序 为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
ciphertext:
此字段包含密文,编码 为 bstr。如果密文将独立于有关加密过程的控制信息 传输(即分离内容),则该字段编码为 nil 值。
recipients:
此字段包含一个接收方 信息结构数组。接收方信息结构的类型是 COSE_recipient。

与上述文本对应的 CDDL 片段为:

COSE_Encrypt = [
    Headers,
    ciphertext : bstr / nil,
    recipients : [+COSE_recipient]
]

COSE_recipient 结构是一个 CBOR 数组。数组字段 按顺序为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
ciphertext:
此字段包含加密密钥, 编码为 bstr。所有已编码密钥都是对称密钥;密钥的二进制值就是 内容。如果没有加密密钥,则此字段编码为 nil 值。
recipients:
此字段包含一个接收方 信息结构数组。接收方信息结构的类型是 COSE_recipient (其示例可见 附录 B)。如果 没有接收方信息结构,则此元素不存在。

与上述 COSE_recipient 文本对应的 CDDL 片段为:

COSE_recipient = [
    Headers,
    ciphertext : bstr / nil,
    ? recipients : [+COSE_recipient]
]

5.1.1. 内容密钥 分发方法

加密消息由加密内容以及面向一个或多个接收方的加密 CEK 组成。 CEK 会使用该接收方特定的密钥为每个接收方加密。 此加密的细节取决于接收方算法所属的类别。 每个类别的具体细节可见 第 8.5 节。 五种内容密钥分发方法的简要摘要如下:

direct:
CEK 与先前分发的已标识对称密钥相同,或 从先前分发的秘密派生而来。 消息中不传输 CEK。
对称密钥加密密钥(KEK):
CEK 使用先前分发的对称 KEK 加密。 也称为密钥包装。
key agreement:
使用接收方公钥和发送方私钥生成 成对秘密,应用密钥派生函数(KDF)派生密钥,然后 CEK 要么是派生密钥,要么由派生密钥加密。
key transport:
CEK 使用接收方公钥加密。
passwords:
CEK 在由密码派生出的 KEK 中加密。 截至本文档发布时,尚未定义密码算法。

5.2. 单一接收方 加密

COSE_Encrypt0 加密结构无法指定 消息接收方。该结构假定对象的接收方已经 知道为解密消息要使用的密钥的身份。如果需要向 接收方标识密钥,则应使用封装结构。

加密消息示例可见 附录 C.4

COSE_Encrypt0 结构可以根据其使用上下文编码为带标签或无标签。 带标签的 COSE_Encrypt0 结构由 CBOR 标签 16 标识。表示这一点的 CDDL 片段为:

COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)

COSE_Encrypt0 结构是一个 CBOR 数组。数组字段 按顺序为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
ciphertext:
第 5.1 节所述。

与上述文本对应的 COSE_Encrypt0 CDDL 片段为:

COSE_Encrypt0 = [
    Headers,
    ciphertext : bstr / nil,
]

5.3. 如何为 AEAD 算法 加密和解密

AEAD 算法的加密算法相当简单。第一步 是为认证数据结构创建一致的字节字符串。为此,我们 使用 Enc_structure。Enc_structure 是一个 CBOR 数组。Enc_structure 的字段 按顺序为:

  1. 一个用于标识认证 数据结构上下文的上下文文本字符串。上下文文本字符串为:

    • “Encrypt0” 用于 COSE_Encrypt0 数据结构的内容加密。
    • “Encrypt” 用于 COSE_Encrypt 数据结构的第一层(即用于内容加密)。
    • “Enc_Recipient” 用于 要放置在 COSE_Encrypt 数据结构中的接收方编码。
    • “Mac_Recipient” 用于 要放置在 MACed 消息结构中的接收方编码。
    • “Rec_Recipient” 用于 要放置在接收方结构中的接收方编码。
  2. 主体结构中的受保护属性,编码为 bstr 类型。如果没有受保护属性,则使用零长度字节字符串。
  3. 来自应用的外部提供数据,编码为 bstr 类型。如果未提供此字段,则默认为零长度字节字符串。(有关构造 此字段的应用指南,见 第 4.3 节。)

描述上述文本的 CDDL 片段为:

Enc_structure = [
    context : "Encrypt" / "Encrypt0" / "Enc_Recipient" /
        "Mac_Recipient" / "Rec_Recipient",
    protected : empty_or_serialized_map,
    external_aad : bstr
]

如何加密消息:

  1. 创建 Enc_structure,并用适当字段填充它。
  2. 将 Enc_structure 编码为字节字符串(附加认证 数据(AAD)),使用 第 9 节中描述的编码。
  3. 确定加密密钥(K)。此步骤取决于 所使用的接收方算法类别。对于:

    无接收方:
    要使用的密钥由 当前层的算法和密钥确定。示例包括密钥包装密钥(第 8.5.2 节)和预共享秘密。
    直接加密和直接密钥协商:
    密钥由接收方结构中的密钥和算法确定。 要使用的加密算法和密钥大小是 接收方所用 KDF 的输入。 (对于 direct,可以将 KDF 视为恒等操作。) 这些算法的示例可见 [RFC9053] 的第 6.1 节和第 6.3 节。
    其他:
    密钥随机生成。
  4. 使用 K(加密密钥)、P(明文)和 AAD 调用加密算法。将返回的密文放入结构的 “ciphertext” 字段。
  5. 对于消息中使用非直接算法的接收方, 递归地为该接收方执行加密算法,使用 K(加密密钥)作为 明文。

如何解密消息:

  1. 创建 Enc_structure,并用适当字段填充它。
  2. 将 Enc_structure 编码为字节字符串(AAD),使用 第 9 节中描述的编码。
  3. 确定解密密钥。此步骤取决于 所使用的接收方算法类别。对于:

    无接收方:
    要使用的密钥由 当前层的算法和密钥确定。示例包括密钥包装密钥(第 8.5.2 节)和预共享秘密。
    直接加密和直接密钥协商:
    密钥由接收方结构中的密钥和算法确定。 要使用的加密算法和密钥大小是 接收方所用 KDF 的输入。 (对于 direct,可以将 KDF 视为恒等操作。)
    其他:
    密钥通过 解码并解密其中一个接收方结构来确定。
  4. 使用 K(要使用的解密密钥)、C (密文)和 AAD 调用解密算法。

5.4. 如何为 AE 算法 加密和解密

如何加密消息:

  1. 验证 “protected” 字段是零长度字节字符串。
  2. 验证没有为此操作提供外部附加认证数据。
  3. 确定加密密钥。此步骤取决于 所使用的接收方算法类别。对于:

    无接收方:
    要使用的密钥由 当前层的算法和密钥确定。示例包括密钥包装密钥(第 8.5.2 节)和预共享秘密。
    直接加密和直接密钥协商:
    密钥由 接收方结构中的密钥和算法确定。要使用的加密算法和 密钥大小是接收方所用 KDF 的输入。(对于 direct,可以将 KDF 视为恒等操作。) 这些算法的示例可见 [RFC9053] 的第 6.1 节和第 6.3 节。
    其他:
    密钥随机生成。
  4. 使用 K(要使用的加密密钥)和 P (明文)调用加密算法。将返回的密文放入 结构的 “ciphertext” 字段。
  5. 对于消息中使用非直接算法的接收方,递归地 为该接收方执行加密算法,使用 K(加密密钥)作为 明文。

如何解密消息:

  1. 验证 “protected” 字段是零长度字节字符串。
  2. 验证没有为此操作提供外部附加认证数据。
  3. 确定解密密钥。此步骤取决于 所使用的接收方算法类别。对于:

    无接收方:
    要使用的密钥由 当前层的算法和密钥确定。示例包括密钥包装密钥(第 8.5.2 节)和预共享秘密。
    直接加密和直接密钥协商:
    密钥由 接收方结构中的密钥和算法确定。要使用的加密算法和 密钥大小是接收方所用 KDF 的输入。(对于 direct,可以将 KDF 视为恒等操作。) 这些算法的示例可见 [RFC9053] 的第 6.1 节和第 6.3 节。
    其他:
    密钥通过 解码并解密其中一个接收方结构来确定。
  4. 使用 K(要使用的解密密钥)和 C (密文)调用解密算法。

6. MAC 对象

COSE 支持两种不同的 MAC 结构。 当不需要接收方结构,因为要使用的密钥已隐式 知晓时,使用 COSE_Mac0。 其他所有情况使用 COSE_Mac。 这些情况包括需要多个接收方、密钥未知,或使用 直接以外的接收方算法。

本节描述在 COSE 中执行 MAC 认证时要使用的结构和方法。本文档允许使用 与加密所允许的所有相同类别的接收方 算法。

MAC 操作可在两种模式下使用。第一种只是检查 内容自计算 MAC 以来未被更改。任何类别的接收方算法都可 用于此目的。第二种模式既检查内容自 计算 MAC 以来未被更改,又使用接收方算法来验证是谁发送了它。支持此模式的接收方 算法类别是使用预共享秘密或执行静态-静态(SS)密钥 协商(不带密钥包装步骤)的那些类别。在这两种情况下,都可以验证 创建并发送消息 MAC 的实体。(这种关于发送方的知识假定 只涉及两方,并且你没有把消息发送给自己。)通过 两种 MAC 消息结构都可以获得起源属性。

6.1. 带接收方的 MACed 消息

多接收方 MACed 消息使用两个结构:本节定义的 COSE_Mac 结构用于携带主体,而 COSE_recipient 结构(第 5.1 节)用于保存 MAC 计算所用的密钥。MACed 消息示例可见 附录 C.5

MAC 结构可以根据其使用上下文编码为带标签或无标签。 带标签的 COSE_Mac 结构由 CBOR 标签 97 标识。表示这一点的 CDDL 片段为:

COSE_Mac_Tagged = #6.97(COSE_Mac)

COSE_Mac 结构是一个 CBOR 数组。数组字段按顺序 为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
payload:
此字段包含要进行 MAC 的序列化内容。 如果消息中不存在负载,则要求应用单独提供 负载。负载被包裹在 bstr 中,以确保其 传输时不发生改变。如果负载被单独传输(即分离 内容),则会在此位置放置一个 nil CBOR 值,并由 应用负责确保其传输时不发生改变。
tag:
此字段包含 MAC 值。
recipients:
第 5.1 节所述。

表示上述 COSE_Mac 文本的 CDDL 片段如下。

COSE_Mac = [
   Headers,
   payload : bstr / nil,
   tag : bstr,
   recipients : [+COSE_recipient]
]

6.2. 使用隐式密钥的 MACed 消息

本节描述在接收方已隐式知晓的情况下执行 MAC 认证时要使用的结构和方法。

MACed 消息使用本节定义的 COSE_Mac0 结构来 携带主体。带隐式密钥的 MACed 消息示例可见 附录 C.6

MAC 结构可以根据其使用上下文编码为带标签或无标签。 带标签的 COSE_Mac0 结构由 CBOR 标签 17 标识。表示这一点的 CDDL 片段为:

COSE_Mac0_Tagged = #6.17(COSE_Mac0)

COSE_Mac0 结构是一个 CBOR 数组。数组字段按顺序为:

protected:
第 3 节所述。
unprotected:
第 3 节所述。
payload:
第 6.1 节所述。
tag:
此字段包含 MAC 值。

与上述文本对应的 CDDL 片段为:

COSE_Mac0 = [
   Headers,
   payload : bstr / nil,
   tag : bstr,
]

6.3. 如何计算和验证 MAC

为了获得要认证数据的一致编码, 使用 MAC_structure 来创建规范形式。MAC_structure 是一个 CBOR 数组。MAC_structure 的字段 按顺序为:

  1. 一个用于标识正在编码结构的上下文文本字符串。 对于 COSE_Mac 结构,此上下文文本字符串为 “MAC”。对于 COSE_Mac0 结构,此上下文文本字符串为 “MAC0”。
  2. 主体结构中的受保护属性。如果没有受保护 属性,则使用零长度 bstr。
  3. 来自应用的外部提供数据,编码为 bstr 类型。 如果未提供此字段,则默认为零长度字节字符串。(有关构造 此字段的应用指南,见 第 4.3 节。)
  4. 要进行 MAC 的负载,编码为 bstr 类型。这里使用完整负载, 与其如何传输无关。

与上述文本对应的 CDDL 片段为:

MAC_structure = [
     context : "MAC" / "MAC0",
     protected : empty_or_serialized_map,
     external_aad : bstr,
     payload : bstr
]

计算 MAC 的步骤为:

  1. 创建 MAC_structure,并用适当字段填充它。
  2. 通过将 MAC_structure 按 第 9 节所述编码方式编码为字节字符串, 创建 ToBeMaced 值。
  3. 调用 MAC 创建算法,传入 K(要使用的密钥)、alg(用于 MAC 的算法)和 ToBeMaced(要计算 MAC 的值)。
  4. 将所得 MAC 放入 COSE_Mac 或 COSE_Mac0 结构的 “tag” 字段。
  5. 对于 COSE_Mac 结构,为消息的每个接收方加密并编码 MAC 密钥。

验证 MAC 的步骤为:

  1. 创建 MAC_structure,并用适当字段填充它。
  2. 通过将 MAC_structure 按 第 9 节所述编码方式编码为字节字符串, 创建 ToBeMaced 值。
  3. 对于 COSE_Mac 结构,通过解码并解密其中一个 接收方结构来获得加密密钥。
  4. 调用 MAC 创建算法,传入 K(要使用的密钥)、alg(用于 MAC 的算法)和 ToBeMaced(要计算 MAC 的值)。
  5. 将 MAC 值与 COSE_Mac 或 COSE_Mac0 结构的 “tag” 字段进行比较。

7. 密钥对象

COSE Key 结构构建在 CBOR 映射之上。可 出现在 COSE Key 中的一组通用参数可见于 IANA “COSE Key Common Parameters” 注册表 [COSE.KeyParameters](见 第 11.2 节)。为 特定密钥类型定义的额外参数可见于 IANA “COSE Key Type Parameters” 注册表 [COSE.KeyTypes]

COSE Key Set 使用 CBOR 数组对象作为其底层类型。数组 元素的值是 COSE Key。COSE Key Set MUST 在数组中至少有一个元素。 COSE Key Set 的示例可见 附录 C.7

COSE Key Set 中的每个元素都MUST 独立处理。 如果 COSE Key Set 中的某个元素格式错误,或使用了应用无法理解的密钥, 则忽略该密钥,并正常处理其他密钥。

元素 “kty” 是 COSE_Key 映射中的必需元素。

描述 COSE_Key 和 COSE_KeySet 的 CDDL 语法为:

COSE_Key = {
    1 => tstr / int,          ; kty
    ? 2 => bstr,              ; kid
    ? 3 => tstr / int,        ; alg
    ? 4 => [+ (tstr / int) ], ; key_ops
    ? 5 => bstr,              ; Base IV
    * label => values
}

COSE_KeySet = [+COSE_Key]

7.1. COSE 密钥通用 参数

本文档为 COSE Key 对象定义一组通用参数。表 4 提供了本节 定义参数的摘要。也存在为特定密钥类型定义的参数。 密钥类型特定参数可见于 [RFC9053]

表 4密钥映射标签
名称 标签 CBOR 类型 值注册表 描述
kty 1 tstr / int COSE Key Types 密钥类型标识
kid 2 bstr 密钥标识值 -- 与消息中的 “kid” 匹配
alg 3 tstr / int COSE Algorithms 将密钥使用限制到此 算法
key_ops 4 [+ (tstr/int)] 限制允许操作的集合
Base IV 5 bstr 要与 Partial IV 异或的 Base IV
kty:
此参数用于标识该 结构的密钥族,从而标识可找到的一组密钥类型特定参数。 本文档中定义的一组值可见于 [COSE.KeyTypes]。此参数MUST 存在于密钥对象中。实现MUST 验证密钥类型适合正在处理的算法。 密钥类型MUST 作为 信任决策过程的一部分包含在内。
alg:
此参数用于限制 与该密钥一起使用的算法。如果此参数存在于密钥结构中, 应用MUST 验证此算法与该密钥所用于的算法匹配。 如果算法不匹配,则此密钥对象MUST NOT 用于执行该密码学操作。注意, 同一密钥可以出现在另一个密钥结构中,并指定不同算法或不指定算法; 但是,这被认为是不良安全实践。
kid:
此参数用于给出密钥的标识符。 该标识符没有结构,可以是从用户提供的字节字符串到基于密钥公开部分计算的值。 此字段旨在与消息中的 “kid” 参数进行匹配,以缩小需要检查的 密钥集合。 标识符的值不是唯一值,并且可能出现在其他密钥对象中, 即使这些对象用于不同密钥。
key_ops:
此参数定义为限制 一个密钥可用于的操作集合。该字段的值是来自 表 5 的值数组。算法定义 允许出现的 key ops 值以及特定操作所需的值。该组 值与 [RFC7517][W3C.WebCrypto] 中的值匹配。
Base IV:

此参数定义为承载 IV 的基础部分。它 设计为与 第 3.1 节 中定义的 Partial IV 头部参数一起使用。 此字段提供将 Base IV 与密钥关联的能力,然后该 Base IV 会按每条消息 通过 Partial IV 进行修改。

在应用中使用 Base IV 时需要极其小心。 如果同一 IV 被使用两次,许多加密算法会失去安全性。

如果为每个发送方派生不同密钥,则从同一个 Base IV 开始很可能 满足此条件。 如果多个发送方使用同一密钥,则应用需要提供一种方法,在 发送方之间划分 IV 空间。 这可以通过提供不同的基础起点或不同的 起始 Partial IV,并限制重新换密钥前可发送的消息数量来完成。

表 5密钥操作值
名称 描述
sign 1 该密钥用于创建签名。 需要私钥字段。
verify 2 该密钥用于验证 签名。
encrypt 3 该密钥用于密钥传输 加密。
decrypt 4 该密钥用于密钥传输 解密。需要私钥字段。
wrap key 5 该密钥用于密钥包装 加密。
unwrap key 6 该密钥用于密钥包装 解密。需要私钥字段。
derive key 7 该密钥用于派生密钥。 需要私钥字段。
derive bits 8 该密钥用于派生不 作为密钥使用的比特。需要私钥字段。
MAC create 9 该密钥用于创建 MAC。
MAC verify 10 该密钥用于验证 MAC。

8. COSE 使用的算法分类

本节列出了可在 COSE 中使用的不同算法类型的分类。 不应认为该分类是穷尽性的。 将会创建无法归入此分类的新算法。

8.1. 签名算法

签名算法提供数据来源和数据完整性服务。 数据来源提供基于谁签名了数据来推断数据由谁发起的能力。 数据完整性提供验证数据自签名以来未被 修改的能力。

有两种通用签名算法方案。 第一种是带附录的签名。 在此方案中,对消息内容进行处理并产生一个签名;该签名称为 附录。 这是 ECDSA 和 RSA 概率签名方案 (RSASSA-PSS)等算法使用的方案。 (事实上,RSASSA-PSS 中的 SSA 代表 Signature Scheme with Appendix。)

此方案的签名函数为:

signature = Sign(message content, key)

valid = Verification(message content, key, signature)

第二种方案是带消息恢复的签名;这类算法的一个示例是 [PVSig]。 在此方案中,对消息内容进行处理,但其中一部分会包含在签名中。 将消息内容的字节移入签名允许生成更小的签名消息;签名 大小仍然可能较大,但消息内容已缩小。 这会影响实现这些算法的系统以及使用它们的应用。 第一个影响是,在签名验证完成之前,消息内容不能完全 可用。 在此之前,签名内部包含的那部分消息无法恢复。 第二个影响是,对签名强度的安全分析可能非常 依赖于消息内容的结构。 最后,如果对消息应用多个签名,则所有签名 算法都将需要消耗消息内容中的同一组字节。 这意味着不支持在单个消息中混合使用带消息恢复签名和带附录签名 方案。

此方案的签名函数为:

signature, message sent = Sign(message content, key)

valid, message content = Verification(message sent, key, signature)

尚未为 COSE 正式定义任何消息恢复签名算法。鉴于此方案带来的新 约束,虽然已经识别出一些问题,但在集成消息恢复签名 算法时,很可能还会出现其他问题。 第一个定义的算法将需要对这些问题作出决定,而这些 决定很可能会约束任何后续定义的算法。

下文使用以下术语:

message content bytes:
由应用提供的、要 签名的字节字符串。
to-be-signed bytes:
传入签名 算法的字节字符串。
recovered bytes:
在签名 验证过程中恢复的字节。

已识别出的一些问题包括:

  • to-be-signed 字节与 message content 字节不同。 这是因为我们在签名处理期间构建了更大的待签名消息。 recovered 字节的长度可以超过 message content 的长度,但不能超过 to-be-signed 字节的长度。 如果例如外部提供的数据包含机密信息,这可能引发隐私考量。
  • 确定 recovered 字节与 to-be-signed 字节如何对应可能存在困难,因为 recovered 字节包含不在 message content 字节中的数据。 一个可能的选项是创建填充方案来防止这种情况。
  • 并非所有消息恢复签名算法都从 to-be-signed 字节末尾取得 recovered 字节。 这是一个问题,因为 message content 字节位于 to-be-signed 字节末尾。 如果要恢复的字节从 to-be-signed 字节开头取得,则默认情况下, 任何 message content 字节都可能不会包含在 recovered 字节中。 处理此问题的一个可能选项是,如果 recovered 字节从 to-be-signed 字节开头而不是末尾取得,则反转 to-be-signed 数据。

签名算法与 COSE_Signature 和 COSE_Sign1 结构一起使用。 在撰写本文时,仅定义了带附录签名可用于 COSE;但是, 由于可能实现有效的大小缩减,人们已表达出相当大的兴趣, 希望使用带消息恢复的签名算法。

8.2. 消息认证码 (MAC)算法

消息认证码(MAC)提供数据认证和完整性 保护。它们不提供或仅提供非常有限的数据来源。举例来说,MAC 不能 用于向第三方证明发送方身份。

MAC 使用与带附录签名算法相同的方案。消息内容 被处理,并生成认证码。认证码通常称为标签。

MAC 函数为:

tag = MAC_Create(message content, key)

valid = MAC_Verify(message content, key, tag)

MAC 算法可以基于分组密码算法(即 AES-MAC),也可以基于哈希算法 (即基于哈希的消息认证码(HMAC))。 [RFC9053] 使用这些 构造分别定义了一个 MAC 算法。

MAC 算法用于 COSE_Mac 和 COSE_Mac0 结构。

8.3. 内容加密 算法

内容加密算法使用对称密钥为可能较大的 数据块提供数据机密性。它们提供对被加密数据的完整性;但是, 它们不提供或仅提供非常有限的数据来源。(例如,不能用它来向 第三方证明发送方的身份。)提供数据来源的能力与 CEK 的获得方式相关。

COSE 将合法内容加密算法集合限制为支持 同时认证内容和附加数据的算法。加密过程将生成某种类型 的认证值,但根据算法定义,该值可以是显式的,也可以是隐式的。 为简单起见,认证码通常定义为追加到 密文流。加密函数为:

ciphertext = Encrypt(message content, key, additional data)

valid, message content = Decrypt(ciphertext, key, additional data)

大多数 AEAD 算法在逻辑上定义为仅当 解密有效时才返回消息内容。许多实现(但不是全部)会遵循这一约定。如果解密 未通过验证,则消息内容MUST NOT 被使用。

这些算法用于 COSE_Encrypt 和 COSE_Encrypt0。

8.4. 密钥派生函数 (KDF)

KDF 用于接收某个秘密值并生成另一个值。秘密值 有三种类型:

通用 KDF 与第一类秘密配合良好,与第二类秘密配合尚可, 而通常不适合最后一类秘密。Argon2 [RFC9106] 等函数需要用于非随机秘密。

同一个 KDF 可以被设置为以不同方式处理前两类秘密。 [RFC9053] 第 5.1 节中定义的 KDF 就是这样一种 函数。 这体现在围绕基于 HMAC 的提取并扩展密钥 派生函数(HKDF)定义的一组算法中。

使用 KDF 时,其中包含的一个组成部分是上下文信息。上下文 信息用于允许从同一个秘密派生出不同的密钥信息。使用 基于上下文的密钥材料被认为是一种良好安全实践。

8.5. 内容密钥分发 方法

内容密钥分发方法(接收方算法)可以定义为若干不同 类别。 COSE 有能力支持许多类别的接收方算法。 本节列出若干类别。对于 [RFC7516] 中定义的接收方算法类别, 使用相同名称。 其他规范对接收方算法类别使用不同术语,或不支持某些 接收方算法类别。

8.5.1. 直接加密

直接加密类别的算法在发送方 和接收方之间共享一个秘密,该秘密直接或经处理后作为 CEK 使用。当 使用 direct-encryption 模式时,它MUST 是消息中使用的唯一模式。

接收方的 COSE_Recipient 结构组织如下:

  • “protected” 字段MUST 是零长度字节字符串,除非它用于内容密钥的计算。
  • “alg” 头部参数MUST 存在。
  • 标识共享秘密的头部参数SHOULD 存在。
  • “ciphertext” 字段MUST 是零长度字节字符串。
  • “recipients” 字段MUST 不存在。

8.5.2. 密钥包装

在密钥包装模式中,CEK 随机生成,然后 该密钥由发送方与接收方之间的共享秘密加密。当前 为 COSE 定义的所有密钥包装算法都是 AE 算法。如果系统有 任何随机密钥生成能力,则密钥包装模式被认为优于 直接加密。这是因为共享密钥用于包装随机数据,而不是包装 具有某种组织程度、且实际上可能重复相同内容的数据。使用 密钥包装会失去由直接加密算法提供的弱数据来源 属性。

接收方的 COSE_Recipient 结构组织 如下:

  • 如果密钥包装算法是 AE 算法,则 “protected” 字段MUST 是零长度字节字符串。
  • “recipients” 字段通常不存在,但可以使用。 应用MUST 能处理存在 使用不受支持算法的 recipient 字段的情况。 无法解密该特定接收方是一种可接受的处理方式。 无法处理该消息不是一种可接受的处理方式。
  • 要加密的明文是来自 下一层(通常是内容层)的密钥。
  • “unprotected” 字段至少MUST 包含 “alg” 头部参数,并且SHOULD 包含标识共享 秘密的头部参数。

8.5.3. 密钥传输

密钥传输模式在一些标准中也称为密钥加密模式。 密钥传输模式与密钥包装模式不同,因为它使用非对称加密 算法而不是对称加密算法来保护密钥。 [RFC8230] 定义了一组密钥传输算法。

使用密钥传输算法时,接收方的 COSE_Recipient 结构 组织如下:

  • “protected” 字段MUST 是零长度字节字符串。
  • 要加密的明文是来自 下一层(通常是内容层)的密钥。
  • “unprotected” 字段至少MUST 包含 “alg” 头部参数,并且SHOULD 包含标识非对称密钥的参数。

8.5.4. 直接密钥协商

直接密钥协商类别的接收方算法使用密钥协商 方法创建共享秘密。随后将 KDF 应用于共享秘密,以派生用于 保护数据的密钥。该密钥通常用作 CEK 或 MAC 密钥,但如果使用 多于两层,也可以用于其他目的(见 附录 B)。

最常用的密钥协商算法是 Diffie-Hellman,但也存在 其他变体。由于 COSE 是为存储转发环境而不是在线 环境设计的,许多 DH 变体不能使用,因为消息接收方不能 提供任何动态密钥材料。其一个副作用是无法实现前向保密 (见 [RFC4949])。COSE 对象的接收方始终会使用 静态密钥。

支持的两种 DH 变体为:

Ephemeral-Static(ES)DH:
消息发送方创建一次性 DH 密钥,并为接收方使用静态密钥。使用临时发送方密钥意味着 不需要额外随机输入,因为这是为每条消息随机生成的。
Static-Static(SS)DH:
发送方和接收方 都使用静态密钥。使用静态密钥允许接收方获得消息的数据来源的弱版本。 当使用 Static-Static 密钥协商时,需要为 KDF 提供某段唯一数据,以确保每条 消息创建不同密钥。

使用直接密钥协商模式时,消息中MUST 只有一个接收方。此方法直接创建密钥, 因而难以与其他接收方混合。如果需要多个接收方,则需要使用 带密钥包装的版本。

接收方的 COSE_Recipient 结构组织如下:

  • 头部至少MUST 包含 “alg” 头部参数,并且SHOULD 包含标识 接收方非对称密钥的头部参数。
  • 对于 Static-Static 版本,头部SHOULD 标识 发送方密钥;对于 ephemeral-static 版本,头部MUST 包含 发送方的临时密钥。

8.5.5. 带密钥包装的 密钥协商

带密钥包装的密钥协商使用随机生成的 CEK。随后使用 密钥包装算法以及从密钥协商算法计算出的共享秘密派生出的密钥 对 CEK 加密。其函数为:

encryptedKey = KeyWrap(KDF(DH-Shared, context), CEK)

接收方的 COSE_Recipient 结构组织 如下:

  • “protected” 字段被送入 KDF 上下文 结构。
  • 要加密的明文是来自 下一层(通常是内容层)的密钥。
  • “alg” 头部参数MUST 存在于该层中。
  • 标识接收方密钥的头部参数 SHOULD 存在。标识 发送方密钥的头部参数SHOULD 存在。

9. CBOR 编码限制

本文档限制其对 CBOR 编码器需要如何工作的 约束。新的编码限制与 RFC 8949 [STD94] 第 4.2.1 节中规定的核心确定性编码要求保持一致。 已缩小到以下限制:

10. 应用配置文件考量

本文档旨在提供一组安全服务,但不为 具体用途施加算法实现要求。互操作性要求用于说明 每项单独服务如何使用,以及算法应如何用于 互操作。哪些算法和哪些服务是必需的这些要求,被推迟给 各应用决定。

配置文件的一个示例可见 [RFC8613], 其中为结合 CoAP 头部承载内容开发了一个配置文件。

预期会创建本文档的一个配置文件,用于定义 该特定应用的互操作性要求。本节提供一组指南 和在为本文档制作配置文件时需要考虑的主题。

11. IANA 考量

下列注册表和注册项由 RFC 8152 [RFC8152] 定义。 以下大多数操作用于更新引用,使其指向本文档。

注意,虽然 [RFC9053] 也更新了 最初由 [RFC8152] 建立的注册表 和注册项,但所请求的更新互不相同。本文档中请求的更新不会与 [RFC9053] 中请求的更新冲突或重叠,反之亦然。

11.1. COSE Header Parameters 注册表

“COSE Header Parameters” 注册表由 [RFC8152] 定义。 IANA 已更新此注册表的引用,使其指向本文档而不是 [RFC8152]。IANA 还更新了所有 引用 [RFC8152] 的条目,除了 “counter signature” 和 “CounterSignature0”,使其引用本文档。“counter signature” 和 “CounterSignature0” 的引用继续引用 [RFC8152]

11.2. COSE Key Common Parameters 注册表

“COSE Key Common Parameters” 注册表 [COSE.KeyParameters] 定义于 [RFC8152]。 IANA 已更新此注册表的引用,使其指向本文档而不是 [RFC8152]。IANA 还更新了 引用 [RFC8152] 的条目,使其引用 本文档。

11.3. 媒体类型注册

11.3.1. COSE 安全消息

IANA 已在 “Media Types” 注册表中注册 “application/cose” 媒体类型。此媒体类型用于指示内容是 COSE 消息。

类型名称:
application
子类型名称:
cose
必需参数:
N/A
可选参数:
cose-type
编码考量:
binary
安全考量:
见 RFC 9052 的安全考量章节。
互操作性考量:
N/A
已发布规范:
RFC 9052
使用此媒体类型的应用:
通过 HTTP(S) 传输发送安全 内容的 IoT 应用。
片段标识符考量:
N/A
附加信息:
  • 此类型的已弃用别名: N/A
  • 魔数:N/A
  • 文件扩展名:cbor
  • Macintosh 文件类型代码:N/A
联系人及电子邮件地址:

iesg@ietf.org
预期用途:
COMMON
使用限制:
N/A
作者:
Jim Schaad
变更控制者:
IESG
临时注册?

11.3.2. COSE 密钥媒体类型

IANA 已在 “Media Types” 注册表中注册 “application/cose-key” 和 “application/cose-key-set” 媒体类型。这些媒体类型分别用于 指示内容是 COSE_Key 或 COSE_KeySet 对象。

“application/cose-key” 的模板如下:

类型名称:
application
子类型名称:
cose-key
必需参数:
N/A
可选参数:
N/A
编码考量:
binary
安全考量:
见 RFC 9052 的安全考量章节。
互操作性考量:
N/A
已发布规范:
RFC 9052
使用此媒体类型的应用:
为 IoT 应用分发基于 COSE 的密钥。
片段标识符考量:
N/A
附加信息:
  • 此类型的已弃用别名: N/A
  • 魔数:N/A
  • 文件扩展名:cbor
  • Macintosh 文件类型代码:N/A
联系人及电子邮件地址:

iesg@ietf.org
预期用途:
COMMON
使用限制:
N/A
作者:
Jim Schaad
变更控制者:
IESG
临时注册?

注册 “application/cose-key-set” 的模板为:

类型名称:
application
子类型名称:
cose-key-set
必需参数:
N/A
可选参数:
N/A
编码考量:
binary
安全考量:
见 RFC 9052 的安全考量章节。
互操作性考量:
N/A
已发布规范:
RFC 9052
使用此媒体类型的应用:
为 IoT 应用分发基于 COSE 的密钥。
片段标识符考量:
N/A
附加信息:
  • 此类型的已弃用别名: N/A
  • 魔数:N/A
  • 文件扩展名:cbor
  • Macintosh 文件类型代码:N/A
联系人及电子邮件地址:
iesg@ietf.org
预期用途:
COMMON
使用限制:
N/A
作者:
Jim Schaad
变更控制者:
IESG
临时注册?

11.4. CoAP Content-Formats 注册表

IANA 已按 [RFC8152] 所示向 “CoAP Content-Formats” 注册表添加条目。IANA 已更新引用, 使其指向本文档而不是 [RFC8152]

11.5. CBOR Tags 注册表

IANA 已按 [RFC8152] 所示向 “CBOR Tags” 注册表添加条目。IANA 已更新引用, 使其指向本文档而不是 [RFC8152]

11.6. 专家评审 指令

[RFC8152] 建立的所有 IANA 注册表至少部分定义为专家评审 [RFC8126]。本节给出一些通用 指南,说明专家应关注什么,但他们被指定为专家是有原因的, 因而应给予他们相当大的自由裁量权。

专家评审员应考虑以下事项:

  • 应阻止码点抢占。鼓励评审员 为注册请求获取足够信息,以确保其用途不会 重复现有注册,并且该码点很可能会在部署中使用。标记为私有使用的范围 旨在用于测试目的和封闭环境;其他范围中的码点不应为测试而分配。
  • 在 Standards Action 范围内注册 码点需要标准轨道或 BCP RFC。Specification Required 范围应存在规范,但在 RFC 可用之前的早期分配被认为是 允许的。如果预期码点会以可互操作方式在封闭环境之外使用, 则先到先得范围也需要规范。如果 未提供规范,则所提供描述需要有足够 信息来识别该码点用途。
  • 专家在批准码点分配时,应考虑 字段的预期用途。 Standards Action 范围仅可供 标准轨道文档使用这一事实,并不意味着标准轨道文档 不能在该范围之外分配点。应权衡编码值的长度 与该长度还剩多少码点,以及将使用它的设备大小。
  • 注册算法时,应阻止虚荣注册。 一种做法是要求注册提供关于算法安全分析的额外 文档。另一个应考虑的事项是向 Crypto Forum Research Group(CFRG) 请求对该算法的意见。 预计算法要满足社群的安全要求以及消息结构的要求, 才适合注册。

12. 安全考量

本规范的实现者需要考虑许多安全事项。 虽然这里强调了一些考量,但额外考量可见于 参考文献中列出的文档。

实现需要保护所有个体的私钥材料。本文档中的一些 情况需要就此问题特别强调。

使用椭圆曲线 Diffie-Hellman(ECDH)以及 direct plus KDF(不带密钥包装) 不会直接导致私钥泄露;KDF 的单向函数会防止 这种情况。但是,另有一个需要解决的问题。存在两个接收方要求 CEK 在两个接收方之间共享。因此,第二个接收方拥有从 可用于弱来源证明的材料派生出的 CEK。第二个接收方可以使用 同一 CEK 创建消息并发送给第一个接收方;对于 Static-Static ECDH 或 direct plus KDF,第一个接收方会假定该 CEK 可用于来源 证明,即使它来自错误实体。如果添加密钥包装步骤,则不会暗示来源证明, 这也就不是问题。

虽然前面已经提到,但仍值得重申:在某些情况下,使用单个密钥用于多个 算法已被证明会泄露关于密钥的信息,从而为 攻击者伪造完整性标签或获取加密内容信息提供机会。 将密钥绑定到单个算法可防止这些问题。 强烈鼓励密钥创建者和密钥使用者不仅为每个不同算法创建新密钥, 还应在任何密钥材料分发中包含该算法选择,并严格 强制密钥结构中的算法与消息结构中的算法匹配。 除检查算法是否正确外,还需要检查密钥形式。 不要在预期 “OKP” 密钥的地方使用 “EC2” 密钥。

在使用密钥进行传输之前,或在根据收到的信息采取行动之前, 需要对密钥作出信任决策。与该密钥关联的实体是否有权查看 该数据或请求该操作?许多因素与此信任 决策相关。这里强调的一些因素包括:

一个受到关注的领域是基于消息长度对加密消息进行流量分析。 本规范没有提供统一方法,将填充作为消息结构的一部分提供。 对于 [RFC9053] 中定义的所有内容加密算法, 观察者都可以基于长度区分两个不同消息(例如 “YES” 和 “NO”)。 这意味着应用需要自行记录如何进行内容填充,以防止或抑制此类 分析。(例如,文本字符串可以定义为 “YES” 和 “NO ”。)

13. 参考文献

13.1. 规范性参考文献

[RFC2119]
Bradner, S., “RFC 中用于 指示需求级别的关键词”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC8174]
Leiba, B., “RFC 2119 关键词中大写与 小写的歧义”, BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC9053]
Schaad, J., “CBOR 对象签名与 加密(COSE):初始算法”, RFC 9053, DOI 10.17487/RFC9053, , <https://www.rfc-editor.org/info/rfc9053>.
[STD94]
Bormann, C. and P. Hoffman, “简明二进制对象表示(CBOR)”, STD 94, RFC 8949, , <https://www.rfc-editor.org/info/std94>.

13.2. 资料性参考文献

[BCP201]
Housley, R., “密码学 算法敏捷性和选择强制实现算法的指南”, BCP 201, RFC 7696, , <https://www.rfc-editor.org/info/bcp201>.
[COAP.Formats]
IANA, “CoAP Content-Formats”, <https://www.iana.org/assignments/core-parameters/>.
[CORE-GROUPCOMM]
Dijk, E., Wang, C., and M. Tiloca, “受限应用协议(CoAP)的 组通信”, 进行中的工作, Internet-Draft, draft-ietf-core-groupcomm-bis-07, , <https://datatracker.ietf.org/doc/html/draft-ietf-core-groupcomm-bis-07>.
[COSE-COUNTERSIGN]
Schaad, J. and R. Housley, “CBOR 对象签名与加密(COSE):会签”, 进行中的工作, Internet-Draft, draft-ietf-cose-countersign-08, , <https://datatracker.ietf.org/doc/html/draft-ietf-cose-countersign-08>.
[COSE.Algorithms]
IANA, “COSE Algorithms”, <https://www.iana.org/assignments/cose/>.
[COSE.KeyParameters]
IANA, “COSE Key Common Parameters”, <https://www.iana.org/assignments/cose/>.
[COSE.KeyTypes]
IANA, “COSE Key Types”, <https://www.iana.org/assignments/cose/>.
[DSS]
National Institute of Standards and Technology, “数字签名标准(DSS)”, FIPS 186-4, DOI 10.6028/NIST.FIPS.186-4, , <https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf>.
[GitHub-Examples]
“COSE 的 GitHub 示例”, 提交 3221310, , <https://github.com/cose-wg/Examples>.
[PVSig]
Brown, D.R.L. and D.B. Johnson, “带部分消息 恢复的签名方案的形式化安全证明”, LNCS Volume 2020, DOI 10.1007/3-540-45353-9_11, , <https://www.certicom.com/content/dam/certicom/images/pdfs/CerticomWP-PVSigSec_login.pdf>.
[RFC2633]
Ramsdell, B., Ed., “S/MIME 版本 3 消息 规范”, RFC 2633, DOI 10.17487/RFC2633, , <https://www.rfc-editor.org/info/rfc2633>.
[RFC3394]
Schaad, J. and R. Housley, “高级加密标准(AES)密钥包装算法”, RFC 3394, DOI 10.17487/RFC3394, , <https://www.rfc-editor.org/info/rfc3394>.
[RFC3851]
Ramsdell, B., Ed., “安全/多用途 互联网邮件扩展(S/MIME)版本 3.1 消息规范”, RFC 3851, DOI 10.17487/RFC3851, , <https://www.rfc-editor.org/info/rfc3851>.
[RFC4262]
Santesson, S., “用于安全/多用途互联网邮件扩展(S/MIME)能力的 X.509 证书扩展”, RFC 4262, DOI 10.17487/RFC4262, , <https://www.rfc-editor.org/info/rfc4262>.
[RFC4949]
Shirey, R., “互联网安全术语表, 版本 2”, FYI 36, RFC 4949, DOI 10.17487/RFC4949, , <https://www.rfc-editor.org/info/rfc4949>.
[RFC5116]
McGrew, D., “认证加密的接口和算法”, RFC 5116, DOI 10.17487/RFC5116, , <https://www.rfc-editor.org/info/rfc5116>.
[RFC5652]
Housley, R., “密码学消息语法 (CMS)”, STD 70, RFC 5652, DOI 10.17487/RFC5652, , <https://www.rfc-editor.org/info/rfc5652>.
[RFC5751]
Ramsdell, B. and S. Turner, “安全/多用途互联网邮件扩展(S/MIME)版本 3.2 消息 规范”, RFC 5751, DOI 10.17487/RFC5751, , <https://www.rfc-editor.org/info/rfc5751>.
[RFC5752]
Turner, S. and J. Schaad, “密码学消息语法(CMS)中的多个签名”, RFC 5752, DOI 10.17487/RFC5752, , <https://www.rfc-editor.org/info/rfc5752>.
[RFC5990]
Randall, J., Kaliski, B., Brainard, J., and S. Turner, “在密码学消息语法 (CMS)中使用 RSA-KEM 密钥传输算法”, RFC 5990, DOI 10.17487/RFC5990, , <https://www.rfc-editor.org/info/rfc5990>.
[RFC6838]
Freed, N., Klensin, J., and T. Hansen, “媒体类型规范和 注册过程”, BCP 13, RFC 6838, DOI 10.17487/RFC6838, , <https://www.rfc-editor.org/info/rfc6838>.
[RFC7252]
Shelby, Z., Hartke, K., and C. Bormann, “受限应用 协议(CoAP)”, RFC 7252, DOI 10.17487/RFC7252, , <https://www.rfc-editor.org/info/rfc7252>.
[RFC7515]
Jones, M., Bradley, J., and N. Sakimura, “JSON Web Signature(JWS)”, RFC 7515, DOI 10.17487/RFC7515, , <https://www.rfc-editor.org/info/rfc7515>.
[RFC7516]
Jones, M. and J. Hildebrand, “JSON Web Encryption(JWE)”, RFC 7516, DOI 10.17487/RFC7516, , <https://www.rfc-editor.org/info/rfc7516>.
[RFC7517]
Jones, M., “JSON Web Key(JWK)”, RFC 7517, DOI 10.17487/RFC7517, , <https://www.rfc-editor.org/info/rfc7517>.
[RFC7518]
Jones, M., “JSON Web Algorithms(JWA)”, RFC 7518, DOI 10.17487/RFC7518, , <https://www.rfc-editor.org/info/rfc7518>.
[RFC8032]
Josefsson, S. and I. Liusvaara, “Edwards 曲线数字签名算法(EdDSA)”, RFC 8032, DOI 10.17487/RFC8032, , <https://www.rfc-editor.org/info/rfc8032>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, “RFC 中撰写 IANA 考量章节的指南”, BCP 26, RFC 8126, DOI 10.17487/RFC8126, , <https://www.rfc-editor.org/info/rfc8126>.
[RFC8152]
Schaad, J., “CBOR 对象签名与 加密(COSE)”, RFC 8152, DOI 10.17487/RFC8152, , <https://www.rfc-editor.org/info/rfc8152>.
[RFC8230]
Jones, M., “在 CBOR 对象签名与加密(COSE)消息中使用 RSA 算法”, RFC 8230, DOI 10.17487/RFC8230, , <https://www.rfc-editor.org/info/rfc8230>.
[RFC8551]
Schaad, J., Ramsdell, B., and S. Turner, “安全/多用途互联网邮件 扩展(S/MIME)版本 4.0 消息规范”, RFC 8551, DOI 10.17487/RFC8551, , <https://www.rfc-editor.org/info/rfc8551>.
[RFC8610]
Birkholz, H., Vigano, C., and C. Bormann, “简明数据定义语言 (CDDL):表达简明二进制对象表示(CBOR)和 JSON 数据结构的记法约定”, RFC 8610, DOI 10.17487/RFC8610, , <https://www.rfc-editor.org/info/rfc8610>.
[RFC8613]
Selander, G., Mattsson, J., Palombini, F., and L. Seitz, “受限 RESTful 环境的对象安全(OSCORE)”, RFC 8613, DOI 10.17487/RFC8613, , <https://www.rfc-editor.org/info/rfc8613>.
[RFC9054]
Schaad, J., “CBOR 对象签名与 加密(COSE):哈希算法”, RFC 9054, DOI 10.17487/RFC9054, , <https://www.rfc-editor.org/info/rfc9054>.
[RFC9106]
Biryukov, A., Dinu, D., Khovratovich, D., and S. Josefsson, “用于密码哈希和工作量证明 应用的 Argon2 内存困难函数”, RFC 9106, DOI 10.17487/RFC9106, , <https://www.rfc-editor.org/info/rfc9106>.
[STD90]
Bray, T., Ed., “JavaScript 对象表示法 (JSON)数据交换格式”, STD 90, RFC 8259, , <https://www.rfc-editor.org/info/std90>.
[W3C.WebCrypto]
Watson, M., Ed., “Web Cryptography API”, W3C 推荐标准, , <https://www.w3.org/TR/WebCryptoAPI/>.

附录 A. 算法外部数据 认证指南

在 COSE 开发期间,要求算法标识符位于受保护 属性中的要求从必须放宽为应该。 已提出两个基本理由来支持这一立场。 首先,如果在 CoAP 环境中最常见的消息中省略算法标识符, 则生成的消息会更小。 其次,如果没有在算法标识符可放置的不同位置之间 正确进行完整检查,则可能出现潜在错误(消息本身、应用声明、 发送方拥有的密钥结构,以及接收方拥有的密钥结构)。

本附录说明如何进行这种变更,以及应用为了使用此选项 需要规定的细节。 这里规定了两组不同的细节:省略算法标识符所需的细节,以及 使用不包含自身属性的会签属性变体所需的细节。

列出了三组建议。第一组建议适用于 为 COSE 对象的单一层标识隐式算法。第二组 建议适用于为 COSE 对象的多层标识多个隐式算法。 第三组建议适用于为多个 COSE 对象构造使用隐式算法。

这里刻意不使用 BCP 14([RFC2119][RFC8174])中的关键词。本 规范可以提供建议,但不能强制执行这些建议。

这组建议适用于这样的情况:应用正在随密钥信息一起分发 固定算法,以用于单个 COSE 对象。这通常适用于 最小的 COSE 对象 -- 具体而言,COSE_Sign1、COSE_Mac0 和 COSE_Encrypt0 -- 但也可适用于 其他结构。

应考虑以下事项:

第二种情况是为多层 COSE 对象指定多个隐式算法 标识符。其工作方式的一个示例是应用指定的加密上下文, 其中包含内容加密算法、密钥包装算法、密钥标识符和 共享秘密。发送方省略发送内容层和 接收方层的算法标识符,只留下密钥标识符。接收方随后使用 密钥标识符获取隐式算法标识符。

还需要考虑以下附加事项:

第三种情况是存在多个隐式算法标识符,但目标是 可能不相关的层或不同的 COSE 对象。在许多不同场景中这可能适用。 其中一些场景包括:

对于这些情况,需要考虑以下附加事项:

附录 B. 两层接收方 信息

当前定义的所有接收方算法类别都只使用 COSE 结构的两层。 第一层(COSE_Encrypt)是消息内容,第二层(COSE_Recipient)是 内容密钥加密。 但是,如果使用诸如 RSA 密钥封装机制(RSA-KEM)的接收方算法(见 RSA-KEM [RFC5990] 附录 A),那么使用 两层 COSE_Recipient 结构是合理的。

这些层为:

这是三层消息外观的一个示例。为了更易阅读, 它使用扩展 CBOR 诊断记法(定义于 [RFC8610])呈现,而不是作为二进制转储呈现。该消息具有以下 层:

实际上,此示例是使用 ECDH-ES+A128KW 算法的分解版本。

二进制文件大小为 183 字节

96(
  [ / COSE_Encrypt /
    / protected h'a10101' / << {
        / alg / 1:1 / AES-GCM 128 /
      } >>,
    / unprotected / {
      / iv / 5:h'02d1f7e6f26c43d4868d87ce'
    },
    / ciphertext / h'64f84d913ba60a76070a9a48f26e97e863e2852948658f0
811139868826e89218a75715b',
    / recipients / [
      [ / COSE_Recipient /
        / protected / h'',
        / unprotected / {
          / alg / 1:-3 / A128KW /
        },
        / ciphertext / h'dbd43c4e9d719c27c6275c67d628d493f090593db82
18f11',
        / recipients / [
          [ / COSE_Recipient /
            / protected h'a1013818' / << {
                / alg / 1:-25 / ECDH-ES + HKDF-256 /
              } >> ,
            / unprotected / {
              / ephemeral / -1:{
                / kty / 1:2,
                / crv / -1:1,
                / x / -2:h'b2add44368ea6d641f9ca9af308b4079aeb519f11
e9b8a55a600b21233e86e68',
                / y / -3:false
              },
              / kid / 4:'meriadoc.brandybuck@buckland.example'
            },
            / ciphertext / h''
          ]
        ]
      ]
    ]
  ]
)

附录 C. 示例

本附录包含一组示例,展示本文档中定义的不同特性和消息 类型。为了使示例更易阅读,它们使用扩展 CBOR 诊断记法(定义于 [RFC8610])呈现,而不是作为二进制转储呈现。

已在 [GitHub-Examples] 创建一个 GitHub 项目,其中不仅包含本文档中给出的示例, 还包含更完整的一组测试示例。 每个示例都位于一个 JSON 文件中,该文件包含用于创建示例的输入、一些可用于 调试示例的中间值,以及以十六进制转储和 CBOR 诊断记法格式 呈现的示例输出。 该站点上的一些示例被设计为失败测试用例;这些在 JSON 文件中 有明确标记。 如果发现本文档中的示例存在错误,则会更新 GitHub 上的示例,并在 JSON 文件中放置说明此事的注记。

如前所述,示例使用 CBOR 的诊断记法呈现。存在一个基于 Ruby 的 工具,可在诊断记法和二进制之间进行转换。可使用 以下命令行安装该工具:

gem install cbor-diag

可使用以下命令行将诊断记法转换为二进制 文件:

diag2cbor.rb < inputfile > outputfile

可以通过 XPath 表达式从本文档的 XML 版本中提取示例,因为所有源代码都使用属性 type='cbor-diag' 标记。 (取决于所使用的 XPath 求值器,可能需要将 &gt; 作为实体处理。)

//sourcecode[@type='cbor-diag']/text()

C.1. 签名 消息示例

C.1.1. 单个签名

此示例使用以下内容:

  • 签名算法:ECDSA w/ SHA-256,曲线 P-256

二进制文件大小为 103 字节

98(
  [
    / protected / h'',
    / unprotected / {},
    / payload / 'This is the content.',
    / signatures / [
      [
        / protected h'a10126' / << {
            / alg / 1:-7 / ECDSA 256 /
          } >>,
        / unprotected / {
          / kid / 4:'11'
        },
        / signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
      ]
    ]
  ]
)

C.1.2. 多个签名者

此示例使用以下内容:

  • 签名算法:ECDSA w/ SHA-256,曲线 P-256
  • 签名算法:ECDSA w/ SHA-512,曲线 P-521

二进制文件大小为 277 字节

98(
  [
    / protected / h'',
    / unprotected / {},
    / payload / 'This is the content.',
    / signatures / [
      [
        / protected h'a10126' / << {
            / alg / 1:-7 / ECDSA 256 /
          } >>,
        / unprotected / {
          / kid / 4:'11'
        },
        / signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
      ],
      [
        / protected h'a1013823' / << {
            / alg / 1:-36 / ECDSA 521 /
          } >> ,
        / unprotected / {
          / kid / 4:'bilbo.baggins@hobbiton.example'
        },
        / signature / h'00a2d28a7c2bdb1587877420f65adf7d0b9a06635dd1
de64bb62974c863f0b160dd2163734034e6ac003b01e8705524c5c4ca479a952f024
7ee8cb0b4fb7397ba08d009e0c8bf482270cc5771aa143966e5a469a09f613488030
c5b07ec6d722e3835adb5b2d8c44e95ffb13877dd2582866883535de3bb03d01753f
83ab87bb4f7a0297'
      ]
    ]
  ]
)

C.1.3. 带 关键性的签名

此示例使用以下内容:

  • 签名算法:ECDSA w/ SHA-256,曲线 P-256
  • “reserved” 头部参数上有 关键性标记。

二进制文件大小为 125 字节

98(
  [
    / protected h'a2687265736572766564f40281687265736572766564' /
    << {
        "reserved":false,
        / crit / 2:[
          "reserved"
        ]
      } >>,
    / unprotected / {},
    / payload / 'This is the content.',
    / signatures / [
      [
        / protected h'a10126' / << {
            / alg / 1:-7 / ECDSA 256 /
          } >>,
        / unprotected / {
          / kid / 4:'11'
        },
        / signature / h'3fc54702aa56e1b2cb20284294c9106a63f91bac658d
69351210a031d8fc7c5ff3e4be39445b1a3e83e1510d1aca2f2e8a7c081c7645042b
18aba9d1fad1bd9c'
      ]
    ]
  ]
)

C.2. 单一签名者示例

C.2.1. 单个 ECDSA 签名

此示例使用以下内容:

  • 签名算法:ECDSA w/ SHA-256,曲线 P-256

二进制文件大小为 98 字节

18(
  [
    / protected h'a10126' / << {
        / alg / 1:-7 / ECDSA 256 /
      } >>,
    / unprotected / {
      / kid / 4:'11'
    },
    / payload / 'This is the content.',
    / signature / h'8eb33e4ca31d1c465ab05aac34cc6b23d58fef5c083106c4
d25a91aef0b0117e2af9a291aa32e14ab834dc56ed2a223444547e01f11d3b0916e5
a4c345cacb36'
  ]
)

C.3. 封装 消息示例

C.3.1. 直接 ECDH

此示例使用以下内容:

  • CEK:AES-GCM w/ 128 位密钥
  • 接收方类别:ECDH Ephemeral-Static,曲线 P-256

二进制文件大小为 151 字节

96(
  [
    / protected h'a10101' / << {
        / alg / 1:1 / AES-GCM 128 /
      } >>,
    / unprotected / {
      / iv / 5:h'c9cf4df2fe6c632bf7886413'
    },
    / ciphertext / h'7adbe2709ca818fb415f1e5df66f4e1a51053ba6d65a1a0
c52a357da7a644b8070a151b0',
    / recipients / [
      [
        / protected h'a1013818' / << {
            / alg / 1:-25 / ECDH-ES + HKDF-256 /
          } >>,
        / unprotected / {
          / ephemeral / -1:{
            / kty / 1:2,
            / crv / -1:1,
            / x / -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbf
bf054e1c7b4d91d6280',
            / y / -3:true
          },
          / kid / 4:'meriadoc.brandybuck@buckland.example'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.3.2. 直接加 密钥派生

此示例使用以下内容:

  • CEK:AES-CCM w/ 128 位密钥,将标签 截断为 64 位
  • 接收方类别:对共享秘密使用 HKDF,并将 以下隐式字段作为上下文的一部分。

    • salt: "aabbccddeeffgghh"
    • PartyU identity: "lighting-client"
    • PartyV identity: "lighting-server"
    • Supplementary Public Other: "Encryption Example 02"

二进制文件大小为 91 字节

96(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >>,
    / unprotected / {
      / iv / 5:h'89f52f65a1c580933b5261a76c'
    },
    / ciphertext / h'753548a19b1307084ca7b2056924ed95f2e3b17006dfe93
1b687b847',
    / recipients / [
      [
        / protected h'a10129' / << {
            / alg / 1:-10
          } >>,
        / unprotected / {
          / salt / -20:'aabbccddeeffgghh',
          / kid / 4:'our-secret'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.3.3. 带外部数据的 加密内容

此示例使用以下内容:

  • CEK:AES-GCM w/ 128 位密钥
  • 接收方类别:ECDH Static-Static,曲线 P-256,带 AES Key Wrap
  • 外部提供的 AAD: h'0011bbcc22dd44ee55ff660077'

二进制文件大小为 173 字节

96(
  [
    / protected h'a10101' / << {
        / alg / 1:1 / AES-GCM 128 /
      } >> ,
    / unprotected / {
      / iv / 5:h'02d1f7e6f26c43d4868d87ce'
    },
    / ciphertext / h'64f84d913ba60a76070a9a48f26e97e863e28529d8f5335
e5f0165eee976b4a5f6c6f09d',
    / recipients / [
      [
        / protected / h'a101381f' / {
            \ alg \ 1:-32 \ ECDH-SS+A128KW \
          } / ,
        / unprotected / {
          / static kid / -3:'peregrin.took@tuckborough.example',
          / kid / 4:'meriadoc.brandybuck@buckland.example',
          / U nonce / -22:h'0101'
        },
        / ciphertext / h'41e0d76f579dbd0d936a662d54d8582037de2e366fd
e1c62'
      ]
    ]
  ]
)

C.4. 加密 消息示例

C.4.1. 简单加密 消息

此示例使用以下内容:

  • CEK:AES-CCM w/ 128 位密钥和 64 位 标签

二进制文件大小为 52 字节

16(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >> ,
    / unprotected / {
      / iv / 5:h'89f52f65a1c580933b5261a78c'
    },
    / ciphertext / h'5974e1b99a3a4cc09a659aa2e9e7fff161d38ce71cb45ce
460ffb569'
  ]
)

C.4.2. 带 Partial IV 的 加密消息

此示例使用以下内容:

  • CEK:AES-CCM w/ 128 位密钥和 64 位 标签
  • IV 的前缀为 89F52F65A1C580933B52

二进制文件大小为 41 字节

16(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >> ,
    / unprotected / {
      / partial iv / 6:h'61a7'
    },
    / ciphertext / h'252a8911d465c125b6764739700f0141ed09192de139e05
3bd09abca'
  ]
)

C.5. MACed 消息示例

C.5.1. 共享秘密 直接 MAC

此示例使用以下内容:

  • MAC:AES-CMAC,256 位密钥,截断为 64 位
  • 接收方类别:直接共享秘密

二进制文件大小为 57 字节

97(
  [
    / protected h'a1010f' / << {
        / alg / 1:15 / AES-CBC-MAC-256//64 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'9e1226ba1f81b848',
    / recipients / [
      [
        / protected / h'',
        / unprotected / {
          / alg / 1:-6 / direct /,
          / kid / 4:'our-secret'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.5.2. ECDH 直接 MAC

此示例使用以下内容:

  • MAC:HMAC w/SHA-256,256 位密钥
  • 接收方类别:ECDH 密钥协商,两个 静态密钥,HKDF w/context structure

二进制文件大小为 214 字节

97(
  [
    / protected h'a10105' / << {
        / alg / 1:5 / HMAC 256//256 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'81a03448acd3d305376eaa11fb3fe416a955be2cbe7ec96f012c99
4bc3f16a41',
    / recipients / [
      [
        / protected h'a101381a' / << {
            / alg / 1:-27 / ECDH-SS + HKDF-256 /
          } >> ,
        / unprotected / {
          / static kid / -3:'peregrin.took@tuckborough.example',
          / kid / 4:'meriadoc.brandybuck@buckland.example',
          / U nonce / -22:h'4d8553e7e74f3c6a3a9dd3ef286a8195cbf8a23d
19558ccfec7d34b824f42d92bd06bd2c7f0271f0214e141fb779ae2856abf585a583
68b017e7f2a9e5ce4db5'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.5.3. 包装的 MAC

此示例使用以下内容:

  • MAC:AES-MAC,128 位密钥,截断为 64 位
  • 接收方类别:AES Key Wrap w/ 预共享 256 位密钥

二进制文件大小为 109 字节

97(
  [
    / protected h'a1010e' / << {
        / alg / 1:14 / AES-CBC-MAC-128//64 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'36f5afaf0bab5d43',
    / recipients / [
      [
        / protected / h'',
        / unprotected / {
          / alg / 1:-5 / A256KW /,
          / kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
        },
        / ciphertext / h'711ab0dc2fc4585dce27effa6781c8093eba906f227
b6eb0'
      ]
    ]
  ]
)

C.5.4. 多接收方 MACed 消息

此示例使用以下内容:

  • MAC:HMAC w/ SHA-256,128 位密钥
  • 接收方类别:使用两种不同方法。

    1. ECDH Ephemeral-Static,曲线 P-521,AES Key Wrap w/ 128 位密钥
    2. AES Key Wrap w/ 256 位密钥

二进制文件大小为 309 字节

97(
  [
    / protected h'a10105' / << {
        / alg / 1:5 / HMAC 256//256 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'bf48235e809b5c42e995f2b7d5fa13620e7ed834e337f6aa43df16
1e49e9323e',
    / recipients / [
      [
        / protected h'a101381c' / << {
            / alg / 1:-29 / ECDH-ES+A128KW /
          } >> ,
        / unprotected / {
          / ephemeral / -1:{
            / kty / 1:2,
            / crv / -1:3,
            / x / -2:h'0043b12669acac3fd27898ffba0bcd2e6c366d53bc4db
71f909a759304acfb5e18cdc7ba0b13ff8c7636271a6924b1ac63c02688075b55ef2
d613574e7dc242f79c3',
            / y / -3:true
          },
          / kid / 4:'bilbo.baggins@hobbiton.example'
        },
        / ciphertext / h'339bc4f79984cdc6b3e6ce5f315a4c7d2b0ac466fce
a69e8c07dfbca5bb1f661bc5f8e0df9e3eff5'
      ],
      [
        / protected / h'',
        / unprotected / {
          / alg / 1:-5 / A256KW /,
          / kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
        },
        / ciphertext / h'0b2c7cfce04e98276342d6476a7723c090dfdd15f9a
518e7736549e998370695e6d6a83b4ae507bb'
      ]
    ]
  ]
)

C.6. MAC0 消息示例

C.6.1. 共享秘密 直接 MAC

此示例使用以下内容:

  • MAC:AES-CMAC,256 位密钥,截断为 64 位
  • 接收方类别:直接共享秘密

二进制文件大小为 37 字节

17(
  [
    / protected h'a1010f' / << {
        / alg / 1:15 / AES-CBC-MAC-256//64 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'726043745027214f'
  ]
)

注意,此示例使用与 附录 C.5.1 相同的输入。

C.7. COSE 密钥

C.7.1. 公钥

这是 COSE Key Set 的一个示例。此示例包含所有先前示例的 公钥。

按顺序,这些密钥为:

  • kid 为 "meriadoc.brandybuck@buckland.example" 的 EC 密钥
  • kid 为 "11" 的 EC 密钥
  • kid 为 "bilbo.baggins@hobbiton.example" 的 EC 密钥
  • kid 为 "peregrin.took@tuckborough.example" 的 EC 密钥

二进制文件大小为 481 字节

[
  {
    -1:1,
    -2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
    -3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
    1:2,
    2:'meriadoc.brandybuck@buckland.example'
  },
  {
    -1:1,
    -2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
    -3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
    1:2,
    2:'11'
  },
  {
    -1:3,
    -2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
    -3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
    1:2,
    2:'bilbo.baggins@hobbiton.example'
  },
  {
    -1:1,
    -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
    -3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
    1:2,
    2:'peregrin.took@tuckborough.example'
  }
]

C.7.2. 私钥

这是 COSE Key Set 的一个示例。此示例包含所有先前示例的 私钥。

按顺序,这些密钥为:

  • kid 为 "meriadoc.brandybuck@buckland.example" 的 EC 密钥
  • kid 为 "11" 的 EC 密钥
  • kid 为 "bilbo.baggins@hobbiton.example" 的 EC 密钥
  • kid 为 "our-secret" 的共享秘密密钥
  • kid 为 "peregrin.took@tuckborough.example" 的 EC 密钥
  • kid 为 "our-secret2" 的共享秘密密钥
  • kid 为 "018c0ae5-4d9b-471b-bfd6-eef314bc7037" 的共享秘密密钥

二进制文件大小为 816 字节

[
  {
    1:2,
    2:'meriadoc.brandybuck@buckland.example',
    -1:1,
    -2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
    -3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
    -4:h'aff907c99f9ad3aae6c4cdf21122bce2bd68b5283e6907154ad911840fa
208cf'
  },
  {
    1:2,
    2:'11',
    -1:1,
    -2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
    -3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
    -4:h'57c92077664146e876760c9520d054aa93c3afb04e306705db609030850
7b4d3'
  },
  {
    1:2,
    2:'bilbo.baggins@hobbiton.example',
    -1:3,
    -2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
    -3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
    -4:h'00085138ddabf5ca975f5860f91a08e91d6d5f9a76ad4018766a476680b
55cd339e8ab6c72b5facdb2a2a50ac25bd086647dd3e2e6e99e84ca2c3609fdf177f
eb26d'
  },
  {
    1:4,
    2:'our-secret',
    -1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
  },
  {
    1:2,
    -1:1,
    2:'peregrin.took@tuckborough.example',
    -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
    -3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
    -4:h'02d1f7e6f26c43d4868d87ceb2353161740aacf1f7163647984b522a848
df1c3'
  },
  {
    1:4,
    2:'our-secret2',
    -1:h'849b5786457c1491be3a76dcea6c4271'
  },
  {
    1:4,
    2:'018c0ae5-4d9b-471b-bfd6-eef314bc7037',
    -1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
  }
]

致谢

本文档是 IETF COSE 工作组的产物。

首先要归咎于以下个人,是他们让我开始了这个项目: Richard BarnesMatt MillerMartin Thomson

本规范的初始草案版本在一定程度上基于 JOSE 和 S/MIME 工作组的产出。

以下个人为文档的最终形式提供了输入:Carsten BormannJohn BradleyBrian CampbellMichael B. JonesIlari LiusvaaraFrancesca PalombiniLudwig SeitzGöran Selander

作者地址

Jim Schaad
August Cellars