ima_crypto.c 15.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * Copyright (C) 2005,2006,2007,2008 IBM Corporation
 *
 * Authors:
 * Mimi Zohar <zohar@us.ibm.com>
 * Kylene Hall <kjhall@us.ibm.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 2 of the License.
 *
 * File: ima_crypto.c
13
 *	Calculates md5/sha1 file hash, template hash, boot-aggreate hash
14 15
 */

16 17
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

18
#include <linux/kernel.h>
19 20
#include <linux/moduleparam.h>
#include <linux/ratelimit.h>
21 22 23 24
#include <linux/file.h>
#include <linux/crypto.h>
#include <linux/scatterlist.h>
#include <linux/err.h>
25
#include <linux/slab.h>
26
#include <crypto/hash.h>
27

28 29
#include "ima.h"

30 31 32 33 34
/* minimum file size for ahash use */
static unsigned long ima_ahash_minsize;
module_param_named(ahash_minsize, ima_ahash_minsize, ulong, 0644);
MODULE_PARM_DESC(ahash_minsize, "Minimum file size for ahash use");

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
/* default is 0 - 1 page. */
static int ima_maxorder;
static unsigned int ima_bufsize = PAGE_SIZE;

static int param_set_bufsize(const char *val, const struct kernel_param *kp)
{
	unsigned long long size;
	int order;

	size = memparse(val, NULL);
	order = get_order(size);
	if (order >= MAX_ORDER)
		return -EINVAL;
	ima_maxorder = order;
	ima_bufsize = PAGE_SIZE << order;
	return 0;
}

53
static const struct kernel_param_ops param_ops_bufsize = {
54 55 56 57 58 59 60 61
	.set = param_set_bufsize,
	.get = param_get_uint,
};
#define param_check_bufsize(name, p) __param_check(name, p, unsigned int)

module_param_named(ahash_bufsize, ima_bufsize, bufsize, 0644);
MODULE_PARM_DESC(ahash_bufsize, "Maximum ahash buffer size");

62
static struct crypto_shash *ima_shash_tfm;
63
static struct crypto_ahash *ima_ahash_tfm;
64

65
int __init ima_init_crypto(void)
66
{
67
	long rc;
68

69
	ima_shash_tfm = crypto_alloc_shash(hash_algo_name[ima_hash_algo], 0, 0);
70 71
	if (IS_ERR(ima_shash_tfm)) {
		rc = PTR_ERR(ima_shash_tfm);
72 73
		pr_err("Can not allocate %s (reason: %ld)\n",
		       hash_algo_name[ima_hash_algo], rc);
74 75
		return rc;
	}
76 77
	pr_info("Allocated hash algorithm: %s\n",
		hash_algo_name[ima_hash_algo]);
78
	return 0;
79 80
}

81 82 83 84 85
static struct crypto_shash *ima_alloc_tfm(enum hash_algo algo)
{
	struct crypto_shash *tfm = ima_shash_tfm;
	int rc;

86 87 88 89
	if (algo < 0 || algo >= HASH_ALGO__LAST)
		algo = ima_hash_algo;

	if (algo != ima_hash_algo) {
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
		tfm = crypto_alloc_shash(hash_algo_name[algo], 0, 0);
		if (IS_ERR(tfm)) {
			rc = PTR_ERR(tfm);
			pr_err("Can not allocate %s (reason: %d)\n",
			       hash_algo_name[algo], rc);
		}
	}
	return tfm;
}

static void ima_free_tfm(struct crypto_shash *tfm)
{
	if (tfm != ima_shash_tfm)
		crypto_free_shash(tfm);
}

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
/**
 * ima_alloc_pages() - Allocate contiguous pages.
 * @max_size:       Maximum amount of memory to allocate.
 * @allocated_size: Returned size of actual allocation.
 * @last_warn:      Should the min_size allocation warn or not.
 *
 * Tries to do opportunistic allocation for memory first trying to allocate
 * max_size amount of memory and then splitting that until zero order is
 * reached. Allocation is tried without generating allocation warnings unless
 * last_warn is set. Last_warn set affects only last allocation of zero order.
 *
 * By default, ima_maxorder is 0 and it is equivalent to kmalloc(GFP_KERNEL)
 *
 * Return pointer to allocated memory, or NULL on failure.
 */
static void *ima_alloc_pages(loff_t max_size, size_t *allocated_size,
			     int last_warn)
{
	void *ptr;
	int order = ima_maxorder;
126
	gfp_t gfp_mask = __GFP_RECLAIM | __GFP_NOWARN | __GFP_NORETRY;
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167

	if (order)
		order = min(get_order(max_size), order);

	for (; order; order--) {
		ptr = (void *)__get_free_pages(gfp_mask, order);
		if (ptr) {
			*allocated_size = PAGE_SIZE << order;
			return ptr;
		}
	}

	/* order is zero - one page */

	gfp_mask = GFP_KERNEL;

	if (!last_warn)
		gfp_mask |= __GFP_NOWARN;

	ptr = (void *)__get_free_pages(gfp_mask, 0);
	if (ptr) {
		*allocated_size = PAGE_SIZE;
		return ptr;
	}

	*allocated_size = 0;
	return NULL;
}

/**
 * ima_free_pages() - Free pages allocated by ima_alloc_pages().
 * @ptr:  Pointer to allocated pages.
 * @size: Size of allocated buffer.
 */
static void ima_free_pages(void *ptr, size_t size)
{
	if (!ptr)
		return;
	free_pages((unsigned long)ptr, get_order(size));
}

168 169 170 171 172
static struct crypto_ahash *ima_alloc_atfm(enum hash_algo algo)
{
	struct crypto_ahash *tfm = ima_ahash_tfm;
	int rc;

M
Mimi Zohar 已提交
173 174 175 176
	if (algo < 0 || algo >= HASH_ALGO__LAST)
		algo = ima_hash_algo;

	if (algo != ima_hash_algo || !tfm) {
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
		tfm = crypto_alloc_ahash(hash_algo_name[algo], 0, 0);
		if (!IS_ERR(tfm)) {
			if (algo == ima_hash_algo)
				ima_ahash_tfm = tfm;
		} else {
			rc = PTR_ERR(tfm);
			pr_err("Can not allocate %s (reason: %d)\n",
			       hash_algo_name[algo], rc);
		}
	}
	return tfm;
}

static void ima_free_atfm(struct crypto_ahash *tfm)
{
	if (tfm != ima_ahash_tfm)
		crypto_free_ahash(tfm);
}

196
static inline int ahash_wait(int err, struct crypto_wait *wait)
197 198
{

199
	err = crypto_wait_req(err, wait);
200

201
	if (err)
202 203 204 205 206 207 208 209 210 211
		pr_crit_ratelimited("ahash calculation failed: err: %d\n", err);

	return err;
}

static int ima_calc_file_hash_atfm(struct file *file,
				   struct ima_digest_data *hash,
				   struct crypto_ahash *tfm)
{
	loff_t i_size, offset;
212
	char *rbuf[2] = { NULL, };
213
	int rc, rbuf_len, active = 0, ahash_rc = 0;
214 215
	struct ahash_request *req;
	struct scatterlist sg[1];
216
	struct crypto_wait wait;
217
	size_t rbuf_size[2];
218 219 220 221 222 223 224

	hash->length = crypto_ahash_digestsize(tfm);

	req = ahash_request_alloc(tfm, GFP_KERNEL);
	if (!req)
		return -ENOMEM;

225
	crypto_init_wait(&wait);
226 227
	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
				   CRYPTO_TFM_REQ_MAY_SLEEP,
228
				   crypto_req_done, &wait);
229

230
	rc = ahash_wait(crypto_ahash_init(req), &wait);
231 232 233 234 235 236 237 238
	if (rc)
		goto out1;

	i_size = i_size_read(file_inode(file));

	if (i_size == 0)
		goto out2;

239 240 241 242
	/*
	 * Try to allocate maximum size of memory.
	 * Fail if even a single page cannot be allocated.
	 */
243 244
	rbuf[0] = ima_alloc_pages(i_size, &rbuf_size[0], 1);
	if (!rbuf[0]) {
245 246 247 248
		rc = -ENOMEM;
		goto out1;
	}

249 250 251 252 253 254 255 256 257 258 259
	/* Only allocate one buffer if that is enough. */
	if (i_size > rbuf_size[0]) {
		/*
		 * Try to allocate secondary buffer. If that fails fallback to
		 * using single buffering. Use previous memory allocation size
		 * as baseline for possible allocation size.
		 */
		rbuf[1] = ima_alloc_pages(i_size - rbuf_size[0],
					  &rbuf_size[1], 0);
	}

260
	for (offset = 0; offset < i_size; offset += rbuf_len) {
261 262 263 264 265
		if (!rbuf[1] && offset) {
			/* Not using two buffers, and it is not the first
			 * read/request, wait for the completion of the
			 * previous ahash_update() request.
			 */
266
			rc = ahash_wait(ahash_rc, &wait);
267 268 269 270 271
			if (rc)
				goto out3;
		}
		/* read buffer */
		rbuf_len = min_t(loff_t, i_size - offset, rbuf_size[active]);
272 273
		rc = integrity_kernel_read(file, offset, rbuf[active],
					   rbuf_len);
274 275 276
		if (rc != rbuf_len) {
			if (rc >= 0)
				rc = -EINVAL;
277 278 279 280 281
			/*
			 * Forward current rc, do not overwrite with return value
			 * from ahash_wait()
			 */
			ahash_wait(ahash_rc, &wait);
282
			goto out3;
283
		}
284 285 286 287 288 289

		if (rbuf[1] && offset) {
			/* Using two buffers, and it is not the first
			 * read/request, wait for the completion of the
			 * previous ahash_update() request.
			 */
290
			rc = ahash_wait(ahash_rc, &wait);
291 292
			if (rc)
				goto out3;
293 294
		}

295
		sg_init_one(&sg[0], rbuf[active], rbuf_len);
296 297
		ahash_request_set_crypt(req, sg, NULL, rbuf_len);

298 299 300 301
		ahash_rc = crypto_ahash_update(req);

		if (rbuf[1])
			active = !active; /* swap buffers, if we use two */
302
	}
303
	/* wait for the last update request to complete */
304
	rc = ahash_wait(ahash_rc, &wait);
305 306 307
out3:
	ima_free_pages(rbuf[0], rbuf_size[0]);
	ima_free_pages(rbuf[1], rbuf_size[1]);
308 309 310
out2:
	if (!rc) {
		ahash_request_set_crypt(req, NULL, hash->digest, 0);
311
		rc = ahash_wait(crypto_ahash_final(req), &wait);
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
	}
out1:
	ahash_request_free(req);
	return rc;
}

static int ima_calc_file_ahash(struct file *file, struct ima_digest_data *hash)
{
	struct crypto_ahash *tfm;
	int rc;

	tfm = ima_alloc_atfm(hash->algo);
	if (IS_ERR(tfm))
		return PTR_ERR(tfm);

	rc = ima_calc_file_hash_atfm(file, hash, tfm);

	ima_free_atfm(tfm);

	return rc;
}

334 335 336
static int ima_calc_file_hash_tfm(struct file *file,
				  struct ima_digest_data *hash,
				  struct crypto_shash *tfm)
337
{
M
Mimi Zohar 已提交
338
	loff_t i_size, offset = 0;
339
	char *rbuf;
340
	int rc;
341
	SHASH_DESC_ON_STACK(shash, tfm);
342

343 344
	shash->tfm = tfm;
	shash->flags = 0;
345

346 347
	hash->length = crypto_shash_digestsize(tfm);

348
	rc = crypto_shash_init(shash);
349 350 351
	if (rc != 0)
		return rc;

352 353 354
	i_size = i_size_read(file_inode(file));

	if (i_size == 0)
355
		goto out;
356 357 358 359 360

	rbuf = kzalloc(PAGE_SIZE, GFP_KERNEL);
	if (!rbuf)
		return -ENOMEM;

361 362 363
	while (offset < i_size) {
		int rbuf_len;

364
		rbuf_len = integrity_kernel_read(file, offset, rbuf, PAGE_SIZE);
365 366 367 368
		if (rbuf_len < 0) {
			rc = rbuf_len;
			break;
		}
M
Mimi Zohar 已提交
369 370
		if (rbuf_len == 0)
			break;
371 372
		offset += rbuf_len;

373
		rc = crypto_shash_update(shash, rbuf, rbuf_len);
374 375 376
		if (rc)
			break;
	}
377
	kfree(rbuf);
378
out:
379
	if (!rc)
380
		rc = crypto_shash_final(shash, hash->digest);
381 382 383
	return rc;
}

384
static int ima_calc_file_shash(struct file *file, struct ima_digest_data *hash)
385
{
386
	struct crypto_shash *tfm;
387 388
	int rc;

389 390 391
	tfm = ima_alloc_tfm(hash->algo);
	if (IS_ERR(tfm))
		return PTR_ERR(tfm);
392 393 394

	rc = ima_calc_file_hash_tfm(file, hash, tfm);

395
	ima_free_tfm(tfm);
396 397 398 399

	return rc;
}

400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
/*
 * ima_calc_file_hash - calculate file hash
 *
 * Asynchronous hash (ahash) allows using HW acceleration for calculating
 * a hash. ahash performance varies for different data sizes on different
 * crypto accelerators. shash performance might be better for smaller files.
 * The 'ima.ahash_minsize' module parameter allows specifying the best
 * minimum file size for using ahash on the system.
 *
 * If the ima.ahash_minsize parameter is not specified, this function uses
 * shash for the hash calculation.  If ahash fails, it falls back to using
 * shash.
 */
int ima_calc_file_hash(struct file *file, struct ima_digest_data *hash)
{
	loff_t i_size;
	int rc;
417 418
	struct file *f = file;
	bool new_file_instance = false, modified_flags = false;
419

420 421 422 423 424 425 426 427 428 429
	/*
	 * For consistency, fail file's opened with the O_DIRECT flag on
	 * filesystems mounted with/without DAX option.
	 */
	if (file->f_flags & O_DIRECT) {
		hash->length = hash_digest_size[ima_hash_algo];
		hash->algo = ima_hash_algo;
		return -EINVAL;
	}

430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
	/* Open a new file instance in O_RDONLY if we cannot read */
	if (!(file->f_mode & FMODE_READ)) {
		int flags = file->f_flags & ~(O_WRONLY | O_APPEND |
				O_TRUNC | O_CREAT | O_NOCTTY | O_EXCL);
		flags |= O_RDONLY;
		f = dentry_open(&file->f_path, flags, file->f_cred);
		if (IS_ERR(f)) {
			/*
			 * Cannot open the file again, lets modify f_flags
			 * of original and continue
			 */
			pr_info_ratelimited("Unable to reopen file for reading.\n");
			f = file;
			f->f_flags |= FMODE_READ;
			modified_flags = true;
		} else {
			new_file_instance = true;
		}
	}

	i_size = i_size_read(file_inode(f));
451 452

	if (ima_ahash_minsize && i_size >= ima_ahash_minsize) {
453
		rc = ima_calc_file_ahash(f, hash);
454
		if (!rc)
455
			goto out;
456 457
	}

458 459 460 461 462 463 464
	rc = ima_calc_file_shash(f, hash);
out:
	if (new_file_instance)
		fput(f);
	else if (modified_flags)
		f->f_flags &= ~FMODE_READ;
	return rc;
465 466
}

467
/*
468
 * Calculate the hash of template data
469
 */
470
static int ima_calc_field_array_hash_tfm(struct ima_field_data *field_data,
471
					 struct ima_template_desc *td,
472 473 474
					 int num_fields,
					 struct ima_digest_data *hash,
					 struct crypto_shash *tfm)
475
{
476
	SHASH_DESC_ON_STACK(shash, tfm);
477
	int rc, i;
478

479 480
	shash->tfm = tfm;
	shash->flags = 0;
481

482
	hash->length = crypto_shash_digestsize(tfm);
483

484
	rc = crypto_shash_init(shash);
485 486 487 488
	if (rc != 0)
		return rc;

	for (i = 0; i < num_fields; i++) {
489 490 491
		u8 buffer[IMA_EVENT_NAME_LEN_MAX + 1] = { 0 };
		u8 *data_to_hash = field_data[i].data;
		u32 datalen = field_data[i].len;
492 493
		u32 datalen_to_hash =
		    !ima_canonical_fmt ? datalen : cpu_to_le32(datalen);
494

495
		if (strcmp(td->name, IMA_TEMPLATE_IMA_NAME) != 0) {
496
			rc = crypto_shash_update(shash,
497 498
						(const u8 *) &datalen_to_hash,
						sizeof(datalen_to_hash));
499 500
			if (rc)
				break;
501 502 503 504
		} else if (strcmp(td->fields[i]->field_id, "n") == 0) {
			memcpy(buffer, data_to_hash, datalen);
			data_to_hash = buffer;
			datalen = IMA_EVENT_NAME_LEN_MAX + 1;
505
		}
506
		rc = crypto_shash_update(shash, data_to_hash, datalen);
507 508 509 510 511
		if (rc)
			break;
	}

	if (!rc)
512
		rc = crypto_shash_final(shash, hash->digest);
513 514

	return rc;
515 516
}

517 518
int ima_calc_field_array_hash(struct ima_field_data *field_data,
			      struct ima_template_desc *desc, int num_fields,
519
			      struct ima_digest_data *hash)
520 521 522 523 524 525 526 527
{
	struct crypto_shash *tfm;
	int rc;

	tfm = ima_alloc_tfm(hash->algo);
	if (IS_ERR(tfm))
		return PTR_ERR(tfm);

528 529
	rc = ima_calc_field_array_hash_tfm(field_data, desc, num_fields,
					   hash, tfm);
530 531 532 533 534 535

	ima_free_tfm(tfm);

	return rc;
}

536 537 538 539 540 541
static int calc_buffer_ahash_atfm(const void *buf, loff_t len,
				  struct ima_digest_data *hash,
				  struct crypto_ahash *tfm)
{
	struct ahash_request *req;
	struct scatterlist sg;
542
	struct crypto_wait wait;
543 544 545 546 547 548 549 550
	int rc, ahash_rc = 0;

	hash->length = crypto_ahash_digestsize(tfm);

	req = ahash_request_alloc(tfm, GFP_KERNEL);
	if (!req)
		return -ENOMEM;

551
	crypto_init_wait(&wait);
552 553
	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
				   CRYPTO_TFM_REQ_MAY_SLEEP,
554
				   crypto_req_done, &wait);
555

556
	rc = ahash_wait(crypto_ahash_init(req), &wait);
557 558 559 560 561 562 563 564 565
	if (rc)
		goto out;

	sg_init_one(&sg, buf, len);
	ahash_request_set_crypt(req, &sg, NULL, len);

	ahash_rc = crypto_ahash_update(req);

	/* wait for the update request to complete */
566
	rc = ahash_wait(ahash_rc, &wait);
567 568
	if (!rc) {
		ahash_request_set_crypt(req, NULL, hash->digest, 0);
569
		rc = ahash_wait(crypto_ahash_final(req), &wait);
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592
	}
out:
	ahash_request_free(req);
	return rc;
}

static int calc_buffer_ahash(const void *buf, loff_t len,
			     struct ima_digest_data *hash)
{
	struct crypto_ahash *tfm;
	int rc;

	tfm = ima_alloc_atfm(hash->algo);
	if (IS_ERR(tfm))
		return PTR_ERR(tfm);

	rc = calc_buffer_ahash_atfm(buf, len, hash, tfm);

	ima_free_atfm(tfm);

	return rc;
}

593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
static int calc_buffer_shash_tfm(const void *buf, loff_t size,
				struct ima_digest_data *hash,
				struct crypto_shash *tfm)
{
	SHASH_DESC_ON_STACK(shash, tfm);
	unsigned int len;
	int rc;

	shash->tfm = tfm;
	shash->flags = 0;

	hash->length = crypto_shash_digestsize(tfm);

	rc = crypto_shash_init(shash);
	if (rc != 0)
		return rc;

	while (size) {
		len = size < PAGE_SIZE ? size : PAGE_SIZE;
		rc = crypto_shash_update(shash, buf, len);
		if (rc)
			break;
		buf += len;
		size -= len;
	}

	if (!rc)
		rc = crypto_shash_final(shash, hash->digest);
	return rc;
}

624 625
static int calc_buffer_shash(const void *buf, loff_t len,
			     struct ima_digest_data *hash)
626 627 628 629 630 631 632 633 634 635 636 637 638 639
{
	struct crypto_shash *tfm;
	int rc;

	tfm = ima_alloc_tfm(hash->algo);
	if (IS_ERR(tfm))
		return PTR_ERR(tfm);

	rc = calc_buffer_shash_tfm(buf, len, hash, tfm);

	ima_free_tfm(tfm);
	return rc;
}

640 641 642 643 644 645 646 647 648 649 650 651 652 653
int ima_calc_buffer_hash(const void *buf, loff_t len,
			 struct ima_digest_data *hash)
{
	int rc;

	if (ima_ahash_minsize && len >= ima_ahash_minsize) {
		rc = calc_buffer_ahash(buf, len, hash);
		if (!rc)
			return 0;
	}

	return calc_buffer_shash(buf, len, hash);
}

654
static void __init ima_pcrread(int idx, u8 *pcr)
655
{
656
	if (!ima_tpm_chip)
657 658
		return;

659
	if (tpm_pcr_read(ima_tpm_chip, idx, pcr) != 0)
660
		pr_err("Error Communicating to TPM chip\n");
661 662 663 664 665
}

/*
 * Calculate the boot aggregate hash
 */
666 667
static int __init ima_calc_boot_aggregate_tfm(char *digest,
					      struct crypto_shash *tfm)
668
{
669
	u8 pcr_i[TPM_DIGEST_SIZE];
670
	int rc, i;
671
	SHASH_DESC_ON_STACK(shash, tfm);
672

673 674
	shash->tfm = tfm;
	shash->flags = 0;
675

676
	rc = crypto_shash_init(shash);
677 678 679 680 681 682 683
	if (rc != 0)
		return rc;

	/* cumulative sha1 over tpm registers 0-7 */
	for (i = TPM_PCR0; i < TPM_PCR8; i++) {
		ima_pcrread(i, pcr_i);
		/* now accumulate with current aggregate */
684
		rc = crypto_shash_update(shash, pcr_i, TPM_DIGEST_SIZE);
685 686
	}
	if (!rc)
687
		crypto_shash_final(shash, digest);
688 689
	return rc;
}
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706

int __init ima_calc_boot_aggregate(struct ima_digest_data *hash)
{
	struct crypto_shash *tfm;
	int rc;

	tfm = ima_alloc_tfm(hash->algo);
	if (IS_ERR(tfm))
		return PTR_ERR(tfm);

	hash->length = crypto_shash_digestsize(tfm);
	rc = ima_calc_boot_aggregate_tfm(hash->digest, tfm);

	ima_free_tfm(tfm);

	return rc;
}