跳到主要内容

8. COSE 能力

  1. COSE 能力

在某些情况下需要指定算法或 key type 的能力. 这在 S/MIME 规范中有对应概念, 其中 SMIMECapabilities 定义于 [RFC8551] 第 2.5.2 节. 本文档为 COSE 定义相同概念.

algorithm identifier 不包含在 capabilities data 中, 因为它应在消息中的其他位置编码. key type identifier 包含在 capabilities data 中, 因为预期它不会在其他位置编码.

本文定义两种不同类型的能力: 算法能力和 key type 能力. 一旦通过 IANA 注册定义, 某个算法或 key type 的能力列表就是不可变的. 如果后来发现某个 key type 或算法需要新能力, 则需要分配新的 code point 来处理. 一般而言, 能力会映射到算法特定的头参数或 key 参数, 但并不必须如此. 下文定义的 HSS-LMS key type 能力就是一个示例, 其中包含所使用的 hash algorithm.

capability 结构是一个值数组; 结构中包含的值取决于特定算法或 key type. 对于算法能力, 如果适用, 第一个元素应始终是 key type 值, 但不应在算法能力中包含 key 特定项目 (例如 curve). 这意味着, 如果希望枚举实现 ECDH 的设备的所有能力, 就需要指定算法和 key pair 的所有组合. 第 8.3 节最后一个示例展示了一种情况, 即允许在算法能力数组和 key type 能力之间指定笛卡尔积 (见 ECDH-ES+A25KW 元素). 对于 key, 第一个元素应是 key type 值. 这意味着如果同时使用算法能力和 key 能力, key type 值会重复, 但为了理解其余值, key type 是必需的.

8.1. 现有算法的分配

对于注册表中除 IV-GENERATION 之外的当前算法集合 (本文档中的算法以及 [RFC8230], [RFC8778] 和 [RFC9021] 中的算法), capabilities 列表是一个只含一个元素的数组, 该元素是 key type (来自 "COSE Key Types" 注册表). 预期未来注册的算法可以有零个, 一个或多个元素.

8.2. 现有 Key Type 的分配

已存在若干 key type; 以下内容处理如何为这些结构创建 capability 定义:

  • OKP, EC2: The list of capabilities is:

    • key type 值. (OKP 为 1, EC2 为 2.)

    • 来自 "COSE Elliptic Curves" 注册表的, 用于该 key type 的一个 curve.

  • RSA: The list of capabilities is:

    • key type 值 (3).
  • Symmetric: The list of capabilities is:

    • key type 值 (4).
  • HSS-LMS: The list of capabilities is:

    • key type 值 (5).

    • 来自 "COSE Algorithms" 注册表的底层 hash function 的 algorithm identifier.

  • WalnutDSA: The list of capabilities is:

    • key type 值 (6).

    • key 的 N 值 (group and matrix size), 类型为 uint.

    • key 的 q 值 (finite field order), 类型为 uint.

8.3. 示例

Capabilities 可用于密钥派生过程, 以确保双方使用相同参数. 以下三个示例展示了在指定应用协议时利用参数的不同方式:

  • 仅算法能力: 如果协议希望要求特定算法, 例如 ES256, 但不关心使用哪个 curve, 这会很有用. 这要求在协议中指定 algorithm identifier. 见第一个示例.

  • 仅 key type 能力: 如果协议希望要求特定 key type 和 curve, 例如 P-256, 但接受使用该 curve 的任何算法 (例如 ECDSA 和 ECDH), 这会很有用. 见第二个示例.

  • 同时使用算法能力和 key type 能力: 如果协议需要固定围绕某个算法的所有选项, 例如使用 curve Ed25519 的 EdDSA, 则使用此方式. 与第一个示例一样, 需要在协议中指定 algorithm identifier. 见第三个示例, 它只是把两个能力连接在一起.

Algorithm ES256

0x8102 / [2 \ EC2 \ ] /

Key type EC2 with P-256 curve:

0x820201 / [2 \ EC2 , 1 \ P-256 ] /

ECDH-ES + A256KW with an X25519 curve:

0x8101820104 / [1 \ OKP ],[1 \ OKP , 4 \ X25519 ] /

实体也可以使用 capabilities 来通告其能力. 下方解码后的示例只是可用于该目的的多种编码之一. 每个数组元素包含三个字段: algorithm identifier, 一个或多个算法能力, 以及一个或多个 key type 能力.

[ [-8 / EdDSA /, [1 / OKP key type /], [ [1 / OKP /, 6 / Ed25519 / ], [1 /OKP/, 7 /Ed448 /] ] ], [-7 / ECDSA with SHA-256/, [2 /EC2 key type/], [ [2 /EC2/, 1 /P-256/], [2 /EC2/, 3 /P-521/] ] ], [ -31 / ECDH-ES+A256KW/, [ [ 2 /EC2/], [1 /OKP/ ] ], [ [2 /EC2/, 1 /P-256/], [1 /OKP/, 4 / X25519/ ] ] ], [ 1 / A128GCM /, [ 4 / Symmetric / ], [ 4 / Symmetric /] ] ]

检查上述内容:

  • 第一个元素表示该实体支持使用 curve Ed25519 和 Ed448 的 EdDSA.

  • 第二个元素表示该实体支持使用 curve P-256 和 P-521 的 ECDSA with SHA-256.

  • 第三个元素表示该实体支持使用 AES256 key wrap 的 Ephemeral-Static ECDH. 该实体可支持带 EC2 key type 的 P-256 curve, 以及带 OKP key type 的 X25519 curve.

  • 最后一个元素表示该实体支持用于内容加密的 128 位 AES-GCM.

该实体未通告其支持任何 MAC 算法.