1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __TRUSTED_TPM_H
3 #define __TRUSTED_TPM_H
5 #include <keys/trusted-type.h>
6 #include <linux/tpm_command.h>
8 /* implementation specific TPM constants */
9 #define MAX_BUF_SIZE 1024
10 #define TPM_GETRANDOM_SIZE 14
11 #define TPM_SIZE_OFFSET 2
12 #define TPM_RETURN_OFFSET 6
13 #define TPM_DATA_OFFSET 10
15 #define LOAD32(buffer, offset) (ntohl(*(uint32_t *)&buffer[offset]))
16 #define LOAD32N(buffer, offset) (*(uint32_t *)&buffer[offset])
17 #define LOAD16(buffer, offset) (ntohs(*(uint16_t *)&buffer[offset]))
21 unsigned char secret
[SHA1_DIGEST_SIZE
];
22 unsigned char enonce
[TPM_NONCE_SIZE
];
25 /* discrete values, but have to store in uint16_t for TPM use */
31 int TSS_authhmac(unsigned char *digest
, const unsigned char *key
,
32 unsigned int keylen
, unsigned char *h1
,
33 unsigned char *h2
, unsigned int h3
, ...);
34 int TSS_checkhmac1(unsigned char *buffer
,
35 const uint32_t command
,
36 const unsigned char *ononce
,
37 const unsigned char *key
,
38 unsigned int keylen
, ...);
40 int trusted_tpm_send(unsigned char *cmd
, size_t buflen
);
41 int oiap(struct tpm_buf
*tb
, uint32_t *handle
, unsigned char *nonce
);
43 int tpm2_seal_trusted(struct tpm_chip
*chip
,
44 struct trusted_key_payload
*payload
,
45 struct trusted_key_options
*options
);
46 int tpm2_unseal_trusted(struct tpm_chip
*chip
,
47 struct trusted_key_payload
*payload
,
48 struct trusted_key_options
*options
);
53 static inline void dump_options(struct trusted_key_options
*o
)
55 pr_info("trusted_key: sealing key type %d\n", o
->keytype
);
56 pr_info("trusted_key: sealing key handle %0X\n", o
->keyhandle
);
57 pr_info("trusted_key: pcrlock %d\n", o
->pcrlock
);
58 pr_info("trusted_key: pcrinfo %d\n", o
->pcrinfo_len
);
59 print_hex_dump(KERN_INFO
, "pcrinfo ", DUMP_PREFIX_NONE
,
60 16, 1, o
->pcrinfo
, o
->pcrinfo_len
, 0);
63 static inline void dump_payload(struct trusted_key_payload
*p
)
65 pr_info("trusted_key: key_len %d\n", p
->key_len
);
66 print_hex_dump(KERN_INFO
, "key ", DUMP_PREFIX_NONE
,
67 16, 1, p
->key
, p
->key_len
, 0);
68 pr_info("trusted_key: bloblen %d\n", p
->blob_len
);
69 print_hex_dump(KERN_INFO
, "blob ", DUMP_PREFIX_NONE
,
70 16, 1, p
->blob
, p
->blob_len
, 0);
71 pr_info("trusted_key: migratable %d\n", p
->migratable
);
74 static inline void dump_sess(struct osapsess
*s
)
76 print_hex_dump(KERN_INFO
, "trusted-key: handle ", DUMP_PREFIX_NONE
,
77 16, 1, &s
->handle
, 4, 0);
78 pr_info("trusted-key: secret:\n");
79 print_hex_dump(KERN_INFO
, "", DUMP_PREFIX_NONE
,
80 16, 1, &s
->secret
, SHA1_DIGEST_SIZE
, 0);
81 pr_info("trusted-key: enonce:\n");
82 print_hex_dump(KERN_INFO
, "", DUMP_PREFIX_NONE
,
83 16, 1, &s
->enonce
, SHA1_DIGEST_SIZE
, 0);
86 static inline void dump_tpm_buf(unsigned char *buf
)
90 pr_info("\ntrusted-key: tpm buffer\n");
91 len
= LOAD32(buf
, TPM_SIZE_OFFSET
);
92 print_hex_dump(KERN_INFO
, "", DUMP_PREFIX_NONE
, 16, 1, buf
, len
, 0);
95 static inline void dump_options(struct trusted_key_options
*o
)
99 static inline void dump_payload(struct trusted_key_payload
*p
)
103 static inline void dump_sess(struct osapsess
*s
)
107 static inline void dump_tpm_buf(unsigned char *buf
)