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 16 struct 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 */ 28 struct 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 */ 45 struct 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 */ 51 void 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 */ 63 int 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 */ 75 static 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 */ 93 static 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 104