root/include/keys/trusted.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. dump_options
  2. dump_payload
  3. dump_sess
  4. dump_tpm_buf
  5. dump_options
  6. dump_payload
  7. dump_sess
  8. dump_tpm_buf
  9. store8
  10. store16
  11. store32
  12. storebytes

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __TRUSTED_KEY_H
   3 #define __TRUSTED_KEY_H
   4 
   5 /* implementation specific TPM constants */
   6 #define MAX_BUF_SIZE                    1024
   7 #define TPM_GETRANDOM_SIZE              14
   8 #define TPM_OSAP_SIZE                   36
   9 #define TPM_OIAP_SIZE                   10
  10 #define TPM_SEAL_SIZE                   87
  11 #define TPM_UNSEAL_SIZE                 104
  12 #define TPM_SIZE_OFFSET                 2
  13 #define TPM_RETURN_OFFSET               6
  14 #define TPM_DATA_OFFSET                 10
  15 
  16 #define LOAD32(buffer, offset)  (ntohl(*(uint32_t *)&buffer[offset]))
  17 #define LOAD32N(buffer, offset) (*(uint32_t *)&buffer[offset])
  18 #define LOAD16(buffer, offset)  (ntohs(*(uint16_t *)&buffer[offset]))
  19 
  20 struct tpm_buf {
  21         int len;
  22         unsigned char data[MAX_BUF_SIZE];
  23 };
  24 
  25 #define INIT_BUF(tb) (tb->len = 0)
  26 
  27 struct osapsess {
  28         uint32_t handle;
  29         unsigned char secret[SHA1_DIGEST_SIZE];
  30         unsigned char enonce[TPM_NONCE_SIZE];
  31 };
  32 
  33 /* discrete values, but have to store in uint16_t for TPM use */
  34 enum {
  35         SEAL_keytype = 1,
  36         SRK_keytype = 4
  37 };
  38 
  39 int TSS_authhmac(unsigned char *digest, const unsigned char *key,
  40                         unsigned int keylen, unsigned char *h1,
  41                         unsigned char *h2, unsigned int h3, ...);
  42 int TSS_checkhmac1(unsigned char *buffer,
  43                           const uint32_t command,
  44                           const unsigned char *ononce,
  45                           const unsigned char *key,
  46                           unsigned int keylen, ...);
  47 
  48 int trusted_tpm_send(unsigned char *cmd, size_t buflen);
  49 int oiap(struct tpm_buf *tb, uint32_t *handle, unsigned char *nonce);
  50 
  51 #define TPM_DEBUG 0
  52 
  53 #if TPM_DEBUG
  54 static inline void dump_options(struct trusted_key_options *o)
  55 {
  56         pr_info("trusted_key: sealing key type %d\n", o->keytype);
  57         pr_info("trusted_key: sealing key handle %0X\n", o->keyhandle);
  58         pr_info("trusted_key: pcrlock %d\n", o->pcrlock);
  59         pr_info("trusted_key: pcrinfo %d\n", o->pcrinfo_len);
  60         print_hex_dump(KERN_INFO, "pcrinfo ", DUMP_PREFIX_NONE,
  61                        16, 1, o->pcrinfo, o->pcrinfo_len, 0);
  62 }
  63 
  64 static inline void dump_payload(struct trusted_key_payload *p)
  65 {
  66         pr_info("trusted_key: key_len %d\n", p->key_len);
  67         print_hex_dump(KERN_INFO, "key ", DUMP_PREFIX_NONE,
  68                        16, 1, p->key, p->key_len, 0);
  69         pr_info("trusted_key: bloblen %d\n", p->blob_len);
  70         print_hex_dump(KERN_INFO, "blob ", DUMP_PREFIX_NONE,
  71                        16, 1, p->blob, p->blob_len, 0);
  72         pr_info("trusted_key: migratable %d\n", p->migratable);
  73 }
  74 
  75 static inline void dump_sess(struct osapsess *s)
  76 {
  77         print_hex_dump(KERN_INFO, "trusted-key: handle ", DUMP_PREFIX_NONE,
  78                        16, 1, &s->handle, 4, 0);
  79         pr_info("trusted-key: secret:\n");
  80         print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE,
  81                        16, 1, &s->secret, SHA1_DIGEST_SIZE, 0);
  82         pr_info("trusted-key: enonce:\n");
  83         print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE,
  84                        16, 1, &s->enonce, SHA1_DIGEST_SIZE, 0);
  85 }
  86 
  87 static inline void dump_tpm_buf(unsigned char *buf)
  88 {
  89         int len;
  90 
  91         pr_info("\ntrusted-key: tpm buffer\n");
  92         len = LOAD32(buf, TPM_SIZE_OFFSET);
  93         print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1, buf, len, 0);
  94 }
  95 #else
  96 static inline void dump_options(struct trusted_key_options *o)
  97 {
  98 }
  99 
 100 static inline void dump_payload(struct trusted_key_payload *p)
 101 {
 102 }
 103 
 104 static inline void dump_sess(struct osapsess *s)
 105 {
 106 }
 107 
 108 static inline void dump_tpm_buf(unsigned char *buf)
 109 {
 110 }
 111 #endif
 112 
 113 static inline void store8(struct tpm_buf *buf, const unsigned char value)
 114 {
 115         buf->data[buf->len++] = value;
 116 }
 117 
 118 static inline void store16(struct tpm_buf *buf, const uint16_t value)
 119 {
 120         *(uint16_t *) & buf->data[buf->len] = htons(value);
 121         buf->len += sizeof value;
 122 }
 123 
 124 static inline void store32(struct tpm_buf *buf, const uint32_t value)
 125 {
 126         *(uint32_t *) & buf->data[buf->len] = htonl(value);
 127         buf->len += sizeof value;
 128 }
 129 
 130 static inline void storebytes(struct tpm_buf *buf, const unsigned char *in,
 131                               const int len)
 132 {
 133         memcpy(buf->data + buf->len, in, len);
 134         buf->len += len;
 135 }
 136 #endif

/* [<][>][^][v][top][bottom][index][help] */