cregit-Linux how code gets into the kernel

Release 4.14 crypto/crc32c_generic.c

Directory: crypto
/*
 * Cryptographic API.
 *
 * CRC32C chksum
 *
 *@Article{castagnoli-crc,
 * author =       { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
 * title =        {{Optimization of Cyclic Redundancy-Check Codes with 24
 *                 and 32 Parity Bits}},
 * journal =      IEEE Transactions on Communication,
 * year =         {1993},
 * volume =       {41},
 * number =       {6},
 * pages =        {},
 * month =        {June},
 *}
 * Used by the iSCSI driver, possibly others, and derived from the
 * the iscsi-crc.c module of the linux-iscsi driver at
 * http://linux-iscsi.sourceforge.net.
 *
 * Following the example of lib/crc32, this function is intended to be
 * flexible and useful for all users.  Modules that currently have their
 * own crc32c, but hopefully may be able to use this one are:
 *  net/sctp (please add all your doco to here if you change to
 *            use this one!)
 *  <endoflist>
 *
 * Copyright (c) 2004 Cisco Systems, Inc.
 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
 *
 * 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.
 *
 */

#include <crypto/internal/hash.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/crc32.h>


#define CHKSUM_BLOCK_SIZE	1

#define CHKSUM_DIGEST_SIZE	4


struct chksum_ctx {
	
u32 key;
};


struct chksum_desc_ctx {
	
u32 crc;
};

/*
 * Steps through buffer one byte at at time, calculates reflected
 * crc using table.
 */


static int chksum_init(struct shash_desc *desc) { struct chksum_ctx *mctx = crypto_shash_ctx(desc->tfm); struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); ctx->crc = mctx->key; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu2761.36%375.00%
Clay Haapala1738.64%125.00%
Total44100.00%4100.00%

/* * Setting the seed allows arbitrary accumulators and flexible XOR policy * If your algorithm starts with ~0, then XOR with ~0 before you set * the seed. */
static int chksum_setkey(struct crypto_shash *tfm, const u8 *key, unsigned int keylen) { struct chksum_ctx *mctx = crypto_shash_ctx(tfm); if (keylen != sizeof(mctx->key)) { crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); return -EINVAL; } mctx->key = le32_to_cpu(*(__le32 *)key); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Clay Haapala5577.46%120.00%
Herbert Xu1622.54%480.00%
Total71100.00%5100.00%


static int chksum_update(struct shash_desc *desc, const u8 *data, unsigned int length) { struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); ctx->crc = __crc32c_le(ctx->crc, data, length); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Clay Haapala3062.50%233.33%
Herbert Xu1735.42%350.00%
Darrick J. Wong12.08%116.67%
Total48100.00%6100.00%


static int chksum_final(struct shash_desc *desc, u8 *out) { struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); *(__le32 *)out = ~cpu_to_le32p(&ctx->crc); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu2454.55%375.00%
Clay Haapala2045.45%125.00%
Total44100.00%4100.00%


static int __chksum_finup(u32 *crcp, const u8 *data, unsigned int len, u8 *out) { *(__le32 *)out = ~cpu_to_le32(__crc32c_le(*crcp, data, len)); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu4697.87%150.00%
Darrick J. Wong12.13%150.00%
Total47100.00%2100.00%


static int chksum_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); return __chksum_finup(&ctx->crc, data, len, out); }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu49100.00%1100.00%
Total49100.00%1100.00%


static int chksum_digest(struct shash_desc *desc, const u8 *data, unsigned int length, u8 *out) { struct chksum_ctx *mctx = crypto_shash_ctx(desc->tfm); return __chksum_finup(&mctx->key, data, length, out); }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu51100.00%2100.00%
Total51100.00%2100.00%


static int crc32c_cra_init(struct crypto_tfm *tfm) { struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); mctx->key = ~0; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu2787.10%266.67%
Clay Haapala412.90%133.33%
Total31100.00%3100.00%

static struct shash_alg alg = { .digestsize = CHKSUM_DIGEST_SIZE, .setkey = chksum_setkey, .init = chksum_init, .update = chksum_update, .final = chksum_final, .finup = chksum_finup, .digest = chksum_digest, .descsize = sizeof(struct chksum_desc_ctx), .base = { .cra_name = "crc32c", .cra_driver_name = "crc32c-generic", .cra_priority = 100, .cra_blocksize = CHKSUM_BLOCK_SIZE, .cra_alignmask = 3, .cra_ctxsize = sizeof(struct chksum_ctx), .cra_module = THIS_MODULE, .cra_init = crc32c_cra_init, } };
static int __init crc32c_mod_init(void) { return crypto_register_shash(&alg); }

Contributors

PersonTokensPropCommitsCommitProp
Clay Haapala1487.50%133.33%
Kamalesh Babulal16.25%133.33%
Herbert Xu16.25%133.33%
Total16100.00%3100.00%


static void __exit crc32c_mod_fini(void) { crypto_unregister_shash(&alg); }

Contributors

PersonTokensPropCommitsCommitProp
Clay Haapala1386.67%133.33%
Herbert Xu16.67%133.33%
Kamalesh Babulal16.67%133.33%
Total15100.00%3100.00%

module_init(crc32c_mod_init); module_exit(crc32c_mod_fini); MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>"); MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c"); MODULE_LICENSE("GPL"); MODULE_ALIAS_CRYPTO("crc32c"); MODULE_ALIAS_CRYPTO("crc32c-generic");

Overall Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu33656.38%538.46%
Clay Haapala23940.10%215.38%
Darrick J. Wong50.84%17.69%
Mathias Krause50.84%17.69%
Kamalesh Babulal40.67%17.69%
Tim Chen40.67%17.69%
Richard Hartmann20.34%17.69%
Kees Cook10.17%17.69%
Total596100.00%13100.00%
Directory: crypto
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.