static int do_tpm_raw_transfer(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { struct udevice *dev; void *command; uint8_t response[1024]; size_t count, response_length = sizeof(response); uint32_t rc; command = parse_byte_string(argv[1], NULL, &count); if (!command) { printf("Couldn't parse byte string %s\n", argv[1]); return CMD_RET_FAILURE; } rc = get_tpm(&dev); if (rc) return rc; rc = tpm_xfer(dev, command, count, response, &response_length); free(command); if (!rc) { puts("tpm response:\n"); print_byte_string(response, response_length); } return report_return_code(rc); }
static int do_tpm_nv_write_value(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { uint32_t index, rc; size_t count; void *data; if (argc != 3) return CMD_RET_USAGE; index = simple_strtoul(argv[1], NULL, 0); data = parse_byte_string(argv[2], NULL, &count); if (!data) { printf("Couldn't parse byte string %s\n", argv[2]); return CMD_RET_FAILURE; } rc = tpm_nv_write_value(index, data, count); free(data); return convert_return_code(rc); }
static int do_tpm_extend(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { uint32_t index, rc; uint8_t in_digest[20], out_digest[20]; if (argc != 3) return CMD_RET_USAGE; index = simple_strtoul(argv[1], NULL, 0); if (!parse_byte_string(argv[2], in_digest, NULL)) { printf("Couldn't parse byte string %s\n", argv[2]); return CMD_RET_FAILURE; } rc = tpm_extend(index, in_digest, out_digest); if (!rc) { puts("PCR value after execution of the command:\n"); print_byte_string(out_digest, sizeof(out_digest)); } return convert_return_code(rc); }
static int do_tpmutil_raw_transfer(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { void *command; uint8_t response[1024]; size_t count, response_length = sizeof(response); uint32_t rc; command = parse_byte_string(argv[1], NULL, &count); if (!command) { printf("Couldn't parse byte string %s\n", argv[1]); return CMD_RET_FAILURE; } rc = tis_sendrecv(command, count, response, &response_length); free(command); if (!rc) { puts("tpm response:\n"); print_byte_string(response, response_length); } return convert_return_code(rc); }
static int do_tpm_get_pub_key_oiap(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { uint32_t key_handle, err; uint8_t usage_auth[DIGEST_LENGTH]; uint8_t pub_key_buffer[TPM_PUBKEY_MAX_LENGTH]; size_t pub_key_len = sizeof(pub_key_buffer); if (argc < 3) return CMD_RET_USAGE; key_handle = simple_strtoul(argv[1], NULL, 0); if (strlen(argv[2]) != 2 * DIGEST_LENGTH) return CMD_RET_FAILURE; parse_byte_string(argv[2], usage_auth, NULL); err = tpm_get_pub_key_oiap(key_handle, usage_auth, pub_key_buffer, &pub_key_len); if (!err) { printf("dump of received pub key structure:\n"); print_byte_string(pub_key_buffer, pub_key_len); } return convert_return_code(err); }
static int do_tpm_load_key2_oiap(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { uint32_t parent_handle, key_len, key_handle, err; uint8_t usage_auth[DIGEST_LENGTH]; void *key; if (argc < 5) return CMD_RET_USAGE; parent_handle = simple_strtoul(argv[1], NULL, 0); key = (void *)simple_strtoul(argv[2], NULL, 0); key_len = simple_strtoul(argv[3], NULL, 0); if (strlen(argv[4]) != 2 * DIGEST_LENGTH) return CMD_RET_FAILURE; parse_byte_string(argv[4], usage_auth, NULL); err = tpm_load_key2_oiap(parent_handle, key, key_len, usage_auth, &key_handle); if (!err) printf("Key handle is 0x%x\n", key_handle); return convert_return_code(err); }
int main(int argc, char * const argv[]) { int i; int fd; int opt; while ((opt = getopt(argc, argv, "hpw:r:")) != -1) { switch (opt) { case 'h': usage(argv[0]); return 0; case 'p': g_use_pec = 1; break; case 'w': g_has_write = 1; if ((g_n_write = parse_byte_string(optarg)) <= 0) { usage(argv[0]); return -1; } break; case 'r': g_has_read = 1; g_n_read = atoi(optarg); break; default: usage(argv[0]); return -1; } } /* make sure we still have arguments for bus and slave address */ if (optind + 2 != argc) { printf("Bus or slave address is missing\n"); usage(argv[0]); return -1; } g_bus = atoi(argv[optind]); g_slave_addr = strtoul(argv[optind + 1], NULL, 0); if ((g_slave_addr & 0x80)) { printf("Slave address must be 7-bit\n"); return -1; } if (!g_has_write && !g_has_read) { /* by default, read, first byte read is the length */ g_has_read = 1; g_n_read = 0; } printf("Bus: %d\nDevice address: 0x%x\n", g_bus, g_slave_addr); if (g_has_write) { printf("To write %d bytes:", g_n_write); for (i = 0; i < g_n_write; i++) { printf(" 0x%x", g_write_bytes[i]); } printf("\n"); } if (g_has_read) { if (g_n_read) { printf("To read %d bytes.\n", g_n_read); } else { printf("To read data.\n"); } } fd = i2c_open(); if (fd < 0) { return -1; } if (i2c_io(fd) < 0) { return -1; } if (g_has_read) { printf("Received:\n "); if (g_n_read == 0) { g_n_read = g_read_bytes[0] + 1; } for (i = 0; i < g_n_read; i++) { printf(" 0x%x", g_read_bytes[i]); } printf("\n"); } return 0; }