1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (C) 2004,2007,2008 IBM Corporation
4 *
5 * Authors:
6 * Leendert van Doorn <leendert@watson.ibm.com>
7 * Dave Safford <safford@watson.ibm.com>
8 * Reiner Sailer <sailer@watson.ibm.com>
9 * Kylene Hall <kjhall@us.ibm.com>
10 * Debora Velarde <dvelarde@us.ibm.com>
11 *
12 * Maintained by: <tpmdd_devel@lists.sourceforge.net>
13 *
14 * Device driver for TCG/TCPA TPM (trusted platform module).
15 * Specifications at www.trustedcomputinggroup.org
16 */
17 #ifndef __LINUX_TPM_H__
18 #define __LINUX_TPM_H__
19
20 #include <linux/hw_random.h>
21 #include <linux/acpi.h>
22 #include <linux/cdev.h>
23 #include <linux/fs.h>
24 #include <linux/highmem.h>
25 #include <crypto/hash_info.h>
26 #include <crypto/aes.h>
27
28 #include <linux/tpm_command.h>
29 #include <linux/tpm_buf.h>
30
31 struct tpm_chip;
32 struct trusted_key_payload;
33 struct trusted_key_options;
34 /* opaque structure, holds auth session parameters like the session key */
35 struct tpm2_auth;
36
37 enum TPM_OPS_FLAGS {
38 TPM_OPS_AUTO_STARTUP = BIT(0),
39 };
40
41 struct tpm_class_ops {
42 unsigned int flags;
43 const u8 req_complete_mask;
44 const u8 req_complete_val;
45 bool (*req_canceled)(struct tpm_chip *chip, u8 status);
46 int (*recv) (struct tpm_chip *chip, u8 *buf, size_t len);
47 int (*send)(struct tpm_chip *chip, u8 *buf, size_t bufsiz,
48 size_t cmd_len);
49 void (*cancel) (struct tpm_chip *chip);
50 u8 (*status) (struct tpm_chip *chip);
51 void (*update_timeouts)(struct tpm_chip *chip,
52 unsigned long *timeout_cap);
53 void (*update_durations)(struct tpm_chip *chip,
54 unsigned long *duration_cap);
55 int (*go_idle)(struct tpm_chip *chip);
56 int (*cmd_ready)(struct tpm_chip *chip);
57 int (*request_locality)(struct tpm_chip *chip, int loc);
58 int (*relinquish_locality)(struct tpm_chip *chip, int loc);
59 void (*clk_enable)(struct tpm_chip *chip, bool value);
60 };
61
62 #define TPM_NUM_EVENT_LOG_FILES 3
63
64 /* Indexes the duration array */
65 enum tpm_duration {
66 TPM_SHORT = 0,
67 TPM_MEDIUM = 1,
68 TPM_LONG = 2,
69 TPM_LONG_LONG = 3,
70 TPM_UNDEFINED,
71 TPM_NUM_DURATIONS = TPM_UNDEFINED,
72 };
73
74 #define TPM_PPI_VERSION_LEN 3
75
76 struct tpm_space {
77 u32 context_tbl[3];
78 u8 *context_buf;
79 u32 session_tbl[3];
80 u8 *session_buf;
81 u32 buf_size;
82 };
83
84 struct tpm_bios_log {
85 void *bios_event_log;
86 void *bios_event_log_end;
87 };
88
89 struct tpm_chip_seqops {
90 struct tpm_chip *chip;
91 const struct seq_operations *seqops;
92 };
93
94 /* Fixed define for the curve we use which is NIST_P256 */
95 #define EC_PT_SZ 32
96
97 /*
98 * fixed define for the size of a name. This is actually HASHALG size
99 * plus 2, so 32 for SHA256
100 */
101 #define TPM2_NAME_SIZE 34
102
103 /*
104 * The maximum size for an object context
105 */
106 #define TPM2_MAX_CONTEXT_SIZE 4096
107
108 struct tpm_chip {
109 struct device dev;
110 struct device devs;
111 struct cdev cdev;
112 struct cdev cdevs;
113
114 /* A driver callback under ops cannot be run unless ops_sem is held
115 * (sometimes implicitly, eg for the sysfs code). ops becomes null
116 * when the driver is unregistered, see tpm_try_get_ops.
117 */
118 struct rw_semaphore ops_sem;
119 const struct tpm_class_ops *ops;
120
121 struct tpm_bios_log log;
122 struct tpm_chip_seqops bin_log_seqops;
123 struct tpm_chip_seqops ascii_log_seqops;
124
125 unsigned int flags;
126
127 int dev_num; /* /dev/tpm# */
128 unsigned long is_open; /* only one allowed */
129
130 char hwrng_name[64];
131 struct hwrng hwrng;
132
133 struct mutex tpm_mutex; /* tpm is processing */
134
135 unsigned long timeout_a; /* jiffies */
136 unsigned long timeout_b; /* jiffies */
137 unsigned long timeout_c; /* jiffies */
138 unsigned long timeout_d; /* jiffies */
139 bool timeout_adjusted;
140 unsigned long duration[TPM_NUM_DURATIONS]; /* jiffies */
141 bool duration_adjusted;
142
143 struct dentry *bios_dir;
144
145 const struct attribute_group *groups[3 + TPM_MAX_HASHES];
146 unsigned int groups_cnt;
147
148 u32 nr_allocated_banks;
149 struct tpm_bank_info allocated_banks[TPM2_MAX_PCR_BANKS];
150 #ifdef CONFIG_ACPI
151 acpi_handle acpi_dev_handle;
152 char ppi_version[TPM_PPI_VERSION_LEN + 1];
153 #endif /* CONFIG_ACPI */
154
155 struct tpm_space work_space;
156 u32 last_cc;
157 u32 nr_commands;
158 u32 *cc_attrs_tbl;
159
160 /* active locality */
161 int locality;
162
163 #ifdef CONFIG_TCG_TPM2_HMAC
164 /* details for communication security via sessions */
165
166 /* saved context for NULL seed */
167 u8 null_key_context[TPM2_MAX_CONTEXT_SIZE];
168 /* name of NULL seed */
169 u8 null_key_name[TPM2_NAME_SIZE];
170 u8 null_ec_key_x[EC_PT_SZ];
171 u8 null_ec_key_y[EC_PT_SZ];
172 struct tpm2_auth *auth;
173 #endif
174 };
175
tpm2_handle_mso(u32 handle)176 static inline enum tpm2_mso_type tpm2_handle_mso(u32 handle)
177 {
178 return handle >> 24;
179 }
180
181 #define TPM_VID_INTEL 0x8086
182 #define TPM_VID_WINBOND 0x1050
183 #define TPM_VID_STM 0x104A
184 #define TPM_VID_ATML 0x1114
185 #define TPM_VID_IFX 0x15D1
186
187 enum tpm_chip_flags {
188 TPM_CHIP_FLAG_BOOTSTRAPPED = BIT(0),
189 TPM_CHIP_FLAG_TPM2 = BIT(1),
190 TPM_CHIP_FLAG_IRQ = BIT(2),
191 TPM_CHIP_FLAG_VIRTUAL = BIT(3),
192 TPM_CHIP_FLAG_HAVE_TIMEOUTS = BIT(4),
193 TPM_CHIP_FLAG_ALWAYS_POWERED = BIT(5),
194 TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED = BIT(6),
195 TPM_CHIP_FLAG_FIRMWARE_UPGRADE = BIT(7),
196 TPM_CHIP_FLAG_SUSPENDED = BIT(8),
197 TPM_CHIP_FLAG_HWRNG_DISABLED = BIT(9),
198 TPM_CHIP_FLAG_DISABLE = BIT(10),
199 TPM_CHIP_FLAG_SYNC = BIT(11),
200 };
201
202 #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev)
203
204 struct tpm2_hash {
205 unsigned int crypto_id;
206 unsigned int tpm_id;
207 };
208
209 /*
210 * Check if TPM device is in the firmware upgrade mode.
211 */
tpm_is_firmware_upgrade(struct tpm_chip * chip)212 static inline bool tpm_is_firmware_upgrade(struct tpm_chip *chip)
213 {
214 return chip->flags & TPM_CHIP_FLAG_FIRMWARE_UPGRADE;
215 }
216
tpm2_rc_value(u32 rc)217 static inline u32 tpm2_rc_value(u32 rc)
218 {
219 return (rc & BIT(7)) ? rc & 0xbf : rc;
220 }
221
222 /*
223 * Convert a return value from tpm_transmit_cmd() to POSIX error code.
224 */
tpm_ret_to_err(ssize_t ret)225 static inline ssize_t tpm_ret_to_err(ssize_t ret)
226 {
227 if (ret < 0)
228 return ret;
229
230 switch (tpm2_rc_value(ret)) {
231 case TPM2_RC_SUCCESS:
232 return 0;
233 case TPM2_RC_SESSION_MEMORY:
234 return -ENOMEM;
235 case TPM2_RC_HASH:
236 return -EINVAL;
237 default:
238 return -EPERM;
239 }
240 }
241
242 #if defined(CONFIG_TCG_TPM) || defined(CONFIG_TCG_TPM_MODULE)
243
244 extern int tpm_is_tpm2(struct tpm_chip *chip);
245 extern __must_check int tpm_try_get_ops(struct tpm_chip *chip);
246 extern void tpm_put_ops(struct tpm_chip *chip);
247 extern ssize_t tpm_transmit_cmd(struct tpm_chip *chip, struct tpm_buf *buf,
248 size_t min_rsp_body_length, const char *desc);
249 extern int tpm_pcr_read(struct tpm_chip *chip, u32 pcr_idx,
250 struct tpm_digest *digest);
251 extern int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx,
252 struct tpm_digest *digests);
253 extern int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max);
254 extern struct tpm_chip *tpm_default_chip(void);
255 void tpm2_flush_context(struct tpm_chip *chip, u32 handle);
256 int tpm2_find_hash_alg(unsigned int crypto_id);
257
tpm_buf_append_empty_auth(struct tpm_buf * buf,u32 handle)258 static inline void tpm_buf_append_empty_auth(struct tpm_buf *buf, u32 handle)
259 {
260 /* simple authorization for empty auth */
261 tpm_buf_append_u32(buf, 9); /* total length of auth */
262 tpm_buf_append_u32(buf, handle);
263 tpm_buf_append_u16(buf, 0); /* nonce len */
264 tpm_buf_append_u8(buf, 0); /* attributes */
265 tpm_buf_append_u16(buf, 0); /* hmac len */
266 }
267 #else
tpm_is_tpm2(struct tpm_chip * chip)268 static inline int tpm_is_tpm2(struct tpm_chip *chip)
269 {
270 return -ENODEV;
271 }
tpm_pcr_read(struct tpm_chip * chip,int pcr_idx,struct tpm_digest * digest)272 static inline int tpm_pcr_read(struct tpm_chip *chip, int pcr_idx,
273 struct tpm_digest *digest)
274 {
275 return -ENODEV;
276 }
277
tpm_pcr_extend(struct tpm_chip * chip,u32 pcr_idx,struct tpm_digest * digests)278 static inline int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx,
279 struct tpm_digest *digests)
280 {
281 return -ENODEV;
282 }
283
tpm_get_random(struct tpm_chip * chip,u8 * data,size_t max)284 static inline int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max)
285 {
286 return -ENODEV;
287 }
288
tpm_default_chip(void)289 static inline struct tpm_chip *tpm_default_chip(void)
290 {
291 return NULL;
292 }
293
tpm_buf_append_empty_auth(struct tpm_buf * buf,u32 handle)294 static inline void tpm_buf_append_empty_auth(struct tpm_buf *buf, u32 handle)
295 {
296 }
297 #endif
298
tpm2_chip_auth(struct tpm_chip * chip)299 static inline struct tpm2_auth *tpm2_chip_auth(struct tpm_chip *chip)
300 {
301 #ifdef CONFIG_TCG_TPM2_HMAC
302 return chip->auth;
303 #else
304 return NULL;
305 #endif
306 }
307
308 int tpm_buf_append_name(struct tpm_chip *chip, struct tpm_buf *buf,
309 u32 handle, u8 *name);
310 void tpm_buf_append_hmac_session(struct tpm_chip *chip, struct tpm_buf *buf,
311 u8 attributes, u8 *passphrase,
312 int passphraselen);
313 void tpm_buf_append_auth(struct tpm_chip *chip, struct tpm_buf *buf,
314 u8 *passphrase, int passphraselen);
315
316 #ifdef CONFIG_TCG_TPM2_HMAC
317
318 int tpm2_start_auth_session(struct tpm_chip *chip);
319 int tpm_buf_fill_hmac_session(struct tpm_chip *chip, struct tpm_buf *buf);
320 int tpm_buf_check_hmac_response(struct tpm_chip *chip, struct tpm_buf *buf,
321 int rc);
322 void tpm2_end_auth_session(struct tpm_chip *chip);
323 #else
324 #include <linux/unaligned.h>
325
tpm2_start_auth_session(struct tpm_chip * chip)326 static inline int tpm2_start_auth_session(struct tpm_chip *chip)
327 {
328 return 0;
329 }
tpm2_end_auth_session(struct tpm_chip * chip)330 static inline void tpm2_end_auth_session(struct tpm_chip *chip)
331 {
332 }
333
tpm_buf_fill_hmac_session(struct tpm_chip * chip,struct tpm_buf * buf)334 static inline int tpm_buf_fill_hmac_session(struct tpm_chip *chip,
335 struct tpm_buf *buf)
336 {
337 return 0;
338 }
339
tpm_buf_check_hmac_response(struct tpm_chip * chip,struct tpm_buf * buf,int rc)340 static inline int tpm_buf_check_hmac_response(struct tpm_chip *chip,
341 struct tpm_buf *buf,
342 int rc)
343 {
344 return rc;
345 }
346 #endif /* CONFIG_TCG_TPM2_HMAC */
347
348 #endif
349