Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/soc/fsl/caam-blob.h
26288 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* Copyright (C) 2020 Pengutronix, Ahmad Fatoum <[email protected]>
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
105