W3C First Public Working Draft
Copyright © 2025World Wide Web Consortium.W3C®liability,trademark andpermissive document license rules apply.
This specification describes a JavaScript API for performing basic cryptographic operations in web applications, such as hashing, signature generation and verification, and encryption and decryption. Additionally, it describes an API for applications to generate and/or manage the keying material necessary to perform these operations. Uses for this API range from user or service authentication, document or code signing, and the confidentiality and integrity of communications.
This section describes the status of this document at the time of its publication. A list of currentW3C publications and the latest revision of this technical report can be found in theW3C standards and drafts index at https://www.w3.org/TR/.
This document was published by theWeb Application Security Working Group as a First Public Working Draft using theRecommendation track.
Publication as a First Public Working Draft does not imply endorsement byW3C and its Members.
This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under theW3C Patent Policy.W3C maintains apublic list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes containsEssential Claim(s) must disclose the information in accordance withsection 6 of theW3C Patent Policy.
This document is governed by the03 November 2023W3C Process Document.
This section is non-normative.
The Web Cryptography API defines a low-level interface to interacting with cryptographic key material that is managed or exposed by user agents. The API itself is agnostic of the underlying implementation of key storage, but provides a common set of interfaces that allow rich web applications to perform operations such as signature generation and verification, hashing and verification, encryption and decryption, without requiring access to the raw keying material.
Cryptographic transformations are exposed via theSubtleCrypto
interface, which defines a set of methods for performing common cryptographic operations. In addition to operations such as signature generation and verification, hashing and verification, and encryption and decryption, the API provides interfaces for key generation, key derivation and key import and export.
This section is non-normative.
A web application may wish to extend or replace existing username/password based authentication schemes with authentication methods based on proving that the user has access to some secret keying material. Rather than using transport-layer authentication, such as TLS client certificates, the web application may prefer the richer user experience provided by authenticating within the application itself.
Using the Web Cryptography API, the application could locate suitable client keys, which may have been previously generated via the user agent or pre-provisioned out-of-band by the web application. It could then perform cryptographic operations such as decrypting an authentication challenge followed by signing an authentication response.
This exchange could be further strengthened by binding the authentication to the TLS session over which the client is authenticating, by deriving a key based on properties of the underlying transport.
If a user does not already have a key associated with their account, the web application could direct the user agent to either generate a new key or to re-use an existing key of the user's choice.
A web application may wish to limit the viewership of documents that contain sensitive or personal information, even when these documents have been securely received, such as over TLS.
Using the Web Cryptography API, the application could do so by encrypting the documents with a secret key, and then wrapping that key with the public keys associated with the authorized viewers. When a user agent navigates to such a web application, the application would send the encrypted form of the document. The user agent is then instructed to unwrap the encryption key, using the user's private key, and from there, decrypt and display the document.
A web application may wish to permit users to protect the confidentiality of data and documents stored with remote service providers prior to uploading.
Using the Web Cryptography API, the application may have a user select a private or secret key, optionally derive an encryption key from the selected key, encrypt the document, and then upload the encrypted data to the service provider using existing APIs.
This use case is similar to theProtected Document Exchange use case, with viewership of the document limited to the user themself.
A web application may wish to accept electronic signatures on documents, in lieu of requiring physical signatures.
Using the Web Cryptography API, the application may direct the user to select a key, which may have been pre-provisioned out-of-band, or generated specifically for the web application. Using this key, the application may perform a signing operation over some data, as proof that the user accepts the document.
A web application may wish to cache data locally, while ensuring that this data cannot be modified in an offline attack.
Using the Web Cryptography API, the application may use a public key contained within the application to verify the contents of the data cache. Previously, when data was added to the cache, it would have been signed by the server with the corresponding private key. By validating the signature when restoring data from the cache, the client ensures that the cached data has not been tampered with.
A web application may wish to employ message layer security using schemes such as off-the-record (OTR) messaging, even when these messages have been securely received, such as over TLS.
The Web Cryptography API enables OTR and similar message signing schemes, by allowing key agreement to be performed. The two parties can negotiate shared encryption keys and message authentication code (MAC) keys, to allow encryption and decryption of messages, and to prevent tampering.
A web application may wish to interact with the structures and message formats defined by the IETF JavaScript Object Signing and Encryption (JOSE) Working Group.
Using the Web Cryptography API, the application may read and import keys encoded in the JSON key format (JWK), validate messages that have been integrity protected using digital signatures or MACs (JWS), or decrypt messages that have been encrypted (JWE).
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key wordsMUST,REQUIRED, andSHALL in this document are to be interpreted as described inBCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
The following conformance classes are defined by this specification:
A user agent is considered to be aconforming user agent if it satisfies all of theMUST-,REQUIRED- andSHALL-level criteria in this specification that apply to implementations. This specification uses both the terms "conforming user agent" and "user agent" to refer to this product class.
Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent. (In particular, the algorithms defined in this specification are intended to be easy to follow, and not intended to be performant.)
User agents that use ECMAScript to implement the APIs defined in this specificationMUST implement them in a manner consistent with the ECMAScript Bindings defined in the Web IDL specification [WebIDL] as this specification uses that specification and terminology.
Unless otherwise stated, string comparisons are done in acase-sensitive manner. String literals in this specification written in monospace font like "this
" do not include the enclosing quotes.
Vendor-specific proprietary extensions to this specification are strongly discouraged. Authors must not use such extensions, as doing so reduces interoperability and fragments the user base, allowing only users of specific user agents to access the content in question.
If vendor-specific extensions are needed, the members should be prefixed by vendor-specific strings to prevent clashes with future versions of this specification. Extensions must be defined so that the use of extensions neither contradicts nor causes the non-conformance of functionality defined in the specification.
When vendor-neutral extensions to this specification are needed, either this specification can be updated accordingly, or an extension specification can be written that overrides the requirements in this specification. When someone applying this specification to their activities decides that they will recognize the requirements of such an extension specification, it becomes anapplicable specification for the purposes of conformance requirements in this specification. Applicable specifications defined by theW3C Web Cryptography Working Group are listed in the table below.
Specification | Reference |
This section is non-normative.
The specification attempts to focus on the common functionality and features between various platform-specific or standardized cryptographic APIs, and avoid features and functionality that are specific to one or two implementations. As such this API allows key generation, management, and exchange with a level of abstraction that avoids developers needing to care about the implementation of the underlying key storage. The API is focused specifically around CryptoKey objects, as an abstraction for the underlying raw cryptographic keying material. The intent behind this is to allow an API that is generic enough to allow conforming user agents to expose keys that are stored and managed directly by the user agent, that may be stored or managed using isolated storage APIs such as per-user key stores provided by some operating systems, or within key storage devices such as secure elements, while allowing rich web applications to manipulate the keys and without requiring the web application be aware of the nature of the underlying key storage.
Because the underlying cryptographic implementations will vary between conforming user agents, and may be subject to local policy, including but not limited to concerns such as government or industry regulation, security best practices, intellectual property concerns, and constrained operational environments, this specification does not dictate a mandatory set of algorithms thatMUST be implemented. Instead, it defines a common set of bindings that can be used in an algorithm-independent manner, a common framework for discovering if a user agent or key handle supports the underlying algorithm, and a set of conformance requirements for the behaviors of individual algorithms, if implemented.
This API, while allowing applications to generate, retrieve, and manipulate keying material, does not specifically address the provisioning of keys in particular types of key storage, such as secure elements or smart cards. This is due to such provisioning operations often being burdened with vendor-specific details that make defining a vendor-agnostic interface an unsuitably unbounded task. Additionally, this API does not deal with or address the discovery of cryptographic modules, as such concepts are dependent upon the underlying user agent and are not concepts that are portable between common operating systems, cryptographic libraries, and implementations.
This section is non-normative.
This specification assumes, but does not require, that conforming user agents do not and will not be directly implementing cryptographic operations within the user agent itself. Historically, many user agents have deferred cryptographic operations, such as those used within TLS, to existing APIs that are available as part of the underlying operating system or to third-party modules that are managed independently of the user agent.
TheCryptoKey
object represents the bridge between the JavaScript execution environment and these underlying libraries, through the use of the internal slot named[[handle]]
. The handle represents an opaque type that is implementation specific, which may not be represented within a JavaScript type, nor is it ever exposed to script authors. In this way, theCryptoKey
object is the conceptual equivalent to the JavaScript executing environment as the[[handle]]
is to the underlying cryptographic implementation.
These APIs are traditionally built around a notion of cryptographic providers, an abstraction for a specific implementation of a set of algorithms. The operating system or library may come with a default provider, and users are frequently allowed to add additional providers, reconfigure the set of enabled algorithms, or otherwise customize how cryptographic services are provided.
While it is assumed that most user agents will be interacting with a cryptographic provider that is implemented purely in software, it is not required by this specification. As a result, the capabilities of some implementations may be limited by the capabilities of the underlying hardware, and, depending on how the user has configured the underlying cryptographic library, this may be entirely opaque to the User Agent.
This specification does not explicitly provide any new storage mechanisms forCryptoKey
objects. Instead, by definingserialization and deserialization steps forCryptoKey
objects, any existing or future web storage mechanisms that support storingserializable objects can be used to storeCryptoKey
objects.
In practice, it is expected that most authors will make use of the Indexed Database API [INDEXEDDB], which allows associative storage of key/value pairs, where the key is some string identifier meaningful to the application, and the value is aCryptoKey
object. This allows the storage and retrieval of key material, without ever exposing that key material to the application or the JavaScript environment. Additionally, this allows authors the full flexibility to store any additional metadata with theCryptoKey
itself.
This section is non-normative.
By not providing an explicit storage mechanism, this specification assumes thatCryptoKey
objects are scoped to the current execution environment and any storage mechanisms available to that environment (e.g. Indexed Database API). Application authors rely upon this for the security of their applications; two origins with the sameCryptoKey
object have full access to the underlying key, and as such, messages from these applications cannot be distinguished, and messages sent to these applications can be fully recovered. Implementors should ensure that noCryptoKey
objects are shared between two origins unless the author has explicitly chosen to share (e.g., such as through the use of postMessage)
A number of algorithms specified within this specification perform computationally intensive work, such as the generation of significantly large prime numbers, or through repeated iterations of a particular operation. As such, hostile applications may attempt to misuse this API and attempt to cause significant amount of work to be performed by an implementation, denying access or services to other applications that are executing. Implementations should take steps to mitigate these risks, such as limiting the amount of operations an implementation performs concurrently, requiring user consent for operations that may be known to be disruptive for the executing environment, or defining device-specific limits on attributes such as key sizes or iteration counts.
This specification includes descriptions for a variety of cryptographic operations, some of which have known weaknesses when used inappropriately. Application developers must take care and review appropriate and current cryptographic literature, to understand and mitigate such issues. In general, application developers arestrongly discouraged from inventing new cryptographic protocols; as with all applications, users of this specification will be best served through the use of existing protocols, of which this specification provides the necessary building blocks to implement.
In order to use the APIs defined in this specification to provide any meaningful cryptographic assurances, authors must be familiar with existing threats to web applications, as well as the underlying security model employed. Conceptually, issues such as script injection are the equivalent to remote code execution in other operating environments, and allowing hostile script to be injected may allow for the exfiltration of keys or data. Script injection may come from other applications, for which the judicious use of Content Security Policy may mitigate, or it may come from hostile network intermediaries, for which the use of Transport Layer Security may mitigate.
This specification does not define any specific mechanisms for the storage of cryptographic keys. By default, unless specific effort is taken by the author to persist keys, such as through the use of the Indexed Database API, keys created with this API will only be valid for the duration of the current page (e.g. until a navigation event). Authors that wish to use the same key across different pages or multiple browsing sessions must employ existing web storage technologies. Authors should be aware of the security assumptions of these technologies, such as the same-origin security model; that is, any application that shares the same scheme, host, and port have access to the same storage partition, even if other information, such as the path, may differ. Authors may explicitly choose to relax this security through the use of inter-origin sharing, such aspostMessage
.
Authors should be aware that this specification places no normative requirements on implementations as to how the underlying cryptographic key material is stored. The only requirement is that key material is not exposed to script, except through the use of theexportKey
andwrapKey
operations. In particular, it does not guarantee that the underlying cryptographic key material will not be persisted to disk, possibly unencrypted, nor that it will be inaccessible to users or other applications running with the same privileges as the User Agent. Any application or user that has access to the device storage may be able to recover the key material, even through scripts may be prohibited.
This specification places no normative requirements on how implementations handle key material once all references to it go away. That is, conforming user agents are not required to zeroize key material, and it may still be accessible on device storage or device memory, even after all references to theCryptoKey
have gone away.
Applications may share aCryptoKey
object across security boundaries, such as origins, through the use of the structured clone algorithm and APIs such aspostMessage
. While access to the underlying cryptographic key material may be restricted, based upon theextractable
attribute, once a key is shared with a destination origin, the source origin can not later restrict or revoke access to the key. As such, authors must be careful to ensure they trust the destination origin to take the same mitigations against hostile script that the source origin employs. Further, in the event of script injection on the source origin, attackers may post the key to an origin under attacker control. Any time that the user agent visits the attacker's origin, the user agent may be directed to perform cryptographic operations using that key, such as the decryption of existing messages or the creation of new, fraudulent messages.
Authors should be aware that users may, at any time, choose to clear the storage associated with an origin, potentially destroying keys. Applications that are meant to provide long-term storage, such as on the server, should consider techniques such as key escrow to prevent such data from being inaccessible. Authors should not presume that keys will be available indefinitely.
Users of applications that employ the APIs defined in this specification should be aware that these applications will have full access to all messages exchanged, regardless of the cryptography employed. That is, for messages that are encrypted, applications that use these APIs will have full access to the decrypted message as well.
This section is non-normative.
randomUUID
as user IDrandomUUID
is useful for generatinguser IDs, but does not directly give any ability to generateglobal identifiers.This specification relies on underlying specifications.
Aconforming user agentMUST support at least the subset of the functionality defined in DOM that this specification relies upon; in particular, itMUST supportPromise
s andDOMException
. [DOM]
Aconforming user agentMUST support at least the subset of the functionality defined in HTML that this specification relies upon; in particular, itMUST support theArrayBufferView
typedef andserializable objects. [HTML]
Aconforming user agentMUST be a conforming implementation of the IDL fragments in this specification, as described in the Web IDL specification. [WebIDL]
The termsArrayBuffer
,ArrayBufferView
, andserializable objects, are defined by the HTML specification [HTML].
The termsDOMString
andBufferSource
are defined in [WEBIDL].
The termbyte sequence is defined in [Infra].
Thelength in bits of abyte sequence is itslength multiplied by 8.
Abyte sequence containing a bit sequenceb is thebyte sequence obtained by first appending zero or more bits of value zero tob such that the length of the resulting bit sequence is minimal and an integer multiple of 8 and then considering each consecutive sequence of 8 bits in that string as a byte.
When this specification says toconvert a non-negative integeri to a byte sequence of lengthn, wheren * 8 is greater than the logarithm to base 2 ofi, the user agent must first calculate the binary representation ofi, most significant bit first, prefix this with sufficient zero bits to form a bit sequence of lengthn * 8, and then return thebyte sequence formed by considering each consecutive sequence of 8 bits in that bit sequence as a byte.
Comparing two strings in acase-sensitive manner means comparing them exactly, code point for code point.
Comparing two strings in aASCII case-insensitive manner means comparing them exactly, code point for code point, except that the codepoints in the range U+0041 .. U+005A (i.e. LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z) and the corresponding codepoints in the range U+0061 .. U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL LETTER Z) are also considered to match.
When this specification says toterminate the algorithm, the user agent must terminate the algorithm after finishing the step it is on. The algorithm referred to is the set of specification-defined processing steps, rather than the underlying cryptographic algorithm that may be in the midst of processing.
When this specification says toparse an ASN.1 structure, the user agent must perform the following steps:
Letdata be a sequence of bytes to be parsed.
Letstructure be the ASN.1 structure to be parsed.
LetexactData be an optional boolean value. If it is not supplied, let it be initialized totrue
.
Parsedata according to the Distinguished Encoding Rules of [X690], usingstructure as the ASN.1 structure to be decoded.
IfexactData was specified, and all of the bytes ofdata were not consumed during the parsing phase, thenthrow aDataError
.
Return the parsed ASN.1 structure.
When this specification says toparse a subjectPublicKeyInfo, the user agent mustparse an ASN.1 structure, withdata set to the sequence of bytes to be parsed,structure as the ASN.1 structure of subjectPublicKeyInfo, as specified in [RFC5280], andexactData set totrue
.
When this specification says toparse a PrivateKeyInfo, the user agent mustparse an ASN.1 structure withdata set to the sequence of bytes to be parsed,structure as the ASN.1 structure of PrivateKeyInfo, as specified in [RFC5208], andexactData set totrue
.
When this specification says toparse a JWK, the user agent must run the following steps:
Letdata be the sequence of bytes to be parsed.
Letjson be the Unicode string that results from interpretingdata according to UTF-8.
Convertjson to UTF-16.
Letresult be the object literal that results from executing theJSON.parse
internal function in the context of a new global object, withtext
argument set to a JavaScript String containingjson.
Letkey be the result of convertingresult to the IDL dictionary type ofJsonWebKey
.
Returnkey.
When this specification says to calculate theusage intersection of two sequences,a andb the result shall be a sequence containing eachrecognized key usage value that appears in botha andb, in the order listed in the list ofrecognized key usage values, where a value is said to appear in a sequence if an element of the sequence exists that is a case-sensitive string match for that value.
When this specification says to calculate the normalized value of a usages list,usages the result shall be theusage intersection ofusages and a sequence containing allrecognized key usage values.
When this specification refers to thecached ECMAScript object associated with an internal slot [[slot]] ofobject, the user agent must run the following steps:
TheCrypto
interface represents an interface to general purpose cryptographic functionality including a cryptographically strong pseudo-random number generator seeded with truly random values.
WebIDLpartial interface mixinWindowOrWorkerGlobalScope { [SameObject] readonly attributeCrypto
crypto
;};[Exposed=(Window,Worker)]interfaceCrypto
{ [SecureContext] readonly attributeSubtleCrypto
subtle
;ArrayBufferViewgetRandomValues
(ArrayBufferViewarray); [SecureContext]DOMStringrandomUUID
();};
ThegetRandomValues
method generates cryptographically strong random values. It must act as follows:
Ifarray is not anInt8Array
,Uint8Array
,Uint8ClampedArray
,Int16Array
,Uint16Array
,Int32Array
,Uint32Array
,BigInt64Array
, orBigUint64Array
, thenthrow aTypeMismatchError
andterminate the algorithm.
LetbyteLength be thebyte length ofarray.
IfbyteLength is greater than 65536,throw aQuotaExceededError
andterminate the algorithm.
Letbytes be abyte sequence of lengthbyteLength.
Fillbytes with cryptographically secure random bytes.
Writebytes intoarray.
Returnarray.
Do not generate keys using thegetRandomValues
method. Use thegenerateKey
method instead.
TherandomUUID
method generates a newversion 4 UUID and returns itsnamespace specific string representation as described insection 3 of [RFC4122]. Togenerate a random UUID:
0100
.10
.Return thestring concatenation of «
-
",-
",-
",-
",».
For the steps described in the algorithm togenerate a random UUID, thehexadecimal representation of a bytevalue is the two-character string created by expressingvalue in hexadecimal usingASCII lower hex digits, left-padded with "0
" to reach twoASCII lower hex digits.
Thesubtle
attribute provides an instance of theSubtleCrypto
interface which provides low-level cryptographic primitives and algorithms.
TheAlgorithm
object is a dictionary object [WEBIDL] which is used to specify an algorithm and any additional parameters required to fully specify the desired operation.
WebIDLtypedef (object orDOMString)AlgorithmIdentifier
;typedefAlgorithmIdentifier
HashAlgorithmIdentifier
;dictionaryAlgorithm
{ requiredDOMStringname
;};
Algorithm
Dictionary Membersname
TheKeyAlgorithm
dictionary represents information about the contents of a givenCryptoKey
object.
WebIDLdictionaryKeyAlgorithm
{ requiredDOMStringname
;};
This section is non-normative.
TheKeyAlgorithm
dictionary is provided to aid in documenting how fixed, public properties of aCryptoKey
are reflected back to an application. The actual dictionary type is never exposed to applications.
name
CryptoKey
TheCryptoKey
object represents an opaque reference to keying material that is managed by the user agent.
WebIDLenumKeyType
{"public
","private
","secret
" };enumKeyUsage
{"encrypt
","decrypt
","sign
","verify
","deriveKey
","deriveBits
","wrapKey
","unwrapKey
" };[SecureContext,Exposed=(Window,Worker),Serializable]interfaceCryptoKey
{ readonly attributeKeyType
type
; readonly attributebooleanextractable
; readonly attributeobjectalgorithm
; readonly attributeobjectusages
;};
This section is non-normative.
This specification provides a uniform interface for many different kinds of keying material managed by the user agent. This may include keys that have been generated by the user agent, derived from other keys by the user agent, imported to the user agent through user actions or using this API, pre-provisioned within software or hardware to which the user agent has access or made available to the user agent in other ways. The term key refers broadly to any keying material including actual keys for cryptographic operations and secret values obtained within key derivation or exchange operations.
The CryptoKey object is not required to directly interface with the underlying key storage mechanism, and may instead simply be a reference for the user agent to understand how to obtain the keying material when needed, e.g. when performing a cryptographic operation.
KeyType
public
", "private
" and "secret
". Opaque keying material, including that used for symmetric algorithms, is represented bysecret
, while keys used as part of asymmetric algorithms composed of public/private keypairs will be eitherpublic
orprivate
.KeyUsage
encrypt
,decrypt
,sign
,verify
,deriveKey
,deriveBits
,wrapKey
andunwrapKey
. EveryCryptoKey
object has a set of internal slots that store information about the key. These slots are not exposed as part of this specification; they represent internal state that an implementation uses to implement this specification. The notational convention used in [ECMA-262] is re-used here; internal slots are identified by names enclosed in double square brackets [[ ]].
AllCryptoKey
objects have internal slots named[[type]],[[extractable]],[[algorithm]],[[algorithm_cached]],[[usages]],[[usages_cached]], and[[handle]].
The contents of the[[algorithm]]
internal slot shall be, or be derived from, aKeyAlgorithm
. The contents of the[[usages]]
internal slot shall be of type Sequence<KeyUsage>.
The[[handle]]
slot is an opaque type that contains whatever data the underlying cryptographic implementation uses to represent a logical key. Different cryptographic implementations may use different types, ranging from opaque identifiers represented as integers, pointer types, or structures that provide identifying information. These handles are never exposed to applications.
type
[[type]]
internal slot, which contains the type of the underlying key.extractable
[[extractable]]
internal slot, which indicates whether or not the raw keying material may be exported by the application.algorithm
[[algorithm]]
internal slot.usages
[[usages]]
internal slot, which indicates which cryptographic operations are permissible to be used with this key.CryptoKey
objects areserializable objects. Theirserialization steps, givenvalue andserialized, are:
[[type]]
internal slot ofvalue.[[extractable]]
internal slot ofvalue.[[algorithm]]
internal slot ofvalue.[[usages]]
internal slot ofvalue.[[handle]]
internal slot ofvalue.Theirdeserialization steps, givenserialized andvalue, are:
[[type]]
internal slot ofvalue toserialized.[[Type]].[[extractable]]
internal slot ofvalue toserialized.[[Extractable]].[[algorithm]]
internal slot ofvalue to thesub-deserialization ofserialized.[[Algorithm]].[[usages]]
internal slot ofvalue to thesub-deserialization ofserialized.[[Usages]].[[handle]]
internal slot ofvalue toserialized.[[Handle]].CryptoKey
object, it is important that the object is not deserialized as a different type. This is normatively required by the definition of thedeserialization steps, but it merits specific attention, as such deserialization may expose the contents of the key material, which in some cases (such as when the[[extractable]]
internal slot is false) should not be exposed to applications. TheSubtleCrypto
interface provides a set of methods for dealing with low-level cryptographic primitives and algorithms.
WebIDLenumKeyFormat
{"raw
","spki
","pkcs8
","jwk
" };[SecureContext,Exposed=(Window,Worker)]interfaceSubtleCrypto
{Promise<ArrayBuffer>encrypt
(AlgorithmIdentifier
algorithm,CryptoKey
key,BufferSourcedata );Promise<ArrayBuffer>decrypt
(AlgorithmIdentifier
algorithm,CryptoKey
key,BufferSourcedata );Promise<ArrayBuffer>sign
(AlgorithmIdentifier
algorithm,CryptoKey
key,BufferSourcedata );Promise<boolean>verify
(AlgorithmIdentifier
algorithm,CryptoKey
key,BufferSourcesignature,BufferSourcedata );Promise<ArrayBuffer>digest
(AlgorithmIdentifier
algorithm,BufferSourcedata );Promise<(CryptoKey
orCryptoKeyPair
)>generateKey
(AlgorithmIdentifier
algorithm,booleanextractable,sequence<KeyUsage
>keyUsages );Promise<CryptoKey
>deriveKey
(AlgorithmIdentifier
algorithm,CryptoKey
baseKey,AlgorithmIdentifier
derivedKeyType,booleanextractable,sequence<KeyUsage
>keyUsages );Promise<ArrayBuffer>deriveBits
(AlgorithmIdentifier
algorithm,CryptoKey
baseKey, optionalunsigned long?length = null );Promise<CryptoKey
>importKey
(KeyFormat
format, (BufferSource orJsonWebKey
)keyData,AlgorithmIdentifier
algorithm,booleanextractable,sequence<KeyUsage
>keyUsages );Promise<(ArrayBuffer orJsonWebKey
)>exportKey
(KeyFormat
format,CryptoKey
key );Promise<ArrayBuffer>wrapKey
(KeyFormat
format,CryptoKey
key,CryptoKey
wrappingKey,AlgorithmIdentifier
wrapAlgorithm );Promise<CryptoKey
>unwrapKey
(KeyFormat
format,BufferSourcewrappedKey,CryptoKey
unwrappingKey,AlgorithmIdentifier
unwrapAlgorithm,AlgorithmIdentifier
unwrappedKeyAlgorithm,booleanextractable,sequence<KeyUsage
>keyUsages );};
TheSubtleCrypto
interface is named "SubtleCrypto" to reflect the fact that many of these algorithms have subtle usage requirements in order to provide the required algorithmic security guarantees.
For example, the direct use of an unauthenticated encryption scheme, such asAES in counter mode, gives potential attackers the ability to manipulate bits in the output by manipulating bits in the input, compromising the integrity of the message. However, AES-CTR can be used securely in combination with other cryptographic primitives, such as message authentication codes, to ensure the integrity of the protected message, but only when the message authentication code is constructed over the encrypted message and IV.
Developers making use of the SubtleCrypto interface are expected to be aware of the security concerns associated with both the design and implementation of the various algorithms provided. The raw algorithms are provided in order to allow developers maximum flexibility in implementing a variety of protocols and applications, each of which may represent the composition and security parameters in a unique manner that necessitate the use of the raw algorithms.
KeyFormat
raw
pkcs8
spki
jwk
JsonWebKey
dictionary encoded as a JavaScript objectSubtleCrypto
.SubtleCrypto
, neither between multiple calls, nor between calls and tasks from othertask sources. This task source is merely used toqueue a task to resolve or reject the relevant promise whenever the cryptographic operation is completed, in order toprevent race conditions.All errors are reported asynchronously by rejecting the returned Promise. This includes Web IDL type mapping errors.
Theencrypt
method returns a new Promise object that will encrypt data using the specifiedAlgorithmIdentifier
with the suppliedCryptoKey
. It must act as follows:
Letalgorithm andkey be thealgorithm
andkey
parameters passed to theencrypt
()
method, respectively.
Letdata be the result ofgetting a copy of the bytes held by thedata
parameter passed to theencrypt
()
method.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "encrypt
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofkey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofkey does not contain an entry that is "encrypt
", thenthrow anInvalidAccessError
.
Letciphertext be the result of performing the encrypt operation specified bynormalizedAlgorithm usingalgorithm andkey and withdata asplaintext.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result ofcreating anArrayBuffer
inrealm, containingciphertext.
Resolvepromise withresult.
Thedecrypt
method returns a new Promise object that will decrypt data using the specifiedAlgorithmIdentifier
with the suppliedCryptoKey
. It must act as follows:
Letalgorithm andkey be thealgorithm
andkey
parameters passed to thedecrypt
()
method, respectively.
Letdata be the result ofgetting a copy of the bytes held by thedata
parameter passed to thedecrypt
()
method.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "decrypt
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofkey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofkey does not contain an entry that is "decrypt
", thenthrow anInvalidAccessError
.
Letplaintext be the result of performing the decrypt operation specified bynormalizedAlgorithm usingkey andalgorithm and withdata asciphertext.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result ofcreating anArrayBuffer
inrealm, containingplaintext.
Resolvepromise withresult.
Thesign
method returns a new Promise object that will sign data using the specifiedAlgorithmIdentifier
with the suppliedCryptoKey
. It must act as follows:
Letalgorithm andkey be thealgorithm
andkey
parameters passed to thesign
()
method, respectively.
Letdata be the result ofgetting a copy of the bytes held by thedata
parameter passed to thesign
()
method.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "sign
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofkey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofkey does not contain an entry that is "sign
", thenthrow anInvalidAccessError
.
Letsignature be the result of performing the sign operation specified bynormalizedAlgorithm usingkey andalgorithm and withdata asmessage.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result ofcreating anArrayBuffer
inrealm, containingsignature.
Resolvepromise withresult.
Theverify
method returns a new Promise object that will verify data using the specifiedAlgorithmIdentifier
with the suppliedCryptoKey
. It must act as follows:
Letalgorithm andkey be thealgorithm
andkey
parameters passed to theverify
()
method, respectively.
Letsignature be the result ofgetting a copy of the bytes held by thesignature
parameter passed to theverify
()
method.
Letdata be the result ofgetting a copy of the bytes held by thedata
parameter passed to theverify
()
method.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "verify
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofkey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofkey does not contain an entry that is "verify
", thenthrow anInvalidAccessError
.
Letresult be the result of performing the verify operation specified bynormalizedAlgorithm usingkey,algorithm andsignature and withdata asmessage.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Resolvepromise withresult.
Thedigest
method returns a new Promise object that will digest data using the specifiedAlgorithmIdentifier
. It must act as follows:
Letalgorithm be thealgorithm
parameter passed to thedigest
()
method.
Letdata be the result ofgetting a copy of the bytes held by thedata
parameter passed to thedigest
()
method.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "digest
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
Letdigest be the result of performing the digest operation specified bynormalizedAlgorithm usingalgorithm, withdata asmessage.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result ofcreating anArrayBuffer
inrealm, containingdigest.
Resolvepromise withresult.
When invoked,generateKey
MUST perform the following steps:
Letalgorithm,extractable andusages be thealgorithm
,extractable
andkeyUsages
parameters passed to thegenerateKey
()
method, respectively.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "generateKey
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
Letresult be the result of performing the generate key operation specified bynormalizedAlgorithm usingalgorithm,extractable andusages.
CryptoKey
object: If the[[type]]
internal slot ofresult is "secret
" or "private
" andusages is empty, thenthrow aSyntaxError
.
CryptoKeyPair
object: If the[[usages]]
internal slot of theprivateKey
attribute ofresult is the empty sequence, thenthrow aSyntaxError
.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result of convertingresult to an ECMAScript Object inrealm, as defined by [WebIDL].
Resolvepromise withresult.
When invoked,deriveKey
MUST perform the following steps:
Letalgorithm,baseKey,derivedKeyType,extractable andusages be thealgorithm
,baseKey
,derivedKeyType
,extractable
andkeyUsages
parameters passed to thederiveKey
()
method, respectively.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "deriveBits
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
LetnormalizedDerivedKeyAlgorithmImport be the result ofnormalizing an algorithm, withalg
set toderivedKeyType andop
set to "importKey
".
If an error occurred, return a Promise rejected withnormalizedDerivedKeyAlgorithmImport.
LetnormalizedDerivedKeyAlgorithmLength be the result ofnormalizing an algorithm, withalg
set toderivedKeyType andop
set to "get key length
".
If an error occurred, return a Promise rejected withnormalizedDerivedKeyAlgorithmLength.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofbaseKey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofbaseKey does not contain an entry that is "deriveKey
", thenthrow anInvalidAccessError
.
Letlength be the result of performing the get key length algorithm specified bynormalizedDerivedKeyAlgorithmLength usingderivedKeyType.
Letsecret be the result of performing the derive bits operation specified bynormalizedAlgorithm usingkey,algorithm andlength.
Letresult be the result of performing the import key operation specified bynormalizedDerivedKeyAlgorithmImport using "raw
" asformat,secret askeyData,derivedKeyType asalgorithm and usingextractable andusages.
If the[[type]]
internal slot ofresult is "secret
" or "private
" andusages is empty, thenthrow aSyntaxError
.
Set the[[extractable]]
internal slot ofresult toextractable.
Set the[[usages]]
internal slot ofresult to thenormalized value ofusages.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result of convertingresult to an ECMAScript Object inrealm, as defined by [WebIDL].
Resolvepromise withresult.
When invoked,deriveBits
MUST perform the following steps:
Letalgorithm,baseKey andlength, be thealgorithm
,baseKey
andlength
parameters passed to thederiveBits
()
method, respectively.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "deriveBits
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofbaseKey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofbaseKey does not contain an entry that is "deriveBits
", thenthrow anInvalidAccessError
.
Letbits be the result of performing the derive bits operation specified bynormalizedAlgorithm usingbaseKey,algorithm andlength.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result ofcreating anArrayBuffer
inrealm, containingbits.
Resolvepromise withresult.
When invoked, theimportKey
methodMUST perform the following steps:
Letformat,algorithm,extractable andusages, be theformat
,algorithm
,extractable
andkeyUsages
parameters passed to theimportKey
()
method, respectively.
raw
", "pkcs8
", or "spki
": If thekeyData
parameter passed to theimportKey
()
method is aJsonWebKey
dictionary,throw aTypeError
.
LetkeyData be the result ofgetting a copy of the bytes held by thekeyData
parameter passed to theimportKey
()
method.
jwk
": If thekeyData
parameter passed to theimportKey
()
method is not aJsonWebKey
dictionary,throw aTypeError
.
LetkeyData be thekeyData
parameter passed to theimportKey
()
method.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "importKey
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
Letresult be theCryptoKey
object that results from performing the import key operation specified bynormalizedAlgorithm usingkeyData,algorithm,format,extractable andusages.
If the[[type]]
internal slot ofresult is "secret
" or "private
" andusages is empty, thenthrow aSyntaxError
.
Set the[[extractable]]
internal slot ofresult toextractable.
Set the[[usages]]
internal slot ofresult to thenormalized value ofusages.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result of convertingresult to an ECMAScript Object inrealm, as defined by [WebIDL].
Resolvepromise withresult.
Support of "raw
" key formats is encouraged for interoperability. Web developers should consult the test-suite for detailed information on implementations support of other key formats.
When invoked, theexportKey
methodMUST perform the following steps:
Letformat andkey be theformat
andkey
parameters passed to theexportKey
()
method, respectively.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member of the[[algorithm]]
internal slot ofkey does not identify aregistered algorithm that supports the export key operation, thenthrow aNotSupportedError
.
If the[[extractable]]
internal slot ofkey is false, thenthrow anInvalidAccessError
.
Letresult be the result of performing the export key operation specified by the[[algorithm]]
internal slot ofkey usingkey andformat.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Resolvepromise withresult.
Support of "raw
" key formats is encouraged for interoperability. Web developers should consult the test-suite for detailed information on implementations support of other key formats.
When invoked, thewrapKey
methodMUST perform the following steps:
Letformat,key,wrappingKey andalgorithm be theformat
,key
,wrappingKey
andwrapAlgorithm
parameters passed to thewrapKey
()
method, respectively.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "wrapKey
".
If an error occurred, letnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "encrypt
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofwrappingKey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofwrappingKey does not contain an entry that is "wrapKey
", thenthrow anInvalidAccessError
.
If the algorithm identified by the[[algorithm]]
internal slot ofkey does not support the export key operation, thenthrow aNotSupportedError
.
If the[[extractable]]
internal slot ofkey is false, thenthrow anInvalidAccessError
.
Because the wrapKey method effectively exports the key, only keys marked as extractable may be wrapped. In particular, this means that this API cannot create a wrapped JWK key that is marked as non-extractable using theext
JWK member.
However, the unwrapKey methoddoes support theext
JWK member, so that wrapped non-extractable keys created elsewhere, for example by a server, can be unwrapped using this API.
LetexportedKey be the result of performing the export key operation specified by the[[algorithm]]
internal slot ofkey usingkey andformat.
raw
", "pkcs8
", or "spki
":jwk
": Letjson be the result of representingexportedKey as a UTF-16 string conforming to the JSON grammar; for example, by executing theJSON.stringify
algorithm specified in [ECMA-262] in the context of a new global object.
Letbytes be the result ofUTF-8 encodingjson.
The key wrapping operations for some algorithms place constraints on the payload size. For example AES-KW requires the payload to be a multiple of 8 bytes in length and RSA-OAEP places a restriction on the length. For key formats that offer flexibility in serialization of a given key (for example JWK), implementations may choose to adapt the serialization to the constraints of the wrapping algorithm. This is why JSON.stringify is not normatively required, as otherwise it would prohibit implementations from introducing added padding.
Letresult be the result of performing the wrap key operation specified bynormalizedAlgorithm usingalgorithm,wrappingKey askey andbytes asplaintext.
Letresult be the result of performing the encrypt operation specified bynormalizedAlgorithm usingalgorithm,wrappingKey askey andbytes asplaintext.
NotSupportedError
.Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result ofcreating anArrayBuffer
inrealm, containingresult.
Resolvepromise withresult.
Support of "raw
" key formats is encouraged for interoperability. Web developers should consult the test-suite for detailed information on implementations support of other key formats.
When invoked, theunwrapKey
methodMUST perform the following steps:
Letformat,unwrappingKey,algorithm,unwrappedKeyAlgorithm,extractable andusages, be theformat
,unwrappingKey
,unwrapAlgorithm
,unwrappedKeyAlgorithm
,extractable
andkeyUsages
parameters passed to theunwrapKey
()
method, respectively.
LetwrappedKey be the result ofgetting a copy of the bytes held by thewrappedKey
parameter passed to theunwrapKey
()
method.
LetnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "unwrapKey
".
If an error occurred, letnormalizedAlgorithm be the result ofnormalizing an algorithm, withalg
set toalgorithm andop
set to "decrypt
".
If an error occurred, return a Promise rejected withnormalizedAlgorithm.
LetnormalizedKeyAlgorithm be the result ofnormalizing an algorithm, withalg
set tounwrappedKeyAlgorithm andop
set to "importKey
".
If an error occurred, return a Promise rejected withnormalizedKeyAlgorithm.
Letrealm be therelevant realm ofthis.
Letpromise be a new Promise.
Returnpromise and perform the remaining stepsin parallel.
If the following steps or referenced procedures say tothrow an error,queue a global task on thecrypto task source, givenrealm's global object, to rejectpromise with the returned error; and thenterminate the algorithm.
If thename
member ofnormalizedAlgorithm is not equal to thename
attribute of the[[algorithm]]
internal slot ofunwrappingKey thenthrow anInvalidAccessError
.
If the[[usages]]
internal slot ofunwrappingKey does not contain an entry that is "unwrapKey
", thenthrow anInvalidAccessError
.
NotSupportedError
.raw
", "pkcs8
", or "spki
":jwk
":data
to be parsed.Letresult be the result of performing the import key operation specified bynormalizedKeyAlgorithm usingunwrappedKeyAlgorithm asalgorithm,format,usages andextractable and withkey askeyData.
If the[[type]]
internal slot ofresult is "secret
" or "private
" andusages is empty, thenthrow aSyntaxError
.
Set the[[extractable]]
internal slot ofresult toextractable.
Set the[[usages]]
internal slot ofresult to thenormalized value ofusages.
Queue a global task on thecrypto task source, givenrealm's global object, to perform the remaining steps.
Letresult be the result of convertingresult to an ECMAScript Object inrealm, as defined by [WebIDL].
Resolvepromise withresult.
Support of "raw
" key formats is encouraged for interoperability. Web developers should consult the test-suite for detailed information on implementations support of other key formats.
The methods of theSubtleCrypto
interface return errors by rejecting the returned promise with a predefined exception defined in ECMAScript [ECMA-262] orDOMException
. The following predefined exceptions are used:TypeError
. The following DOMException types from [DOM] are used:
Name | Description |
---|---|
NotSupportedError | The algorithm is not supported |
SyntaxError | A required parameter was missing or out-of-range |
InvalidAccessError | The requested operation is not valid for the provided key |
DataError | Data provided to an operation does not meet requirements |
OperationError | The operation failed for an operation-specific reason |
When this specification says tothrow an error, the user agent must throw an error as described in [WebIDL]. When this occurs in a sub-algorithm, this results in termination of execution of the sub-algorithm and all ancestor algorithms until one is reached that explicitly describes procedures for catching exceptions. The error object thrown shall be associated with therelevant realm ofthis.
WebIDLdictionaryRsaOtherPrimesInfo
{ // The following fields are defined in Section 6.3.2.7 of JSON Web AlgorithmsDOMStringr
;DOMStringd
;DOMStringt
;};dictionaryJsonWebKey
{ // The following fields are defined in Section 3.1 of JSON Web KeyDOMStringkty
;DOMStringuse
;sequence<DOMString>key_ops
;DOMStringalg
; // The following fields are defined in JSON Web Key Parameters Registrationbooleanext
; // The following fields are defined in Section 6 of JSON Web AlgorithmsDOMStringcrv
;DOMStringx
;DOMStringy
;DOMStringd
;DOMStringn
;DOMStringe
;DOMStringp
;DOMStringq
;DOMStringdp
;DOMStringdq
;DOMStringqi
;sequence<RsaOtherPrimesInfo
>oth
;DOMStringk
;};
TheJsonWebKey
dictionary provides a way to represent and exchange cryptographic keys represented by the JSON Web Key [JWK] structure, while allowing native and efficient use within Web Cryptography API applications.
The members of theRsaOtherPrimesInfo
are defined in Section 6.3.2.7 of JSON Web Algorithms.
WebIDLtypedefUint8ArrayBigInteger
;
TheBigInteger
typedef is aUint8Array
that holds an arbitrary magnitude unsigned integer in big-endian order. Values read from the APISHALL have minimal typed array length (that is, at most 7 leading zero bits, except the value 0 which shall have length 8 bits). The APISHALL accept values with any number of leading zero bits, including the empty array, which represents zero.
WebIDLdictionaryCryptoKeyPair
{CryptoKey
publicKey
;CryptoKey
privateKey
;};
TheCryptoKeyPair
dictionary represents an asymmetric key pair that is comprised of both public (publicKey
) and private (privateKey
) keys.
This section is non-normative.
In addition to providing a common interface to perform cryptographic operations, by way of theSubtleCrypto
interface, this specification also provides descriptions for a variety of algorithms that authors may wish to use and that User Agents may choose to implement. This includes a selection of commonly-deployed symmetric and asymmetric algorithms, key derivation mechanisms, and methods for wrapping and unwrapping keys. Further, this specification defines a process to allow additional specifications to introduce additional cryptographic algorithms.
Every cryptographic algorithm defined for use with the Web Cryptography APIMUST have a unique name, referred to as itsrecognized algorithm name, such that no other specification defines the same case-insensitive string for use with the Web Cryptography API.
Every cryptographic algorithm defined for use with the Web Cryptography API has a list ofsupported operations, which are a set of sub-algorithms to be invoked by theSubtleCrypto
interface in order to perform the desired cryptographic operation. This specification makes use of the following operations:
If a given algorithm specification does not list a particular operation as supported, or explicitly lists an operation as not-supported, then the User AgentMUST behave as if the invocation of the sub-algorithm threw a NotSupportedError.
Every cryptographic algorithm defined for use with the Web Cryptography APIMUST define, for everysupported operation, the IDL type to use foralgorithm normalization, as well as the IDL type or types of the return values of the sub-algorithms.
Every cryptographic algorithm definition within this specification employs the following specification conventions. A section, titled"Registration", will include therecognized algorithm name. Additionally, it includes a table, which will list each of thesupported operations as rows, identified by theOperation column. The contents of theParameters column for a given row will contain the IDL type to use foralgorithm normalization for that operation, and the contents of theResult column for that row indicate the IDL type that results from performing the supported operation.
If a conforming User Agent implements an algorithm, itMUST implement all of the supported operations andMUST return the IDL type specified.
Additionally, upon initialization, conforming User Agents must perform thedefine an algorithm steps for each of the supported operations, registering their IDL parameter type as indicated.
Unless otherwise stated, objects created by the operations defined in this specification shall be associated with therelevant realm ofthis.
This section is non-normative.
TheAlgorithmIdentifier
typedef permits algorithms to either be specified as aDOMString
or an object. The usage ofDOMString
is to permit authors a short-hand for noting algorithms that have no parameters (e.g. SHA-1). The usage of object is to allow anAlgorithm
(or appropriate subclass) to be specified, which contains all of the associated parameters for an object.
Because of this, it's necessary to define the algorithm for converting anAlgorithmIdentifier
into an appropriate dictionary that is usable with this API. This algorithm must be extensible, so as to allow new cryptographic algorithms to be added, and consistent, so that Web IDL type mapping can occur before any control is returned to the calling script, which would potentially allow the mutation of parameters or the script environment.
This specification makes use of an internal object,supportedAlgorithms. This internal object is not exposed to applications.
Because this value is not exposed to applications, the exact type is not specified. It is only required to behave as an associative container of key/value pairs, where comparisons of keys are performed in a case-sensitive manner.
The initial contents of this internal object are as follows:
For each value,v in the List ofsupported operations, set thev key of the internal objectsupportedAlgorithms
to a new associative container.
Thedefine an algorithm algorithm is used by specification authors to indicate how a user agent should normalize arguments for a particular algorithm. Its input is an algorithm namealg, represented as a DOMString, operation nameop, represented as a DOMString, and desired IDL dictionary typetype. The algorithm behaves as follows:
supportedAlgorithms
. Thenormalize an algorithm algorithm defines a process for coercing inputs to a targeted IDL dictionary type, after Web IDL conversion has occurred. It is designed to be extensible, to allow future specifications to define additional algorithms, as well as safe for use with Promises. Its input is an operation nameop and anAlgorithmIdentifier
alg. Its output is either an IDL dictionary type or an error. It behaves as follows:
Return the result of running thenormalize an algorithm algorithm, with thealg
set to a newAlgorithm
dictionary whosename
attribute isalg, and with theop
set toop.
op
key ofsupportedAlgorithms
.Algorithm
, as defined by [WebIDL].name
attribute ofinitialAlg.SetalgName to the value of the matching key.
LetdesiredType be the IDL dictionary type stored atalgName inregisteredAlgorithms.
NotSupportedError
and terminate this algorithm.name
attribute ofnormalizedAlgorithm toalgName.For each dictionarydictionary indictionaries:
For each dictionary membermember declared ondictionary, in order:
BufferSource
and is present:HashAlgorithmIdentifier
:alg
set toidlValue and theop
set to "digest
".AlgorithmIdentifier
:alg
set toidlValue and theop
set to the operation defined by the specification that defines the algorithm identified byalgName.This section is non-normative.
As this API is meant to be extensible, in order to keep up with future developments within cryptography, there are no algorithms that conforming user agents are required to implement. As such, authors should check to see what algorithms are currently recommended and supported by implementations.
As highlighted in theSecurity Considerations, even cryptographic algorithms that might be considered strong for one purpose may be insufficient when used with another purpose. Authors should therefore proceed with extreme caution before inventing new cryptographic protocols.
Additionally, this specification includes several algorithms which, in their default usage, can result in cryptographic vulnerabilities. While these concerns may be mitigated, such as through the combination and composition with additional algorithms provided by this specification, authors should proceed with caution and review the relevant cryptographic literature before using a given algorithm. The inclusion of algorithms within this specification is not an indicator of their suitability for any or all purpose, and instead merely serve to provide as a specification for how a conforming User Agent must implement the given algorithm, if it choses to implement the algorithm.
In order to promote interoperability for developers, this specification includes a list of suggested algorithms. These are considered to be the most widely used algorithms in practice at the time of writing, and therefore provide a good starting point for initial implementations of this specification. The suggested algorithms are:
This section is non-normative.
The table below contains an overview of the algorithms described within this specification, as well as the set ofSubtleCrypto methods the algorithm may be used with. In order for an algorithm to be used with a method the corresponding operation or operations, as defined in the procedures for the method, must be defined in the algorithm specification. Note that this mapping of methods to underlying operations is not one-to-one:
Theencrypt
method requires the encrypt operation.
Thedecrypt
method requires the decrypt operation.
Thesign
method requires the sign operation.
Theverify
method requires the verify operation.
ThegenerateKey
method requires the generateKey operation.
TheimportKey
method requires the importKey operation.
TheexportKey
method requires the exportKey operation.
ThederiveKey
method requires the deriveBits operation for the key derivation algorithm and the get key length and importKey operations for the derived key algorithm.
ThederiveBits
method requires the deriveBits operation for the key derivation algorithm.
Thedigest
method requires the digest operation.
ThewrapKey
method requires either the encrypt or wrapKey operation for the wrapping algorithm and the exportKey operation for the wrapped key algorithm.
TheunwrapKey
method requires either the decrypt or unwrapKey operation for the unwrapping algorithm and the importKey operation for the unwrapped key algorithm.
Application developers and script authors should not interpret this table as a recommendation for the use of particular algorithms. Instead, it simply documents what methods are supported. Authors should refer to theSecurity considerations for authors section of this document to better understand the risks and concerns that may arise when using certain algorithms.
Algorithm name | encrypt | decrypt | sign | verify | digest | generateKey | deriveKey | deriveBits | importKey | exportKey | wrapKey | unwrapKey |
---|---|---|---|---|---|---|---|---|---|---|---|---|
RSASSA-PKCS1-v1_5 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
RSA-PSS | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
RSA-OAEP | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
ECDSA | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
ECDH | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
Ed25519 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
X25519 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
AES-CTR | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
AES-CBC | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
AES-GCM | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
AES-KW | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
HMAC | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
SHA-1 | ✔ | |||||||||||
SHA-256 | ✔ | |||||||||||
SHA-384 | ✔ | |||||||||||
SHA-512 | ✔ | |||||||||||
HKDF | ✔ | ✔ | ✔ | |||||||||
PBKDF2 | ✔ | ✔ | ✔ |
This section is non-normative.
The "RSASSA-PKCS1-v1_5
" algorithm identifier is used to perform signing and verification using the RSASSA-PKCS1-v1_5 algorithm specified in [RFC3447] and using the SHA hash functions defined in this specification.
Other specifications may specify the use of additional hash algorithms with RSASSA-PKCS1-v1_5. Such specifications must define the digest operations for the additional hash algorithms andkey import steps andkey export steps for RSASSA-PKCS1-v1_5.
Therecognized algorithm name for this algorithm is "RSASSA-PKCS1-v1_5
".
Operation | Parameters | Result |
---|---|---|
sign | None | byte sequence |
verify | None | boolean |
generateKey | RsaHashedKeyGenParams | CryptoKeyPair |
importKey | RsaHashedImportParams | CryptoKey |
exportKey | None | object |
WebIDLdictionaryRsaKeyGenParams
:Algorithm
{ required [EnforceRange]unsigned longmodulusLength
; requiredBigInteger
publicExponent
;};
ThemodulusLength
member contains the length, in bits, of the RSA modulus.
ThepublicExponent
member contains the RSA public exponent.
WebIDLdictionaryRsaHashedKeyGenParams
:RsaKeyGenParams
{ requiredHashAlgorithmIdentifier
hash
;};
Thehash
member represents the hash algorithm to use.
WebIDLdictionaryRsaKeyAlgorithm
:KeyAlgorithm
{ requiredunsigned longmodulusLength
; requiredBigInteger
publicExponent
;};
ThemodulusLength
member contains the length, in bits, of the RSA modulus.
ThepublicExponent
member contains the RSA public exponent.
WebIDLdictionaryRsaHashedKeyAlgorithm
:RsaKeyAlgorithm
{ requiredKeyAlgorithm
hash
;};
Thehash
member describes the hash algorithm that is used with this key.
WebIDLdictionaryRsaHashedImportParams
:Algorithm
{ requiredHashAlgorithmIdentifier
hash
;};
Thehash
member describes the hash algorithm to use.
If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Perform the signature generation operation defined in Section 8.2 of [RFC3447] with the key represented by the[[handle]]
internal slot ofkey as the signer's private key andmessage asM and using the hash function specified in thehash
attribute of the[[algorithm]]
internal slot ofkey as the Hash option for the EMSA-PKCS1-v1_5 encoding method.
If performing the operation results in an error, thenthrow anOperationError
.
Letsignature be the valueS that results from performing the operation.
Returnsignature.
If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Perform the signature verification operation defined in Section 8.2 of [RFC3447] with the key represented by the[[handle]]
internal slot ofkey as the signer's RSA public key andmessage asM andsignature asS and using the hash function specified in thehash
attribute of the[[algorithm]]
internal slot ofkey as the Hash option for the EMSA-PKCS1-v1_5 encoding method.
Letresult be a boolean with value true if the result of the operation was "valid signature" and the value false otherwise.
Returnresult.
Ifusages contains an entry which is not "sign
" or "verify
", thenthrow aSyntaxError
.
Generate an RSA key pair, as defined in [RFC3447], with RSA modulus length equal to themodulusLength
attribute ofnormalizedAlgorithm and RSA public exponent equal to thepublicExponent
attribute ofnormalizedAlgorithm.
If generation of the key pair fails, thenthrow anOperationError
.
Letalgorithm be a newRsaHashedKeyAlgorithm
dictionary.
Set thename
attribute ofalgorithm to "RSASSA-PKCS1-v1_5
".
Set themodulusLength
attribute ofalgorithm to equal themodulusLength
attribute ofnormalizedAlgorithm.
Set thepublicExponent
attribute ofalgorithm to equal thepublicExponent
attribute ofnormalizedAlgorithm.
Set thehash
attribute ofalgorithm to equal thehash
member ofnormalizedAlgorithm.
LetpublicKey be a newCryptoKey
representing the public key of the generated key pair.
Set the[[type]]
internal slot ofpublicKey to "public
"
Set the[[algorithm]]
internal slot ofpublicKey toalgorithm.
Set the[[extractable]]
internal slot ofpublicKey to true.
Set the[[usages]]
internal slot ofpublicKey to be theusage intersection ofusages and[ "verify" ]
.
LetprivateKey be a newCryptoKey
representing the private key of the generated key pair.
Set the[[algorithm]]
internal slot ofprivateKey toalgorithm.
Set the[[extractable]]
internal slot ofprivateKey toextractable.
Set the[[usages]]
internal slot ofprivateKey to be theusage intersection ofusages and[ "sign" ]
.
Letresult be a newCryptoKeyPair
dictionary.
Set thepublicKey
attribute ofresult to bepublicKey.
Set theprivateKey
attribute ofresult to beprivateKey.
Returnresult.
LetkeyData be the key data to be imported.
spki
": Ifusages contains an entry which is not "verify
", thenthrow aSyntaxError
.
Letspki be the result of running theparse a subjectPublicKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of thealgorithm
AlgorithmIdentifier field ofspki is not equal to thersaEncryption
object identifier defined in [RFC3447], thenthrow aDataError
.
LetpublicKey be the result of performing theparse an ASN.1 structure algorithm, withdata as thesubjectPublicKeyInfo
field ofspki,structure as theRSAPublicKey
structure specified in Section A.1.1 of [RFC3447], andexactData set to true.
If an error occurred while parsing, or it can be determined thatpublicKey is not a valid public key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
that represents the RSA public key identified bypublicKey.
Set the[[type]]
internal slot ofkey to "public
"
pkcs8
": Ifusages contains an entry which is not "sign
" thenthrow aSyntaxError
.
LetprivateKeyInfo be the result of running theparse a privateKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of theprivateKeyAlgorithm
PrivateKeyAlgorithm field ofprivateKeyInfo is not equal to thersaEncryption
object identifier defined in [RFC3447], thenthrow aDataError
.
LetrsaPrivateKey be the result of performing theparse an ASN.1 structure algorithm, withdata as theprivateKey
field ofprivateKeyInfo,structure as theRSAPrivateKey
structure specified in Section A.1.2 of [RFC3447], andexactData set to true.
If an error occurred while parsing, or ifrsaPrivateKey is not a valid RSA private key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
that represents the RSA private key identified byrsaPrivateKey.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
If thed
field ofjwk is present andusages contains an entry which is not "sign
", or, if thed
field ofjwk is not present andusages contains an entry which is not "verify
" thenthrow aSyntaxError
.
If thekty
field ofjwk is not a case-sensitive string match to "RSA
", thenthrow aDataError
.
Ifusages is non-empty and theuse
field ofjwk is present and is not a case-sensitive string match to "sig
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
Lethash be a be a string whose initial value is undefined.
alg
field ofjwk is not present:Lethash be undefined.
alg
field is equal to the string "RS1
": Lethash be the string "SHA-1
".
alg
field is equal to the string "RS256
": Lethash be the string "SHA-256
".
alg
field is equal to the string "RS384
": Lethash be the string "SHA-384
".
alg
field is equal to the string "RS512
": Lethash be the string "SHA-512
".
Perform anykey import steps defined byother applicable specifications, passingformat,jwk and obtaininghash.
If an error occurred or there are noapplicable specifications,throw aDataError
.
LetnormalizedHash be the result ofnormalize an algorithm withalg
set tohash andop
set todigest
.
IfnormalizedHash is not equal to thehash
member ofnormalizedAlgorithm,throw aDataError
.
d
field ofjwk is present: Ifjwk does not meet the requirements of Section 6.3.2 of JSON Web Algorithms [JWA], thenthrow aDataError
.
LetprivateKey represents the RSA private key identified by interpretingjwk according to Section 6.3.2 of JSON Web Algorithms [JWA].
IfprivateKey is not a valid RSA private key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
object that representsprivateKey.
Ifjwk does not meet the requirements of Section 6.3.1 of JSON Web Algorithms [JWA], thenthrow aDataError
.
LetpublicKey represent the RSA public key identified by interpretingjwk according to Section 6.3.1 of JSON Web Algorithms [JWA].
IfpublicKey can be determined to not be a valid RSA public key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
representingpublicKey.
Set the[[type]]
internal slot ofkey to "public
"
NotSupportedError
. Letalgorithm be a newRsaHashedKeyAlgorithm
dictionary.
Set thename
attribute ofalgorithm to "RSASSA-PKCS1-v1_5
"
Set themodulusLength
attribute ofalgorithm to the length, in bits, of the RSA public modulus.
Set thepublicExponent attribute ofalgorithm to theBigInteger representation of the RSA public exponent.
Set thehash
attribute ofalgorithm to thehash
member ofnormalizedAlgorithm.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
Letkey be the key to be exported.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
spki
" If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be an instance of theSubjectPublicKeyInfo
ASN.1 structure defined in [RFC5280] with the following properties:
Set thealgorithm field to anAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDrsaEncryption
defined in [RFC3447].
Set theparams field to the ASN.1 type NULL.
Set thesubjectPublicKey field to the result of DER-encoding anRSAPublicKey
ASN.1 type, as defined in [RFC3447], Appendix A.1.1, that represents the RSA public key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
pkcs8
": If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letdata be an instance of thePrivateKeyInfo
ASN.1 structure defined in [RFC5208] with the following properties:
Set theversion field to0
.
Set theprivateKeyAlgorithm field to aPrivateKeyAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDrsaEncryption
defined in [RFC3447].
Set theparams field to the ASN.1 type NULL.
Set theprivateKey field to the result of DER-encoding anRSAPrivateKey
ASN.1 type, as defined in [RFC3447], Appendix A.1.2, that represents the RSA private key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
jwk
":Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "RSA
".
Lethash be thename
attribute of thehash
attribute of the[[algorithm]]
internal slot ofkey.
SHA-1
": Set thealg
attribute ofjwk to the string "RS1
".
SHA-256
": Set thealg
attribute ofjwk to the string "RS256
".
SHA-384
": Set thealg
attribute ofjwk to the string "RS384
".
SHA-512
": Set thealg
attribute ofjwk to the string "RS512
".
Perform anykey export steps defined byother applicable specifications, passingformat,key and obtainingalg.
If an error occurred or there are noapplicable specifications,throw aNotSupportedError
.
Set thealg
attribute ofjwk toalg.
Set the attributesn
ande
ofjwk according to the corresponding definitions in JSON Web Algorithms [JWA], Section 6.3.1.
[[type]]
internal slot ofkey is "private
": Set the attributes namedd
,p
,q
,dp
,dq
, andqi
ofjwk according to the corresponding definitions in JSON Web Algorithms [JWA], Section 6.3.2.
If the underlying RSA private key represented by the[[handle]]
internal slot ofkey is represented by more than two primes, set the attribute namedoth
ofjwk according to the corresponding definition in JSON Web Algorithms [JWA], Section 6.3.2.7
Set thekey_ops
attribute ofjwk to theusages attribute ofkey.
Set theext
attribute ofjwk to the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
This section is non-normative.
The "RSA-PSS
" algorithm identifier is used to perform signing and verification using the RSASSA-PSS algorithm specified in [RFC3447], using the SHA hash functions defined in this specification and the mask generation formula MGF1.
Other specifications may specify the use of additional hash algorithms with RSASSA-PSS. Such specifications must define the digest operation for the additional hash algorithms andkey import steps andkey export steps for RSASSA-PSS.
Therecognized algorithm name for this algorithm is "RSA-PSS
".
Operation | Parameters | Result |
---|---|---|
sign | RsaPssParams | byte sequence |
verify | RsaPssParams | boolean |
generateKey | RsaHashedKeyGenParams | CryptoKeyPair |
importKey | RsaHashedImportParams | CryptoKey |
exportKey | None | object |
WebIDLdictionaryRsaPssParams
:Algorithm
{ required [EnforceRange]unsigned longsaltLength
;};
ThesaltLength
member represents the desired length of the random salt in bytes.
If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Perform the signature generation operation defined in Section 8.1 of [RFC3447] with the key represented by the[[handle]]
internal slot ofkey as the signer's private key,K, andmessage as the message to be signed,M, and using the hash function specified by thehash
attribute of the[[algorithm]]
internal slot ofkey as the Hash option, MGF1 (defined in Section B.2.1 of [RFC3447]) as the MGF option and thesaltLength member ofnormalizedAlgorithm as the salt length option for the EMSA-PSS-ENCODE operation.
If performing the operation results in an error, thenthrow anOperationError
.
Letsignature be the signature, S, that results from performing the operation.
Returnsignature.
If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Perform the signature verification operation defined in Section 8.1 of [RFC3447] with the key represented by the[[handle]]
internal slot ofkey as the signer's RSA public key andmessage asM andsignature asS and using the hash function specified by thehash
attribute of the[[algorithm]]
internal slot ofkey as the Hash option, MGF1 (defined in Section B.2.1 of [RFC3447]) as the MGF option and thesaltLength member ofnormalizedAlgorithm as the salt length option for the EMSA-PSS-VERIFY operation.
Letresult be a boolean with the value true if the result of the operation was "valid signature" and the value false otherwise.
Ifusages contains an entry which is not "sign
" or "verify
", thenthrow aSyntaxError
.
Generate an RSA key pair, as defined in [RFC3447], with RSA modulus length equal to themodulusLength
member ofnormalizedAlgorithm and RSA public exponent equal to thepublicExponent
member ofnormalizedAlgorithm.
If performing the operation results in an error, thenthrow anOperationError
.
Letalgorithm be a newRsaHashedKeyAlgorithm
dictionary.
Set thename
attribute ofalgorithm to "RSA-PSS
".
Set themodulusLength
attribute ofalgorithm to equal themodulusLength
member ofnormalizedAlgorithm.
Set thepublicExponent
attribute ofalgorithm to equal thepublicExponent
member ofnormalizedAlgorithm.
Set thehash
attribute ofalgorithm to equal thehash
member ofnormalizedAlgorithm.
LetpublicKey be a newCryptoKey
representing the public key of the generated key pair.
Set the[[type]]
internal slot ofpublicKey to "public
"
Set the[[algorithm]]
internal slot ofpublicKey toalgorithm.
Set the[[extractable]]
internal slot ofpublicKey to true.
Set the[[usages]]
internal slot ofpublicKey to be theusage intersection ofusages and[ "verify" ]
.
LetprivateKey be a newCryptoKey
representing the private key of the generated key pair.
Set the[[algorithm]]
internal slot ofprivateKey toalgorithm.
Set the[[extractable]]
internal slot ofprivateKey toextractable.
Set the[[usages]]
internal slot ofprivateKey to be theusage intersection ofusages and[ "sign" ]
.
Letresult be a newCryptoKeyPair
dictionary.
Set thepublicKey
attribute ofresult topublicKey.
Set theprivateKey
attribute ofresult toprivateKey.
Returnresult.
LetkeyData be the key data to be imported.
spki
": Ifusages contains an entry which is not "verify
" thenthrow aSyntaxError
.
Letspki be the result of running theparse a subjectPublicKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of thealgorithm
AlgorithmIdentifier field ofspki is not equal to thersaEncryption
object identifier defined in [RFC3447], thenthrow aDataError
.
LetpublicKey be the result of performing theparse an ASN.1 structure algorithm, withdata as thesubjectPublicKeyInfo
field ofspki,structure as theRSAPublicKey
structure specified in Section A.1.1 of [RFC3447], andexactData set to true.
If an error occurred while parsing, or it can be determined thatpublicKey is not a valid public key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
that represents the RSA public key identified bypublicKey.
Set the[[type]]
internal slot ofkey to "public
"
pkcs8
": Ifusages contains an entry which is not "sign
" thenthrow aSyntaxError
.
LetprivateKeyInfo be the result of running theparse a privateKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of theprivateKeyAlgorithm
PrivateKeyAlgorithm field ofprivateKeyInfo is not equal to thersaEncryption
object identifier defined in [RFC3447], thenthrow aDataError
.
LetrsaPrivateKey be the result of performing theparse an ASN.1 structure algorithm, withdata as theprivateKey
field ofprivateKeyInfo,structure as theRSAPrivateKey
structure specified in Section A.1.2 of [RFC3447], andexactData set to true.
If an error occurred while parsing, or ifrsaPrivateKey is not a valid RSA private key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
that represents the RSA private key identified byrsaPrivateKey.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
If thed
field ofjwk is present andusages contains an entry which is not "sign
", or, if thed
field ofjwk is not present andusages contains an entry which is not "verify
" thenthrow aSyntaxError
.
If thekty
field ofjwk is not a case-sensitive string match to "RSA
", thenthrow aDataError
.
Ifusages is non-empty and theuse
field ofjwk is present and is not a case-sensitive string match to "sig
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
alg
field ofjwk is not present:Lethash be undefined.
alg
field is equal to the string "PS1
": Lethash be the string "SHA-1
".
alg
field is equal to the string "PS256
": Lethash be the string "SHA-256
".
alg
field is equal to the string "PS384
": Lethash be the string "SHA-384
".
alg
field is equal to the string "PS512
": Lethash be the string "SHA-512
".
Perform anykey import steps defined byother applicable specifications, passingformat,jwk and obtaininghash.
If an error occurred or there are noapplicable specifications,throw aDataError
.
LetnormalizedHash be the result ofnormalize an algorithm withalg
set tohash andop
set todigest
.
IfnormalizedHash is not equal to thehash
member ofnormalizedAlgorithm,throw aDataError
.
d
field ofjwk is present: Ifjwk does not meet the requirements of Section 6.3.2 of JSON Web Algorithms [JWA], thenthrow aDataError
.
LetprivateKey represent the RSA private key identified by interpretingjwk according to Section 6.3.2 of JSON Web Algorithms [JWA].
IfprivateKey can be determined to not be a valid RSA private key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
representingprivateKey.
Ifjwk does not meet the requirements of Section 6.3.1 of JSON Web Algorithms [JWA], thenthrow aDataError
.
LetpublicKey represent the RSA public key identified by interpretingjwk according to Section 6.3.1 of JSON Web Algorithms [JWA].
IfpublicKey can be determined to not be a valid RSA public key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
representingpublicKey.
Set the[[type]]
internal slot ofkey to "public
"
NotSupportedError
. Letalgorithm be a newRsaHashedKeyAlgorithm
dictionary.
Set thename
attribute ofalgorithm to "RSA-PSS
"
Set themodulusLength
attribute ofalgorithm to the length, in bits, of the RSA public modulus.
Set thepublicExponent
attribute ofalgorithm to theBigInteger
representation of the RSA public exponent.
Set thehash
attribute ofalgorithm to thehash
member ofnormalizedAlgorithm.
Set the[[algorithm]]
internal slot ofkey toalgorithm
Returnkey.
Letkey be the key to be exported.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
spki
" If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be an instance of theSubjectPublicKeyInfo
ASN.1 structure defined in [RFC5280] with the following properties:
Set thealgorithm field to anAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDrsaEncryption
defined in [RFC3447].
Set theparams field to the ASN.1 type NULL.
Set thesubjectPublicKey field to the result of DER-encoding anRSAPublicKey
ASN.1 type, as defined in [RFC3447], Appendix A.1.1, that represents the RSA public key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
pkcs8
": If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letdata be an instance of thePrivateKeyInfo
ASN.1 structure defined in [RFC5208] with the following properties:
Set theversion field to0
.
Set theprivateKeyAlgorithm field to aPrivateKeyAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDrsaEncryption
defined in [RFC3447].
Set theparams field to the ASN.1 type NULL.
Set theprivateKey field to the result of DER-encoding anRSAPrivateKey
ASN.1 type, as defined in [RFC3447], Appendix A.1.2, that represents the RSA private key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
jwk
":Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "RSA
".
Lethash be thename
attribute of thehash
attribute of the[[algorithm]]
internal slot ofkey.
SHA-1
": Set thealg
attribute ofjwk to the string "PS1
".
SHA-256
": Set thealg
attribute ofjwk to the string "PS256
".
SHA-384
": Set thealg
attribute ofjwk to the string "PS384
".
SHA-512
": Set thealg
attribute ofjwk to the string "PS512
".
Perform anykey export steps defined byother applicable specifications, passingformat and thehash
attribute of the[[algorithm]]
internal slot ofkey and obtainingalg.
Set thealg
attribute ofjwk toalg.
Set the attributesn
ande
ofjwk according to the corresponding definitions in JSON Web Algorithms [JWA], Section 6.3.1.
[[type]]
internal slot ofkey is "private
": Set the attributes namedd
,p
,q
,dp
,dq
, andqi
ofjwk according to the corresponding definitions in JSON Web Algorithms [JWA], Section 6.3.2.
If the underlying RSA private key represented by the[[handle]]
internal slot ofkey is represented by more than two primes, set the attribute namedoth
ofjwk according to the corresponding definition in JSON Web Algorithms [JWA], Section 6.3.2.7
Set thekey_ops
attribute ofjwk to theusages
attribute ofkey.
Set theext
attribute ofjwk to the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
This section is non-normative.
The "RSA-OAEP
" algorithm identifier is used to perform encryption and decryption ordering to the RSAES-OAEP algorithm specified in [RFC3447], using the SHA hash functions defined in this specification and using the mask generation function MGF1.
Other specifications may specify the use of additional hash algorithms with RSAES-OAEP. Such specifications must define the digest operation for the additional hash algorithm andkey import steps andkey export steps for RSAES-OAEP.
Therecognized algorithm name for this algorithm is "RSA-OAEP
".
Operation | Parameters | Result |
---|---|---|
encrypt | RsaOaepParams | byte sequence |
decrypt | RsaOaepParams | byte sequence |
generateKey | RsaHashedKeyGenParams | CryptoKeyPair |
importKey | RsaHashedImportParams | CryptoKey |
exportKey | None | object |
WebIDLdictionaryRsaOaepParams
:Algorithm
{BufferSourcelabel
;};
Thelabel
member represents the optional label/application data to associate with the message.
If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letlabel be thelabel
member ofnormalizedAlgorithm or the empty byte sequence if thelabel
member ofnormalizedAlgorithm is not present.
Perform the encryption operation defined in Section 7.1 of [RFC3447] with the key represented bykey as the recipient's RSA public key,plaintext as the message to be encrypted,M andlabel as the label,L, and with the hash function specified by thehash
attribute of the[[algorithm]]
internal slot ofkey as the Hash option and MGF1 (defined in Section B.2.1 of [RFC3447]) as the MGF option.
If performing the operation results in an error, thenthrow anOperationError
.
Letciphertext be the valueC that results from performing the operation.
Returnciphertext.
If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letlabel be thelabel
member ofnormalizedAlgorithm or the empty byte sequence if thelabel
member ofnormalizedAlgorithm is not present.
Perform the decryption operation defined in Section 7.1 of [RFC3447] with the key represented bykey as the recipient's RSA private key,ciphertext as the ciphertext to be decrypted, C, andlabel as the label,L, and with the hash function specified by thehash
attribute of the[[algorithm]]
internal slot ofkey as the Hash option and MGF1 (defined in Section B.2.1 of [RFC3447]) as the MGF option.
If performing the operation results in an error, thenthrow anOperationError
.
Letplaintext the valueM that results from performing the operation.
Returnplaintext.
Ifusages contains an entry which is not "encrypt
", "decrypt
", "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
Generate an RSA key pair, as defined in [RFC3447], with RSA modulus length equal to themodulusLength
member ofnormalizedAlgorithm and RSA public exponent equal to thepublicExponent
member ofnormalizedAlgorithm.
If performing the operation results in an error, thenthrow anOperationError
.
Letalgorithm be a newRsaHashedKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "RSA-OAEP
".
Set themodulusLength
attribute ofalgorithm to equal themodulusLength
member ofnormalizedAlgorithm.
Set thepublicExponent
attribute ofalgorithm to equal thepublicExponent
member ofnormalizedAlgorithm.
Set thehash
attribute ofalgorithm to equal thehash
member ofnormalizedAlgorithm.
LetpublicKey be a newCryptoKey
representing the public key of the generated key pair.
Set the[[type]]
internal slot ofpublicKey to "public
"
Set the[[algorithm]]
internal slot ofpublicKey toalgorithm.
Set the[[extractable]]
internal slot ofpublicKey to true.
Set the[[usages]]
internal slot ofpublicKey to be theusage intersection ofusages and[ "encrypt", "wrapKey" ]
.
LetprivateKey be a newCryptoKey
representing the private key of the generated key pair.
Set the[[algorithm]]
internal slot ofprivateKey toalgorithm.
Set the[[extractable]]
internal slot ofprivateKey toextractable.
Set the[[usages]]
internal slot ofprivateKey to be theusage intersection ofusages and[ "decrypt", "unwrapKey" ]
.
Letresult be a newCryptoKeyPair
dictionary.
Set thepublicKey
attribute ofresult to bepublicKey.
Set theprivateKey
attribute ofresult to beprivateKey.
Returnresult.
LetkeyData be the key data to be imported.
spki
": Ifusages contains an entry which is not "encrypt
" or "wrapKey
", thenthrow aSyntaxError
.
Letspki be the result of running theparse a subjectPublicKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of thealgorithm
AlgorithmIdentifier field ofspki is not equal to thersaEncryption
object identifier defined in [RFC3447], thenthrow aDataError
.
LetpublicKey be the result of performing theparse an ASN.1 structure algorithm, withdata as thesubjectPublicKeyInfo
field ofspki,structure as theRSAPublicKey
structure specified in Section A.1.1 of [RFC3447], andexactData set to true.
If an error occurred while parsing, or it can be determined thatpublicKey is not a valid public key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
that represents the RSA public key identified bypublicKey.
Set the[[type]]
internal slot ofkey to "public
"
pkcs8
": Ifusages contains an entry which is not "decrypt
" or "unwrapKey
", thenthrow aSyntaxError
.
LetprivateKeyInfo be the result of running theparse a privateKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of theprivateKeyAlgorithm
PrivateKeyAlgorithm field ofprivateKeyInfo is not equal to thersaEncryption
object identifier defined in [RFC3447], thenthrow aDataError
.
LetrsaPrivateKey be the result of performing theparse an ASN.1 structure algorithm, withdata as theprivateKey
field ofprivateKeyInfo,structure as theRSAPrivateKey
structure specified in Section A.1.2 of [RFC3447], andexactData set to true.
If an error occurred while parsing, or ifrsaPrivateKey is not a valid RSA private key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
that represents the RSA private key identified byrsaPrivateKey.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
If thed
field ofjwk is present andusages contains an entry which is not "decrypt
" or "unwrapKey
", thenthrow aSyntaxError
.
If thed
field ofjwk is not present andusages contains an entry which is not "encrypt
" or "wrapKey
", thenthrow aSyntaxError
.
If thekty
field ofjwk is not a case-sensitive string match to "RSA
", thenthrow aDataError
.
Ifusages is non-empty and theuse
field ofjwk is present and is not a case-sensitive string match to "enc
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
alg
field ofjwk is not present:alg
field ofjwk is equal to "RSA-OAEP
":SHA-1
".alg
field ofjwk is equal to "RSA-OAEP-256
":SHA-256
".alg
field ofjwk is equal to "RSA-OAEP-384
":SHA-384
".alg
field ofjwk is equal to "RSA-OAEP-512
":SHA-512
".Perform anykey import steps defined byother applicable specifications, passingformat,jwk and obtaininghash.
If an error occurred or there are noapplicable specifications,throw aDataError
.
LetnormalizedHash be the result ofnormalize an algorithm withalg
set tohash andop
set todigest
.
IfnormalizedHash is not equal to thehash
member ofnormalizedAlgorithm,throw aDataError
.
d
field ofjwk is present: Ifjwk does not meet the requirements of Section 6.3.2 of JSON Web Algorithms [JWA], thenthrow aDataError
.
LetprivateKey represent the RSA private key identified by interpretingjwk according to Section 6.3.2 of JSON Web Algorithms [JWA].
IfprivateKey can be determined to not be a valid RSA private key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
representingprivateKey.
Ifjwk does not meet the requirements of Section 6.3.1 of JSON Web Algorithms [JWA], thenthrow aDataError
.
LetpublicKey represent the RSA public key identified by interpretingjwk according to Section 6.3.1 of JSON Web Algorithms [JWA].
IfpublicKey can be determined to not be a valid RSA public key according to [RFC3447], thenthrow aDataError
.
Letkey be a newCryptoKey
representingpublicKey.
Set the[[type]]
internal slot ofkey to "public
"
NotSupportedError
. Letalgorithm be a newRsaHashedKeyAlgorithm
.
Set thename
attribute ofalgorithm to "RSA-OAEP
"
Set themodulusLength
attribute ofalgorithm to the length, in bits, of the RSA public modulus.
Set thepublicExponent
attribute ofalgorithm to theBigInteger
representation of the RSA public exponent.
Set thehash
attribute ofalgorithm to thehash
member ofnormalizedAlgorithm.
Set the[[algorithm]]
internal slot ofkey toalgorithm
Returnkey.
Letkey be the key to be exported.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
spki
" If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be an instance of theSubjectPublicKeyInfo
ASN.1 structure defined in [RFC5280] with the following properties:
Set thealgorithm field to anAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDrsaEncryption
defined in [RFC3447].
Set theparams field to the ASN.1 type NULL.
Set thesubjectPublicKey field to the result of DER-encoding anRSAPublicKey
ASN.1 type, as defined in [RFC3447], Appendix A.1.1, that represents the RSA public key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
pkcs8
": If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letdata be an instance of thePrivateKeyInfo
ASN.1 structure defined in [RFC5208] with the following properties:
Set theversion field to0
.
Set theprivateKeyAlgorithm field to aPrivateKeyAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDrsaEncryption
defined in [RFC3447].
Set theparams field to the ASN.1 type NULL.
Set theprivateKey field to the result of DER-encoding anRSAPrivateKey
ASN.1 type, as defined in [RFC3447], Appendix A.1.2, that represents the RSA private key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "RSA
".
Lethash be thename
attribute of thehash
attribute of the[[algorithm]]
internal slot ofkey.
SHA-1
": Set thealg
attribute ofjwk to the string "RSA-OAEP
".
SHA-256
": Set thealg
attribute ofjwk to the string "RSA-OAEP-256
".
SHA-384
": Set thealg
attribute ofjwk to the string "RSA-OAEP-384
".
SHA-512
": Set thealg
attribute ofjwk to the string "RSA-OAEP-512
".
Perform anykey export steps defined byother applicable specifications, passingformat and thehash
attribute of the[[algorithm]]
internal slot ofkey and obtainingalg.
Set thealg
attribute ofjwk toalg.
Set the attributesn
ande
ofjwk according to the corresponding definitions in JSON Web Algorithms [JWA], Section 6.3.1.
[[type]]
internal slot ofkey is "private
": Set the attributes namedd
,p
,q
,dp
,dq
, andqi
ofjwk according to the corresponding definitions in JSON Web Algorithms [JWA], Section 6.3.2.
If the underlying RSA private key represented by the[[handle]]
internal slot ofkey is represented by more than two primes, set the attribute namedoth
ofjwk according to the corresponding definition in JSON Web Algorithms [JWA], Section 6.3.2.7
Set thekey_ops
attribute ofjwk to theusages
attribute ofkey.
Set theext
attribute ofjwk to the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
This section is non-normative.
The "ECDSA
" algorithm identifier is used to perform signing and verification using the ECDSA algorithm specified in [RFC6090] and using the SHA hash functions and elliptic curves defined in this specification.
Other specifications may specify the use of additional elliptic curves and hash algorithms with ECDSA. To specify additional hash algorithms to be used with ECDSA, a specification must define aregistered algorithm that supports the digest operation. To specify an additional elliptic curve a specification must definethe curve name,ECDSA signature steps,ECDSA verification steps,ECDSA generation steps,ECDSA key import steps andECDSA key export steps.
Therecognized algorithm name for this algorithm is "ECDSA
".
Operation | Parameters | Result |
---|---|---|
sign | EcdsaParams | byte sequence |
verify | EcdsaParams | boolean |
generateKey | EcKeyGenParams | CryptoKeyPair |
importKey | EcKeyImportParams | CryptoKey |
exportKey | None | object |
WebIDLdictionaryEcdsaParams
:Algorithm
{ requiredHashAlgorithmIdentifier
hash
;};
Thehash
member represents the hash algorithm to use.
WebIDLtypedefDOMStringNamedCurve
;dictionaryEcKeyGenParams
:Algorithm
{ requiredNamedCurve
namedCurve
;};
TheNamedCurve
type represents named elliptic curves, which are a convenient way to specify the domain parameters of well-known elliptic curves. The following values defined by this specification:
P-256
"secp256r1
.P-384
"secp384r1
.P-521
"secp521r1
.Other specifications may defineadditional values.
ThenamedCurve
member of theEcKeyGenParams
dictionary represents a named curve.
WebIDLdictionaryEcKeyAlgorithm
:KeyAlgorithm
{ requiredNamedCurve
namedCurve
;};
ThenamedCurve
member represents the named curve that the key uses.
WebIDLdictionaryEcKeyImportParams
:Algorithm
{ requiredNamedCurve
namedCurve
;};
ThenamedCurve
member represents a named curve.
If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
LethashAlgorithm be thehash
member ofnormalizedAlgorithm.
LetM be the result of performing the digest operation specified byhashAlgorithm usingmessage.
Letd be the ECDSA private key associated withkey.
Letparams be the EC domain parameters associated withkey.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
":Perform the ECDSA signing process, as specified in [RFC6090], Section 5.4, withM as the message, usingparams as the EC domain parameters, and withd as the private key.
Letr ands be the pair of integers resulting from performing the ECDSA signing process.
Letresult be an emptybyte sequence.
Letn be the smallest integer such thatn * 8 is greater than the logarithm to base 2 of the order of the base point of the elliptic curve identified byparams.
Convertr to a byte sequence of lengthn and append it toresult.
Converts to a byte sequence of lengthn and append it toresult.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is a value specified in anapplicable specification:Perform theECDSA signature steps specified in that specification, passing inM,params andd and resulting inresult.
Returnresult.
If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
LethashAlgorithm be thehash
member ofnormalizedAlgorithm.
LetM be the result of performing the digest operation specified byhashAlgorithm usingmessage.
LetQ be the ECDSA public key associated withkey.
Letparams be the EC domain parameters associated withkey.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
":Perform the ECDSA verifying process, as specified in [RFC6090], Section 5.3, withM as the received message,signature as the received signature and usingparams as the EC domain parameters, andQ as the public key.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is a value specified in anapplicable specification:Perform theECDSA verification steps specified in that specification passing inM,signature,params andQ and resulting in an indication of whether or not the purported signature is valid.
Letresult be a boolean with the valuetrue
if the signature is valid and the valuefalse
otherwise.
Returnresult.
Ifusages contains a value which is not one of "sign
" or "verify
", thenthrow aSyntaxError
.
namedCurve
member ofnormalizedAlgorithm is "P-256
", "P-384
" or "P-521
": Generate an Elliptic Curve key pair, as defined in [RFC6090] with domain parameters for the curve identified by thenamedCurve
member ofnormalizedAlgorithm.
namedCurve
member ofnormalizedAlgorithm is a value specified in anapplicable specification:Perform theECDSA generation steps specified in that specification, passing innormalizedAlgorithm and resulting in an elliptic curve key pair.
If performing the key generation operation results in an error, thenthrow anOperationError
.
Letalgorithm be a newEcKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "ECDSA
".
Set thenamedCurve
attribute ofalgorithm to equal thenamedCurve
member ofnormalizedAlgorithm.
LetpublicKey be a newCryptoKey
representing the public key of the generated key pair.
Set the[[type]]
internal slot ofpublicKey to "public
"
Set the[[algorithm]]
internal slot ofpublicKey toalgorithm.
Set the[[extractable]]
internal slot ofpublicKey to true.
Set the[[usages]]
internal slot ofpublicKey to be theusage intersection ofusages and[ "verify" ]
.
LetprivateKey be a newCryptoKey
representing the private key of the generated key pair.
Set the[[algorithm]]
internal slot ofprivateKey toalgorithm.
Set the[[extractable]]
internal slot ofprivateKey toextractable.
Set the[[usages]]
internal slot ofprivateKey to be theusage intersection ofusages and[ "sign" ]
.
Letresult be a newCryptoKeyPair
dictionary.
Set thepublicKey
attribute ofresult to bepublicKey.
Set theprivateKey
attribute ofresult to beprivateKey.
Returnresult.
LetkeyData be the key data to be imported.
spki
": Ifusages contains a value which is not "verify
" thenthrow aSyntaxError
.
Letspki be the result of running theparse a subjectPublicKeyInfo algorithm overkeyData
If thealgorithm
object identifier field of thealgorithm
AlgorithmIdentifier field ofspki is not equal to theid-ecPublicKey
object identifier defined in [RFC5480], thenthrow aDataError
.
If theparameters
field of thealgorithm
AlgorithmIdentifier field ofspki is absent, thenthrow aDataError
.
Letparams be theparameters
field of thealgorithm
AlgorithmIdentifier field ofspki.
Ifparams is not an instance of theECParameters
ASN.1 type defined in [RFC5480] that specifies anamedCurve
, thenthrow aDataError
.
LetnamedCurve be a string whose initial value is undefined.
secp256r1
object identifier defined in [RFC5480]: SetnamedCurve "P-256
".
secp384r1
object identifier defined in [RFC5480]: SetnamedCurve "P-384
".
secp521r1
object identifier defined in [RFC5480]: SetnamedCurve "P-521
".
LetpublicKey be the Elliptic Curve public key identified by performing the conversion steps defined in Section 2.3.4 of [SEC1] using thesubjectPublicKey
field ofspki.
The uncompressed point formatMUST be supported.
If the implementation does not support the compressed point format and a compressed point is provided,throw aDataError
.
If a decode error occurs or an identity point is found,throw aDataError
.
Letkey be a newCryptoKey
that representspublicKey.
Perform anykey import steps defined byother applicable specifications, passingformat,spki and obtainingnamedCurve andkey.
If an error occurred or there are noapplicable specifications,throw aDataError
.
IfnamedCurve is defined, and not equal to thenamedCurve
member ofnormalizedAlgorithm,throw aDataError
.
If the public key value is not a valid point on the Elliptic Curve identified by thenamedCurve
member ofnormalizedAlgorithmthrow aDataError
.
Set the[[type]]
internal slot ofkey to "public
"
Letalgorithm be a newEcKeyAlgorithm
.
Set thename
attribute ofalgorithm to "ECDSA
".
Set thenamedCurve
attribute ofalgorithm tonamedCurve.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
pkcs8
": Ifusages contains a value which is not "sign
" thenthrow aSyntaxError
.
LetprivateKeyInfo be the result of running theparse a privateKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of theprivateKeyAlgorithm
PrivateKeyAlgorithm field ofprivateKeyInfo is not equal to theid-ecPublicKey
object identifier defined in [RFC5480], thenthrow aDataError
.
If theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo is not present, thenthrow aDataError
.
Letparams be theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo.
Ifparams is not an instance of theECParameters
ASN.1 type defined in [RFC5480] that specifies anamedCurve
, thenthrow aDataError
.
LetnamedCurve be a string whose initial value is undefined.
secp256r1
object identifier defined in [RFC5480]: SetnamedCurve "P-256
".
secp384r1
object identifier defined in [RFC5480]: SetnamedCurve "P-384
".
secp521r1
object identifier defined in [RFC5480]: SetnamedCurve "P-521
".
LetecPrivateKey be the result of performing theparse an ASN.1 structure algorithm, withdata as theprivateKey
field ofprivateKeyInfo,structure as the ASN.1ECPrivateKey
structure specified in Section 3 of [RFC5915], andexactData set to true.
If theparameters
field ofecPrivateKey is present, and is not an instance of thenamedCurve
ASN.1 type defined in [RFC5480], or does not contain the same object identifier as theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo, thenthrow aDataError
.
Letkey be a newCryptoKey
that represents the Elliptic Curve private key identified by performing the conversion steps defined in Section 3 of [RFC5915] usingecPrivateKey.
Perform anykey import steps defined byother applicable specifications, passingformat,privateKeyInfo and obtainingnamedCurve andkey.
If an error occurred or there are noapplicable specifications,throw aDataError
.
IfnamedCurve is defined, and not equal to thenamedCurve
member ofnormalizedAlgorithm,throw aDataError
.
If the private key value is not a valid point on the Elliptic Curve identified by thenamedCurve
member ofnormalizedAlgorithmthrow aDataError
.
Letalgorithm be a newEcKeyAlgorithm
.
Set thename
attribute ofalgorithm to "ECDSA
".
Set thenamedCurve
attribute ofalgorithm tonamedCurve.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
If thed
field is present andusages contains a value which is not "sign
", or, if thed
field is not present andusages contains a value which is not "verify
" thenthrow aSyntaxError
.
Ifusages is non-empty and theuse
field ofjwk is present and is not "sig
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK], or it does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
LetnamedCurve be a string whose value is equal to thecrv
field ofjwk.
IfnamedCurve is not equal to thenamedCurve
member ofnormalizedAlgorithm,throw aDataError
.
P-256
", "P-384
" or "P-521
":LetalgNamedCurve be a string whose initial value is undefined.
alg
field is not present:alg
field is equal to the string "ES256":P-256
".alg
field is equal to the string "ES384":P-384
".alg
field is equal to the string "ES512":P-521
".DataError
. IfalgNamedCurve is defined, and is not equal tonamedCurve,throw aDataError
.
d
field is present: Ifjwk does not meet the requirements of Section 6.2.1 of JSON Web Algorithms [JWA], thenthrow aDataError
.
Letkey be a newCryptoKey
object that represents the Elliptic Curve public key identified by interpretingjwk according to Section 6.2.1 of JSON Web Algorithms [JWA].
Set the[[type]]
internal slot ofKey to "public
".
Perform anykey import steps defined byother applicable specifications, passingformat,jwk and obtainingkey.
If an error occurred or there are noapplicable specifications,throw aDataError
.
If the key value is not a valid point on the Elliptic Curve identified by thenamedCurve
member ofnormalizedAlgorithmthrow aDataError
.
Letalgorithm be a new instance of anEcKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "ECDSA
".
Set thenamedCurve
attribute ofalgorithm tonamedCurve.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
raw
": If thenamedCurve
member ofnormalizedAlgorithm is not anamed curve, thenthrow aDataError
.
Ifusages contains a value which is not "verify
" thenthrow aSyntaxError
.
P-256
", "P-384
" or "P-521
": LetQ be the elliptic curve point on the curve identified by thenamedCurve
member ofnormalizedAlgorithm identified by performing the conversion steps defined in Section 2.3.4 of [SEC1] onkeyData.
The uncompressed point formatMUST be supported.
If the implementation does not support the compressed point format and a compressed point is provided,throw aDataError
.
If a decode error occurs or an identity point is found,throw aDataError
.
Letkey be a newCryptoKey
that representsQ.
Perform anykey import steps defined byother applicable specifications, passingformat,keyData and obtainingkey.
If an error occurred or there are noapplicable specifications,throw aDataError
.
Letalgorithm be a newEcKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "ECDSA
".
Set thenamedCurve
attribute ofalgorithm to equal thenamedCurve
member ofnormalizedAlgorithm.
Set the[[type]]
internal slot ofkey to "public
"
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey
Letkey be theCryptoKey
to be exported.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
spki
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be an instance of theSubjectPublicKeyInfo
ASN.1 structure defined in [RFC5280] with the following properties:
Set thealgorithm field to anAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDid-ecPublicKey
defined in [RFC5480].
Set theparameters field to an instance of theECParameters
ASN.1 type defined in [RFC5480] as follows:
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
": LetkeyData be thebyte sequence that represents the Elliptic Curve public key represented by the[[handle]]
internal slot ofkey according to the encoding rules specified in Section 2.2 of [RFC5480] and using the uncompressed form. andkeyData.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
": Setparameters to thenamedCurve
choice with value equal to the object identifiersecp256r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-384
": Setparameters to thenamedCurve
choice with value equal to the object identifiersecp384r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-521
": Setparameters to thenamedCurve
choice with value equal to the object identifiersecp521r1
defined in [RFC5480]
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurveOid andkeyData.
Setparameters to thenamedCurve
choice with value equal to the object identifiernamedCurveOid.
Set thesubjectPublicKey field tokeyData.
Letresult be the result of DER-encodingdata.
pkcs8
": If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letdata be an instance of thePrivateKeyInfo
ASN.1 structure defined in [RFC5208] with the following properties:
Set theversion field to0
.
Set theprivateKeyAlgorithm field to aPrivateKeyAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDid-ecPublicKey
defined in [RFC5480].
Set theparameters field to an instance of theECParameters
ASN.1 type defined in [RFC5480] as follows:
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
": LetkeyData be the result of DER-encoding an instance of theECPrivateKey
structure defined in Section 3 of [RFC5915] for the Elliptic Curve private key represented by the[[handle]]
internal slot ofkey and that conforms to the following:
Theparameters field is present, and is equivalent to theparameters field of theprivateKeyAlgorithm field of thisPrivateKeyInfo
ASN.1 structure.
ThepublicKey field is present and represents the Elliptic Curve public key associated with the Elliptic Curve private key represented by the[[handle]]
internal slot ofkey.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
": Setparameters to thenamedCurve
choice with value equal to the object identifiersecp256r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-384
": Setparameters to thenamedCurve
choice with value equal to the object identifiersecp384r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-521
": Setparameters to thenamedCurve
choice with value equal to the object identifiersecp521r1
defined in [RFC5480]
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurveOid andkeyData.
Setparameters to thenamedCurve
choice with value equal to the object identifiernamedCurveOid.
Set theprivateKey field tokeyData.
Letresult be the result of DER-encodingdata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to "EC
".
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
":namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
":crv
attribute ofjwk to "P-256
"namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-384
":crv
attribute ofjwk to "P-384
"namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-521
":crv
attribute ofjwk to "P-521
" Set thex
attribute ofjwk according to the definition in Section 6.2.1.2 of JSON Web Algorithms [JWA].
Set they
attribute ofjwk according to the definition in Section 6.2.1.3 of JSON Web Algorithms [JWA].
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurve and a new value ofjwk.
Set thecrv
attribute ofjwk tonamedCurve.
Set thekey_ops
attribute ofjwk to theusages
attribute ofkey.
Set theext
attribute ofjwk to the[[extractable]]
internal slot ofkey.
Letresult bejwk.
raw
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
": Letdata be abyte sequence representing the Elliptic Curve pointQ represented by the[[handle]]
internal slot ofkey according to [SEC1] 2.3.3 using the uncompressed format.
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurve anddata.
Letresult bedata.
Returnresult.
This section is non-normative.
This describes using Elliptic Curve Diffie-Hellman (ECDH) for key generation and key agreement, as specified by [RFC6090].
Other specifications may specify the use of additional elliptic curves with ECDH. To specify an additional elliptic curve a specification must definethe curve name,ECDH generation steps,ECDH derivation steps,ECDH key import steps andECDH key export steps.
Therecognized algorithm name for this algorithm is "ECDH
".
Operation | Parameters | Result |
---|---|---|
generateKey | EcKeyGenParams | CryptoKeyPair |
deriveBits | EcdhKeyDeriveParams | byte sequence |
importKey | EcKeyImportParams | CryptoKey |
exportKey | None | object |
WebIDLdictionaryEcdhKeyDeriveParams
:Algorithm
{ requiredCryptoKey
public
;};
Thepublic
member represents the peer's EC public key.
Ifusages contains an entry which is not "deriveKey
" or "deriveBits
" thenthrow aSyntaxError
.
namedCurve
member ofnormalizedAlgorithm is "P-256
", "P-384
" or "P-521
": Generate an Elliptic Curve key pair, as defined in [RFC6090] with domain parameters for the curve identified by thenamedCurve
member ofnormalizedAlgorithm.
namedCurve
member ofnormalizedAlgorithm is a value specified in anapplicable specification that specifies the use of that value with ECDH:Perform theECDH generation steps specified in that specification, passing innormalizedAlgorithm and resulting in an elliptic curve key pair.
If performing the operation results in an error, thenthrow aOperationError
.
Letalgorithm be a newEcKeyAlgorithm
object.
Set thename
member ofalgorithm to "ECDH
".
Set thenamedCurve
attribute ofalgorithm to equal thenamedCurve
member ofnormalizedAlgorithm.
LetpublicKey be a newCryptoKey
representing the public key of the generated key pair.
Set the[[type]]
internal slot ofpublicKey to "public
"
Set the[[algorithm]]
internal slot ofpublicKey toalgorithm.
Set the[[extractable]]
internal slot ofpublicKey to true.
Set the[[usages]]
internal slot ofpublicKey to be the empty list.
LetprivateKey be a newCryptoKey
representing the private key of the generated key pair.
Set the[[algorithm]]
internal slot ofprivateKey toalgorithm.
Set the[[extractable]]
internal slot ofprivateKey toextractable.
Set the[[usages]]
internal slot ofprivateKey to be theusage intersection ofusages and[ "deriveKey", "deriveBits" ]
.
Letresult be a newCryptoKeyPair
dictionary.
Set thepublicKey
attribute ofresult to bepublicKey.
Set theprivateKey
attribute ofresult to beprivateKey.
Returnresult.
If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
LetpublicKey be thepublic
member ofnormalizedAlgorithm.
If the[[type]]
internal slot ofpublicKey is not "public
", thenthrow anInvalidAccessError
.
If thename
attribute of the[[algorithm]]
internal slot ofpublicKey is not equal to thename
property of the[[algorithm]]
internal slot ofkey, thenthrow anInvalidAccessError
.
If thenamedCurve
attribute of the[[algorithm]]
internal slot ofpublicKey is not equal to thenamedCurve
property of the[[algorithm]]
internal slot ofkey, thenthrow anInvalidAccessError
.
namedCurve
property of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
": Perform the ECDH primitive specified in [RFC6090] Section 4 withkey as the EC private keyd and the EC public key represented by the[[handle]]
internal slot ofpublicKey as the EC public key.
Letsecret be abyte sequence containing the result of applying the field element to octet string conversion defined in Section 6.2 of [RFC6090] to the output of the ECDH primitive.
namedCurve
property of the[[algorithm]]
internal slot ofkey is a value specified in anapplicable specification that specifies the use of that value with ECDH:Perform theECDH derivation steps specified in that specification, passing inkey andpublicKey and resulting insecret.
If performing the operation results in an error, thenthrow aOperationError
.
OperationError
.LetkeyData be the key data to be imported.
spki
": Ifusages is not empty thenthrow aSyntaxError
.
Letspki be the result of running theparse a subjectPublicKeyInfo algorithm overkeyData
If thealgorithm
object identifier field of thealgorithm
AlgorithmIdentifier field ofspki is not equal to theid-ecPublicKey
object identifier defined in [RFC5480], thenthrow aDataError
.
If theparameters
field of thealgorithm
AlgorithmIdentifier field ofspki is absent, thenthrow aDataError
.
Letparams be theparameters
field of thealgorithm
AlgorithmIdentifier field ofspki.
Ifparams is not an instance of theECParameters
ASN.1 type defined in [RFC5480] that specifies anamedCurve
, thenthrow aDataError
.
LetnamedCurve be a string whose initial value is undefined.
secp256r1
object identifier defined in [RFC5480]: SetnamedCurve "P-256
".
secp384r1
object identifier defined in [RFC5480]: SetnamedCurve "P-384
".
secp521r1
object identifier defined in [RFC5480]: SetnamedCurve "P-521
".
LetpublicKey be the Elliptic Curve public key identified by performing the conversion steps defined in Section 2.3.4 of [SEC1] to thesubjectPublicKey
field ofspki.
The uncompressed point formatMUST be supported.
If the implementation does not support the compressed point format and a compressed point is provided,throw aDataError
.
If a decode error occurs or an identity point is found,throw aDataError
.
Letkey be a newCryptoKey
that representspublicKey.
Perform anykey import steps defined byother applicable specifications, passingformat,spki and obtainingnamedCurve andkey.
If an error occurred or there are noapplicable specifications,throw aDataError
.
IfnamedCurve is defined, and not equal to thenamedCurve
member ofnormalizedAlgorithm,throw aDataError
.
If the key value is not a valid point on the Elliptic Curve identified by thenamedCurve
member ofnormalizedAlgorithmthrow aDataError
.
Set the[[type]]
internal slot ofkey to "public
"
Letalgorithm be a newEcKeyAlgorithm
.
Set thename
attribute ofalgorithm to "ECDH
".
Set thenamedCurve
attribute ofalgorithm tonamedCurve.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
pkcs8
": Ifusages contains an entry which is not "deriveKey
" or "deriveBits
" thenthrow aSyntaxError
.
LetprivateKeyInfo be the result of running theparse a privateKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of theprivateKeyAlgorithm
PrivateKeyAlgorithm field ofprivateKeyInfo is not equal to theid-ecPublicKey
object identifier defined in [RFC5480],throw aDataError
.
If theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo is not present,throw aDataError
.
Letparams be theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo.
Ifparams is not an instance of theECParameters
ASN.1 type defined in [RFC5480] that specifies anamedCurve
, thenthrow aDataError
.
LetnamedCurve be a string whose initial value is undefined.
secp256r1
object identifier defined in [RFC5480]: SetnamedCurve to "P-256
".
secp384r1
object identifier defined in [RFC5480]: SetnamedCurve to "P-384
".
secp521r1
object identifier defined in [RFC5480]: SetnamedCurve to "P-521
".
LetecPrivateKey be the result of performing theparse an ASN.1 structure algorithm, withdata as theprivateKey
field ofprivateKeyInfo,structure as the ASN.1ECPrivateKey
structure specified in Section 3 of [RFC5915], andexactData set to true.
If theparameters
field ofecPrivateKey is present, and is not an instance of thenamedCurve
ASN.1 type defined in [RFC5480], or does not contain the same object identifier as theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo,throw aDataError
.
Letkey be a newCryptoKey
that represents the Elliptic Curve private key identified by performing the conversion steps defined in Section 3 of [RFC5915] usingecPrivateKey.
Perform anykey import steps defined byother applicable specifications, passingformat,privateKeyInfo and obtainingnamedCurve andkey.
If an error occurred or there are noapplicable specifications,throw aDataError
.
IfnamedCurve is defined, and not equal to thenamedCurve
member ofnormalizedAlgorithm,throw aDataError
.
If the key value is not a valid point on the Elliptic Curve identified by thenamedCurve
member ofnormalizedAlgorithmthrow aDataError
.
Letalgorithm be a newEcKeyAlgorithm
.
Set thename
attribute ofalgorithm to "ECDH
".
Set thenamedCurve
attribute ofalgorithm tonamedCurve.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
If thed
field is present and ifusages contains an entry which is not "deriveKey
" or "deriveBits
" thenthrow aSyntaxError
.
If thed
field is not present and ifusages is not empty thenthrow aSyntaxError
.
Ifusages is non-empty and theuse
field ofjwk is present and is not equal to "enc
" thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK], or it does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
LetnamedCurve be a string whose value is equal to thecrv
field ofjwk.
IfnamedCurve is not equal to thenamedCurve
member ofnormalizedAlgorithm,throw aDataError
.
P-256
", "P-384
" or "P-521
":d
field is present: Ifjwk does not meet the requirements of Section 6.2.1 of JSON Web Algorithms [JWA], thenthrow aDataError
.
Letkey be a newCryptoKey
object that represents the Elliptic Curve public key identified by interpretingjwk according to Section 6.2.1 of JSON Web Algorithms [JWA].
Set the[[type]]
internal slot ofKey to "public
".
Perform anykey import steps defined byother applicable specifications, passingformat,jwk and obtainingkey.
If an error occurred or there are noapplicable specifications,throw aDataError
.
If the key value is not a valid point on the Elliptic Curve identified by thenamedCurve
member ofnormalizedAlgorithmthrow aDataError
.
Letalgorithm be a new instance of anEcKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "ECDH
".
Set thenamedCurve
attribute ofalgorithm tonamedCurve.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
raw
": If thenamedCurve
member ofnormalizedAlgorithm is not anamed curve, thenthrow aDataError
.
Ifusages is not the empty list, thenthrow aSyntaxError
.
P-256
", "P-384
" or "P-521
": LetQ be the Elliptic Curve public key on the curve identified by thenamedCurve
member ofnormalizedAlgorithm identified by performing the conversion steps defined in Section 2.3.4 of [SEC1] tokeyData.
The uncompressed point formatMUST be supported.
If the implementation does not support the compressed point format and a compressed point is provided,throw aDataError
.
If a decode error occurs or an identity point is found,throw aDataError
.
Letkey be a newCryptoKey
that representsQ.
Perform anykey import steps defined byother applicable specifications, passingformat,keyData and obtainingkey.
If an error occured or there are noapplicable specifications,throw aDataError
.
Letalgorithm be a newEcKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "ECDH
".
Set thenamedCurve
attribute ofalgorithm to equal thenamedCurve
member ofnormalizedAlgorithm.
Set the[[type]]
internal slot ofkey to "public
"
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey
Letkey be theCryptoKey
to be exported.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
spki
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be an instance of theSubjectPublicKeyInfo
ASN.1 structure defined in [RFC5280] with the following properties:
Set thealgorithm field to anAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDid-ecPublicKey
defined in [RFC5480].
Set theparameters field to an instance of theECParameters
ASN.1 type defined in [RFC5480] as follows:
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
": LetkeyData be thebyte sequence that represents the Elliptic Curve public key represented by the[[handle]]
internal slot ofkey according to the encoding rules specified in Section 2.3.3 of [SEC1] and using the uncompressed form.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
": Setparameters to thenamedCurve choice with value equal to the object identifiersecp256r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-384
": Setparameters to thenamedCurve choice with value equal to the object identifiersecp384r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-521
": Setparameters to thenamedCurve choice with value equal to the object identifiersecp521r1
defined in [RFC5480]
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurveOid andkeyData.
Setparameters to thenamedCurve
choice with value equal to the object identifiernamedCurveOid.
Set thesubjectPublicKey field tokeyData
pkcs8
": If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letdata be an instance of thePrivateKeyInfo
ASN.1 structure defined in [RFC5208] with the following properties:
Set theversion field to0
.
Set theprivateKeyAlgorithm field to aPrivateKeyAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm field to the OIDid-ecPublicKey
defined in [RFC5480].
Set theparameters field to an instance of theECParameters
ASN.1 type defined in [RFC5480] as follows:
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
": LetkeyData be the result of DER-encoding an instance of theECPrivateKey
structure defined in Section 3 of [RFC5915] for the Elliptic Curve private key represented by the[[handle]]
internal slot ofkey and that conforms to the following:
Theparameters field is present, and is equivalent to theparameters field of theprivateKeyAlgorithm field of thisPrivateKeyInfo
ASN.1 structure.
ThepublicKey field is present and represents the Elliptic Curve public key associated with the Elliptic Curve private key represented by the[[handle]]
internal slot ofkey.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
": Setparameters to thenamedCurve choice with value equal to the object identifiersecp256r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-384
": Setparameters to thenamedCurve choice with value equal to the object identifiersecp384r1
defined in [RFC5480]
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-521
": Setparameters to thenamedCurve choice with value equal to the object identifiersecp521r1
defined in [RFC5480]
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurveOid andkeyData.
Setparameters to thenamedCurve
choice with value equal to the object identifiernamedCurveOid.
Set theprivateKey field tokeyData.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to "EC
".
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
":namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
":crv
attribute ofjwk to "P-256
"namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-384
":crv
attribute ofjwk to "P-384
"namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-521
":crv
attribute ofjwk to "P-521
" Set thex
attribute ofjwk according to the definition in Section 6.2.1.2 of JSON Web Algorithms [JWA].
Set they
attribute ofjwk according to the definition in Section 6.2.1.3 of JSON Web Algorithms [JWA].
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurve and a new value ofjwk.
Set thecrv
attribute ofjwk tonamedCurve.
Set thekey_ops
attribute ofjwk to theusages
attribute ofkey.
Set theext
attribute ofjwk to the[[extractable]]
internal slot ofkey.
Letresult bejwk.
raw
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
namedCurve
attribute of the[[algorithm]]
internal slot ofkey is "P-256
", "P-384
" or "P-521
": Letdata be thebyte sequence that represents the Elliptic Curve public key represented by the[[handle]]
internal slot ofkey according to the encoding rules specified in Section 2.3.3 of [SEC1] and using the uncompressed form.
Perform anykey export steps defined byother applicable specifications, passingformat and thenamedCurve
attribute of the[[algorithm]]
internal slot ofkey and obtainingnamedCurve anddata.
Letresult bedata.
Returnresult.
This section is non-normative.
The "Ed25519
" algorithm identifier is used to perform signing and verification using the Ed25519 algorithm specified in [RFC8032].
Therecognized algorithm name for this algorithm is "Ed25519
".
Operation | Parameters | Result |
---|---|---|
sign | None | byte sequence |
verify | None | boolean |
generateKey | None | CryptoKeyPair |
importKey | None | CryptoKey |
exportKey | None | object |
If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letresult be the result of performing the Ed25519 signing process, as specified in [RFC8032], Section 5.1.6, withmessage asM, using the Ed25519 private key associated withkey.
Some implementations may (wish to) generate randomized signatures as perdraft-irtf-cfrg-det-sigs-with-noise instead of deterministic signatures as per [RFC8032].
Returnresult.
If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
If the key data ofkey represents an invalid point or a small-order element on the Elliptic Curve of Ed25519, returnfalse
.
Not all implementations perform this check.
If the point R, encoded in the first half ofsignature, represents an invalid point or a small-order element on the Elliptic Curve of Ed25519, returnfalse
.
Not all implementations perform this check.
Perform the Ed25519 verification steps, as specified in [RFC8032], Section 5.1.7, using the cofactorless (unbatched) equation,[S]B = R + [k]A'
, on thesignature, withmessage asM, using the Ed25519 public key associated withkey.
Letresult be a boolean with the valuetrue
if the signature is valid and the valuefalse
otherwise.
Returnresult.
Ifusages contains a value which is not one of "sign
" or "verify
", thenthrow aSyntaxError
.
Generate an Ed25519 key pair, as defined in [RFC8032], section 5.1.5.
Letalgorithm be a newKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "Ed25519
".
LetpublicKey be a newCryptoKey
representing the public key of the generated key pair.
Set the[[type]]
internal slot ofpublicKey to "public
"
Set the[[algorithm]]
internal slot ofpublicKey toalgorithm.
Set the[[extractable]]
internal slot ofpublicKey to true.
Set the[[usages]]
internal slot ofpublicKey to be theusage intersection ofusages and[ "verify" ]
.
LetprivateKey be a newCryptoKey
representing the private key of the generated key pair.
Set the[[algorithm]]
internal slot ofprivateKey toalgorithm.
Set the[[extractable]]
internal slot ofprivateKey toextractable.
Set the[[usages]]
internal slot ofprivateKey to be theusage intersection ofusages and[ "sign" ]
.
Letresult be a newCryptoKeyPair
dictionary.
Set thepublicKey
attribute ofresult to bepublicKey.
Set theprivateKey
attribute ofresult to beprivateKey.
Returnresult.
LetkeyData be the key data to be imported.
spki
": Ifusages contains a value which is not "verify
" thenthrow aSyntaxError
.
Letspki be the result of running theparse a subjectPublicKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of thealgorithm
AlgorithmIdentifier field ofspki is not equal to theid-Ed25519
object identifier defined in [RFC8410], thenthrow aDataError
.
If theparameters
field of thealgorithm
AlgorithmIdentifier field ofspki is present, thenthrow aDataError
.
LetpublicKey be the Ed25519 public key identified by thesubjectPublicKey
field ofspki.
Letkey be a newCryptoKey
that representspublicKey.
Set the[[type]]
internal slot ofkey to "public
"
Letalgorithm be a newKeyAlgorithm
.
Set thename
attribute ofalgorithm to "Ed25519
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
pkcs8
": Ifusages contains a value which is not "sign
" thenthrow aSyntaxError
.
LetprivateKeyInfo be the result of running theparse a privateKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of theprivateKeyAlgorithm
PrivateKeyAlgorithm field ofprivateKeyInfo is not equal to theid-Ed25519
object identifier defined in [RFC8410], thenthrow aDataError
.
If theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo is present, thenthrow aDataError
.
LetcurvePrivateKey be the result of performing theparse an ASN.1 structure algorithm, withdata as theprivateKey
field ofprivateKeyInfo,structure as the ASN.1CurvePrivateKey
structure specified in Section 7 of [RFC8410], andexactData set to true.
Letkey be a newCryptoKey
that represents the Ed25519 private key identified bycurvePrivateKey.
Letalgorithm be a newKeyAlgorithm
.
Set thename
attribute ofalgorithm to "Ed25519
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
If thed
field is present andusages contains a value which is not "sign
", or, if thed
field is not present andusages contains a value which is not "verify
" thenthrow aSyntaxError
.
If thecrv
field ofjwk is not "Ed25519
", thenthrow aDataError
.
If thealg
field ofjwk is present and is not "Ed25519
" or "EdDSA
", thenthrow aDataError
.
Ifusages is non-empty and theuse
field ofjwk is present and is not "sig
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK], or it does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
d
field is present: Letalgorithm be a new instance of aKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "Ed25519
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
raw
": Ifusages contains a value which is not "verify
" thenthrow aSyntaxError
.
Letalgorithm be a newKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "Ed25519
".
Letkey be a newCryptoKey
representing the key data provided inkeyData.
Set the[[type]]
internal slot ofkey to "public
"
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey
Letkey be theCryptoKey
to be exported.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
spki
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be an instance of theSubjectPublicKeyInfo
ASN.1 structure defined in [RFC5280] with the following properties:
Set thealgorithm field to anAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm object identifier to theid-Ed25519
OID defined in [RFC8410].
Set thesubjectPublicKey field tokeyData.
Letresult be the result of DER-encodingdata.
pkcs8
": If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letdata be an instance of thePrivateKeyInfo
ASN.1 structure defined in [RFC5208] with the following properties:
Set theversion field to0
.
Set theprivateKeyAlgorithm field to aPrivateKeyAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm object identifier to theid-Ed25519
OID defined in [RFC8410].
Set theprivateKey field to the result of DER-encoding aCurvePrivateKey
ASN.1 type, as defined in Section 7 of [RFC8410], that represents the Ed25519 private key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to "OKP
".
Set thealg
attribute ofjwk to "Ed25519
".
Set thecrv
attribute ofjwk to "Ed25519
".
Set thex
attribute ofjwk according to the definition in Section 2 of [RFC8037].
Set thekey_ops
attribute ofjwk to theusages
attribute ofkey.
Set theext
attribute ofjwk to the[[extractable]]
internal slot ofkey.
Letresult bejwk.
raw
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be abyte sequence representing the Ed25519 public key represented by the[[handle]]
internal slot ofkey.
Letresult bedata.
Returnresult.
This section is non-normative.
The "X25519
" algorithm identifier is used to perform key agreement using the X25519 algorithm specified in [RFC7748].
Therecognized algorithm name for this algorithm is "X25519
".
Operation | Parameters | Result |
---|---|---|
deriveBits | EcdhKeyDeriveParams | byte sequence |
generateKey | None | CryptoKeyPair |
importKey | None | CryptoKey |
exportKey | None | object |
If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
LetpublicKey be thepublic
member ofnormalizedAlgorithm.
If the[[type]]
internal slot ofpublicKey is not "public
", thenthrow anInvalidAccessError
.
If thename
attribute of the[[algorithm]]
internal slot ofpublicKey is not equal to thename
property of the[[algorithm]]
internal slot ofkey, thenthrow anInvalidAccessError
.
Letsecret be the result of performing the X25519 function specified in [RFC7748] Section 5 withkey as the X25519 private keyk and the X25519 public key represented by the[[handle]]
internal slot ofpublicKey as the X25519 public keyu.
Ifsecret is the all-zero value, thenthrow aOperationError
. This check must be performed in constant-time, as per [RFC7748] Section 6.1.
OperationError
. Ifusages contains an entry which is not "deriveKey
" or "deriveBits
" thenthrow aSyntaxError
.
Generate an X25519 key pair, with the private key being 32 random bytes, and the public key beingX25519(a, 9)
, as defined in [RFC7748], section 6.1.
Letalgorithm be a newKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "X25519
".
LetpublicKey be a newCryptoKey
representing the public key of the generated key pair.
Set the[[type]]
internal slot ofpublicKey to "public
"
Set the[[algorithm]]
internal slot ofpublicKey toalgorithm.
Set the[[extractable]]
internal slot ofpublicKey to true.
Set the[[usages]]
internal slot ofpublicKey to be the empty list.
LetprivateKey be a newCryptoKey
representing the private key of the generated key pair.
Set the[[algorithm]]
internal slot ofprivateKey toalgorithm.
Set the[[extractable]]
internal slot ofprivateKey toextractable.
Set the[[usages]]
internal slot ofprivateKey to be theusage intersection ofusages and[ "deriveKey", "deriveBits" ]
.
Letresult be a newCryptoKeyPair
dictionary.
Set thepublicKey
attribute ofresult to bepublicKey.
Set theprivateKey
attribute ofresult to beprivateKey.
Returnresult.
LetkeyData be the key data to be imported.
spki
": Ifusages is not empty thenthrow aSyntaxError
.
Letspki be the result of running theparse a subjectPublicKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of thealgorithm
AlgorithmIdentifier field ofspki is not equal to theid-X25519
object identifier defined in [RFC8410], thenthrow aDataError
.
If theparameters
field of thealgorithm
AlgorithmIdentifier field ofspki is present, thenthrow aDataError
.
LetpublicKey be the X25519 public key identified by thesubjectPublicKey
field ofspki.
Letkey be a newCryptoKey
that representspublicKey.
Set the[[type]]
internal slot ofkey to "public
"
Letalgorithm be a newKeyAlgorithm
.
Set thename
attribute ofalgorithm to "X25519
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
pkcs8
": Ifusages contains an entry which is not "deriveKey
" or "deriveBits
" thenthrow aSyntaxError
.
LetprivateKeyInfo be the result of running theparse a privateKeyInfo algorithm overkeyData.
If thealgorithm
object identifier field of theprivateKeyAlgorithm
PrivateKeyAlgorithm field ofprivateKeyInfo is not equal to theid-X25519
object identifier defined in [RFC8410], thenthrow aDataError
.
If theparameters
field of theprivateKeyAlgorithm
PrivateKeyAlgorithmIdentifier field ofprivateKeyInfo is present, thenthrow aDataError
.
LetcurvePrivateKey be the result of performing theparse an ASN.1 structure algorithm, withdata as theprivateKey
field ofprivateKeyInfo,structure as the ASN.1CurvePrivateKey
structure specified in Section 7 of [RFC8410], andexactData set to true.
Letkey be a newCryptoKey
that represents the X25519 private key identified bycurvePrivateKey.
Letalgorithm be a newKeyAlgorithm
.
Set thename
attribute ofalgorithm to "X25519
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
If thed
field is present and ifusages contains an entry which is not "deriveKey
" or "deriveBits
" thenthrow aSyntaxError
.
If thed
field is not present and ifusages is not empty thenthrow aSyntaxError
.
If thecrv
field ofjwk is not "X25519
", thenthrow aDataError
.
Ifusages is non-empty and theuse
field ofjwk is present and is not equal to "enc
" thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK], or it does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
d
field is present: Letalgorithm be a new instance of aKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "X25519
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
raw
": Ifusages is not empty thenthrow aSyntaxError
.
Letalgorithm be a newKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "X25519
".
Letkey be a newCryptoKey
representing the key data provided inkeyData.
Set the[[type]]
internal slot ofkey to "public
"
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey
Letkey be theCryptoKey
to be exported.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
spki
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be an instance of theSubjectPublicKeyInfo
ASN.1 structure defined in [RFC5280] with the following properties:
Set thealgorithm field to anAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm object identifier to theid-X25519
OID defined in [RFC8410].
Set thesubjectPublicKey field tokeyData.
Letresult be the result of DER-encodingdata.
pkcs8
": If the[[type]]
internal slot ofkey is not "private
", thenthrow anInvalidAccessError
.
Letdata be an instance of thePrivateKeyInfo
ASN.1 structure defined in [RFC5208] with the following properties:
Set theversion field to0
.
Set theprivateKeyAlgorithm field to aPrivateKeyAlgorithmIdentifier
ASN.1 type with the following properties:
Set thealgorithm object identifier to theid-X25519
OID defined in [RFC8410].
Set theprivateKey field to the result of DER-encoding aCurvePrivateKey
ASN.1 type, as defined in Section 7 of [RFC8410], that represents the X25519 private key represented by the[[handle]]
internal slot ofkey
Letresult be the result of DER-encodingdata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to "OKP
".
Set thecrv
attribute ofjwk to "X25519
".
Set thex
attribute ofjwk according to the definition in Section 2 of [RFC8037].
Set thekey_ops
attribute ofjwk to theusages
attribute ofkey.
Set theext
attribute ofjwk to the[[extractable]]
internal slot ofkey.
Letresult bejwk.
raw
": If the[[type]]
internal slot ofkey is not "public
", thenthrow anInvalidAccessError
.
Letdata be abyte sequence representing the X25519 public key represented by the[[handle]]
internal slot ofkey.
Letresult bedata.
Returnresult.
This section is non-normative.
The "AES-CTR
" algorithm identifier is used to perform encryption and decryption using AES in Counter mode, as described in [NIST-SP800-38A].
Therecognized algorithm name for this algorithm is "AES-CTR
".
Operation | Parameters | Result |
---|---|---|
encrypt | AesCtrParams | byte sequence |
decrypt | AesCtrParams | byte sequence |
generateKey | AesKeyGenParams | CryptoKey |
importKey | None | CryptoKey |
exportKey | None | object |
get key length | AesDerivedKeyParams | Integer |
WebIDLdictionaryAesCtrParams
:Algorithm
{ requiredBufferSourcecounter
; required [EnforceRange]octetlength
;};
Thecounter
member contains the initial value of the counter block.counter
MUST be 16 bytes (the AES block size). The counter bits are the rightmost length bits of the counter block. The rest of the counter block is for the nonce. The counter bits are incremented using the standard incrementing function specified in NIST SP 800-38A Appendix B.1: the counter bits are interpreted as a big-endian integer and incremented by one.
Thelength
member contains the length, in bits, of the rightmost part of the counter block that is incremented.
WebIDLdictionaryAesKeyAlgorithm
:KeyAlgorithm
{ requiredunsigned shortlength
;};
Thelength
member represents the length, in bits, of the key.
WebIDLdictionaryAesKeyGenParams
:Algorithm
{ required [EnforceRange]unsigned shortlength
;};
Thelength
member represents the length, in bits, of the key.
WebIDLdictionaryAesDerivedKeyParams
:Algorithm
{ required [EnforceRange]unsigned shortlength
;};
Thelength
member represents the length, in bits, of the key.
If thecounter
member ofnormalizedAlgorithm does not have alength of 16 bytes, thenthrow anOperationError
.
If thelength
member ofnormalizedAlgorithm is zero or is greater than 128, thenthrow anOperationError
.
Letciphertext be the result of performing the CTR Encryption operation described in Section 6.5 of [NIST-SP800-38A] using AES as the block cipher, thecounter
member ofnormalizedAlgorithm as the initial value of the counter block, thelength
member ofnormalizedAlgorithm as the input parameterm to the standard counter block incrementing function defined in Appendix B.1 of [NIST-SP800-38A] andplaintext as the input plaintext.
Returnciphertext.
If thecounter
member ofnormalizedAlgorithm does not have alength of 16 bytes, thenthrow anOperationError
.
If thelength
member ofnormalizedAlgorithm is zero or is greater than 128, thenthrow anOperationError
.
Letplaintext be the result of performing the CTR Decryption operation described in Section 6.5 of [NIST-SP800-38A] using AES as the block cipher, thecounter
member ofnormalizedAlgorithm as the initial value of the counter block, thelength
member ofnormalizedAlgorithm as the input parameterm to the standard counter block incrementing function defined in Appendix B.1 of [NIST-SP800-38A] andciphertext as the input ciphertext.
Returnplaintext.
Ifusages contains any entry which is not one of "encrypt
", "decrypt
", "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
If thelength
member ofnormalizedAlgorithm is not equal to one of 128, 192 or 256, thenthrow anOperationError
.
Generate an AES key of length equal to thelength
member ofnormalizedAlgorithm.
If the key generation step fails, thenthrow anOperationError
.
Letkey be a newCryptoKey
object representing the generated AES key.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-CTR
".
Set thelength
attribute ofalgorithm to equal thelength
member ofnormalizedAlgorithm.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Set the[[extractable]]
internal slot ofkey to beextractable.
Set the[[usages]]
internal slot ofkey to beusages.
Returnkey.
Ifusages contains an entry which is not one of "encrypt
", "decrypt
", "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
raw
":Letdata bekeyData.
If thelength in bits ofdata is not 128, 192 or 256 thenthrow aDataError
.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
Ifjwk does not meet the requirements of Section 6.4 of JSON Web Algorithms [JWA], thenthrow aDataError
.
Letdata be thebyte sequence obtained by decoding thek
field ofjwk.
alg
field ofjwk is present, and is not "A128CTR
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A192CTR
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A256CTR
", thenthrow aDataError
.DataError
. Ifusages is non-empty and theuse
field ofjwk is present and is not "enc
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
NotSupportedError
. Letkey be a newCryptoKey
object representing an AES key with valuedata.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-CTR
".
Set thelength
attribute ofalgorithm to the length, in bits, ofdata.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
raw
": Letdata be abyte sequence containing the raw octets of the key represented by the[[handle]]
internal slot ofkey.
Letresult bedata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "oct
".
Set thek
attribute ofjwk to be a string containing the raw octets of the key represented by the[[handle]]
internal slot ofkey, encoded according to Section 6.4 of JSON Web Algorithms [JWA].
Set thekey_ops
attribute ofjwk to equal the[[usages]]
internal slot ofkey.
Set theext
attribute ofjwk to equal the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
If thelength
member ofnormalizedDerivedKeyAlgorithm is not 128, 192 or 256, thenthrow aOperationError
.
Return thelength
member ofnormalizedDerivedKeyAlgorithm.
This section is non-normative.
The "AES-CBC
" algorithm identifier is used to perform encryption and decryption using AES in Cipher Block Chaining mode, as described in [NIST-SP800-38A].
When operating in CBC mode, messages that are not exact multiples of the AES block size (16 bytes) can be padded under a variety of padding schemes. In the Web Crypto API, the only padding mode that is supported is that of PKCS#7, as described by Section 10.3, step 2, of [RFC2315].
Therecognized algorithm name for this algorithm is "AES-CBC
".
Operation | Parameters | Result |
---|---|---|
encrypt | AesCbcParams | byte sequence |
decrypt | AesCbcParams | byte sequence |
generateKey | AesKeyGenParams | CryptoKey |
importKey | None | CryptoKey |
exportKey | None | object |
get key length | AesDerivedKeyParams | Integer |
WebIDLdictionaryAesCbcParams
:Algorithm
{ requiredBufferSourceiv
;};
Theiv
member represents the initialization vector. ItMUST be 16 bytes.
If theiv
member ofnormalizedAlgorithm does not have alength of 16 bytes, thenthrow anOperationError
.
LetpaddedPlaintext be the result of adding padding octets toplaintext according to the procedure defined in Section 10.3 of [RFC2315], step 2, with a value ofk of 16.
Letciphertext be the result of performing the CBC Encryption operation described in Section 6.2 of [NIST-SP800-38A] using AES as the block cipher, theiv
member ofnormalizedAlgorithm as theIV input parameter andpaddedPlaintext as the input plaintext.
Returnciphertext.
If theiv
member ofnormalizedAlgorithm does not have alength of 16 bytes, thenthrow anOperationError
.
If the length ofciphertext is zero or is not a multiple of 16 bytes, thenthrow anOperationError
.
LetpaddedPlaintext be the result of performing the CBC Decryption operation described in Section 6.2 of [NIST-SP800-38A] using AES as the block cipher, theiv
member ofnormalizedAlgorithm as theIV input parameter andciphertext as the input ciphertext.
Letp be the value of the last octet ofpaddedPlaintext.
Ifp is zero or greater than 16, or if any of the lastp octets ofpaddedPlaintext have a value which is notp, thenthrow anOperationError
.
Letplaintext be the result of removingp octets from the end ofpaddedPlaintext.
Returnplaintext.
Ifusages contains any entry which is not one of "encrypt
", "decrypt
", "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
If thelength
member ofnormalizedAlgorithm is not equal to one of 128, 192 or 256, thenthrow anOperationError
.
Generate an AES key of length equal to thelength
member ofnormalizedAlgorithm.
If the key generation step fails, thenthrow anOperationError
.
Letkey be a newCryptoKey
object representing the generated AES key.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-CBC
".
Set thelength
attribute ofalgorithm to equal thelength
member ofnormalizedAlgorithm.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Set the[[extractable]]
internal slot ofkey to beextractable.
Set the[[usages]]
internal slot ofkey to beusages.
Returnkey.
Ifusages contains an entry which is not one of "encrypt
", "decrypt
", "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
raw
":Letdata bekeyData.
If thelength in bits ofdata is not 128, 192 or 256 thenthrow aDataError
.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
Ifjwk does not meet the requirements of Section 6.4 of JSON Web Algorithms [JWA], thenthrow aDataError
.
Letdata be thebyte sequence obtained by decoding thek
field ofjwk.
alg
field ofjwk is present, and is not "A128CBC
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A192CBC
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A256CBC
", thenthrow aDataError
.DataError
. Ifusages is non-empty and theuse
field ofjwk is present and is not "enc
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
NotSupportedError
Letkey be a newCryptoKey
object representing an AES key with valuedata.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-CBC
".
Set thelength
attribute ofalgorithm to the length, in bits, ofdata.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
raw
": Letdata be abyte sequence containing the raw octets of the key represented by the[[handle]]
internal slot ofkey.
Letresult bedata.
jwk
":Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "oct
".
Set thek
attribute ofjwk to be a string containing the raw octets of the key represented by the[[handle]]
internal slot ofkey, encoded according to Section 6.4 of JSON Web Algorithms [JWA].
Set thekey_ops
attribute ofjwk to equal theusages
attribute ofkey.
Set theext
attribute ofjwk to equal the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
If thelength
member ofnormalizedDerivedKeyAlgorithm is not 128, 192 or 256, thenthrow anOperationError
.
Return thelength
member ofnormalizedDerivedKeyAlgorithm.
This section is non-normative.
The "AES-GCM
" algorithm identifier is used to perform authenticated encryption and decryption using AES in Galois/Counter Mode mode, as described in [NIST-SP800-38D].
Therecognized algorithm name for this algorithm is "AES-GCM
".
Operation | Parameters | Result |
---|---|---|
encrypt | AesGcmParams | byte sequence |
decrypt | AesGcmParams | byte sequence |
generateKey | AesKeyGenParams | CryptoKey |
importKey | None | CryptoKey |
exportKey | None | object |
get key length | AesDerivedKeyParams | Integer |
WebIDLdictionaryAesGcmParams
:Algorithm
{ requiredBufferSourceiv
;BufferSourceadditionalData
; [EnforceRange]octettagLength
;};
Theiv
member represents the initialization vector to use. May be up to 2^64-1 bytes long.
TheadditionalData
member represents the additional authentication data to include.
ThetagLength
member represents the desired length of the authentication tag. May be 0 - 128.
Ifplaintext has alength greater than 2^39 - 256 bytes, thenthrow anOperationError
.
If theiv
member ofnormalizedAlgorithm has alength greater than 2^64 - 1 bytes, thenthrow anOperationError
.
If theadditionalData
member ofnormalizedAlgorithm is present and has alength greater than 2^64 - 1 bytes, thenthrow anOperationError
.
tagLength
member ofnormalizedAlgorithm is not present:tagLength
member ofnormalizedAlgorithm is one of 32, 64, 96, 104, 112, 120 or 128:tagLength
member ofnormalizedAlgorithmOperationError
. LetadditionalData be theadditionalData
member ofnormalizedAlgorithm if present or an emptybyte sequence otherwise.
LetC andT be the outputs that result from performing the Authenticated Encryption Function described in Section 7.1 of [NIST-SP800-38D] using AES as the block cipher, theiv
member ofnormalizedAlgorithm as theIV input parameter,additionalData as theA input parameter,tagLength as thet pre-requisite andplaintext as the input plaintext.
Letciphertext be equal toC |T, where '|' denotes concatenation.
Returnciphertext.
tagLength
member ofnormalizedAlgorithm is not present:tagLength
member ofnormalizedAlgorithm is one of 32, 64, 96, 104, 112, 120 or 128:tagLength
member ofnormalizedAlgorithmOperationError
. Ifciphertext has alength in bits less thantagLength, thenthrow anOperationError
.
If theiv
member ofnormalizedAlgorithm has alength greater than 2^64 - 1 bytes, thenthrow anOperationError
.
If theadditionalData
member ofnormalizedAlgorithm is present and has alength greater than 2^64 - 1 bytes, thenthrow anOperationError
.
Lettag be the lasttagLength bits ofciphertext.
LetactualCiphertext be the result of removing the lasttagLength bits fromciphertext.
LetadditionalData be theadditionalData
member ofnormalizedAlgorithm if present or an emptybyte sequence otherwise.
Perform the Authenticated Decryption Function described in Section 7.2 of [NIST-SP800-38D] using AES as the block cipher, theiv
member ofnormalizedAlgorithm as theIV input parameter,additionalData as theA input parameter,tagLength as thet pre-requisite,actualCiphertext as the input ciphertext,C andtag as the authentication tag,T.
OperationError
Returnplaintext.
Ifusages contains any entry which is not one of "encrypt
", "decrypt
", "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
If thelength
member ofnormalizedAlgorithm is not equal to one of 128, 192 or 256, thenthrow anOperationError
.
Generate an AES key of length equal to thelength
member ofnormalizedAlgorithm.
If the key generation step fails, thenthrow anOperationError
.
Letkey be a newCryptoKey
object representing the generated AES key.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-GCM
".
Set thelength
attribute ofalgorithm to equal thelength
member ofnormalizedAlgorithm.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Set the[[extractable]]
internal slot ofkey to beextractable.
Set the[[usages]]
internal slot ofkey to beusages.
Returnkey.
Ifusages contains an entry which is not one of "encrypt
", "decrypt
", "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
raw
":Letdata bekeyData.
If thelength in bits ofdata is not 128, 192 or 256 thenthrow aDataError
.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
Ifjwk does not meet the requirements of Section 6.4 of JSON Web Algorithms [JWA], thenthrow aDataError
.
Letdata be thebyte sequence obtained by decoding thek
field ofjwk.
alg
field ofjwk is present, and is not "A128GCM
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A192GCM
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A256GCM
", thenthrow aDataError
.DataError
. Ifusages is non-empty and theuse
field ofjwk is present and is not "enc
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
NotSupportedError
. Letkey be a newCryptoKey
object representing an AES key with valuedata.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-GCM
".
Set thelength
attribute ofalgorithm to the length, in bits, ofdata.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
raw
": Letdata be abyte sequence containing the raw octets of the key represented by the[[handle]]
internal slot ofkey.
Letresult bedata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "oct
".
Set thek
attribute ofjwk to be a string containing the raw octets of the key represented by the[[handle]]
internal slot ofkey, encoded according to Section 6.4 of JSON Web Algorithms [JWA].
Set thekey_ops
attribute ofjwk to equal theusages
attribute ofkey.
Set theext
attribute ofjwk to equal the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
If thelength
member ofnormalizedDerivedKeyAlgorithm is not 128, 192 or 256, thenthrow anOperationError
.
Return thelength
member ofnormalizedDerivedKeyAlgorithm.
This section is non-normative.
The "AES-KW
" algorithm identifier is used to perform key wrapping using AES, as described in [RFC3394].
Therecognized algorithm name for this algorithm is "AES-KW
".
Operation | Parameters | Result |
---|---|---|
wrapKey | None | byte sequence |
unwrapKey | None | byte sequence |
generateKey | AesKeyGenParams | CryptoKey |
importKey | None | CryptoKey |
exportKey | None | object |
get key length | AesDerivedKeyParams | Integer |
Ifplaintext is not a multiple of 64 bits in length, thenthrow anOperationError
.
Letciphertext be the result of performing the Key Wrap operation described in Section 2.2.1 of [RFC3394] withplaintext as the plaintext to be wrapped and using the default Initial Value defined in Section 2.2.3.1 of the same document.
Returnciphertext.
Letplaintext be the result of performing the Key Unwrap operation described in Section 2.2.2 of [RFC3394] withciphertext as the input ciphertext and using the default Initial Value defined in Section 2.2.3.1 of the same document.
If the Key Unwrap operation returns an error, thenthrow anOperationError
.
Returnplaintext.
Ifusages contains any entry which is not one of "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
If thelength
property ofnormalizedAlgorithm is not equal to one of 128, 192 or 256, thenthrow anOperationError
.
Generate an AES key of length equal to thelength
member ofnormalizedAlgorithm.
If the key generation step fails, thenthrow anOperationError
.
Letkey be a newCryptoKey
object representing the generated AES key.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-KW
".
Set thelength
attribute ofalgorithm to equal thelength
property ofnormalizedAlgorithm.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Set the[[extractable]]
internal slot ofkey to beextractable.
Set the[[usages]]
internal slot ofkey to beusages.
Returnkey.
Ifusages contains an entry which is not one of "wrapKey
" or "unwrapKey
", thenthrow aSyntaxError
.
raw
":Letdata bekeyData.
If thelength in bits ofdata is not 128, 192 or 256 thenthrow aDataError
.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
Ifjwk does not meet the requirements of Section 6.4 of JSON Web Algorithms [JWA], thenthrow aDataError
.
Letdata be thebyte sequence obtained by decoding thek
field ofjwk.
alg
field ofjwk is present, and is not "A128KW
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A192KW
", thenthrow aDataError
.alg
field ofjwk is present, and is not "A256KW
", thenthrow aDataError
.DataError
. Ifusages is non-empty and theuse
field ofjwk is present and is not "enc
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
NotSupportedError
. Letkey be a newCryptoKey
representing an AES key with valuedata.
Letalgorithm be a newAesKeyAlgorithm
.
Set thename
attribute ofalgorithm to "AES-KW
".
Set thelength
attribute ofalgorithm to the length, in bits, ofdata.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
raw
": Letdata be abyte sequence containing the raw octets of the key represented by the[[handle]]
internal slot ofkey.
Letresult bedata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "oct
".
Set thek
attribute ofjwk to be a string containing the raw octets of the key represented by the[[handle]]
internal slot ofkey, encoded according to Section 6.4 of JSON Web Algorithms [JWA].
Set thekey_ops
attribute ofjwk to equal theusages
attribute ofkey.
Set theext
attribute ofjwk to equal the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
If thelength
member ofnormalizedDerivedKeyAlgorithm is not 128, 192 or 256, thenthrow anOperationError
.
Return thelength
member ofnormalizedDerivedKeyAlgorithm.
This section is non-normative.
TheHMAC
algorithm calculates and verifies hash-based message authentication codes according to [FIPS-198-1] using the SHA hash functions defined in this specification.
Other specifications may specify the use of additional hash algorithms with HMAC. Such specifications must define the digest operation for the additional hash algorithms andkey import steps andkey export steps for HMAC.
Therecognized algorithm name for this algorithm is "HMAC
".
Operation | Parameters | Result |
---|---|---|
sign | None | byte sequence |
verify | None | boolean |
generateKey | HmacKeyGenParams | CryptoKey |
importKey | HmacImportParams | CryptoKey |
exportKey | None | object |
get key length | HmacImportParams | Integer |
WebIDLdictionaryHmacImportParams
:Algorithm
{ requiredHashAlgorithmIdentifier
hash
; [EnforceRange]unsigned longlength
;};
Thehash
member represents the inner hash function to use.
Thelength
member represent the length (in bits) of the key.
WebIDLdictionaryHmacKeyAlgorithm
:KeyAlgorithm
{ requiredKeyAlgorithm
hash
; requiredunsigned longlength
;};
Thehash
member represents the inner hash function to use.
Thelength
member represent the length (in bits) of the key.
WebIDLdictionaryHmacKeyGenParams
:Algorithm
{ requiredHashAlgorithmIdentifier
hash
; [EnforceRange]unsigned longlength
;};
Thehash
member represents the inner hash function to use.
Thelength
member represent the length (in bits) of the key to generate. If unspecified, the recommended length will be used, which is the size of the associated hash function's block size.
Letmac be the result of performing the MAC Generation operation described in Section 4 of [FIPS-198-1] using the key represented by the[[handle]]
internal slot ofkey, the hash function identified by thehash
attribute of the[[algorithm]]
internal slot ofkey andmessage as the input datatext.
Returnmac.
Letmac be the result of performing the MAC Generation operation described in Section 4 of [FIPS-198-1] using the key represented by the[[handle]]
internal slot ofkey, the hash function identified by thehash
attribute of the[[algorithm]]
internal slot ofkey andmessage as the input datatext.
Return true ifmac is equal tosignature and false otherwise.
Ifusages contains any entry which is not "sign
" or "verify
", thenthrow aSyntaxError
.
length
member ofnormalizedAlgorithm is not present:hash
member ofnormalizedAlgorithm.length
member ofnormalizedAlgorithm is non-zero:length
member ofnormalizedAlgorithm.OperationError
.Generate a key of lengthlength bits.
If the key generation step fails, thenthrow anOperationError
.
Letkey be a newCryptoKey
object representing the generated key.
Letalgorithm be a newHmacKeyAlgorithm
.
Set thename
attribute ofalgorithm to "HMAC
".
Set thelength
attribute ofalgorithm tolength.
Lethash be a newKeyAlgorithm
.
Set thename
attribute ofhash to equal thename
member of thehash
member ofnormalizedAlgorithm.
Set thehash
attribute ofalgorithm tohash.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Set the[[extractable]]
internal slot ofkey to beextractable.
Set the[[usages]]
internal slot ofkey to beusages.
Returnkey.
LetkeyData be the key data to be imported.
Ifusages contains an entry which is not "sign
" or "verify
", thenthrow aSyntaxError
.
Lethash be a newKeyAlgorithm
.
raw
":Letdata bekeyData.
Sethash to equal thehash
member ofnormalizedAlgorithm.
jwk
":JsonWebKey
dictionary:Letjwk equalkeyData.
Ifjwk does not meet the requirements of Section 6.4 of JSON Web Algorithms [JWA], thenthrow aDataError
.
Letdata be thebyte sequence obtained by decoding thek
field ofjwk.
Set thehash to equal thehash
member ofnormalizedAlgorithm.
name
attribute ofhash is "SHA-1
":alg
field ofjwk is present and is not "HS1
", thenthrow aDataError
.name
attribute ofhash is "SHA-256
":alg
field ofjwk is present and is not "HS256
", thenthrow aDataError
.name
attribute ofhash is "SHA-384
":alg
field ofjwk is present and is not "HS384
", thenthrow aDataError
.name
attribute ofhash is "SHA-512
":alg
field ofjwk is present and is not "HS512
", thenthrow aDataError
.name
attribute ofhash is defined inanother applicable specification: Ifusages is non-empty and theuse
field ofjwk is present and is not "sign
", thenthrow aDataError
.
If thekey_ops
field ofjwk is present, and is invalid according to the requirements of JSON Web Key [JWK] or does not contain all of the specifiedusages values, thenthrow aDataError
.
If theext
field ofjwk is present and has the value false andextractable is true, thenthrow aDataError
.
NotSupportedError
.Letlength be thelength in bits ofdata.
length
member ofnormalizedAlgorithm is present: Letkey be a newCryptoKey
object representing an HMAC key with the firstlength bits ofdata.
Letalgorithm be a newHmacKeyAlgorithm
.
Set thename
attribute ofalgorithm to "HMAC
".
Set thelength
attribute ofalgorithm tolength.
Set thehash
attribute ofalgorithm tohash.
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
If the underlying cryptographic key material represented by the[[handle]]
internal slot ofkey cannot be accessed, thenthrow anOperationError
.
Letbits be the raw bits of the key represented by the[[handle]]
internal slot ofkey.
Letdata be abyte sequence containingbits.
raw
":Letresult bedata.
jwk
": Letjwk be a newJsonWebKey
dictionary.
Set thekty
attribute ofjwk to the string "oct
".
Set thek
attribute ofjwk to be a string containingdata, encoded according to Section 6.4 of JSON Web Algorithms [JWA].
Letalgorithm be the[[algorithm]]
internal slot ofkey.
Lethash be thehash
attribute ofalgorithm.
name
attribute ofhash is "SHA-1
":alg
attribute ofjwk to the string "HS1
".name
attribute ofhash is "SHA-256
":alg
attribute ofjwk to the string "HS256
".name
attribute ofhash is "SHA-384
":alg
attribute ofjwk to the string "HS384
".name
attribute ofhash is "SHA-512
":alg
attribute ofjwk to the string "HS512
".name
attribute ofhash is defined inanother applicable specification:Perform anykey export steps defined byother applicable specifications, passingformat andkey and obtainingalg.
Set thealg
attribute ofjwk toalg.
Set thekey_ops
attribute ofjwk to equal theusages
attribute ofkey.
Set theext
attribute ofjwk to equal the[[extractable]]
internal slot ofkey.
Letresult bejwk.
Returnresult.
length
member ofnormalizedDerivedKeyAlgorithm is not present: Letlength be the block size in bits of the hash function identified by thehash
member ofnormalizedDerivedKeyAlgorithm.
length
member ofnormalizedDerivedKeyAlgorithm is non-zero:length
member ofnormalizedDerivedKeyAlgorithm.TypeError
.Returnlength.
This section is non-normative.
This describes the SHA-1 and SHA-2 families, as specified by [FIPS-180-4].
Therecognized algorithm names are "SHA-1
", "SHA-256
", "SHA-384
", and "SHA-512
" for the respective SHA algorithms.
Operation | Parameters | Result |
---|---|---|
digest | None | byte sequence |
name
member ofnormalizedAlgorithm is a cases-sensitive string match for "SHA-1
":name
member ofnormalizedAlgorithm is a cases-sensitive string match for "SHA-256
":name
member ofnormalizedAlgorithm is a cases-sensitive string match for "SHA-384
":name
member ofnormalizedAlgorithm is a cases-sensitive string match for "SHA-512
": If performing the operation results in an error, thenthrow anOperationError
.
Returnresult.
This section is non-normative.
The "HKDF
" algorithm identifier is used to perform key derivation using the extraction-then-expansion approach described in [RFC5869] and using the SHA hash functions defined in this specification.
Other specifications may specify the use of additional hash algorithms with HKDF. Such specifications must define the digest operation for the additional hash algorithms.
Therecognized algorithm name for this algorithm is "HKDF
".
Operation | Parameters | Result |
---|---|---|
deriveBits | HkdfParams | byte sequence |
importKey | None | CryptoKey |
Get key length | None | null |
WebIDLdictionaryHkdfParams
:Algorithm
{ requiredHashAlgorithmIdentifier
hash
; requiredBufferSourcesalt
; requiredBufferSourceinfo
;};
Thehash
member represents the algorithm to use with HMAC (e.g.: SHA-256).
Thesalt
member represents the salt used in the extract step.
Theinfo
member represents application specific context for the derived keying material.
Iflength is null or is not a multiple of 8, thenthrow anOperationError
.
LetkeyDerivationKey be the secret represented by the[[handle]]
internal slot ofkey.
Letresult be the result of performing the HKDF extract and then the HKDF expand step described in Section 2 of [RFC5869] using:
If the key derivation operation fails, thenthrow anOperationError
.
Returnresult.
LetkeyData be the key data to be imported.
raw
": Ifusages contains a value that is not "deriveKey
" or "deriveBits
", thenthrow aSyntaxError
.
Ifextractable is notfalse
, thenthrow aSyntaxError
.
Letkey be a newCryptoKey
representing the key data provided inkeyData.
Letalgorithm be a newKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "HKDF
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
NotSupportedError
.Return null.
This section is non-normative.
The "PBKDF2
" algorithm identifier is used to perform key derivation using the PKCS#5 password-based key derivation function version 2, as defined in [RFC8018] using HMAC as the pseudo-random function, using the SHA hash functions defined in this specification.
Other specifications may specify the use of additional hash algorithms with PBKDF2. Such specifications must define the digest operation for the additional hash algorithms.
Therecognized algorithm name for this algorithm is "PBKDF2
".
Operation | Parameters | Result |
---|---|---|
deriveBits | Pbkdf2Params | byte sequence |
importKey | None | CryptoKey |
Get key length | None | null |
WebIDLdictionaryPbkdf2Params
:Algorithm
{ requiredBufferSourcesalt
; required [EnforceRange]unsigned longiterations
; requiredHashAlgorithmIdentifier
hash
;};
ThePbkdf2Params
dictionary has asalt
member, aiterations
member, and ahash
member.
Iflength is null or is not a multiple of 8, thenthrow anOperationError
.
If theiterations
member ofnormalizedAlgorithm is zero, thenthrow anOperationError
.
Iflength is zero, return an emptybyte sequence.
Letprf be the MAC Generation function described in Section 4 of [FIPS-198-1] using the hash function described by thehash
member ofnormalizedAlgorithm.
Letresult be the result of performing the PBKDF2 operation defined in Section 5.2 of [RFC8018] usingprf as the pseudo-random function,PRF, the password represented by the[[handle]]
internal slot ofkey as the password,P, thesalt
attribute ofnormalizedAlgorithm as the salt,S, the value of theiterations
attribute ofnormalizedAlgorithm as the iteration count,c, andlength divided by 8 as the intended key length,dkLen.
If the key derivation operation fails, thenthrow anOperationError
.
Returnresult.
Ifformat is not "raw
",throw aNotSupportedError
Ifusages contains a value that is not "deriveKey
" or "deriveBits
", thenthrow aSyntaxError
.
Ifextractable is notfalse
, thenthrow aSyntaxError
.
Letkey be a newCryptoKey
representingkeyData.
Letalgorithm be a newKeyAlgorithm
object.
Set thename
attribute ofalgorithm to "PBKDF2
".
Set the[[algorithm]]
internal slot ofkey toalgorithm.
Returnkey.
Return null.
This example generates two X25519 key pairs, one for Alice and one for Bob, performs a key agreement between them, derives a 256-bit AES-GCM key from the result using HKDF with SHA-256, and encrypts and decrypts some data with it.
// 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(newUint8Array(32));const info =newTextEncoder().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(newUint8Array(12));const message =newTextEncoder().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 =newTextDecoder().decode(decrypted);
const data =newTextEncoder().encode('Hello, world!');const key =await crypto.subtle.generateKey('Ed25519',false, ['sign']);const signature =await crypto.subtle.sign('Ed25519', key.privateKey, data);
const data =newTextEncoder().encode('Hello, world!');const aesAlgorithmKeyGen = {name:'AES-GCM',// AesKeyGenParamslength:256};const aesAlgorithmEncrypt = {name:'AES-GCM',// AesGcmParamsiv: crypto.getRandomValues(newUint8Array(16))};const key =await crypto.subtle.generateKey(aesAlgorithmKeyGen,false, ['encrypt']);const encrypted =await crypto.subtle.encrypt(aesAlgorithmEncrypt, key, data);
const filename =`${crypto.randomUUID()}.txt`;
This section registers the following algorithm identifiers in the IANA JSON Web Signature and Encryption Algorithms Registry for use with JSON Web Key. Note that the 'Implementation Requirements' field in the template refers to use with JSON Web Signature and JSON Web Encryption specifically, in which case use of unauthenticated encryption is prohibited.
Thanks are due especially to Ryan Sleevi, the original author and editor, and Mark Watson, the former editor of this document.
Thanks to 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, and Wan-Teh Chang for their technical feedback and assistance.
Thanks to theW3C Web Cryptography WG, and to participants on the public-webcrypto@w3.org mailing list.
TheW3C would like to thank theNorthrop Grumman Cybersecurity Research Consortium for supportingW3C/MIT.
ThegetRandomValues
method in theCrypto
interface was originally proposed by Adam Barth to theWHATWG.
This section is non-normative.
Refer to algorithm-specific sections for the normative requirements of importing and exporting JWK.
JSON Web Key | AlgorithmIdentifier |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This section is non-normative.
Refer to algorithm-specific sections for the normative requirements of importing and exporting SPKI.
Algorithm OID | subjectPublicKey ASN.1 structure | AlgorithmIdentifier | Reference |
---|---|---|---|
rsaEncryption (1.2.840.113549.1.1.1) | RSAPublicKey | "RSASSA-PKCS1-v1_5 ", "RSA-PSS ", or "RSA-OAEP " | [RFC3447] |
id-ecPublicKey (1.2.840.10045.2.1) | ECPoint | "ECDH " or "ECDSA " | [RFC5480] |
id-Ed25519 (1.3.101.112) | BIT STRING | "Ed25519 " | [RFC8410] |
id-X25519 (1.3.101.110) | BIT STRING | "X25519 " | [RFC8410] |
The object identifiers used by this specification do not include information about the specific algorithm and hash that the key is intended to be used with. If this is required, it's recommended that the "jwk
" key format is used instead.
This section is non-normative.
Refer to algorithm-specific sections for the normative requirements of importing and exporting PKCS#8 PrivateKeyInfo.
privateKeyAlgorithm | privateKey format | AlgorithmIdentifier | Reference |
---|---|---|---|
rsaEncryption (1.2.840.113549.1.1.1) | RSAPrivateKey | "RSASSA-PKCS1-v1_5 ", "RSA-PSS ", or "RSA-OAEP " | [RFC3447] |
id-ecPublicKey (1.2.840.10045.2.1) | ECPrivateKey | "ECDH " or "ECDSA " | [RFC5480] |
id-Ed25519 (1.3.101.112) | CurvePrivateKey | "Ed25519 " | [RFC8410] |
id-X25519 (1.3.101.110) | CurvePrivateKey | "X25519 " | [RFC8410] |
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: