版权声明 © 2025 万维网联盟 (World Wide Web Consortium)。适用 W3C® 责任限制、商标及宽松文档许可规则。
本规范描述了一种用于在 Web 应用中执行基本加密操作(例如哈希、签名生成与验证、加密与解密)的 JavaScript API。此外,它还描述了应用程序用于生成和/或管理执行这些操作所需的密钥材料的 API。该 API 的用途包括用户或服务身份验证、文档或代码签名,以及通信的机密性和完整性保护。
本节描述了本文档发布时的状态。当前的 W3C 出版物列表及本技术报告的最新修订版可在 W3C 标准与草案索引(网址:https://w3org.cn/TR/)中找到。
本文档由 Web 应用安全工作组 发布,作为使用 推荐标准轨道 的首次公开工作草案。
作为首个公开工作草案发布并不意味着得到 W3C 及其成员的认可。
这是一份草案文档,可能会随时被其他文档更新、替换或废弃。将其作为非进行中工作引用是不恰当的。
本文档由在一个遵循 W3C 专利政策 的小组下运作。 W3C 维护了一份 与该小组交付成果相关的专利披露公开列表;该页面还包含了披露专利的说明。任何知悉其本人认为包含 必要权利要求 (Essential Claim(s)) 的专利的个人,必须按照 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 应用可能希望使用诸如离线(OTR)消息传递之类的方案来采用消息层安全性,即使这些消息已经过安全接收(例如通过 TLS)。
Web Cryptography API 通过允许执行密钥协商,实现了 OTR 及类似的消息签名方案。双方可以协商共享加密密钥和消息认证码 (MAC) 密钥,以允许对消息进行加密和解密,并防止篡改。
Web 应用可能希望与 IETF JavaScript 对象签名和加密 (JOSE) 工作组定义的结构和消息格式进行交互。
利用 Web Cryptography API,应用可以读取和导入以 JSON 密钥格式 (JWK) 编码的密钥,验证使用数字签名或 MAC (JWS) 保护完整性的消息,或解密已加密的消息 (JWE)。
除了标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键词 MUST (必须)、REQUIRED (必需) 和 SHALL (应) 应按照 BCP 14 [RFC2119] [RFC8174] 的描述进行解释,且仅在它们以全大写形式出现时才具有此含义,如图所示。
本规范定义了以下一致性类:
如果一个用户代理满足本规范中适用于实现的所有 MUST、REQUIRED 和 SHALL 级别的标准,则将其视为 符合要求的一致性用户代理。本规范使用“符合要求的一致性用户代理”和“用户代理”这两个术语来指代该产品类别。
以算法或具体步骤表述的一致性要求可以以任何方式实现,只要最终结果等效即可。(特别说明,本规范中定义的算法旨在易于遵循,而非旨在达到高性能。)
使用 ECMAScript 实现本规范定义 API 的用户代理 MUST 以与 Web IDL 规范 [WebIDL] 中定义的 ECMAScript 绑定一致的方式实现它们,因为本规范使用了该规范及其术语。
除非另有说明,否则字符串比较以 区分大小写 的方式进行。本规范中用等宽字体编写的字符串字面量(例如 "this")不包括外层的引号。
强烈建议不要使用本规范的厂商专有扩展。作者不得使用此类扩展,因为这样做会降低互操作性并导致用户群体碎片化,仅允许特定用户代理的用户访问相关内容。
如果需要厂商专有扩展,则成员名称应添加厂商专有前缀,以防止与本规范的未来版本发生冲突。必须定义扩展,以使扩展的使用既不矛盾也不导致规范定义功能的非一致性。
当需要本规范的厂商中立扩展时,可以相应地更新本规范,或者编写一个覆盖本规范中要求的扩展规范。当应用本规范的活动方决定采纳此类扩展规范的要求时,它就成为本规范一致性要求目的下的 适用规范 (applicable specification)。由 W3C Web Cryptography 工作组定义的适用规范列于下表中。
| 规范 | 参考 |
本节是非规范性的。
本规范试图关注各种平台特定或标准化加密 API 之间的通用功能和特性,并避免特定于一两个实现的特性和功能。因此,该 API 允许密钥生成、管理和交换,其抽象级别避免了开发人员需要关心底层密钥存储的实现。该 API 专门围绕 CryptoKey 对象展开,作为对底层原始加密密钥材料的抽象。其目的是允许一个足够通用的 API,使得符合要求的用户代理能够暴露由用户代理直接存储和管理的密钥,这些密钥可以通过操作系统提供的每用户密钥存储等隔离存储 API 进行存储或管理,或者存储在安全元件等密钥存储设备内,同时允许丰富的 Web 应用操作密钥,而无需 Web 应用了解底层密钥存储的性质。
由于底层加密实现在符合要求的用户代理之间会有所不同,并可能受限于本地政策(包括但不限于政府或行业监管、安全最佳实践、知识产权问题和受限操作环境等方面的考量),本规范并不规定必须实现的强制性算法集。相反,它定义了一组可以在算法独立方式下使用的通用绑定,一个用于发现用户代理或密钥句柄是否支持底层算法的通用框架,以及在实现时针对各个算法行为的一套一致性要求。
虽然该 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 对象的源对底层密钥拥有完全访问权限,因此,来自这些应用的消息无法区分,并且发送给这些应用的消息可以被完全恢复。实现者应确保除非作者明确选择共享(例如通过使用 postMessage),否则不会在两个源之间共享 CryptoKey 对象。
本规范中指定的许多算法执行计算密集型工作,例如生成极大的素数,或通过特定操作的重复迭代。因此,敌对应用可能会试图滥用此 API 并尝试导致实现执行大量工作,从而拒绝向正在执行的其他应用提供访问或服务。实现应采取措施减轻这些风险,例如限制实现并发执行的操作数量,要求用户对已知会破坏执行环境的操作给予许可,或定义针对设备属性(如密钥大小或迭代次数)的限制。
本规范包含了各种加密操作的描述,其中一些在不当使用时存在已知弱点。应用开发人员必须小心谨慎,审阅适当且最新的加密文献,以理解并减轻此类问题。通常情况下,强烈建议应用开发人员不要发明新的加密协议;与所有应用一样,使用本规范的开发者应通过使用现有协议来获得最佳服务,本规范提供了实现这些协议所需的必要构建块。
为了使用本规范定义的 API 提供任何有意义的加密保障,作者必须熟悉 Web 应用现有的威胁,以及所采用的底层安全模型。从概念上讲,脚本注入等问题等同于其他操作环境中的远程代码执行,允许注入敌对脚本可能会导致密钥或数据的泄露。脚本注入可能来自其他应用,这可以通过合理使用内容安全策略 (Content Security Policy) 来减轻;或者可能来自敌对的网络中介,这可以通过使用传输层安全性 (Transport Layer Security) 来减轻。
本规范未定义任何用于存储加密密钥的具体机制。默认情况下,除非作者通过使用 Indexed Database API 等方式专门努力持久化密钥,否则使用此 API 创建的密钥仅在当前页面期间有效(例如直到导航事件发生)。希望在不同页面或多个浏览会话中使用同一密钥的作者必须使用现有的 Web 存储技术。作者应意识到这些技术的安全假设,例如同源安全模型;即任何共享相同协议、主机和端口的应用都可以访问相同的存储分区,即使路径等其他信息可能有所不同。作者可以通过使用跨源共享(如 postMessage)明确选择放宽此安全限制。
作者应意识到,本规范对于实现如何存储底层加密密钥材料没有强制性要求。唯一的要求是,除非使用 exportKey 和 wrapKey 操作,否则密钥材料不会暴露给脚本。特别地,它不保证底层加密密钥材料不会被持久化到磁盘(可能是未加密的),也不保证它不会被与用户代理具有相同权限的用户或其他应用所访问。任何有权访问设备存储的应用或用户可能能够恢复密钥材料,即使脚本可能被禁止这样做。
本规范对于实现如何在所有对其引用消失后处理密钥材料没有强制性要求。也就是说,符合要求的用户代理不需要对密钥材料进行零化处理,即使在所有对 CryptoKey 的引用消失后,它仍可能在设备存储或设备内存中被访问。
应用可以通过使用结构化克隆算法和诸如 postMessage 之类的 API,跨安全边界(如源)共享 CryptoKey 对象。虽然基于 extractable 属性,对底层加密密钥材料的访问可能受到限制,但一旦密钥与目标源共享,源端便无法在以后限制或撤销对该密钥的访问。因此,作者必须确保信任目标源能够采取与源端相同的针对敌对脚本的防御措施。此外,如果源端发生脚本注入,攻击者可能会将密钥发布到受攻击者控制的源。只要用户代理访问攻击者的源,用户代理就可能被引导使用该密钥执行加密操作,例如解密现有消息或创建新的欺诈消息。
作者应意识到用户可能随时选择清除与某源关联的存储,从而可能销毁密钥。旨在提供长期存储(如在服务器上)的应用应考虑采用密钥托管 (key escrow) 等技术,以防止此类数据无法访问。作者不应假设密钥将无限期可用。
使用本规范定义 API 的应用的用户应意识到,无论采用何种加密技术,这些应用都将拥有对所有交换消息的完全访问权限。也就是说,对于加密的消息,使用这些 API 的应用也将拥有对解密后消息的完全访问权限。
本节是非规范性的。
randomUUID 作为用户 IDrandomUUID 对于生成 用户 ID 非常有用,但不能直接提供生成 全局标识符 的任何能力。本规范依赖于底层规范。
一个 符合要求的一致性用户代理 MUST 支持至少本规范所依赖的 DOM 功能子集;特别地,它 MUST 支持 Promise 和 DOMException。[DOM]
一个 符合要求的一致性用户代理 MUST 支持至少本规范所依赖的 HTML 功能子集;特别地,它 MUST 支持 ArrayBufferView typedef 和 可序列化对象。[HTML]
一个 符合要求的一致性用户代理 MUST 是本规范中 IDL 片段的符合要求的实现,如 Web IDL 规范中所述。[WebIDL]
术语 ArrayBuffer、ArrayBufferView 和 可序列化对象 (serializable objects) 由 HTML 规范定义 [HTML]。
术语 DOMString 和 BufferSource 定义在 [WEBIDL] 中。
术语 字节序列 (byte sequence) 定义在 [Infra] 中。
字节序列 的 位长 (length in bits) 是其 长度 乘以 8。
包含位序列的字节序列 b 是通过首先向 b 追加零个或多个零位,使得生成的位序列长度最小且为 8 的整数倍,然后将该字符串中的每个连续 8 位序列视为一个字节而获得的 字节序列。
当本规范说要 将非负整数 i 转换为长度为 n 的字节序列(其中 n * 8 大于 i 的以 2 为底的对数)时,用户代理必须首先计算 i 的二进制表示(最高有效位优先),在其前面加上足够的零位以形成长度为 n * 8 的位序列,然后返回通过将该位序列中的每个连续 8 位视为一个字节所形成的 字节序列。
以 区分大小写 (case-sensitive) 的方式比较两个字符串意味着逐个码点地完全精确比较它们。
以 ASCII 不区分大小写 (ASCII case-insensitive) 的方式比较两个字符串意味着逐个码点地完全精确比较它们,区别在于范围 U+0041 .. U+005A(即大写字母 A 到 Z)内的码点与范围 U+0061 .. U+007A(即小写字母 a 到 z)内相应的码点也被视为匹配。
当本规范说要 终止算法 时,用户代理必须在完成当前步骤后终止该算法。所指的算法是规范定义的处理步骤集,而不是可能正在处理中的底层加密算法。
当本规范说要 解析 ASN.1 结构 时,用户代理必须执行以下步骤:
令 data 为要解析的字节序列。
令 structure 为要解析的 ASN.1 结构。
令 exactData 为可选的布尔值。如果未提供,则将其初始化为 true。
根据 [X690] 的区分编码规则 (DER) 解析 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 字符串。
令 key 为将 result 转换为 JsonWebKey 的 IDL 字典类型的结果。
返回 key。
当本规范说要计算两个序列 a 和 b 的 使用交集 (usage intersection) 时,结果应为一个序列,包含同时出现在 a 和 b 中的每个 已识别的密钥用法值,顺序按照 已识别的密钥用法值 列表中的顺序排列,其中若序列中存在与该值区分大小写匹配的元素,则称该值出现在序列中。
当本规范说要计算 用法列表的规范化值 (normalized value of a usages list) usages 时,结果应为 usages 与包含所有 已识别的密钥用法值 的序列之间的 使用交集。
当本规范提及与 object 的内部槽位 [[slot]] 关联的 缓存的 ECMAScript 对象 (cached ECMAScript object) 时,用户代理必须运行以下步骤:
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 的 十六进制表示 (hexadecimal representation) 是通过使用 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 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 key 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 key 的 [[usages]] 内部槽位不包含 "encrypt" 条目,则 抛出 InvalidAccessError。
令 ciphertext 为执行由 normalizedAlgorithm 指定的加密操作的结果,使用 algorithm 和 key,并以 data 作为 plaintext。
令 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 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 key 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 key 的 [[usages]] 内部槽位不包含 "decrypt" 条目,则 抛出 InvalidAccessError。
令 plaintext 为执行由 normalizedAlgorithm 指定的解密操作的结果,使用 key 和 algorithm,并以 data 作为 ciphertext。
令 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 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 key 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 key 的 [[usages]] 内部槽位不包含 "sign" 条目,则 抛出 InvalidAccessError。
令 signature 为执行由 normalizedAlgorithm 指定的签名操作的结果,使用 key 和 algorithm,并以 data 作为 message。
令 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 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 key 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 key 的 [[usages]] 内部槽位不包含 "verify" 条目,则 抛出 InvalidAccessError。
令 result 为执行由 normalizedAlgorithm 指定的验证操作的结果,使用 key、algorithm 和 signature,并以 data 作为 message。
用 result 解析 promise。
digest 方法返回一个新的 Promise 对象,该对象将使用指定的 AlgorithmIdentifier 来摘要数据。它必须执行如下操作:
令 algorithm 为传递给 digest() 方法的 algorithm 参数。
令 normalizedAlgorithm 为 规范化算法 的结果,其中 alg 设置为 algorithm,op 设置为 "digest"。
如果发生错误,则返回一个被 normalizedAlgorithm 拒绝的 Promise。
设 promise 为一个新的 Promise。
返回 promise 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
令 digest 为执行由 normalizedAlgorithm 指定的摘要操作的结果,使用 algorithm,并以 data 作为 message。
令 result 为在 realm 中 创建 包含 digest 的 ArrayBuffer 的结果。
用 result 解析 promise。
当被调用时,generateKey 必须 执行以下步骤:
令 algorithm、extractable 和 usages 分别为传递给 generateKey() 方法的 algorithm、extractable 和 keyUsages 参数。
令 normalizedAlgorithm 为 规范化算法 的结果,其中 alg 设置为 algorithm,op 设置为 "generateKey"。
如果发生错误,则返回一个被 normalizedAlgorithm 拒绝的 Promise。
设 promise 为一个新的 Promise。
返回 promise 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
令 result 为执行由 normalizedAlgorithm 指定的生成密钥操作的结果,使用 algorithm、extractable 和 usages。
CryptoKey 对象:如果 result 的 [[type]] 内部槽位为 "secret" 或 "private",且 usages 为空,则 抛出 SyntaxError。
CryptoKeyPair 对象:如果 result 的 privateKey 属性的 [[usages]] 内部槽位为空序列,则 抛出 SyntaxError。
令 result 为根据 [WebIDL] 的定义,将 result 转换为 realm 中的 ECMAScript 对象的结果。
用 result 解析 promise。
当被调用时,deriveKey 必须 执行以下步骤:
令 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 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 baseKey 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 baseKey 的 [[usages]] 内部槽位不包含 "deriveKey" 条目,则 抛出 InvalidAccessError。
令 length 为执行由 normalizedDerivedKeyAlgorithmLength 指定的获取密钥长度算法的结果,使用 derivedKeyType。
令 secret 为执行由 normalizedAlgorithm 指定的导出位操作的结果,使用 key、algorithm 和 length。
令 result 为执行由 normalizedDerivedKeyAlgorithmImport 指定的导入密钥操作的结果,使用 "raw" 作为 format,secret 作为 keyData,derivedKeyType 作为 algorithm,并使用 extractable 和 usages。
如果 result 的 [[type]] 内部槽位为 "secret" 或 "private",且 usages 为空,则 抛出 SyntaxError。
将 result 的 [[extractable]] 内部槽位设置为 extractable。
将 result 的 [[usages]] 内部槽位设置为 usages 的 规范化值。
令 result 为根据 [WebIDL] 的定义,将 result 转换为 realm 中的 ECMAScript 对象的结果。
用 result 解析 promise。
当被调用时,deriveBits 必须 执行以下步骤:
令 algorithm、baseKey 和 length 分别为传递给 deriveBits() 方法的 algorithm、baseKey 和 length 参数。
令 normalizedAlgorithm 为 规范化算法 的结果,其中 alg 设置为 algorithm,op 设置为 "deriveBits"。
如果发生错误,则返回一个被 normalizedAlgorithm 拒绝的 Promise。
设 promise 为一个新的 Promise。
返回 promise 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 baseKey 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 baseKey 的 [[usages]] 内部槽位不包含 "deriveBits" 条目,则 抛出 InvalidAccessError。
令 bits 为执行由 normalizedAlgorithm 指定的导出位操作的结果,使用 baseKey、algorithm 和 length。
令 result 为在 realm 中 创建 包含 bits 的 ArrayBuffer 的结果。
用 result 解析 promise。
当被调用时,importKey 方法 必须 执行以下步骤:
令 format、algorithm、extractable 和 usages 分别为传递给 importKey() 方法的 format、algorithm、extractable 和 keyUsages 参数。
令 normalizedAlgorithm 为 规范化算法 的结果,其中 alg 设置为 algorithm,op 设置为 "importKey"。
如果发生错误,则返回一个被 normalizedAlgorithm 拒绝的 Promise。
设 promise 为一个新的 Promise。
返回 promise 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
令 result 为执行由 normalizedAlgorithm 指定的导入密钥操作所产生的 CryptoKey 对象,使用 keyData、algorithm、format、extractable 和 usages。
如果 result 的 [[type]] 内部槽位为 "secret" 或 "private",且 usages 为空,则 抛出 SyntaxError。
将 result 的 [[extractable]] 内部槽位设置为 extractable。
将 result 的 [[usages]] 内部槽位设置为 usages 的 规范化值。
令 result 为根据 [WebIDL] 的定义,将 result 转换为 realm 中的 ECMAScript 对象的结果。
用 result 解析 promise。
鼓励支持 "raw" 密钥格式以实现互操作性。Web 开发人员应查阅测试套件,获取有关实现对其他密钥格式支持的详细信息。
当被调用时,exportKey 方法 必须 执行以下步骤:
令 format 和 key 分别为传递给 exportKey() 方法的 format 和 key 参数。
设 promise 为一个新的 Promise。
返回 promise 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 key 的 [[algorithm]] 内部槽位的 name 成员无法标识支持导出密钥操作的 注册算法,则 抛出 NotSupportedError。
如果 key 的 [[extractable]] 内部槽位为 false,则 抛出 InvalidAccessError。
令 result 为执行由 key 的 [[algorithm]] 内部槽位指定的导出密钥操作的结果,使用 key 和 format。
用 result 解析 promise。
鼓励支持 "raw" 密钥格式以实现互操作性。Web 开发人员应查阅测试套件,获取有关实现对其他密钥格式支持的详细信息。
当被调用时,wrapKey 方法 必须 执行以下步骤:
令 format、key、wrappingKey 和 algorithm 分别为传递给 wrapKey() 方法的 format、key、wrappingKey 和 wrapAlgorithm 参数。
令 normalizedAlgorithm 为 规范化算法 的结果,其中 alg 设置为 algorithm,op 设置为 "wrapKey"。
如果发生错误,令 normalizedAlgorithm 为 规范化算法 的结果,其中 alg 设置为 algorithm,op 设置为 "encrypt"。
如果发生错误,则返回一个被 normalizedAlgorithm 拒绝的 Promise。
设 promise 为一个新的 Promise。
返回 promise 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 wrappingKey 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 wrappingKey 的 [[usages]] 内部槽位不包含 "wrapKey" 条目,则 抛出 InvalidAccessError。
如果 key 的 [[algorithm]] 内部槽位标识的算法不支持导出密钥操作,则 抛出 NotSupportedError。
如果 key 的 [[extractable]] 内部槽位为 false,则 抛出 InvalidAccessError。
令 exportedKey 为执行由 key 的 [[algorithm]] 内部槽位指定的导出密钥操作的结果,使用 key 和 format。
某些算法的密钥包装操作对负载大小有限制。例如,AES-KW 要求负载长度为 8 字节的倍数,而 RSA-OAEP 对长度有限制。对于在给定密钥的序列化方面提供灵活性的密钥格式(例如 JWK),实现可以选择调整序列化以适应包装算法的约束。这就是为什么不规范要求 JSON.stringify 的原因,否则它将禁止实现引入额外的填充。
令 result 为执行由 normalizedAlgorithm 指定的包装密钥操作的结果,使用 algorithm,wrappingKey 作为 key,bytes 作为 plaintext。
令 result 为执行由 normalizedAlgorithm 指定的加密操作的结果,使用 algorithm,wrappingKey 作为 key,bytes 作为 plaintext。
NotSupportedError。令 result 为在 realm 中 创建 包含 result 的 ArrayBuffer 的结果。
用 result 解析 promise。
鼓励支持 "raw" 密钥格式以实现互操作性。Web 开发人员应查阅测试套件,获取有关实现对其他密钥格式支持的详细信息。
当被调用时,unwrapKey 方法 必须 执行以下步骤:
令 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 并 并行 执行剩余步骤。
如果以下步骤或引用的过程说明要 抛出 错误,请在 realm 的全局对象上,在 加密任务源 上 排队一个全局任务,以用返回的错误拒绝 promise;然后 终止算法。
如果 normalizedAlgorithm 的 name 成员不等于 unwrappingKey 的 [[algorithm]] 内部槽位的 name 属性,则 抛出 InvalidAccessError。
如果 unwrappingKey 的 [[usages]] 内部槽位不包含 "unwrapKey" 条目,则 抛出 InvalidAccessError。
NotSupportedError。令 result 为执行由 normalizedKeyAlgorithm 指定的导入密钥操作的结果,使用 unwrappedKeyAlgorithm 作为 algorithm,format,usages 和 extractable,并以 key 作为 keyData。
如果 result 的 [[type]] 内部槽位为 "secret" 或 "private",且 usages 为空,则 抛出 SyntaxError。
将 result 的 [[extractable]] 内部槽位设置为 extractable。
将 result 的 [[usages]] 内部槽位设置为 usages 的 规范化值。
令 result 为根据 [WebIDL] 的定义,将 result 转换为 realm 中的 ECMAScript 对象的结果。
用 result 解析 promise。
鼓励支持 "raw" 密钥格式以实现互操作性。Web 开发人员应查阅测试套件,获取有关实现对其他密钥格式支持的详细信息。
SubtleCrypto 接口的方法通过拒绝返回的 Promise 来返回错误,并附带在 ECMAScript [ECMA-262] 或 DOMException 中预定义的异常。使用了以下预定义异常:TypeError。使用了来自 [DOM] 的以下 DOMException 类型:
| 名称 | 描述 |
|---|---|
NotSupportedError |
算法不受支持 |
SyntaxError |
必需的参数丢失或超出范围 |
InvalidAccessError |
所请求的操作对于提供的密钥无效 |
DataError |
提供给操作的数据不符合要求 |
OperationError |
由于操作特定的原因,该操作失败 |
当本规范说明要 抛出 错误时,用户代理必须按 [WebIDL] 中的描述抛出错误。当这种情况发生在子算法中时,这将导致子算法及所有祖先算法的执行终止,直到到达一个明确描述了捕获异常程序的算法。抛出的错误对象应与 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 类型定义是一个 Uint8Array,它以大端顺序保存任意大小的无符号整数。从 API 读取的值 应 具有最小的类型化数组长度(即最多 7 个前导零位,但值 0 除外,其长度应为 8 位)。API 应 接受具有任意数量前导零位的值,包括表示零的空数组。
WebIDLdictionary CryptoKeyPair {
CryptoKey publicKey;
CryptoKey privateKey;
};
CryptoKeyPair 字典表示一个非对称密钥对,它由公钥(publicKey)和私钥(privateKey)组成。
本节是非规范性的。
除了通过 SubtleCrypto 接口提供执行加密操作的通用接口外,本规范还提供了作者可能希望使用且用户代理(User Agents)可能选择实现的各种算法的描述。这包括一系列常用的对称和非对称算法、密钥派生机制,以及封装和解封装密钥的方法。此外,本规范还定义了一个流程,允许其他规范引入额外的加密算法。
为 Web Cryptography API 定义的每种加密算法都 必须 拥有一个唯一的名称(称为其 识别算法名称),以确保没有其他规范为 Web Cryptography API 定义相同的、不区分大小写的字符串。
为 Web Cryptography API 定义的每种加密算法都有一个 支持的操作 列表,这是一组由 SubtleCrypto 接口调用的子算法,用于执行所需的加密操作。本规范使用了以下操作
如果给定的算法规范没有将特定操作列为受支持,或者明确列为不支持,则用户代理 必须 表现得如同该子算法的调用抛出了 NotSupportedError 一样。
为 Web Cryptography API 定义的每种加密算法 必须 针对每个 支持的操作 定义用于 算法规范化 的 IDL 类型,以及子算法返回值的 IDL 类型。
本规范中定义的每种加密算法都采用以下规范约定。一个名为 “Registration(注册)” 的章节将包含 识别算法名称。此外,它还包括一个表格,该表格将以行的方式列出每个 支持的操作,并通过 Operation(操作) 列进行标识。给定行的 Parameters(参数) 列的内容将包含用于该操作 算法规范化 的 IDL 类型,该行 Result(结果) 列的内容指示执行该支持操作后所得的 IDL 类型。
如果符合规范的用户代理实现了某种算法,它 必须 实现所有 支持的操作 并 必须 返回指定的 IDL 类型。
此外,在初始化时,符合规范的用户代理必须为每个支持的操作执行 定义算法 步骤,并按照指示注册其 IDL 参数类型。
除非另有说明,否则本规范中由操作创建的对象应与 相关领域(relevant realm) 中的 this 相关联。
本节是非规范性的。
AlgorithmIdentifier 类型定义允许将算法指定为 DOMString 或对象。DOMString 的使用是为了方便作者为没有参数的算法(例如 SHA-1)提供简写。对象的使用是为了允许指定 Algorithm(或适当的子类),其中包含对象的所有相关参数。
因此,有必要定义将 AlgorithmIdentifier 转换为可与此 API 一起使用的适当字典的算法。该算法必须是可扩展的,以便允许添加新的加密算法;且必须是一致的,以便在将控制权返回给调用脚本之前发生 Web IDL 类型映射,从而防止参数或脚本环境被篡改。
本规范使用了一个内部对象 supportedAlgorithms。该内部对象不对应用程序公开。
由于此值未对应用程序公开,因此未指定其确切类型。它仅被要求表现为一个键/值对的关联容器,其中键的比较以区分大小写的方式执行。
该内部对象的初始内容如下
对于 支持的操作 列表中的每个值 v,将内部对象 supportedAlgorithms 的 v 键设置为一个新的关联容器。
定义算法 算法用于规范作者指示用户代理应如何为特定算法规范化参数。其输入是一个表示为 DOMString 的算法名称 alg,一个表示为 DOMString 的操作名称 op,以及所需的 IDL 字典类型 type。该算法的行为如下
supportedAlgorithms 的 op 键处的关联容器。规范化算法 定义了一个在 Web IDL 转换发生后,将输入强制转换为目标 IDL 字典类型的过程。它被设计为可扩展的,以允许未来规范定义额外算法,并且可以安全地与 Promises 一起使用。其输入是一个操作名称 op 和一个 AlgorithmIdentifier alg。其输出是一个 IDL 字典类型或一个错误。其行为如下
返回运行 规范化算法 的结果,将 alg 设置为一个新的 Algorithm 字典(其 name 属性为 alg),并将 op 设置为 op。
supportedAlgorithms 的 op 键处的关联容器。Algorithm 的结果,如 [WebIDL] 所定义。name 属性的值。将 algName 设置为该匹配键的值。
设 desiredType 为存储在 registeredAlgorithms 中 algName 处的 IDL 字典类型。
NotSupportedError 并终止此算法。name 属性设置为 algName。对于列表中的每个字典 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(解密) | 符号 | 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”。
| 操作 | 参数 | 结果 |
|---|---|---|
| 符号 | 无 | byte sequence (字节序列) |
| 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 为布尔值,如果操作结果为 “valid signature(有效签名)”,则值为 true,否则为 false。
返回 result。
如果 usages 包含一个非 “sign” 或 “verify” 的条目,则 抛出 SyntaxError。
生成一个 RSA 密钥对,如 [RFC3447] 中所定义,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 字段的 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 字段的 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 为一个初始值未定义的字符串。
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”。
| 操作 | 参数 | 结果 |
|---|---|---|
| 符号 | RsaPssParams |
byte sequence (字节序列) |
| 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 为布尔值,如果操作结果为 “valid signature(有效签名)”,则值为 true,否则为 false。
如果 usages 包含一个非 “sign” 或 “verify” 的条目,则 抛出 SyntaxError。
生成一个 RSA 密钥对,如 [RFC3447] 中所定义,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 字段的 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 字段的 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 字段设置为对 RSAPublicKey ASN.1 类型进行 DER 编码的结果(如 [RFC3447] 附录 A.1.1 所定义),该类型表示由 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 字段设置为对 RSAPrivateKey ASN.1 类型进行 DER 编码的结果(如 [RFC3447] 附录 A.1.2 所定义),该类型表示由 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 |
byte sequence (字节序列) |
| decrypt(解密) | RsaOaepParams |
byte sequence (字节序列) |
| 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。
生成一个 RSA 密钥对(如 [RFC3447] 中定义),其 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 字段的 algorithm 对象标识符字段不等于 [RFC3447] 中定义的 rsaEncryption 对象标识符,则 抛出 DataError。
令 publicKey 为执行解析 ASN.1 结构算法的结果,其中 data 为 spki 的 subjectPublicKeyInfo 字段,structure 为 [RFC3447] A.1.1 节中指定的 RSAPublicKey 结构,并将 exactData 设置为 true。
如果解析时发生错误,或者确定 publicKey 根据 [RFC3447] 不是有效的公钥,则 抛出 DataError。
令 key 为一个表示由 publicKey 标识的 RSA 公钥的新 CryptoKey。
将 key 的 [[type]] 内部槽设置为“public”
pkcs8”如果 usages 包含一个不是“decrypt”或“unwrapKey”的条目,则抛出一个 SyntaxError。
令 privateKeyInfo 为对 keyData 运行解析 privateKeyInfo 算法的结果。
如果 privateKeyInfo 的 privateKeyAlgorithm 字段的 algorithm 对象标识符字段不等于 [RFC3447] 中定义的 rsaEncryption 对象标识符,则 抛出 DataError。
令 rsaPrivateKey 为执行解析 ASN.1 结构算法的结果,其中 data 为 privateKeyInfo 的 privateKey 字段,structure 为 [RFC3447] A.1.2 节中指定的 RSAPrivateKey 结构,并将 exactData 设置为 true。
如果解析时发生错误,或者如果 rsaPrivateKey 根据 [RFC3447] 不是有效的 RSA 私钥,则 抛出 DataError。
令 key 为一个表示由 rsaPrivateKey 标识的 RSA 私钥的新 CryptoKey。
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 字段设置为对 RSAPublicKey ASN.1 类型进行 DER 编码的结果(如 [RFC3447] 附录 A.1.1 所定义),该类型表示由 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 字段设置为对 RSAPrivateKey ASN.1 类型进行 DER 编码的结果(如 [RFC3447] 附录 A.1.2 所定义),该类型表示由 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”。
| 操作 | 参数 | 结果 |
|---|---|---|
| 符号 | EcdsaParams |
byte sequence (字节序列) |
| 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”执行 ECDSA 签名过程(如 [RFC6090] 第 5.4 节所指定),以 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”执行 ECDSA 验证过程(如 [RFC6090] 第 5.3 节所指定),以 M 为接收到的消息,signature 为接收到的签名,并使用 params 作为 EC 域参数,以 Q 作为公钥。
[[algorithm]] 内部槽的 namedCurve 属性为适用规范中指定的值执行该规范中指定的 ECDSA 验证步骤,传入 M、signature、params 和 Q,并得出所声称的签名是否有效的指示。
令 result 为一个布尔值,如果签名有效则为 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 为一个表示通过执行 [RFC5915] 第 3 节中定义的转换步骤(使用 ecPrivateKey)所标识的椭圆曲线私钥的新 CryptoKey。
如果 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 为代表椭圆曲线公钥的 字节序列,该公钥由 key 的 [[handle]] 内部槽位根据 [RFC5480] 第 2.2 节中指定的编码规则并使用未压缩形式表示,以及 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 为代表椭圆曲线点 Q 的 字节序列,该点由 key 的 [[handle]] 内部槽位根据 [SEC1] 2.3.3 使用未压缩格式表示。
执行由 其他适用规范 定义的任何 密钥导出步骤,传入 format 和 key 的 [[algorithm]] 内部槽位的 namedCurve 属性,并获取 namedCurve 和 data。
令 result 为 data。
返回 result。
本节是非规范性的。
这描述了使用椭圆曲线迪菲-赫尔曼(ECDH)进行密钥生成和密钥协商,正如 [RFC6090] 所指定的那样。
其他规范 可能会指定将其他椭圆曲线与 ECDH 一起使用。要指定额外的椭圆曲线,规范必须定义 曲线名称、ECDH 生成步骤、ECDH 推导步骤、ECDH 密钥导入步骤 和 ECDH 密钥导出步骤。
该算法的 识别算法名称 为 "ECDH"。
| 操作 | 参数 | 结果 |
|---|---|---|
| generateKey(生成密钥) | EcKeyGenParams |
CryptoKeyPair |
| deriveBits(派生比特) | EcdhKeyDeriveParams |
byte sequence (字节序列) |
| 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 字段中的算法对象标识符字段不等于 [RFC5480] 中定义的 id-ecPublicKey 对象标识符,则 抛出 一个 DataError。
如果 privateKeyInfo 的 privateKeyAlgorithm 字段中的 parameters 字段不存在,则 抛出 一个 DataError。
令 params 为 privateKeyInfo 的 privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 字段的 parameters 字段。
如果 params 不是 [RFC5480] 中定义的指定 namedCurve 的 ECParameters ASN.1 类型的实例,则抛出一个 DataError。
令 namedCurve 为一个字符串,其初始值为 undefined。
令 ecPrivateKey 为执行 解析 ASN.1 结构 算法的结果,将 privateKeyInfo 的 privateKey 字段作为 data,将 [RFC5915] 第 3 节中指定的 ASN.1 ECPrivateKey 结构作为 structure,并设置 exactData 为 true。
如果 ecPrivateKey 的 parameters 字段存在,且不是 [RFC5480] 中定义的 namedCurve ASN.1 类型的一个实例,或者不包含与 privateKeyInfo 的 privateKeyAlgorithm 字段中的 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 密钥 [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 为代表椭圆曲线公钥的 字节序列,该公钥由 key 的 [[handle]] 内部槽位根据 [SEC1] 第 2.3.3 节中指定的编码规则并使用未压缩形式表示。
[[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 为代表椭圆曲线公钥的 字节序列,该公钥由 key 的 [[handle]] 内部槽位根据 [SEC1] 第 2.3.3 节中指定的编码规则并使用未压缩形式表示。
执行由 其他适用规范 定义的任何 密钥导出步骤,传入 format 和 key 的 [[algorithm]] 内部槽位的 namedCurve 属性,并获取 namedCurve 和 data。
令 result 为 data。
返回 result。
本节是非规范性的。
"Ed25519" 算法标识符用于使用 [RFC8032] 中指定的 Ed25519 算法执行签名和验证。
该算法的 识别算法名称 为 "Ed25519"。
| 操作 | 参数 | 结果 |
|---|---|---|
| 符号 | 无 | byte sequence (字节序列) |
| verify(验证) | 无 | boolean |
| generateKey(生成密钥) | 无 | CryptoKeyPair |
| importKey(导入密钥) | 无 | CryptoKey |
| exportKey(导出密钥) | 无 | object |
如果 key 的 [[type]] 内部槽位不是 "private",则 抛出 一个 InvalidAccessError。
令 result 为执行 Ed25519 签名过程的结果,该过程如 [RFC8032] 第 5.1.6 节所指定,以 message 作为 M,并使用与 key 相关联的 Ed25519 私钥。
某些实现可能(希望)根据 draft-irtf-cfrg-det-sigs-with-noise 生成随机签名,而不是根据 [RFC8032] 生成确定性签名。
返回 result。
如果 key 的 [[type]] 内部槽位不是 "public",则 抛出 一个 InvalidAccessError。
如果 key 的键数据代表 Ed25519 椭圆曲线上的无效点或小阶元素,则返回 false。
并非所有实现都执行此检查。
如果编码在 signature 前半部分的点 R 代表 Ed25519 椭圆曲线上的无效点或小阶元素,则返回 false。
并非所有实现都执行此检查。
执行 Ed25519 验证步骤,如 [RFC8032] 第 5.1.7 节所指定,使用无辅因子(未批处理)方程 [S]B = R + [k]A',应用于 signature,以 message 作为 M,并使用与 key 相关联的 Ed25519 公钥。
令 result 为一个布尔值,如果签名有效则为 true,否则为 false。
返回 result。
如果 usages 包含一个不是“sign”或“verify”的值,则抛出一个 SyntaxError。
生成一个 Ed25519 密钥对,如 [RFC8032] 第 5.1.5 节所定义。
令 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 字段中的 algorithm AlgorithmIdentifier 字段的 algorithm 对象标识符字段不等于 [RFC8410] 中定义的 id-Ed25519 对象标识符,则 抛出 一个 DataError。
如果 spki 的 algorithm 字段中的 algorithm AlgorithmIdentifier 字段的 parameters 字段存在,则 抛出 一个 DataError。
令 publicKey 为 spki 的 subjectPublicKey 字段标识的 Ed25519 公钥。
令 key 为表示 publicKey 的新 CryptoKey。
将 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 为表示 curvePrivateKey 标识的 Ed25519 私钥的新 CryptoKey。
令 algorithm 为一个新的 KeyAlgorithm。
将 algorithm 的 name 属性设置为 "Ed25519"。
将 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。
d 字段存在令 algorithm 为 KeyAlgorithm 对象的一个新实例。
将 algorithm 的 name 属性设置为 "Ed25519"。
将 key 的 [[algorithm]] 内部槽位设置为 algorithm。
raw"如果 usages 包含一个不是“verify”的值,则抛出一个 SyntaxError。
令 algorithm 为一个新的 KeyAlgorithm 对象。
将 algorithm 的 name 属性设置为 "Ed25519"。
令 key 为一个表示 keyData 中提供的密钥数据的新 CryptoKey。
将 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 字段设置为 DER 编码 [RFC8410] 第 7 节中定义的 CurvePrivateKey ASN.1 类型的结果,该类型表示由 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 为表示由 key 的 [[handle]] 内部槽位所表示的 Ed25519 公钥的 字节序列。
令 result 为 data。
返回 result。
本节是非规范性的。
"X25519" 算法标识符用于使用 [RFC7748] 中指定的 X25519 算法执行密钥协商。
此算法的 可识别算法名称 是 "X25519"。
| 操作 | 参数 | 结果 |
|---|---|---|
| deriveBits(派生比特) | EcdhKeyDeriveParams |
byte sequence (字节序列) |
| 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。
生成一个 X25519 密钥对,私钥为 32 个随机字节,公钥为 [RFC7748] 第 6.1 节中定义的 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 字段中的 algorithm AlgorithmIdentifier 字段的 algorithm 对象标识符字段不等于 [RFC8410] 中定义的 id-X25519 对象标识符,则 抛出 一个 DataError。
如果 spki 的 algorithm 字段中的 algorithm AlgorithmIdentifier 字段的 parameters 字段存在,则 抛出 一个 DataError。
令 publicKey 为 spki 的 subjectPublicKey 字段标识的 X25519 公钥。
令 key 为表示 publicKey 的新 CryptoKey。
将 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 为表示 curvePrivateKey 标识的 X25519 私钥的新 CryptoKey。
令 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 为一个表示 keyData 中提供的密钥数据的新 CryptoKey。
将 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 字段设置为 DER 编码 [RFC8410] 第 7 节中定义的 CurvePrivateKey ASN.1 类型的结果,该类型表示由 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 为表示由 key 的 [[handle]] 内部槽位所表示的 X25519 公钥的 字节序列。
令 result 为 data。
返回 result。
本节是非规范性的。
"AES-CTR" 算法标识符用于使用 AES 在计数器模式下执行加密和解密,如 [NIST-SP800-38A] 中所述。
此算法的 可识别算法名称 是 "AES-CTR"。
| 操作 | 参数 | 结果 |
|---|---|---|
| encrypt(加密) | AesCtrParams |
byte sequence (字节序列) |
| decrypt(解密) | AesCtrParams |
byte sequence (字节序列) |
| generateKey(生成密钥) | AesKeyGenParams |
CryptoKey |
| importKey(导入密钥) | 无 | CryptoKey |
| exportKey(导出密钥) | 无 | object |
| get key length(获取密钥长度) | AesDerivedKeyParams |
Integer |
WebIDLdictionary AesCtrParams : Algorithm {
required BufferSource counter;
required [EnforceRange] octet length;
};
counter 成员包含计数器块的初始值。counter 必须为 16 字节(AES 块大小)。计数器位是计数器块中最右侧的位。计数器块的其余部分用于随机数。计数器位使用 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 加密操作的结果,其中使用 AES 作为分组密码,normalizedAlgorithm 的 counter 成员作为计数器块的初始值,normalizedAlgorithm 的 length 成员作为输入参数 m 传递给 [NIST-SP800-38A] 附录 B.1 中定义的标准计数器块增量函数,并以 plaintext 作为输入明文。
返回 ciphertext。
如果 normalizedAlgorithm 的 counter 成员的 长度 不是 16 字节,则 抛出 一个 OperationError。
如果 normalizedAlgorithm 的 length 成员为零或大于 128,则 抛出 一个 OperationError。
令 plaintext 为执行 [NIST-SP800-38A] 第 6.5 节中描述的 CTR 解密操作的结果,其中使用 AES 作为分组密码,normalizedAlgorithm 的 counter 成员作为计数器块的初始值,normalizedAlgorithm 的 length 成员作为输入参数 m 传递给 [NIST-SP800-38A] 附录 B.1 中定义的标准计数器块增量函数,并以 ciphertext 作为输入密文。
返回 plaintext。
如果 usages 包含任何不是 "encrypt"、"decrypt"、"wrapKey" 或 "unwrapKey" 之一的条目,则 抛出 一个 SyntaxError。
如果 normalizedAlgorithm 的 length 成员不等于 128、192 或 256 之一,则 抛出 一个 OperationError。
生成长度等于 normalizedAlgorithm 的 length 成员的 AES 密钥。
如果密钥生成步骤失败,则 抛出 一个 OperationError。
令 key 为表示所生成的 AES 密钥的新 CryptoKey 对象。
令 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"JsonWebKey 字典设 jwk 等于 keyData。
如果 jwk 不符合 JSON Web Algorithms [JWA] 第 6.4 节的要求,则 抛出 一个 DataError。
令 data 为通过解码 jwk 的 k 字段获得的 字节序列。
如果 jwk 的 key_ops 字段存在,且根据 JSON Web Key [JWK] 的要求无效或不包含所有指定的 usages 值,则 抛出 一个 DataError。
如果 jwk 的 ext 字段存在且值为 false,而 extractable 为 true,则 抛出 一个 DataError。
NotSupportedError。令 key 为一个表示值为 data 的 AES 密钥的新 CryptoKey 对象。
令 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" 算法标识符用于使用 AES 在密码块链接(CBC)模式下执行加密和解密,如 [NIST-SP800-38A] 中所述。
在 CBC 模式下运行时,非 AES 块大小(16 字节)精确倍数的消息可以使用各种填充方案进行填充。在 Web Crypto API 中,支持的唯一填充模式是 PKCS#7,如 [RFC2315] 第 10.3 节第 2 步中所述。
此算法的 可识别算法名称 是 "AES-CBC"。
| 操作 | 参数 | 结果 |
|---|---|---|
| encrypt(加密) | AesCbcParams |
byte sequence (字节序列) |
| decrypt(解密) | AesCbcParams |
byte sequence (字节序列) |
| generateKey(生成密钥) | AesKeyGenParams |
CryptoKey |
| importKey(导入密钥) | 无 | CryptoKey |
| exportKey(导出密钥) | 无 | object |
| get key length(获取密钥长度) | AesDerivedKeyParams |
Integer |
WebIDLdictionary AesCbcParams : Algorithm {
required BufferSource iv;
};
iv 成员表示初始化向量。它 必须为 16 字节。
如果 normalizedAlgorithm 的 iv 成员的 长度 不是 16 字节,则 抛出 一个 OperationError。
令 paddedPlaintext 为根据 [RFC2315] 第 10.3 节第 2 步中定义的程序向 plaintext 添加填充八位字节的结果,其中 k 的值为 16。
令 ciphertext 为执行 [NIST-SP800-38A] 第 6.2 节中描述的 CBC 加密操作的结果,其中使用 AES 作为分组密码,normalizedAlgorithm 的 iv 成员作为 IV 输入参数,paddedPlaintext 作为输入明文。
返回 ciphertext。
如果 normalizedAlgorithm 的 iv 成员的 长度 不是 16 字节,则 抛出 一个 OperationError。
如果 ciphertext 的长度为零或不是 16 字节的倍数,则 抛出 一个 OperationError。
令 paddedPlaintext 为执行 [NIST-SP800-38A] 第 6.2 节中描述的 CBC 解密操作的结果,其中使用 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 为表示所生成的 AES 密钥的新 CryptoKey 对象。
令 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"JsonWebKey 字典设 jwk 等于 keyData。
如果 jwk 不符合 JSON Web Algorithms [JWA] 第 6.4 节的要求,则 抛出 一个 DataError。
令 data 为通过解码 jwk 的 k 字段获得的 字节序列。
如果 jwk 的 key_ops 字段存在,且根据 JSON Web Key [JWK] 的要求无效或不包含所有指定的 usages 值,则 抛出 一个 DataError。
如果 jwk 的 ext 字段存在且值为 false,而 extractable 为 true,则 抛出 一个 DataError。
NotSupportedError令 key 为一个表示值为 data 的 AES 密钥的新 CryptoKey 对象。
令 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 (GCM) 模式下的 AES 执行认证加密和解密,如 [NIST-SP800-38D] 所述。
该算法的公认算法名称为 "AES-GCM"。
| 操作 | 参数 | 结果 |
|---|---|---|
| encrypt(加密) | AesGcmParams |
byte sequence (字节序列) |
| decrypt(解密) | AesGcmParams |
byte sequence (字节序列) |
| 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 为使用 AES 作为块密码,以 normalizedAlgorithm 的 iv 成员作为 IV 输入参数,additionalData 作为 A 输入参数,tagLength 作为 t 先决条件,以及 plaintext 作为输入明文,执行 [NIST-SP800-38D] 第 7.1 节所述的认证加密函数所产生的结果。
令 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 节所述的认证解密函数,使用 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 为表示生成的 AES 密钥的新 CryptoKey 对象。
令 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 为表示值 data 的 AES 密钥的新 CryptoKey 对象。
令 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(封装密钥) | 无 | byte sequence (字节序列) |
| unwrapKey(解封装密钥) | 无 | byte sequence (字节序列) |
| generateKey(生成密钥) | AesKeyGenParams |
CryptoKey |
| importKey(导入密钥) | 无 | CryptoKey |
| exportKey(导出密钥) | 无 | object |
| get key length(获取密钥长度) | AesDerivedKeyParams |
Integer |
如果 plaintext 的长度不是 64 位的倍数,则抛出一个 OperationError。
令 ciphertext 为使用 plaintext 作为要封装的明文,并使用同文档第 2.2.3.1 节定义的默认初始值,执行 [RFC3394] 第 2.2.1 节所述的密钥封装操作的结果。
返回 ciphertext。
令 plaintext 为使用 ciphertext 作为输入密文,并使用同文档第 2.2.3.1 节定义的默认初始值,执行 [RFC3394] 第 2.2.2 节所述的密钥解封装操作的结果。
如果密钥解封装操作返回错误,则抛出一个 OperationError。
返回 plaintext。
如果 usages 包含任何不是 "wrapKey" 或 "unwrapKey" 的条目,则抛出一个 SyntaxError。
如果 normalizedAlgorithm 的 length 属性不等于 128、192 或 256 中的一个,则抛出一个 OperationError。
生成长度等于 normalizedAlgorithm 的 length 成员的 AES 密钥。
如果密钥生成步骤失败,则 抛出 一个 OperationError。
令 key 为表示生成的 AES 密钥的新 CryptoKey 对象。
令 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 为一个表示值为 data 的 AES 密钥的新 CryptoKey。
令 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"。
| 操作 | 参数 | 结果 |
|---|---|---|
| 符号 | 无 | byte sequence (字节序列) |
| 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 为使用 key 的 [[handle]] 内部槽表示的密钥、由 key 的 [[algorithm]] 内部槽的 hash 属性标识的哈希函数,以及 message 作为输入数据 text,执行 [FIPS-198-1] 第 4 节所述的 MAC 生成操作的结果。
返回 mac。
令 mac 为使用 key 的 [[handle]] 内部槽表示的密钥、由 key 的 [[algorithm]] 内部槽的 hash 属性标识的哈希函数,以及 message 作为输入数据 text,执行 [FIPS-198-1] 第 4 节所述的 MAC 生成操作的结果。
如果 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 属性在另一个适用规范中定义如果 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]] 内部槽表示的密钥的原始位。
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。
本节是非规范性的。
这描述了由 [FIPS-180-4] 指定的 SHA-1 和 SHA-2 系列。
对应的公认算法名称为 "SHA-1"、"SHA-256"、"SHA-384" 和 "SHA-512"。
| 操作 | 参数 | 结果 |
|---|---|---|
| digest(摘要) | 无 | byte sequence (字节序列) |
name 成员是区分大小写的字符串匹配 "SHA-1"name 成员是区分大小写的字符串匹配 "SHA-256"name 成员是区分大小写的字符串匹配 "SHA-384"name 成员是区分大小写的字符串匹配 "SHA-512"如果执行该操作导致错误,则 抛出 OperationError。
返回 result。
本节是非规范性的。
"HKDF" 算法标识符用于使用 [RFC5869] 中描述的提取然后扩展方法,并使用本规范中定义的 SHA 哈希函数执行密钥派生。
其他规范可以指定将额外的哈希算法与 HKDF 一起使用。此类规范必须定义额外哈希算法的摘要操作。
该算法的公认算法名称为 "HKDF"。
| 操作 | 参数 | 结果 |
|---|---|---|
| deriveBits(派生比特) | HkdfParams |
byte sequence (字节序列) |
| importKey(导入密钥) | 无 | CryptoKey |
| 获取密钥长度 | 无 | 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 为一个表示 keyData 中提供的密钥数据的新 CryptoKey 对象。
令 algorithm 为一个新的 KeyAlgorithm 对象。
将 algorithm 的 name 属性设置为 "HKDF"。
将 key 的 [[algorithm]] 内部槽设置为 algorithm。
返回 key。
NotSupportedError。返回 null。
本节是非规范性的。
"PBKDF2" 算法标识符用于根据 [RFC8018],使用 HMAC 作为伪随机函数,并使用本规范中定义的 SHA 哈希函数执行基于密码的密钥派生函数 2 (PKCS#5) 的密钥派生。
其他规范可以指定将额外的哈希算法与 PBKDF2 一起使用。此类规范必须定义额外哈希算法的摘要操作。
该算法的公认算法名称为 "PBKDF2"。
| 操作 | 参数 | 结果 |
|---|---|---|
| deriveBits(派生比特) | Pbkdf2Params |
byte sequence (字节序列) |
| importKey(导入密钥) | 无 | CryptoKey |
| 获取密钥长度 | 无 | 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 为使用由 normalizedAlgorithm 的 hash 成员描述的哈希函数,执行 [FIPS-198-1] 第 4 节中所述的 MAC 生成函数。
令 result 为使用 prf 作为伪随机函数 PRF,以 key 的 [[handle]] 内部槽表示的密码作为密码 P,以 normalizedAlgorithm 的 salt 属性作为盐 S,以 normalizedAlgorithm 的 iterations 属性的值作为迭代次数 c,以及 length 除以 8 作为预期密钥长度 dkLen,执行 [RFC8018] 第 5.2 节中定义的 PBKDF2 操作的结果。
如果密钥派生操作失败,则抛出一个 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 密钥,并用它加密和解密一些数据。
// Generate a key pair for Alice.
const alice_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const alice_private_key = alice_x25519_key.privateKey;
// Normally, the public key would be sent by Bob to Alice in advance over some authenticated channel.
// In this example, we'll generate another key pair and use its public key instead.
const bob_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const bob_public_key = bob_x25519_key.publicKey;
// Perform the key agreement.
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']);
// Derive a symmetric key from the result.
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']);
// Encrypt some data with the symmetric key, and send it to Bob. The IV must be passed along as well.
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);
// On Bob's side, Alice's public key and Bob's private key are used, instead.
// To get the same result, Alice and Bob must agree on using the same salt and 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']);
// On Bob's side, the data can be decrypted.
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 注册表中注册了以下算法标识符,供 JSON Web Key 使用。请注意,模板中的“实现要求”字段特别指代与 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 工作组,以及 public-webcrypto@w3.org 邮件列表的参与者。
W3C 谨感谢 Northrop Grumman Cybersecurity Research Consortium 对 W3C/MIT 的支持。
getRandomValues 接口中的 Crypto 方法最初由 Adam Barth 向 WHATWG 提出。
本节是非规范性的。
有关导入和导出 JWK 的规范性要求,请参阅算法特定的章节。
| JSON Web Key | AlgorithmIdentifier |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
本节是非规范性的。
有关导入和导出 SPKI 的规范性要求,请参阅算法特定的章节。
| 算法 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] |
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自