| .. | .. | 
|---|
 | 1 | +/* SPDX-License-Identifier: GPL-2.0-only */  | 
|---|
| 1 | 2 |  /* | 
|---|
| 2 | 3 |   * This file is part of UBIFS. | 
|---|
| 3 | 4 |   * | 
|---|
| 4 | 5 |   * Copyright (C) 2006-2008 Nokia Corporation. | 
|---|
| 5 |  | - *  | 
|---|
| 6 |  | - * This program is free software; you can redistribute it and/or modify it  | 
|---|
| 7 |  | - * under the terms of the GNU General Public License version 2 as published by  | 
|---|
| 8 |  | - * the Free Software Foundation.  | 
|---|
| 9 |  | - *  | 
|---|
| 10 |  | - * This program is distributed in the hope that it will be useful, but WITHOUT  | 
|---|
| 11 |  | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  | 
|---|
| 12 |  | - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  | 
|---|
| 13 |  | - * more details.  | 
|---|
| 14 |  | - *  | 
|---|
| 15 |  | - * You should have received a copy of the GNU General Public License along with  | 
|---|
| 16 |  | - * this program; if not, write to the Free Software Foundation, Inc., 51  | 
|---|
| 17 |  | - * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA  | 
|---|
| 18 | 6 |   * | 
|---|
| 19 | 7 |   * Authors: Artem Bityutskiy (Битюцкий Артём) | 
|---|
| 20 | 8 |   *          Adrian Hunter | 
|---|
| .. | .. | 
|---|
| 286 | 274 |  #define UBIFS_IDX_NODE_SZ  sizeof(struct ubifs_idx_node) | 
|---|
| 287 | 275 |  #define UBIFS_CS_NODE_SZ   sizeof(struct ubifs_cs_node) | 
|---|
| 288 | 276 |  #define UBIFS_ORPH_NODE_SZ sizeof(struct ubifs_orph_node) | 
|---|
 | 277 | +#define UBIFS_AUTH_NODE_SZ sizeof(struct ubifs_auth_node)  | 
|---|
 | 278 | +#define UBIFS_SIG_NODE_SZ  sizeof(struct ubifs_sig_node)  | 
|---|
 | 279 | +  | 
|---|
| 289 | 280 |  /* Extended attribute entry nodes are identical to directory entry nodes */ | 
|---|
| 290 | 281 |  #define UBIFS_XENT_NODE_SZ UBIFS_DENT_NODE_SZ | 
|---|
| 291 | 282 |  /* Only this does not have to be multiple of 8 bytes */ | 
|---|
| .. | .. | 
|---|
| 300 | 291 |  /* The largest UBIFS node */ | 
|---|
| 301 | 292 |  #define UBIFS_MAX_NODE_SZ UBIFS_MAX_INO_NODE_SZ | 
|---|
| 302 | 293 |   | 
|---|
 | 294 | +/* The maxmimum size of a hash, enough for sha512 */  | 
|---|
 | 295 | +#define UBIFS_MAX_HASH_LEN 64  | 
|---|
 | 296 | +  | 
|---|
 | 297 | +/* The maxmimum size of a hmac, enough for hmac(sha512) */  | 
|---|
 | 298 | +#define UBIFS_MAX_HMAC_LEN 64  | 
|---|
 | 299 | +  | 
|---|
| 303 | 300 |  /* | 
|---|
| 304 | 301 |   * xattr name of UBIFS encryption context, we don't use a prefix | 
|---|
| 305 | 302 |   * nor a long name to not waste space on the flash. | 
|---|
| 306 | 303 |   */ | 
|---|
| 307 | 304 |  #define UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT "c" | 
|---|
| 308 | 305 |   | 
|---|
 | 306 | +/* Type field in ubifs_sig_node */  | 
|---|
 | 307 | +#define UBIFS_SIGNATURE_TYPE_PKCS7	1  | 
|---|
| 309 | 308 |   | 
|---|
| 310 | 309 |  /* | 
|---|
| 311 | 310 |   * On-flash inode flags. | 
|---|
| .. | .. | 
|---|
| 341 | 340 |   * UBIFS_COMPR_NONE: no compression | 
|---|
| 342 | 341 |   * UBIFS_COMPR_LZO: LZO compression | 
|---|
| 343 | 342 |   * UBIFS_COMPR_ZLIB: ZLIB compression | 
|---|
 | 343 | + * UBIFS_COMPR_ZSTD: ZSTD compression  | 
|---|
| 344 | 344 |   * UBIFS_COMPR_TYPES_CNT: count of supported compression types | 
|---|
| 345 | 345 |   */ | 
|---|
| 346 | 346 |  enum { | 
|---|
| 347 | 347 |  	UBIFS_COMPR_NONE, | 
|---|
| 348 | 348 |  	UBIFS_COMPR_LZO, | 
|---|
| 349 | 349 |  	UBIFS_COMPR_ZLIB, | 
|---|
 | 350 | +	UBIFS_COMPR_ZSTD,  | 
|---|
| 350 | 351 |  	UBIFS_COMPR_TYPES_CNT, | 
|---|
| 351 | 352 |  }; | 
|---|
| 352 | 353 |   | 
|---|
| .. | .. | 
|---|
| 365 | 366 |   * UBIFS_IDX_NODE: index node | 
|---|
| 366 | 367 |   * UBIFS_CS_NODE: commit start node | 
|---|
| 367 | 368 |   * UBIFS_ORPH_NODE: orphan node | 
|---|
 | 369 | + * UBIFS_AUTH_NODE: authentication node  | 
|---|
 | 370 | + * UBIFS_SIG_NODE: signature node  | 
|---|
| 368 | 371 |   * UBIFS_NODE_TYPES_CNT: count of supported node types | 
|---|
| 369 | 372 |   * | 
|---|
| 370 | 373 |   * Note, we index arrays by these numbers, so keep them low and contiguous. | 
|---|
| .. | .. | 
|---|
| 384 | 387 |  	UBIFS_IDX_NODE, | 
|---|
| 385 | 388 |  	UBIFS_CS_NODE, | 
|---|
| 386 | 389 |  	UBIFS_ORPH_NODE, | 
|---|
 | 390 | +	UBIFS_AUTH_NODE,  | 
|---|
 | 391 | +	UBIFS_SIG_NODE,  | 
|---|
| 387 | 392 |  	UBIFS_NODE_TYPES_CNT, | 
|---|
| 388 | 393 |  }; | 
|---|
| 389 | 394 |   | 
|---|
| .. | .. | 
|---|
| 421 | 426 |   * UBIFS_FLG_DOUBLE_HASH: store a 32bit cookie in directory entry nodes to | 
|---|
| 422 | 427 |   *			  support 64bit cookies for lookups by hash | 
|---|
| 423 | 428 |   * UBIFS_FLG_ENCRYPTION: this filesystem contains encrypted files | 
|---|
 | 429 | + * UBIFS_FLG_AUTHENTICATION: this filesystem contains hashes for authentication  | 
|---|
| 424 | 430 |   */ | 
|---|
| 425 | 431 |  enum { | 
|---|
| 426 | 432 |  	UBIFS_FLG_BIGLPT = 0x02, | 
|---|
| 427 | 433 |  	UBIFS_FLG_SPACE_FIXUP = 0x04, | 
|---|
| 428 | 434 |  	UBIFS_FLG_DOUBLE_HASH = 0x08, | 
|---|
| 429 | 435 |  	UBIFS_FLG_ENCRYPTION = 0x10, | 
|---|
 | 436 | +	UBIFS_FLG_AUTHENTICATION = 0x20,  | 
|---|
| 430 | 437 |  }; | 
|---|
| 431 | 438 |   | 
|---|
| 432 |  | -#define UBIFS_FLG_MASK (UBIFS_FLG_BIGLPT|UBIFS_FLG_SPACE_FIXUP|UBIFS_FLG_DOUBLE_HASH|UBIFS_FLG_ENCRYPTION)  | 
|---|
 | 439 | +#define UBIFS_FLG_MASK (UBIFS_FLG_BIGLPT | UBIFS_FLG_SPACE_FIXUP | \  | 
|---|
 | 440 | +		UBIFS_FLG_DOUBLE_HASH | UBIFS_FLG_ENCRYPTION | \  | 
|---|
 | 441 | +		UBIFS_FLG_AUTHENTICATION)  | 
|---|
| 433 | 442 |   | 
|---|
| 434 | 443 |  /** | 
|---|
| 435 | 444 |   * struct ubifs_ch - common header node. | 
|---|
| .. | .. | 
|---|
| 633 | 642 |   * @time_gran: time granularity in nanoseconds | 
|---|
| 634 | 643 |   * @uuid: UUID generated when the file system image was created | 
|---|
| 635 | 644 |   * @ro_compat_version: UBIFS R/O compatibility version | 
|---|
 | 645 | + * @hmac: HMAC to authenticate the superblock node  | 
|---|
 | 646 | + * @hmac_wkm: HMAC of a well known message (the string "UBIFS") as a convenience  | 
|---|
 | 647 | + *            to the user to check if the correct key is passed.  | 
|---|
 | 648 | + * @hash_algo: The hash algo used for this filesystem (one of enum hash_algo)  | 
|---|
 | 649 | + * @hash_mst: hash of the master node, only valid for signed images in which the  | 
|---|
 | 650 | + *            master node does not contain a hmac  | 
|---|
| 636 | 651 |   */ | 
|---|
| 637 | 652 |  struct ubifs_sb_node { | 
|---|
| 638 | 653 |  	struct ubifs_ch ch; | 
|---|
| .. | .. | 
|---|
| 660 | 675 |  	__le32 time_gran; | 
|---|
| 661 | 676 |  	__u8 uuid[16]; | 
|---|
| 662 | 677 |  	__le32 ro_compat_version; | 
|---|
| 663 |  | -	__u8 padding2[3968];  | 
|---|
 | 678 | +	__u8 hmac[UBIFS_MAX_HMAC_LEN];  | 
|---|
 | 679 | +	__u8 hmac_wkm[UBIFS_MAX_HMAC_LEN];  | 
|---|
 | 680 | +	__le16 hash_algo;  | 
|---|
 | 681 | +	__u8 hash_mst[UBIFS_MAX_HASH_LEN];  | 
|---|
 | 682 | +	__u8 padding2[3774];  | 
|---|
| 664 | 683 |  } __packed; | 
|---|
| 665 | 684 |   | 
|---|
| 666 | 685 |  /** | 
|---|
| .. | .. | 
|---|
| 695 | 714 |   * @empty_lebs: number of empty logical eraseblocks | 
|---|
| 696 | 715 |   * @idx_lebs: number of indexing logical eraseblocks | 
|---|
| 697 | 716 |   * @leb_cnt: count of LEBs used by file-system | 
|---|
 | 717 | + * @hash_root_idx: the hash of the root index node  | 
|---|
 | 718 | + * @hash_lpt: the hash of the LPT  | 
|---|
 | 719 | + * @hmac: HMAC to authenticate the master node  | 
|---|
| 698 | 720 |   * @padding: reserved for future, zeroes | 
|---|
| 699 | 721 |   */ | 
|---|
| 700 | 722 |  struct ubifs_mst_node { | 
|---|
| .. | .. | 
|---|
| 727 | 749 |  	__le32 empty_lebs; | 
|---|
| 728 | 750 |  	__le32 idx_lebs; | 
|---|
| 729 | 751 |  	__le32 leb_cnt; | 
|---|
| 730 |  | -	__u8 padding[344];  | 
|---|
 | 752 | +	__u8 hash_root_idx[UBIFS_MAX_HASH_LEN];  | 
|---|
 | 753 | +	__u8 hash_lpt[UBIFS_MAX_HASH_LEN];  | 
|---|
 | 754 | +	__u8 hmac[UBIFS_MAX_HMAC_LEN];  | 
|---|
 | 755 | +	__u8 padding[152];  | 
|---|
| 731 | 756 |  } __packed; | 
|---|
| 732 | 757 |   | 
|---|
| 733 | 758 |  /** | 
|---|
| .. | .. | 
|---|
| 747 | 772 |  } __packed; | 
|---|
| 748 | 773 |   | 
|---|
| 749 | 774 |  /** | 
|---|
 | 775 | + * struct ubifs_auth_node - node for authenticating other nodes  | 
|---|
 | 776 | + * @ch: common header  | 
|---|
 | 777 | + * @hmac: The HMAC  | 
|---|
 | 778 | + */  | 
|---|
 | 779 | +struct ubifs_auth_node {  | 
|---|
 | 780 | +	struct ubifs_ch ch;  | 
|---|
 | 781 | +	__u8 hmac[];  | 
|---|
 | 782 | +} __packed;  | 
|---|
 | 783 | +  | 
|---|
 | 784 | +/**  | 
|---|
 | 785 | + * struct ubifs_sig_node - node for signing other nodes  | 
|---|
 | 786 | + * @ch: common header  | 
|---|
 | 787 | + * @type: type of the signature, currently only UBIFS_SIGNATURE_TYPE_PKCS7  | 
|---|
 | 788 | + * supported  | 
|---|
 | 789 | + * @len: The length of the signature data  | 
|---|
 | 790 | + * @padding: reserved for future, zeroes  | 
|---|
 | 791 | + * @sig: The signature data  | 
|---|
 | 792 | + */  | 
|---|
 | 793 | +struct ubifs_sig_node {  | 
|---|
 | 794 | +	struct ubifs_ch ch;  | 
|---|
 | 795 | +	__le32 type;  | 
|---|
 | 796 | +	__le32 len;  | 
|---|
 | 797 | +	__u8 padding[32];  | 
|---|
 | 798 | +	__u8 sig[];  | 
|---|
 | 799 | +} __packed;  | 
|---|
 | 800 | +  | 
|---|
 | 801 | +/**  | 
|---|
| 750 | 802 |   * struct ubifs_branch - key/reference/length branch | 
|---|
| 751 | 803 |   * @lnum: LEB number of the target node | 
|---|
| 752 | 804 |   * @offs: offset within @lnum | 
|---|
| 753 | 805 |   * @len: target node length | 
|---|
| 754 | 806 |   * @key: key | 
|---|
 | 807 | + *  | 
|---|
 | 808 | + * In an authenticated UBIFS we have the hash of the referenced node after @key.  | 
|---|
 | 809 | + * This can't be added to the struct type definition because @key is a  | 
|---|
 | 810 | + * dynamically sized element already.  | 
|---|
| 755 | 811 |   */ | 
|---|
| 756 | 812 |  struct ubifs_branch { | 
|---|
| 757 | 813 |  	__le32 lnum; | 
|---|