summaryrefslogtreecommitdiffstats
path: root/include/crypto/morus640_glue.h
blob: 0ee6266cb26c364d18a2dfc5b033c8333508a285 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * The MORUS-640 Authenticated-Encryption Algorithm
 *   Common glue skeleton -- header file
 *
 * Copyright (c) 2016-2018 Ondrej Mosnacek <omosnacek@gmail.com>
 * Copyright (C) 2017-2018 Red Hat, Inc. All rights reserved.
 */

#ifndef _CRYPTO_MORUS640_GLUE_H
#define _CRYPTO_MORUS640_GLUE_H

#include <linux/module.h>
#include <linux/types.h>
#include <crypto/algapi.h>
#include <crypto/aead.h>
#include <crypto/morus_common.h>

#define MORUS640_WORD_SIZE 4
#define MORUS640_BLOCK_SIZE (MORUS_BLOCK_WORDS * MORUS640_WORD_SIZE)

struct morus640_block {
	u8 bytes[MORUS640_BLOCK_SIZE];
};

struct morus640_glue_ops {
	void (*init)(void *state, const void *key, const void *iv);
	void (*ad)(void *state, const void *data, unsigned int length);
	void (*enc)(void *state, const void *src, void *dst, unsigned int length);
	void (*dec)(void *state, const void *src, void *dst, unsigned int length);
	void (*enc_tail)(void *state, const void *src, void *dst, unsigned int length);
	void (*dec_tail)(void *state, const void *src, void *dst, unsigned int length);
	void (*final)(void *state, void *tag_xor, u64 assoclen, u64 cryptlen);
};

struct morus640_ctx {
	const struct morus640_glue_ops *ops;
	struct morus640_block key;
};

void crypto_morus640_glue_init_ops(struct crypto_aead *aead,
				   const struct morus640_glue_ops *ops);
int crypto_morus640_glue_setkey(struct crypto_aead *aead, const u8 *key,
				unsigned int keylen);
int crypto_morus640_glue_setauthsize(struct crypto_aead *tfm,
				     unsigned int authsize);
int crypto_morus640_glue_encrypt(struct aead_request *req);
int crypto_morus640_glue_decrypt(struct aead_request *req);

#define MORUS640_DECLARE_ALG(id, driver_name, priority) \
	static const struct morus640_glue_ops crypto_morus640_##id##_ops = {\
		.init = crypto_morus640_##id##_init, \
		.ad = crypto_morus640_##id##_ad, \
		.enc = crypto_morus640_##id##_enc, \
		.enc_tail = crypto_morus640_##id##_enc_tail, \
		.dec = crypto_morus640_##id##_dec, \
		.dec_tail = crypto_morus640_##id##_dec_tail, \
		.final = crypto_morus640_##id##_final, \
	}; \
	\
	static int crypto_morus640_##id##_init_tfm(struct crypto_aead *tfm) \
	{ \
		crypto_morus640_glue_init_ops(tfm, &crypto_morus640_##id##_ops); \
		return 0; \
	} \
	\
	static void crypto_morus640_##id##_exit_tfm(struct crypto_aead *tfm) \
	{ \
	} \
	\
	static struct aead_alg crypto_morus640_##id##_alg = {\
		.setkey = crypto_morus640_glue_setkey, \
		.setauthsize = crypto_morus640_glue_setauthsize, \
		.encrypt = crypto_morus640_glue_encrypt, \
		.decrypt = crypto_morus640_glue_decrypt, \
		.init = crypto_morus640_##id##_init_tfm, \
		.exit = crypto_morus640_##id##_exit_tfm, \
		\
		.ivsize = MORUS_NONCE_SIZE, \
		.maxauthsize = MORUS_MAX_AUTH_SIZE, \
		.chunksize = MORUS640_BLOCK_SIZE, \
		\
		.base = { \
			.cra_flags = CRYPTO_ALG_INTERNAL, \
			.cra_blocksize = 1, \
			.cra_ctxsize = sizeof(struct morus640_ctx), \
			.cra_alignmask = 0, \
			.cra_priority = priority, \
			\
			.cra_name = "__morus640", \
			.cra_driver_name = "__"driver_name, \
			\
			.cra_module = THIS_MODULE, \
		} \
	}

#endif /* _CRYPTO_MORUS640_GLUE_H */