main
Raw Download raw file
 1import { AESECBCipher, AESEAXCipher } from "./aes.js";
 2import { DESCBCCipher, DESECBCipher } from "./des.js";
 3import { RSACipher } from "./rsa.js";
 4import { DHCipher } from "./dh.js";
 5import { MD5 } from "./md5.js";
 6
 7// A single interface for the cryptographic algorithms not supported by SubtleCrypto.
 8// Both synchronous and asynchronous implmentations are allowed.
 9class LegacyCrypto {
10    constructor() {
11        this._algorithms = {
12            "AES-ECB": AESECBCipher,
13            "AES-EAX": AESEAXCipher,
14            "DES-ECB": DESECBCipher,
15            "DES-CBC": DESCBCCipher,
16            "RSA-PKCS1-v1_5": RSACipher,
17            "DH": DHCipher,
18            "MD5": MD5,
19        };
20    }
21
22    encrypt(algorithm, key, data) {
23        if (key.algorithm.name !== algorithm.name) {
24            throw new Error("algorithm does not match");
25        }
26        if (typeof key.encrypt !== "function") {
27            throw new Error("key does not support encryption");
28        }
29        return key.encrypt(algorithm, data);
30    }
31
32    decrypt(algorithm, key, data) {
33        if (key.algorithm.name !== algorithm.name) {
34            throw new Error("algorithm does not match");
35        }
36        if (typeof key.decrypt !== "function") {
37            throw new Error("key does not support encryption");
38        }
39        return key.decrypt(algorithm, data);
40    }
41
42    importKey(format, keyData, algorithm, extractable, keyUsages) {
43        if (format !== "raw") {
44            throw new Error("key format is not supported");
45        }
46        const alg = this._algorithms[algorithm.name];
47        if (typeof alg === "undefined" || typeof alg.importKey !== "function") {
48            throw new Error("algorithm is not supported");
49        }
50        return alg.importKey(keyData, algorithm, extractable, keyUsages);
51    }
52
53    generateKey(algorithm, extractable, keyUsages) {
54        const alg = this._algorithms[algorithm.name];
55        if (typeof alg === "undefined" || typeof alg.generateKey !== "function") {
56            throw new Error("algorithm is not supported");
57        }
58        return alg.generateKey(algorithm, extractable, keyUsages);
59    }
60
61    exportKey(format, key) {
62        if (format !== "raw") {
63            throw new Error("key format is not supported");
64        }
65        if (typeof key.exportKey !== "function") {
66            throw new Error("key does not support exportKey");
67        }
68        return key.exportKey();
69    }
70
71    digest(algorithm, data) {
72        const alg = this._algorithms[algorithm];
73        if (typeof alg !== "function") {
74            throw new Error("algorithm is not supported");
75        }
76        return alg(data);
77    }
78
79    deriveBits(algorithm, key, length) {
80        if (key.algorithm.name !== algorithm.name) {
81            throw new Error("algorithm does not match");
82        }
83        if (typeof key.deriveBits !== "function") {
84            throw new Error("key does not support deriveBits");
85        }
86        return key.deriveBits(algorithm, length);
87    }
88}
89
90export default new LegacyCrypto;