brintos

brintos / linux-shallow public Read only

0
0
Text · 2.9 KiB · 937cac5 Raw
104 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2020 Pengutronix, Ahmad Fatoum <kernel@pengutronix.de>4 */5 6#ifndef __CAAM_BLOB_GEN7#define __CAAM_BLOB_GEN8 9#include <linux/types.h>10#include <linux/errno.h>11 12#define CAAM_BLOB_KEYMOD_LENGTH		1613#define CAAM_BLOB_OVERHEAD		(32 + 16)14#define CAAM_BLOB_MAX_LEN		409615 16struct caam_blob_priv;17 18/**19 * struct caam_blob_info - information for CAAM blobbing20 * @input:       pointer to input buffer (must be DMAable)21 * @input_len:   length of @input buffer in bytes.22 * @output:      pointer to output buffer (must be DMAable)23 * @output_len:  length of @output buffer in bytes.24 * @key_mod:     key modifier25 * @key_mod_len: length of @key_mod in bytes.26 *	         May not exceed %CAAM_BLOB_KEYMOD_LENGTH27 */28struct caam_blob_info {29	void *input;30	size_t input_len;31 32	void *output;33	size_t output_len;34 35	const void *key_mod;36	size_t key_mod_len;37};38 39/**40 * caam_blob_gen_init - initialize blob generation41 * Return: pointer to new &struct caam_blob_priv instance on success42 * and ``ERR_PTR(-ENODEV)`` if CAAM has no hardware blobbing support43 * or no job ring could be allocated.44 */45struct caam_blob_priv *caam_blob_gen_init(void);46 47/**48 * caam_blob_gen_exit - free blob generation resources49 * @priv: instance returned by caam_blob_gen_init()50 */51void caam_blob_gen_exit(struct caam_blob_priv *priv);52 53/**54 * caam_process_blob - encapsulate or decapsulate blob55 * @priv:   instance returned by caam_blob_gen_init()56 * @info:   pointer to blobbing info describing key, blob and57 *          key modifier buffers.58 * @encap:  true for encapsulation, false for decapsulation59 *60 * Return: %0 and sets ``info->output_len`` on success and a negative61 * error code otherwise.62 */63int caam_process_blob(struct caam_blob_priv *priv,64		      struct caam_blob_info *info, bool encap);65 66/**67 * caam_encap_blob - encapsulate blob68 * @priv:   instance returned by caam_blob_gen_init()69 * @info:   pointer to blobbing info describing input key,70 *          output blob and key modifier buffers.71 *72 * Return: %0 and sets ``info->output_len`` on success and73 * a negative error code otherwise.74 */75static inline int caam_encap_blob(struct caam_blob_priv *priv,76				  struct caam_blob_info *info)77{78	if (info->output_len < info->input_len + CAAM_BLOB_OVERHEAD)79		return -EINVAL;80 81	return caam_process_blob(priv, info, true);82}83 84/**85 * caam_decap_blob - decapsulate blob86 * @priv:   instance returned by caam_blob_gen_init()87 * @info:   pointer to blobbing info describing output key,88 *          input blob and key modifier buffers.89 *90 * Return: %0 and sets ``info->output_len`` on success and91 * a negative error code otherwise.92 */93static inline int caam_decap_blob(struct caam_blob_priv *priv,94				  struct caam_blob_info *info)95{96	if (info->input_len < CAAM_BLOB_OVERHEAD ||97	    info->output_len < info->input_len - CAAM_BLOB_OVERHEAD)98		return -EINVAL;99 100	return caam_process_blob(priv, info, false);101}102 103#endif104