101 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0-only */
 | 
						|
/*
 | 
						|
 * Copyright (C) 2010 IBM Corporation
 | 
						|
 * Author: David Safford <safford@us.ibm.com>
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _KEYS_TRUSTED_TYPE_H
 | 
						|
#define _KEYS_TRUSTED_TYPE_H
 | 
						|
 | 
						|
#include <linux/key.h>
 | 
						|
#include <linux/rcupdate.h>
 | 
						|
#include <linux/tpm.h>
 | 
						|
 | 
						|
#ifdef pr_fmt
 | 
						|
#undef pr_fmt
 | 
						|
#endif
 | 
						|
 | 
						|
#define pr_fmt(fmt) "trusted_key: " fmt
 | 
						|
 | 
						|
#define MIN_KEY_SIZE			32
 | 
						|
#define MAX_KEY_SIZE			128
 | 
						|
#define MAX_BLOB_SIZE			512
 | 
						|
#define MAX_PCRINFO_SIZE		64
 | 
						|
#define MAX_DIGEST_SIZE			64
 | 
						|
 | 
						|
struct trusted_key_payload {
 | 
						|
	struct rcu_head rcu;
 | 
						|
	unsigned int key_len;
 | 
						|
	unsigned int blob_len;
 | 
						|
	unsigned char migratable;
 | 
						|
	unsigned char old_format;
 | 
						|
	unsigned char key[MAX_KEY_SIZE + 1];
 | 
						|
	unsigned char blob[MAX_BLOB_SIZE];
 | 
						|
};
 | 
						|
 | 
						|
struct trusted_key_options {
 | 
						|
	uint16_t keytype;
 | 
						|
	uint32_t keyhandle;
 | 
						|
	unsigned char keyauth[TPM_DIGEST_SIZE];
 | 
						|
	uint32_t blobauth_len;
 | 
						|
	unsigned char blobauth[TPM_DIGEST_SIZE];
 | 
						|
	uint32_t pcrinfo_len;
 | 
						|
	unsigned char pcrinfo[MAX_PCRINFO_SIZE];
 | 
						|
	int pcrlock;
 | 
						|
	uint32_t hash;
 | 
						|
	uint32_t policydigest_len;
 | 
						|
	unsigned char policydigest[MAX_DIGEST_SIZE];
 | 
						|
	uint32_t policyhandle;
 | 
						|
};
 | 
						|
 | 
						|
struct trusted_key_ops {
 | 
						|
	/*
 | 
						|
	 * flag to indicate if trusted key implementation supports migration
 | 
						|
	 * or not.
 | 
						|
	 */
 | 
						|
	unsigned char migratable;
 | 
						|
 | 
						|
	/* Initialize key interface. */
 | 
						|
	int (*init)(void);
 | 
						|
 | 
						|
	/* Seal a key. */
 | 
						|
	int (*seal)(struct trusted_key_payload *p, char *datablob);
 | 
						|
 | 
						|
	/* Unseal a key. */
 | 
						|
	int (*unseal)(struct trusted_key_payload *p, char *datablob);
 | 
						|
 | 
						|
	/* Optional: Get a randomized key. */
 | 
						|
	int (*get_random)(unsigned char *key, size_t key_len);
 | 
						|
 | 
						|
	/* Exit key interface. */
 | 
						|
	void (*exit)(void);
 | 
						|
};
 | 
						|
 | 
						|
struct trusted_key_source {
 | 
						|
	char *name;
 | 
						|
	struct trusted_key_ops *ops;
 | 
						|
};
 | 
						|
 | 
						|
extern struct key_type key_type_trusted;
 | 
						|
 | 
						|
#define TRUSTED_DEBUG 0
 | 
						|
 | 
						|
#if TRUSTED_DEBUG
 | 
						|
static inline void dump_payload(struct trusted_key_payload *p)
 | 
						|
{
 | 
						|
	pr_info("key_len %d\n", p->key_len);
 | 
						|
	print_hex_dump(KERN_INFO, "key ", DUMP_PREFIX_NONE,
 | 
						|
		       16, 1, p->key, p->key_len, 0);
 | 
						|
	pr_info("bloblen %d\n", p->blob_len);
 | 
						|
	print_hex_dump(KERN_INFO, "blob ", DUMP_PREFIX_NONE,
 | 
						|
		       16, 1, p->blob, p->blob_len, 0);
 | 
						|
	pr_info("migratable %d\n", p->migratable);
 | 
						|
}
 | 
						|
#else
 | 
						|
static inline void dump_payload(struct trusted_key_payload *p)
 | 
						|
{
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* _KEYS_TRUSTED_TYPE_H */
 |