|  | /* SPDX-License-Identifier: GPL-2.0-only */ | 
|  | /* | 
|  | * Copyright (C) 2020 Pengutronix, Ahmad Fatoum <kernel@pengutronix.de> | 
|  | */ | 
|  |  | 
|  | #ifndef __CAAM_BLOB_GEN | 
|  | #define __CAAM_BLOB_GEN | 
|  |  | 
|  | #include <linux/types.h> | 
|  | #include <linux/errno.h> | 
|  |  | 
|  | #define CAAM_BLOB_KEYMOD_LENGTH		16 | 
|  | #define CAAM_BLOB_OVERHEAD		(32 + 16) | 
|  | #define CAAM_BLOB_MAX_LEN		4096 | 
|  |  | 
|  | struct caam_blob_priv; | 
|  |  | 
|  | /** | 
|  | * struct caam_blob_info - information for CAAM blobbing | 
|  | * @input:       pointer to input buffer (must be DMAable) | 
|  | * @input_len:   length of @input buffer in bytes. | 
|  | * @output:      pointer to output buffer (must be DMAable) | 
|  | * @output_len:  length of @output buffer in bytes. | 
|  | * @key_mod:     key modifier | 
|  | * @key_mod_len: length of @key_mod in bytes. | 
|  | *	         May not exceed %CAAM_BLOB_KEYMOD_LENGTH | 
|  | */ | 
|  | struct caam_blob_info { | 
|  | void *input; | 
|  | size_t input_len; | 
|  |  | 
|  | void *output; | 
|  | size_t output_len; | 
|  |  | 
|  | const void *key_mod; | 
|  | size_t key_mod_len; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * caam_blob_gen_init - initialize blob generation | 
|  | * Return: pointer to new &struct caam_blob_priv instance on success | 
|  | * and ``ERR_PTR(-ENODEV)`` if CAAM has no hardware blobbing support | 
|  | * or no job ring could be allocated. | 
|  | */ | 
|  | struct caam_blob_priv *caam_blob_gen_init(void); | 
|  |  | 
|  | /** | 
|  | * caam_blob_gen_exit - free blob generation resources | 
|  | * @priv: instance returned by caam_blob_gen_init() | 
|  | */ | 
|  | void caam_blob_gen_exit(struct caam_blob_priv *priv); | 
|  |  | 
|  | /** | 
|  | * caam_process_blob - encapsulate or decapsulate blob | 
|  | * @priv:   instance returned by caam_blob_gen_init() | 
|  | * @info:   pointer to blobbing info describing key, blob and | 
|  | *          key modifier buffers. | 
|  | * @encap:  true for encapsulation, false for decapsulation | 
|  | * | 
|  | * Return: %0 and sets ``info->output_len`` on success and a negative | 
|  | * error code otherwise. | 
|  | */ | 
|  | int caam_process_blob(struct caam_blob_priv *priv, | 
|  | struct caam_blob_info *info, bool encap); | 
|  |  | 
|  | /** | 
|  | * caam_encap_blob - encapsulate blob | 
|  | * @priv:   instance returned by caam_blob_gen_init() | 
|  | * @info:   pointer to blobbing info describing input key, | 
|  | *          output blob and key modifier buffers. | 
|  | * | 
|  | * Return: %0 and sets ``info->output_len`` on success and | 
|  | * a negative error code otherwise. | 
|  | */ | 
|  | static inline int caam_encap_blob(struct caam_blob_priv *priv, | 
|  | struct caam_blob_info *info) | 
|  | { | 
|  | if (info->output_len < info->input_len + CAAM_BLOB_OVERHEAD) | 
|  | return -EINVAL; | 
|  |  | 
|  | return caam_process_blob(priv, info, true); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * caam_decap_blob - decapsulate blob | 
|  | * @priv:   instance returned by caam_blob_gen_init() | 
|  | * @info:   pointer to blobbing info describing output key, | 
|  | *          input blob and key modifier buffers. | 
|  | * | 
|  | * Return: %0 and sets ``info->output_len`` on success and | 
|  | * a negative error code otherwise. | 
|  | */ | 
|  | static inline int caam_decap_blob(struct caam_blob_priv *priv, | 
|  | struct caam_blob_info *info) | 
|  | { | 
|  | if (info->input_len < CAAM_BLOB_OVERHEAD || | 
|  | info->output_len < info->input_len - CAAM_BLOB_OVERHEAD) | 
|  | return -EINVAL; | 
|  |  | 
|  | return caam_process_blob(priv, info, false); | 
|  | } | 
|  |  | 
|  | #endif |