tag_object.h 2.56 KB
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
 * Copyright 2018 NXP
 */

#ifndef _TAG_OBJECT_H_
#define _TAG_OBJECT_H_

#include <linux/types.h>

#define TAG_MIN_SIZE (2 * sizeof(struct conf_header))
#define TAG_OVERHEAD sizeof(struct tag_object_conf)

/**
 * enum tag_type - Type of data represented by the tag
 */
enum tag_type {
	/** @TAG_TYPE_NOT_SUPPORTED: The type is not supported */
	TAG_TYPE_NOT_SUPPORTED = 0,

	/* Type that passes is_tag_type_valid() */
	/** @TAG_TYPE_BLACK_KEY_ECB: Black key encrypted with ECB */
	TAG_TYPE_BLACK_KEY_ECB,
	/**
	 * @TAG_TYPE_BLACK_KEY_ECB_TRUSTED: ECB Black key created by trusted
	 * descriptor
	 */
	TAG_TYPE_BLACK_KEY_ECB_TRUSTED,
	/** @TAG_TYPE_BLACK_KEY_CCM: Black key encrypted with CCM */
	TAG_TYPE_BLACK_KEY_CCM,
	/**
	 * @TAG_TYPE_BLACK_KEY_CCM_TRUSTED: CCM Black key created by trusted
	 * descriptor
	 */
	TAG_TYPE_BLACK_KEY_CCM_TRUSTED,

	/** @NB_TAG_TYPE: Number of type of tag */
	NB_TAG_TYPE,
};

/**
 * struct conf_header - Common struture holding the type of data and the magic
 * number
 * @_magic_number : A magic number to identify the structure
 * @type : The type of data contained
 */
struct conf_header {
	u32 _magic_number;
	u32 type;
};

/**
 * struct blackey_conf - Configuration for a black key
 * @load : Load parameter for CAAM
 * @real_len : Length of the key before encryption
 */
struct blackey_conf {
	u32 load;
	u32 real_len;
};

/**
 * struct tag_object_conf - Common structure which is the tag applied to data
 * @header : Part of the data initialized with common function
 * :c:func:`init_tag_object_header`
 * @conf : Configuration data about the object tagged, initialized with
 * specific function
 */
struct tag_object_conf {
	struct conf_header header;
	union {
		struct blackey_conf bk_conf;
	} conf;
};

bool is_bk_conf(const struct tag_object_conf *tag_obj_conf);

bool is_valid_tag_object_conf(const struct tag_object_conf *tag_obj_conf);

void init_tag_object_header(struct conf_header *conf_header,
			    enum tag_type type);

int get_tag_object_conf(void *buffer, size_t buffer_size,
			struct tag_object_conf **tag_obj_conf);

int set_tag_object_conf(const struct tag_object_conf *tag_obj_conf,
			void *buffer, size_t obj_size, u32 *to_size);

size_t get_tag_object_overhead(void);

void get_blackey_conf(const struct blackey_conf *blackey_conf,
		      u32 *real_len, u32 *load_param);

void init_blackey_conf(struct blackey_conf *blackey_conf,
		       size_t len, bool ccm, bool tk);

int get_tagged_data(void *buffer, size_t buffer_size,
		    void **data, u32 *data_size);

#endif /* _TAG_OBJECT_H_ */