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};