diff options
-rw-r--r-- | crypto/ablkcipher.c | 46 | ||||
-rw-r--r-- | include/crypto/internal/skcipher.h | 9 | ||||
-rw-r--r-- | include/crypto/skcipher.h | 38 | ||||
-rw-r--r-- | include/linux/crypto.h | 7 |
4 files changed, 100 insertions, 0 deletions
diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c index 0083140304d2..e403d8137ecd 100644 --- a/crypto/ablkcipher.c +++ b/crypto/ablkcipher.c | |||
@@ -107,6 +107,52 @@ const struct crypto_type crypto_ablkcipher_type = { | |||
107 | }; | 107 | }; |
108 | EXPORT_SYMBOL_GPL(crypto_ablkcipher_type); | 108 | EXPORT_SYMBOL_GPL(crypto_ablkcipher_type); |
109 | 109 | ||
110 | static int no_givdecrypt(struct skcipher_givcrypt_request *req) | ||
111 | { | ||
112 | return -ENOSYS; | ||
113 | } | ||
114 | |||
115 | static int crypto_init_givcipher_ops(struct crypto_tfm *tfm, u32 type, | ||
116 | u32 mask) | ||
117 | { | ||
118 | struct ablkcipher_alg *alg = &tfm->__crt_alg->cra_ablkcipher; | ||
119 | struct ablkcipher_tfm *crt = &tfm->crt_ablkcipher; | ||
120 | |||
121 | if (alg->ivsize > PAGE_SIZE / 8) | ||
122 | return -EINVAL; | ||
123 | |||
124 | crt->setkey = setkey; | ||
125 | crt->encrypt = alg->encrypt; | ||
126 | crt->decrypt = alg->decrypt; | ||
127 | crt->givencrypt = alg->givencrypt; | ||
128 | crt->givdecrypt = alg->givdecrypt ?: no_givdecrypt; | ||
129 | crt->ivsize = alg->ivsize; | ||
130 | |||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg) | ||
135 | __attribute__ ((unused)); | ||
136 | static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg) | ||
137 | { | ||
138 | struct ablkcipher_alg *ablkcipher = &alg->cra_ablkcipher; | ||
139 | |||
140 | seq_printf(m, "type : givcipher\n"); | ||
141 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); | ||
142 | seq_printf(m, "min keysize : %u\n", ablkcipher->min_keysize); | ||
143 | seq_printf(m, "max keysize : %u\n", ablkcipher->max_keysize); | ||
144 | seq_printf(m, "ivsize : %u\n", ablkcipher->ivsize); | ||
145 | } | ||
146 | |||
147 | const struct crypto_type crypto_givcipher_type = { | ||
148 | .ctxsize = crypto_ablkcipher_ctxsize, | ||
149 | .init = crypto_init_givcipher_ops, | ||
150 | #ifdef CONFIG_PROC_FS | ||
151 | .show = crypto_givcipher_show, | ||
152 | #endif | ||
153 | }; | ||
154 | EXPORT_SYMBOL_GPL(crypto_givcipher_type); | ||
155 | |||
110 | int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name, | 156 | int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name, |
111 | u32 type, u32 mask) | 157 | u32 type, u32 mask) |
112 | { | 158 | { |
diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h index 87879e64ff4c..c9402dd12d03 100644 --- a/include/crypto/internal/skcipher.h +++ b/include/crypto/internal/skcipher.h | |||
@@ -14,11 +14,14 @@ | |||
14 | #define _CRYPTO_INTERNAL_SKCIPHER_H | 14 | #define _CRYPTO_INTERNAL_SKCIPHER_H |
15 | 15 | ||
16 | #include <crypto/algapi.h> | 16 | #include <crypto/algapi.h> |
17 | #include <crypto/skcipher.h> | ||
17 | 18 | ||
18 | struct crypto_skcipher_spawn { | 19 | struct crypto_skcipher_spawn { |
19 | struct crypto_spawn base; | 20 | struct crypto_spawn base; |
20 | }; | 21 | }; |
21 | 22 | ||
23 | extern const struct crypto_type crypto_givcipher_type; | ||
24 | |||
22 | static inline void crypto_set_skcipher_spawn( | 25 | static inline void crypto_set_skcipher_spawn( |
23 | struct crypto_skcipher_spawn *spawn, struct crypto_instance *inst) | 26 | struct crypto_skcipher_spawn *spawn, struct crypto_instance *inst) |
24 | { | 27 | { |
@@ -47,5 +50,11 @@ static inline struct crypto_ablkcipher *crypto_spawn_skcipher( | |||
47 | crypto_skcipher_mask(0))); | 50 | crypto_skcipher_mask(0))); |
48 | } | 51 | } |
49 | 52 | ||
53 | static inline void *skcipher_givcrypt_reqctx( | ||
54 | struct skcipher_givcrypt_request *req) | ||
55 | { | ||
56 | return ablkcipher_request_ctx(&req->creq); | ||
57 | } | ||
58 | |||
50 | #endif /* _CRYPTO_INTERNAL_SKCIPHER_H */ | 59 | #endif /* _CRYPTO_INTERNAL_SKCIPHER_H */ |
51 | 60 | ||
diff --git a/include/crypto/skcipher.h b/include/crypto/skcipher.h new file mode 100644 index 000000000000..c283fab5eddb --- /dev/null +++ b/include/crypto/skcipher.h | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * Symmetric key ciphers. | ||
3 | * | ||
4 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef _CRYPTO_SKCIPHER_H | ||
14 | #define _CRYPTO_SKCIPHER_H | ||
15 | |||
16 | #include <linux/crypto.h> | ||
17 | |||
18 | /** | ||
19 | * struct skcipher_givcrypt_request - Crypto request with IV generation | ||
20 | * @seq: Sequence number for IV generation | ||
21 | * @giv: Space for generated IV | ||
22 | * @creq: The crypto request itself | ||
23 | */ | ||
24 | struct skcipher_givcrypt_request { | ||
25 | u64 seq; | ||
26 | u8 *giv; | ||
27 | |||
28 | struct ablkcipher_request creq; | ||
29 | }; | ||
30 | |||
31 | static inline struct crypto_ablkcipher *skcipher_givcrypt_reqtfm( | ||
32 | struct skcipher_givcrypt_request *req) | ||
33 | { | ||
34 | return crypto_ablkcipher_reqtfm(&req->creq); | ||
35 | } | ||
36 | |||
37 | #endif /* _CRYPTO_SKCIPHER_H */ | ||
38 | |||
diff --git a/include/linux/crypto.h b/include/linux/crypto.h index d6962b409489..3656a24ea7f0 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h | |||
@@ -34,6 +34,7 @@ | |||
34 | #define CRYPTO_ALG_TYPE_HASH 0x00000003 | 34 | #define CRYPTO_ALG_TYPE_HASH 0x00000003 |
35 | #define CRYPTO_ALG_TYPE_BLKCIPHER 0x00000004 | 35 | #define CRYPTO_ALG_TYPE_BLKCIPHER 0x00000004 |
36 | #define CRYPTO_ALG_TYPE_ABLKCIPHER 0x00000005 | 36 | #define CRYPTO_ALG_TYPE_ABLKCIPHER 0x00000005 |
37 | #define CRYPTO_ALG_TYPE_GIVCIPHER 0x00000006 | ||
37 | #define CRYPTO_ALG_TYPE_COMPRESS 0x00000008 | 38 | #define CRYPTO_ALG_TYPE_COMPRESS 0x00000008 |
38 | #define CRYPTO_ALG_TYPE_AEAD 0x00000009 | 39 | #define CRYPTO_ALG_TYPE_AEAD 0x00000009 |
39 | 40 | ||
@@ -99,6 +100,7 @@ struct crypto_blkcipher; | |||
99 | struct crypto_hash; | 100 | struct crypto_hash; |
100 | struct crypto_tfm; | 101 | struct crypto_tfm; |
101 | struct crypto_type; | 102 | struct crypto_type; |
103 | struct skcipher_givcrypt_request; | ||
102 | 104 | ||
103 | typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err); | 105 | typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err); |
104 | 106 | ||
@@ -178,6 +180,8 @@ struct ablkcipher_alg { | |||
178 | unsigned int keylen); | 180 | unsigned int keylen); |
179 | int (*encrypt)(struct ablkcipher_request *req); | 181 | int (*encrypt)(struct ablkcipher_request *req); |
180 | int (*decrypt)(struct ablkcipher_request *req); | 182 | int (*decrypt)(struct ablkcipher_request *req); |
183 | int (*givencrypt)(struct skcipher_givcrypt_request *req); | ||
184 | int (*givdecrypt)(struct skcipher_givcrypt_request *req); | ||
181 | 185 | ||
182 | unsigned int min_keysize; | 186 | unsigned int min_keysize; |
183 | unsigned int max_keysize; | 187 | unsigned int max_keysize; |
@@ -320,6 +324,9 @@ struct ablkcipher_tfm { | |||
320 | unsigned int keylen); | 324 | unsigned int keylen); |
321 | int (*encrypt)(struct ablkcipher_request *req); | 325 | int (*encrypt)(struct ablkcipher_request *req); |
322 | int (*decrypt)(struct ablkcipher_request *req); | 326 | int (*decrypt)(struct ablkcipher_request *req); |
327 | int (*givencrypt)(struct skcipher_givcrypt_request *req); | ||
328 | int (*givdecrypt)(struct skcipher_givcrypt_request *req); | ||
329 | |||
323 | unsigned int ivsize; | 330 | unsigned int ivsize; |
324 | unsigned int reqsize; | 331 | unsigned int reqsize; |
325 | }; | 332 | }; |