2 * FPU: Wrapper for blkcipher touching fpu
4 * Copyright (c) Intel Corp.
5 * Author: Huang Ying <ying.huang@intel.com>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
14 #include <crypto/algapi.h>
15 #include <linux/err.h>
16 #include <linux/init.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
21 struct crypto_fpu_ctx
{
22 struct crypto_blkcipher
*child
;
25 static int crypto_fpu_setkey(struct crypto_tfm
*parent
, const u8
*key
,
28 struct crypto_fpu_ctx
*ctx
= crypto_tfm_ctx(parent
);
29 struct crypto_blkcipher
*child
= ctx
->child
;
32 crypto_blkcipher_clear_flags(child
, CRYPTO_TFM_REQ_MASK
);
33 crypto_blkcipher_set_flags(child
, crypto_tfm_get_flags(parent
) &
35 err
= crypto_blkcipher_setkey(child
, key
, keylen
);
36 crypto_tfm_set_flags(parent
, crypto_blkcipher_get_flags(child
) &
41 static int crypto_fpu_encrypt(struct blkcipher_desc
*desc_in
,
42 struct scatterlist
*dst
, struct scatterlist
*src
,
46 struct crypto_fpu_ctx
*ctx
= crypto_blkcipher_ctx(desc_in
->tfm
);
47 struct crypto_blkcipher
*child
= ctx
->child
;
48 struct blkcipher_desc desc
= {
50 .info
= desc_in
->info
,
51 .flags
= desc_in
->flags
& ~CRYPTO_TFM_REQ_MAY_SLEEP
,
55 err
= crypto_blkcipher_crt(desc
.tfm
)->encrypt(&desc
, dst
, src
, nbytes
);
60 static int crypto_fpu_decrypt(struct blkcipher_desc
*desc_in
,
61 struct scatterlist
*dst
, struct scatterlist
*src
,
65 struct crypto_fpu_ctx
*ctx
= crypto_blkcipher_ctx(desc_in
->tfm
);
66 struct crypto_blkcipher
*child
= ctx
->child
;
67 struct blkcipher_desc desc
= {
69 .info
= desc_in
->info
,
70 .flags
= desc_in
->flags
& ~CRYPTO_TFM_REQ_MAY_SLEEP
,
74 err
= crypto_blkcipher_crt(desc
.tfm
)->decrypt(&desc
, dst
, src
, nbytes
);
79 static int crypto_fpu_init_tfm(struct crypto_tfm
*tfm
)
81 struct crypto_instance
*inst
= crypto_tfm_alg_instance(tfm
);
82 struct crypto_spawn
*spawn
= crypto_instance_ctx(inst
);
83 struct crypto_fpu_ctx
*ctx
= crypto_tfm_ctx(tfm
);
84 struct crypto_blkcipher
*cipher
;
86 cipher
= crypto_spawn_blkcipher(spawn
);
88 return PTR_ERR(cipher
);
94 static void crypto_fpu_exit_tfm(struct crypto_tfm
*tfm
)
96 struct crypto_fpu_ctx
*ctx
= crypto_tfm_ctx(tfm
);
97 crypto_free_blkcipher(ctx
->child
);
100 static struct crypto_instance
*crypto_fpu_alloc(struct rtattr
**tb
)
102 struct crypto_instance
*inst
;
103 struct crypto_alg
*alg
;
106 err
= crypto_check_attr_type(tb
, CRYPTO_ALG_TYPE_BLKCIPHER
);
110 alg
= crypto_get_attr_alg(tb
, CRYPTO_ALG_TYPE_BLKCIPHER
,
111 CRYPTO_ALG_TYPE_MASK
);
113 return ERR_CAST(alg
);
115 inst
= crypto_alloc_instance("fpu", alg
);
119 inst
->alg
.cra_flags
= alg
->cra_flags
;
120 inst
->alg
.cra_priority
= alg
->cra_priority
;
121 inst
->alg
.cra_blocksize
= alg
->cra_blocksize
;
122 inst
->alg
.cra_alignmask
= alg
->cra_alignmask
;
123 inst
->alg
.cra_type
= alg
->cra_type
;
124 inst
->alg
.cra_blkcipher
.ivsize
= alg
->cra_blkcipher
.ivsize
;
125 inst
->alg
.cra_blkcipher
.min_keysize
= alg
->cra_blkcipher
.min_keysize
;
126 inst
->alg
.cra_blkcipher
.max_keysize
= alg
->cra_blkcipher
.max_keysize
;
127 inst
->alg
.cra_ctxsize
= sizeof(struct crypto_fpu_ctx
);
128 inst
->alg
.cra_init
= crypto_fpu_init_tfm
;
129 inst
->alg
.cra_exit
= crypto_fpu_exit_tfm
;
130 inst
->alg
.cra_blkcipher
.setkey
= crypto_fpu_setkey
;
131 inst
->alg
.cra_blkcipher
.encrypt
= crypto_fpu_encrypt
;
132 inst
->alg
.cra_blkcipher
.decrypt
= crypto_fpu_decrypt
;
139 static void crypto_fpu_free(struct crypto_instance
*inst
)
141 crypto_drop_spawn(crypto_instance_ctx(inst
));
145 static struct crypto_template crypto_fpu_tmpl
= {
147 .alloc
= crypto_fpu_alloc
,
148 .free
= crypto_fpu_free
,
149 .module
= THIS_MODULE
,
152 static int __init
crypto_fpu_module_init(void)
154 return crypto_register_template(&crypto_fpu_tmpl
);
157 static void __exit
crypto_fpu_module_exit(void)
159 crypto_unregister_template(&crypto_fpu_tmpl
);
162 module_init(crypto_fpu_module_init
);
163 module_exit(crypto_fpu_module_exit
);
165 MODULE_LICENSE("GPL");
166 MODULE_DESCRIPTION("FPU block cipher wrapper");