Merge tag 'f2fs-for-v5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeu...
[sfrench/cifs-2.6.git] / include / crypto / morus640_glue.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * The MORUS-640 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
10 #ifndef _CRYPTO_MORUS640_GLUE_H
11 #define _CRYPTO_MORUS640_GLUE_H
12
13 #include <linux/module.h>
14 #include <linux/types.h>
15 #include <crypto/algapi.h>
16 #include <crypto/aead.h>
17 #include <crypto/morus_common.h>
18
19 #define MORUS640_WORD_SIZE 4
20 #define MORUS640_BLOCK_SIZE (MORUS_BLOCK_WORDS * MORUS640_WORD_SIZE)
21
22 struct morus640_block {
23         u8 bytes[MORUS640_BLOCK_SIZE];
24 };
25
26 struct morus640_glue_ops {
27         void (*init)(void *state, const void *key, const void *iv);
28         void (*ad)(void *state, const void *data, unsigned int length);
29         void (*enc)(void *state, const void *src, void *dst, unsigned int length);
30         void (*dec)(void *state, const void *src, void *dst, unsigned int length);
31         void (*enc_tail)(void *state, const void *src, void *dst, unsigned int length);
32         void (*dec_tail)(void *state, const void *src, void *dst, unsigned int length);
33         void (*final)(void *state, void *tag_xor, u64 assoclen, u64 cryptlen);
34 };
35
36 struct morus640_ctx {
37         const struct morus640_glue_ops *ops;
38         struct morus640_block key;
39 };
40
41 void crypto_morus640_glue_init_ops(struct crypto_aead *aead,
42                                    const struct morus640_glue_ops *ops);
43 int crypto_morus640_glue_setkey(struct crypto_aead *aead, const u8 *key,
44                                 unsigned int keylen);
45 int crypto_morus640_glue_setauthsize(struct crypto_aead *tfm,
46                                      unsigned int authsize);
47 int crypto_morus640_glue_encrypt(struct aead_request *req);
48 int crypto_morus640_glue_decrypt(struct aead_request *req);
49
50 #define MORUS640_DECLARE_ALG(id, driver_name, priority) \
51         static const struct morus640_glue_ops crypto_morus640_##id##_ops = {\
52                 .init = crypto_morus640_##id##_init, \
53                 .ad = crypto_morus640_##id##_ad, \
54                 .enc = crypto_morus640_##id##_enc, \
55                 .enc_tail = crypto_morus640_##id##_enc_tail, \
56                 .dec = crypto_morus640_##id##_dec, \
57                 .dec_tail = crypto_morus640_##id##_dec_tail, \
58                 .final = crypto_morus640_##id##_final, \
59         }; \
60         \
61         static int crypto_morus640_##id##_init_tfm(struct crypto_aead *tfm) \
62         { \
63                 crypto_morus640_glue_init_ops(tfm, &crypto_morus640_##id##_ops); \
64                 return 0; \
65         } \
66         \
67         static void crypto_morus640_##id##_exit_tfm(struct crypto_aead *tfm) \
68         { \
69         } \
70         \
71         static struct aead_alg crypto_morus640_##id##_alg = {\
72                 .setkey = crypto_morus640_glue_setkey, \
73                 .setauthsize = crypto_morus640_glue_setauthsize, \
74                 .encrypt = crypto_morus640_glue_encrypt, \
75                 .decrypt = crypto_morus640_glue_decrypt, \
76                 .init = crypto_morus640_##id##_init_tfm, \
77                 .exit = crypto_morus640_##id##_exit_tfm, \
78                 \
79                 .ivsize = MORUS_NONCE_SIZE, \
80                 .maxauthsize = MORUS_MAX_AUTH_SIZE, \
81                 .chunksize = MORUS640_BLOCK_SIZE, \
82                 \
83                 .base = { \
84                         .cra_flags = CRYPTO_ALG_INTERNAL, \
85                         .cra_blocksize = 1, \
86                         .cra_ctxsize = sizeof(struct morus640_ctx), \
87                         .cra_alignmask = 0, \
88                         .cra_priority = priority, \
89                         \
90                         .cra_name = "__morus640", \
91                         .cra_driver_name = "__"driver_name, \
92                         \
93                         .cra_module = THIS_MODULE, \
94                 } \
95         }
96
97 #endif /* _CRYPTO_MORUS640_GLUE_H */