cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

caam-blob.h (2964B)


      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_GEN
      7#define __CAAM_BLOB_GEN
      8
      9#include <linux/types.h>
     10#include <linux/errno.h>
     11
     12#define CAAM_BLOB_KEYMOD_LENGTH		16
     13#define CAAM_BLOB_OVERHEAD		(32 + 16)
     14#define CAAM_BLOB_MAX_LEN		4096
     15
     16struct caam_blob_priv;
     17
     18/**
     19 * struct caam_blob_info - information for CAAM blobbing
     20 * @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 modifier
     25 * @key_mod_len: length of @key_mod in bytes.
     26 *	         May not exceed %CAAM_BLOB_KEYMOD_LENGTH
     27 */
     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 generation
     41 * Return: pointer to new &struct caam_blob_priv instance on success
     42 * and ``ERR_PTR(-ENODEV)`` if CAAM has no hardware blobbing support
     43 * 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 resources
     49 * @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 blob
     55 * @priv:   instance returned by caam_blob_gen_init()
     56 * @info:   pointer to blobbing info describing key, blob and
     57 *          key modifier buffers.
     58 * @encap:  true for encapsulation, false for decapsulation
     59 *
     60 * Return: %0 and sets ``info->output_len`` on success and a negative
     61 * 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 blob
     68 * @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 and
     73 * 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 blob
     86 * @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 and
     91 * 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#endif