UNPKG

@li0ard/magma

Version:

Magma cipher implementation in pure TypeScript

31 lines (30 loc) 1.45 kB
import { BLOCK_SIZE, Magma, sboxes } from "../index.js"; import { cbc_encrypt, cbc_decrypt } from "@li0ard/gost3413"; /** * Encrypts data using Cipher Block Chaining (CBC) mode with the Magma cipher. * * @param key Encryption key * @param data Data to be encrypted * @param iv Initialization vector * @param legacy Enable backward compatibility with old GOST 28147-89 * @param sbox Optional substitution box, defaults to `ID_TC26_GOST_28147_PARAM_Z` * @returns {Uint8Array} */ export const encryptCBC = (key, data, iv, legacy = false, sbox = sboxes.ID_TC26_GOST_28147_PARAM_Z) => { const cipher = new Magma(legacy ? Magma.reverseKey(key) : key, sbox); return cbc_encrypt((legacy ? cipher.encryptLegacy : cipher.encryptBlock).bind(cipher), BLOCK_SIZE, data, iv); }; /** * Decrypts data using Cipher Block Chaining (CBC) mode with the Magma cipher. * * @param key Encryption key * @param data Data to be decrypted * @param iv Initialization vector * @param legacy Enable backward compatibility with old GOST 28147-89 * @param sbox Optional substitution box, defaults to `ID_TC26_GOST_28147_PARAM_Z` * @returns {Uint8Array} */ export const decryptCBC = (key, data, iv, legacy = false, sbox = sboxes.ID_TC26_GOST_28147_PARAM_Z) => { const cipher = new Magma(legacy ? Magma.reverseKey(key) : key, sbox); return cbc_decrypt((legacy ? cipher.decryptLegacy : cipher.decryptBlock).bind(cipher), BLOCK_SIZE, data, iv); };