static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, char *buf) { struct tpm_buf tpm_buf; struct tpm_readpubek_out *out; ssize_t rc; int i; char *str = buf; struct tpm_chip *chip = to_tpm_chip(dev); char anti_replay[20]; memset(&anti_replay, 0, sizeof(anti_replay)); rc = tpm_buf_init(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK); if (rc) return rc; tpm_buf_append(&tpm_buf, anti_replay, sizeof(anti_replay)); rc = tpm_transmit_cmd(chip, NULL, tpm_buf.data, PAGE_SIZE, READ_PUBEK_RESULT_MIN_BODY_SIZE, 0, "attempting to read the PUBEK"); if (rc) { tpm_buf_destroy(&tpm_buf); return 0; } out = (struct tpm_readpubek_out *)&tpm_buf.data[10]; str += sprintf(str, "Algorithm: %02X %02X %02X %02X\n" "Encscheme: %02X %02X\n" "Sigscheme: %02X %02X\n" "Parameters: %02X %02X %02X %02X " "%02X %02X %02X %02X " "%02X %02X %02X %02X\n" "Modulus length: %d\n" "Modulus:\n", out->algorithm[0], out->algorithm[1], out->algorithm[2], out->algorithm[3], out->encscheme[0], out->encscheme[1], out->sigscheme[0], out->sigscheme[1], out->parameters[0], out->parameters[1], out->parameters[2], out->parameters[3], out->parameters[4], out->parameters[5], out->parameters[6], out->parameters[7], out->parameters[8], out->parameters[9], out->parameters[10], out->parameters[11], be32_to_cpu(out->keysize)); for (i = 0; i < 256; i++) { str += sprintf(str, "%02X ", out->modulus[i]); if ((i + 1) % 16 == 0) str += sprintf(str, "\n"); } rc = str - buf; tpm_buf_destroy(&tpm_buf); return rc; }
/** * tpm_send - send a TPM command * @chip: a &struct tpm_chip instance, %NULL for the default chip * @cmd: a TPM command buffer * @buflen: the length of the TPM command buffer * * Return: same as with tpm_transmit_cmd() */ int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen) { struct tpm_buf buf; int rc; chip = tpm_find_get_ops(chip); if (!chip) return -ENODEV; rc = tpm_buf_init(&buf, 0, 0); if (rc) goto out; memcpy(buf.data, cmd, buflen); rc = tpm_transmit_cmd(chip, &buf, 0, "attempting to a send a command"); tpm_buf_destroy(&buf); out: tpm_put_ops(chip); return rc; }
static int vtpm_proxy_request_locality(struct tpm_chip *chip, int locality) { struct tpm_buf buf; int rc; const struct tpm_output_header *header; struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); if (chip->flags & TPM_CHIP_FLAG_TPM2) rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_SET_LOCALITY); else rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SET_LOCALITY); if (rc) return rc; tpm_buf_append_u8(&buf, locality); proxy_dev->state |= STATE_DRIVER_COMMAND; rc = tpm_transmit_cmd(chip, NULL, buf.data, tpm_buf_length(&buf), 0, TPM_TRANSMIT_UNLOCKED | TPM_TRANSMIT_RAW, "attempting to set locality"); proxy_dev->state &= ~STATE_DRIVER_COMMAND; if (rc < 0) { locality = rc; goto out; } header = (const struct tpm_output_header *)buf.data; rc = be32_to_cpu(header->return_code); if (rc) locality = -1; out: tpm_buf_destroy(&buf); return locality; }