Merge branch 'for-4.20' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[sfrench/cifs-2.6.git] / include / crypto / morus1280_glue.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * The MORUS-1280 Authenticated-Encryption Algorithm
4  *   Common glue skeleton -- header file
5  *
6  * Copyright (c) 2016-2018 Ondrej Mosnacek <omosnacek@gmail.com>
7  * Copyright (C) 2017-2018 Red Hat, Inc. All rights reserved.
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License as published by the Free
11  * Software Foundation; either version 2 of the License, or (at your option)
12  * any later version.
13  */
14
15 #ifndef _CRYPTO_MORUS1280_GLUE_H
16 #define _CRYPTO_MORUS1280_GLUE_H
17
18 #include <linux/module.h>
19 #include <linux/types.h>
20 #include <crypto/algapi.h>
21 #include <crypto/aead.h>
22 #include <crypto/morus_common.h>
23
24 #define MORUS1280_WORD_SIZE 8
25 #define MORUS1280_BLOCK_SIZE (MORUS_BLOCK_WORDS * MORUS1280_WORD_SIZE)
26
27 struct morus1280_block {
28         u8 bytes[MORUS1280_BLOCK_SIZE];
29 };
30
31 struct morus1280_glue_ops {
32         void (*init)(void *state, const void *key, const void *iv);
33         void (*ad)(void *state, const void *data, unsigned int length);
34         void (*enc)(void *state, const void *src, void *dst, unsigned int length);
35         void (*dec)(void *state, const void *src, void *dst, unsigned int length);
36         void (*enc_tail)(void *state, const void *src, void *dst, unsigned int length);
37         void (*dec_tail)(void *state, const void *src, void *dst, unsigned int length);
38         void (*final)(void *state, void *tag_xor, u64 assoclen, u64 cryptlen);
39 };
40
41 struct morus1280_ctx {
42         const struct morus1280_glue_ops *ops;
43         struct morus1280_block key;
44 };
45
46 void crypto_morus1280_glue_init_ops(struct crypto_aead *aead,
47                                     const struct morus1280_glue_ops *ops);
48 int crypto_morus1280_glue_setkey(struct crypto_aead *aead, const u8 *key,
49                                  unsigned int keylen);
50 int crypto_morus1280_glue_setauthsize(struct crypto_aead *tfm,
51                                       unsigned int authsize);
52 int crypto_morus1280_glue_encrypt(struct aead_request *req);
53 int crypto_morus1280_glue_decrypt(struct aead_request *req);
54
55 int cryptd_morus1280_glue_setkey(struct crypto_aead *aead, const u8 *key,
56                                  unsigned int keylen);
57 int cryptd_morus1280_glue_setauthsize(struct crypto_aead *aead,
58                                       unsigned int authsize);
59 int cryptd_morus1280_glue_encrypt(struct aead_request *req);
60 int cryptd_morus1280_glue_decrypt(struct aead_request *req);
61 int cryptd_morus1280_glue_init_tfm(struct crypto_aead *aead);
62 void cryptd_morus1280_glue_exit_tfm(struct crypto_aead *aead);
63
64 #define MORUS1280_DECLARE_ALGS(id, driver_name, priority) \
65         static const struct morus1280_glue_ops crypto_morus1280_##id##_ops = {\
66                 .init = crypto_morus1280_##id##_init, \
67                 .ad = crypto_morus1280_##id##_ad, \
68                 .enc = crypto_morus1280_##id##_enc, \
69                 .enc_tail = crypto_morus1280_##id##_enc_tail, \
70                 .dec = crypto_morus1280_##id##_dec, \
71                 .dec_tail = crypto_morus1280_##id##_dec_tail, \
72                 .final = crypto_morus1280_##id##_final, \
73         }; \
74         \
75         static int crypto_morus1280_##id##_init_tfm(struct crypto_aead *tfm) \
76         { \
77                 crypto_morus1280_glue_init_ops(tfm, &crypto_morus1280_##id##_ops); \
78                 return 0; \
79         } \
80         \
81         static void crypto_morus1280_##id##_exit_tfm(struct crypto_aead *tfm) \
82         { \
83         } \
84         \
85         static struct aead_alg crypto_morus1280_##id##_algs[] = {\
86                 { \
87                         .setkey = crypto_morus1280_glue_setkey, \
88                         .setauthsize = crypto_morus1280_glue_setauthsize, \
89                         .encrypt = crypto_morus1280_glue_encrypt, \
90                         .decrypt = crypto_morus1280_glue_decrypt, \
91                         .init = crypto_morus1280_##id##_init_tfm, \
92                         .exit = crypto_morus1280_##id##_exit_tfm, \
93                         \
94                         .ivsize = MORUS_NONCE_SIZE, \
95                         .maxauthsize = MORUS_MAX_AUTH_SIZE, \
96                         .chunksize = MORUS1280_BLOCK_SIZE, \
97                         \
98                         .base = { \
99                                 .cra_flags = CRYPTO_ALG_INTERNAL, \
100                                 .cra_blocksize = 1, \
101                                 .cra_ctxsize = sizeof(struct morus1280_ctx), \
102                                 .cra_alignmask = 0, \
103                                 \
104                                 .cra_name = "__morus1280", \
105                                 .cra_driver_name = "__"driver_name, \
106                                 \
107                                 .cra_module = THIS_MODULE, \
108                         } \
109                 }, { \
110                         .setkey = cryptd_morus1280_glue_setkey, \
111                         .setauthsize = cryptd_morus1280_glue_setauthsize, \
112                         .encrypt = cryptd_morus1280_glue_encrypt, \
113                         .decrypt = cryptd_morus1280_glue_decrypt, \
114                         .init = cryptd_morus1280_glue_init_tfm, \
115                         .exit = cryptd_morus1280_glue_exit_tfm, \
116                         \
117                         .ivsize = MORUS_NONCE_SIZE, \
118                         .maxauthsize = MORUS_MAX_AUTH_SIZE, \
119                         .chunksize = MORUS1280_BLOCK_SIZE, \
120                         \
121                         .base = { \
122                                 .cra_flags = CRYPTO_ALG_ASYNC, \
123                                 .cra_blocksize = 1, \
124                                 .cra_ctxsize = sizeof(struct crypto_aead *), \
125                                 .cra_alignmask = 0, \
126                                 \
127                                 .cra_priority = priority, \
128                                 \
129                                 .cra_name = "morus1280", \
130                                 .cra_driver_name = driver_name, \
131                                 \
132                                 .cra_module = THIS_MODULE, \
133                         } \
134                 } \
135         }
136
137 #endif /* _CRYPTO_MORUS1280_GLUE_H */