at v5.1 5.8 kB view raw
1/* 2 * Copyright (C) 2004,2007,2008 IBM Corporation 3 * 4 * Authors: 5 * Leendert van Doorn <leendert@watson.ibm.com> 6 * Dave Safford <safford@watson.ibm.com> 7 * Reiner Sailer <sailer@watson.ibm.com> 8 * Kylene Hall <kjhall@us.ibm.com> 9 * Debora Velarde <dvelarde@us.ibm.com> 10 * 11 * Maintained by: <tpmdd_devel@lists.sourceforge.net> 12 * 13 * Device driver for TCG/TCPA TPM (trusted platform module). 14 * Specifications at www.trustedcomputinggroup.org 15 * 16 * This program is free software; you can redistribute it and/or 17 * modify it under the terms of the GNU General Public License as 18 * published by the Free Software Foundation, version 2 of the 19 * License. 20 * 21 */ 22#ifndef __LINUX_TPM_H__ 23#define __LINUX_TPM_H__ 24 25#include <linux/hw_random.h> 26#include <linux/acpi.h> 27#include <linux/cdev.h> 28#include <linux/fs.h> 29#include <crypto/hash_info.h> 30 31#define TPM_DIGEST_SIZE 20 /* Max TPM v1.2 PCR size */ 32#define TPM_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE 33 34struct tpm_chip; 35struct trusted_key_payload; 36struct trusted_key_options; 37 38enum tpm_algorithms { 39 TPM_ALG_ERROR = 0x0000, 40 TPM_ALG_SHA1 = 0x0004, 41 TPM_ALG_KEYEDHASH = 0x0008, 42 TPM_ALG_SHA256 = 0x000B, 43 TPM_ALG_SHA384 = 0x000C, 44 TPM_ALG_SHA512 = 0x000D, 45 TPM_ALG_NULL = 0x0010, 46 TPM_ALG_SM3_256 = 0x0012, 47}; 48 49struct tpm_digest { 50 u16 alg_id; 51 u8 digest[TPM_MAX_DIGEST_SIZE]; 52} __packed; 53 54struct tpm_bank_info { 55 u16 alg_id; 56 u16 digest_size; 57 u16 crypto_id; 58}; 59 60enum TPM_OPS_FLAGS { 61 TPM_OPS_AUTO_STARTUP = BIT(0), 62}; 63 64struct tpm_class_ops { 65 unsigned int flags; 66 const u8 req_complete_mask; 67 const u8 req_complete_val; 68 bool (*req_canceled)(struct tpm_chip *chip, u8 status); 69 int (*recv) (struct tpm_chip *chip, u8 *buf, size_t len); 70 int (*send) (struct tpm_chip *chip, u8 *buf, size_t len); 71 void (*cancel) (struct tpm_chip *chip); 72 u8 (*status) (struct tpm_chip *chip); 73 void (*update_timeouts)(struct tpm_chip *chip, 74 unsigned long *timeout_cap); 75 int (*go_idle)(struct tpm_chip *chip); 76 int (*cmd_ready)(struct tpm_chip *chip); 77 int (*request_locality)(struct tpm_chip *chip, int loc); 78 int (*relinquish_locality)(struct tpm_chip *chip, int loc); 79 void (*clk_enable)(struct tpm_chip *chip, bool value); 80}; 81 82#define TPM_NUM_EVENT_LOG_FILES 3 83 84/* Indexes the duration array */ 85enum tpm_duration { 86 TPM_SHORT = 0, 87 TPM_MEDIUM = 1, 88 TPM_LONG = 2, 89 TPM_LONG_LONG = 3, 90 TPM_UNDEFINED, 91 TPM_NUM_DURATIONS = TPM_UNDEFINED, 92}; 93 94#define TPM_PPI_VERSION_LEN 3 95 96struct tpm_space { 97 u32 context_tbl[3]; 98 u8 *context_buf; 99 u32 session_tbl[3]; 100 u8 *session_buf; 101}; 102 103struct tpm_bios_log { 104 void *bios_event_log; 105 void *bios_event_log_end; 106}; 107 108struct tpm_chip_seqops { 109 struct tpm_chip *chip; 110 const struct seq_operations *seqops; 111}; 112 113struct tpm_chip { 114 struct device dev; 115 struct device devs; 116 struct cdev cdev; 117 struct cdev cdevs; 118 119 /* A driver callback under ops cannot be run unless ops_sem is held 120 * (sometimes implicitly, eg for the sysfs code). ops becomes null 121 * when the driver is unregistered, see tpm_try_get_ops. 122 */ 123 struct rw_semaphore ops_sem; 124 const struct tpm_class_ops *ops; 125 126 struct tpm_bios_log log; 127 struct tpm_chip_seqops bin_log_seqops; 128 struct tpm_chip_seqops ascii_log_seqops; 129 130 unsigned int flags; 131 132 int dev_num; /* /dev/tpm# */ 133 unsigned long is_open; /* only one allowed */ 134 135 char hwrng_name[64]; 136 struct hwrng hwrng; 137 138 struct mutex tpm_mutex; /* tpm is processing */ 139 140 unsigned long timeout_a; /* jiffies */ 141 unsigned long timeout_b; /* jiffies */ 142 unsigned long timeout_c; /* jiffies */ 143 unsigned long timeout_d; /* jiffies */ 144 bool timeout_adjusted; 145 unsigned long duration[TPM_NUM_DURATIONS]; /* jiffies */ 146 bool duration_adjusted; 147 148 struct dentry *bios_dir[TPM_NUM_EVENT_LOG_FILES]; 149 150 const struct attribute_group *groups[3]; 151 unsigned int groups_cnt; 152 153 u32 nr_allocated_banks; 154 struct tpm_bank_info *allocated_banks; 155#ifdef CONFIG_ACPI 156 acpi_handle acpi_dev_handle; 157 char ppi_version[TPM_PPI_VERSION_LEN + 1]; 158#endif /* CONFIG_ACPI */ 159 160 struct tpm_space work_space; 161 u32 last_cc; 162 u32 nr_commands; 163 u32 *cc_attrs_tbl; 164 165 /* active locality */ 166 int locality; 167}; 168 169#if defined(CONFIG_TCG_TPM) || defined(CONFIG_TCG_TPM_MODULE) 170 171extern int tpm_is_tpm2(struct tpm_chip *chip); 172extern int tpm_pcr_read(struct tpm_chip *chip, u32 pcr_idx, 173 struct tpm_digest *digest); 174extern int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, 175 struct tpm_digest *digests); 176extern int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen); 177extern int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max); 178extern int tpm_seal_trusted(struct tpm_chip *chip, 179 struct trusted_key_payload *payload, 180 struct trusted_key_options *options); 181extern int tpm_unseal_trusted(struct tpm_chip *chip, 182 struct trusted_key_payload *payload, 183 struct trusted_key_options *options); 184extern struct tpm_chip *tpm_default_chip(void); 185#else 186static inline int tpm_is_tpm2(struct tpm_chip *chip) 187{ 188 return -ENODEV; 189} 190 191static inline int tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, 192 struct tpm_digest *digest) 193{ 194 return -ENODEV; 195} 196 197static inline int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, 198 struct tpm_digest *digests) 199{ 200 return -ENODEV; 201} 202 203static inline int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen) 204{ 205 return -ENODEV; 206} 207static inline int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max) 208{ 209 return -ENODEV; 210} 211 212static inline int tpm_seal_trusted(struct tpm_chip *chip, 213 struct trusted_key_payload *payload, 214 struct trusted_key_options *options) 215{ 216 return -ENODEV; 217} 218static inline int tpm_unseal_trusted(struct tpm_chip *chip, 219 struct trusted_key_payload *payload, 220 struct trusted_key_options *options) 221{ 222 return -ENODEV; 223} 224static inline struct tpm_chip *tpm_default_chip(void) 225{ 226 return NULL; 227} 228#endif 229#endif