xref: /openbmc/linux/include/soc/fsl/caam-blob.h (revision 007c3ff1)
1*007c3ff1SAhmad Fatoum /* SPDX-License-Identifier: GPL-2.0-only */
2*007c3ff1SAhmad Fatoum /*
3*007c3ff1SAhmad Fatoum  * Copyright (C) 2020 Pengutronix, Ahmad Fatoum <kernel@pengutronix.de>
4*007c3ff1SAhmad Fatoum  */
5*007c3ff1SAhmad Fatoum 
6*007c3ff1SAhmad Fatoum #ifndef __CAAM_BLOB_GEN
7*007c3ff1SAhmad Fatoum #define __CAAM_BLOB_GEN
8*007c3ff1SAhmad Fatoum 
9*007c3ff1SAhmad Fatoum #include <linux/types.h>
10*007c3ff1SAhmad Fatoum #include <linux/errno.h>
11*007c3ff1SAhmad Fatoum 
12*007c3ff1SAhmad Fatoum #define CAAM_BLOB_KEYMOD_LENGTH		16
13*007c3ff1SAhmad Fatoum #define CAAM_BLOB_OVERHEAD		(32 + 16)
14*007c3ff1SAhmad Fatoum #define CAAM_BLOB_MAX_LEN		4096
15*007c3ff1SAhmad Fatoum 
16*007c3ff1SAhmad Fatoum struct caam_blob_priv;
17*007c3ff1SAhmad Fatoum 
18*007c3ff1SAhmad Fatoum /**
19*007c3ff1SAhmad Fatoum  * struct caam_blob_info - information for CAAM blobbing
20*007c3ff1SAhmad Fatoum  * @input:       pointer to input buffer (must be DMAable)
21*007c3ff1SAhmad Fatoum  * @input_len:   length of @input buffer in bytes.
22*007c3ff1SAhmad Fatoum  * @output:      pointer to output buffer (must be DMAable)
23*007c3ff1SAhmad Fatoum  * @output_len:  length of @output buffer in bytes.
24*007c3ff1SAhmad Fatoum  * @key_mod:     key modifier
25*007c3ff1SAhmad Fatoum  * @key_mod_len: length of @key_mod in bytes.
26*007c3ff1SAhmad Fatoum  *	         May not exceed %CAAM_BLOB_KEYMOD_LENGTH
27*007c3ff1SAhmad Fatoum  */
28*007c3ff1SAhmad Fatoum struct caam_blob_info {
29*007c3ff1SAhmad Fatoum 	void *input;
30*007c3ff1SAhmad Fatoum 	size_t input_len;
31*007c3ff1SAhmad Fatoum 
32*007c3ff1SAhmad Fatoum 	void *output;
33*007c3ff1SAhmad Fatoum 	size_t output_len;
34*007c3ff1SAhmad Fatoum 
35*007c3ff1SAhmad Fatoum 	const void *key_mod;
36*007c3ff1SAhmad Fatoum 	size_t key_mod_len;
37*007c3ff1SAhmad Fatoum };
38*007c3ff1SAhmad Fatoum 
39*007c3ff1SAhmad Fatoum /**
40*007c3ff1SAhmad Fatoum  * caam_blob_gen_init - initialize blob generation
41*007c3ff1SAhmad Fatoum  * Return: pointer to new &struct caam_blob_priv instance on success
42*007c3ff1SAhmad Fatoum  * and ``ERR_PTR(-ENODEV)`` if CAAM has no hardware blobbing support
43*007c3ff1SAhmad Fatoum  * or no job ring could be allocated.
44*007c3ff1SAhmad Fatoum  */
45*007c3ff1SAhmad Fatoum struct caam_blob_priv *caam_blob_gen_init(void);
46*007c3ff1SAhmad Fatoum 
47*007c3ff1SAhmad Fatoum /**
48*007c3ff1SAhmad Fatoum  * caam_blob_gen_exit - free blob generation resources
49*007c3ff1SAhmad Fatoum  * @priv: instance returned by caam_blob_gen_init()
50*007c3ff1SAhmad Fatoum  */
51*007c3ff1SAhmad Fatoum void caam_blob_gen_exit(struct caam_blob_priv *priv);
52*007c3ff1SAhmad Fatoum 
53*007c3ff1SAhmad Fatoum /**
54*007c3ff1SAhmad Fatoum  * caam_process_blob - encapsulate or decapsulate blob
55*007c3ff1SAhmad Fatoum  * @priv:   instance returned by caam_blob_gen_init()
56*007c3ff1SAhmad Fatoum  * @info:   pointer to blobbing info describing key, blob and
57*007c3ff1SAhmad Fatoum  *          key modifier buffers.
58*007c3ff1SAhmad Fatoum  * @encap:  true for encapsulation, false for decapsulation
59*007c3ff1SAhmad Fatoum  *
60*007c3ff1SAhmad Fatoum  * Return: %0 and sets ``info->output_len`` on success and a negative
61*007c3ff1SAhmad Fatoum  * error code otherwise.
62*007c3ff1SAhmad Fatoum  */
63*007c3ff1SAhmad Fatoum int caam_process_blob(struct caam_blob_priv *priv,
64*007c3ff1SAhmad Fatoum 		      struct caam_blob_info *info, bool encap);
65*007c3ff1SAhmad Fatoum 
66*007c3ff1SAhmad Fatoum /**
67*007c3ff1SAhmad Fatoum  * caam_encap_blob - encapsulate blob
68*007c3ff1SAhmad Fatoum  * @priv:   instance returned by caam_blob_gen_init()
69*007c3ff1SAhmad Fatoum  * @info:   pointer to blobbing info describing input key,
70*007c3ff1SAhmad Fatoum  *          output blob and key modifier buffers.
71*007c3ff1SAhmad Fatoum  *
72*007c3ff1SAhmad Fatoum  * Return: %0 and sets ``info->output_len`` on success and
73*007c3ff1SAhmad Fatoum  * a negative error code otherwise.
74*007c3ff1SAhmad Fatoum  */
caam_encap_blob(struct caam_blob_priv * priv,struct caam_blob_info * info)75*007c3ff1SAhmad Fatoum static inline int caam_encap_blob(struct caam_blob_priv *priv,
76*007c3ff1SAhmad Fatoum 				  struct caam_blob_info *info)
77*007c3ff1SAhmad Fatoum {
78*007c3ff1SAhmad Fatoum 	if (info->output_len < info->input_len + CAAM_BLOB_OVERHEAD)
79*007c3ff1SAhmad Fatoum 		return -EINVAL;
80*007c3ff1SAhmad Fatoum 
81*007c3ff1SAhmad Fatoum 	return caam_process_blob(priv, info, true);
82*007c3ff1SAhmad Fatoum }
83*007c3ff1SAhmad Fatoum 
84*007c3ff1SAhmad Fatoum /**
85*007c3ff1SAhmad Fatoum  * caam_decap_blob - decapsulate blob
86*007c3ff1SAhmad Fatoum  * @priv:   instance returned by caam_blob_gen_init()
87*007c3ff1SAhmad Fatoum  * @info:   pointer to blobbing info describing output key,
88*007c3ff1SAhmad Fatoum  *          input blob and key modifier buffers.
89*007c3ff1SAhmad Fatoum  *
90*007c3ff1SAhmad Fatoum  * Return: %0 and sets ``info->output_len`` on success and
91*007c3ff1SAhmad Fatoum  * a negative error code otherwise.
92*007c3ff1SAhmad Fatoum  */
caam_decap_blob(struct caam_blob_priv * priv,struct caam_blob_info * info)93*007c3ff1SAhmad Fatoum static inline int caam_decap_blob(struct caam_blob_priv *priv,
94*007c3ff1SAhmad Fatoum 				  struct caam_blob_info *info)
95*007c3ff1SAhmad Fatoum {
96*007c3ff1SAhmad Fatoum 	if (info->input_len < CAAM_BLOB_OVERHEAD ||
97*007c3ff1SAhmad Fatoum 	    info->output_len < info->input_len - CAAM_BLOB_OVERHEAD)
98*007c3ff1SAhmad Fatoum 		return -EINVAL;
99*007c3ff1SAhmad Fatoum 
100*007c3ff1SAhmad Fatoum 	return caam_process_blob(priv, info, false);
101*007c3ff1SAhmad Fatoum }
102*007c3ff1SAhmad Fatoum 
103*007c3ff1SAhmad Fatoum #endif
104