跳到主要内容

7. Key Object 参数

  1. Key Object 参数

COSE_Key object 定义了一种保存单个 key object 的方式. 仍然需要定义各个 key type 的成员. 本文档的本节定义特定 key type 的初始成员集合.

对于每种 key type, 我们都定义 public 和 private 成员. public 成员会传输给其他方使用. private 成员允许主体归档 key. 然而, 在某些情况下, private key 可能会分发给协议中的实体. 示例包括: 随机数生成较差的实体, 用于 multicast-type 操作的集中式 key 创建, 以及使用 shared secret 作为授权 bearer token 的协议.

Key type 由 COSE_Key object 的 "kty" 成员标识. 本文档为该成员定义四个值:

         +===========+=======+==========================+
| Name | Value | Description |
+===========+=======+==========================+
| OKP | 1 | Octet Key Pair |
+-----------+-------+--------------------------+
| EC2 | 2 | Elliptic Curve Keys w/ |
| | | x- and y-coordinate pair |
+-----------+-------+--------------------------+
| Symmetric | 4 | Symmetric Keys |
+-----------+-------+--------------------------+
| Reserved | 0 | This value is reserved |
+-----------+-------+--------------------------+

表 17: Key Type Values

7.1. 椭圆曲线 Key

本文为 elliptic curve key 定义两种不同 key structure. 一个版本同时使用 x-coordinate 和 y-coordinate, 可能带有 point compression ("EC2"). 这是 [RFC5480] 中使用的传统 elliptic curve (EC) 点表示. 另一个版本只使用 x-coordinate, 因为 y-coordinate 要么会重新计算, 要么对 key agreement 操作而言并不需要 ("OKP").

应用 MUST 检查 curve 和 key type 是否一致, 如果不一致则拒绝该 key.

+=========+=======+==========+=====================================+ | Name | Value | Key Type | Description | +=========+=======+==========+=====================================+ | P-256 | 1 | EC2 | NIST P-256, also known as secp256r1 | +---------+-------+----------+-------------------------------------+ | P-384 | 2 | EC2 | NIST P-384, also known as secp384r1 | +---------+-------+----------+-------------------------------------+ | P-521 | 3 | EC2 | NIST P-521, also known as secp521r1 | +---------+-------+----------+-------------------------------------+ | X25519 | 4 | OKP | X25519 for use w/ ECDH only | +---------+-------+----------+-------------------------------------+ | X448 | 5 | OKP | X448 for use w/ ECDH only | +---------+-------+----------+-------------------------------------+ | Ed25519 | 6 | OKP | Ed25519 for use w/ EdDSA only | +---------+-------+----------+-------------------------------------+ | Ed448 | 7 | OKP | Ed448 for use w/ EdDSA only | +---------+-------+----------+-------------------------------------+

                    表 18: Elliptic Curves

7.1.1. 双坐标曲线

通常, 协议传输 elliptic-curve point 时使用 x-coordinate 和 y-coordinate, 或使用 x-coordinate 加上 y-coordinate 的 sign bit. 由于潜在 IPR 问题, IETF 不推荐后一种编码. 然而, 对于受限环境中的操作, 通过不发送 y-coordinate 来缩小消息的能力可能很有用.

对于带有两个坐标的 EC key, "kty" 成员设置为 2 (EC2). 本节定义的 key parameters 汇总于表 19. 为此 key type 定义的成员为:

crv: 其中包含与该 key 一起使用的 curve 的标识符. 本文档为此 key type 定义的 curve 见表 18. 未来可能注册其他 curve, 也可以使用 private curve.

x: 其中包含 EC point 的 x-coordinate. 该整数按 [SEC1] 中的定义转换为 byte string. 前导零 octet MUST 被保留.

y: 其中包含 EC point 的 sign bit 或 y-coordinate 值. 编码值 y 时, 该整数会转换为 byte string ([SEC1] 中定义), 并编码为 CBOR bstr. 前导零 octet MUST 被保留. 也支持 compressed point encoding. 按 [SEC1] 的 Elliptic-Curve-Point-to-Octet-String Conversion 函数中所述计算 sign bit. 如果 sign bit 为零, 则把 y 编码为 CBOR false 值; 否则, 把 y 编码为 CBOR true 值. 不支持 infinity point 的编码.

d: 其中包含 private key.

对于 public key, 结构中 REQUIRED 存在 "crv", "x" 和 "y". 对于 private key, 结构中 REQUIRED 存在 "crv" 和 "d". 对于 private key, RECOMMENDED 也存在 "x" 和 "y", 但它们可以从必需元素重新计算, 省略它们可节省空间.

+======+======+=======+========+=================================+
| Key | Name | Label | CBOR | Description |
| Type | | | Type | |
+======+======+=======+========+=================================+
| 2 | crv | -1 | int / | EC identifier -- Taken from the |
| | | | tstr | "COSE Elliptic Curves" registry |
+------+------+-------+--------+---------------------------------+
| 2 | x | -2 | bstr | x-coordinate |
+------+------+-------+--------+---------------------------------+
| 2 | y | -3 | bstr / | y-coordinate |
| | | | bool | |
+------+------+-------+--------+---------------------------------+
| 2 | d | -4 | bstr | Private key |
+------+------+-------+--------+---------------------------------+

表 19: EC Key Parameters

7.2. Octet Key Pair

本文为 Octet Key Pairs (OKPs) 定义了新的 key type. 不要假定使用此类型的 key 都是 elliptic curve. 此 key type 可用于其他 curve type (例如基于 hyper-elliptic surfaces 的数学结构).

本节定义的 key parameters 汇总于表 20. 为此 key type 定义的成员为:

crv: 其中包含与该 key 一起使用的 curve 的标识符. 本文档为此 key type 定义的 curve 见表 18. 未来可能注册其他 curve, 也可以使用 private curve.

x: 其中包含 public key. byte string 包含算法所定义的 public key. (对于 X25519, 它在内部是 little-endian integer.)

d: 其中包含 private key.

对于 public key, 结构中 REQUIRED 存在 "crv" 和 "x". 对于 private key, 结构中 REQUIRED 存在 "crv" 和 "d". 对于 private key, RECOMMENDED 也存在 "x", 但它可以从必需元素重新计算, 省略它可节省空间.

+======+==========+=======+=======+=================================+ | Name | Key | Label | Type | Description | | | Type | | | | +======+==========+=======+=======+=================================+ | crv | 1 | -1 | int / | EC identifier -- Taken from the | | | | | tstr | "COSE Elliptic Curves" registry | +------+----------+-------+-------+---------------------------------+ | x | 1 | -2 | bstr | Public Key | +------+----------+-------+-------+---------------------------------+ | d | 1 | -4 | bstr | Private key | +------+----------+-------+-------+---------------------------------+

                表 20: Octet Key Pair Parameters

7.3. 对称 Key

有时需要在实体之间传输 symmetric key. 此 key structure 允许这样做.

对于 symmetric key, "kty" 成员设置为 4 ("Symmetric"). 为此 key type 定义的成员为:

k: 其中包含 key 的值.

此 key structure 没有只包含 public 成员的形式. 由于预期此 key structure 会被传输, 必须注意确保它绝不会被意外或不安全地传输. 对于 symmetric key, 结构中 REQUIRED 存在 "k".

         +======+==========+=======+======+=============+
| Name | Key Type | Label | Type | Description |
+======+==========+=======+======+=============+
| k | 4 | -1 | bstr | Key Value |
+------+----------+-------+------+-------------+

表 21: Symmetric Key Parameters