1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-24 15:19:26 -05:00
denoland-deno/ext/node/polyfills/crypto.ts

523 lines
11 KiB
TypeScript
Raw Normal View History

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// Copyright Joyent, Inc. and Node.js contributors. All rights reserved. MIT license.
// TODO(petamoriken): enable prefer-primordials for node polyfills
// deno-lint-ignore-file prefer-primordials
import { ERR_CRYPTO_FIPS_FORCED } from "ext:deno_node/internal/errors.ts";
import { crypto as constants } from "ext:deno_node/internal_binding/constants.ts";
import { getOptionValue } from "ext:deno_node/internal/options.ts";
import {
getFipsCrypto,
setFipsCrypto,
timingSafeEqual,
} from "ext:deno_node/internal_binding/crypto.ts";
import {
checkPrime,
checkPrimeSync,
generatePrime,
generatePrimeSync,
randomBytes,
randomFill,
randomFillSync,
randomInt,
randomUUID,
} from "ext:deno_node/internal/crypto/random.ts";
import type {
CheckPrimeOptions,
GeneratePrimeOptions,
GeneratePrimeOptionsArrayBuffer,
GeneratePrimeOptionsBigInt,
LargeNumberLike,
} from "ext:deno_node/internal/crypto/random.ts";
import { pbkdf2, pbkdf2Sync } from "ext:deno_node/internal/crypto/pbkdf2.ts";
import type {
Algorithms,
NormalizedAlgorithms,
} from "ext:deno_node/internal/crypto/pbkdf2.ts";
import { scrypt, scryptSync } from "ext:deno_node/internal/crypto/scrypt.ts";
import { hkdf, hkdfSync } from "ext:deno_node/internal/crypto/hkdf.ts";
import {
generateKey,
generateKeyPair,
generateKeyPairSync,
generateKeySync,
} from "ext:deno_node/internal/crypto/keygen.ts";
import type {
BasePrivateKeyEncodingOptions,
DSAKeyPairKeyObjectOptions,
DSAKeyPairOptions,
ECKeyPairKeyObjectOptions,
ECKeyPairOptions,
ED25519KeyPairKeyObjectOptions,
ED25519KeyPairOptions,
ED448KeyPairKeyObjectOptions,
ED448KeyPairOptions,
KeyPairKeyObjectResult,
KeyPairSyncResult,
RSAKeyPairKeyObjectOptions,
RSAKeyPairOptions,
RSAPSSKeyPairKeyObjectOptions,
RSAPSSKeyPairOptions,
X25519KeyPairKeyObjectOptions,
X25519KeyPairOptions,
X448KeyPairKeyObjectOptions,
X448KeyPairOptions,
} from "ext:deno_node/internal/crypto/keygen.ts";
import {
createPrivateKey,
createPublicKey,
createSecretKey,
KeyObject,
} from "ext:deno_node/internal/crypto/keys.ts";
import type {
AsymmetricKeyDetails,
JsonWebKeyInput,
JwkKeyExportOptions,
KeyExportOptions,
KeyObjectType,
} from "ext:deno_node/internal/crypto/keys.ts";
import {
DiffieHellman,
diffieHellman,
DiffieHellmanGroup,
ECDH,
} from "ext:deno_node/internal/crypto/diffiehellman.ts";
import {
Cipheriv,
Decipheriv,
privateDecrypt,
privateEncrypt,
publicDecrypt,
publicEncrypt,
} from "ext:deno_node/internal/crypto/cipher.ts";
import type {
Cipher,
CipherCCM,
CipherCCMOptions,
CipherCCMTypes,
CipherGCM,
CipherGCMOptions,
CipherGCMTypes,
CipherKey,
CipherOCB,
CipherOCBOptions,
CipherOCBTypes,
Decipher,
DecipherCCM,
DecipherGCM,
DecipherOCB,
} from "ext:deno_node/internal/crypto/cipher.ts";
import type {
BinaryLike,
BinaryToTextEncoding,
CharacterEncoding,
ECDHKeyFormat,
Encoding,
HASH_DATA,
KeyFormat,
KeyType,
LegacyCharacterEncoding,
PrivateKeyInput,
PublicKeyInput,
} from "ext:deno_node/internal/crypto/types.ts";
import {
Sign,
signOneShot,
Verify,
verifyOneShot,
} from "ext:deno_node/internal/crypto/sig.ts";
import type {
DSAEncoding,
KeyLike,
SigningOptions,
SignKeyObjectInput,
SignPrivateKeyInput,
VerifyKeyObjectInput,
VerifyPublicKeyInput,
} from "ext:deno_node/internal/crypto/sig.ts";
import {
createHash,
getHashes,
Hash,
Hmac,
} from "ext:deno_node/internal/crypto/hash.ts";
import { X509Certificate } from "ext:deno_node/internal/crypto/x509.ts";
import type {
PeerCertificate,
X509CheckOptions,
} from "ext:deno_node/internal/crypto/x509.ts";
import {
getCipherInfo,
getCiphers,
getCurves,
secureHeapUsed,
setEngine,
} from "ext:deno_node/internal/crypto/util.ts";
import type { SecureHeapUsage } from "ext:deno_node/internal/crypto/util.ts";
import Certificate from "ext:deno_node/internal/crypto/certificate.ts";
import type {
TransformOptions,
WritableOptions,
} from "ext:deno_node/_stream.d.ts";
import { crypto as webcrypto } from "ext:deno_crypto/00_crypto.js";
const subtle = webcrypto.subtle;
const fipsForced = getOptionValue("--force-fips");
function getRandomValues(typedArray) {
return webcrypto.getRandomValues(typedArray);
}
function createCipheriv(
algorithm: CipherCCMTypes,
key: CipherKey,
iv: BinaryLike,
options: CipherCCMOptions,
): CipherCCM;
function createCipheriv(
algorithm: CipherOCBTypes,
key: CipherKey,
iv: BinaryLike,
options: CipherOCBOptions,
): CipherOCB;
function createCipheriv(
algorithm: CipherGCMTypes,
key: CipherKey,
iv: BinaryLike,
options?: CipherGCMOptions,
): CipherGCM;
function createCipheriv(
algorithm: string,
key: CipherKey,
iv: BinaryLike | null,
options?: TransformOptions,
): Cipher;
function createCipheriv(
cipher: string,
key: CipherKey,
iv: BinaryLike | null,
options?: TransformOptions,
): Cipher {
return new Cipheriv(cipher, key, iv, options);
}
function createDecipheriv(
algorithm: CipherCCMTypes,
key: CipherKey,
iv: BinaryLike,
options: CipherCCMOptions,
): DecipherCCM;
function createDecipheriv(
algorithm: CipherOCBTypes,
key: CipherKey,
iv: BinaryLike,
options: CipherOCBOptions,
): DecipherOCB;
function createDecipheriv(
algorithm: CipherGCMTypes,
key: CipherKey,
iv: BinaryLike,
options?: CipherGCMOptions,
): DecipherGCM;
function createDecipheriv(
algorithm: string,
key: CipherKey,
iv: BinaryLike | null,
options?: TransformOptions,
): Decipher {
return new Decipheriv(algorithm, key, iv, options);
}
function createDiffieHellman(
primeLength: number,
generator?: number | ArrayBufferView,
): DiffieHellman;
function createDiffieHellman(prime: ArrayBufferView): DiffieHellman;
function createDiffieHellman(
prime: string,
primeEncoding: BinaryToTextEncoding,
): DiffieHellman;
function createDiffieHellman(
prime: string,
primeEncoding: BinaryToTextEncoding,
generator: number | ArrayBufferView,
): DiffieHellman;
function createDiffieHellman(
prime: string,
primeEncoding: BinaryToTextEncoding,
generator: string,
generatorEncoding: BinaryToTextEncoding,
): DiffieHellman;
function createDiffieHellman(
sizeOrKey: number | string | ArrayBufferView,
keyEncoding?: number | ArrayBufferView | BinaryToTextEncoding,
generator?: number | ArrayBufferView | string,
generatorEncoding?: BinaryToTextEncoding,
): DiffieHellman {
return new DiffieHellman(
sizeOrKey,
keyEncoding,
generator,
generatorEncoding,
);
}
function createDiffieHellmanGroup(name: string): DiffieHellmanGroup {
return new DiffieHellmanGroup(name);
}
function createECDH(curve: string): ECDH {
return new ECDH(curve);
}
function createHmac(
hmac: string,
key: string | ArrayBuffer | KeyObject,
options?: TransformOptions,
) {
return Hmac(hmac, key, options);
}
function createSign(algorithm: string, options?: WritableOptions): Sign {
return new Sign(algorithm, options);
}
function createVerify(algorithm: string, options?: WritableOptions): Verify {
return new Verify(algorithm, options);
}
function setFipsForced(val: boolean) {
if (val) {
return;
}
throw new ERR_CRYPTO_FIPS_FORCED();
}
function getFipsForced() {
return 1;
}
Object.defineProperty(constants, "defaultCipherList", {
value: getOptionValue("--tls-cipher-list"),
});
const getDiffieHellman = createDiffieHellmanGroup;
const getFips = fipsForced ? getFipsForced : getFipsCrypto;
const setFips = fipsForced ? setFipsForced : setFipsCrypto;
const sign = signOneShot;
const verify = verifyOneShot;
/* Deprecated in Node.js, alias of randomBytes */
const pseudoRandomBytes = randomBytes;
export default {
Certificate,
checkPrime,
checkPrimeSync,
Cipheriv,
constants,
createCipheriv,
createDecipheriv,
createDiffieHellman,
createDiffieHellmanGroup,
createECDH,
createHash,
createHmac,
createPrivateKey,
createPublicKey,
createSecretKey,
createSign,
createVerify,
Decipheriv,
DiffieHellman,
diffieHellman,
DiffieHellmanGroup,
ECDH,
getRandomValues,
generateKey,
generateKeyPair,
generateKeyPairSync,
generateKeySync,
generatePrime,
generatePrimeSync,
getCipherInfo,
getCiphers,
getCurves,
getDiffieHellman,
getFips,
getHashes,
Hash,
hkdf,
hkdfSync,
Hmac,
KeyObject,
pbkdf2,
pbkdf2Sync,
privateDecrypt,
privateEncrypt,
publicDecrypt,
publicEncrypt,
randomBytes,
pseudoRandomBytes,
randomFill,
randomFillSync,
randomInt,
randomUUID,
scrypt,
scryptSync,
secureHeapUsed,
setEngine,
setFips,
Sign,
sign,
timingSafeEqual,
Verify,
verify,
webcrypto,
subtle,
X509Certificate,
};
export type {
Algorithms,
AsymmetricKeyDetails,
BasePrivateKeyEncodingOptions,
BinaryLike,
BinaryToTextEncoding,
CharacterEncoding,
CheckPrimeOptions,
Cipher,
CipherCCM,
CipherCCMOptions,
CipherCCMTypes,
CipherGCM,
CipherGCMOptions,
CipherGCMTypes,
CipherKey,
CipherOCB,
CipherOCBOptions,
CipherOCBTypes,
Decipher,
DecipherCCM,
DecipherGCM,
DecipherOCB,
DSAEncoding,
DSAKeyPairKeyObjectOptions,
DSAKeyPairOptions,
ECDHKeyFormat,
ECKeyPairKeyObjectOptions,
ECKeyPairOptions,
ED25519KeyPairKeyObjectOptions,
ED25519KeyPairOptions,
ED448KeyPairKeyObjectOptions,
ED448KeyPairOptions,
Encoding,
GeneratePrimeOptions,
GeneratePrimeOptionsArrayBuffer,
GeneratePrimeOptionsBigInt,
HASH_DATA,
JsonWebKeyInput,
JwkKeyExportOptions,
KeyExportOptions,
KeyFormat,
KeyLike,
KeyObjectType,
KeyPairKeyObjectResult,
KeyPairSyncResult,
KeyType,
LargeNumberLike,
LegacyCharacterEncoding,
NormalizedAlgorithms,
PeerCertificate,
PrivateKeyInput,
PublicKeyInput,
RSAKeyPairKeyObjectOptions,
RSAKeyPairOptions,
RSAPSSKeyPairKeyObjectOptions,
RSAPSSKeyPairOptions,
SecureHeapUsage,
SigningOptions,
SignKeyObjectInput,
SignPrivateKeyInput,
VerifyKeyObjectInput,
VerifyPublicKeyInput,
X25519KeyPairKeyObjectOptions,
X25519KeyPairOptions,
X448KeyPairKeyObjectOptions,
X448KeyPairOptions,
X509CheckOptions,
};
export {
Certificate,
checkPrime,
checkPrimeSync,
Cipheriv,
constants,
createCipheriv,
createDecipheriv,
createDiffieHellman,
createDiffieHellmanGroup,
createECDH,
createHash,
createHmac,
createPrivateKey,
createPublicKey,
createSecretKey,
createSign,
createVerify,
Decipheriv,
DiffieHellman,
diffieHellman,
DiffieHellmanGroup,
ECDH,
generateKey,
generateKeyPair,
generateKeyPairSync,
generateKeySync,
generatePrime,
generatePrimeSync,
getCipherInfo,
getCiphers,
getCurves,
getDiffieHellman,
getFips,
getHashes,
getRandomValues,
Hash,
hkdf,
hkdfSync,
Hmac,
KeyObject,
pbkdf2,
pbkdf2Sync,
privateDecrypt,
privateEncrypt,
/* Deprecated in Node.js, alias of randomBytes */
pseudoRandomBytes,
publicDecrypt,
publicEncrypt,
randomBytes,
randomFill,
randomFillSync,
randomInt,
randomUUID,
scrypt,
scryptSync,
secureHeapUsed,
setEngine,
setFips,
Sign,
sign,
subtle,
timingSafeEqual,
Verify,
verify,
webcrypto,
X509Certificate,
};