mirror of
https://github.com/servo/servo
synced 2026-04-25 17:15:48 +02:00
Implement the `SubtleCrypto.supports` method in our WebCrypto API. The *check support for an algorithm* algorithm is also implemented to support the functionality of the `SubtleCrypto.supports` method. The `SubtleCrypto.supports` method has two overloads. One of them has a union containing a non-object value at the distinguishing index. Our `codegen.py` currently does not support unions of non-object values at distinguish index. So, `codegen.py` is also patched to extend its support to unions of objects, strings, numbers and boolean values. Specification of `SubtleCrypto.supports`: https://wicg.github.io/webcrypto-modern-algos/#SubtleCrypto-method-supports Specification of "check support for an algorithm": https://wicg.github.io/webcrypto-modern-algos/#dfn-check-support-for-algorithm Testing: - Pass WPT tests related to `supports` method. - Add new tests for IDL operation overloading with unions of various types. Fixes: Part of #40687 --------- Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
378 lines
11 KiB
Plaintext
378 lines
11 KiB
Plaintext
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
// https://w3c.github.io/webcrypto/#subtlecrypto-interface
|
|
|
|
// enum KeyFormat { "raw", "spki", "pkcs8", "jwk" };
|
|
|
|
[SecureContext,Exposed=(Window,Worker),Pref="dom_crypto_subtle_enabled"]
|
|
interface SubtleCrypto {
|
|
Promise<any> encrypt(AlgorithmIdentifier algorithm,
|
|
CryptoKey key,
|
|
BufferSource data);
|
|
Promise<any> decrypt(AlgorithmIdentifier algorithm,
|
|
CryptoKey key,
|
|
BufferSource data);
|
|
Promise<any> sign(AlgorithmIdentifier algorithm,
|
|
CryptoKey key,
|
|
BufferSource data);
|
|
Promise<any> verify(AlgorithmIdentifier algorithm,
|
|
CryptoKey key,
|
|
BufferSource signature,
|
|
BufferSource data);
|
|
Promise<any> digest(AlgorithmIdentifier algorithm,
|
|
BufferSource data);
|
|
|
|
Promise<any> generateKey(AlgorithmIdentifier algorithm,
|
|
boolean extractable,
|
|
sequence<KeyUsage> keyUsages );
|
|
Promise<any> deriveKey(AlgorithmIdentifier algorithm,
|
|
CryptoKey baseKey,
|
|
AlgorithmIdentifier derivedKeyType,
|
|
boolean extractable,
|
|
sequence<KeyUsage> keyUsages );
|
|
Promise<ArrayBuffer> deriveBits(AlgorithmIdentifier algorithm,
|
|
CryptoKey baseKey,
|
|
optional unsigned long? length = null);
|
|
|
|
Promise<CryptoKey> importKey(KeyFormat format,
|
|
(BufferSource or JsonWebKey) keyData,
|
|
AlgorithmIdentifier algorithm,
|
|
boolean extractable,
|
|
sequence<KeyUsage> keyUsages );
|
|
Promise<any> exportKey(KeyFormat format, CryptoKey key);
|
|
|
|
Promise<any> wrapKey(KeyFormat format,
|
|
CryptoKey key,
|
|
CryptoKey wrappingKey,
|
|
AlgorithmIdentifier wrapAlgorithm);
|
|
Promise<CryptoKey> unwrapKey(KeyFormat format,
|
|
BufferSource wrappedKey,
|
|
CryptoKey unwrappingKey,
|
|
AlgorithmIdentifier unwrapAlgorithm,
|
|
AlgorithmIdentifier unwrappedKeyAlgorithm,
|
|
boolean extractable,
|
|
sequence<KeyUsage> keyUsages );
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#big-integer
|
|
|
|
typedef Uint8Array BigInteger;
|
|
|
|
// https://w3c.github.io/webcrypto/#algorithm-dictionary
|
|
|
|
typedef (object or DOMString) AlgorithmIdentifier;
|
|
|
|
typedef AlgorithmIdentifier HashAlgorithmIdentifier;
|
|
|
|
dictionary Algorithm {
|
|
required DOMString name;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#key-algorithm-dictionary
|
|
|
|
dictionary KeyAlgorithm {
|
|
required DOMString name;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#RsaKeyGenParams-dictionary
|
|
|
|
dictionary RsaKeyGenParams : Algorithm {
|
|
required [EnforceRange] unsigned long modulusLength;
|
|
required BigInteger publicExponent;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#RsaHashedKeyGenParams-dictionary
|
|
|
|
dictionary RsaHashedKeyGenParams : RsaKeyGenParams {
|
|
required HashAlgorithmIdentifier hash;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#RsaKeyAlgorithm-dictionary
|
|
|
|
dictionary RsaKeyAlgorithm : KeyAlgorithm {
|
|
required unsigned long modulusLength;
|
|
required BigInteger publicExponent;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#RsaHashedKeyAlgorithm-dictionary
|
|
|
|
dictionary RsaHashedKeyAlgorithm : RsaKeyAlgorithm {
|
|
required KeyAlgorithm hash;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#RsaHashedImportParams-dictionary
|
|
|
|
dictionary RsaHashedImportParams : Algorithm {
|
|
required HashAlgorithmIdentifier hash;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#RsaPssParams-dictionary
|
|
|
|
dictionary RsaPssParams : Algorithm {
|
|
required [EnforceRange] unsigned long saltLength;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#rsa-oaep-params
|
|
|
|
dictionary RsaOaepParams : Algorithm {
|
|
BufferSource label;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#EcdsaParams-dictionary
|
|
dictionary EcdsaParams : Algorithm {
|
|
required HashAlgorithmIdentifier hash;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#EcKeyGenParams-dictionary
|
|
|
|
typedef DOMString NamedCurve;
|
|
|
|
dictionary EcKeyGenParams : Algorithm {
|
|
required NamedCurve namedCurve;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#EcKeyAlgorithm-dictionary
|
|
|
|
dictionary EcKeyAlgorithm : KeyAlgorithm {
|
|
required NamedCurve namedCurve;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#EcKeyImportParams-dictionary
|
|
|
|
dictionary EcKeyImportParams : Algorithm {
|
|
required NamedCurve namedCurve;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#dh-EcdhKeyDeriveParams
|
|
|
|
dictionary EcdhKeyDeriveParams : Algorithm {
|
|
required CryptoKey public;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#aes-ctr-params
|
|
|
|
dictionary AesCtrParams : Algorithm {
|
|
required BufferSource counter;
|
|
required [EnforceRange] octet length;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#AesKeyAlgorithm-dictionary
|
|
|
|
dictionary AesKeyAlgorithm : KeyAlgorithm {
|
|
required unsigned short length;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#aes-keygen-params
|
|
|
|
dictionary AesKeyGenParams : Algorithm {
|
|
required [EnforceRange] unsigned short length;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#aes-derivedkey-params
|
|
|
|
dictionary AesDerivedKeyParams : Algorithm {
|
|
required [EnforceRange] unsigned short length;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#aes-cbc-params
|
|
|
|
dictionary AesCbcParams : Algorithm {
|
|
required BufferSource iv;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#aes-gcm-params
|
|
|
|
dictionary AesGcmParams : Algorithm {
|
|
required BufferSource iv;
|
|
BufferSource additionalData;
|
|
[EnforceRange] octet tagLength;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#hmac-importparams
|
|
|
|
dictionary HmacImportParams : Algorithm {
|
|
required HashAlgorithmIdentifier hash;
|
|
[EnforceRange] unsigned long length;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#HmacKeyAlgorithm-dictionary
|
|
|
|
dictionary HmacKeyAlgorithm : KeyAlgorithm {
|
|
required KeyAlgorithm hash;
|
|
required unsigned long length;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#hmac-keygen-params
|
|
|
|
dictionary HmacKeyGenParams : Algorithm {
|
|
required HashAlgorithmIdentifier hash;
|
|
[EnforceRange] unsigned long length;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#hkdf-params
|
|
|
|
dictionary HkdfParams : Algorithm {
|
|
required HashAlgorithmIdentifier hash;
|
|
required BufferSource salt;
|
|
required BufferSource info;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#pbkdf2-params
|
|
|
|
dictionary Pbkdf2Params : Algorithm {
|
|
required BufferSource salt;
|
|
required [EnforceRange] unsigned long iterations;
|
|
required HashAlgorithmIdentifier hash;
|
|
};
|
|
|
|
// https://w3c.github.io/webcrypto/#JsonWebKey-dictionary
|
|
|
|
dictionary RsaOtherPrimesInfo {
|
|
// The following fields are defined in Section 6.3.2.7 of JSON Web Algorithms
|
|
DOMString r;
|
|
DOMString d;
|
|
DOMString t;
|
|
};
|
|
|
|
dictionary JsonWebKey {
|
|
// The following fields are defined in Section 3.1 of JSON Web Key
|
|
DOMString kty;
|
|
DOMString use;
|
|
sequence<DOMString> key_ops;
|
|
DOMString alg;
|
|
|
|
// The following fields are defined in JSON Web Key Parameters Registration
|
|
boolean ext;
|
|
|
|
// The following fields are defined in Section 6 of JSON Web Algorithms
|
|
DOMString crv;
|
|
DOMString x;
|
|
DOMString y;
|
|
DOMString d;
|
|
DOMString n;
|
|
DOMString e;
|
|
DOMString p;
|
|
DOMString q;
|
|
DOMString dp;
|
|
DOMString dq;
|
|
DOMString qi;
|
|
sequence<RsaOtherPrimesInfo> oth;
|
|
DOMString k;
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#partial-subtlecrypto-interface
|
|
|
|
[SecureContext,Exposed=(Window,Worker)]
|
|
partial interface SubtleCrypto {
|
|
Promise<EncapsulatedKey> encapsulateKey(
|
|
AlgorithmIdentifier encapsulationAlgorithm,
|
|
CryptoKey encapsulationKey,
|
|
AlgorithmIdentifier sharedKeyAlgorithm,
|
|
boolean extractable,
|
|
sequence<KeyUsage> keyUsages
|
|
);
|
|
Promise<EncapsulatedBits> encapsulateBits(
|
|
AlgorithmIdentifier encapsulationAlgorithm,
|
|
CryptoKey encapsulationKey
|
|
);
|
|
|
|
Promise<CryptoKey> decapsulateKey(
|
|
AlgorithmIdentifier decapsulationAlgorithm,
|
|
CryptoKey decapsulationKey,
|
|
BufferSource ciphertext,
|
|
AlgorithmIdentifier sharedKeyAlgorithm,
|
|
boolean extractable,
|
|
sequence<KeyUsage> keyUsages
|
|
);
|
|
Promise<ArrayBuffer> decapsulateBits(
|
|
AlgorithmIdentifier decapsulationAlgorithm,
|
|
CryptoKey decapsulationKey,
|
|
BufferSource ciphertext
|
|
);
|
|
|
|
Promise<CryptoKey> getPublicKey(
|
|
CryptoKey key,
|
|
sequence<KeyUsage> keyUsages
|
|
);
|
|
|
|
static boolean supports(DOMString operation,
|
|
AlgorithmIdentifier algorithm,
|
|
optional unsigned long? length = null);
|
|
static boolean supports(DOMString operation,
|
|
AlgorithmIdentifier algorithm,
|
|
AlgorithmIdentifier additionalAlgorithm);
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#subtlecrypto-interface-keyformat
|
|
// * For all existing symmetric algorithms in [webcrypto], "raw-secret"
|
|
// acts as an alias of "raw".
|
|
// * For all existing asymmetric algorithms in [webcrypto], "raw-public"
|
|
// acts as an alias of "raw".
|
|
// * In the deriveKey() method, in the import key step, "raw-secret"
|
|
// must be used as the format instead of "raw".
|
|
|
|
enum KeyFormat { "raw-public", "raw-private", "raw-seed", "raw-secret", "raw", "spki", "pkcs8", "jwk" };
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#context-params
|
|
|
|
dictionary ContextParams : Algorithm {
|
|
BufferSource context;
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#aead-params
|
|
|
|
dictionary AeadParams : Algorithm {
|
|
required BufferSource iv;
|
|
BufferSource additionalData;
|
|
[EnforceRange] octet tagLength;
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#cshake-params
|
|
|
|
dictionary CShakeParams : Algorithm {
|
|
required [EnforceRange] unsigned long outputLength;
|
|
BufferSource functionName;
|
|
BufferSource customization;
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#dfn-TurboShakeParams
|
|
|
|
dictionary TurboShakeParams : Algorithm {
|
|
required [EnforceRange] unsigned long outputLength;
|
|
[EnforceRange] octet domainSeparation;
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#argon2-params
|
|
|
|
dictionary Argon2Params : Algorithm {
|
|
required BufferSource nonce;
|
|
required [EnforceRange] unsigned long parallelism;
|
|
required [EnforceRange] unsigned long memory;
|
|
required [EnforceRange] unsigned long passes;
|
|
[EnforceRange] octet version;
|
|
BufferSource secretValue;
|
|
BufferSource associatedData;
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#encapsulation
|
|
|
|
dictionary EncapsulatedKey {
|
|
CryptoKey sharedKey;
|
|
ArrayBuffer ciphertext;
|
|
};
|
|
|
|
dictionary EncapsulatedBits {
|
|
ArrayBuffer sharedKey;
|
|
ArrayBuffer ciphertext;
|
|
};
|
|
|
|
// https://wicg.github.io/webcrypto-modern-algos/#partial-JsonWebKey-dictionary
|
|
|
|
partial dictionary JsonWebKey {
|
|
// The following fields are defined in draft-ietf-cose-dilithium-08
|
|
DOMString pub;
|
|
DOMString priv;
|
|
};
|