summaryrefslogtreecommitdiff
path: root/drivers/crypto/caam/caamkeyblob_desc.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/crypto/caam/caamkeyblob_desc.h')
-rw-r--r--drivers/crypto/caam/caamkeyblob_desc.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/drivers/crypto/caam/caamkeyblob_desc.h b/drivers/crypto/caam/caamkeyblob_desc.h
new file mode 100644
index 000000000000..0affbb184ee4
--- /dev/null
+++ b/drivers/crypto/caam/caamkeyblob_desc.h
@@ -0,0 +1,101 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
+/*
+ * Shared descriptors for CAAM black key and blob
+ *
+ * Copyright 2018-2020 NXP
+ */
+
+#ifndef _CAAMKEYBLOB_DESC_H_
+#define _CAAMKEYBLOB_DESC_H_
+
+#include <linux/types.h>
+
+#include "jr.h"
+#include "regs.h"
+#include "desc.h"
+
+#include "compat.h"
+#include "tag_object.h"
+#include "desc_constr.h"
+
+/* Defines for secure memory and general memory blobs */
+#define DATA_GENMEM 0
+#define DATA_SECMEM 1
+
+/* Encrypted key */
+#define BLACK_KEY 1
+
+/* Define key encryption/covering options */
+#define KEY_COVER_ECB 0 /* cover key in AES-ECB */
+#define KEY_COVER_CCM 1 /* cover key with AES-CCM */
+
+/* Define the trust in the key, to select either JDKEK or TDKEK */
+#define UNTRUSTED_KEY 0
+#define TRUSTED_KEY 1
+
+/* Define space required for BKEK + MAC tag storage in any blob */
+#define BLOB_OVERHEAD (32 + 16)
+
+#define PAD_16_BYTE(_key_size) (roundup(_key_size, 16))
+#define PAD_8_BYTE(_key_size) (roundup(_key_size, 8))
+
+/*
+ * ECB-Black Key will be padded with zeros to make it a
+ * multiple of 16 bytes long before it is encrypted,
+ * and the resulting Black Key will be this length.
+ */
+#define ECB_BLACK_KEY_SIZE(_key_size) (PAD_16_BYTE(_key_size))
+
+/*
+ * CCM-Black Key will always be at least 12 bytes longer,
+ * since the encapsulation uses a 6-byte nonce and adds
+ * a 6-byte ICV. But first, the key is padded as necessary so
+ * that CCM-Black Key is a multiple of 8 bytes long.
+ */
+#define NONCE_SIZE 6
+#define ICV_SIZE 6
+#define CCM_OVERHEAD (NONCE_SIZE + ICV_SIZE)
+#define CCM_BLACK_KEY_SIZE(_key_size) (PAD_8_BYTE(_key_size) \
+ + CCM_OVERHEAD)
+
+static inline int secret_size_in_ccm_black_key(int key_size)
+{
+ return ((key_size >= CCM_OVERHEAD) ? key_size - CCM_OVERHEAD : 0);
+}
+
+#define SECRET_SIZE_IN_CCM_BLACK_KEY(_key_size) \
+ secret_size_in_ccm_black_key(_key_size)
+
+/* A red key is not encrypted so its size is the same */
+#define RED_KEY_SIZE(_key_size) (_key_size)
+
+/*
+ * Based on memory type, the key modifier length
+ * can be either 8-byte or 16-byte.
+ */
+#define KEYMOD_SIZE_SM 8
+#define KEYMOD_SIZE_GM 16
+
+/* Create job descriptor to cover key */
+int cnstr_desc_black_key(u32 **desc, char *key, size_t key_len,
+ dma_addr_t black_key, size_t black_key_len,
+ u8 key_enc, u8 trusted_key);
+
+/* Create job descriptor to generate a random key and cover it */
+int cnstr_desc_random_black_key(u32 **desc, size_t key_len,
+ dma_addr_t black_key, size_t black_key_len,
+ u8 key_enc, u8 trusted_key);
+
+/* Encapsulate data in a blob */
+int cnstr_desc_blob_encap(u32 **desc, dma_addr_t black_key,
+ size_t black_key_len, u8 color, u8 key_enc,
+ u8 trusted_key, u8 mem_type, const void *key_mod,
+ size_t key_mod_len, dma_addr_t blob, size_t blob_len);
+
+/* Decapsulate data from a blob */
+int cnstr_desc_blob_decap(u32 **desc, dma_addr_t blob, size_t blob_len,
+ const void *key_mod, size_t key_mod_len,
+ dma_addr_t black_key, size_t black_key_len,
+ u8 keycolor, u8 key_enc, u8 trusted_key, u8 mem_type);
+
+#endif /* _CAAMKEYBLOB_DESC_H_ */