aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/ablkcipher.c46
-rw-r--r--include/crypto/internal/skcipher.h9
-rw-r--r--include/crypto/skcipher.h38
-rw-r--r--include/linux/crypto.h7
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};
108EXPORT_SYMBOL_GPL(crypto_ablkcipher_type); 108EXPORT_SYMBOL_GPL(crypto_ablkcipher_type);
109 109
110static int no_givdecrypt(struct skcipher_givcrypt_request *req)
111{
112 return -ENOSYS;
113}
114
115static 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
134static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg)
135 __attribute__ ((unused));
136static 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
147const 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};
154EXPORT_SYMBOL_GPL(crypto_givcipher_type);
155
110int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name, 156int 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
18struct crypto_skcipher_spawn { 19struct crypto_skcipher_spawn {
19 struct crypto_spawn base; 20 struct crypto_spawn base;
20}; 21};
21 22
23extern const struct crypto_type crypto_givcipher_type;
24
22static inline void crypto_set_skcipher_spawn( 25static 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
53static 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 */
24struct skcipher_givcrypt_request {
25 u64 seq;
26 u8 *giv;
27
28 struct ablkcipher_request creq;
29};
30
31static 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;
99struct crypto_hash; 100struct crypto_hash;
100struct crypto_tfm; 101struct crypto_tfm;
101struct crypto_type; 102struct crypto_type;
103struct skcipher_givcrypt_request;
102 104
103typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err); 105typedef 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};