| import { AESECBCipher, AESEAXCipher } from "./aes.js"; |
| import { DESCBCCipher, DESECBCipher } from "./des.js"; |
| import { RSACipher } from "./rsa.js"; |
| import { DHCipher } from "./dh.js"; |
| import { MD5 } from "./md5.js"; |
| |
| // A single interface for the cryptographic algorithms not supported by SubtleCrypto. |
| // Both synchronous and asynchronous implmentations are allowed. |
| class LegacyCrypto { |
| constructor() { |
| this._algorithms = { |
| "AES-ECB": AESECBCipher, |
| "AES-EAX": AESEAXCipher, |
| "DES-ECB": DESECBCipher, |
| "DES-CBC": DESCBCCipher, |
| "RSA-PKCS1-v1_5": RSACipher, |
| "DH": DHCipher, |
| "MD5": MD5, |
| }; |
| } |
| |
| encrypt(algorithm, key, data) { |
| if (key.algorithm.name !== algorithm.name) { |
| throw new Error("algorithm does not match"); |
| } |
| if (typeof key.encrypt !== "function") { |
| throw new Error("key does not support encryption"); |
| } |
| return key.encrypt(algorithm, data); |
| } |
| |
| decrypt(algorithm, key, data) { |
| if (key.algorithm.name !== algorithm.name) { |
| throw new Error("algorithm does not match"); |
| } |
| if (typeof key.decrypt !== "function") { |
| throw new Error("key does not support encryption"); |
| } |
| return key.decrypt(algorithm, data); |
| } |
| |
| importKey(format, keyData, algorithm, extractable, keyUsages) { |
| if (format !== "raw") { |
| throw new Error("key format is not supported"); |
| } |
| const alg = this._algorithms[algorithm.name]; |
| if (typeof alg === "undefined" || typeof alg.importKey !== "function") { |
| throw new Error("algorithm is not supported"); |
| } |
| return alg.importKey(keyData, algorithm, extractable, keyUsages); |
| } |
| |
| generateKey(algorithm, extractable, keyUsages) { |
| const alg = this._algorithms[algorithm.name]; |
| if (typeof alg === "undefined" || typeof alg.generateKey !== "function") { |
| throw new Error("algorithm is not supported"); |
| } |
| return alg.generateKey(algorithm, extractable, keyUsages); |
| } |
| |
| exportKey(format, key) { |
| if (format !== "raw") { |
| throw new Error("key format is not supported"); |
| } |
| if (typeof key.exportKey !== "function") { |
| throw new Error("key does not support exportKey"); |
| } |
| return key.exportKey(); |
| } |
| |
| digest(algorithm, data) { |
| const alg = this._algorithms[algorithm]; |
| if (typeof alg !== "function") { |
| throw new Error("algorithm is not supported"); |
| } |
| return alg(data); |
| } |
| |
| deriveBits(algorithm, key, length) { |
| if (key.algorithm.name !== algorithm.name) { |
| throw new Error("algorithm does not match"); |
| } |
| if (typeof key.deriveBits !== "function") { |
| throw new Error("key does not support deriveBits"); |
| } |
| return key.deriveBits(algorithm, length); |
| } |
| } |
| |
| export default new LegacyCrypto; |