securekey_desc.h 3.75 KB
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright 2018 NXP
 *
 */
#ifndef _SECUREKEY_DESC_H_
#define _SECUREKEY_DESC_H_

#include "../../drivers/crypto/caam/compat.h"
#include "../../drivers/crypto/caam/regs.h"
#include "../../drivers/crypto/caam/intern.h"
#include "../../drivers/crypto/caam/desc.h"
#include "../../drivers/crypto/caam/desc_constr.h"
#include "../../drivers/crypto/caam/jr.h"
#include "../../drivers/crypto/caam/error.h"
#include "../../drivers/crypto/caam/pdb.h"

#define SK_BLOB_KEY_SZ		32	/* Blob key size. */
#define SK_BLOB_MAC_SZ		16	/* Blob MAC size. */

/*
 * brief defines different kinds of operations supported by this module.
 */
enum sk_req_type {
	sk_get_random,
	sk_red_blob_enc,
	sk_red_blob_dec,
};


/*
 * struct random_des
 * param[out] rnd_data output buffer for random data.
 */
struct random_desc {
	dma_addr_t rnd_data;
};

/* struct redblob_encap_desc
 * details Structure containing dma address for redblob encapsulation.
 * param[in] in_data input data to redblob encap descriptor.
 * param[out] redblob output buffer for redblob.
 */
struct redblob_encap_desc {
	dma_addr_t in_data;
	dma_addr_t redblob;
};

/* struct redblob_decap_desc
 * details Structure containing dma address for redblob decapsulation.
 * param[in] redblob input buffer to redblob decap descriptor.
 * param[out] out_data output data from redblob decap descriptor.
 */
struct redblob_decap_desc {
	dma_addr_t redblob;
	dma_addr_t out_data;
};

/* struct sk_desc
 * details Structure for securekey descriptor creation.
 * param[in] req_type operation supported.
 * param[in] dma_u union of struct for supported operation.
 */
struct sk_desc {
	u32 req_type;
	union {
		struct redblob_encap_desc redblob_encapdesc;
		struct redblob_decap_desc redblob_decapdesc;
		struct random_desc random_descp;
	} dma_u;
};

/* struct sk_fetch_rnd_data
 * decriptor structure containing key length.
 */
struct sk_fetch_rnd_data {
	void *data;
	size_t key_len;
};

/* struct sk_red_blob_encap
 * details Structure containing buffer pointers for redblob encapsulation.
 * param[in] data Input data.
 * param[in] data_sz size of Input data.
 * param[out] redblob output buffer for redblob.
 * param[in] redblob_sz size of redblob.
 */
struct sk_red_blob_encap {
	void *data;
	uint32_t data_sz;
	void *redblob;
	uint32_t redblob_sz;
};

/* struct sk_red_blob_decap
 * details Structure containing buffer pointers for redblob decapsulation.
 * param[in] redblob Input redblob.
 * param[in] redblob_sz size of redblob.
 * param[out] data output buffer for data.
 * param[in] data_sz size of output data.
 */
struct sk_red_blob_decap {
	void *redblob;
	uint32_t redblob_sz;
	void *data;
	uint32_t data_sz;
};

/* struct sk_req
 * details Structure for securekey request creation.
 * param[in] type operation supported.
 * param[in] req_u union of struct for supported operation.
 * param[out] ret return status of CAAM operation.
 * param[in] mem_pointer memory pointer for allocated kernel memory.
 * param[in] desc_pointer Pointer to securekey descriptor creation structure.
 * param[in] comp struct completion object.
 * param[in] hwdesc contains descriptor instructions.
 */
struct sk_req {
	enum sk_req_type type;
	void *arg;
	union {
		struct sk_red_blob_encap sk_red_blob_encap;
		struct sk_red_blob_decap sk_red_blob_decap;
		struct sk_fetch_rnd_data sk_fetch_rnd_data;
	} req_u;
	int ret;
	void *mem_pointer;
	void *desc_pointer;
	struct completion comp;
	u32 hwdesc[MAX_CAAM_DESCSIZE];
};

int caam_get_random(struct secure_key_payload *p,  enum sk_req_type fetch_rnd,
		    struct device *dev);
int key_blob(struct secure_key_payload *p, enum sk_req_type encap_type,
	     struct device *dev);
int key_deblob(struct secure_key_payload *p, enum sk_req_type decap_type,
	       struct device *dev);

#endif /*_SECUREKEY_DESC_H_*/