cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

trusted_tpm1.c (25425B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2010 IBM Corporation
      4 * Copyright (c) 2019-2021, Linaro Limited
      5 *
      6 * See Documentation/security/keys/trusted-encrypted.rst
      7 */
      8
      9#include <crypto/hash_info.h>
     10#include <linux/init.h>
     11#include <linux/slab.h>
     12#include <linux/parser.h>
     13#include <linux/string.h>
     14#include <linux/err.h>
     15#include <keys/trusted-type.h>
     16#include <linux/key-type.h>
     17#include <linux/crypto.h>
     18#include <crypto/hash.h>
     19#include <crypto/sha1.h>
     20#include <linux/tpm.h>
     21#include <linux/tpm_command.h>
     22
     23#include <keys/trusted_tpm.h>
     24
     25static const char hmac_alg[] = "hmac(sha1)";
     26static const char hash_alg[] = "sha1";
     27static struct tpm_chip *chip;
     28static struct tpm_digest *digests;
     29
     30struct sdesc {
     31	struct shash_desc shash;
     32	char ctx[];
     33};
     34
     35static struct crypto_shash *hashalg;
     36static struct crypto_shash *hmacalg;
     37
     38static struct sdesc *init_sdesc(struct crypto_shash *alg)
     39{
     40	struct sdesc *sdesc;
     41	int size;
     42
     43	size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);
     44	sdesc = kmalloc(size, GFP_KERNEL);
     45	if (!sdesc)
     46		return ERR_PTR(-ENOMEM);
     47	sdesc->shash.tfm = alg;
     48	return sdesc;
     49}
     50
     51static int TSS_sha1(const unsigned char *data, unsigned int datalen,
     52		    unsigned char *digest)
     53{
     54	struct sdesc *sdesc;
     55	int ret;
     56
     57	sdesc = init_sdesc(hashalg);
     58	if (IS_ERR(sdesc)) {
     59		pr_info("can't alloc %s\n", hash_alg);
     60		return PTR_ERR(sdesc);
     61	}
     62
     63	ret = crypto_shash_digest(&sdesc->shash, data, datalen, digest);
     64	kfree_sensitive(sdesc);
     65	return ret;
     66}
     67
     68static int TSS_rawhmac(unsigned char *digest, const unsigned char *key,
     69		       unsigned int keylen, ...)
     70{
     71	struct sdesc *sdesc;
     72	va_list argp;
     73	unsigned int dlen;
     74	unsigned char *data;
     75	int ret;
     76
     77	sdesc = init_sdesc(hmacalg);
     78	if (IS_ERR(sdesc)) {
     79		pr_info("can't alloc %s\n", hmac_alg);
     80		return PTR_ERR(sdesc);
     81	}
     82
     83	ret = crypto_shash_setkey(hmacalg, key, keylen);
     84	if (ret < 0)
     85		goto out;
     86	ret = crypto_shash_init(&sdesc->shash);
     87	if (ret < 0)
     88		goto out;
     89
     90	va_start(argp, keylen);
     91	for (;;) {
     92		dlen = va_arg(argp, unsigned int);
     93		if (dlen == 0)
     94			break;
     95		data = va_arg(argp, unsigned char *);
     96		if (data == NULL) {
     97			ret = -EINVAL;
     98			break;
     99		}
    100		ret = crypto_shash_update(&sdesc->shash, data, dlen);
    101		if (ret < 0)
    102			break;
    103	}
    104	va_end(argp);
    105	if (!ret)
    106		ret = crypto_shash_final(&sdesc->shash, digest);
    107out:
    108	kfree_sensitive(sdesc);
    109	return ret;
    110}
    111
    112/*
    113 * calculate authorization info fields to send to TPM
    114 */
    115int TSS_authhmac(unsigned char *digest, const unsigned char *key,
    116			unsigned int keylen, unsigned char *h1,
    117			unsigned char *h2, unsigned int h3, ...)
    118{
    119	unsigned char paramdigest[SHA1_DIGEST_SIZE];
    120	struct sdesc *sdesc;
    121	unsigned int dlen;
    122	unsigned char *data;
    123	unsigned char c;
    124	int ret;
    125	va_list argp;
    126
    127	if (!chip)
    128		return -ENODEV;
    129
    130	sdesc = init_sdesc(hashalg);
    131	if (IS_ERR(sdesc)) {
    132		pr_info("can't alloc %s\n", hash_alg);
    133		return PTR_ERR(sdesc);
    134	}
    135
    136	c = !!h3;
    137	ret = crypto_shash_init(&sdesc->shash);
    138	if (ret < 0)
    139		goto out;
    140	va_start(argp, h3);
    141	for (;;) {
    142		dlen = va_arg(argp, unsigned int);
    143		if (dlen == 0)
    144			break;
    145		data = va_arg(argp, unsigned char *);
    146		if (!data) {
    147			ret = -EINVAL;
    148			break;
    149		}
    150		ret = crypto_shash_update(&sdesc->shash, data, dlen);
    151		if (ret < 0)
    152			break;
    153	}
    154	va_end(argp);
    155	if (!ret)
    156		ret = crypto_shash_final(&sdesc->shash, paramdigest);
    157	if (!ret)
    158		ret = TSS_rawhmac(digest, key, keylen, SHA1_DIGEST_SIZE,
    159				  paramdigest, TPM_NONCE_SIZE, h1,
    160				  TPM_NONCE_SIZE, h2, 1, &c, 0, 0);
    161out:
    162	kfree_sensitive(sdesc);
    163	return ret;
    164}
    165EXPORT_SYMBOL_GPL(TSS_authhmac);
    166
    167/*
    168 * verify the AUTH1_COMMAND (Seal) result from TPM
    169 */
    170int TSS_checkhmac1(unsigned char *buffer,
    171			  const uint32_t command,
    172			  const unsigned char *ononce,
    173			  const unsigned char *key,
    174			  unsigned int keylen, ...)
    175{
    176	uint32_t bufsize;
    177	uint16_t tag;
    178	uint32_t ordinal;
    179	uint32_t result;
    180	unsigned char *enonce;
    181	unsigned char *continueflag;
    182	unsigned char *authdata;
    183	unsigned char testhmac[SHA1_DIGEST_SIZE];
    184	unsigned char paramdigest[SHA1_DIGEST_SIZE];
    185	struct sdesc *sdesc;
    186	unsigned int dlen;
    187	unsigned int dpos;
    188	va_list argp;
    189	int ret;
    190
    191	if (!chip)
    192		return -ENODEV;
    193
    194	bufsize = LOAD32(buffer, TPM_SIZE_OFFSET);
    195	tag = LOAD16(buffer, 0);
    196	ordinal = command;
    197	result = LOAD32N(buffer, TPM_RETURN_OFFSET);
    198	if (tag == TPM_TAG_RSP_COMMAND)
    199		return 0;
    200	if (tag != TPM_TAG_RSP_AUTH1_COMMAND)
    201		return -EINVAL;
    202	authdata = buffer + bufsize - SHA1_DIGEST_SIZE;
    203	continueflag = authdata - 1;
    204	enonce = continueflag - TPM_NONCE_SIZE;
    205
    206	sdesc = init_sdesc(hashalg);
    207	if (IS_ERR(sdesc)) {
    208		pr_info("can't alloc %s\n", hash_alg);
    209		return PTR_ERR(sdesc);
    210	}
    211	ret = crypto_shash_init(&sdesc->shash);
    212	if (ret < 0)
    213		goto out;
    214	ret = crypto_shash_update(&sdesc->shash, (const u8 *)&result,
    215				  sizeof result);
    216	if (ret < 0)
    217		goto out;
    218	ret = crypto_shash_update(&sdesc->shash, (const u8 *)&ordinal,
    219				  sizeof ordinal);
    220	if (ret < 0)
    221		goto out;
    222	va_start(argp, keylen);
    223	for (;;) {
    224		dlen = va_arg(argp, unsigned int);
    225		if (dlen == 0)
    226			break;
    227		dpos = va_arg(argp, unsigned int);
    228		ret = crypto_shash_update(&sdesc->shash, buffer + dpos, dlen);
    229		if (ret < 0)
    230			break;
    231	}
    232	va_end(argp);
    233	if (!ret)
    234		ret = crypto_shash_final(&sdesc->shash, paramdigest);
    235	if (ret < 0)
    236		goto out;
    237
    238	ret = TSS_rawhmac(testhmac, key, keylen, SHA1_DIGEST_SIZE, paramdigest,
    239			  TPM_NONCE_SIZE, enonce, TPM_NONCE_SIZE, ononce,
    240			  1, continueflag, 0, 0);
    241	if (ret < 0)
    242		goto out;
    243
    244	if (memcmp(testhmac, authdata, SHA1_DIGEST_SIZE))
    245		ret = -EINVAL;
    246out:
    247	kfree_sensitive(sdesc);
    248	return ret;
    249}
    250EXPORT_SYMBOL_GPL(TSS_checkhmac1);
    251
    252/*
    253 * verify the AUTH2_COMMAND (unseal) result from TPM
    254 */
    255static int TSS_checkhmac2(unsigned char *buffer,
    256			  const uint32_t command,
    257			  const unsigned char *ononce,
    258			  const unsigned char *key1,
    259			  unsigned int keylen1,
    260			  const unsigned char *key2,
    261			  unsigned int keylen2, ...)
    262{
    263	uint32_t bufsize;
    264	uint16_t tag;
    265	uint32_t ordinal;
    266	uint32_t result;
    267	unsigned char *enonce1;
    268	unsigned char *continueflag1;
    269	unsigned char *authdata1;
    270	unsigned char *enonce2;
    271	unsigned char *continueflag2;
    272	unsigned char *authdata2;
    273	unsigned char testhmac1[SHA1_DIGEST_SIZE];
    274	unsigned char testhmac2[SHA1_DIGEST_SIZE];
    275	unsigned char paramdigest[SHA1_DIGEST_SIZE];
    276	struct sdesc *sdesc;
    277	unsigned int dlen;
    278	unsigned int dpos;
    279	va_list argp;
    280	int ret;
    281
    282	bufsize = LOAD32(buffer, TPM_SIZE_OFFSET);
    283	tag = LOAD16(buffer, 0);
    284	ordinal = command;
    285	result = LOAD32N(buffer, TPM_RETURN_OFFSET);
    286
    287	if (tag == TPM_TAG_RSP_COMMAND)
    288		return 0;
    289	if (tag != TPM_TAG_RSP_AUTH2_COMMAND)
    290		return -EINVAL;
    291	authdata1 = buffer + bufsize - (SHA1_DIGEST_SIZE + 1
    292			+ SHA1_DIGEST_SIZE + SHA1_DIGEST_SIZE);
    293	authdata2 = buffer + bufsize - (SHA1_DIGEST_SIZE);
    294	continueflag1 = authdata1 - 1;
    295	continueflag2 = authdata2 - 1;
    296	enonce1 = continueflag1 - TPM_NONCE_SIZE;
    297	enonce2 = continueflag2 - TPM_NONCE_SIZE;
    298
    299	sdesc = init_sdesc(hashalg);
    300	if (IS_ERR(sdesc)) {
    301		pr_info("can't alloc %s\n", hash_alg);
    302		return PTR_ERR(sdesc);
    303	}
    304	ret = crypto_shash_init(&sdesc->shash);
    305	if (ret < 0)
    306		goto out;
    307	ret = crypto_shash_update(&sdesc->shash, (const u8 *)&result,
    308				  sizeof result);
    309	if (ret < 0)
    310		goto out;
    311	ret = crypto_shash_update(&sdesc->shash, (const u8 *)&ordinal,
    312				  sizeof ordinal);
    313	if (ret < 0)
    314		goto out;
    315
    316	va_start(argp, keylen2);
    317	for (;;) {
    318		dlen = va_arg(argp, unsigned int);
    319		if (dlen == 0)
    320			break;
    321		dpos = va_arg(argp, unsigned int);
    322		ret = crypto_shash_update(&sdesc->shash, buffer + dpos, dlen);
    323		if (ret < 0)
    324			break;
    325	}
    326	va_end(argp);
    327	if (!ret)
    328		ret = crypto_shash_final(&sdesc->shash, paramdigest);
    329	if (ret < 0)
    330		goto out;
    331
    332	ret = TSS_rawhmac(testhmac1, key1, keylen1, SHA1_DIGEST_SIZE,
    333			  paramdigest, TPM_NONCE_SIZE, enonce1,
    334			  TPM_NONCE_SIZE, ononce, 1, continueflag1, 0, 0);
    335	if (ret < 0)
    336		goto out;
    337	if (memcmp(testhmac1, authdata1, SHA1_DIGEST_SIZE)) {
    338		ret = -EINVAL;
    339		goto out;
    340	}
    341	ret = TSS_rawhmac(testhmac2, key2, keylen2, SHA1_DIGEST_SIZE,
    342			  paramdigest, TPM_NONCE_SIZE, enonce2,
    343			  TPM_NONCE_SIZE, ononce, 1, continueflag2, 0, 0);
    344	if (ret < 0)
    345		goto out;
    346	if (memcmp(testhmac2, authdata2, SHA1_DIGEST_SIZE))
    347		ret = -EINVAL;
    348out:
    349	kfree_sensitive(sdesc);
    350	return ret;
    351}
    352
    353/*
    354 * For key specific tpm requests, we will generate and send our
    355 * own TPM command packets using the drivers send function.
    356 */
    357int trusted_tpm_send(unsigned char *cmd, size_t buflen)
    358{
    359	int rc;
    360
    361	if (!chip)
    362		return -ENODEV;
    363
    364	dump_tpm_buf(cmd);
    365	rc = tpm_send(chip, cmd, buflen);
    366	dump_tpm_buf(cmd);
    367	if (rc > 0)
    368		/* Can't return positive return codes values to keyctl */
    369		rc = -EPERM;
    370	return rc;
    371}
    372EXPORT_SYMBOL_GPL(trusted_tpm_send);
    373
    374/*
    375 * Lock a trusted key, by extending a selected PCR.
    376 *
    377 * Prevents a trusted key that is sealed to PCRs from being accessed.
    378 * This uses the tpm driver's extend function.
    379 */
    380static int pcrlock(const int pcrnum)
    381{
    382	if (!capable(CAP_SYS_ADMIN))
    383		return -EPERM;
    384
    385	return tpm_pcr_extend(chip, pcrnum, digests) ? -EINVAL : 0;
    386}
    387
    388/*
    389 * Create an object specific authorisation protocol (OSAP) session
    390 */
    391static int osap(struct tpm_buf *tb, struct osapsess *s,
    392		const unsigned char *key, uint16_t type, uint32_t handle)
    393{
    394	unsigned char enonce[TPM_NONCE_SIZE];
    395	unsigned char ononce[TPM_NONCE_SIZE];
    396	int ret;
    397
    398	ret = tpm_get_random(chip, ononce, TPM_NONCE_SIZE);
    399	if (ret < 0)
    400		return ret;
    401
    402	if (ret != TPM_NONCE_SIZE)
    403		return -EIO;
    404
    405	tpm_buf_reset(tb, TPM_TAG_RQU_COMMAND, TPM_ORD_OSAP);
    406	tpm_buf_append_u16(tb, type);
    407	tpm_buf_append_u32(tb, handle);
    408	tpm_buf_append(tb, ononce, TPM_NONCE_SIZE);
    409
    410	ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE);
    411	if (ret < 0)
    412		return ret;
    413
    414	s->handle = LOAD32(tb->data, TPM_DATA_OFFSET);
    415	memcpy(s->enonce, &(tb->data[TPM_DATA_OFFSET + sizeof(uint32_t)]),
    416	       TPM_NONCE_SIZE);
    417	memcpy(enonce, &(tb->data[TPM_DATA_OFFSET + sizeof(uint32_t) +
    418				  TPM_NONCE_SIZE]), TPM_NONCE_SIZE);
    419	return TSS_rawhmac(s->secret, key, SHA1_DIGEST_SIZE, TPM_NONCE_SIZE,
    420			   enonce, TPM_NONCE_SIZE, ononce, 0, 0);
    421}
    422
    423/*
    424 * Create an object independent authorisation protocol (oiap) session
    425 */
    426int oiap(struct tpm_buf *tb, uint32_t *handle, unsigned char *nonce)
    427{
    428	int ret;
    429
    430	if (!chip)
    431		return -ENODEV;
    432
    433	tpm_buf_reset(tb, TPM_TAG_RQU_COMMAND, TPM_ORD_OIAP);
    434	ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE);
    435	if (ret < 0)
    436		return ret;
    437
    438	*handle = LOAD32(tb->data, TPM_DATA_OFFSET);
    439	memcpy(nonce, &tb->data[TPM_DATA_OFFSET + sizeof(uint32_t)],
    440	       TPM_NONCE_SIZE);
    441	return 0;
    442}
    443EXPORT_SYMBOL_GPL(oiap);
    444
    445struct tpm_digests {
    446	unsigned char encauth[SHA1_DIGEST_SIZE];
    447	unsigned char pubauth[SHA1_DIGEST_SIZE];
    448	unsigned char xorwork[SHA1_DIGEST_SIZE * 2];
    449	unsigned char xorhash[SHA1_DIGEST_SIZE];
    450	unsigned char nonceodd[TPM_NONCE_SIZE];
    451};
    452
    453/*
    454 * Have the TPM seal(encrypt) the trusted key, possibly based on
    455 * Platform Configuration Registers (PCRs). AUTH1 for sealing key.
    456 */
    457static int tpm_seal(struct tpm_buf *tb, uint16_t keytype,
    458		    uint32_t keyhandle, const unsigned char *keyauth,
    459		    const unsigned char *data, uint32_t datalen,
    460		    unsigned char *blob, uint32_t *bloblen,
    461		    const unsigned char *blobauth,
    462		    const unsigned char *pcrinfo, uint32_t pcrinfosize)
    463{
    464	struct osapsess sess;
    465	struct tpm_digests *td;
    466	unsigned char cont;
    467	uint32_t ordinal;
    468	uint32_t pcrsize;
    469	uint32_t datsize;
    470	int sealinfosize;
    471	int encdatasize;
    472	int storedsize;
    473	int ret;
    474	int i;
    475
    476	/* alloc some work space for all the hashes */
    477	td = kmalloc(sizeof *td, GFP_KERNEL);
    478	if (!td)
    479		return -ENOMEM;
    480
    481	/* get session for sealing key */
    482	ret = osap(tb, &sess, keyauth, keytype, keyhandle);
    483	if (ret < 0)
    484		goto out;
    485	dump_sess(&sess);
    486
    487	/* calculate encrypted authorization value */
    488	memcpy(td->xorwork, sess.secret, SHA1_DIGEST_SIZE);
    489	memcpy(td->xorwork + SHA1_DIGEST_SIZE, sess.enonce, SHA1_DIGEST_SIZE);
    490	ret = TSS_sha1(td->xorwork, SHA1_DIGEST_SIZE * 2, td->xorhash);
    491	if (ret < 0)
    492		goto out;
    493
    494	ret = tpm_get_random(chip, td->nonceodd, TPM_NONCE_SIZE);
    495	if (ret < 0)
    496		goto out;
    497
    498	if (ret != TPM_NONCE_SIZE) {
    499		ret = -EIO;
    500		goto out;
    501	}
    502
    503	ordinal = htonl(TPM_ORD_SEAL);
    504	datsize = htonl(datalen);
    505	pcrsize = htonl(pcrinfosize);
    506	cont = 0;
    507
    508	/* encrypt data authorization key */
    509	for (i = 0; i < SHA1_DIGEST_SIZE; ++i)
    510		td->encauth[i] = td->xorhash[i] ^ blobauth[i];
    511
    512	/* calculate authorization HMAC value */
    513	if (pcrinfosize == 0) {
    514		/* no pcr info specified */
    515		ret = TSS_authhmac(td->pubauth, sess.secret, SHA1_DIGEST_SIZE,
    516				   sess.enonce, td->nonceodd, cont,
    517				   sizeof(uint32_t), &ordinal, SHA1_DIGEST_SIZE,
    518				   td->encauth, sizeof(uint32_t), &pcrsize,
    519				   sizeof(uint32_t), &datsize, datalen, data, 0,
    520				   0);
    521	} else {
    522		/* pcr info specified */
    523		ret = TSS_authhmac(td->pubauth, sess.secret, SHA1_DIGEST_SIZE,
    524				   sess.enonce, td->nonceodd, cont,
    525				   sizeof(uint32_t), &ordinal, SHA1_DIGEST_SIZE,
    526				   td->encauth, sizeof(uint32_t), &pcrsize,
    527				   pcrinfosize, pcrinfo, sizeof(uint32_t),
    528				   &datsize, datalen, data, 0, 0);
    529	}
    530	if (ret < 0)
    531		goto out;
    532
    533	/* build and send the TPM request packet */
    534	tpm_buf_reset(tb, TPM_TAG_RQU_AUTH1_COMMAND, TPM_ORD_SEAL);
    535	tpm_buf_append_u32(tb, keyhandle);
    536	tpm_buf_append(tb, td->encauth, SHA1_DIGEST_SIZE);
    537	tpm_buf_append_u32(tb, pcrinfosize);
    538	tpm_buf_append(tb, pcrinfo, pcrinfosize);
    539	tpm_buf_append_u32(tb, datalen);
    540	tpm_buf_append(tb, data, datalen);
    541	tpm_buf_append_u32(tb, sess.handle);
    542	tpm_buf_append(tb, td->nonceodd, TPM_NONCE_SIZE);
    543	tpm_buf_append_u8(tb, cont);
    544	tpm_buf_append(tb, td->pubauth, SHA1_DIGEST_SIZE);
    545
    546	ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE);
    547	if (ret < 0)
    548		goto out;
    549
    550	/* calculate the size of the returned Blob */
    551	sealinfosize = LOAD32(tb->data, TPM_DATA_OFFSET + sizeof(uint32_t));
    552	encdatasize = LOAD32(tb->data, TPM_DATA_OFFSET + sizeof(uint32_t) +
    553			     sizeof(uint32_t) + sealinfosize);
    554	storedsize = sizeof(uint32_t) + sizeof(uint32_t) + sealinfosize +
    555	    sizeof(uint32_t) + encdatasize;
    556
    557	/* check the HMAC in the response */
    558	ret = TSS_checkhmac1(tb->data, ordinal, td->nonceodd, sess.secret,
    559			     SHA1_DIGEST_SIZE, storedsize, TPM_DATA_OFFSET, 0,
    560			     0);
    561
    562	/* copy the returned blob to caller */
    563	if (!ret) {
    564		memcpy(blob, tb->data + TPM_DATA_OFFSET, storedsize);
    565		*bloblen = storedsize;
    566	}
    567out:
    568	kfree_sensitive(td);
    569	return ret;
    570}
    571
    572/*
    573 * use the AUTH2_COMMAND form of unseal, to authorize both key and blob
    574 */
    575static int tpm_unseal(struct tpm_buf *tb,
    576		      uint32_t keyhandle, const unsigned char *keyauth,
    577		      const unsigned char *blob, int bloblen,
    578		      const unsigned char *blobauth,
    579		      unsigned char *data, unsigned int *datalen)
    580{
    581	unsigned char nonceodd[TPM_NONCE_SIZE];
    582	unsigned char enonce1[TPM_NONCE_SIZE];
    583	unsigned char enonce2[TPM_NONCE_SIZE];
    584	unsigned char authdata1[SHA1_DIGEST_SIZE];
    585	unsigned char authdata2[SHA1_DIGEST_SIZE];
    586	uint32_t authhandle1 = 0;
    587	uint32_t authhandle2 = 0;
    588	unsigned char cont = 0;
    589	uint32_t ordinal;
    590	int ret;
    591
    592	/* sessions for unsealing key and data */
    593	ret = oiap(tb, &authhandle1, enonce1);
    594	if (ret < 0) {
    595		pr_info("oiap failed (%d)\n", ret);
    596		return ret;
    597	}
    598	ret = oiap(tb, &authhandle2, enonce2);
    599	if (ret < 0) {
    600		pr_info("oiap failed (%d)\n", ret);
    601		return ret;
    602	}
    603
    604	ordinal = htonl(TPM_ORD_UNSEAL);
    605	ret = tpm_get_random(chip, nonceodd, TPM_NONCE_SIZE);
    606	if (ret < 0)
    607		return ret;
    608
    609	if (ret != TPM_NONCE_SIZE) {
    610		pr_info("tpm_get_random failed (%d)\n", ret);
    611		return -EIO;
    612	}
    613	ret = TSS_authhmac(authdata1, keyauth, TPM_NONCE_SIZE,
    614			   enonce1, nonceodd, cont, sizeof(uint32_t),
    615			   &ordinal, bloblen, blob, 0, 0);
    616	if (ret < 0)
    617		return ret;
    618	ret = TSS_authhmac(authdata2, blobauth, TPM_NONCE_SIZE,
    619			   enonce2, nonceodd, cont, sizeof(uint32_t),
    620			   &ordinal, bloblen, blob, 0, 0);
    621	if (ret < 0)
    622		return ret;
    623
    624	/* build and send TPM request packet */
    625	tpm_buf_reset(tb, TPM_TAG_RQU_AUTH2_COMMAND, TPM_ORD_UNSEAL);
    626	tpm_buf_append_u32(tb, keyhandle);
    627	tpm_buf_append(tb, blob, bloblen);
    628	tpm_buf_append_u32(tb, authhandle1);
    629	tpm_buf_append(tb, nonceodd, TPM_NONCE_SIZE);
    630	tpm_buf_append_u8(tb, cont);
    631	tpm_buf_append(tb, authdata1, SHA1_DIGEST_SIZE);
    632	tpm_buf_append_u32(tb, authhandle2);
    633	tpm_buf_append(tb, nonceodd, TPM_NONCE_SIZE);
    634	tpm_buf_append_u8(tb, cont);
    635	tpm_buf_append(tb, authdata2, SHA1_DIGEST_SIZE);
    636
    637	ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE);
    638	if (ret < 0) {
    639		pr_info("authhmac failed (%d)\n", ret);
    640		return ret;
    641	}
    642
    643	*datalen = LOAD32(tb->data, TPM_DATA_OFFSET);
    644	ret = TSS_checkhmac2(tb->data, ordinal, nonceodd,
    645			     keyauth, SHA1_DIGEST_SIZE,
    646			     blobauth, SHA1_DIGEST_SIZE,
    647			     sizeof(uint32_t), TPM_DATA_OFFSET,
    648			     *datalen, TPM_DATA_OFFSET + sizeof(uint32_t), 0,
    649			     0);
    650	if (ret < 0) {
    651		pr_info("TSS_checkhmac2 failed (%d)\n", ret);
    652		return ret;
    653	}
    654	memcpy(data, tb->data + TPM_DATA_OFFSET + sizeof(uint32_t), *datalen);
    655	return 0;
    656}
    657
    658/*
    659 * Have the TPM seal(encrypt) the symmetric key
    660 */
    661static int key_seal(struct trusted_key_payload *p,
    662		    struct trusted_key_options *o)
    663{
    664	struct tpm_buf tb;
    665	int ret;
    666
    667	ret = tpm_buf_init(&tb, 0, 0);
    668	if (ret)
    669		return ret;
    670
    671	/* include migratable flag at end of sealed key */
    672	p->key[p->key_len] = p->migratable;
    673
    674	ret = tpm_seal(&tb, o->keytype, o->keyhandle, o->keyauth,
    675		       p->key, p->key_len + 1, p->blob, &p->blob_len,
    676		       o->blobauth, o->pcrinfo, o->pcrinfo_len);
    677	if (ret < 0)
    678		pr_info("srkseal failed (%d)\n", ret);
    679
    680	tpm_buf_destroy(&tb);
    681	return ret;
    682}
    683
    684/*
    685 * Have the TPM unseal(decrypt) the symmetric key
    686 */
    687static int key_unseal(struct trusted_key_payload *p,
    688		      struct trusted_key_options *o)
    689{
    690	struct tpm_buf tb;
    691	int ret;
    692
    693	ret = tpm_buf_init(&tb, 0, 0);
    694	if (ret)
    695		return ret;
    696
    697	ret = tpm_unseal(&tb, o->keyhandle, o->keyauth, p->blob, p->blob_len,
    698			 o->blobauth, p->key, &p->key_len);
    699	if (ret < 0)
    700		pr_info("srkunseal failed (%d)\n", ret);
    701	else
    702		/* pull migratable flag out of sealed key */
    703		p->migratable = p->key[--p->key_len];
    704
    705	tpm_buf_destroy(&tb);
    706	return ret;
    707}
    708
    709enum {
    710	Opt_err,
    711	Opt_keyhandle, Opt_keyauth, Opt_blobauth,
    712	Opt_pcrinfo, Opt_pcrlock, Opt_migratable,
    713	Opt_hash,
    714	Opt_policydigest,
    715	Opt_policyhandle,
    716};
    717
    718static const match_table_t key_tokens = {
    719	{Opt_keyhandle, "keyhandle=%s"},
    720	{Opt_keyauth, "keyauth=%s"},
    721	{Opt_blobauth, "blobauth=%s"},
    722	{Opt_pcrinfo, "pcrinfo=%s"},
    723	{Opt_pcrlock, "pcrlock=%s"},
    724	{Opt_migratable, "migratable=%s"},
    725	{Opt_hash, "hash=%s"},
    726	{Opt_policydigest, "policydigest=%s"},
    727	{Opt_policyhandle, "policyhandle=%s"},
    728	{Opt_err, NULL}
    729};
    730
    731/* can have zero or more token= options */
    732static int getoptions(char *c, struct trusted_key_payload *pay,
    733		      struct trusted_key_options *opt)
    734{
    735	substring_t args[MAX_OPT_ARGS];
    736	char *p = c;
    737	int token;
    738	int res;
    739	unsigned long handle;
    740	unsigned long lock;
    741	unsigned long token_mask = 0;
    742	unsigned int digest_len;
    743	int i;
    744	int tpm2;
    745
    746	tpm2 = tpm_is_tpm2(chip);
    747	if (tpm2 < 0)
    748		return tpm2;
    749
    750	opt->hash = tpm2 ? HASH_ALGO_SHA256 : HASH_ALGO_SHA1;
    751
    752	if (!c)
    753		return 0;
    754
    755	while ((p = strsep(&c, " \t"))) {
    756		if (*p == '\0' || *p == ' ' || *p == '\t')
    757			continue;
    758		token = match_token(p, key_tokens, args);
    759		if (test_and_set_bit(token, &token_mask))
    760			return -EINVAL;
    761
    762		switch (token) {
    763		case Opt_pcrinfo:
    764			opt->pcrinfo_len = strlen(args[0].from) / 2;
    765			if (opt->pcrinfo_len > MAX_PCRINFO_SIZE)
    766				return -EINVAL;
    767			res = hex2bin(opt->pcrinfo, args[0].from,
    768				      opt->pcrinfo_len);
    769			if (res < 0)
    770				return -EINVAL;
    771			break;
    772		case Opt_keyhandle:
    773			res = kstrtoul(args[0].from, 16, &handle);
    774			if (res < 0)
    775				return -EINVAL;
    776			opt->keytype = SEAL_keytype;
    777			opt->keyhandle = handle;
    778			break;
    779		case Opt_keyauth:
    780			if (strlen(args[0].from) != 2 * SHA1_DIGEST_SIZE)
    781				return -EINVAL;
    782			res = hex2bin(opt->keyauth, args[0].from,
    783				      SHA1_DIGEST_SIZE);
    784			if (res < 0)
    785				return -EINVAL;
    786			break;
    787		case Opt_blobauth:
    788			/*
    789			 * TPM 1.2 authorizations are sha1 hashes passed in as
    790			 * hex strings.  TPM 2.0 authorizations are simple
    791			 * passwords (although it can take a hash as well)
    792			 */
    793			opt->blobauth_len = strlen(args[0].from);
    794
    795			if (opt->blobauth_len == 2 * TPM_DIGEST_SIZE) {
    796				res = hex2bin(opt->blobauth, args[0].from,
    797					      TPM_DIGEST_SIZE);
    798				if (res < 0)
    799					return -EINVAL;
    800
    801				opt->blobauth_len = TPM_DIGEST_SIZE;
    802				break;
    803			}
    804
    805			if (tpm2 && opt->blobauth_len <= sizeof(opt->blobauth)) {
    806				memcpy(opt->blobauth, args[0].from,
    807				       opt->blobauth_len);
    808				break;
    809			}
    810
    811			return -EINVAL;
    812
    813			break;
    814
    815		case Opt_migratable:
    816			if (*args[0].from == '0')
    817				pay->migratable = 0;
    818			else if (*args[0].from != '1')
    819				return -EINVAL;
    820			break;
    821		case Opt_pcrlock:
    822			res = kstrtoul(args[0].from, 10, &lock);
    823			if (res < 0)
    824				return -EINVAL;
    825			opt->pcrlock = lock;
    826			break;
    827		case Opt_hash:
    828			if (test_bit(Opt_policydigest, &token_mask))
    829				return -EINVAL;
    830			for (i = 0; i < HASH_ALGO__LAST; i++) {
    831				if (!strcmp(args[0].from, hash_algo_name[i])) {
    832					opt->hash = i;
    833					break;
    834				}
    835			}
    836			if (i == HASH_ALGO__LAST)
    837				return -EINVAL;
    838			if  (!tpm2 && i != HASH_ALGO_SHA1) {
    839				pr_info("TPM 1.x only supports SHA-1.\n");
    840				return -EINVAL;
    841			}
    842			break;
    843		case Opt_policydigest:
    844			digest_len = hash_digest_size[opt->hash];
    845			if (!tpm2 || strlen(args[0].from) != (2 * digest_len))
    846				return -EINVAL;
    847			res = hex2bin(opt->policydigest, args[0].from,
    848				      digest_len);
    849			if (res < 0)
    850				return -EINVAL;
    851			opt->policydigest_len = digest_len;
    852			break;
    853		case Opt_policyhandle:
    854			if (!tpm2)
    855				return -EINVAL;
    856			res = kstrtoul(args[0].from, 16, &handle);
    857			if (res < 0)
    858				return -EINVAL;
    859			opt->policyhandle = handle;
    860			break;
    861		default:
    862			return -EINVAL;
    863		}
    864	}
    865	return 0;
    866}
    867
    868static struct trusted_key_options *trusted_options_alloc(void)
    869{
    870	struct trusted_key_options *options;
    871	int tpm2;
    872
    873	tpm2 = tpm_is_tpm2(chip);
    874	if (tpm2 < 0)
    875		return NULL;
    876
    877	options = kzalloc(sizeof *options, GFP_KERNEL);
    878	if (options) {
    879		/* set any non-zero defaults */
    880		options->keytype = SRK_keytype;
    881
    882		if (!tpm2)
    883			options->keyhandle = SRKHANDLE;
    884	}
    885	return options;
    886}
    887
    888static int trusted_tpm_seal(struct trusted_key_payload *p, char *datablob)
    889{
    890	struct trusted_key_options *options = NULL;
    891	int ret = 0;
    892	int tpm2;
    893
    894	tpm2 = tpm_is_tpm2(chip);
    895	if (tpm2 < 0)
    896		return tpm2;
    897
    898	options = trusted_options_alloc();
    899	if (!options)
    900		return -ENOMEM;
    901
    902	ret = getoptions(datablob, p, options);
    903	if (ret < 0)
    904		goto out;
    905	dump_options(options);
    906
    907	if (!options->keyhandle && !tpm2) {
    908		ret = -EINVAL;
    909		goto out;
    910	}
    911
    912	if (tpm2)
    913		ret = tpm2_seal_trusted(chip, p, options);
    914	else
    915		ret = key_seal(p, options);
    916	if (ret < 0) {
    917		pr_info("key_seal failed (%d)\n", ret);
    918		goto out;
    919	}
    920
    921	if (options->pcrlock) {
    922		ret = pcrlock(options->pcrlock);
    923		if (ret < 0) {
    924			pr_info("pcrlock failed (%d)\n", ret);
    925			goto out;
    926		}
    927	}
    928out:
    929	kfree_sensitive(options);
    930	return ret;
    931}
    932
    933static int trusted_tpm_unseal(struct trusted_key_payload *p, char *datablob)
    934{
    935	struct trusted_key_options *options = NULL;
    936	int ret = 0;
    937	int tpm2;
    938
    939	tpm2 = tpm_is_tpm2(chip);
    940	if (tpm2 < 0)
    941		return tpm2;
    942
    943	options = trusted_options_alloc();
    944	if (!options)
    945		return -ENOMEM;
    946
    947	ret = getoptions(datablob, p, options);
    948	if (ret < 0)
    949		goto out;
    950	dump_options(options);
    951
    952	if (!options->keyhandle && !tpm2) {
    953		ret = -EINVAL;
    954		goto out;
    955	}
    956
    957	if (tpm2)
    958		ret = tpm2_unseal_trusted(chip, p, options);
    959	else
    960		ret = key_unseal(p, options);
    961	if (ret < 0)
    962		pr_info("key_unseal failed (%d)\n", ret);
    963
    964	if (options->pcrlock) {
    965		ret = pcrlock(options->pcrlock);
    966		if (ret < 0) {
    967			pr_info("pcrlock failed (%d)\n", ret);
    968			goto out;
    969		}
    970	}
    971out:
    972	kfree_sensitive(options);
    973	return ret;
    974}
    975
    976static int trusted_tpm_get_random(unsigned char *key, size_t key_len)
    977{
    978	return tpm_get_random(chip, key, key_len);
    979}
    980
    981static void trusted_shash_release(void)
    982{
    983	if (hashalg)
    984		crypto_free_shash(hashalg);
    985	if (hmacalg)
    986		crypto_free_shash(hmacalg);
    987}
    988
    989static int __init trusted_shash_alloc(void)
    990{
    991	int ret;
    992
    993	hmacalg = crypto_alloc_shash(hmac_alg, 0, 0);
    994	if (IS_ERR(hmacalg)) {
    995		pr_info("could not allocate crypto %s\n",
    996			hmac_alg);
    997		return PTR_ERR(hmacalg);
    998	}
    999
   1000	hashalg = crypto_alloc_shash(hash_alg, 0, 0);
   1001	if (IS_ERR(hashalg)) {
   1002		pr_info("could not allocate crypto %s\n",
   1003			hash_alg);
   1004		ret = PTR_ERR(hashalg);
   1005		goto hashalg_fail;
   1006	}
   1007
   1008	return 0;
   1009
   1010hashalg_fail:
   1011	crypto_free_shash(hmacalg);
   1012	return ret;
   1013}
   1014
   1015static int __init init_digests(void)
   1016{
   1017	int i;
   1018
   1019	digests = kcalloc(chip->nr_allocated_banks, sizeof(*digests),
   1020			  GFP_KERNEL);
   1021	if (!digests)
   1022		return -ENOMEM;
   1023
   1024	for (i = 0; i < chip->nr_allocated_banks; i++)
   1025		digests[i].alg_id = chip->allocated_banks[i].alg_id;
   1026
   1027	return 0;
   1028}
   1029
   1030static int __init trusted_tpm_init(void)
   1031{
   1032	int ret;
   1033
   1034	chip = tpm_default_chip();
   1035	if (!chip)
   1036		return -ENODEV;
   1037
   1038	ret = init_digests();
   1039	if (ret < 0)
   1040		goto err_put;
   1041	ret = trusted_shash_alloc();
   1042	if (ret < 0)
   1043		goto err_free;
   1044	ret = register_key_type(&key_type_trusted);
   1045	if (ret < 0)
   1046		goto err_release;
   1047	return 0;
   1048err_release:
   1049	trusted_shash_release();
   1050err_free:
   1051	kfree(digests);
   1052err_put:
   1053	put_device(&chip->dev);
   1054	return ret;
   1055}
   1056
   1057static void trusted_tpm_exit(void)
   1058{
   1059	if (chip) {
   1060		put_device(&chip->dev);
   1061		kfree(digests);
   1062		trusted_shash_release();
   1063		unregister_key_type(&key_type_trusted);
   1064	}
   1065}
   1066
   1067struct trusted_key_ops trusted_key_tpm_ops = {
   1068	.migratable = 1, /* migratable by default */
   1069	.init = trusted_tpm_init,
   1070	.seal = trusted_tpm_seal,
   1071	.unseal = trusted_tpm_unseal,
   1072	.get_random = trusted_tpm_get_random,
   1073	.exit = trusted_tpm_exit,
   1074};