瀏覽代碼

Add RSA Encrypt Operation

Matt 5 年之前
父節點
當前提交
e7b5c0e37c
共有 3 個文件被更改,包括 85 次插入3 次删除
  1. 84 0
      src/core/operations/RSAEncrypt.mjs
  2. 0 1
      src/core/operations/RSASign.mjs
  3. 1 2
      src/core/operations/RSAVerify.mjs

+ 84 - 0
src/core/operations/RSAEncrypt.mjs

@@ -0,0 +1,84 @@
+/**
+ * @author Matt C [me@mitt.dev]
+ * @copyright Crown Copyright 2020
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+import forge from "node-forge/dist/forge.min.js";
+import { MD_ALGORITHMS } from "../lib/RSA.mjs";
+
+/**
+ * RSA Encrypt operation
+ */
+class RSAEncrypt extends Operation {
+
+    /**
+     * RSAEncrypt constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "RSA Encrypt";
+        this.module = "Ciphers";
+        this.description = "Encrypt a message with a PEM encoded RSA public key.";
+        this.infoURL = "https://wikipedia.org/wiki/RSA_(cryptosystem)";
+        this.inputType = "string";
+        this.outputType = "string";
+        this.args = [
+            {
+                name: "RSA Public Key (PEM)",
+                type: "text",
+                value: "-----BEGIN RSA PUBLIC KEY-----"
+            },
+            {
+                name: "Encryption Scheme",
+                type: "argSelector",
+                value: [
+                    {
+                        name: "RSA-OAEP",
+                        on: [2]
+                    },
+                    {
+                        name: "RSAES-PKCS1-V1_5",
+                        off: [2]
+                    },
+                    {
+                        name: "RAW",
+                        off: [2]
+                    }]
+            },
+            {
+                name: "Message Digest Algorithm",
+                type: "option",
+                value: Object.keys(MD_ALGORITHMS)
+            }
+        ];
+    }
+
+    /**
+     * @param {string} input
+     * @param {Object[]} args
+     * @returns {string}
+     */
+    run(input, args) {
+        const [pemKey, scheme, md] = args;
+
+        if (pemKey.replace("-----BEGIN RSA PUBLIC KEY-----", "").length === 0) {
+            throw new OperationError("Please enter a public key.");
+        }
+        try {
+            // Load public key
+            const pubKey = forge.pki.publicKeyFromPem(pemKey);
+            // Encrypt message
+            const eMsg = pubKey.encrypt(input, scheme, {md: MD_ALGORITHMS[md].create()});
+            return eMsg;
+        } catch (err) {
+            throw new OperationError(err);
+        }
+    }
+
+}
+
+export default RSAEncrypt;

+ 0 - 1
src/core/operations/RSASign.mjs

@@ -8,7 +8,6 @@
 import Operation from "../Operation";
 import OperationError from "../errors/OperationError";
 import forge from "node-forge/dist/forge.min.js";
-import Utils from "../Utils.mjs";
 import { MD_ALGORITHMS } from "../lib/RSA.mjs";
 
 /**

+ 1 - 2
src/core/operations/RSAVerify.mjs

@@ -6,7 +6,6 @@
 
 import Operation from "../Operation.mjs";
 import OperationError from "../errors/OperationError.mjs";
-import Utils from "../Utils.mjs";
 import forge from "node-forge/dist/forge.min.js";
 import { MD_ALGORITHMS } from "../lib/RSA.mjs";
 
@@ -47,7 +46,7 @@ class RSAVerify extends Operation {
     }
 
     /**
-     * @param {byteArray} input
+     * @param {string} input
      * @param {Object[]} args
      * @returns {string}
      */