morus640_glue.h 4.5 KB
Newer Older
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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * 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.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 */

#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);

int cryptd_morus640_glue_setkey(struct crypto_aead *aead, const u8 *key,
				unsigned int keylen);
int cryptd_morus640_glue_setauthsize(struct crypto_aead *aead,
				     unsigned int authsize);
int cryptd_morus640_glue_encrypt(struct aead_request *req);
int cryptd_morus640_glue_decrypt(struct aead_request *req);
int cryptd_morus640_glue_init_tfm(struct crypto_aead *aead);
void cryptd_morus640_glue_exit_tfm(struct crypto_aead *aead);

#define MORUS640_DECLARE_ALGS(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) \
	{ \
	} \
	\
	struct aead_alg crypto_morus640_##id##_algs[] = {\
		{ \
			.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_name = "__morus640", \
				.cra_driver_name = "__"driver_name, \
				\
				.cra_module = THIS_MODULE, \
			} \
		}, { \
			.setkey = cryptd_morus640_glue_setkey, \
			.setauthsize = cryptd_morus640_glue_setauthsize, \
			.encrypt = cryptd_morus640_glue_encrypt, \
			.decrypt = cryptd_morus640_glue_decrypt, \
			.init = cryptd_morus640_glue_init_tfm, \
			.exit = cryptd_morus640_glue_exit_tfm, \
			\
			.ivsize = MORUS_NONCE_SIZE, \
			.maxauthsize = MORUS_MAX_AUTH_SIZE, \
			.chunksize = MORUS640_BLOCK_SIZE, \
			\
			.base = { \
				.cra_flags = CRYPTO_ALG_ASYNC, \
				.cra_blocksize = 1, \
				.cra_ctxsize = sizeof(struct crypto_aead *), \
				.cra_alignmask = 0, \
				\
				.cra_priority = priority, \
				\
				.cra_name = "morus640", \
				.cra_driver_name = driver_name, \
				\
				.cra_module = THIS_MODULE, \
			} \
		} \
	}

#endif /* _CRYPTO_MORUS640_GLUE_H */