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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [crypto/] [arc4.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
 * ARC4 Cipher Algorithm
5
 *
6
 * Jon Oberheide <jon@oberheide.org>
7
 *
8
 * This program is free software; you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation; either version 2 of the License, or
11
 * (at your option) any later version.
12
 *
13
 */
14
#include <linux/module.h>
15
#include <linux/init.h>
16
#include <linux/crypto.h>
17
 
18
#define ARC4_MIN_KEY_SIZE       1
19
#define ARC4_MAX_KEY_SIZE       256
20
#define ARC4_BLOCK_SIZE         1
21
 
22
struct arc4_ctx {
23
        u8 S[256];
24
        u8 x, y;
25
};
26
 
27
static int arc4_set_key(struct crypto_tfm *tfm, const u8 *in_key,
28
                        unsigned int key_len)
29
{
30
        struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);
31
        int i, j = 0, k = 0;
32
 
33
        ctx->x = 1;
34
        ctx->y = 0;
35
 
36
        for(i = 0; i < 256; i++)
37
                ctx->S[i] = i;
38
 
39
        for(i = 0; i < 256; i++)
40
        {
41
                u8 a = ctx->S[i];
42
                j = (j + in_key[k] + a) & 0xff;
43
                ctx->S[i] = ctx->S[j];
44
                ctx->S[j] = a;
45
                if(++k >= key_len)
46
                        k = 0;
47
        }
48
 
49
        return 0;
50
}
51
 
52
static void arc4_crypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
53
{
54
        struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);
55
 
56
        u8 *const S = ctx->S;
57
        u8 x = ctx->x;
58
        u8 y = ctx->y;
59
        u8 a, b;
60
 
61
        a = S[x];
62
        y = (y + a) & 0xff;
63
        b = S[y];
64
        S[x] = b;
65
        S[y] = a;
66
        x = (x + 1) & 0xff;
67
        *out++ = *in ^ S[(a + b) & 0xff];
68
 
69
        ctx->x = x;
70
        ctx->y = y;
71
}
72
 
73
static struct crypto_alg arc4_alg = {
74
        .cra_name               =       "arc4",
75
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
76
        .cra_blocksize          =       ARC4_BLOCK_SIZE,
77
        .cra_ctxsize            =       sizeof(struct arc4_ctx),
78
        .cra_module             =       THIS_MODULE,
79
        .cra_list               =       LIST_HEAD_INIT(arc4_alg.cra_list),
80
        .cra_u                  =       { .cipher = {
81
        .cia_min_keysize        =       ARC4_MIN_KEY_SIZE,
82
        .cia_max_keysize        =       ARC4_MAX_KEY_SIZE,
83
        .cia_setkey             =       arc4_set_key,
84
        .cia_encrypt            =       arc4_crypt,
85
        .cia_decrypt            =       arc4_crypt } }
86
};
87
 
88
static int __init arc4_init(void)
89
{
90
        return crypto_register_alg(&arc4_alg);
91
}
92
 
93
 
94
static void __exit arc4_exit(void)
95
{
96
        crypto_unregister_alg(&arc4_alg);
97
}
98
 
99
module_init(arc4_init);
100
module_exit(arc4_exit);
101
 
102
MODULE_LICENSE("GPL");
103
MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
104
MODULE_AUTHOR("Jon Oberheide <jon@oberheide.org>");

powered by: WebSVN 2.1.0

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