blob: 2f81dce47e7c63f58237e80d5412406fe49989a7 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-3-Clause */
/*
* swtpm.h: Header file for swtpm.c
*
* Author: Stefan Berger, stefanb@linux.ibm.com
*
* Copyright (c) IBM Corporation, 2021
*/
#ifndef SWTPM_SETUP_SWTPM_H
#define SWTPM_SETUP_SWTPM_H
#include <glib.h>
#include <pwd.h>
#include <openssl/sha.h>
struct swtpm;
/* common swtpm ops for TPM 1.2 & TPM 2 */
struct swtpm_cops {
int (*start)(struct swtpm *);
void (*stop)(struct swtpm *);
void (*destroy)(struct swtpm *);
int (*ctrl_shutdown)(struct swtpm *);
int (*ctrl_get_tpm_specs_and_attrs)(struct swtpm *, gchar **);
};
/* TPM 1.2 specific ops */
struct swtpm12_ops {
int (*run_swtpm_bios)(struct swtpm *self);
int (*create_endorsement_key_pair)(struct swtpm *, gchar **pubkey, size_t *pubek_len);
int (*take_ownership)(struct swtpm *self,
const unsigned char ownerpass_digest[SHA_DIGEST_LENGTH],
const unsigned char srkpass_digest[SHA_DIGEST_LENGTH],
const unsigned char *pubek, size_t pubek_len);
int (*write_ek_cert_nvram)(struct swtpm *self,
const unsigned char *data, size_t data_len);
int (*write_platform_cert_nvram)(struct swtpm *self,
const unsigned char *data, size_t data_len);
int (*nv_lock)(struct swtpm *self);
};
/* TPM 2 specific ops */
struct swtpm2_ops {
int (*shutdown)(struct swtpm *);
int (*create_spk)(struct swtpm *self, gboolean isecc, unsigned int rsa_keysize);
int (*create_ek)(struct swtpm *self, gboolean isecc, unsigned int rsa_keysize,
gboolean allowsigning, gboolean decryption, gboolean lock_nvram,
gchar **ekparam, const gchar **key_description);
int (*get_all_pcr_banks)(struct swtpm *self, gchar ***all_pcr_banks);
int (*set_active_pcr_banks)(struct swtpm *self, gchar **pcr_banks_l, gchar **all_pcr_banks,
gchar ***active);
int (*write_ek_cert_nvram)(struct swtpm *self, gboolean isecc, unsigned int rsa_keysize,
gboolean lock_nvram, const unsigned char *data, size_t data_len);
int (*write_platform_cert_nvram)(struct swtpm *self, gboolean lock_nvram,
const unsigned char *data, size_t data_len);
};
/* common structure for swtpm object */
struct swtpm {
const struct swtpm_cops *cops;
gchar **swtpm_exec_l;
const gchar *state_path;
const gchar *keyopts;
const gchar *logfile;
const int *fds_to_pass;
size_t n_fds_to_pass;
gboolean is_tpm2;
GPid pid;
int ctrl_fds[2];
int data_fds[2];
};
struct swtpm12 {
struct swtpm swtpm;
const struct swtpm12_ops *ops;
};
struct swtpm2 {
struct swtpm swtpm;
const struct swtpm2_ops *ops;
};
struct swtpm12 *swtpm12_new(gchar **swtpm_prg_l, const gchar *tpm_state_path,
const gchar *swtpm_keyopts, const gchar *logfile,
int *fds_to_pass, size_t n_fds_to_pass);
struct swtpm2 *swtpm2_new(gchar **swtpm_prg_l, const gchar *tpm_state_path,
const gchar *swtpm_keyopts, const gchar *logfile,
int *fds_to_pass, size_t n_fds_to_pass);
void swtpm_free(struct swtpm *);
/* backend-specific implementations */
struct swtpm_backend_ops {
void* (*parse_backend)(const gchar* uri);
int (*check_access)(void *backend, int mode, const struct passwd *curr_user);
int (*delete_state)(void *backend);
void (*free_backend)(void *backend);
};
extern struct swtpm_backend_ops swtpm_backend_dir;
extern struct swtpm_backend_ops swtpm_backend_file;
#endif /* SWTPM_SETUP_SWTPM_H */