Annotation of embedaddon/strongswan/src/libimcv/pts/pts.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2011 Sansar Choinyambuu
! 3: * Copyright (C) 2012-2016 Andreas Steffen
! 4: * HSR Hochschule fuer Technik Rapperswil
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2 of the License, or (at your
! 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 10: *
! 11: * This program is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 14: * for more details.
! 15: */
! 16:
! 17: /**
! 18: * @defgroup pts pts
! 19: * @{ @ingroup libimcv
! 20: */
! 21:
! 22: #ifndef PTS_H_
! 23: #define PTS_H_
! 24:
! 25: typedef struct pts_t pts_t;
! 26:
! 27: #include "pts_error.h"
! 28: #include "pts_proto_caps.h"
! 29: #include "pts_meas_algo.h"
! 30: #include "pts_file_meas.h"
! 31: #include "pts_file_meta.h"
! 32: #include "pts_dh_group.h"
! 33: #include "pts_pcr.h"
! 34: #include "pts_req_func_comp_evid.h"
! 35: #include "components/pts_comp_func_name.h"
! 36:
! 37: #include <tpm_tss_quote_info.h>
! 38:
! 39: #include <library.h>
! 40: #include <collections/linked_list.h>
! 41:
! 42: /**
! 43: * UTF-8 encoding of the character used to delimiter the filename
! 44: */
! 45: #define SOLIDUS_UTF 0x2F
! 46: #define REVERSE_SOLIDUS_UTF 0x5C
! 47:
! 48: /**
! 49: * PCR indices used for measurements of various functional components
! 50: */
! 51: #define PCR_BIOS 0
! 52: #define PCR_PLATFORM_EXT 1
! 53: #define PCR_MOTHERBOARD 1
! 54: #define PCR_OPTION_ROMS 2
! 55: #define PCR_IPL 4
! 56:
! 57: #define PCR_TBOOT_POLICY 17
! 58: #define PCR_TBOOT_MLE 18
! 59:
! 60: #define PCR_TGRUB_MBR_STAGE1 4
! 61: #define PCR_TGRUB_STAGE2_PART1 8
! 62: #define PCR_TGRUB_STAGE2_PART2 9
! 63: #define PCR_TGRUB_CMD_LINE_ARGS 12
! 64: #define PCR_TGRUB_CHECKFILE 13
! 65: #define PCR_TGRUB_LOADED_FILES 14
! 66:
! 67: #define PCR_DEBUG 16
! 68:
! 69: /**
! 70: * Length of the generated nonce used for calculation of shared secret
! 71: */
! 72: #define ASSESSMENT_SECRET_LEN 20
! 73:
! 74: /**
! 75: * Hashing algorithm used by tboot and trustedGRUB
! 76: */
! 77: #define TRUSTED_HASH_ALGO PTS_MEAS_ALGO_SHA1
! 78:
! 79: /**
! 80: * Class implementing the TCG Platform Trust Service (PTS)
! 81: *
! 82: */
! 83: struct pts_t {
! 84:
! 85: /**
! 86: * Get PTS Protocol Capabilities
! 87: *
! 88: * @return Protocol capabilities flags
! 89: */
! 90: pts_proto_caps_flag_t (*get_proto_caps)(pts_t *this);
! 91:
! 92: /**
! 93: * Set PTS Protocol Capabilities
! 94: *
! 95: * @param flags Protocol capabilities flags
! 96: */
! 97: void (*set_proto_caps)(pts_t *this, pts_proto_caps_flag_t flags);
! 98:
! 99: /**
! 100: * Get PTS Measurement Algorithm
! 101: *
! 102: * @return PTS measurement algorithm
! 103: */
! 104: pts_meas_algorithms_t (*get_meas_algorithm)(pts_t *this);
! 105:
! 106: /**
! 107: * Set PTS Measurement Algorithm
! 108: *
! 109: * @param algorithm PTS measurement algorithm
! 110: */
! 111: void (*set_meas_algorithm)(pts_t *this, pts_meas_algorithms_t algorithm);
! 112:
! 113: /**
! 114: * Get DH Hash Algorithm
! 115: *
! 116: * @return DH hash algorithm
! 117: */
! 118: pts_meas_algorithms_t (*get_dh_hash_algorithm)(pts_t *this);
! 119:
! 120: /**
! 121: * Set DH Hash Algorithm
! 122: *
! 123: * @param algorithm DH hash algorithm
! 124: */
! 125: void (*set_dh_hash_algorithm)(pts_t *this, pts_meas_algorithms_t algorithm);
! 126:
! 127: /**
! 128: * Create PTS Diffie-Hellman object and nonce
! 129: *
! 130: * @param group PTS DH group
! 131: * @param nonce_len Nonce length
! 132: * @return TRUE if creation was successful
! 133: *
! 134: */
! 135: bool (*create_dh_nonce)(pts_t *this, pts_dh_group_t group, int nonce_len);
! 136:
! 137: /**
! 138: * Get my Diffie-Hellman public value
! 139: *
! 140: * @param value My public DH value
! 141: * @param nonce My DH nonce
! 142: * @return TRUE if public value retrieved successfully
! 143: */
! 144: bool (*get_my_public_value)(pts_t *this, chunk_t *value, chunk_t *nonce);
! 145:
! 146: /**
! 147: * Set peer Diffie.Hellman public value
! 148: *
! 149: * @param value Peer public DH value
! 150: * @param nonce Peer DH nonce
! 151: * @return TRUE if public value set successfully
! 152: */
! 153: bool (*set_peer_public_value) (pts_t *this, chunk_t value, chunk_t nonce);
! 154:
! 155: /**
! 156: * Calculates assessment secret to be used for TPM Quote as ExternalData
! 157: *
! 158: * @return TRUE unless both DH public values
! 159: * and nonces are set
! 160: */
! 161: bool (*calculate_secret) (pts_t *this);
! 162:
! 163: /**
! 164: * Get primary key of platform entry in database
! 165: *
! 166: * @return Platform and OS info
! 167: */
! 168: int (*get_platform_id)(pts_t *this);
! 169:
! 170: /**
! 171: * Set primary key of platform entry in database
! 172: *
! 173: * @param pid Primary key of platform entry in database
! 174: */
! 175: void (*set_platform_id)(pts_t *this, int pid);
! 176:
! 177: /**
! 178: * Get TPM 1.2 Version Info
! 179: *
! 180: * @param info chunk containing a TPM_CAP_VERSION_INFO struct
! 181: * @return TRUE if TPM Version Info available
! 182: */
! 183: bool (*get_tpm_version_info)(pts_t *this, chunk_t *info);
! 184:
! 185: /**
! 186: * Set TPM 1.2 Version Info
! 187: *
! 188: * @param info chunk containing a TPM_CAP_VERSION_INFO struct
! 189: */
! 190: void (*set_tpm_version_info)(pts_t *this, chunk_t info);
! 191:
! 192: /**
! 193: * Get Attestation Identity Certificate or Public Key
! 194: *
! 195: * @return AIK Certificate or Public Key
! 196: */
! 197: certificate_t* (*get_aik)(pts_t *this);
! 198:
! 199: /**
! 200: * Set Attestation Identity Certificate or Public Key
! 201: *
! 202: * @param aik AIK Certificate or Public Key
! 203: * @param aik_id Primary key referencing AIK in database
! 204: */
! 205: void (*set_aik)(pts_t *this, certificate_t *aik, int aik_id);
! 206:
! 207: /**
! 208: * Get primary key referencing AIK in database
! 209: *
! 210: * @return Primary key referencing AIK in database
! 211: */
! 212: int (*get_aik_id)(pts_t *this);
! 213:
! 214: /**
! 215: * Check whether path is valid file/directory on filesystem
! 216: *
! 217: * @param path Absolute path
! 218: * @param error_code Output variable for PTS error code
! 219: * @return TRUE if path is valid or file/directory
! 220: * doesn't exist or path is invalid
! 221: * FALSE if local error occurred within stat function
! 222: */
! 223: bool (*is_path_valid)(pts_t *this, char *path, pts_error_code_t *error_code);
! 224:
! 225: /**
! 226: * Obtain file metadata
! 227: *
! 228: * @param pathname Absolute pathname of file/directory
! 229: * @param is_dir TRUE if directory contents are requested
! 230: * @return PTS File Metadata or NULL if FAILED
! 231: */
! 232: pts_file_meta_t* (*get_metadata)(pts_t *this, char *pathname, bool is_dir);
! 233:
! 234: /**
! 235: * Retrieve the current value of a PCR register in a given PCR bank
! 236: *
! 237: * @param pcr_num PCR number
! 238: * @param pcr_value PCR value returned
! 239: * @param alg hash algorithm, selects PCR bank (TPM 2.0 only)
! 240: * @return TRUE if PCR value retrieval succeeded
! 241: */
! 242: bool (*read_pcr)(pts_t *this, uint32_t pcr_num, chunk_t *pcr_value,
! 243: hash_algorithm_t alg);
! 244:
! 245: /**
! 246: * Extend a PCR register in a given PCR bank with a hash value
! 247: *
! 248: * @param pcr_num PCR number
! 249: * @param pcr_value extended PCR value returned
! 250: * @param hash data to be extended into the PCR
! 251: * @param alg hash algorithm, selects PCR bank (TPM 2.0 only)
! 252: * @return TRUE if PCR extension succeeded
! 253: */
! 254: bool (*extend_pcr)(pts_t *this, uint32_t pcr_num, chunk_t *pcr_value,
! 255: chunk_t data, hash_algorithm_t alg);
! 256:
! 257: /**
! 258: * Quote over PCR's
! 259: * Expects owner and SRK secret to be WELL_KNOWN_SECRET and no password set for AIK
! 260: *
! 261: * @param quote_mode type of Quote signature
! 262: * @param quote_info returns various info covered by Quote signature
! 263: * @param quote_sig returns Quote signature
! 264: * @return FALSE in case of Quote error, TRUE otherwise
! 265: */
! 266: bool (*quote)(pts_t *this, tpm_quote_mode_t *quote_mode,
! 267: tpm_tss_quote_info_t **quote_info, chunk_t *quote_sig);
! 268:
! 269: /**
! 270: * Get the shadow PCR set
! 271: *
! 272: * @return shadow PCR set
! 273: */
! 274: pts_pcr_t* (*get_pcrs)(pts_t *this);
! 275:
! 276: /**
! 277: * Computes digest of the constructed TPM Quote Info structure
! 278: *
! 279: * @param quote_info TPM Quote Info as received from IMC
! 280: * @param quoted Encoding of TPM Quote Info
! 281: * @return FALSE in case of any error, TRUE otherwise
! 282: */
! 283: bool (*get_quote)(pts_t *this, tpm_tss_quote_info_t *quote_info,
! 284: chunk_t *quoted);
! 285:
! 286: /**
! 287: * Constructs and returns PCR Quote Digest structure expected from IMC
! 288: *
! 289: * @param digest_alg Hash algorithm used for TPM Quote Digest
! 290: * @param digest Calculated TPM Quote Digest
! 291: * @param signature TPM Quote Signature received from IMC
! 292: * @return FALSE if signature is not verified
! 293: */
! 294: bool (*verify_quote_signature)(pts_t *this, hash_algorithm_t digest_alg,
! 295: chunk_t digest, chunk_t signature);
! 296:
! 297: /**
! 298: * Destroys a pts_t object.
! 299: */
! 300: void (*destroy)(pts_t *this);
! 301:
! 302: };
! 303:
! 304: /**
! 305: * Creates an pts_t object
! 306: *
! 307: * @param is_imc TRUE if running on an IMC
! 308: */
! 309: pts_t* pts_create(bool is_imc);
! 310:
! 311: #endif /** PTS_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>