cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

crct10dif_generic.c (3205B)


      1/*
      2 * Cryptographic API.
      3 *
      4 * T10 Data Integrity Field CRC16 Crypto Transform
      5 *
      6 * Copyright (c) 2007 Oracle Corporation.  All rights reserved.
      7 * Written by Martin K. Petersen <martin.petersen@oracle.com>
      8 * Copyright (C) 2013 Intel Corporation
      9 * Author: Tim Chen <tim.c.chen@linux.intel.com>
     10 *
     11 * This program is free software; you can redistribute it and/or modify it
     12 * under the terms of the GNU General Public License as published by the Free
     13 * Software Foundation; either version 2 of the License, or (at your option)
     14 * any later version.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     23 * SOFTWARE.
     24 *
     25 */
     26
     27#include <linux/module.h>
     28#include <linux/crc-t10dif.h>
     29#include <crypto/internal/hash.h>
     30#include <linux/init.h>
     31#include <linux/kernel.h>
     32
     33struct chksum_desc_ctx {
     34	__u16 crc;
     35};
     36
     37/*
     38 * Steps through buffer one byte at a time, calculates reflected
     39 * crc using table.
     40 */
     41
     42static int chksum_init(struct shash_desc *desc)
     43{
     44	struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
     45
     46	ctx->crc = 0;
     47
     48	return 0;
     49}
     50
     51static int chksum_update(struct shash_desc *desc, const u8 *data,
     52			 unsigned int length)
     53{
     54	struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
     55
     56	ctx->crc = crc_t10dif_generic(ctx->crc, data, length);
     57	return 0;
     58}
     59
     60static int chksum_final(struct shash_desc *desc, u8 *out)
     61{
     62	struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
     63
     64	*(__u16 *)out = ctx->crc;
     65	return 0;
     66}
     67
     68static int __chksum_finup(__u16 crc, const u8 *data, unsigned int len, u8 *out)
     69{
     70	*(__u16 *)out = crc_t10dif_generic(crc, data, len);
     71	return 0;
     72}
     73
     74static int chksum_finup(struct shash_desc *desc, const u8 *data,
     75			unsigned int len, u8 *out)
     76{
     77	struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
     78
     79	return __chksum_finup(ctx->crc, data, len, out);
     80}
     81
     82static int chksum_digest(struct shash_desc *desc, const u8 *data,
     83			 unsigned int length, u8 *out)
     84{
     85	return __chksum_finup(0, data, length, out);
     86}
     87
     88static struct shash_alg alg = {
     89	.digestsize		=	CRC_T10DIF_DIGEST_SIZE,
     90	.init		=	chksum_init,
     91	.update		=	chksum_update,
     92	.final		=	chksum_final,
     93	.finup		=	chksum_finup,
     94	.digest		=	chksum_digest,
     95	.descsize		=	sizeof(struct chksum_desc_ctx),
     96	.base			=	{
     97		.cra_name		=	"crct10dif",
     98		.cra_driver_name	=	"crct10dif-generic",
     99		.cra_priority		=	100,
    100		.cra_blocksize		=	CRC_T10DIF_BLOCK_SIZE,
    101		.cra_module		=	THIS_MODULE,
    102	}
    103};
    104
    105static int __init crct10dif_mod_init(void)
    106{
    107	return crypto_register_shash(&alg);
    108}
    109
    110static void __exit crct10dif_mod_fini(void)
    111{
    112	crypto_unregister_shash(&alg);
    113}
    114
    115subsys_initcall(crct10dif_mod_init);
    116module_exit(crct10dif_mod_fini);
    117
    118MODULE_AUTHOR("Tim Chen <tim.c.chen@linux.intel.com>");
    119MODULE_DESCRIPTION("T10 DIF CRC calculation.");
    120MODULE_LICENSE("GPL");
    121MODULE_ALIAS_CRYPTO("crct10dif");
    122MODULE_ALIAS_CRYPTO("crct10dif-generic");