Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 142 lines (125 sloc) 3.472 kb
0d8fb0a Richard Hartmann crypto: blowfish - Fix checkpatch errors
RichiH authored
1 /*
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
2 * Cryptographic API.
3 *
4 * Blowfish Cipher Algorithm, by Bruce Schneier.
5 * http://www.counterpane.com/blowfish.html
6 *
7 * Adapted from Kerneli implementation.
8 *
9 * Copyright (c) Herbert Valerio Riedel <hvr@hvrlab.org>
10 * Copyright (c) Kyle McMartin <kyle@debian.org>
11 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 */
19 #include <linux/init.h>
20 #include <linux/module.h>
21 #include <linux/mm.h>
06ace7a Herbert Xu [CRYPTO] Use standard byte order macros wherever possible
herbertx authored
22 #include <asm/byteorder.h>
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
23 #include <linux/crypto.h>
06ace7a Herbert Xu [CRYPTO] Use standard byte order macros wherever possible
herbertx authored
24 #include <linux/types.h>
52ba867 Jussi Kivilinna crypto: blowfish - split generic and common c code
jkivilin authored
25 #include <crypto/blowfish.h>
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
26
0d8fb0a Richard Hartmann crypto: blowfish - Fix checkpatch errors
RichiH authored
27 /*
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
28 * Round loop unrolling macros, S is a pointer to a S-Box array
29 * organized in 4 unsigned longs at a row.
30 */
31 #define GET32_3(x) (((x) & 0xff))
32 #define GET32_2(x) (((x) >> (8)) & (0xff))
33 #define GET32_1(x) (((x) >> (16)) & (0xff))
34 #define GET32_0(x) (((x) >> (24)) & (0xff))
35
36 #define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \
3f2a5d2 Jussi Kivilinna crypto: blowfish - rename C-version to blowfish_generic
jkivilin authored
37 S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
38
3f2a5d2 Jussi Kivilinna crypto: blowfish - rename C-version to blowfish_generic
jkivilin authored
39 #define ROUND(a, b, n) ({ b ^= P[n]; a ^= bf_F(b); })
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
40
52ba867 Jussi Kivilinna crypto: blowfish - split generic and common c code
jkivilin authored
41 static void bf_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
42 {
52ba867 Jussi Kivilinna crypto: blowfish - split generic and common c code
jkivilin authored
43 struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
44 const __be32 *in_blk = (const __be32 *)src;
45 __be32 *const out_blk = (__be32 *)dst;
46 const u32 *P = ctx->p;
47 const u32 *S = ctx->s;
48 u32 yl = be32_to_cpu(in_blk[0]);
49 u32 yr = be32_to_cpu(in_blk[1]);
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
50
51 ROUND(yr, yl, 0);
52 ROUND(yl, yr, 1);
53 ROUND(yr, yl, 2);
54 ROUND(yl, yr, 3);
55 ROUND(yr, yl, 4);
56 ROUND(yl, yr, 5);
57 ROUND(yr, yl, 6);
58 ROUND(yl, yr, 7);
59 ROUND(yr, yl, 8);
60 ROUND(yl, yr, 9);
61 ROUND(yr, yl, 10);
62 ROUND(yl, yr, 11);
63 ROUND(yr, yl, 12);
64 ROUND(yl, yr, 13);
65 ROUND(yr, yl, 14);
66 ROUND(yl, yr, 15);
67
68 yl ^= P[16];
69 yr ^= P[17];
70
52ba867 Jussi Kivilinna crypto: blowfish - split generic and common c code
jkivilin authored
71 out_blk[0] = cpu_to_be32(yr);
72 out_blk[1] = cpu_to_be32(yl);
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
73 }
74
6c2bb98 Herbert Xu [CRYPTO] all: Pass tfm instead of ctx to algorithms
herbertx authored
75 static void bf_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
76 {
6c2bb98 Herbert Xu [CRYPTO] all: Pass tfm instead of ctx to algorithms
herbertx authored
77 struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
78 const __be32 *in_blk = (const __be32 *)src;
79 __be32 *const out_blk = (__be32 *)dst;
6c2bb98 Herbert Xu [CRYPTO] all: Pass tfm instead of ctx to algorithms
herbertx authored
80 const u32 *P = ctx->p;
81 const u32 *S = ctx->s;
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
82 u32 yl = be32_to_cpu(in_blk[0]);
83 u32 yr = be32_to_cpu(in_blk[1]);
84
85 ROUND(yr, yl, 17);
86 ROUND(yl, yr, 16);
87 ROUND(yr, yl, 15);
88 ROUND(yl, yr, 14);
89 ROUND(yr, yl, 13);
90 ROUND(yl, yr, 12);
91 ROUND(yr, yl, 11);
92 ROUND(yl, yr, 10);
93 ROUND(yr, yl, 9);
94 ROUND(yl, yr, 8);
95 ROUND(yr, yl, 7);
96 ROUND(yl, yr, 6);
97 ROUND(yr, yl, 5);
98 ROUND(yl, yr, 4);
99 ROUND(yr, yl, 3);
100 ROUND(yl, yr, 2);
101
102 yl ^= P[1];
103 yr ^= P[0];
104
105 out_blk[0] = cpu_to_be32(yr);
106 out_blk[1] = cpu_to_be32(yl);
107 }
108
109 static struct crypto_alg alg = {
110 .cra_name = "blowfish",
3f2a5d2 Jussi Kivilinna crypto: blowfish - rename C-version to blowfish_generic
jkivilin authored
111 .cra_driver_name = "blowfish-generic",
112 .cra_priority = 100,
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
113 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
114 .cra_blocksize = BF_BLOCK_SIZE,
115 .cra_ctxsize = sizeof(struct bf_ctx),
a429d26 Herbert Xu [CRYPTO] cipher: Set alignmask for multi-byte loads
herbertx authored
116 .cra_alignmask = 3,
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
117 .cra_module = THIS_MODULE,
118 .cra_u = { .cipher = {
119 .cia_min_keysize = BF_MIN_KEY_SIZE,
120 .cia_max_keysize = BF_MAX_KEY_SIZE,
52ba867 Jussi Kivilinna crypto: blowfish - split generic and common c code
jkivilin authored
121 .cia_setkey = blowfish_setkey,
3f2a5d2 Jussi Kivilinna crypto: blowfish - rename C-version to blowfish_generic
jkivilin authored
122 .cia_encrypt = bf_encrypt,
123 .cia_decrypt = bf_decrypt } }
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
124 };
125
3af5b90 Kamalesh Babulal [CRYPTO] all: Clean up init()/fini()
bkamalesh authored
126 static int __init blowfish_mod_init(void)
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
127 {
128 return crypto_register_alg(&alg);
129 }
130
3af5b90 Kamalesh Babulal [CRYPTO] all: Clean up init()/fini()
bkamalesh authored
131 static void __exit blowfish_mod_fini(void)
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
132 {
133 crypto_unregister_alg(&alg);
134 }
135
3af5b90 Kamalesh Babulal [CRYPTO] all: Clean up init()/fini()
bkamalesh authored
136 module_init(blowfish_mod_init);
137 module_exit(blowfish_mod_fini);
1da177e Linux-2.6.12-rc2
Linus Torvalds authored
138
139 MODULE_LICENSE("GPL");
140 MODULE_DESCRIPTION("Blowfish Cipher Algorithm");
3f2a5d2 Jussi Kivilinna crypto: blowfish - rename C-version to blowfish_generic
jkivilin authored
141 MODULE_ALIAS("blowfish");
Something went wrong with that request. Please try again.