Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本规范描述了一种 JavaScript API,用于在 Web 应用中执行基本的 加密操作,例如散列、 签名生成与验证,以及加密与解密。 此外,它还描述了一种 API,用于让应用生成和/或 管理执行这些操作所必需的密钥材料。 此 API 的用途包括用户或服务认证、文档 或代码签名,以及通信的机密性和 完整性。
本节描述的是本文档在其发布时的 状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到,网址为 https://www.w3.org/TR/。
本文档由 Web 应用安全 工作组 作为 第一份公开工作草案发布,使用的是 推荐标准轨道。
作为第一份公开工作草案发布并不 表示得到 W3C 及其成员的认可。
这是一份草案文档,随时可能被其他 文档更新、替换或废弃。除作为进行中的工作外,不宜以其他方式引用本文档。
本文档由一个根据 W3C 专利 政策 运作的工作组制作。 W3C 维护着一个 与该工作组交付物 有关的任何专利披露的公开列表; 该页面还包括 披露专利的说明。实际 知晓某项专利,并且该个人认为该专利包含 必要权利要求 的个人,必须按照 W3C 专利政策第 6 节 披露相关信息。
本文档受 2023年11月3日 W3C 流程文档管辖。
本节是非规范性的。
Web Cryptography API 定义了一个低级接口,用于与由用户代理管理或暴露的加密 密钥材料进行交互。该 API 本身不关心密钥存储的 底层实现,但提供了一组通用接口, 使富 Web 应用能够执行签名生成与 验证、散列与验证、加密与解密等操作,而无需 访问原始密钥材料。
加密转换通过
SubtleCrypto 接口暴露,该接口定义了一组方法,
用于执行常见的加密操作。除了签名
生成与验证、散列与验证,以及加密与解密等操作外,
该 API 还提供了用于密钥生成、密钥派生以及密钥导入和导出的接口。
本节是非规范性的。
Web 应用可能希望用基于证明用户拥有 某些秘密密钥材料访问权的认证方法,扩展或替换现有的基于用户名/密码的 认证方案。与其使用传输层认证, 例如 TLS 客户端证书,Web 应用可能更倾向于在应用自身内部进行认证所提供的 更丰富的用户体验。
使用 Web Cryptography API,应用可以定位合适的客户端密钥,这些密钥 可能此前已通过用户代理生成,或由 Web 应用通过带外方式预先配置。然后它可以执行加密操作,例如先解密一个 认证质询,再对认证响应进行签名。
通过基于底层传输的属性派生一个密钥,将认证绑定到客户端正在其上进行认证的 TLS 会话,可以进一步增强这种交换。
如果用户还没有与其账户关联的密钥,Web 应用 可以指示用户代理生成一个新密钥,或者重新使用 用户选择的现有密钥。
Web 应用可能希望限制包含敏感或 个人信息的文档的查看者,即使这些文档已经通过安全方式接收,例如通过 TLS。
使用 Web Cryptography API,应用可以通过使用秘密密钥加密文档, 然后用与 授权查看者关联的公钥包装该密钥来实现这一点。当用户代理导航到这样的 Web 应用时, 该应用会发送文档的加密形式。随后用户代理被 指示使用用户的私钥解包加密密钥,并从那里 解密并显示文档。
Web 应用可能希望允许用户在上传之前,保护存储于远程服务提供者处的数据和 文档的机密性。
使用 Web Cryptography API,应用可以让用户选择一个私有或 秘密密钥,可选地从所选密钥派生一个加密密钥,加密 文档,然后使用现有 API 将加密数据上传到服务提供者。
此用例类似于 受保护的文档 交换用例,只是文档的查看者仅限于用户本人。
Web 应用可能希望接受文档上的电子签名,以替代 需要物理签名。
使用 Web Cryptography API,应用可以指示用户选择一个密钥, 该密钥可能已通过带外方式预先配置,或专门为该 Web 应用生成。使用此密钥,应用可以对某些 数据执行签名操作,以证明用户接受该文档。
Web 应用可能希望在本地缓存数据,同时确保这些数据不能在 离线攻击中被修改。
使用 Web Cryptography API,应用可以使用包含在 应用中的公钥来验证数据缓存的内容。此前,当数据被添加到 缓存时,它会由服务器用相应的私钥进行签名。通过 在从缓存恢复数据时验证签名,客户端可确保 缓存的数据未被篡改。
Web 应用可能希望使用诸如 off-the-record (OTR) messaging 之类的方案来采用消息层安全性,即使这些消息已经通过安全方式接收, 例如通过 TLS。
Web Cryptography API 允许执行密钥 协商,从而支持 OTR 以及类似的消息签名方案。双方可以协商共享的加密密钥和 消息认证码(MAC)密钥,以允许对消息进行加密和解密, 并防止篡改。
Web 应用可能希望与 IETF JavaScript Object Signing and Encryption (JOSE) Working Group 定义的结构和消息格式进行交互。
使用 Web Cryptography API,应用可以读取并导入以 JSON 密钥格式(JWK)编码的密钥,验证使用数字 签名或 MAC(JWS)进行了完整性保护的消息,或者解密已加密的消息(JWE)。
除标记为非规范性的章节外,本 规范中的所有编写指南、图表、示例和注释均为非规范性的。本规范中的其他所有内容均为规范性的。
本文档中的关键词 MUST、REQUIRED 和 SHALL 应按照 BCP 14 [RFC2119] [RFC8174] 中所述进行解释,但仅当它们以全大写形式出现时才如此,如此处所示。
本规范定义了以下一致性类别:
如果用户代理满足本规范中适用于实现的所有 一致的用户代理 MUST 级、 REQUIRED 级和 SHALL 级 标准,则该用户代理被认为是 一致的用户代理。本规范使用“conforming user agent”和“user agent”这两个术语来指代此 产品类别。
以算法或具体步骤表述的一致性要求可以以任何 方式实现,只要最终结果等效即可。(特别是,本 规范中定义的算法旨在易于遵循,而不是旨在高性能。)
使用 ECMAScript 来实现本规范中定义的 API 的用户代理 MUST 以与 Web IDL 规范中定义的 ECMAScript 绑定一致的方式实现它们 [WebIDL], 因为本规范使用该规范及其术语。
除非另有说明,字符串比较均以
区分大小写的方式进行。本规范中以等宽字体书写的字符串字面量,
例如 “this”,不包括外围引号。
强烈不鼓励对本规范进行厂商特定的专有扩展。 作者不得使用此类扩展,因为这样做会降低互操作性并分裂 用户群,使只有特定用户代理的用户才能访问相关 内容。
如果需要厂商特定扩展,则成员应以 厂商特定字符串作为前缀,以防止与本规范未来版本发生冲突。 扩展的定义必须保证扩展的使用既不与规范中定义的功能相矛盾,也不会导致其 不一致。
当需要对本规范进行厂商中立的扩展时,可以相应地更新本 规范,或者编写一个覆盖本规范中要求的 扩展规范。当某个将本 规范应用于其活动的人决定承认此类扩展规范的要求时,它就成为本规范一致性要求目的下的 适用规范。 由 W3C Web Cryptography Working Group 定义的适用规范列在 下表中。
| 规范 | 参考 |
本节是非规范性的。
本规范试图聚焦于各种平台特定或标准化加密 API 之间的 通用功能和特性,并避免仅特定于一两个实现的特性和 功能。因此,该 API 允许以一种避免 开发者需要关心底层密钥存储实现的抽象层级进行 密钥生成、管理和交换。该 API 专门围绕 CryptoKey 对象,作为 底层原始加密密钥材料的抽象。其背后的意图是允许一个 足够通用的 API,使一致的用户代理能够暴露 由用户代理直接存储和管理的密钥,这些密钥可能使用某些操作系统提供的每用户密钥存储等隔离 存储 API 进行存储或管理,或者存储在 安全元件等密钥存储设备中,同时允许富 Web 应用 操纵这些密钥,并且不要求 Web 应用了解 底层密钥存储的性质。
由于底层加密实现会因一致的用户 代理而异,并且可能受制于本地策略,包括但不限于 政府或行业监管、安全最佳实践、知识产权 问题,以及受限的运行环境等考虑,本规范不规定 MUST 实现的一组强制算法。 相反,它定义了一组通用绑定,这些绑定可以以 与算法无关的方式使用;一个通用框架,用于发现用户代理或密钥 句柄是否支持底层算法;以及一组关于 各个算法在被实现时的行为的一致性要求。
此 API 虽然允许应用生成、检索和操纵密钥 材料,但并不专门处理在特定类型的 密钥存储中(例如安全元件或智能卡)配置密钥的问题。这是因为此类配置 操作通常负担着厂商特定细节,使得定义一个 与厂商无关的接口成为一个不适宜且无界的任务。此外,此 API 不 处理或解决加密模块的发现问题,因为这些概念 依赖于底层用户代理,并且不是可在 常见操作系统、加密库和实现之间移植的概念。
本节是非规范性的。
本规范假定但不要求,一致的用户代理不会 并且将不会在用户代理自身内部直接实现加密操作。 从历史上看,许多用户代理已将加密操作(例如 TLS 中使用的那些操作)委托给作为底层 操作系统一部分提供的现有 API,或委托给独立于用户 代理进行管理的第三方模块。
CryptoKey 对象表示 JavaScript 执行环境与这些底层库之间的桥梁,
这是通过使用名为 [[handle]] 的
内部槽来实现的。该句柄表示一种实现特定的不透明类型,它可能无法在
JavaScript 类型中表示,也绝不会暴露给脚本作者。通过这种方式,
CryptoKey 对象相对于
JavaScript 执行环境,在概念上等同于
[[handle]] 相对于底层
加密
实现。
这些 API 传统上围绕加密提供者的概念构建,加密提供者是 一组算法的特定实现的抽象。操作系统 或库可能带有默认提供者,并且通常允许用户添加 额外的提供者、重新配置已启用算法的集合,或者以其他方式自定义 加密服务的提供方式。
虽然假定大多数用户代理将与完全以软件实现的加密 提供者交互,但本 规范并不要求如此。因此,某些实现的能力可能受限于 底层硬件的能力,并且根据用户如何 配置底层加密库,这对 用户代理而言可能完全是不透明的。
本规范并未为
CryptoKey 对象显式提供任何新的存储机制。相反,通过为
序列化和反序列化步骤
定义
CryptoKey 对象,任何支持
存储可序列化对象的现有或未来 Web 存储
机制,都可用于存储 CryptoKey 对象。
在实践中,预计大多数作者会使用
Indexed Database API [INDEXEDDB],它允许对
键/值对进行关联式存储,其中键是对应用有意义的某个字符串标识符,
值是一个 CryptoKey 对象。这允许
存储和检索密钥材料,而不会将该密钥材料暴露给
应用或 JavaScript 环境。此外,这允许作者
拥有充分的灵活性,将任何额外元数据与
CryptoKey 本身一起存储。
本节是非规范性的。
由于没有提供显式的存储机制,本规范假定
CryptoKey 对象限定于当前执行
环境以及该环境可用的任何存储机制(例如
Indexed Database API)。应用作者依赖这一点来保障其
应用的安全性;拥有同一
CryptoKey 对象的两个源,对底层
密钥具有完全访问权,
因此,来自这些应用的消息无法区分,发送给
这些应用的消息也可以被完全恢复。实现者应确保不会在两个源之间共享
CryptoKey 对象,
除非
作者已明确选择共享(例如通过使用 postMessage)
本规范中规定的一些算法会执行计算 密集型工作,例如生成非常大的素数,或通过 对特定操作进行重复迭代。因此,恶意应用可能会试图 滥用此 API,并试图使实现执行大量工作, 从而拒绝其他正在执行的应用访问或服务。 实现应采取措施来缓解这些风险,例如限制实现 并发执行的操作数量、对已知可能会破坏执行环境的 操作要求用户同意,或者为诸如密钥大小或迭代次数等属性定义 设备特定的限制。
本规范包含了多种加密操作的描述,其中一些 在使用不当时具有已知弱点。应用开发者必须 谨慎,并查阅适当且最新的加密文献,以理解并 缓解此类问题。一般而言,强烈 不鼓励应用开发者发明新的加密协议;与所有应用一样,本 规范的用户最好使用现有协议,而 本规范提供了实现这些协议所需的构建块。
为了使用本规范中定义的 API 提供任何有意义的 加密保证,作者必须熟悉 Web 应用面临的现有威胁,以及所采用的底层安全模型。从概念上讲, 脚本注入等问题等同于其他操作 环境中的远程代码执行,允许注入恶意脚本可能导致 密钥或数据被外泄。脚本注入可能来自其他应用, 对此可通过审慎使用内容安全策略来缓解;也可能来自恶意 网络中间人,对此可通过使用传输层安全性来缓解。
本规范没有定义任何用于存储
加密密钥的具体机制。默认情况下,除非作者采取具体措施来持久化
密钥,例如通过使用 Indexed Database API,否则使用此 API
创建的密钥仅在当前页面的生命周期内有效(例如
直到发生导航事件)。希望在不同页面
或多个浏览会话之间使用同一密钥的作者,必须采用现有的 Web 存储技术。作者
应了解这些技术的安全性假设,例如
同源安全模型;也就是说,共享相同方案、主机
和端口的任何应用都可以访问同一存储分区,即使路径等
其他信息可能不同。作者可以通过
跨源共享(例如 postMessage)显式选择放宽这种安全性。
作者应注意,本规范没有对
实现如何存储底层加密密钥材料提出规范性要求。唯一的
要求是密钥材料不得暴露给脚本,除非通过使用
exportKey 和 wrapKey 操作。特别是,
它并不
保证底层加密密钥材料不会被持久化到
磁盘上(可能未加密),也不保证拥有与用户代理相同权限运行的用户或其他
应用无法访问这些材料。任何有权访问设备存储的应用或用户
都可能恢复密钥材料,即使
脚本可能被禁止访问。
本规范没有对实现如何在所有对密钥
材料的引用消失后处理这些材料提出规范性要求。也就是说,一致的用户代理不
要求对密钥材料进行清零,并且即使对 CryptoKey
的所有引用都已消失,它仍可能在设备存储或
设备内存中可访问。
应用可以通过使用结构化克隆算法以及
postMessage 等 API,跨安全边界(例如源)共享 CryptoKey
对象。虽然对底层加密密钥
材料的访问可能会基于 extractable
属性受到限制,但一旦密钥与目标源共享,源源就无法
之后限制或撤销对该密钥的访问。因此,作者必须小心确保
其信任目标源会采取与源源相同的缓解恶意脚本的措施。
此外,如果源源发生脚本注入,攻击者可能会将密钥发布到
攻击者控制的源。每当
用户代理访问攻击者的源时,用户代理可能会被指示使用该密钥执行
加密操作,例如解密现有消息
或创建新的欺诈性消息。
作者应注意,用户可以随时选择清除 与某个源关联的存储,从而可能销毁密钥。旨在 提供长期存储(例如服务器端存储)的应用,应考虑使用 密钥托管等技术,以防止此类数据变得不可访问。作者不应假定 密钥会无限期可用。
使用本规范中定义的 API 的应用的用户应注意, 无论采用何种加密技术,这些应用都将完全访问所有交换的消息。 也就是说,对于加密消息,使用这些 API 的应用 也将完全访问解密后的消息。
本节是非规范性的。
randomUUID 用作用户 ID
randomUUID 可用于生成用户
ID,但不会直接赋予任何生成全局
标识符的能力。
本规范依赖底层规范。
一致的用户代理 MUST 至少支持
本规范所依赖的 DOM 中定义的功能子集;
特别是,它 MUST 支持 Promise
和
DOMException。
[DOM]
一致的用户代理 MUST 至少支持
本规范所依赖的 HTML 中定义的功能子集;
特别是,它 MUST 支持
ArrayBufferView typedef
和可序列化对象。
[HTML]
术语
ArrayBuffer、
ArrayBufferView 和
可序列化
对象
由 HTML 规范定义 [HTML]。
术语 DOMString 和
BufferSource 定义于
[WEBIDL]。
包含位序列的字节序列 b 是 通过如下方式获得的 字节序列:首先向 b 追加零个或多个 值为零的位,使所得位序列的长度最小且为 8 的 整数倍, 然后将该字符串中每个连续的 8 位序列视为一个字节。
当本规范要求将非负 整数 i 转换为长度为 n 的字节序列,其中 n * 8 大于 i 以 2 为底的对数时,用户代理必须 先计算 i 的二进制表示,最高有效位在前, 在其前面添加足够的零位,以形成长度为 n * 8 的位序列, 然后返回通过将该位序列中每个连续的 8 位序列视为一个字节而形成的字节 序列。
以区分大小写 的方式比较两个字符串,意味着逐个码点精确比较它们。
以ASCII 不区分大小写的方式 比较两个字符串,意味着逐个码点精确比较它们,但 范围 U+0041 .. U+005A 中的码点(即 LATIN CAPITAL LETTER A 到 LATIN CAPITAL LETTER Z)和 范围 U+0061 .. U+007A 中的相应码点 (即 LATIN SMALL LETTER A 到 LATIN SMALL LETTER Z)也被视为匹配。
当本规范要求终止 算法时,用户代理必须在完成其 当前所在步骤后终止该算法。这里所指的算法是规范定义的一组处理步骤, 而不是可能正处于处理过程中的底层加密算法。
当本规范要求解析 ASN.1 结构时,用户代理必须执行以下步骤:
令 data 为要解析的字节序列。
令 structure 为要解析的 ASN.1 结构。
令 exactData 为一个可选布尔值。如果未提供,
则将其初始化为 true。
根据 [X690] 的区分编码规则解析 data, 使用 structure 作为要解码的 ASN.1 结构。
返回解析后的 ASN.1 结构。
当本规范要求解析
subjectPublicKeyInfo时,用户代理必须
解析 ASN.1 结构,其中
data 设置为要解析的字节序列,structure 为
[RFC5280]
中规定的 subjectPublicKeyInfo 的 ASN.1 结构,
并且 exactData 设置为 true。
当本规范要求解析
PrivateKeyInfo时,用户代理必须解析 ASN.1 结构,其中 data
设置为
要解析的字节序列,
structure 为
[RFC5208]
中规定的 PrivateKeyInfo 的 ASN.1 结构,
并且 exactData 设置为 true。
当本规范要求解析 JWK时,用户 代理必须运行以下步骤:
令 data 为要解析的字节序列。
令 json 为按照 UTF-8 解释 data 所得到的 Unicode 字符串。
将 json 转换为 UTF-16。
令 result 为在新全局对象上下文中执行
JSON.parse 内部函数所得的对象字面量,
其中 text 参数设置为包含 json 的 JavaScript String。
令 key 为将 result 转换为
JsonWebKey 的 IDL 字典类型所得的结果。
返回 key。
当本规范要求计算两个序列 a 和 b 的用途 交集时,结果应为一个 序列,其中包含同时出现在 a 和 b 中的每个已识别密钥用途值, 其顺序按照已识别密钥用途值列表中的顺序; 如果序列中存在某个元素与该值进行区分大小写字符串 匹配,则称该值出现在该序列中。
当本规范要求计算 usages 的 用途列表的规范化值时,结果应为 usages 与包含所有已识别密钥用途值的 序列的用途交集。
当本规范提及与 object 的内部槽 [[slot]] 关联的缓存的 ECMAScript 对象时, 用户代理必须运行以下步骤:
Crypto 接口表示一个
面向通用加密功能的接口,包括一个
以真正随机值为种子的、加密强度高的伪随机数生成器。
WebIDLpartial interface mixin WindowOrWorkerGlobalScope {
[SameObject] readonly attribute Crypto crypto;
};
[Exposed=(Window,Worker)]
interface Crypto {
[SecureContext] readonly attribute SubtleCrypto subtle;
ArrayBufferView getRandomValues(ArrayBufferView array);
[SecureContext] DOMString randomUUID();
};
getRandomValues
方法会生成加密强度高的随机值。它必须按如下方式行事:
如果 array 不是 Int8Array、Uint8Array、Uint8ClampedArray、
Int16Array、Uint16Array、Int32Array、Uint32Array、
BigInt64Array
或 BigUint64Array,
则抛出一个
TypeMismatchError
并
终止算法。
令 byteLength 为 array 的字节长度。
如果 byteLength 大于 65536,则抛出一个
QuotaExceededError
并
终止算法。
令 bytes 为一个长度为 byteLength 的字节序列。
用加密安全的随机字节填充 bytes。
将 bytes 写入 array。
返回 array。
不要使用 getRandomValues 方法生成密钥。请改用
generateKey 方法。
randomUUID
方法会生成一个新的第 4 版
UUID,
并返回其命名空间特定
字符串表示,
如 [RFC4122] 的
第 3 节所述。
要生成随机 UUID:
0100。
10。
返回以下内容的字符串拼接 «
-",
-",
-",
-",
»。
对于生成随机 UUID算法中描述的步骤,
字节 value 的十六进制表示是通过使用
ASCII 小写十六进制
数字以十六进制表示 value 所创建的
两字符字符串,并在左侧填充 "0",以达到两个
ASCII 小写十六进制
数字。
subtle 属性提供
SubtleCrypto 接口的一个实例,
该接口提供
低级加密原语和算法。
Algorithm
对象是一个字典对象 [WEBIDL],
用于指定某个算法以及完全
指定所需操作所需的任何额外参数。
WebIDLtypedef (object or DOMString) AlgorithmIdentifier;
typedef AlgorithmIdentifier HashAlgorithmIdentifier;
dictionary Algorithm {
required DOMString name;
};
Algorithm 字典成员name
KeyAlgorithm 字典表示有关给定
CryptoKey 对象内容的信息。
WebIDLdictionary KeyAlgorithm {
required DOMString name;
};
本节是非规范性的。
提供 KeyAlgorithm 字典,是为了帮助
记录 CryptoKey
的固定公共属性如何反映回应用。实际的字典类型从不会暴露
给应用。
nameCryptoKey 的算法名称
CryptoKey
对象表示对由用户代理管理的密钥材料的一个不透明引用。
WebIDLenum KeyType { "public", "private", "secret" };
enum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey" };
[SecureContext,Exposed=(Window,Worker),Serializable]
interface CryptoKey {
readonly attribute KeyType type;
readonly attribute boolean extractable;
readonly attribute object algorithm;
readonly attribute object usages;
};
本节是非规范性的。
本规范为用户代理管理的许多不同种类的密钥 材料提供统一接口。这可以包括由 用户代理生成的密钥、由用户代理从其他密钥派生的密钥、通过用户操作或使用此 API 导入到用户代理的密钥、预先配置在用户代理可访问的软件或硬件中的密钥, 或以其他方式提供给用户代理的密钥。 术语“密钥”广义地指任何密钥材料,包括用于加密 操作的实际密钥,以及在密钥派生或交换操作中获得的秘密值。
CryptoKey 对象不需要直接与底层密钥 存储机制交互,而可以只是用户代理用来理解 在需要时(例如执行加密操作时)如何获取密钥材料的一个引用。
KeyTypepublic"、"private" 和 "secret"。
不透明密钥材料,包括用于对称算法的密钥材料,由
secret 表示,而作为由
公钥/私钥密钥对组成的非对称算法一部分使用的密钥,将是 public 或 private。
KeyUsageencrypt、
decrypt、
sign、
verify、
deriveKey、
deriveBits、
wrapKey 和
unwrapKey。
每个 CryptoKey 对象都有一组内部槽,用于
存储有关密钥的信息。这些槽不会作为本规范的一部分暴露;
它们表示实现用于实现本规范的内部状态。
这里复用了 [ECMA-262] 中使用的记号约定;内部
槽以包含在双重方括号 [[ ]] 中的名称标识。
所有 CryptoKey 对象都具有名为
[[type]]、
[[extractable]]、
[[algorithm]]、
[[algorithm_cached]]、
[[usages]]、
[[usages_cached]]
以及
[[handle]] 的内部槽。
[[algorithm]] 内部
槽的内容应为 KeyAlgorithm,或从其派生。
[[usages]] 内部
槽的内容应为 Sequence<KeyUsage> 类型。
[[handle]] 槽是
一种不透明类型,
包含底层加密实现用来表示逻辑密钥的任何数据。
不同的加密实现可能使用不同类型,从
表示为整数的不透明标识符,到指针类型,或
提供标识信息的结构。这些句柄绝不会暴露给应用。
type[[type]] 内部
槽,
该槽包含底层密钥的类型。
extractable[[extractable]] 内部
槽,该槽指示原始密钥材料是否可以由
应用导出。
algorithm[[algorithm]]
内部槽关联的
缓存的 ECMAScript 对象。
usages[[usages]] 内部槽关联的
缓存的 ECMAScript 对象,
该内部槽指示哪些加密操作允许与此密钥一起使用。
CryptoKey 对象是可序列化对象。给定
value 和 serialized,
其序列化
步骤为:
[[type]] 内部槽。
[[extractable]] 内部槽。
[[algorithm]]
内部槽的
子序列化。
[[usages]]
内部槽的
子序列化。
[[handle]] 内部槽。
给定 serialized 和 value,其反序列化 步骤为:
[[type]] 内部
槽初始化为 serialized.[[Type]]。
[[extractable]] 内部槽
初始化为 serialized.[[Extractable]]。
[[algorithm]] 内部槽
初始化为
serialized.[[Algorithm]] 的子反序列化。
[[usages]]
内部槽初始化为
serialized.[[Usages]] 的子反序列化。
[[handle]]
内部槽初始化为 serialized.[[Handle]]。
CryptoKey 对象时,
重要的是该
对象不得被反序列化为不同类型。这由
反序列化
步骤的定义以规范方式要求,但它值得特别注意,因为
此类反序列化可能会暴露密钥材料的内容,而在某些
情况下(例如 [[extractable]] 内部槽为
false 时)不应
向应用暴露这些内容。
SubtleCrypto 接口提供了一组
用于处理低级加密原语和算法的方法。
WebIDLenum KeyFormat { "raw", "spki", "pkcs8", "jwk" };
[SecureContext,Exposed=(Window,Worker)]
interface SubtleCrypto {
Promise<ArrayBuffer> encrypt(
AlgorithmIdentifier algorithm,
CryptoKey key,
BufferSource data
);
Promise<ArrayBuffer> decrypt(
AlgorithmIdentifier algorithm,
CryptoKey key,
BufferSource data
);
Promise<ArrayBuffer> sign(
AlgorithmIdentifier algorithm,
CryptoKey key,
BufferSource data
);
Promise<boolean> verify(
AlgorithmIdentifier algorithm,
CryptoKey key,
BufferSource signature,
BufferSource data
);
Promise<ArrayBuffer> digest(
AlgorithmIdentifier algorithm,
BufferSource data
);
Promise<(CryptoKey or CryptoKeyPair)> generateKey(
AlgorithmIdentifier algorithm,
boolean extractable,
sequence<KeyUsage> keyUsages
);
Promise<CryptoKey> deriveKey(
AlgorithmIdentifier algorithm,
CryptoKey baseKey,
AlgorithmIdentifier derivedKeyType,
boolean extractable,
sequence<KeyUsage> keyUsages
);
Promise<ArrayBuffer> deriveBits(
AlgorithmIdentifier algorithm,
CryptoKey baseKey,
optional unsigned long? length = null
);
Promise<CryptoKey> importKey(
KeyFormat format,
(BufferSource or JsonWebKey) keyData,
AlgorithmIdentifier algorithm,
boolean extractable,
sequence<KeyUsage> keyUsages
);
Promise<(ArrayBuffer or JsonWebKey)> exportKey(
KeyFormat format,
CryptoKey key
);
Promise<ArrayBuffer> wrapKey(
KeyFormat format,
CryptoKey key,
CryptoKey wrappingKey,
AlgorithmIdentifier wrapAlgorithm
);
Promise<CryptoKey> unwrapKey(
KeyFormat format,
BufferSource wrappedKey,
CryptoKey unwrappingKey,
AlgorithmIdentifier unwrapAlgorithm,
AlgorithmIdentifier unwrappedKeyAlgorithm,
boolean extractable,
sequence<KeyUsage> keyUsages
);
};
SubtleCrypto 接口被命名为 “SubtleCrypto”,
是为了反映这样一个事实:为了提供所需的
算法安全保证,许多这类算法都有微妙的使用要求。
例如,直接使用未经认证的加密方案,例如 计数器模式下的 AES,会使潜在攻击者能够通过 操纵输入中的位来操纵输出中的位,从而破坏 消息的完整性。然而,AES-CTR 可以与其他 加密原语(例如消息认证码)组合安全地使用,以确保 受保护消息的完整性,但前提是消息认证 码是在加密消息和 IV 之上构造的。
使用 SubtleCrypto 接口的开发者应了解 与所提供各种算法的设计和实现相关的 安全性问题。提供原始算法,是为了让开发者 在实现各种协议和应用时获得最大的灵活性,其中每一种 协议和应用都可能以独特方式表示组合和安全参数, 因而需要使用原始算法。
KeyFormatrawpkcs8spkijwkJsonWebKey 字典
SubtleCrypto 方法调用而创建的 promise。
SubtleCrypto 方法调用响应的
顺序提出具体要求,
无论是在多次调用之间,还是在这些调用与来自其他
任务源的任务之间。
此任务源仅用于排队任务,
以便在加密操作完成时解决或拒绝相关 promise,
从而
防止
竞态条件。
所有错误都会通过拒绝返回的 Promise 来异步报告。这包括 Web IDL 类型映射错误。
encrypt
方法返回一个新的 Promise 对象,该对象将使用
指定的
AlgorithmIdentifier
和
所提供的 CryptoKey 来加密数据。它必须按
如下方式行事:
令 algorithm 和 key 分别为传递给
encrypt()
方法的
algorithm 和 key 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"encrypt"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
key 的
[[algorithm]] 内部槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 key 的
[[usages]]
内部槽不包含值为 "encrypt" 的条目,则
抛出一个 InvalidAccessError。
令 ciphertext 为使用 algorithm 和 key,并以 data 作为 plaintext, 执行由 normalizedAlgorithm 指定的 encrypt 操作所得的结果。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中创建一个包含
ciphertext 的 ArrayBuffer
所得的结果。
用 result 解决 promise。
decrypt
方法返回一个新的 Promise 对象,该对象将使用指定的
AlgorithmIdentifier
和
所提供的 CryptoKey 来解密数据。它必须按
如下方式行事:
令 algorithm 和 key 分别为传递给
decrypt()
方法的
algorithm 和 key 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"decrypt"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
key 的
[[algorithm]] 内部槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 key 的
[[usages]]
内部槽不包含值为 "decrypt" 的条目,则
抛出一个 InvalidAccessError。
令 plaintext 为使用 key 和 algorithm,并以 data 作为 ciphertext, 执行由 normalizedAlgorithm 指定的 decrypt 操作所得的结果。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中创建一个包含
plaintext 的 ArrayBuffer
所得的结果。
用 result 解决 promise。
sign 方法返回一个
新的 Promise 对象,该对象将使用指定的 AlgorithmIdentifier 和所提供的
CryptoKey 来签名数据。它必须按如下方式行事:
令 algorithm 和 key 分别为传递给
sign() 方法的
algorithm 和 key 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"sign"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
key 的
[[algorithm]] 内部槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 key 的
[[usages]]
内部槽不包含值为 "sign" 的条目,则
抛出一个 InvalidAccessError。
令 signature 为使用 key 和 algorithm,并以 data 作为 message, 执行由 normalizedAlgorithm 指定的 sign 操作所得的结果。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中创建一个包含
signature 的 ArrayBuffer
所得的结果。
用 result 解决 promise。
verify 方法返回
一个新的 Promise 对象,该对象将使用指定的 AlgorithmIdentifier 和所提供的
CryptoKey 来验证数据。它必须按如下方式行事:
令 algorithm 和 key
分别为传递给
verify()
方法的 algorithm 和 key 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"verify"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
key 的
[[algorithm]] 内部槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 key 的
[[usages]]
内部槽不包含值为 "verify" 的条目,则
抛出一个 InvalidAccessError。
令 result 为使用 key、 algorithm 和 signature,并以 data 作为 message, 执行由 normalizedAlgorithm 指定的 verify 操作所得的结果。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
用 result 解决 promise。
digest 方法返回
一个新的 Promise 对象,该对象将使用指定的
AlgorithmIdentifier
对数据进行摘要计算。
它必须按如下方式行事:
令 algorithm 为传递给
digest()
方法的 algorithm 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"digest"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
令 digest 为使用 algorithm,并以 data 作为 message,执行由 normalizedAlgorithm 指定的 digest 操作所得的结果。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中创建一个包含
digest 的 ArrayBuffer
所得的结果。
用 result 解决 promise。
调用时,generateKey MUST 执行
以下步骤:
令 algorithm、extractable 和 usages
分别为传递给
generateKey()
方法的
algorithm、extractable 和 keyUsages
参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"generateKey"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
令 result 为使用 algorithm、extractable 和 usages, 执行由 normalizedAlgorithm 指定的 generate key 操作所得的结果。
CryptoKey 对象:
如果
result 的
[[type]] 内部槽为
"secret"
或 "private",并且
usages 为空,则抛出一个 SyntaxError。
CryptoKeyPair 对象:
如果 result 的
privateKey
属性的
[[usages]] 内部
槽为空序列,则
抛出一个
SyntaxError。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中将 result 转换为 ECMAScript Object 所得的结果, 如 [WebIDL] 中所定义。
用 result 解决 promise。
调用时,deriveKey
MUST 执行以下步骤:
令 algorithm、baseKey、derivedKeyType、
extractable 和 usages 分别为传递给 deriveKey()
方法的 algorithm、
baseKey、derivedKeyType、extractable 和
keyUsages 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"deriveBits"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 normalizedDerivedKeyAlgorithmImport 为
规范化
算法所得的结果,其中
alg 设置为 derivedKeyType,op 设置为
"importKey"。
如果发生错误,则返回一个以 normalizedDerivedKeyAlgorithmImport 拒绝的 Promise。
令 normalizedDerivedKeyAlgorithmLength 为
规范化
算法所得的结果,其中
alg 设置为 derivedKeyType,op 设置为
"get key length"。
如果发生错误,则返回一个以 normalizedDerivedKeyAlgorithmLength 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
baseKey 的
[[algorithm]] 内部槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 baseKey 的
[[usages]] 内部槽
不包含值为 "deriveKey" 的条目,
则抛出一个
InvalidAccessError。
令 length 为使用 derivedKeyType,执行由 normalizedDerivedKeyAlgorithmLength 指定的 get key length 算法所得的结果。
令 secret 为使用 key、algorithm 和 length, 执行由 normalizedAlgorithm 指定的 derive bits 操作所得的结果。
令 result 为使用 "raw" 作为
format、secret 作为 keyData、
derivedKeyType 作为 algorithm,并使用
extractable 和 usages,执行由
normalizedDerivedKeyAlgorithmImport 指定的 import key 操作所得的结果。
如果
result 的
[[type]]
内部槽为 "secret" 或 "private",并且
usages 为空,则抛出一个 SyntaxError。
将 result 的 [[extractable]] 内部
槽设置为 extractable。
将 result 的 [[usages]] 内部
槽设置为 usages 的规范化值。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中将 result 转换为 ECMAScript Object 所得的结果, 如 [WebIDL] 中所定义。
用 result 解决 promise。
调用时,deriveBits
MUST 执行以下步骤:
令 algorithm、baseKey 和 length
分别为传递给
deriveBits()
方法的
algorithm、
baseKey 和 length
参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"deriveBits"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
baseKey 的
[[algorithm]] 内部
槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 baseKey 的
[[usages]] 内部槽
不包含值为 "deriveBits" 的条目,
则抛出一个
InvalidAccessError。
令 bits 为使用 baseKey、 algorithm 和 length,执行由 normalizedAlgorithm 指定的 derive bits 操作所得的结果。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中创建一个包含
bits 的 ArrayBuffer
所得的结果。
用 result 解决 promise。
调用时,importKey 方法 MUST 执行
以下步骤:
令 format、algorithm、extractable 和
usages 分别为传递给 importKey()
方法的 format、algorithm、
extractable 和 keyUsages 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"importKey"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
令 result 为使用 keyData、
algorithm、
format、extractable 和 usages,
执行由 normalizedAlgorithm 指定的 import key 操作所得的
CryptoKey 对象。
如果
result 的
[[type]]
内部槽为 "secret" 或 "private",并且
usages 为空,则抛出一个 SyntaxError。
将 result 的 [[extractable]] 内部
槽设置为 extractable。
将 result 的 [[usages]] 内部
槽设置为 usages 的规范化值。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中将 result 转换为 ECMAScript Object 所得的结果, 如 [WebIDL] 中所定义。
用 result 解决 promise。
为了互操作性,鼓励支持 "raw" 密钥格式。
Web 开发者应查阅测试套件,以获取
关于实现对其他密钥格式支持情况的详细信息。
调用时,exportKey 方法 MUST 执行
以下步骤:
令 format 和 key 分别为传递给 exportKey()
方法的 format 和
key 参数。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 key 的
[[algorithm]] 内部
槽的 name 成员未标识一个支持 export key 操作的
已注册算法,
则抛出一个 NotSupportedError。
如果 key 的
[[extractable]] 内部
槽为 false,则抛出一个
InvalidAccessError。
令 result 为使用 key 和 format,
执行由 key 的 [[algorithm]]
内部槽指定的 export key 操作所得的结果。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
用 result 解决 promise。
为了互操作性,鼓励支持 "raw" 密钥格式。
Web 开发者应查阅测试套件,以获取
关于实现对其他密钥格式支持情况的详细信息。
调用时,wrapKey 方法 MUST 执行
以下步骤:
令 format、key、wrappingKey 和
algorithm 分别为传递给
wrapKey()
方法的 format、key、
wrappingKey 和 wrapAlgorithm 参数。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"wrapKey"。
如果发生错误,则令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"encrypt"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
wrappingKey 的
[[algorithm]] 内部
槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 wrappingKey 的
[[usages]] 内部槽
不包含值为 "wrapKey" 的条目,
则抛出一个
InvalidAccessError。
如果由 key 的 [[algorithm]] 内部
槽标识的算法不支持 export key 操作,则抛出一个 NotSupportedError。
如果 key 的 [[extractable]] 内部
槽为 false,则抛出一个
InvalidAccessError。
令 exportedKey 为使用 key 和 format,
执行由
key 的 [[algorithm]] 内部
槽指定的 export key 操作所得的结果。
某些算法的密钥包装操作会对载荷 大小施加限制。例如,AES-KW 要求载荷长度为 8 字节的倍数, 而 RSA-OAEP 会对长度施加限制。对于在给定密钥的序列化方面 提供灵活性的密钥格式(例如 JWK), 实现可以选择使序列化适配 包装算法的约束。这就是为什么没有规范性要求 JSON.stringify, 否则它将禁止实现引入额外的 填充。
令 result 为使用 algorithm, wrappingKey 作为 key,并以 bytes 作为 plaintext,执行由 normalizedAlgorithm 指定的 wrap key 操作所得的结果。
令 result 为使用 algorithm, wrappingKey 作为 key,并以 bytes 作为 plaintext,执行由 normalizedAlgorithm 指定的 encrypt 操作所得的结果。
NotSupportedError。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中创建一个包含
result 的 ArrayBuffer
所得的结果。
用 result 解决 promise。
为了互操作性,鼓励支持 "raw" 密钥格式。
Web 开发者应查阅测试套件,以获取
关于实现对其他密钥格式支持情况的详细信息。
调用时,unwrapKey 方法
MUST 执行以下步骤:
令 format、unwrappingKey、
algorithm、unwrappedKeyAlgorithm、
extractable 和 usages
分别为传递给
unwrapKey()
方法的
format、unwrappingKey、
unwrapAlgorithm、unwrappedKeyAlgorithm、
extractable 和 keyUsages
参数。
令 wrappedKey 为
获取传递给
unwrapKey()
方法的
wrappedKey 参数所持有字节的副本所得的结果。
令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"unwrapKey"。
如果发生错误,则令 normalizedAlgorithm 为
规范化
算法所得的结果,其中
alg 设置为 algorithm,op 设置为
"decrypt"。
如果发生错误,则返回一个以 normalizedAlgorithm 拒绝的 Promise。
令 normalizedKeyAlgorithm 为规范化算法所得的结果,其中
alg 设置为 unwrappedKeyAlgorithm,op 设置
为 "importKey"。
如果发生错误,则返回一个以 normalizedKeyAlgorithm 拒绝的 Promise。
令 promise 为一个新的 Promise。
返回 promise,并并行 执行剩余步骤。
如果以下步骤或引用的过程要求 抛出错误, 则在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象, 以返回的错误拒绝 promise; 然后终止算法。
如果 normalizedAlgorithm 的
name 成员不等于
unwrappingKey 的
[[algorithm]] 内部
槽的
name 属性,则
抛出一个 InvalidAccessError。
如果 unwrappingKey 的
[[usages]] 内部槽
不包含值为
"unwrapKey" 的条目,则抛出一个 InvalidAccessError。
NotSupportedError。
令 result 为使用 unwrappedKeyAlgorithm 作为 algorithm、format、 usages 和 extractable,并以 key 作为 keyData,执行由 normalizedKeyAlgorithm 指定的 import key 操作所得的结果。
如果
result 的
[[type]]
内部槽为 "secret" 或 "private",并且
usages 为空,则抛出一个 SyntaxError。
将 result 的 [[extractable]] 内部
槽设置为 extractable。
将 result 的 [[usages]] 内部
槽设置为 usages 的规范化值。
在crypto 任务源上 排队 一个全局任务, 给定 realm 的全局对象,以执行剩余步骤。
令 result 为在 realm 中将 result 转换为 ECMAScript Object 所得的结果, 如 [WebIDL] 中所定义。
用 result 解决 promise。
为了互操作性,鼓励支持 "raw" 密钥格式。
Web 开发者应查阅测试套件,以获取
关于实现对其他密钥格式支持情况的详细信息。
SubtleCrypto 接口的方法通过
使用 ECMAScript
[ECMA-262] 或
DOMException 中定义的预定义异常拒绝返回的
promise
来返回错误。使用以下
预定义异常:TypeError。使用
[DOM]
中的以下 DOMException 类型:
| 名称 | 描述 |
|---|---|
NotSupportedError
|
不支持该算法 |
SyntaxError |
缺少必需参数或参数超出范围 |
InvalidAccessError
|
所请求的操作对所提供的密钥无效 |
DataError |
提供给操作的数据不满足要求 |
OperationError
|
操作因操作特定的原因而失败 |
当本规范要求 抛出错误时,用户 代理必须按照 [WebIDL] 中所述 抛出错误。当这发生在子算法中时, 这会导致该子算法以及所有祖先算法的执行终止, 直到到达某个显式描述了捕获异常过程的算法为止。 被抛出的错误对象应与 相关 realm,其属于 this。
WebIDLdictionary RsaOtherPrimesInfo {
// The following fields are defined in Section 6.3.2.7 of JSON Web Algorithms
DOMString r;
DOMString d;
DOMString t;
};
dictionary JsonWebKey {
// The following fields are defined in Section 3.1 of JSON Web Key
DOMString kty;
DOMString use;
sequence<DOMString> key_ops;
DOMString alg;
// The following fields are defined in JSON Web Key Parameters Registration
boolean ext;
// The following fields are defined in Section 6 of JSON Web Algorithms
DOMString crv;
DOMString x;
DOMString y;
DOMString d;
DOMString n;
DOMString e;
DOMString p;
DOMString q;
DOMString dp;
DOMString dq;
DOMString qi;
sequence<RsaOtherPrimesInfo> oth;
DOMString k;
};
JsonWebKey 字典提供了一种表示
和交换由 JSON Web Key [JWK]
结构表示的加密密钥的方法,同时允许在 Web Cryptography API
应用中进行原生且高效的使用。
RsaOtherPrimesInfo 的成员定义于 JSON Web
Algorithms 第 6.3.2.7 节。
WebIDLtypedef Uint8Array BigInteger;
BigInteger typedef 是一个 Uint8Array,
其
以大端序保存任意大小的无符号整数。从
API 读取的值SHALL具有最小类型化数组长度(即至多 7 个前导零
位,
但值 0 应具有 8 位长度)。API SHALL 接受
具有任意数量前导零位的值,包括表示零的空数组。
WebIDLdictionary CryptoKeyPair {
CryptoKey publicKey;
CryptoKey privateKey;
};
CryptoKeyPair 字典表示一个
非对称密钥对,由公钥(publicKey)和私钥
(privateKey)组成。
本节是非规范性的。
除了通过 SubtleCrypto 接口提供执行加密操作的
通用接口之外,本规范
还提供了作者可能希望使用、且用户代理可以选择实现的各种算法的描述。
这包括一组常用部署的
对称和非对称算法、密钥派生机制,以及用于包装
和解包密钥的方法。此外,本规范定义了一个过程,允许其他
规范引入额外的加密算法。
为与 Web Cryptography API 一起使用而定义的每个加密算法 MUST 具有一个唯一名称,称为其 已识别算法名称,使得没有 其他规范为 Web Cryptography API 的使用定义相同的不区分大小写字符串。
为与 Web Cryptography API 一起使用而定义的每个加密算法都有一个
支持的操作列表,它们是一组
由 SubtleCrypto
接口调用以执行所需加密操作的子算法。本规范
使用以下操作:
如果给定的算法规范没有列出某个特定操作为受支持, 或显式列出某个操作为不受支持,则用户代理 MUST 表现得好像调用该子算法 抛出了 NotSupportedError。
为与 Web Cryptography API 一起使用而定义的每个加密算法 MUST 针对每个支持的 操作,定义用于算法规范化的 IDL 类型,以及 子算法返回值的 IDL 类型或类型集合。
本规范中的每个加密算法定义都采用以下 规范约定。标题为 "Registration" 的小节将包括 已识别算法名称。此外,它 包括一个表,该表将把每个支持的 操作列为行,并由 Operation 列标识。给定行中 Parameters 列的内容 将包含用于该操作算法规范化的 IDL 类型, 而该行中 Result 列的内容 指示执行该支持的操作后所得的 IDL 类型。
如果一致的用户代理实现某个算法,则它 MUST 实现所有 支持的操作,并且 MUST 返回指定的 IDL 类型。
此外,在初始化时,一致的用户代理必须对每个 支持的操作执行定义算法步骤, 按指示注册其 IDL 参数类型。
本节是非规范性的。
AlgorithmIdentifier
typedef 允许
算法被指定为 DOMString 或一个
对象。使用 DOMString 是为了允许
作者用
简写来表示没有参数的算法(例如 SHA-1)。
使用对象是为了允许指定 Algorithm(或适当的
子类),其
包含对象的所有关联参数。
因此,有必要定义将 AlgorithmIdentifier
转换为可与此 API 一起使用的适当
字典的算法。该算法必须是可扩展的,以允许添加新的
加密算法,并且必须是一致的,以便 Web IDL 类型映射可以在任何控制
返回给调用脚本之前发生,否则可能允许
参数或脚本环境发生变异。
本规范使用一个内部对象 supportedAlgorithms。该内部对象 不暴露给应用。
由于该值不暴露给应用,因此未指定其确切类型。 仅要求它表现为键/值对的关联容器,其中 键的比较以区分大小写的方式执行。
此内部对象的初始内容如下:
对于支持的操作列表中的每个值
v,
将内部对象 supportedAlgorithms
的 v 键设置为新的关联容器。
定义算法算法由规范作者使用, 用于指示用户代理应如何为特定算法规范化参数。 其输入为算法名称 alg(表示为 DOMString)、 操作名称 op(表示为 DOMString),以及所需的 IDL 字典类型 type。该算法行为如下:
supportedAlgorithms 的
op 键处的关联容器。
规范化算法算法定义了
在 Web IDL 转换发生之后,将输入强制转换为目标 IDL 字典类型的过程。
它被设计为可扩展,以允许未来规范
定义额外算法,同时也安全适用于 Promise。其输入为
操作名称 op 和一个 AlgorithmIdentifier alg。其
输出为
IDL 字典类型或错误。其行为如下:
返回运行规范化算法算法所得的结果,其中
alg 设置为一个新的 Algorithm
字典,其 name 属性为
alg,并且 op 设置为 op。
supportedAlgorithms 的
op 键处的关联容器。
Algorithm 所得的结果,如
[WebIDL] 中所定义。
name
属性的值。
将 algName 设置为匹配键的值。
令 desiredType 为存储在 registeredAlgorithms 中 algName 处的 IDL 字典类型。
NotSupportedError 并终止此算法。
name 属性设置为
algName。
对 dictionaries 中的每个字典 dictionary:
对 dictionary 上声明的每个字典成员 member, 按顺序:
BufferSource
且存在:
HashAlgorithmIdentifier:
alg 设置为 idlValue,并且
op 设置为 "digest"。
AlgorithmIdentifier:
alg 设置为 idlValue,并且
op 设置为由标识 algName 的算法所属规范
定义的操作。
本节是非规范性的。
为了促进开发者的互操作性,本规范包括一个 建议算法列表。这些算法被认为是在撰写本文时实践中使用最广泛的 算法,因此为本规范的初始实现提供了良好的 起点。建议的算法为:
本节是非规范性的。
下表包含本规范中描述的算法概述,以及该算法可与之一起使用的 SubtleCrypto 方法集合。为了使 某个算法可与某个方法一起使用,必须在算法规范中定义 该方法的过程中所定义的相应 操作或操作集合。 请注意,方法到底层 操作的这种映射不是一对一的:
encrypt 方法需要
encrypt 操作。
decrypt 方法需要
decrypt 操作。
sign 方法需要 sign
操作。
verify 方法需要 verify
操作。
generateKey 方法需要
generateKey 操作。
importKey 方法需要
importKey 操作。
exportKey 方法需要
exportKey 操作。
deriveKey 方法需要用于
密钥派生算法的 deriveBits 操作,以及用于派生密钥算法的 get key length 和 importKey
操作。
deriveBits 方法需要用于
密钥派生算法的
deriveBits 操作。
digest 方法需要 digest
操作。
wrapKey 方法需要用于
包装算法的 encrypt 或 wrapKey 操作,以及用于被包装密钥算法的 exportKey 操作。
unwrapKey 方法需要用于
解包算法的 decrypt 或 unwrapKey 操作,以及用于被解包密钥算法的 importKey 操作。
应用开发者和脚本作者不应将此表解释为 推荐使用特定算法。相反,它只是记录了支持哪些 方法。作者应参考本文档的面向作者的安全 考虑一节,以更好地理解使用某些 算法时可能产生的风险和顾虑。
| 算法名称 | encrypt | decrypt | sign | verify | digest | generateKey | deriveKey | deriveBits | importKey | exportKey | wrapKey | unwrapKey |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| RSASSA-PKCS1-v1_5 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| RSA-PSS | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| RSA-OAEP | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
| ECDSA | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| ECDH | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| Ed25519 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| X25519 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| AES-CTR | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
| AES-CBC | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
| AES-GCM | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
| AES-KW | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| HMAC | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
| SHA-1 | ✔ | |||||||||||
| SHA-256 | ✔ | |||||||||||
| SHA-384 | ✔ | |||||||||||
| SHA-512 | ✔ | |||||||||||
| HKDF | ✔ | ✔ | ✔ | |||||||||
| PBKDF2 | ✔ | ✔ | ✔ |
本节是非规范性的。
"RSASSA-PKCS1-v1_5" 算法标识符用于执行
[RFC3447]
中指定的 RSASSA-PKCS1-v1_5 算法的签名和验证,
并使用本规范中定义的 SHA 哈希函数。
其他 规范 可以指定将其他哈希算法与 RSASSA-PKCS1-v1_5 一起使用。此类 规范必须定义其他哈希算法的摘要操作,以及 RSASSA-PKCS1-v1_5 的 密钥导入步骤 和 密钥 导出步骤。
此算法的已识别算法名称为
"RSASSA-PKCS1-v1_5"。
| 操作 | 参数 | 结果 |
|---|---|---|
| sign | 无 | 字节 序列 |
| verify | 无 | boolean |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | 无 | object |
WebIDLdictionary RsaKeyGenParams : Algorithm {
required [EnforceRange] unsigned long modulusLength;
required BigInteger publicExponent;
};
modulusLength 成员包含 RSA 模数的长度,
以位为单位。
publicExponent 成员包含 RSA 公共
指数。
WebIDLdictionary RsaHashedKeyGenParams : RsaKeyGenParams {
required HashAlgorithmIdentifier hash;
};
hash 成员表示要
使用的哈希算法。
WebIDLdictionary RsaKeyAlgorithm : KeyAlgorithm {
required unsigned long modulusLength;
required BigInteger publicExponent;
};
modulusLength 成员包含 RSA 模数的长度,
以位为单位。
publicExponent 成员包含 RSA 公共
指数。
WebIDLdictionary RsaHashedKeyAlgorithm : RsaKeyAlgorithm {
required KeyAlgorithm hash;
};
hash 成员描述与
此密钥一起使用的哈希算法。
WebIDLdictionary RsaHashedImportParams : Algorithm {
required HashAlgorithmIdentifier hash;
};
hash 成员描述要
使用的哈希算法。
如果 key 的
[[type]]
内部槽不是 "private",则
抛出一个 InvalidAccessError。
执行 [RFC3447]
第 8.2 节中定义的签名生成操作,其中使用 key 的
[[handle]]
内部槽表示的密钥
作为签名者的私钥,以 message 作为
M,并使用 key 的
[[algorithm]] 内部
槽的 hash 属性中指定的哈希函数,
作为 EMSA-PKCS1-v1_5 编码方法的 Hash 选项。
如果执行该操作导致错误,
则抛出一个
OperationError。
令 signature 为执行该操作所得的值 S。
返回 signature。
如果 key 的
[[type]]
内部槽不是 "public",则抛出一个 InvalidAccessError。
执行
[RFC3447]
第 8.2 节中定义的签名验证操作,其中使用 key 的
[[handle]]
内部槽表示的密钥
作为签名者的 RSA 公钥,以 message 作为
M,并以
signature 作为 S,并使用
key 的
[[algorithm]] 内部
槽的 hash 属性中指定的
哈希函数作为 EMSA-PKCS1-v1_5 编码方法的 Hash 选项。
令 result 为一个 boolean;如果该操作的 结果为 "valid signature",则其值为 true,否则其值 为 false。
返回 result。
如果 usages 包含不是
"sign" 或 "verify" 的条目,
则抛出一个
SyntaxError。
按 [RFC3447]
中的定义生成一个 RSA 密钥对,其 RSA 模数长度等于
normalizedAlgorithm 的
modulusLength
属性,RSA 公共指数等于
normalizedAlgorithm 的
publicExponent
属性。
如果密钥对生成失败,
则抛出一个
OperationError。
令 algorithm 为一个新的
RsaHashedKeyAlgorithm
字典。
将 algorithm 的
name 属性设置为
"RSASSA-PKCS1-v1_5"。
将 algorithm 的
modulusLength
属性设置为等于
normalizedAlgorithm 的
modulusLength
属性。
将 algorithm 的
publicExponent
属性设置为等于
normalizedAlgorithm 的
publicExponent
属性。
令 publicKey 为一个新的 CryptoKey,
表示所生成密钥对的公钥。
将 publicKey 的
[[type]]
内部槽设置为 "public"
将 publicKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 publicKey 的 [[extractable]] 内部
槽设置为 true。
将 publicKey 的 [[usages]] 内部槽
设置为 usages 与 [ "verify" ] 的用法交集。
令 privateKey 为一个新的 CryptoKey,
表示所生成密钥对的私钥。
将 privateKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 privateKey 的 [[extractable]] 内部
槽设置为 extractable。
将 privateKey 的 [[usages]] 内部槽
设置为 usages 与 [ "sign" ] 的用法交集。
令 result 为一个新的 CryptoKeyPair
字典。
将 result 的 publicKey 属性
设置为 publicKey。
将 result 的 privateKey 属性
设置为 privateKey。
返回 result。
令 keyData 为要导入的密钥数据。
spki":
如果 usages 包含不是
"verify" 的条目,
则抛出一个
SyntaxError。
令 spki 为对 keyData 运行 解析 subjectPublicKeyInfo 算法所得的结果。
如果 spki 的 algorithm AlgorithmIdentifier 字段的
algorithm 对象标识符字段
不等于 [RFC3447]
中定义的 rsaEncryption
对象标识符,则抛出一个
DataError。
令 publicKey 为执行解析
ASN.1 结构
算法所得的结果,其中 data 为 spki 的
subjectPublicKeyInfo 字段,
structure 为 [RFC3447]
第 A.1.1 节中指定的 RSAPublicKey 结构,
并将
exactData 设置为 true。
如果解析过程中发生错误,或者可以确定
publicKey
不是符合 [RFC3447]
的有效公钥,则抛出一个
DataError。
令 key 为一个新的 CryptoKey,
它表示由
publicKey 标识的 RSA 公钥。
将 key 的
[[type]]
内部槽
设置为 "public"
pkcs8":
如果 usages 包含不是
"sign" 的条目,
则抛出一个
SyntaxError。
令 privateKeyInfo 为对 keyData 运行 解析 privateKeyInfo 算法所得的结果。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithm 字段的
algorithm 对象标识符字段不等于
[RFC3447]
中定义的
rsaEncryption 对象标识符,
则抛出一个
DataError。
令 rsaPrivateKey 为执行解析
ASN.1 结构
算法所得的结果,其中 data 为
privateKeyInfo 的 privateKey 字段,
structure 为 [RFC3447]
第 A.1.2 节中指定的 RSAPrivateKey 结构,
并将
exactData 设置为 true。
如果解析过程中发生错误,或者 rsaPrivateKey 不是
符合 [RFC3447]
的有效 RSA 私钥,则抛出一个
DataError。
令 key 为一个新的 CryptoKey,
它表示由
rsaPrivateKey 标识的 RSA 私钥。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 jwk 的 d
字段存在,且
usages 包含不是
"sign" 的条目;或者,如果 jwk 的 d 字段
不存在,且
usages 包含不是
"verify" 的条目,
则抛出一个
SyntaxError。
如果 usages 非空,且 jwk 的 use 字段存在,并且
与 "sig" 不是区分大小写的字符串匹配,
则抛出一个
DataError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web Key [JWK] 的要求无效,或
不包含所有指定的 usages 值,
则抛出一个
DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
令 hash 为一个初始值为 undefined 的字符串。
d 字段存在:
NotSupportedError。
令 algorithm 为一个新的
RsaHashedKeyAlgorithm
字典。
将 algorithm 的
name 属性设置为
"RSASSA-PKCS1-v1_5"
将 algorithm 的 modulusLength
属性设置为 RSA 公共模数的长度,以位为单位。
将 algorithm 的 publicExponent 属性设置为 RSA 公共指数的 BigInteger 表示。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
返回 key。
令 key 为要导出的密钥。
如果无法访问由 key 的 [[handle]]
内部槽表示的底层加密密钥材料,
则抛出一个 OperationError。
spki"
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为 [RFC5280]
中定义的 SubjectPublicKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 algorithm 字段设置为具有以下
属性的 AlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC3447]
中定义的 OID
rsaEncryption。
将 params 字段设置为 ASN.1 类型 NULL。
将 subjectPublicKey 字段设置为
对 [RFC3447]
附录 A.1.1 中定义的 RSAPublicKey ASN.1 类型进行
DER 编码所得的结果,该类型
表示由 key 的 [[handle]]
内部槽表示的 RSA 公钥
令 result 为对 data 进行 DER 编码所得的结果。
pkcs8":
如果 key 的
[[type]]
内部槽
不是 "private",则抛出一个 InvalidAccessError。
令 data 为 [RFC5208]
中定义的 PrivateKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 version 字段设置为 0。
将 privateKeyAlgorithm 字段设置为具有以下属性的
PrivateKeyAlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC3447]
中定义的 OID
rsaEncryption。
将 params 字段设置为 ASN.1 类型 NULL。
将 privateKey 字段设置为对
[RFC3447]
附录 A.1.2 中定义的 RSAPrivateKey ASN.1 类型进行 DER 编码所得的结果,
该类型表示由 key 的 [[handle]]
内部槽表示的
RSA 私钥
令 result 为对 data 进行 DER 编码所得的结果。
jwk":令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为字符串
"RSA"。
令 hash 为 key 的
[[algorithm]]
内部槽的 hash
属性的 name
属性。
SHA-1":
将 jwk 的 alg 属性设置为字符串
"RS1"。
SHA-256":
将 jwk 的 alg 属性设置为字符串
"RS256"。
SHA-384":
将 jwk 的 alg 属性设置为字符串
"RS384"。
SHA-512":
将 jwk 的 alg 属性设置为字符串
"RS512"。
如果发生错误或不存在
适用
规范,
则抛出
一个
NotSupportedError。
将 jwk 的 alg 属性设置为
alg。
按照 JSON Web Algorithms [JWA] 第
6.3.1 节中的
相应定义,设置 jwk 的属性 n
和 e。
将 jwk 的 key_ops 属性设置为 key 的
usages 属性。
将 jwk 的 ext 属性设置为 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
本节是非规范性的。
"RSA-PSS" 算法标识符用于执行使用
[RFC3447]
中指定的 RSASSA-PSS 算法的签名
和验证,
并使用本规范中定义的 SHA 哈希函数和掩码生成
公式 MGF1。
其他 规范 可以指定将其他哈希算法与 RSASSA-PSS 一起使用。此类规范 必须定义其他哈希算法的摘要操作,以及 RSASSA-PSS 的 密钥导入步骤和 密钥导出步骤。
此算法的已识别算法名称为
"RSA-PSS"。
| 操作 | 参数 | 结果 |
|---|---|---|
| sign | RsaPssParams |
字节 序列 |
| verify | RsaPssParams |
boolean |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | 无 | object |
WebIDLdictionary RsaPssParams : Algorithm {
required [EnforceRange] unsigned long saltLength;
};
saltLength 成员表示所需的
随机盐长度,以字节为单位。
如果 key 的
[[type]]
内部槽不是 "private",则
抛出一个 InvalidAccessError。
执行 [RFC3447]
第 8.1 节中定义的签名生成操作,其中使用 key 的
[[handle]] 内部槽表示的密钥
作为签名者的私钥 K,以 message 作为
要签名的消息 M,并使用
key 的
[[algorithm]] 内部
槽的 hash 属性指定的哈希函数
作为 Hash 选项,MGF1(定义于 [RFC3447]
第 B.2.1 节)
作为 MGF 选项,并使用
normalizedAlgorithm 的 saltLength 成员作为
EMSA-PSS-ENCODE 操作的盐长度选项。
如果执行该操作导致错误,
则抛出一个
OperationError。
令 signature 为执行该操作所得的 签名 S。
返回 signature。
如果 key 的
[[type]]
内部槽不是 "public",则抛出一个 InvalidAccessError。
执行
[RFC3447]
第 8.1 节中定义的签名验证操作,其中使用 key 的
[[handle]] 内部槽表示的密钥
作为签名者的 RSA 公钥,以 message 作为
M,并以
signature 作为 S,并使用
key 的
[[algorithm]] 内部
槽的 hash 属性指定的哈希函数
作为 Hash 选项,MGF1(定义于 [RFC3447]
第 B.2.1 节)
作为 MGF 选项,并使用
normalizedAlgorithm 的 saltLength 成员作为
EMSA-PSS-VERIFY 操作的盐长度选项。
令 result 为一个 boolean;如果该操作的 结果为 "valid signature",则其值为 true,否则其值 为 false。
如果 usages 包含不是
"sign" 或 "verify" 的条目,
则抛出一个
SyntaxError。
按 [RFC3447]
中的定义生成一个 RSA 密钥对,其 RSA 模数长度等于
normalizedAlgorithm 的
modulusLength 成员,
RSA 公共指数等于
normalizedAlgorithm 的
publicExponent 成员。
如果执行该操作导致错误,
则抛出一个
OperationError。
令 algorithm 为一个新的
RsaHashedKeyAlgorithm
字典。
将 algorithm 的
name 属性设置为
"RSA-PSS"。
将 algorithm 的
modulusLength
属性设置为等于
normalizedAlgorithm 的
modulusLength
成员。
将 algorithm 的
publicExponent
属性设置为等于
normalizedAlgorithm 的
publicExponent
成员。
令 publicKey 为一个新的 CryptoKey,
表示所生成密钥对的公钥。
将 publicKey 的
[[type]]
内部槽设置为 "public"
将 publicKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 publicKey 的 [[extractable]] 内部
槽设置为 true。
将 publicKey 的 [[usages]] 内部槽
设置为 usages 与 [ "verify" ] 的用法交集。
令 privateKey 为一个新的 CryptoKey,
表示所生成密钥对的私钥。
将 privateKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 privateKey 的 [[extractable]] 内部
槽设置为 extractable。
将 privateKey 的 [[usages]] 内部槽
设置为 usages 与 [ "sign" ] 的用法交集。
令 result 为一个新的 CryptoKeyPair
字典。
将 result 的 publicKey 属性
设置为 publicKey。
将 result 的 privateKey 属性
设置为 privateKey。
返回 result。
令 keyData 为要导入的密钥数据。
spki":
如果 usages 包含不是
"verify" 的条目,
则抛出一个
SyntaxError。
令 spki 为对 keyData 运行 解析 subjectPublicKeyInfo 算法所得的结果。
如果 spki 的 algorithm AlgorithmIdentifier 字段的
algorithm 对象标识符字段
不等于 [RFC3447]
中定义的 rsaEncryption
对象标识符,则抛出一个
DataError。
令 publicKey 为执行解析
ASN.1 结构
算法所得的结果,其中 data 为 spki 的
subjectPublicKeyInfo 字段,
structure 为 [RFC3447]
第 A.1.1 节中指定的 RSAPublicKey 结构,
并将
exactData 设置为 true。
如果解析过程中发生错误,或者可以确定
publicKey
不是符合 [RFC3447]
的有效公钥,则抛出一个
DataError。
令 key 为一个新的 CryptoKey,
它表示由
publicKey 标识的 RSA 公钥。
将 key 的
[[type]]
内部槽
设置为 "public"
pkcs8":
如果 usages 包含不是
"sign" 的条目,
则抛出一个
SyntaxError。
令 privateKeyInfo 为对 keyData 运行 解析 privateKeyInfo 算法所得的结果。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithm 字段的
algorithm 对象标识符字段不等于
[RFC3447]
中定义的
rsaEncryption 对象标识符,
则抛出一个
DataError。
令 rsaPrivateKey 为执行解析
ASN.1 结构
算法所得的结果,其中 data 为
privateKeyInfo 的 privateKey 字段,
structure 为 [RFC3447]
第 A.1.2 节中指定的 RSAPrivateKey 结构,
并将
exactData 设置为 true。
如果解析过程中发生错误,或者 rsaPrivateKey 不是
符合 [RFC3447]
的有效 RSA 私钥,则抛出一个
DataError。
令 key 为一个新的 CryptoKey,
它表示由
rsaPrivateKey 标识的 RSA 私钥。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 jwk 的 d
字段存在,且
usages 包含不是
"sign" 的条目;或者,如果 jwk 的 d 字段
不存在,且
usages 包含不是
"verify" 的条目,
则抛出一个
SyntaxError。
如果 usages 非空,且 jwk 的 use 字段存在,并且
与 "sig" 不是区分大小写的字符串匹配,
则抛出一个
DataError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web Key [JWK] 的要求无效,或
不包含所有指定的 usages 值,
则抛出一个
DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
d 字段存在:
NotSupportedError。
令 algorithm 为一个新的
RsaHashedKeyAlgorithm
字典。
将 algorithm 的
name 属性设置为
"RSA-PSS"
将 algorithm 的 modulusLength
属性设置为 RSA 公共模数的长度,以位为单位。
将 algorithm 的 publicExponent
属性设置为 RSA 公共指数的 BigInteger
表示。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm
返回 key。
令 key 为要导出的密钥。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
spki"
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为 [RFC5280]
中定义的 SubjectPublicKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 algorithm 字段设置为具有以下
属性的 AlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC3447]
中定义的 OID
rsaEncryption。
将 params 字段设置为 ASN.1 类型 NULL。
将 subjectPublicKey 字段设置为
对 [RFC3447]
附录 A.1.1 中定义的 RSAPublicKey ASN.1 类型进行
DER 编码所得的结果,该类型
表示由 key 的 [[handle]]
内部槽表示的
RSA 公钥
令 result 为对 data 进行 DER 编码所得的结果。
pkcs8":
如果 key 的
[[type]]
内部槽
不是 "private",则抛出一个 InvalidAccessError。
令 data 为 [RFC5208]
中定义的 PrivateKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 version 字段设置为 0。
将 privateKeyAlgorithm 字段设置为具有以下
属性的 PrivateKeyAlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC3447]
中定义的 OID
rsaEncryption。
将 params 字段设置为 ASN.1 类型 NULL。
将 privateKey 字段设置为对
[RFC3447]
附录 A.1.2 中定义的 RSAPrivateKey ASN.1 类型进行 DER 编码所得的结果,
该类型表示由 key 的 [[handle]]
内部槽表示的
RSA 私钥
令 result 为对 data 进行 DER 编码所得的结果。
jwk":令 jwk 为一个新的 JsonWebKey 字典。
将 jwk 的 kty 属性设置为字符串
"RSA"。
令 hash 为 key 的
[[algorithm]]
内部槽的 hash
属性的 name
属性。
SHA-1":
将 jwk 的 alg 属性设置为字符串
"PS1"。
SHA-256":
将 jwk 的 alg 属性设置为字符串
"PS256"。
SHA-384":
将 jwk 的 alg 属性设置为字符串
"PS384"。
SHA-512":
将 jwk 的 alg 属性设置为字符串
"PS512"。
执行由其他适用
规范定义的任何 密钥
导出步骤,传入 format 和
key 的
[[algorithm]]
内部槽的 hash
属性,
并获得 alg。
将 jwk 的 alg 属性设置为
alg。
按照 JSON Web Algorithms [JWA] 第
6.3.1 节中的
相应定义,设置 jwk 的属性 n
和 e。
将 jwk 的 key_ops 属性设置为 key 的
usages 属性。
将 jwk 的 ext 属性设置为 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
本节是非规范性的。
"RSA-OAEP" 算法标识符用于根据
[RFC3447]
中指定的 RSAES-OAEP 算法执行加密
和解密,
并使用本规范中定义的 SHA 哈希函数以及掩码
生成函数 MGF1。
其他 规范 可以指定将其他哈希算法与 RSAES-OAEP 一起使用。此类规范 必须定义其他哈希算法的摘要操作,以及 RSAES-OAEP 的 密钥导入步骤和 密钥导出步骤。
此算法的已识别算法名称为
"RSA-OAEP"。
| 操作 | 参数 | 结果 |
|---|---|---|
| encrypt | RsaOaepParams |
字节 序列 |
| decrypt | RsaOaepParams |
字节 序列 |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | 无 | object |
WebIDLdictionary RsaOaepParams : Algorithm {
BufferSource label;
};
label 成员表示要与消息关联的可选标签/应用
数据。
如果 key 的 [[type]]
内部槽
不是 "public",
则抛出一个
InvalidAccessError。
令 label 为
normalizedAlgorithm 的 label 成员;
如果
normalizedAlgorithm 的
label 成员不存在,则为空字节序列。
执行 [RFC3447]
第 7.1 节中定义的加密操作,其中使用由 key
表示的密钥作为接收者的 RSA 公钥,以 plaintext
作为要加密的消息 M,以 label
作为标签 L,并使用 key 的
[[algorithm]] 内部
槽的 hash
属性指定的哈希函数作为 Hash 选项,并以 MGF1(定义于
[RFC3447]
第 B.2.1 节)
作为 MGF 选项。
如果执行该操作导致错误,
则抛出一个
OperationError。
令 ciphertext 为执行该操作所得的值 C。
返回 ciphertext。
如果 key 的 [[type]]
内部槽
不是 "private",
则抛出一个
InvalidAccessError。
令 label 为
normalizedAlgorithm 的 label 成员;
如果
normalizedAlgorithm 的
label 成员不存在,则为空字节序列。
执行 [RFC3447]
第 7.1 节中定义的解密操作,其中使用由 key
表示的密钥作为接收者的 RSA 私钥,以 ciphertext
作为要解密的密文 C,以 label
作为标签 L,并使用 key 的
[[algorithm]] 内部
槽的 hash
属性指定的哈希函数作为 Hash 选项,并以 MGF1(定义于
[RFC3447]
第 B.2.1 节)
作为 MGF 选项。
如果执行该操作导致错误,
则抛出一个
OperationError。
令 plaintext 为执行该操作所得的值 M。
返回 plaintext。
如果 usages 包含不是
"encrypt"、"decrypt"、
"wrapKey" 或 "unwrapKey" 的条目,
则抛出一个
SyntaxError。
按 [RFC3447]
中的定义生成一个 RSA 密钥对,其 RSA 模数长度等于
normalizedAlgorithm 的
modulusLength 成员,
RSA 公共指数等于
normalizedAlgorithm 的
publicExponent 成员。
如果执行该操作导致错误,
则抛出一个
OperationError。
令 algorithm 为一个新的
RsaHashedKeyAlgorithm
对象。
将 algorithm 的
name 属性设置为
"RSA-OAEP"。
将 algorithm 的
modulusLength
属性设置为等于
normalizedAlgorithm 的
modulusLength
成员。
将 algorithm 的
publicExponent
属性设置为等于
normalizedAlgorithm 的
publicExponent
成员。
令 publicKey 为一个新的 CryptoKey,
表示所生成密钥对的公钥。
将 publicKey 的 [[type]]
内部槽
设置为 "public"
将 publicKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 publicKey 的 [[extractable]] 内部
槽设置为 true。
将 publicKey 的 [[usages]] 内部槽
设置为 usages 与 [ "encrypt", "wrapKey" ] 的
用法交集。
令 privateKey 为一个新的 CryptoKey,
表示所生成密钥对的私钥。
将 privateKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 privateKey 的 [[extractable]] 内部
槽设置为 extractable。
将 privateKey 的 [[usages]] 内部槽
设置为 usages 与 [ "decrypt", "unwrapKey" ] 的
用法交集。
令 result 为一个新的 CryptoKeyPair
字典。
将 result 的 publicKey 属性
设置为 publicKey。
将 result 的 privateKey 属性
设置为 privateKey。
返回 result。
令 keyData 为要导入的密钥数据。
spki":
如果 usages 包含不是
"encrypt" 或
"wrapKey" 的条目,
则抛出一个
SyntaxError。
令 spki 为对 keyData 运行 解析 subjectPublicKeyInfo 算法所得的结果。
如果 spki 的 algorithm AlgorithmIdentifier 字段的
algorithm 对象标识符字段
不等于 [RFC3447]
中定义的 rsaEncryption
对象标识符,则抛出一个
DataError。
令 publicKey 为执行解析
ASN.1 结构
算法所得的结果,其中 data 为
spki 的 subjectPublicKeyInfo 字段,
structure 为 [RFC3447]
第 A.1.1 节中指定的 RSAPublicKey 结构,
并将
exactData 设置为 true。
如果解析过程中发生错误,或者可以确定
publicKey
不是符合 [RFC3447]
的有效公钥,则抛出一个
DataError。
令 key 为一个新的 CryptoKey,
它表示由
publicKey 标识的 RSA 公钥。
将 key 的
[[type]]
内部槽设置为
"public"
pkcs8":
如果 usages 包含不是
"decrypt" 或 "unwrapKey" 的条目,
则抛出一个
SyntaxError。
令 privateKeyInfo 为对 keyData 运行 解析 privateKeyInfo 算法所得的结果。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithm 字段的
algorithm 对象标识符字段不等于
[RFC3447]
中定义的
rsaEncryption 对象标识符,
则抛出一个
DataError。
令 rsaPrivateKey 为执行解析
ASN.1 结构
算法所得的结果,其中 data 为
privateKeyInfo 的 privateKey 字段,
structure 为 [RFC3447]
第 A.1.2 节中指定的 RSAPrivateKey 结构,
并将
exactData 设置为 true。
如果解析过程中发生错误,或者 rsaPrivateKey 不是
符合 [RFC3447]
的有效 RSA 私钥,则抛出一个
DataError。
令 key 为一个新的 CryptoKey,
它表示由
rsaPrivateKey 标识的 RSA 私钥。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 jwk 的 d
字段存在,且
usages 包含不是
"decrypt" 或 "unwrapKey" 的条目,
则抛出一个
SyntaxError。
如果 jwk 的 d
字段不存在,且
usages 包含不是
"encrypt" 或 "wrapKey" 的条目,
则抛出一个
SyntaxError。
如果 usages 非空,且 jwk 的 use 字段存在,并且
与 "enc" 不是区分大小写的字符串匹配,
则抛出一个
DataError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web Key [JWK] 的要求无效,或
不包含所有指定的 usages 值,
则抛出一个
DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
alg 字段不存在:alg 字段等于
"RSA-OAEP":
SHA-1"。alg 字段等于
"RSA-OAEP-256":
SHA-256"。alg 字段等于
"RSA-OAEP-384":
SHA-384"。alg 字段等于
"RSA-OAEP-512":
SHA-512"。d 字段存在:
NotSupportedError。
令 algorithm 为一个新的
RsaHashedKeyAlgorithm。
将 algorithm 的
name 属性设置为
"RSA-OAEP"
将 algorithm 的 modulusLength
属性设置为 RSA 公共模数的长度,以位为单位。
将 algorithm 的 publicExponent
属性设置为 RSA 公共指数的 BigInteger
表示。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm
返回 key。
令 key 为要导出的密钥。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
spki"
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为 [RFC5280]
中定义的 SubjectPublicKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 algorithm 字段设置为具有以下
属性的 AlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC3447]
中定义的 OID
rsaEncryption。
将 params 字段设置为 ASN.1 类型 NULL。
将 subjectPublicKey 字段设置为
对 [RFC3447]
附录 A.1.1 中定义的 RSAPublicKey ASN.1 类型进行
DER 编码所得的结果,该类型
表示由 key 的 [[handle]]
内部槽表示的
RSA 公钥
令 result 为对 data 进行 DER 编码所得的结果。
pkcs8":
如果 key 的
[[type]]
内部槽
不是 "private",则抛出一个 InvalidAccessError。
令 data 为 [RFC5208]
中定义的 PrivateKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 version 字段设置为 0。
将 privateKeyAlgorithm 字段设置为具有以下
属性的 PrivateKeyAlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC3447]
中定义的 OID
rsaEncryption。
将 params 字段设置为 ASN.1 类型 NULL。
将 privateKey 字段设置为对
[RFC3447]
附录 A.1.2 中定义的 RSAPrivateKey ASN.1 类型进行 DER 编码所得的结果,
该类型表示由 key 的 [[handle]]
内部槽表示的
RSA 私钥
令 result 为对 data 进行 DER 编码所得的结果。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为字符串
"RSA"。
令 hash 为 key 的
[[algorithm]]
内部槽的 hash
属性的 name
属性。
SHA-1":
将 jwk 的 alg 属性设置为字符串
"RSA-OAEP"。
SHA-256":
将 jwk 的 alg 属性设置为字符串
"RSA-OAEP-256"。
SHA-384":
将 jwk 的 alg 属性设置为字符串
"RSA-OAEP-384"。
SHA-512":
将 jwk 的 alg 属性设置为字符串
"RSA-OAEP-512"。
执行由其他适用
规范定义的任何 密钥
导出步骤,传入 format 和
key 的
[[algorithm]]
内部槽的 hash
属性,
并获得 alg。
将 jwk 的 alg 属性设置为
alg。
按照 JSON Web Algorithms [JWA] 第
6.3.1 节中的
相应定义,设置 jwk 的属性 n
和 e。
将 jwk 的 key_ops 属性设置为 key 的
usages 属性。
将 jwk 的 ext 属性设置为 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
本节是非规范性的。
"ECDSA" 算法标识符用于使用
[RFC6090] 中指定的 ECDSA 算法执行签名
和验证,并使用本规范中定义的 SHA
哈希函数和椭圆
曲线。
其他 规范 可以指定将其他椭圆曲线和哈希算法与 ECDSA 一起使用。要 指定与 ECDSA 一起使用的其他哈希算法,规范必须定义 一个支持摘要操作的注册算法。 要指定额外的椭圆曲线,规范必须定义 曲线名称、 ECDSA 签名步骤、 ECDSA 验证步骤、 ECDSA 生成步骤、 ECDSA 密钥导入步骤和 ECDSA 密钥导出步骤。
此算法的已识别算法名称为
"ECDSA"。
| 操作 | 参数 | 结果 |
|---|---|---|
| sign | EcdsaParams |
字节 序列 |
| verify | EcdsaParams |
boolean |
| generateKey | EcKeyGenParams
|
CryptoKeyPair
|
| importKey | EcKeyImportParams |
CryptoKey |
| exportKey | 无 | object |
WebIDLdictionary EcdsaParams : Algorithm {
required HashAlgorithmIdentifier hash;
};
hash 成员表示要使用的哈希算法。
WebIDLtypedef DOMString NamedCurve;
dictionary EcKeyGenParams : Algorithm {
required NamedCurve namedCurve;
};
NamedCurve 类型表示命名椭圆曲线,
它们是指定知名椭圆
曲线的域参数的一种便捷方式。本规范定义了以下值:
P-256"secp256r1。P-384"secp384r1。P-521"secp521r1。EcKeyGenParams 字典的 namedCurve 成员表示命名
曲线。
WebIDLdictionary EcKeyAlgorithm : KeyAlgorithm {
required NamedCurve namedCurve;
};
namedCurve 成员表示
该密钥使用的命名曲线。
WebIDLdictionary EcKeyImportParams : Algorithm {
required NamedCurve namedCurve;
};
namedCurve 成员表示命名曲线。
如果 key 的
[[type]]
内部槽不是 "private",则
抛出一个 InvalidAccessError。
令 hashAlgorithm 为 normalizedAlgorithm 的
hash
成员。
令 M 为使用 message 执行由 hashAlgorithm 指定的摘要操作所得的结果。
令 d 为与 key 关联的 ECDSA 私钥。
令 params 为与 key 关联的 EC 域参数。
[[algorithm]] 内部
槽的 namedCurve 属性
为 "P-256"、"P-384" 或 "P-521":
执行 [RFC6090] 第 5.4 节中指定的 ECDSA 签名过程,其中 M 作为消息,使用 params 作为 EC 域参数,并以 d 作为私钥。
令 r 和 s 为执行 ECDSA 签名过程所得的 整数对。
令 result 为空字节序列。
令 n 为满足 n * 8 大于 由 params 标识的椭圆曲线基点阶数以 2 为底的对数的 最小整数。
将 r 转换为长度为 n 的字节序列并追加到 result。
将 s 转换为长度为 n 的字节序列并追加到 result。
[[algorithm]] 内部
槽的 namedCurve 属性
是适用规范中指定的值:
执行该规范中指定的 ECDSA 签名步骤, 传入 M、params 和 d,并得到 result。
返回 result。
如果 key 的
[[type]]
内部槽不是 "public",则抛出一个 InvalidAccessError。
令 hashAlgorithm 为
normalizedAlgorithm 的 hash
成员。
令 M 为使用 message 执行由 hashAlgorithm 指定的摘要操作所得的结果。
令 Q 为与 key 关联的 ECDSA 公钥。
令 params 为与 key 关联的 EC 域参数。
[[algorithm]] 内部
槽的 namedCurve 属性
为 "P-256"、"P-384" 或 "P-521":
执行 [RFC6090] 第 5.3 节中指定的 ECDSA 验证过程,其中 M 作为接收到的 消息,signature 作为接收到的签名,并使用 params 作为 EC 域参数,且以 Q 作为公钥。
[[algorithm]] 内部
槽的 namedCurve 属性
是适用规范中指定的值:
执行该规范中指定的 ECDSA 验证 步骤, 传入 M、signature、 params 和 Q,并得到所谓签名是否 有效的指示。
令 result 为 boolean;如果签名
有效,则其值为 true,
否则其值为 false。
返回 result。
如果 usages 包含不是
"sign" 或 "verify" 之一的值,
则抛出一个
SyntaxError。
namedCurve 成员为
"P-256"、"P-384"
或 "P-521":
按 [RFC6090]
中的定义生成一个椭圆曲线密钥对,其域参数用于
normalizedAlgorithm 的
namedCurve 成员
所标识的曲线。
namedCurve 成员
是适用规范中指定的值:
执行该规范中指定的 ECDSA 生成步骤, 传入 normalizedAlgorithm,并得到椭圆曲线密钥对。
如果执行密钥生成操作导致错误,
则抛出一个
OperationError。
令 algorithm 为一个新的
EcKeyAlgorithm
对象。
将 algorithm 的
name 属性设置为
"ECDSA"。
将 algorithm 的 namedCurve
属性设置为等于
normalizedAlgorithm 的
namedCurve 成员。
令 publicKey 为一个新的 CryptoKey,
表示所生成密钥对的公钥。
将 publicKey 的
[[type]]
内部槽设置为
"public"
将 publicKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 publicKey 的 [[extractable]] 内部
槽设置为 true。
将 publicKey 的 [[usages]] 内部槽
设置为 usages 与 [ "verify" ] 的用法交集。
令 privateKey 为一个新的 CryptoKey,
表示所生成密钥对的私钥。
将 privateKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 privateKey 的 [[extractable]] 内部
槽设置为 extractable。
将 privateKey 的 [[usages]] 内部槽
设置为 usages 与 [ "sign" ] 的用法交集。
令 result 为一个新的 CryptoKeyPair
字典。
将 result 的 publicKey 属性
设置为 publicKey。
将 result 的 privateKey 属性
设置为 privateKey。
返回 result。
令 keyData 为要导入的密钥数据。
spki":
如果 usages 包含不是
"verify" 的值,
则抛出一个
SyntaxError。
令 spki 为对 keyData 运行 解析 subjectPublicKeyInfo 算法所得的结果
如果 spki 的 algorithm AlgorithmIdentifier 字段的
algorithm 对象标识符字段
不等于 [RFC5480]
中定义的 id-ecPublicKey
对象标识符,则抛出一个
DataError。
如果 spki 的 algorithm
AlgorithmIdentifier 字段的 parameters 字段缺失,
则抛出一个
DataError。
令 params 为 spki 的
algorithm AlgorithmIdentifier 字段的
parameters 字段。
如果 params 不是
[RFC5480]
中定义的、指定了
namedCurve 的
ECParameters ASN.1 类型实例,则抛出一个 DataError。
令 namedCurve 为一个初始值为 undefined 的字符串。
如果 namedCurve 已定义,且不等于
normalizedAlgorithm 的
namedCurve
成员,则抛出一个 DataError。
如果公钥值不是
normalizedAlgorithm 的
namedCurve
成员所标识的椭圆曲线上的有效点,则抛出一个 DataError。
将 key 的
[[type]]
内部槽
设置为 "public"
令 algorithm 为一个新的 EcKeyAlgorithm。
将 algorithm 的
name 属性设置为
"ECDSA"。
将 algorithm 的
namedCurve
属性设置为 namedCurve。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
pkcs8":
如果 usages 包含不是
"sign" 的值,
则抛出一个
SyntaxError。
令 privateKeyInfo 为对 keyData 运行 解析 privateKeyInfo 算法所得的结果。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithm 字段的
algorithm 对象标识符字段不等于
[RFC5480]
中定义的 id-ecPublicKey 对象标识符,
则抛出一个
DataError。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 字段
的 parameters 字段不存在,
则抛出一个
DataError。
令 params 为 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 字段
的 parameters 字段。
如果 params 不是
[RFC5480]
中定义的、指定了
namedCurve 的
ECParameters ASN.1 类型实例,则抛出一个 DataError。
令 namedCurve 为一个初始值为 undefined 的字符串。
令 ecPrivateKey 为执行
解析
ASN.1 结构
算法所得的结果,其中 data 为
privateKeyInfo 的
privateKey 字段,structure 为
[RFC5915]
第 3 节中指定的 ASN.1
ECPrivateKey 结构,
并将 exactData 设置为 true。
如果
ecPrivateKey 的 parameters 字段
存在,并且不是
[RFC5480]
中定义的 namedCurve ASN.1
类型实例,或者不包含
与 privateKeyInfo 的
privateKeyAlgorithm
PrivateKeyAlgorithmIdentifier 字段的
parameters 字段相同的对象标识符,
则抛出
一个
DataError。
令 key 为一个新的 CryptoKey,
它表示通过使用 ecPrivateKey 执行
[RFC5915]
第 3 节中定义的转换步骤所标识的椭圆曲线私钥。
如果 namedCurve 已定义,且不等于
normalizedAlgorithm 的
namedCurve
成员,则抛出一个 DataError。
如果私钥值不是
normalizedAlgorithm 的
namedCurve
成员所标识的椭圆曲线上的有效点,则抛出一个 DataError。
令 algorithm 为一个新的 EcKeyAlgorithm。
将 algorithm 的
name 属性设置为
"ECDSA"。
将 algorithm 的
namedCurve
属性设置为 namedCurve。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 d 字段存在且
usages 包含
不是 "sign" 的值,或者,
如果 d 字段不存在
且 usages 包含
不是 "verify" 的值,
则抛出一个
SyntaxError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web
Key [JWK] 的要求无效,或者不包含
所有指定的 usages
值,
则抛出一个
DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
令 namedCurve 为一个字符串,其值等于
jwk 的
crv 字段。
如果 namedCurve 不等于
normalizedAlgorithm 的
namedCurve
成员,则抛出一个 DataError。
P-256"、
"P-384" 或 "P-521":
令 algNamedCurve 为一个初始值为 undefined 的字符串。
d
字段存在:
如果密钥值不是
normalizedAlgorithm 的
namedCurve
成员所标识的椭圆曲线上的有效点,则抛出一个 DataError。
令 algorithm 为一个新的 EcKeyAlgorithm
对象实例。
将 algorithm 的
name 属性设置为
"ECDSA"。
将 algorithm 的
namedCurve
属性设置为 namedCurve。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
raw":
如果 normalizedAlgorithm 的
namedCurve
成员不是命名曲线,
则抛出一个
DataError。
如果 usages 包含不是
"verify" 的值,
则抛出一个
SyntaxError。
P-256"、
"P-384" 或 "P-521":
令 algorithm 为一个新的 EcKeyAlgorithm
对象。
将 algorithm 的
name 属性设置为
"ECDSA"。
将 algorithm 的
namedCurve
属性设置为等于
normalizedAlgorithm 的 namedCurve
成员。
将 key 的
[[type]]
内部槽
设置为 "public"
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
返回 key
令 key 为要导出的 CryptoKey。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
spki":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为 [RFC5280]
中定义的 SubjectPublicKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 algorithm 字段设置为具有以下
属性的 AlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC5480]
中定义的 OID
id-ecPublicKey。
将 parameters 字段设置为
[RFC5480]
中定义的 ECParameters ASN.1 类型实例,
如下所示:
[[algorithm]]
内部槽的 namedCurve
属性为 "P-256"、
"P-384" 或 "P-521":
令 keyData 为一个
字节
序列,其按照
[RFC5480]
第 2.2 节中指定的编码规则,并使用未压缩形式,
表示由 key 的 [[handle]]
内部槽表示的椭圆曲线公钥。以及 keyData。
[[algorithm]]
内部槽的 namedCurve
属性为
"P-256":
将 parameters 设置为
namedCurve 选项,
其值等于 [RFC5480]
中定义的对象标识符
secp256r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-384":
将 parameters 设置为
namedCurve 选项,
其值等于 [RFC5480]
中定义的对象标识符
secp384r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-521":
将 parameters 设置为
namedCurve 选项,
其值等于 [RFC5480]
中定义的对象标识符
secp521r1
执行由其他
适用
规范定义的任何 密钥
导出步骤,传入
format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,
并获得 namedCurveOid 和
keyData。
将 parameters 设置为
namedCurve 选项,
其值等于对象标识符
namedCurveOid。
将 subjectPublicKey 字段设置为 keyData。
令 result 为对 data 进行 DER 编码所得的结果。
pkcs8":
如果 key 的
[[type]]
内部槽
不是 "private",则抛出一个 InvalidAccessError。
令 data 为 [RFC5208]
中定义的 PrivateKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 version 字段设置为 0。
将 privateKeyAlgorithm 字段设置为具有以下
属性的 PrivateKeyAlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC5480]
中定义的 OID
id-ecPublicKey。
将 parameters 字段设置为
[RFC5480]
中定义的 ECParameters ASN.1 类型实例,
如下所示:
[[algorithm]]
内部槽的 namedCurve
属性为 "P-256"、
"P-384" 或 "P-521":
令 keyData 为
对 [RFC5915]
第 3 节中定义的 ECPrivateKey
结构的一个实例进行 DER 编码所得的结果,该实例用于
由 key 的 [[handle]]
内部槽表示的椭圆
曲线私钥,并符合以下要求:
parameters 字段存在,并且等价于此
PrivateKeyInfo ASN.1 结构的
privateKeyAlgorithm 字段的
parameters 字段。
publicKey 字段存在,并表示
与由 key 的 [[handle]]
内部槽表示的椭圆曲线
私钥相关联的椭圆曲线公钥。
[[algorithm]]
内部槽的 namedCurve
属性为
"P-256":
将 parameters 设置为
namedCurve 选项,
其值等于 [RFC5480]
中定义的对象标识符
secp256r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-384":
将 parameters 设置为
namedCurve 选项,
其值等于 [RFC5480]
中定义的对象标识符
secp384r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-521":
将 parameters 设置为
namedCurve 选项,
其值等于 [RFC5480]
中定义的对象标识符
secp521r1
执行由其他
适用
规范定义的任何 密钥
导出步骤,传入
format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,
并获得 namedCurveOid 和
keyData。
将 parameters 设置为
namedCurve 选项,
其值等于对象标识符
namedCurveOid。
将 privateKey 字段设置为 keyData。
令 result 为对 data 进行 DER 编码所得的结果。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
"EC"。
[[algorithm]]
内部槽的
namedCurve
属性为 "P-256"、"P-384" 或
"P-521":
[[algorithm]]
内部槽的
namedCurve
属性为 "P-256":
crv
属性设置为
"P-256"
[[algorithm]]
内部槽的
namedCurve
属性为 "P-384":
crv
属性设置为
"P-384"
[[algorithm]]
内部槽的
namedCurve
属性为 "P-521":
crv
属性设置为
"P-521"
执行由其他
适用
规范定义的任何 密钥
导出步骤,传入 format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,
并获得 namedCurve 和 jwk 的新值。
将 jwk 的
crv
属性设置为
namedCurve。
将 jwk 的 key_ops 属性设置为 key 的
usages 属性。
将 jwk 的 ext 属性设置为 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
raw":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
[[algorithm]]
内部槽的
namedCurve
属性为 "P-256"、"P-384"
或 "P-521":
令 data 为一个字节
序列,其按照
[SEC1]
第 2.3.3 节使用未压缩格式,表示由 key 的
[[handle]]
内部槽表示的椭圆曲线
点 Q。
执行由其他适用
规范定义的任何 密钥导出
步骤,传入 format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,
并获得 namedCurve 和 data。
令 result 为 data。
返回 result。
本节是非规范性的。
本节描述了使用 Elliptic Curve Diffie-Hellman (ECDH) 进行密钥生成和密钥 协商,如 [RFC6090] 所指定。
其他 规范 可以指定将其他椭圆曲线与 ECDH 一起使用。 要指定额外的椭圆曲线,规范必须定义 曲线名称、 ECDH 生成步骤、 ECDH 派生步骤、 ECDH 密钥导入步骤和 ECDH 密钥导出步骤。
此算法的已识别算法名称为
"ECDH"。
| 操作 | 参数 | 结果 |
|---|---|---|
| generateKey | EcKeyGenParams
|
CryptoKeyPair
|
| deriveBits | EcdhKeyDeriveParams |
字节 序列 |
| importKey | EcKeyImportParams |
CryptoKey |
| exportKey | 无 | object |
WebIDLdictionary EcdhKeyDeriveParams : Algorithm {
required CryptoKey public;
};
public 成员表示对等方的 EC 公钥。
如果 usages 包含不是
"deriveKey" 或 "deriveBits" 的条目,
则抛出一个
SyntaxError。
namedCurve 成员为
"P-256"、"P-384"
或 "P-521":
按 [RFC6090]
中的定义生成一个椭圆曲线密钥对,其域参数用于
normalizedAlgorithm 的
namedCurve 成员
所标识的曲线。
namedCurve 成员
是适用规范中指定的值,且
该规范指定了将此值与 ECDH 一起使用:
执行该规范中指定的 ECDH 生成步骤, 传入 normalizedAlgorithm,并得到一个椭圆曲线密钥对。
如果执行该操作导致错误,
则抛出一个
OperationError。
令 algorithm 为一个新的
EcKeyAlgorithm
对象。
将 algorithm 的
name 成员设置为
"ECDH"。
将 algorithm 的
namedCurve
属性设置为等于
normalizedAlgorithm 的
namedCurve 成员。
令 publicKey 为一个新的 CryptoKey,
表示所生成密钥对的公钥。
将 publicKey 的
[[type]]
内部槽设置为
"public"
将 publicKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 publicKey 的 [[extractable]] 内部
槽设置为 true。
将 publicKey 的 [[usages]] 内部槽
设置为空列表。
令 privateKey 为一个新的 CryptoKey,
表示所生成密钥对的私钥。
将 privateKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 privateKey 的 [[extractable]] 内部
槽设置为 extractable。
将 privateKey 的 [[usages]] 内部槽
设置为 usages 与 [ "deriveKey", "deriveBits" ] 的
用法交集。
令 result 为一个新的 CryptoKeyPair
字典。
将 result 的 publicKey 属性
设置为 publicKey。
将 result 的 privateKey 属性
设置为 privateKey。
返回 result。
如果 key 的
[[type]]
内部槽不是
"private",则
抛出一个 InvalidAccessError。
令 publicKey 为
normalizedAlgorithm 的
public 成员。
如果 publicKey 的
[[type]]
内部槽不是 "public",则抛出一个 InvalidAccessError。
如果 publicKey 的
[[algorithm]] 内部
槽的 name 属性不等于
key 的 [[algorithm]] 内部
槽的 name 属性,则抛出一个 InvalidAccessError。
如果 publicKey 的
[[algorithm]] 内部
槽的 namedCurve 属性不等于
key 的
[[algorithm]] 内部
槽的 namedCurve 属性,则
抛出一个 InvalidAccessError。
[[algorithm]] 内部
槽的 namedCurve 属性
为 "P-256"、"P-384"
或 "P-521":
执行 [RFC6090]
第 4 节中指定的 ECDH 原语,其中 key 作为 EC 私钥
d,并以由 publicKey 的
[[handle]]
内部槽表示的 EC 公钥作为 EC 公钥。
令 secret 为一个字节序列, 其中包含将 [RFC6090] 第 6.2 节中定义的从域元素到 八位字节字符串的转换应用于 ECDH 原语输出所得的结果。
[[algorithm]] 内部
槽的 namedCurve 属性
是适用规范中指定的值,且
该规范指定了将此值与 ECDH 一起使用:
执行该规范中指定的 ECDH 派生步骤, 传入 key 和 publicKey,并得到 secret。
如果执行该操作导致错误,
则抛出一个
OperationError。
OperationError。
令 keyData 为要导入的密钥数据。
spki":
如果 usages 不是空的,
则抛出一个
SyntaxError。
令 spki 为对 keyData 运行 解析 subjectPublicKeyInfo 算法所得的结果
如果 spki 的 algorithm
AlgorithmIdentifier 字段的 algorithm 对象标识符字段
不等于 [RFC5480]
中定义的 id-ecPublicKey
对象标识符,则抛出一个
DataError。
如果 spki 的 algorithm
AlgorithmIdentifier 字段的 parameters 字段缺失,
则抛出一个
DataError。
令 params 为 spki 的
algorithm AlgorithmIdentifier 字段的
parameters 字段。
如果 params 不是
[RFC5480]
中定义的、指定了
namedCurve 的
ECParameters ASN.1 类型实例,则抛出一个 DataError。
令 namedCurve 为一个初始值为 undefined 的字符串。
如果 namedCurve 已定义,且不等于
normalizedAlgorithm 的
namedCurve
成员,则抛出一个 DataError。
如果密钥值不是
normalizedAlgorithm 的
namedCurve
成员所标识的椭圆曲线上的有效点,则抛出一个 DataError。
将 key 的
[[type]]
内部槽
设置为 "public"
令 algorithm 为一个新的 EcKeyAlgorithm。
将 algorithm 的
name 属性设置为
"ECDH"。
将 algorithm 的
namedCurve
属性设置为 namedCurve。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
pkcs8":
如果 usages 包含不是
"deriveKey" 或 "deriveBits" 的条目,
则抛出一个
SyntaxError。
令 privateKeyInfo 为对 keyData 运行 解析 privateKeyInfo 算法所得的结果。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithm 字段的
algorithm 对象标识符字段不等于
[RFC5480]
中定义的 id-ecPublicKey 对象标识符,
则抛出一个
DataError。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 字段
的 parameters 字段不存在,
则抛出一个
DataError。
令 params 为 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 字段
的 parameters 字段。
如果 params 不是
[RFC5480]
中定义的、指定了
namedCurve 的
ECParameters ASN.1 类型实例,则抛出一个 DataError。
令 namedCurve 为一个初始值为 undefined 的字符串。
令 ecPrivateKey 为执行
解析
ASN.1 结构
算法所得的结果,其中 data 为
privateKeyInfo 的
privateKey 字段,structure 为
[RFC5915]
第 3 节中指定的 ASN.1
ECPrivateKey 结构,
并将 exactData 设置为 true。
如果
ecPrivateKey 的 parameters 字段
存在,并且不是
[RFC5480]
中定义的 namedCurve ASN.1
类型实例,或者不包含
与 privateKeyInfo 的
privateKeyAlgorithm
PrivateKeyAlgorithmIdentifier 字段的
parameters 字段相同的对象标识符,
则抛出
一个
DataError。
令 key 为一个新的 CryptoKey,
它表示通过使用 ecPrivateKey 执行
[RFC5915]
第 3 节中定义的转换步骤所标识的椭圆曲线私钥。
如果 namedCurve 已定义,且不等于
normalizedAlgorithm 的
namedCurve
成员,则抛出一个 DataError。
如果密钥值不是
normalizedAlgorithm 的
namedCurve
成员所标识的椭圆曲线上的有效点,则抛出一个 DataError。
令 algorithm 为一个新的 EcKeyAlgorithm。
将 algorithm 的
name 属性设置为
"ECDH"。
将 algorithm 的
namedCurve
属性设置为 namedCurve。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 d 字段存在,且
usages
包含不是
"deriveKey" 或 "deriveBits" 的条目,
则抛出一个
SyntaxError。
如果 d 字段不存在,且
usages 不是
空的,
则抛出一个
SyntaxError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web
Key [JWK] 的要求无效,或者不包含
所有指定的 usages
值,则抛出一个 DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
令 namedCurve 为一个字符串,其值等于
jwk 的
crv 字段。
如果 namedCurve 不等于
normalizedAlgorithm 的
namedCurve
成员,则抛出一个 DataError。
P-256"、
"P-384" 或 "P-521":
d 字段
存在:
如果密钥值不是
normalizedAlgorithm 的
namedCurve
成员所标识的椭圆曲线上的有效点,则抛出一个 DataError。
令 algorithm 为一个新的 EcKeyAlgorithm
对象实例。
将 algorithm 的
name 属性设置为
"ECDH"。
将 algorithm 的
namedCurve
属性设置为 namedCurve。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
raw":
如果 normalizedAlgorithm 的
namedCurve
成员不是命名曲线,
则抛出一个
DataError。
如果 usages 不是空列表,
则抛出一个
SyntaxError。
P-256"、
"P-384" 或 "P-521":
令 algorithm 为一个新的 EcKeyAlgorithm
对象。
将 algorithm 的
name 属性设置为
"ECDH"。
将 algorithm 的
namedCurve
属性设置为等于
normalizedAlgorithm 的 namedCurve
成员。
将 key 的
[[type]]
内部槽
设置为 "public"
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
返回 key
令 key 为要导出的 CryptoKey。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
spki":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为 [RFC5280]
中定义的 SubjectPublicKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 algorithm 字段设置为具有以下
属性的 AlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC5480]
中定义的 OID
id-ecPublicKey。
将 parameters 字段设置为
[RFC5480]
中定义的 ECParameters ASN.1 类型实例,
如下所示:
[[algorithm]]
内部槽的 namedCurve
属性为 "P-256"、
"P-384" 或 "P-521":
令 keyData 为一个字节
序列,其按照
[SEC1]
第 2.3.3 节中指定的编码规则并使用
未压缩形式,表示由 key 的 [[handle]]
内部槽表示的椭圆曲线公钥。
[[algorithm]]
内部槽的 namedCurve
属性为
"P-256":
将 parameters 设置为
namedCurve 选择,
其值等于 [RFC5480]
中定义的对象标识符
secp256r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-384":
将 parameters 设置为
namedCurve 选择,
其值等于 [RFC5480]
中定义的对象标识符
secp384r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-521":
将 parameters 设置为
namedCurve 选择,
其值等于 [RFC5480]
中定义的对象标识符
secp521r1
执行由其他
适用
规范定义的任何 密钥
导出步骤,传入
format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,并获得 namedCurveOid 和
keyData。
将 parameters 设置为
namedCurve 选择,
其值等于对象标识符
namedCurveOid。
将 subjectPublicKey 字段设置为 keyData
pkcs8":
如果 key 的
[[type]]
内部槽
不是 "private",则抛出一个 InvalidAccessError。
令 data 为 [RFC5208]
中定义的 PrivateKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 version 字段设置为 0。
将 privateKeyAlgorithm 字段设置为具有以下
属性的 PrivateKeyAlgorithmIdentifier ASN.1 类型:
将 algorithm 字段设置为
[RFC5480]
中定义的 OID
id-ecPublicKey。
将 parameters 字段设置为
[RFC5480]
中定义的 ECParameters ASN.1 类型实例,
如下所示:
[[algorithm]]
内部槽的 namedCurve
属性为 "P-256"、
"P-384" 或 "P-521":
令 keyData 为对 [RFC5915]
第 3 节中定义的 ECPrivateKey
结构的一个实例进行 DER 编码所得的结果,该实例用于由
key 的 [[handle]]
内部槽表示的椭圆
曲线私钥,并符合以下要求:
parameters 字段存在,并且等价于此
PrivateKeyInfo ASN.1 结构的
privateKeyAlgorithm 字段的
parameters 字段。
publicKey 字段存在,并表示
与由 key 的 [[handle]]
内部槽表示的椭圆曲线
私钥相关联的椭圆曲线公钥。
[[algorithm]]
内部槽的 namedCurve
属性为
"P-256":
将 parameters 设置为
namedCurve 选择,
其值等于 [RFC5480]
中定义的对象标识符
secp256r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-384":
将 parameters 设置为
namedCurve 选择,
其值等于 [RFC5480]
中定义的对象标识符
secp384r1
[[algorithm]]
内部槽的 namedCurve
属性为
"P-521":
将 parameters 设置为
namedCurve 选择,
其值等于 [RFC5480]
中定义的对象标识符
secp521r1
执行由其他
适用
规范定义的任何 密钥
导出步骤,传入
format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,并获得 namedCurveOid 和
keyData。
将 parameters 设置为
namedCurve 选择,
其值等于对象标识符
namedCurveOid。
将 privateKey 字段设置为 keyData。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
"EC"。
[[algorithm]]
内部槽的 namedCurve
属性为 "P-256"、"P-384"
或 "P-521":
[[algorithm]]
内部槽的
namedCurve
属性为 "P-256":
crv
属性设置为
"P-256"
[[algorithm]]
内部槽的
namedCurve
属性为 "P-384":
crv
属性设置为
"P-384"
[[algorithm]]
内部槽的
namedCurve
属性为 "P-521":
crv
属性设置为
"P-521"
执行由其他
适用
规范定义的任何 密钥导出
步骤,传入 format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,
并获得 namedCurve 和 jwk 的新值。
将 jwk 的
crv
属性设置为
namedCurve。
将 jwk 的 key_ops 属性设置为 key 的
usages 属性。
将 jwk 的 ext 属性设置为 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
raw":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
[[algorithm]]
内部槽的 namedCurve
属性为 "P-256"、"P-384"
或 "P-521":
令 data 为一个字节
序列,其按照 [SEC1]
第 2.3.3 节中指定的编码规则并使用
未压缩形式,表示由 key 的
[[handle]]
内部槽表示的椭圆曲线公钥。
执行由其他适用
规范定义的任何 密钥导出
步骤,传入 format 和 key 的
[[algorithm]]
内部槽的
namedCurve
属性,
并获得 namedCurve 和 data。
令 result 为 data。
返回 result。
本节是非规范性的。
"Ed25519" 算法标识符用于使用
[RFC8032]
中指定的 Ed25519 算法执行签名
和验证。
此算法的已识别算法名称为
"Ed25519"。
| 操作 | 参数 | 结果 |
|---|---|---|
| sign | 无 | 字节 序列 |
| verify | 无 | boolean |
| generateKey | 无 | CryptoKeyPair
|
| importKey | 无 | CryptoKey |
| exportKey | 无 | object |
如果 key 的
[[type]]
内部槽不是 "private",则
抛出一个 InvalidAccessError。
令 result 为执行 [RFC8032] 第 5.1.6 节中指定的 Ed25519 签名过程所得的结果,其中 message 作为 M, 并使用与 key 关联的 Ed25519 私钥。
某些实现可能(希望)按照 draft-irtf-cfrg-det-sigs-with-noise 生成随机化签名,而不是按照 [RFC8032] 生成确定性签名。
返回 result。
如果 key 的
[[type]]
内部槽不是 "public",则抛出一个 InvalidAccessError。
如果 key 的密钥数据表示 Ed25519 椭圆曲线上的无效点或
小阶元素,则返回 false。
并非所有实现都会执行此检查。
如果编码在 signature 前半部分中的点 R
表示 Ed25519 椭圆曲线上的无效点或
小阶元素,则返回 false。
并非所有实现都会执行此检查。
执行 [RFC8032]
第 5.1.7 节中指定的 Ed25519 验证步骤,使用无余因子(非批处理)方程
[S]B = R + [k]A',对 signature 进行验证,其中 message
作为 M,
并使用与 key 关联的 Ed25519 公钥。
令 result 为一个 boolean;如果签名
有效,则其值为 true,
否则其值为 false。
返回 result。
如果 usages 包含不是
"sign" 或 "verify" 之一的值,
则抛出一个
SyntaxError。
按 [RFC8032] 第 5.1.5 节中的定义生成一个 Ed25519 密钥对。
令 algorithm 为一个新的 KeyAlgorithm 对象。
将 algorithm 的
name 属性设置为
"Ed25519"。
令 publicKey 为一个新的 CryptoKey,
表示所生成密钥对的公钥。
将 publicKey 的
[[type]]
内部槽设置为
"public"
将 publicKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 publicKey 的 [[extractable]] 内部
槽设置为 true。
将 publicKey 的 [[usages]] 内部槽
设置为 usages 与 [ "verify" ] 的用法交集。
令 privateKey 为一个新的 CryptoKey,
表示所生成密钥对的私钥。
将 privateKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 privateKey 的 [[extractable]] 内部
槽设置为 extractable。
将 privateKey 的 [[usages]] 内部槽
设置为 usages 与 [ "sign" ] 的用法交集。
令 result 为一个新的 CryptoKeyPair
字典。
将 result 的 publicKey 属性
设置为 publicKey。
将 result 的 privateKey 属性
设置为 privateKey。
返回 result。
令 keyData 为要导入的密钥数据。
spki":
如果 usages 包含不是
"verify" 的值,
则抛出一个
SyntaxError。
令 spki 为对 keyData 运行 解析 subjectPublicKeyInfo 算法所得的结果。
如果 spki 的 algorithm
AlgorithmIdentifier 字段的 algorithm 对象标识符字段
不等于 [RFC8410]
中定义的 id-Ed25519
对象标识符,则抛出一个
DataError。
如果 spki 的 algorithm
AlgorithmIdentifier 字段的 parameters 字段存在,
则抛出一个
DataError。
令 publicKey 为由 spki 的
subjectPublicKey 字段标识的 Ed25519 公钥。
令 key 为一个新的 CryptoKey,
它表示 publicKey。
将 key 的
[[type]]
内部槽
设置为 "public"
令 algorithm 为一个新的 KeyAlgorithm。
将 algorithm 的
name 属性设置为
"Ed25519"。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
pkcs8":
如果 usages 包含不是
"sign" 的值,
则抛出一个
SyntaxError。
令 privateKeyInfo 为对 keyData 运行 解析 privateKeyInfo 算法所得的结果。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithm 字段的
algorithm 对象标识符字段不等于
[RFC8410]
中定义的 id-Ed25519 对象标识符,
则抛出一个
DataError。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 字段
的 parameters 字段存在,
则抛出一个
DataError。
令 curvePrivateKey 为执行
解析
ASN.1
结构
算法所得的结果,其中 data 为
privateKeyInfo 的 privateKey 字段,
structure 为 [RFC8410]
第 7 节中指定的 ASN.1
CurvePrivateKey 结构,
并将 exactData 设置为 true。
令 key 为一个新的 CryptoKey,
它表示由 curvePrivateKey 标识的 Ed25519 私钥。
令 algorithm 为一个新的 KeyAlgorithm。
将 algorithm 的
name 属性设置为
"Ed25519"。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 d 字段存在且
usages 包含
不是 "sign" 的值,或者,
如果 d 字段不存在
且 usages 包含
不是 "verify" 的值,
则抛出一个
SyntaxError。
如果 jwk 的
alg 字段存在,且
不是 "Ed25519" 或 "EdDSA",
则抛出一个
DataError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web
Key [JWK] 的要求无效,或者不包含
所有指定的 usages
值,
则抛出一个
DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
d 字段
存在:
令 algorithm 为一个新的 KeyAlgorithm
对象实例。
将 algorithm 的
name 属性设置为
"Ed25519"。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
raw":
如果 usages 包含不是
"verify" 的值,
则抛出一个
SyntaxError。
令 algorithm 为一个新的 KeyAlgorithm 对象。
将 algorithm 的
name 属性设置为
"Ed25519"。
令 key 为一个新的 CryptoKey,
表示 keyData 中提供的密钥数据。
将 key 的
[[type]]
内部槽
设置为 "public"
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
返回 key
令 key 为要导出的 CryptoKey。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
spki":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为 [RFC5280]
中定义的 SubjectPublicKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 algorithm 字段设置为具有以下
属性的 AlgorithmIdentifier ASN.1 类型:
将 algorithm 对象标识符设置为
[RFC8410]
中定义的
id-Ed25519 OID。
将 subjectPublicKey 字段设置为 keyData。
令 result 为对 data 进行 DER 编码所得的结果。
pkcs8":
如果 key 的
[[type]]
内部槽
不是 "private",则抛出一个 InvalidAccessError。
令 data 为 [RFC5208]
中定义的 PrivateKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 version 字段设置为 0。
将 privateKeyAlgorithm 字段设置为具有以下
属性的 PrivateKeyAlgorithmIdentifier ASN.1 类型:
将 algorithm 对象标识符设置为
[RFC8410]
中定义的
id-Ed25519 OID。
将 privateKey 字段设置为对
[RFC8410]
第 7 节中定义的 CurvePrivateKey ASN.1 类型进行 DER 编码所得的结果,
该类型表示由 key 的 [[handle]]
内部槽表示的 Ed25519 私钥
令 result 为对 data 进行 DER 编码所得的结果。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
"OKP"。
将 jwk 的 alg 属性设置为
"Ed25519"。
将 jwk 的 crv 属性设置为
"Ed25519"。
将 jwk 的 key_ops 属性设置为 key 的
usages 属性。
将 jwk 的 ext 属性设置为 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
raw":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为表示 Ed25519
公钥的字节序列,
该公钥由 key 的 [[handle]]
内部槽表示。
令 result 为 data。
返回 result。
本节是非规范性的。
"X25519" 算法标识符用于使用
[RFC7748]
中指定的 X25519 算法执行密钥协商。
此算法的已识别算法名称为
"X25519"。
| 操作 | 参数 | 结果 |
|---|---|---|
| deriveBits | EcdhKeyDeriveParams |
字节 序列 |
| generateKey | 无 | CryptoKeyPair
|
| importKey | 无 | CryptoKey |
| exportKey | 无 | object |
如果 key 的
[[type]]
内部槽不是 "private",则
抛出一个 InvalidAccessError。
令 publicKey 为
normalizedAlgorithm 的
public 成员。
如果 publicKey 的
[[type]]
内部槽不是 "public",则抛出一个 InvalidAccessError。
如果 publicKey 的
[[algorithm]] 内部
槽的 name 属性不等于
key 的 [[algorithm]] 内部
槽的 name 属性,则抛出一个 InvalidAccessError。
令 secret 为执行 [RFC7748] 第 5 节中指定的
X25519 函数所得的结果,其中 key 作为 X25519 私钥 k,
且由 publicKey 的 [[handle]]
内部槽表示的 X25519 公钥作为 X25519 公钥 u。
如果 secret 为全零值,
则抛出一个 OperationError。
按 [RFC7748] 第 6.1 节,此检查必须以常数时间执行。
OperationError。
如果 usages 包含不是
"deriveKey" 或 "deriveBits" 的条目,
则抛出一个
SyntaxError。
按 [RFC7748] 第 6.1 节中的定义生成一个
X25519 密钥对,其中私钥为 32 个随机字节,
公钥为 X25519(a, 9)。
令 algorithm 为一个新的 KeyAlgorithm 对象。
将 algorithm 的
name 属性设置为
"X25519"。
令 publicKey 为一个新的 CryptoKey,
表示所生成密钥对的公钥。
将 publicKey 的
[[type]]
内部槽设置为
"public"
将 publicKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 publicKey 的 [[extractable]] 内部
槽设置为 true。
将 publicKey 的 [[usages]] 内部槽
设置为空列表。
令 privateKey 为一个新的 CryptoKey,
表示所生成密钥对的私钥。
将 privateKey 的 [[algorithm]] 内部
槽设置为 algorithm。
将 privateKey 的 [[extractable]] 内部
槽设置为 extractable。
将 privateKey 的 [[usages]] 内部槽
设置为 usages 与
[ "deriveKey", "deriveBits" ] 的
用法交集。
令 result 为一个新的 CryptoKeyPair
字典。
将 result 的 publicKey 属性
设置为 publicKey。
将 result 的 privateKey 属性
设置为 privateKey。
返回 result。
令 keyData 为要导入的密钥数据。
spki":
如果 usages 不是空的,
则抛出一个
SyntaxError。
令 spki 为对 keyData 运行 解析 subjectPublicKeyInfo 算法所得的结果。
如果 spki 的 algorithm
AlgorithmIdentifier 字段的 algorithm 对象标识符字段
不等于 [RFC8410]
中定义的 id-X25519
对象标识符,则抛出一个
DataError。
如果 spki 的 algorithm
AlgorithmIdentifier 字段的 parameters 字段存在,
则抛出一个
DataError。
令 publicKey 为由 spki 的
subjectPublicKey 字段标识的 X25519 公钥。
令 key 为一个新的 CryptoKey,
它表示 publicKey。
将 key 的
[[type]]
内部槽
设置为 "public"
令 algorithm 为一个新的 KeyAlgorithm。
将 algorithm 的
name 属性设置为
"X25519"。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
pkcs8":
如果 usages 包含不是
"deriveKey" 或 "deriveBits" 的条目,
则抛出一个
SyntaxError。
令 privateKeyInfo 为对 keyData 运行 解析 privateKeyInfo 算法所得的结果。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithm 字段的
algorithm 对象标识符字段不等于
[RFC8410]
中定义的 id-X25519 对象标识符,
则抛出一个
DataError。
如果 privateKeyInfo 的
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 字段
的 parameters 字段存在,
则抛出一个
DataError。
令 curvePrivateKey 为执行
解析
ASN.1
结构
算法所得的结果,其中 data 为
privateKeyInfo 的 privateKey 字段,
structure 为 [RFC8410]
第 7 节中指定的 ASN.1
CurvePrivateKey 结构,
并将 exactData 设置为 true。
令 key 为一个新的 CryptoKey,
它表示由 curvePrivateKey 标识的 X25519 私钥。
令 algorithm 为一个新的 KeyAlgorithm。
将 algorithm 的
name 属性设置为
"X25519"。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 d 字段存在,且
usages
包含不是
"deriveKey" 或 "deriveBits" 的条目,
则抛出一个
SyntaxError。
如果 d 字段不存在,且
usages 不是
空的,
则抛出一个
SyntaxError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web
Key [JWK] 的要求无效,或者不包含
所有指定的 usages
值,
则抛出一个
DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
d 字段
存在:
令 algorithm 为一个新的 KeyAlgorithm
对象实例。
将 algorithm 的
name 属性设置为
"X25519"。
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
raw":
如果 usages 不是空的,
则抛出一个
SyntaxError。
令 algorithm 为一个新的 KeyAlgorithm 对象。
将 algorithm 的
name 属性设置为
"X25519"。
令 key 为一个新的 CryptoKey,
表示 keyData 中提供的密钥数据。
将 key 的
[[type]]
内部槽
设置为 "public"
将 key 的 [[algorithm]]
内部槽设置为 algorithm。
返回 key
令 key 为要导出的 CryptoKey。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
spki":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为 [RFC5280]
中定义的 SubjectPublicKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 algorithm 字段设置为具有以下
属性的 AlgorithmIdentifier ASN.1 类型:
将 algorithm 对象标识符设置为
[RFC8410]
中定义的
id-X25519 OID。
将 subjectPublicKey 字段设置为 keyData。
令 result 为对 data 进行 DER 编码所得的结果。
pkcs8":
如果 key 的
[[type]]
内部槽
不是 "private",则抛出一个 InvalidAccessError。
令 data 为 [RFC5208]
中定义的 PrivateKeyInfo
ASN.1 结构的一个实例,并具有以下属性:
将 version 字段设置为 0。
将 privateKeyAlgorithm 字段设置为具有以下
属性的 PrivateKeyAlgorithmIdentifier ASN.1 类型:
将 algorithm 对象标识符设置为
[RFC8410]
中定义的
id-X25519 OID。
将 privateKey 字段设置为对
[RFC8410]
第 7 节中定义的 CurvePrivateKey ASN.1 类型进行 DER 编码所得的结果,
该类型表示由 key 的 [[handle]]
内部槽表示的 X25519 私钥
令 result 为对 data 进行 DER 编码所得的结果。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
"OKP"。
将 jwk 的 crv 属性设置为
"X25519"。
将 jwk 的 key_ops 属性设置为 key 的
usages 属性。
将 jwk 的 ext 属性设置为 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
raw":
如果 key 的
[[type]]
内部槽
不是 "public",则抛出一个 InvalidAccessError。
令 data 为表示 X25519
公钥的字节序列,
该公钥由 key 的 [[handle]]
内部槽表示。
令 result 为 data。
返回 result。
本节是非规范性的。
"AES-CTR" 算法标识符用于使用计数器模式下的 AES
执行加密和解密,如
[NIST-SP800-38A]
中所述。
此算法的已识别算法名称为
"AES-CTR"。
| 操作 | 参数 | 结果 |
|---|---|---|
| encrypt | AesCtrParams |
字节 序列 |
| decrypt | AesCtrParams |
字节 序列 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 无 | CryptoKey |
| exportKey | 无 | object |
| get key length | AesDerivedKeyParams |
Integer |
WebIDLdictionary AesCtrParams : Algorithm {
required BufferSource counter;
required [EnforceRange] octet length;
};
counter 成员包含计数器块的初始值。
counter MUST 为 16
字节(AES 块大小)。计数器位是计数器块最右侧的 length
位。计数器块的其余部分用于
nonce。计数器位使用 NIST SP 800-38A 附录 B.1 中指定的标准
递增函数来递增:
计数器位被解释为一个大端整数,并
加一。
length 成员包含计数器块中
被递增的最右侧部分的长度(以位为单位)。
WebIDLdictionary AesKeyAlgorithm : KeyAlgorithm {
required unsigned short length;
};
length 成员表示密钥的长度(以位为单位)。
WebIDLdictionary AesKeyGenParams : Algorithm {
required [EnforceRange] unsigned short length;
};
length 成员表示密钥的长度(以位为单位)。
WebIDLdictionary AesDerivedKeyParams : Algorithm {
required [EnforceRange] unsigned short length;
};
length 成员表示密钥的长度(以位为单位)。
如果 normalizedAlgorithm 的
counter 成员的
长度不是
16 字节,
则抛出一个
OperationError。
如果 normalizedAlgorithm 的
length 成员为零或大于
128,
则抛出一个
OperationError。
令 ciphertext 为执行 [NIST-SP800-38A]
第 6.5 节中描述的 CTR Encryption
操作所得的结果,其中使用 AES 作为分组密码,
使用 normalizedAlgorithm 的 counter
成员作为计数器块的初始值,使用
normalizedAlgorithm 的
length 成员作为
[NIST-SP800-38A]
附录 B.1 中定义的标准计数器块递增函数的输入参数 m,
并使用
plaintext 作为输入明文。
返回 ciphertext。
如果 normalizedAlgorithm 的
counter 成员的
长度不是
16 字节,
则抛出一个
OperationError。
如果 normalizedAlgorithm 的
length 成员为零或大于
128,
则抛出一个
OperationError。
令 plaintext 为执行 [NIST-SP800-38A]
第 6.5 节中描述的 CTR Decryption
操作所得的结果,其中使用 AES 作为分组密码,
使用 normalizedAlgorithm 的 counter
成员作为计数器块的初始值,使用
normalizedAlgorithm 的
length 成员作为
[NIST-SP800-38A]
附录 B.1 中定义的标准计数器块递增函数的输入参数 m,
并使用
ciphertext 作为输入密文。
返回 plaintext。
如果 usages 包含不是
"encrypt"、"decrypt"、
"wrapKey" 或 "unwrapKey" 之一的任何条目,
则抛出一个
SyntaxError。
如果 normalizedAlgorithm 的
length 成员不等于
128、192 或 256 之一,
则抛出一个
OperationError。
生成一个长度等于
normalizedAlgorithm 的 length
成员的
AES 密钥。
如果密钥生成步骤失败,
则抛出一个
OperationError。
令 key 为一个新的
CryptoKey 对象,表示所生成的
AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-CTR"。
将 algorithm 的
length 属性设置为等于
normalizedAlgorithm 的
length 成员。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
将 key 的 [[extractable]] 内部
槽设置为 extractable。
将 key 的 [[usages]] 内部槽
设置为 usages。
返回 key。
如果 usages 包含不是
"encrypt"、"decrypt"、
"wrapKey" 或 "unwrapKey" 之一的条目,
则抛出一个
SyntaxError。
raw":jwk":NotSupportedError。
令 key 为一个新的 CryptoKey 对象,表示值为
data 的 AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-CTR"。
将 algorithm 的
length 属性设置为
data 的长度(以位为单位)。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
返回 key。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
raw":
令 data 为一个字节序列,其中包含
由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节。
令 result 为 data。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
字符串 "oct"。
将 jwk 的
k 属性设置为一个字符串,
其中包含由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节,并按照 JSON Web Algorithms
[JWA]
第 6.4 节进行编码。
将 jwk 的 key_ops 属性设置为等于
key 的
[[usages]]
内部槽。
将 jwk 的 ext 属性设置为等于 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
如果 normalizedDerivedKeyAlgorithm 的
length 成员不是
128、192 或 256,
则抛出一个
OperationError。
返回 normalizedDerivedKeyAlgorithm 的
length 成员。
本节是非规范性的。
"AES-CBC" 算法标识符用于使用 Cipher Block Chaining 模式下的 AES
执行加密和解密,如
[NIST-SP800-38A]
中所述。
当以 CBC 模式运行时,不是 AES 块大小(16 字节)精确倍数的消息, 可以在多种填充方案下进行填充。在 Web Crypto API 中,唯一受支持的 填充模式是 PKCS#7,如 [RFC2315] 第 10.3 节第 2 步所述。
此算法的已识别算法名称为
"AES-CBC"。
| 操作 | 参数 | 结果 |
|---|---|---|
| encrypt | AesCbcParams |
字节 序列 |
| decrypt | AesCbcParams |
字节 序列 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 无 | CryptoKey |
| exportKey | 无 | object |
| get key length | AesDerivedKeyParams |
Integer |
WebIDLdictionary AesCbcParams : Algorithm {
required BufferSource iv;
};
iv 成员表示初始化向量。它MUST为 16 字节。
如果 normalizedAlgorithm 的
iv 成员的
长度不是
16 字节,
则抛出一个
OperationError。
令 paddedPlaintext 为按照 [RFC2315] 第 10.3 节第 2 步中定义的过程,使用 k 的值为 16,向 plaintext 添加填充八位字节所得的结果。
令 ciphertext 为执行 [NIST-SP800-38A]
第 6.2 节中描述的 CBC Encryption
操作所得的结果,其中使用 AES 作为分组密码,
使用 normalizedAlgorithm 的 iv 成员作为
IV 输入参数,并使用 paddedPlaintext
作为输入明文。
返回 ciphertext。
如果 normalizedAlgorithm 的
iv 成员的
长度不是
16 字节,
则抛出一个
OperationError。
如果 ciphertext 的长度为零,或不是 16 字节的倍数,
则抛出一个 OperationError。
令 paddedPlaintext 为执行 [NIST-SP800-38A]
第 6.2 节中描述的 CBC Decryption
操作所得的结果,其中使用 AES 作为分组密码,
使用 normalizedAlgorithm 的 iv 成员作为
IV 输入参数,并使用
ciphertext 作为输入密文。
令 p 为 paddedPlaintext 最后一个八位字节的值。
如果 p 为零或大于 16,或者 paddedPlaintext 的最后
p 个八位字节中的任何一个的值不是 p,
则抛出一个
OperationError。
令 plaintext 为从 paddedPlaintext 末尾移除 p 个八位字节所得的结果。
返回 plaintext。
如果 usages 包含不是
"encrypt"、"decrypt"、
"wrapKey" 或 "unwrapKey" 之一的任何条目,
则抛出一个
SyntaxError。
如果 normalizedAlgorithm 的
length 成员不等于
128、192 或 256 之一,
则抛出一个
OperationError。
生成一个长度等于
normalizedAlgorithm 的 length
成员的
AES 密钥。
如果密钥生成步骤失败,
则抛出一个
OperationError。
令 key 为一个新的
CryptoKey 对象,表示所生成的
AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-CBC"。
将 algorithm 的
length 属性设置为等于
normalizedAlgorithm 的
length 成员。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
将 key 的 [[extractable]] 内部
槽设置为 extractable。
将 key 的 [[usages]] 内部槽
设置为 usages。
返回 key。
如果 usages 包含不是
"encrypt"、"decrypt"、
"wrapKey" 或 "unwrapKey" 之一的条目,
则抛出一个
SyntaxError。
raw":jwk":NotSupportedError
令 key 为一个新的 CryptoKey
对象,表示值为 data 的 AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-CBC"。
将 algorithm 的
length 属性设置为
data 的长度(以位为单位)。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
返回 key。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
raw":
令 data 为一个字节序列,其中包含
由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节。
令 result 为 data。
jwk":令 jwk 为一个新的 JsonWebKey 字典。
将 jwk 的 kty 属性设置为
字符串 "oct"。
将 jwk 的
k 属性设置为一个字符串,
其中包含由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节,并按照 JSON Web Algorithms
[JWA]
第 6.4 节进行编码。
将 jwk 的 key_ops 属性设置为等于
key 的
usages 属性。
将 jwk 的 ext 属性设置为等于 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
如果 normalizedDerivedKeyAlgorithm 的
length 成员不是
128、192 或 256,
则抛出一个
OperationError。
返回 normalizedDerivedKeyAlgorithm 的
length 成员。
本节是非规范性的。
"AES-GCM" 算法标识符用于使用 Galois/Counter Mode 模式下的 AES
执行认证加密和解密,如
[NIST-SP800-38D]
中所述。
此算法的已识别算法名称为
"AES-GCM"。
| 操作 | 参数 | 结果 |
|---|---|---|
| encrypt | AesGcmParams |
字节 序列 |
| decrypt | AesGcmParams |
字节 序列 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 无 | CryptoKey |
| exportKey | 无 | object |
| get key length | AesDerivedKeyParams |
Integer |
WebIDLdictionary AesGcmParams : Algorithm {
required BufferSource iv;
BufferSource additionalData;
[EnforceRange] octet tagLength;
};
iv 成员表示要使用的初始化向量。最长可以为
2^64-1 字节。
additionalData 成员表示要包含的
额外认证数据。
tagLength 成员表示所需的
认证标签长度。可以为 0 - 128。
如果 plaintext 的长度
大于 2^39 - 256 字节,
则抛出一个
OperationError。
如果 normalizedAlgorithm 的
iv 成员的长度
大于 2^64 - 1 字节,
则抛出一个
OperationError。
如果 normalizedAlgorithm 的
additionalData 成员
存在且其长度
大于 2^64 - 1 字节,
则抛出一个
OperationError。
tagLength 成员不存在:
tagLength 成员是
32、64、96、104、112、120 或 128 之一:
tagLength 成员
OperationError。
令 additionalData 为 normalizedAlgorithm 的
additionalData 成员(如果存在),
否则为空字节序列。
令 C 和 T 为执行
[NIST-SP800-38D]
第 7.1 节中描述的 Authenticated Encryption Function 所得到的输出,
其中使用 AES 作为分组密码,使用 normalizedAlgorithm 的
iv 成员作为
IV 输入参数,
additionalData 作为 A 输入参数,
tagLength 作为 t 前提条件,并使用
plaintext 作为输入明文。
令 ciphertext 等于 C | T, 其中 “|” 表示连接。
返回 ciphertext。
tagLength 成员不存在:
tagLength 成员是
32、64、96、104、112、120 或 128 之一:
tagLength 成员
OperationError。
如果 ciphertext 的位长度
小于 tagLength,
则抛出一个
OperationError。
如果 normalizedAlgorithm 的
iv 成员的长度
大于 2^64 - 1 字节,
则抛出一个
OperationError。
如果 normalizedAlgorithm 的
additionalData 成员
存在且其长度
大于 2^64 - 1 字节,
则抛出一个
OperationError。
令 tag 为 ciphertext 的最后 tagLength 位。
令 actualCiphertext 为从 ciphertext 中移除最后 tagLength 位所得的结果。
令 additionalData 为 normalizedAlgorithm 的
additionalData 成员(如果存在),
否则为空字节序列。
执行 [NIST-SP800-38D]
第 7.2 节中描述的 Authenticated Decryption Function,
其中使用 AES 作为分组密码,
使用 normalizedAlgorithm 的
iv 成员作为
IV 输入参数,
additionalData 作为 A 输入参数,
tagLength 作为 t 前提条件,
actualCiphertext 作为输入密文,C,并以
tag 作为认证标签 T。
OperationError
返回 plaintext。
如果 usages 包含不是
"encrypt"、"decrypt"、
"wrapKey" 或 "unwrapKey" 之一的任何条目,
则抛出一个
SyntaxError。
如果 normalizedAlgorithm 的
length 成员不等于
128、192 或 256 之一,
则抛出一个
OperationError。
生成一个长度等于
normalizedAlgorithm 的 length
成员的
AES 密钥。
如果密钥生成步骤失败,
则抛出一个
OperationError。
令 key 为一个新的
CryptoKey 对象,表示所生成的
AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-GCM"。
将 algorithm 的
length 属性设置为等于
normalizedAlgorithm 的
length 成员。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
将 key 的 [[extractable]] 内部
槽设置为 extractable。
将 key 的 [[usages]] 内部槽
设置为 usages。
返回 key。
如果 usages 包含不是
"encrypt"、"decrypt"、
"wrapKey" 或 "unwrapKey" 之一的条目,
则抛出一个
SyntaxError。
raw":jwk":NotSupportedError。
令 key 为一个新的 CryptoKey
对象,表示值为 data 的 AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-GCM"。
将 algorithm 的
length 属性设置为
data 的长度(以位为单位)。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
返回 key。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
raw":
令 data 为一个字节序列,其中包含
由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节。
令 result 为 data。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
字符串 "oct"。
将 jwk 的
k 属性设置为一个字符串,
其中包含由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节,并按照 JSON Web Algorithms
[JWA]
第 6.4 节进行编码。
将 jwk 的 key_ops 属性设置为等于
key 的
usages 属性。
将 jwk 的 ext 属性设置为等于 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
如果 normalizedDerivedKeyAlgorithm 的
length 成员不是
128、192 或 256,则抛出一个 OperationError。
返回 normalizedDerivedKeyAlgorithm 的
length 成员。
本节是非规范性的。
"AES-KW" 算法标识符用于使用 AES
执行密钥包装,如
[RFC3394]
中所述。
此算法的已识别算法名称为
"AES-KW"。
| 操作 | 参数 | 结果 |
|---|---|---|
| wrapKey | 无 | 字节 序列 |
| unwrapKey | 无 | 字节 序列 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 无 | CryptoKey |
| exportKey | 无 | object |
| get key length | AesDerivedKeyParams |
Integer |
如果 plaintext 的长度不是 64 位的倍数,
则抛出一个
OperationError。
令 ciphertext 为执行 [RFC3394] 第 2.2.1 节中描述的密钥包装操作所得的结果,其中 plaintext 作为要被包装的明文,并使用同一文档 第 2.2.3.1 节中定义的默认初始值。
返回 ciphertext。
令 plaintext 为执行 [RFC3394] 第 2.2.2 节中描述的密钥解包操作所得的结果,其中 ciphertext 作为输入密文,并使用同一文档 第 2.2.3.1 节中定义的默认初始值。
如果密钥解包操作返回错误,
则抛出一个
OperationError。
返回 plaintext。
如果 usages 包含不是
"wrapKey" 或 "unwrapKey" 之一的任何条目,
则抛出一个 SyntaxError。
如果 normalizedAlgorithm 的
length 属性不等于
128、192 或 256 之一,则抛出一个 OperationError。
生成一个长度等于
normalizedAlgorithm 的 length
成员的
AES 密钥。
如果密钥生成步骤失败,
则抛出一个
OperationError。
令 key 为一个新的
CryptoKey 对象,表示所生成的
AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-KW"。
将 algorithm 的
length 属性设置为等于
normalizedAlgorithm 的
length 属性。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
将 key 的 [[extractable]] 内部
槽设置为 extractable。
将 key 的 [[usages]] 内部槽
设置为 usages。
返回 key。
如果 usages 包含不是
"wrapKey" 或 "unwrapKey" 之一的条目,
则抛出一个
SyntaxError。
raw":jwk":NotSupportedError。
令 key 为一个新的 CryptoKey,
它表示值为 data 的 AES 密钥。
令 algorithm 为一个新的
AesKeyAlgorithm。
将 algorithm 的
name 属性设置为
"AES-KW"。
将 algorithm 的
length 属性设置为
data 的长度(以位为单位)。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
返回 key。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
raw":
令 data 为一个字节序列,其中包含
由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节。
令 result 为 data。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
字符串 "oct"。
将 jwk 的
k 属性设置为一个字符串,
其中包含由 key 的 [[handle]]
内部槽表示的密钥的原始八位字节,并按照 JSON Web Algorithms
[JWA]
第 6.4 节进行编码。
将 jwk 的 key_ops 属性设置为等于
key 的
usages 属性。
将 jwk 的 ext 属性设置为等于 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
如果 normalizedDerivedKeyAlgorithm 的
length 成员不是
128、192 或 256,则抛出一个 OperationError。
返回 normalizedDerivedKeyAlgorithm 的
length 成员。
本节是非规范性的。
HMAC 算法根据 [FIPS-198-1]
使用本规范中定义的 SHA 哈希函数,计算和验证基于哈希的消息
认证码。
其他 规范 可以指定 HMAC 对其他哈希算法的使用。此类规范必须为额外的哈希算法 定义摘要操作,并为 HMAC 定义 密钥导入步骤和 密钥导出步骤。
此算法的已识别算法名称为
"HMAC"。
| 操作 | 参数 | 结果 |
|---|---|---|
| sign | 无 | 字节 序列 |
| verify | 无 | boolean |
| generateKey | HmacKeyGenParams |
CryptoKey |
| importKey | HmacImportParams |
CryptoKey |
| exportKey | 无 | object |
| get key length | HmacImportParams |
Integer |
WebIDLdictionary HmacImportParams : Algorithm {
required HashAlgorithmIdentifier hash;
[EnforceRange] unsigned long length;
};
hash 成员表示要使用的内部哈希
函数。
length 成员表示密钥的长度(以位为单位)。
WebIDLdictionary HmacKeyAlgorithm : KeyAlgorithm {
required KeyAlgorithm hash;
required unsigned long length;
};
hash 成员表示要使用的内部哈希函数。
length 成员表示密钥的长度(以位为单位)。
WebIDLdictionary HmacKeyGenParams : Algorithm {
required HashAlgorithmIdentifier hash;
[EnforceRange] unsigned long length;
};
hash 成员表示要使用的内部哈希
函数。
length 成员表示要生成的密钥
的长度(以位为单位)。如果未指定,则将使用推荐长度,即相关哈希函数的
块大小。
令 mac 为执行 [FIPS-198-1]
第 4 节中描述的 MAC Generation 操作所得的结果,
其中使用由 key 的 [[handle]]
内部槽表示的密钥、由 key 的
[[algorithm]] 内部
槽的 hash 属性所标识的哈希函数,
并以 message 作为输入数据 text。
返回 mac。
令 mac 为执行 [FIPS-198-1]
第 4 节中描述的 MAC Generation 操作所得的结果,
其中使用由 key 的 [[handle]]
内部槽表示的密钥、由 key 的
[[algorithm]] 内部
槽的 hash 属性所标识的哈希函数,
并以 message 作为输入数据 text。
如果 mac 等于 signature,则返回 true; 否则返回 false。
如果 usages 包含不是 "sign" 或
"verify" 的任何条目,则抛出一个 SyntaxError。
生成一个长度为 length 位的密钥。
如果密钥生成步骤失败,
则抛出一个
OperationError。
令 key 为一个新的
CryptoKey 对象,表示生成的密钥。
令 algorithm 为一个新的
HmacKeyAlgorithm。
将 algorithm 的
name 属性设置为
"HMAC"。
将 algorithm 的
length 属性设置为
length。
令 hash 为一个新的
KeyAlgorithm。
将 hash 的
name 属性设置为等于
normalizedAlgorithm 的
hash
成员的 name
成员。
将 algorithm 的 hash 属性
设置为 hash。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
将 key 的 [[extractable]] 内部
槽设置为 extractable。
将 key 的 [[usages]] 内部槽
设置为 usages。
返回 key。
令 keyData 为要导入的密钥数据。
如果 usages 包含不是
"sign" 或 "verify" 的条目,
则抛出一个
SyntaxError。
令 hash 为一个新的 KeyAlgorithm。
raw":令 data 为 keyData。
将 hash 设置为等于 normalizedAlgorithm 的
hash
成员。
jwk":JsonWebKey
字典:令 jwk 等于 keyData。
如果 jwk 不满足 JSON Web Algorithms [JWA]
第 6.4 节的要求,
则抛出一个
DataError。
将 hash 设置为等于 normalizedAlgorithm 的
hash 成员。
name
属性为
"SHA-1":
alg 字段存在,
且不是 "HS1",
则抛出一个
DataError。
name
属性为
"SHA-256":
alg 字段存在,
且不是 "HS256",
则抛出一个
DataError。
name
属性为
"SHA-384":
alg 字段存在,
且不是 "HS384",
则抛出一个
DataError。
name
属性为
"SHA-512":
alg 字段存在,
且不是 "HS512",
则抛出一个
DataError。
name
属性在
另一个适用
规范中定义:
如果 usages 非空,且 jwk 的 use 字段存在,并且
不是 "sign",
则抛出一个
DataError。
如果 jwk 的 key_ops 字段存在,且
根据 JSON Web Key [JWK] 的要求无效,或者
不包含所有指定的 usages 值,
则抛出一个
DataError。
如果 jwk 的 ext 字段存在且
值为 false,并且 extractable 为 true,
则抛出一个
DataError。
NotSupportedError。
令 length 为 data 的位长度。
令 key 为一个新的 CryptoKey
对象,它表示使用 data 的前 length
位的 HMAC 密钥。
令 algorithm 为一个新的
HmacKeyAlgorithm。
将 algorithm 的
name 属性设置为
"HMAC"。
将 algorithm 的
length 属性设置为
length。
将 algorithm 的
hash 属性设置为
hash。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
返回 key。
如果无法访问由 key 的 [[handle]] 内部槽表示的
底层加密密钥材料,
则抛出一个 OperationError。
令 bits 为由 key 的 [[handle]] 内部槽表示的
密钥的原始位。
令 data 为一个包含 bits 的字节序列。
raw":令 result 为 data。
jwk":
令 jwk 为一个新的 JsonWebKey
字典。
将 jwk 的 kty 属性设置为
字符串 "oct"。
将 jwk 的
k 属性设置为一个字符串,
其中包含 data,并按照 JSON Web
Algorithms [JWA] 第 6.4 节进行编码。
令 algorithm 为 key 的
[[algorithm]]
内部槽。
令 hash 为 algorithm 的
hash 属性。
将 jwk 的 key_ops 属性设置为等于
key 的
usages 属性。
将 jwk 的 ext 属性设置为等于 key 的
[[extractable]]
内部槽。
令 result 为 jwk。
返回 result。
本节是非规范性的。
这里描述 SHA-1 和 SHA-2 族,如 [FIPS-180-4] 所指定。
相应 SHA 算法的已识别算法
名称是
"SHA-1"、
"SHA-256"、
"SHA-384" 和
"SHA-512"。
| 操作 | 参数 | 结果 |
|---|---|---|
| digest | 无 | 字节 序列 |
name 成员区分大小写地字符串匹配
"SHA-1":
name 成员区分大小写地字符串匹配
"SHA-256":
name 成员区分大小写地字符串匹配
"SHA-384":
name 成员区分大小写地字符串匹配
"SHA-512":
如果执行操作导致错误,则抛出一个 OperationError。
返回 result。
本节是非规范性的。
"HKDF" 算法标识符用于
使用 [RFC5869]
中描述的先提取后扩展方法执行密钥派生,并
使用本规范中定义的 SHA 哈希函数。
其他 规范 可以指定 HKDF 对其他哈希算法的使用。 此类规范必须为额外的哈希算法定义摘要操作。
此算法的已识别算法名称
为 "HKDF"。
| 操作 | 参数 | 结果 |
|---|---|---|
| deriveBits | HkdfParams |
字节 序列 |
| importKey | 无 | CryptoKey |
| Get key length | 无 | null |
WebIDLdictionary HkdfParams : Algorithm {
required HashAlgorithmIdentifier hash;
required BufferSource salt;
required BufferSource info;
};
hash 成员表示要与 HMAC 一起使用的算法
(例如:SHA-256)。
salt 成员表示提取步骤中使用的盐。
info 成员表示派生密钥材料的应用特定上下文。
如果 length 为 null 或不是 8 的倍数,则抛出一个 OperationError。
令 keyDerivationKey 为由 key 的 [[handle]] 内部槽表示的
秘密值。
令 result 为执行 [RFC5869] 第 2 节中描述的 HKDF 提取步骤然后执行 HKDF 扩展步骤所得的结果, 使用:
如果密钥派生操作失败,
则抛出一个
OperationError。
返回 result。
令 keyData 为要导入的密钥数据。
raw":
如果 usages 包含不是
"deriveKey" 或 "deriveBits" 的值,
则抛出一个
SyntaxError。
如果 extractable 不是 false,
则抛出一个
SyntaxError。
令 key 为一个新的 CryptoKey,
表示 keyData 中提供的密钥数据。
令 algorithm 为一个新的
KeyAlgorithm 对象。
将 algorithm 的
name 属性设置为
"HKDF"。
将 key 的 [[algorithm]]
内部
槽设置为 algorithm。
返回 key。
NotSupportedError。
返回 null。
本节是非规范性的。
"PBKDF2" 算法标识符用于
使用 [RFC8018]
中定义的 PKCS#5 基于口令的密钥派生函数版本 2
执行密钥派生,其中使用 HMAC 作为伪随机函数,
并使用本规范中定义的 SHA 哈希函数。
其他 规范 可以指定 PBKDF2 对其他哈希算法的使用。此类规范 必须为额外的哈希算法定义摘要操作。
此算法的已识别算法名称为
"PBKDF2"。
| 操作 | 参数 | 结果 |
|---|---|---|
| deriveBits | Pbkdf2Params |
字节 序列 |
| importKey | 无 | CryptoKey |
| Get key length | 无 | null |
WebIDLdictionary Pbkdf2Params : Algorithm {
required BufferSource salt;
required [EnforceRange] unsigned long iterations;
required HashAlgorithmIdentifier hash;
};
Pbkdf2Params 字典具有一个 salt 成员、一个 iterations 成员,以及一个 hash 成员。
如果 length 为 null 或不是 8 的倍数,则抛出一个 OperationError。
如果 normalizedAlgorithm 的
iterations 成员为零,
则抛出一个
OperationError。
如果 length 为零,则返回一个空字节序列。
令 prf 为 [FIPS-198-1]
第 4 节中描述的 MAC Generation 函数,
它使用由 normalizedAlgorithm 的
hash 成员
描述的哈希函数。
令 result 为执行 [RFC8018]
第 5.2 节中定义的 PBKDF2 操作所得的结果,其中使用 prf 作为
伪随机函数 PRF,由 key 的 [[handle]] 内部槽表示的口令
作为口令 P,
normalizedAlgorithm 的 salt 属性作为盐
S,
normalizedAlgorithm 的 iterations 属性的值作为
迭代次数 c,并将 length 除以 8 作为预期密钥长度
dkLen。
如果密钥派生操作失败,
则抛出一个
OperationError。
返回 result。
如果 format 不是 "raw",则抛出一个 NotSupportedError
如果 usages 包含不是
"deriveKey" 或 "deriveBits" 的值,则
抛出一个 SyntaxError。
如果 extractable 不是 false,
则抛出一个
SyntaxError。
令 key 为一个新的 CryptoKey,
表示 keyData。
令 algorithm 为一个新的 KeyAlgorithm
对象。
将 algorithm 的
name 属性设置为
"PBKDF2"。
将 key 的 [[algorithm]] 内部
槽设置为 algorithm。
返回 key。
返回 null。
此示例生成两个 X25519 密钥对,一个用于 Alice,一个用于 Bob,在二者之间执行 密钥协商,使用带 SHA-256 的 HKDF 从结果中派生一个 256 位 AES-GCM 密钥, 并用它加密和解密一些数据。
// 为 Alice 生成密钥对。
const alice_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const alice_private_key = alice_x25519_key.privateKey;
// 通常,公钥会由 Bob 提前通过某个已认证通道发送给 Alice。
// 在此示例中,我们将生成另一个密钥对,并改用其公钥。
const bob_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const bob_public_key = bob_x25519_key.publicKey;
// 执行密钥协商。
const alice_x25519_params = { name: 'X25519', public: bob_public_key };
const alice_shared_key = await crypto.subtle.deriveKey(alice_x25519_params, alice_private_key, 'HKDF', false /* extractable */, ['deriveKey']);
// 从结果派生一个对称密钥。
const salt = crypto.getRandomValues(new Uint8Array(32));
const info = new TextEncoder().encode('X25519 key agreement for an AES-GCM-256 key');
const hkdf_params = { name: 'HKDF', hash: 'SHA-256', salt, info };
const gcm_params = { name: 'AES-GCM', length: 256 };
const alice_symmetric_key = await crypto.subtle.deriveKey(hkdf_params, alice_shared_key, gcm_params, false /* extractable */, ['encrypt', 'decrypt']);
// 用对称密钥加密一些数据,并发送给 Bob。IV 也必须一并传递。
const iv = crypto.getRandomValues(new Uint8Array(12));
const message = new TextEncoder().encode('Hi Bob!');
const encrypted = await crypto.subtle.encrypt({ ...gcm_params, iv }, alice_symmetric_key, message);
// 在 Bob 一侧,改用 Alice 的公钥和 Bob 的私钥。
// 为获得相同结果,Alice 和 Bob 必须约定使用相同的 salt 和 info。
const alice_public_key = alice_x25519_key.publicKey;
const bob_private_key = bob_x25519_key.privateKey;
const bob_x25519_params = { name: 'X25519', public: alice_public_key };
const bob_shared_key = await crypto.subtle.deriveKey(bob_x25519_params, bob_private_key, 'HKDF', false /* extractable */, ['deriveKey']);
const bob_symmetric_key = await crypto.subtle.deriveKey(hkdf_params, bob_shared_key, gcm_params, false /* extractable */, ['encrypt', 'decrypt']);
// 在 Bob 一侧,可以解密数据。
const decrypted = await crypto.subtle.decrypt({ ...gcm_params, iv }, bob_symmetric_key, encrypted);
const decrypted_message = new TextDecoder().decode(decrypted);
const data = new TextEncoder().encode('Hello, world!');
const key = await crypto.subtle.generateKey('Ed25519', false, ['sign']);
const signature = await crypto.subtle.sign('Ed25519', key.privateKey, data);
const data = new TextEncoder().encode('Hello, world!');
const aesAlgorithmKeyGen = {
name: 'AES-GCM',
// AesKeyGenParams
length: 256
};
const aesAlgorithmEncrypt = {
name: 'AES-GCM',
// AesGcmParams
iv: crypto.getRandomValues(new Uint8Array(16))
};
const key = await crypto.subtle.generateKey(aesAlgorithmKeyGen, false, ['encrypt']);
const encrypted = await crypto.subtle.encrypt(aesAlgorithmEncrypt, key, data);
const filename = `${crypto.randomUUID()}.txt`;
本节在 IANA JSON Web Signature and Encryption Algorithms Registry 中注册以下算法标识符, 以便与 JSON Web Key 一起使用。注意,模板中的 'Implementation Requirements' 字段专指与 JSON Web Signature 和 JSON Web Encryption 一起使用,在这种情况下,禁止使用未经认证的加密。
特别感谢 Ryan Sleevi,本文件的原作者和编辑, 以及本文件的前编辑 Mark Watson。
感谢 Adam Barth、Alex Russell、Ali Asad、Arun Ranganathan、 Brian Smith、Brian Warner、Channy Yun、Charles Engelke、Eric Roman、Glenn Adams、Jim Schaad、Kai Engert、 Michael Hutchinson、Michael B. Jones、Nick Van den Bleeken、Richard Barnes、Ryan Hurst、 Tim Taubert、Vijay Bharadwaj、Virginie Galindo 和 Wan-Teh Chang 提供技术反馈和 协助。
感谢 W3C Web Cryptography WG,以及 public-webcrypto@w3.org 邮件列表的参与者。
W3C 感谢 Northrop Grumman Cybersecurity Research Consortium 对 W3C/MIT 的支持。
getRandomValues
方法最初由 Adam Barth 向 Crypto 接口中的
WHATWG 提议。
本节是非规范性的。
有关导入和导出 JWK 的规范性要求, 请参见特定于算法的小节。
| JSON Web Key | AlgorithmIdentifier |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
本节是非规范性的。
有关导入和导出 SPKI 的规范性要求, 请参见特定于算法的小节。
| Algorithm OID | subjectPublicKey ASN.1 结构 | AlgorithmIdentifier | 参考 |
|---|---|---|---|
| rsaEncryption (1.2.840.113549.1.1.1) | RSAPublicKey |
"RSASSA-PKCS1-v1_5"、
"RSA-PSS" 或
"RSA-OAEP"
|
[RFC3447] |
| id-ecPublicKey (1.2.840.10045.2.1) | ECPoint | "ECDH" 或 "ECDSA" |
[RFC5480] |
| id-Ed25519 (1.3.101.112) | BIT STRING |
"Ed25519"
|
[RFC8410] |
| id-X25519 (1.3.101.110) | BIT STRING |
"X25519"
|
[RFC8410] |
本规范使用的对象标识符不
包含该密钥意图与之一起使用的特定算法和哈希
的信息。如果需要这些信息,
建议改用 "jwk"
密钥格式。
本节是非规范性的。
有关导入和导出 PKCS#8 PrivateKeyInfo 的规范性要求, 请参见特定于算法的小节。
| privateKeyAlgorithm | privateKey 格式 | AlgorithmIdentifier | 参考 |
|---|---|---|---|
| rsaEncryption (1.2.840.113549.1.1.1) | RSAPrivateKey |
"RSASSA-PKCS1-v1_5"、
"RSA-PSS" 或
"RSA-OAEP"
|
[RFC3447] |
| id-ecPublicKey (1.2.840.10045.2.1) | ECPrivateKey | "ECDH" 或 "ECDSA" |
[RFC5480] |
| id-Ed25519 (1.3.101.112) | CurvePrivateKey |
"Ed25519"
|
[RFC8410] |
| id-X25519 (1.3.101.110) | CurvePrivateKey |
"X25519"
|
[RFC8410] |
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: