0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-10 14:17:49 -04:00
deno/cli/tsc/dts/lib.deno_crypto.d.ts
Phil Hawksworth b20f98ccf7
docs: add examples for SubtleCrypto (#28068)
Adds examples for subtleCrypto
(https://docs.deno.com/api/web/~/SubtleCrypto)

- generateKey
- importKey
- exportKey
- sign
- verify
- digest
- encrypt
- decrypt
- deriveBits
- deriveKey
- wrapKey
- unwrapKey

---------

Co-authored-by: Ryan Dahl <ry@tinyclouds.org>
Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
2025-02-20 22:57:54 +01:00

656 lines
16 KiB
TypeScript

// Copyright 2018-2025 the Deno authors. MIT license.
// deno-lint-ignore-file no-var
/// <reference no-default-lib="true" />
/// <reference lib="esnext" />
/** @category Crypto */
declare var crypto: Crypto;
/** @category Crypto */
interface Algorithm {
name: string;
}
/** @category Crypto */
interface KeyAlgorithm {
name: string;
}
/** @category Crypto */
type AlgorithmIdentifier = string | Algorithm;
/** @category Crypto */
type HashAlgorithmIdentifier = AlgorithmIdentifier;
/** @category Crypto */
type KeyType = "private" | "public" | "secret";
/** @category Crypto */
type KeyUsage =
| "decrypt"
| "deriveBits"
| "deriveKey"
| "encrypt"
| "sign"
| "unwrapKey"
| "verify"
| "wrapKey";
/** @category Crypto */
type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki";
/** @category Crypto */
type NamedCurve = string;
/** @category Crypto */
interface RsaOtherPrimesInfo {
d?: string;
r?: string;
t?: string;
}
/** @category Crypto */
interface JsonWebKey {
alg?: string;
crv?: string;
d?: string;
dp?: string;
dq?: string;
e?: string;
ext?: boolean;
k?: string;
// deno-lint-ignore camelcase
key_ops?: string[];
kty?: string;
n?: string;
oth?: RsaOtherPrimesInfo[];
p?: string;
q?: string;
qi?: string;
use?: string;
x?: string;
y?: string;
}
/** @category Crypto */
interface AesCbcParams extends Algorithm {
iv: BufferSource;
}
/** @category Crypto */
interface AesGcmParams extends Algorithm {
iv: BufferSource;
additionalData?: BufferSource;
tagLength?: number;
}
/** @category Crypto */
interface AesCtrParams extends Algorithm {
counter: BufferSource;
length: number;
}
/** @category Crypto */
interface HmacKeyGenParams extends Algorithm {
hash: HashAlgorithmIdentifier;
length?: number;
}
/** @category Crypto */
interface EcKeyGenParams extends Algorithm {
namedCurve: NamedCurve;
}
/** @category Crypto */
interface EcKeyImportParams extends Algorithm {
namedCurve: NamedCurve;
}
/** @category Crypto */
interface EcdsaParams extends Algorithm {
hash: HashAlgorithmIdentifier;
}
/** @category Crypto */
interface RsaHashedImportParams extends Algorithm {
hash: HashAlgorithmIdentifier;
}
/** @category Crypto */
interface RsaHashedKeyGenParams extends RsaKeyGenParams {
hash: HashAlgorithmIdentifier;
}
/** @category Crypto */
interface RsaKeyGenParams extends Algorithm {
modulusLength: number;
publicExponent: Uint8Array;
}
/** @category Crypto */
interface RsaPssParams extends Algorithm {
saltLength: number;
}
/** @category Crypto */
interface RsaOaepParams extends Algorithm {
label?: Uint8Array;
}
/** @category Crypto */
interface HmacImportParams extends Algorithm {
hash: HashAlgorithmIdentifier;
length?: number;
}
/** @category Crypto */
interface EcKeyAlgorithm extends KeyAlgorithm {
namedCurve: NamedCurve;
}
/** @category Crypto */
interface HmacKeyAlgorithm extends KeyAlgorithm {
hash: KeyAlgorithm;
length: number;
}
/** @category Crypto */
interface RsaHashedKeyAlgorithm extends RsaKeyAlgorithm {
hash: KeyAlgorithm;
}
/** @category Crypto */
interface RsaKeyAlgorithm extends KeyAlgorithm {
modulusLength: number;
publicExponent: Uint8Array;
}
/** @category Crypto */
interface HkdfParams extends Algorithm {
hash: HashAlgorithmIdentifier;
info: BufferSource;
salt: BufferSource;
}
/** @category Crypto */
interface Pbkdf2Params extends Algorithm {
hash: HashAlgorithmIdentifier;
iterations: number;
salt: BufferSource;
}
/** @category Crypto */
interface AesDerivedKeyParams extends Algorithm {
length: number;
}
/** @category Crypto */
interface EcdhKeyDeriveParams extends Algorithm {
public: CryptoKey;
}
/** @category Crypto */
interface AesKeyGenParams extends Algorithm {
length: number;
}
/** @category Crypto */
interface AesKeyAlgorithm extends KeyAlgorithm {
length: number;
}
/** The CryptoKey dictionary of the Web Crypto API represents a cryptographic
* key.
*
* @category Crypto
*/
interface CryptoKey {
readonly algorithm: KeyAlgorithm;
readonly extractable: boolean;
readonly type: KeyType;
readonly usages: KeyUsage[];
}
/** @category Crypto */
declare var CryptoKey: {
readonly prototype: CryptoKey;
new (): never;
};
/** The CryptoKeyPair dictionary of the Web Crypto API represents a key pair for
* an asymmetric cryptography algorithm, also known as a public-key algorithm.
*
* @category Crypto
*/
interface CryptoKeyPair {
privateKey: CryptoKey;
publicKey: CryptoKey;
}
/** @category Crypto */
declare var CryptoKeyPair: {
readonly prototype: CryptoKeyPair;
new (): never;
};
/** This Web Crypto API interface provides a number of low-level cryptographic
* functions. It is accessed via the Crypto.subtle properties available in a
* window context (via globalThis.crypto).
*
* @category Crypto
*/
interface SubtleCrypto {
/**
* Generates an asymmetric cryptographic key pair for encryption, signing, or
* key exchange.
*
* This overload is used for generating key pairs with RSA or elliptic curve
* algorithms.
*
* @example
* ```ts
* // RSA key generation
* const key = await crypto.subtle.generateKey(
* {
* name: "RSA-OAEP",
* modulusLength: 4096,
* publicExponent: new Uint8Array([1, 0, 1]),
* hash: "SHA-256",
* },
* true,
* ["encrypt", "decrypt"]
* );
* ```
*
* @example
* ```ts
* // Elliptic curve (ECDSA) key pair generation
* const key = await crypto.subtle.generateKey(
* {
* name: "ECDSA",
* namedCurve: "P-384",
* },
* true,
* ["sign", "verify"]
* );
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey
*/
generateKey(
algorithm: RsaHashedKeyGenParams | EcKeyGenParams,
extractable: boolean,
keyUsages: KeyUsage[],
): Promise<CryptoKeyPair>;
/**
* Generates a symmetric cryptographic key for encryption, authentication, or
* hashing.
*
* This overload is used for algorithms such as AES and HMAC.
*
* @example
* ```ts
* const key = await crypto.subtle.generateKey(
* {
* name: "AES-GCM",
* length: 256,
* },
* true,
* ["encrypt", "decrypt"]
* );
* ```
*
* @example
* ```ts
* // HMAC key generation
* const key = await crypto.subtle.generateKey(
* {
* name: "HMAC",
* hash: { name: "SHA-512" },
* },
* true,
* ["sign", "verify"]
* );
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey
*/
generateKey(
algorithm: AesKeyGenParams | HmacKeyGenParams,
extractable: boolean,
keyUsages: KeyUsage[],
): Promise<CryptoKey>;
/**
* Generates a cryptographic key or key pair for a given algorithm.
*
* This generic overload handles any key generation request, returning either
* a symmetric key or an asymmetric key pair based on the provided algorithm.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey
*/
generateKey(
algorithm: AlgorithmIdentifier,
extractable: boolean,
keyUsages: KeyUsage[],
): Promise<CryptoKeyPair | CryptoKey>;
/**
* Imports a cryptographic key in JSON Web Key (JWK) format.
*
* This method is used to import an asymmetric key (e.g., RSA or ECDSA) from a JWK object.
* JWK allows structured representation of keys, making them portable across different systems.
*
* @example
* ```ts
* // Import an ECDSA private signing key where `jwk` is an object describing a private key
* crypto.subtle.importKey(
* "jwk",
* jwk,
* {
* name: "ECDSA",
* namedCurve: "P-384",
* },
* true,
* ["sign"],
* );
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey
*/
importKey(
format: "jwk",
keyData: JsonWebKey,
algorithm:
| AlgorithmIdentifier
| HmacImportParams
| RsaHashedImportParams
| EcKeyImportParams,
extractable: boolean,
keyUsages: KeyUsage[],
): Promise<CryptoKey>;
/**
* Imports a cryptographic key in raw, PKCS8, or SPKI format.
*
* This method is used to import symmetric keys (e.g., AES), private keys (PKCS8), or public keys (SPKI).
*
* @example
* ```ts
* // Import an AES-GCM secret key where `rawKey` is an ArrayBuffer string
* crypto.subtle.importKey("raw", rawKey, "AES-GCM", true, [
* "encrypt",
* "decrypt",
* ]);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey
*/
importKey(
format: Exclude<KeyFormat, "jwk">,
keyData: BufferSource,
algorithm:
| AlgorithmIdentifier
| HmacImportParams
| RsaHashedImportParams
| EcKeyImportParams,
extractable: boolean,
keyUsages: KeyUsage[],
): Promise<CryptoKey>;
/**
* Exports a cryptographic key in JSON Web Key (JWK) format.
*
* This method allows exporting an asymmetric key (e.g., RSA, ECDSA) into a JSON-based representation,
* making it easy to store and transfer across systems.
*
* @example
* ```ts
* await crypto.subtle.exportKey("jwk", key);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey
*/
exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
/**
* Exports a cryptographic key in raw, PKCS8, or SPKI format.
*
* This method is used to export symmetric keys (AES), private keys (PKCS8), or public keys (SPKI) in binary form.
*
* @example
* ```ts
* await crypto.subtle.exportKey("raw", key);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey
*/
exportKey(
format: Exclude<KeyFormat, "jwk">,
key: CryptoKey,
): Promise<ArrayBuffer>;
/**
* Generates a digital signature using a private cryptographic key.
*
* This method is used to sign data with an asymmetric key (e.g., RSA-PSS, ECDSA).
*
* @example
* ```ts
* await crypto.subtle.sign("ECDSA", key, data);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/sign
*/
sign(
algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams,
key: CryptoKey,
data: BufferSource,
): Promise<ArrayBuffer>;
/**
* Verifies a digital signature using a public cryptographic key.
*
* This method checks whether a signature is valid for the given data.
*
* @example
* ```ts
* await crypto.subtle.verify("ECDSA", key, signature, data);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify
*/
verify(
algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams,
key: CryptoKey,
signature: BufferSource,
data: BufferSource,
): Promise<boolean>;
/**
* Computes a cryptographic hash (digest) of the given data.
*
* This method is commonly used for verifying data integrity.
*
* @example
* ```ts
* // Compute the digest of given data using a cryptographic algorithm
* await crypto.subtle.digest("SHA-256", data);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
*/
digest(
algorithm: AlgorithmIdentifier,
data: BufferSource,
): Promise<ArrayBuffer>;
/**
* Encrypts data using a cryptographic key.
*
* This method is used with both symmetric (AES) and asymmetric (RSA) encryption.
*
* @example
* ```ts
* await crypto.subtle.encrypt("RSA-OAEP", key, data);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt
*/
encrypt(
algorithm:
| AlgorithmIdentifier
| RsaOaepParams
| AesCbcParams
| AesGcmParams
| AesCtrParams,
key: CryptoKey,
data: BufferSource,
): Promise<ArrayBuffer>;
/**
* Decrypts previously encrypted data using a cryptographic key.
*
* @example
* ```ts
* await crypto.subtle.decrypt("RSA-OAEP", key, data);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/decrypt
*/
decrypt(
algorithm:
| AlgorithmIdentifier
| RsaOaepParams
| AesCbcParams
| AesGcmParams
| AesCtrParams,
key: CryptoKey,
data: BufferSource,
): Promise<ArrayBuffer>;
/**
* This method is used to derive a key from a base key using a cryptographic algorithm.
*
* @example
* ```ts
* await crypto.subtle.deriveBits("HKDF", baseKey, length);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits
*/
deriveBits(
algorithm:
| AlgorithmIdentifier
| HkdfParams
| Pbkdf2Params
| EcdhKeyDeriveParams,
baseKey: CryptoKey,
length: number,
): Promise<ArrayBuffer>;
/**
* This method is used to derive a secret key from a base or master key using a cryptographic algorithm.
* It returns a Promise which fulfils with an object of the new key.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey
*
* @example
* ```ts
* // Derive a key using an HKDF algorithm
* await crypto.subtle.deriveKey("HKDF", baseKey, derivedKeyType, extractable, keyUsages);
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey
*/
deriveKey(
algorithm:
| AlgorithmIdentifier
| HkdfParams
| Pbkdf2Params
| EcdhKeyDeriveParams,
baseKey: CryptoKey,
derivedKeyType:
| AlgorithmIdentifier
| AesDerivedKeyParams
| HmacImportParams
| HkdfParams
| Pbkdf2Params,
extractable: boolean,
keyUsages: KeyUsage[],
): Promise<CryptoKey>;
/**
* Wraps (encrypts) a cryptographic key for secure storage or transmission
*
* @example
* ```ts
* await crypto.subtle.wrapKey("jwk", key, wrappingKey, "RSA-OAEP");
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/wrapKey
*/
wrapKey(
format: KeyFormat,
key: CryptoKey,
wrappingKey: CryptoKey,
wrapAlgorithm:
| AlgorithmIdentifier
| RsaOaepParams
| AesCbcParams
| AesCtrParams,
): Promise<ArrayBuffer>;
/**
* Unwraps (decrypts) a previously wrapped key.
*
* @example
* ```ts
* // Unwrap an AES-GCM key wrapped with AES-KW
* const unwrappedKey = await crypto.subtle.unwrapKey(
* "jwk", // Format of the key to import
* wrappedKey, // Encrypted key data as ArrayBuffer
* unwrappingKey, // CryptoKey used for unwrapping
* { name: "AES-KW" }, // Unwrapping algorithm
* { name: "AES-GCM", length: 256 }, // Algorithm for unwrapped key
* true, // Whether the unwrapped key is extractable
* ["encrypt", "decrypt"] // Allowed key usages
* );
* ```
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/unwrapKey
*/
unwrapKey(
format: KeyFormat,
wrappedKey: BufferSource,
unwrappingKey: CryptoKey,
unwrapAlgorithm:
| AlgorithmIdentifier
| RsaOaepParams
| AesCbcParams
| AesCtrParams,
unwrappedKeyAlgorithm:
| AlgorithmIdentifier
| HmacImportParams
| RsaHashedImportParams
| EcKeyImportParams,
extractable: boolean,
keyUsages: KeyUsage[],
): Promise<CryptoKey>;
}
/** @category Crypto */
declare var SubtleCrypto: {
readonly prototype: SubtleCrypto;
new (): never;
};
/** @category Crypto */
interface Crypto {
readonly subtle: SubtleCrypto;
getRandomValues<
T extends
| Int8Array
| Int16Array
| Int32Array
| Uint8Array
| Uint16Array
| Uint32Array
| Uint8ClampedArray
| BigInt64Array
| BigUint64Array,
>(
array: T,
): T;
randomUUID(): `${string}-${string}-${string}-${string}-${string}`;
}
/** @category Crypto */
declare var Crypto: {
readonly prototype: Crypto;
new (): never;
};