104 lines
2.9 KiB
C
104 lines
2.9 KiB
C
|
/* 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
|