/* * Copyright (C) 2018 Samsung Electronics Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Functions related to blkcrypt(for inline encryption) handling * * NOTE : * blkcrypt implementation depends on a inline encryption hardware. */ #include #include #include /* For fmp 2.0 driver */ static void *blk_crypt_fmp_alloc_aes_xts(void) { struct crypto_diskcipher *bctx; const char *cipher_str = "xts(aes)"; /* try discipher first */ bctx = crypto_alloc_diskcipher(cipher_str, 0, 0, 1); if (!bctx) { pr_debug("error allocating diskciher '%s' transform: %d", cipher_str, -ENOMEM); return ERR_PTR(-ENOMEM); } if (IS_ERR(bctx)) { pr_debug("error allocating diskciher '%s' transform: %d", cipher_str, PTR_ERR(bctx)); return bctx; } return bctx; } static void blk_crypt_fmp_free_aes_xts(void *data) { if (!data) return; crypto_free_diskcipher((struct crypto_diskcipher *)data); } static int blk_crypt_fmp_set_key(void *data, const char *raw_key, int keysize, void *priv) { return crypto_diskcipher_setkey((struct crypto_diskcipher *)data, raw_key, keysize, 0, (struct inode *)priv); } static const struct blk_crypt_algorithm_cbs fmp_hw_xts_cbs = { .alloc = blk_crypt_fmp_alloc_aes_xts, .free = blk_crypt_fmp_free_aes_xts, .set_key = blk_crypt_fmp_set_key, }; static void *blk_crypt_handle = NULL; /* Blk-crypt core functions */ static int __init blk_crypt_alg_fmp_init(void) { pr_info("%s\n", __func__); blk_crypt_handle = blk_crypt_alg_register(NULL, "xts(aes)", BLK_CRYPT_MODE_INLINE_PRIVATE, &fmp_hw_xts_cbs); if (IS_ERR(blk_crypt_handle)) { pr_err("%s: failed to register alg(xts(aes)), err:%d\n", __func__, PTR_ERR(blk_crypt_handle) ); blk_crypt_handle = NULL; } return 0; } static void __exit blk_crypt_alg_fmp_exit(void) { pr_info("%s\n", __func__); blk_crypt_alg_unregister(blk_crypt_handle); blk_crypt_handle = NULL; } module_init(blk_crypt_alg_fmp_init); module_exit(blk_crypt_alg_fmp_exit);