162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * CAAM/SEC 4.x definitions for handling key-generation jobs
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2008-2011 Freescale Semiconductor, Inc.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/**
1062306a36Sopenharmony_ci * split_key_len - Compute MDHA split key length for a given algorithm
1162306a36Sopenharmony_ci * @hash: Hashing algorithm selection, one of OP_ALG_ALGSEL_* - MD5, SHA1,
1262306a36Sopenharmony_ci *        SHA224, SHA384, SHA512.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * Return: MDHA split key length
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_cistatic inline u32 split_key_len(u32 hash)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	/* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */
1962306a36Sopenharmony_ci	static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
2062306a36Sopenharmony_ci	u32 idx;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	idx = (hash & OP_ALG_ALGSEL_SUBMASK) >> OP_ALG_ALGSEL_SHIFT;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	return (u32)(mdpadlen[idx] * 2);
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/**
2862306a36Sopenharmony_ci * split_key_pad_len - Compute MDHA split key pad length for a given algorithm
2962306a36Sopenharmony_ci * @hash: Hashing algorithm selection, one of OP_ALG_ALGSEL_* - MD5, SHA1,
3062306a36Sopenharmony_ci *        SHA224, SHA384, SHA512.
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci * Return: MDHA split key pad length
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_cistatic inline u32 split_key_pad_len(u32 hash)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	return ALIGN(split_key_len(hash), 16);
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct split_key_result {
4062306a36Sopenharmony_ci	struct completion completion;
4162306a36Sopenharmony_ci	int err;
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_civoid split_key_done(struct device *dev, u32 *desc, u32 err, void *context);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciint gen_split_key(struct device *jrdev, u8 *key_out,
4762306a36Sopenharmony_ci		  struct alginfo * const adata, const u8 *key_in, u32 keylen,
4862306a36Sopenharmony_ci		  int max_keylen);
49