OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [crypto/] [crc32c.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * Cryptographic API.
3
 *
4
 * CRC32C chksum
5
 *
6
 * This module file is a wrapper to invoke the lib/crc32c routines.
7
 *
8
 * This program is free software; you can redistribute it and/or modify it
9
 * under the terms of the GNU General Public License as published by the Free
10
 * Software Foundation; either version 2 of the License, or (at your option)
11
 * any later version.
12
 *
13
 */
14
#include <linux/init.h>
15
#include <linux/module.h>
16
#include <linux/string.h>
17
#include <linux/crypto.h>
18
#include <linux/crc32c.h>
19
#include <linux/kernel.h>
20
 
21
#define CHKSUM_BLOCK_SIZE       32
22
#define CHKSUM_DIGEST_SIZE      4
23
 
24
struct chksum_ctx {
25
        u32 crc;
26
        u32 key;
27
};
28
 
29
/*
30
 * Steps through buffer one byte at at time, calculates reflected
31
 * crc using table.
32
 */
33
 
34
static void chksum_init(struct crypto_tfm *tfm)
35
{
36
        struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
37
 
38
        mctx->crc = mctx->key;
39
}
40
 
41
/*
42
 * Setting the seed allows arbitrary accumulators and flexible XOR policy
43
 * If your algorithm starts with ~0, then XOR with ~0 before you set
44
 * the seed.
45
 */
46
static int chksum_setkey(struct crypto_tfm *tfm, const u8 *key,
47
                         unsigned int keylen)
48
{
49
        struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
50
 
51
        if (keylen != sizeof(mctx->crc)) {
52
                tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
53
                return -EINVAL;
54
        }
55
        mctx->key = le32_to_cpu(*(__le32 *)key);
56
        return 0;
57
}
58
 
59
static void chksum_update(struct crypto_tfm *tfm, const u8 *data,
60
                          unsigned int length)
61
{
62
        struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
63
 
64
        mctx->crc = crc32c(mctx->crc, data, length);
65
}
66
 
67
static void chksum_final(struct crypto_tfm *tfm, u8 *out)
68
{
69
        struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
70
 
71
        *(__le32 *)out = ~cpu_to_le32(mctx->crc);
72
}
73
 
74
static int crc32c_cra_init(struct crypto_tfm *tfm)
75
{
76
        struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
77
 
78
        mctx->key = ~0;
79
        return 0;
80
}
81
 
82
static struct crypto_alg alg = {
83
        .cra_name       =       "crc32c",
84
        .cra_flags      =       CRYPTO_ALG_TYPE_DIGEST,
85
        .cra_blocksize  =       CHKSUM_BLOCK_SIZE,
86
        .cra_ctxsize    =       sizeof(struct chksum_ctx),
87
        .cra_module     =       THIS_MODULE,
88
        .cra_list       =       LIST_HEAD_INIT(alg.cra_list),
89
        .cra_init       =       crc32c_cra_init,
90
        .cra_u          =       {
91
                .digest = {
92
                         .dia_digestsize=       CHKSUM_DIGEST_SIZE,
93
                         .dia_setkey    =       chksum_setkey,
94
                         .dia_init      =       chksum_init,
95
                         .dia_update    =       chksum_update,
96
                         .dia_final     =       chksum_final
97
                 }
98
        }
99
};
100
 
101
static int __init init(void)
102
{
103
        return crypto_register_alg(&alg);
104
}
105
 
106
static void __exit fini(void)
107
{
108
        crypto_unregister_alg(&alg);
109
}
110
 
111
module_init(init);
112
module_exit(fini);
113
 
114
MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
115
MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c");
116
MODULE_LICENSE("GPL");

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.