From 8d7b4a6b7d513510bdec5e191e53ec96333d5512 Mon Sep 17 00:00:00 2001 From: Michael Rowley Date: Wed, 23 Mar 2022 15:43:38 +0000 Subject: [PATCH] Added 'Key Padding' to Triple DES --- src/core/operations/TripleDESDecrypt.mjs | 16 ++++- src/core/operations/TripleDESEncrypt.mjs | 16 ++++- tests/operations/tests/Crypt.mjs | 84 ++++++++++++++++++++---- 3 files changed, 98 insertions(+), 18 deletions(-) diff --git a/src/core/operations/TripleDESDecrypt.mjs b/src/core/operations/TripleDESDecrypt.mjs index c90bf926..c9d4040b 100644 --- a/src/core/operations/TripleDESDecrypt.mjs +++ b/src/core/operations/TripleDESDecrypt.mjs @@ -53,6 +53,11 @@ class TripleDESDecrypt extends Operation { "name": "Output", "type": "option", "value": ["Raw", "Hex"] + }, + { + "name": "Key Padding", + "type": "option", + "value": ["None", "Null", "Repeat"] } ]; } @@ -63,11 +68,16 @@ class TripleDESDecrypt extends Operation { * @returns {string} */ run(input, args) { - const key = Utils.convertToByteString(args[0].string, args[0].option), - iv = Utils.convertToByteArray(args[1].string, args[1].option), + var key = Utils.convertToByteString(args[0].string, args[0].option); + const iv = Utils.convertToByteArray(args[1].string, args[1].option), mode = args[2], inputType = args[3], - outputType = args[4]; + outputType = args[4], + keyPadding = args[5]; + + if (keyPadding !== "None" && key.length < 24) { + key = key.padEnd(24, keyPadding === "Null" ? "\0" : key); + } if (key.length !== 24) { throw new OperationError(`Invalid key length: ${key.length} bytes diff --git a/src/core/operations/TripleDESEncrypt.mjs b/src/core/operations/TripleDESEncrypt.mjs index 237020a2..a1bf8ad5 100644 --- a/src/core/operations/TripleDESEncrypt.mjs +++ b/src/core/operations/TripleDESEncrypt.mjs @@ -53,6 +53,11 @@ class TripleDESEncrypt extends Operation { "name": "Output", "type": "option", "value": ["Hex", "Raw"] + }, + { + "name": "Key Padding", + "type": "option", + "value": ["None", "Null", "Repeat"] } ]; } @@ -63,11 +68,16 @@ class TripleDESEncrypt extends Operation { * @returns {string} */ run(input, args) { - const key = Utils.convertToByteString(args[0].string, args[0].option), - iv = Utils.convertToByteArray(args[1].string, args[1].option), + var key = Utils.convertToByteString(args[0].string, args[0].option); + const iv = Utils.convertToByteArray(args[1].string, args[1].option), mode = args[2], inputType = args[3], - outputType = args[4]; + outputType = args[4], + keyPadding = args[5]; + + if (keyPadding !== "None" && key.length < 24) { + key = key.padEnd(24, keyPadding === "Null" ? "\0" : key); + } if (key.length !== 24) { throw new OperationError(`Invalid key length: ${key.length} bytes diff --git a/tests/operations/tests/Crypt.mjs b/tests/operations/tests/Crypt.mjs index d865579c..3d7f616c 100644 --- a/tests/operations/tests/Crypt.mjs +++ b/tests/operations/tests/Crypt.mjs @@ -777,7 +777,37 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": ""}, {"option": "Hex", "string": ""}, - "CBC", "Hex", "Hex" + "CBC", "Hex", "Hex", "None" + ] + } + ], + }, + { + name: "Triple DES Encrypt: Null key padding", + input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: "d81502f7af1f75823729f319fcc658f27cd180b8e3e471f81518dea8a6a91c2a030edea1d0e3e6b439c3ce64970dcc945f1293fd0fa2acda421fed39b5385a5a2ede1ed97351cb05ba16cf6697114a30985d5a0a785fa5883baaae9fc5a296486228bd01064d061c6083a1d3ca68640dbc13c65b8a9812b28b0592c27a197e74f31dd0f9169aaecfc43232f531c25462ee6059ced7994cd24bdf35bd4880c24b103fa68427e22a5449a34e62b51c01d2f64f60014075b526bc3f055aa02a7e6a2330bd4fed558559fdb0488bbc5bfb34", + recipeConfig: [ + { + "op": "Triple DES Encrypt", + "args": [ + {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, + {"option": "Hex", "string": "14f67ac044a84da6"}, + "CBC", "Hex", "Hex", "Null" + ] + } + ], + }, + { + name: "Triple DES Encrypt: Repeat key padding", + input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + expectedOutput: "72949667dbf3ebb6ea6ad62644fb4c2de74aaa2de2e159b3822c594f6ee52df5f79ddfa51f4d641874acf91d396ab06cbb07c7ce926a2420e4e9a29ab4dff5216628a5590c15bbe51d4c0ba46ebf7b588bc087cf05bad4476a4e8fa43c8feb2e473505fad2cb4b927a9fae2ad2a6dd12e5424c8727cb199e64e93312cc4ee39425b0ce919145549810c2ea87aa9a2a76d4221d774f1756e52e5a7aa97a7657f51396a5a30fcbbb532ae7b7554a3aa5dedabf625c8c049f53d3e059c14ed256644a207c5070d8a4ffd71ef610689f90cb", + recipeConfig: [ + { + "op": "Triple DES Encrypt", + "args": [ + {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, + {"option": "Hex", "string": "14f67ac044a84da6"}, + "CBC", "Hex", "Hex", "Repeat" ] } ], @@ -792,7 +822,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "CBC", "Hex", "Hex" + "CBC", "Hex", "Hex", "None" ] } ], @@ -807,7 +837,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "CFB", "Hex", "Hex" + "CFB", "Hex", "Hex", "None" ] } ], @@ -822,7 +852,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "OFB", "Hex", "Hex" + "OFB", "Hex", "Hex", "None" ] } ], @@ -838,7 +868,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "CTR", "Hex", "Hex" + "CTR", "Hex", "Hex", "None" ] } ], @@ -853,7 +883,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "ECB", "Hex", "Hex" + "ECB", "Hex", "Hex", "None" ] } ], @@ -1593,7 +1623,37 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": ""}, {"option": "Hex", "string": ""}, - "CBC", "Hex", "Hex" + "CBC", "Hex", "Hex", "None" + ] + } + ], + }, + { + name: "Triple DES Decrypt: Null key padding", + input: "d81502f7af1f75823729f319fcc658f27cd180b8e3e471f81518dea8a6a91c2a030edea1d0e3e6b439c3ce64970dcc945f1293fd0fa2acda421fed39b5385a5a2ede1ed97351cb05ba16cf6697114a30985d5a0a785fa5883baaae9fc5a296486228bd01064d061c6083a1d3ca68640dbc13c65b8a9812b28b0592c27a197e74f31dd0f9169aaecfc43232f531c25462ee6059ced7994cd24bdf35bd4880c24b103fa68427e22a5449a34e62b51c01d2f64f60014075b526bc3f055aa02a7e6a2330bd4fed558559fdb0488bbc5bfb34", + expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + recipeConfig: [ + { + "op": "Triple DES Decrypt", + "args": [ + {"option": "Hex", "string": "190da55fb54b9e7dd6de05f4"}, + {"option": "Hex", "string": "14f67ac044a84da6"}, + "CBC", "Hex", "Hex", "Null" + ] + } + ], + }, + { + name: "Triple DES Decrypt: Repeat key padding", + input: "72949667dbf3ebb6ea6ad62644fb4c2de74aaa2de2e159b3822c594f6ee52df5f79ddfa51f4d641874acf91d396ab06cbb07c7ce926a2420e4e9a29ab4dff5216628a5590c15bbe51d4c0ba46ebf7b588bc087cf05bad4476a4e8fa43c8feb2e473505fad2cb4b927a9fae2ad2a6dd12e5424c8727cb199e64e93312cc4ee39425b0ce919145549810c2ea87aa9a2a76d4221d774f1756e52e5a7aa97a7657f51396a5a30fcbbb532ae7b7554a3aa5dedabf625c8c049f53d3e059c14ed256644a207c5070d8a4ffd71ef610689f90cb", + expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018", + recipeConfig: [ + { + "op": "Triple DES Decrypt", + "args": [ + {"option": "Hex", "string": "190da55fb54b9e7dd6de05f4"}, + {"option": "Hex", "string": "14f67ac044a84da6"}, + "CBC", "Hex", "Hex", "Repeat" ] } ], @@ -1608,7 +1668,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "CBC", "Hex", "Hex" + "CBC", "Hex", "Hex", "None" ] } ], @@ -1623,7 +1683,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "CFB", "Hex", "Hex" + "CFB", "Hex", "Hex", "None" ] } ], @@ -1638,7 +1698,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "OFB", "Hex", "Hex" + "OFB", "Hex", "Hex", "None" ] } ], @@ -1654,7 +1714,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "CTR", "Hex", "Hex" + "CTR", "Hex", "Hex", "None" ] } ], @@ -1669,7 +1729,7 @@ DES uses a key length of 8 bytes (64 bits).`, "args": [ {"option": "Hex", "string": "190da55fb54b9e7dd6de05f43bf3347ef203cd34a5829b23"}, {"option": "Hex", "string": "14f67ac044a84da6"}, - "ECB", "Hex", "Hex" + "ECB", "Hex", "Hex", "None" ] } ],