Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp768220imm; Wed, 4 Jul 2018 05:46:27 -0700 (PDT) X-Google-Smtp-Source: AAOMgpeu9Z21y48KWezFtGzm6tV52sjLxUmRN0noNu9dyfP2JJ0TB13jRfu4IxA/Gdf8ld102f2r X-Received: by 2002:a62:4898:: with SMTP id q24-v6mr2048602pfi.58.1530708386948; Wed, 04 Jul 2018 05:46:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530708386; cv=none; d=google.com; s=arc-20160816; b=zPRqabXpBYVUZbC8IsvQau5vSfP292UexgBf9dRqgldo3lKDzZ+I0U0dDbK7oslkNS 2LonBtugeD11sFruOA/rengQ3AidnqVD7Q9YfHAu3O4oR6UIT+5/uknftqY+GKQNnXu2 LwnVmPXHo28wbupjYTtHUSoDXx01uv+/CZKMT1Kf53aSjf6zS9gmWpAczMVraoSOk3sG EU4Fvy9+z29yB20OYXppaGazJ60IBbw2DjKiLGj1ABLUtsj/T1HXnAMr+kNU9HfOoYzg S5nDU6zrSO711zAjyh859p0mGW2GtxmQ3elVkZoqu0ununKvOtRoQTs8hvQAZyGv+XSW 1PQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=vsqwLRE2o2/tEbGa/Eu9+muB3M0hSOOMBj1aHMZrKL4=; b=L/WKcSO/SYD5pq3bJDh6NojXm3544oY8mJiXuWseeJ0lzCFFiWXrV5mEOop/pkl1G7 FCwzxzlArN/xO+M4wPfvW+wl7IHVikbWIeb4DNPJPseJ/6vpuBss9FBRPQojpw1GJJmX bPiK/f2n9HxPwOia6p3+Wi6ItCuhw7oa8CiQjbW7hWeavxTCg9DbAghyn/lZCL9mQZs6 mZ6XjPExsSz9hhAjTcWqrPXWXe4oDgkzgf87gL3q5h+qc8tmxGn5p4HCRrNjgYhb3NiV HfLTBa1+UYH6KBLBxNlj2fsFSWbvY1Ir3qELOnx4n3oDj/G58o2S8lMThZ8eAu5m8F0e P0rw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id cf13-v6si3534299plb.175.2018.07.04.05.46.12; Wed, 04 Jul 2018 05:46:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964823AbeGDMn3 (ORCPT + 99 others); Wed, 4 Jul 2018 08:43:29 -0400 Received: from metis.ext.pengutronix.de ([85.220.165.71]:41447 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934726AbeGDMm0 (ORCPT ); Wed, 4 Jul 2018 08:42:26 -0400 Received: from dude.hi.pengutronix.de ([2001:67c:670:100:1d::7]) by metis.ext.pengutronix.de with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1fah6m-0001df-Rk; Wed, 04 Jul 2018 14:42:08 +0200 Received: from sha by dude.hi.pengutronix.de with local (Exim 4.91) (envelope-from ) id 1fah6l-0005bM-Oq; Wed, 04 Jul 2018 14:42:07 +0200 From: Sascha Hauer To: linux-mtd@lists.infradead.org Cc: David Gstir , Richard Weinberger , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Sascha Hauer Subject: [PATCH 23/25] ubifs: Enable authentication support Date: Wed, 4 Jul 2018 14:41:35 +0200 Message-Id: <20180704124137.13396-24-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180704124137.13396-1-s.hauer@pengutronix.de> References: <20180704124137.13396-1-s.hauer@pengutronix.de> X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With the preparations all being done this patch now enables authentication support for UBIFS. Authentication is enabled when the newly introduced auth_key and auth_hash_name mount options are passed. auth_key provides the key which is used for authentication whereas auth_hash_name provides the hashing algorithm used for this FS. Passing these options make authentication mandatory and only UBIFS images that can be authenticated with the given key are allowed. Signed-off-by: Sascha Hauer --- Documentation/filesystems/ubifs.txt | 7 ++++++ fs/ubifs/Kconfig | 10 ++++++++ fs/ubifs/super.c | 36 ++++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/Documentation/filesystems/ubifs.txt b/Documentation/filesystems/ubifs.txt index a0a61d2f389f..acc80442a3bb 100644 --- a/Documentation/filesystems/ubifs.txt +++ b/Documentation/filesystems/ubifs.txt @@ -91,6 +91,13 @@ chk_data_crc do not skip checking CRCs on data nodes compr=none override default compressor and set it to "none" compr=lzo override default compressor and set it to "lzo" compr=zlib override default compressor and set it to "zlib" +auth_key= specify the key used for authenticating the filesystem. + Passing this option makes authentication mandatory. + The passed key must be present in the kernel keyring + and must be of type 'logon' +auth_hash_name= The hash algorithm used for authentication. Used for + both hashing and for creating HMACs. Typical values + include "sha256" or "sha512" Quick usage instructions diff --git a/fs/ubifs/Kconfig b/fs/ubifs/Kconfig index 2a0b5f1134a4..9da1e7c21b7f 100644 --- a/fs/ubifs/Kconfig +++ b/fs/ubifs/Kconfig @@ -75,3 +75,13 @@ config UBIFS_FS_SECURITY the extended attribute support in advance. If you are not using a security module, say N. + +config UBIFS_FS_AUTHENTICATION + bool "UBIFS authentication support" + select CRYPTO_HMAC + help + Enable authentication support for UBIFS. This feature offers protection + against offline changes for both data and metadata of the filesystem. + If you say yes here you should also select a hashing algorithm such as + sha256, these are not selected automatically since there are many + different options. diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index de7bf613addc..b2ccd2d7ce4d 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -577,7 +577,9 @@ static int init_constants_early(struct ubifs_info *c) c->ranges[UBIFS_REF_NODE].len = UBIFS_REF_NODE_SZ; c->ranges[UBIFS_TRUN_NODE].len = UBIFS_TRUN_NODE_SZ; c->ranges[UBIFS_CS_NODE].len = UBIFS_CS_NODE_SZ; - c->ranges[UBIFS_AUTH_NODE].len = UBIFS_AUTH_NODE_SZ; + c->ranges[UBIFS_AUTH_NODE].min_len = UBIFS_AUTH_NODE_SZ; + c->ranges[UBIFS_AUTH_NODE].max_len = UBIFS_AUTH_NODE_SZ + + UBIFS_MAX_HMAC_LEN; c->ranges[UBIFS_INO_NODE].min_len = UBIFS_INO_NODE_SZ; c->ranges[UBIFS_INO_NODE].max_len = UBIFS_MAX_INO_NODE_SZ; @@ -932,6 +934,8 @@ static int check_volume_empty(struct ubifs_info *c) * Opt_chk_data_crc: check CRCs when reading data nodes * Opt_no_chk_data_crc: do not check CRCs when reading data nodes * Opt_override_compr: override default compressor + * Opt_auth_key: The key name used for authentication + * Opt_auth_hash_name: The hash type used for authentication * Opt_err: just end of array marker */ enum { @@ -942,6 +946,8 @@ enum { Opt_chk_data_crc, Opt_no_chk_data_crc, Opt_override_compr, + Opt_auth_key, + Opt_auth_hash_name, Opt_ignore, Opt_err, }; @@ -954,6 +960,8 @@ static const match_table_t tokens = { {Opt_chk_data_crc, "chk_data_crc"}, {Opt_no_chk_data_crc, "no_chk_data_crc"}, {Opt_override_compr, "compr=%s"}, + {Opt_auth_key, "auth_key=%s"}, + {Opt_auth_hash_name, "auth_hash_name=%s"}, {Opt_ignore, "ubi=%s"}, {Opt_ignore, "vol=%s"}, {Opt_err, NULL}, @@ -1056,6 +1064,16 @@ static int ubifs_parse_options(struct ubifs_info *c, char *options, c->default_compr = c->mount_opts.compr_type; break; } + case Opt_auth_key: + c->auth_key_name = kstrdup(args[0].from, GFP_KERNEL); + if (!c->auth_key_name) + return -ENOMEM; + break; + case Opt_auth_hash_name: + c->auth_hash_name = kstrdup(args[0].from, GFP_KERNEL); + if (!c->auth_hash_name) + return -ENOMEM; + break; case Opt_ignore: break; default: @@ -1235,6 +1253,19 @@ static int mount_ubifs(struct ubifs_info *c) c->mounting = 1; + if (c->auth_key_name) { + if (IS_ENABLED(CONFIG_UBIFS_FS_AUTHENTICATION)) { + err = ubifs_init_authentication(c); + if (err) + goto out_free; + } else { + ubifs_err(c, "auth_key_name, but UBIFS is built without" + " authentication support"); + err = -EINVAL; + goto out_free; + } + } + err = ubifs_read_superblock(c); if (err) goto out_free; @@ -1552,7 +1583,10 @@ static void ubifs_umount(struct ubifs_info *c) free_wbufs(c); free_orphans(c); ubifs_lpt_free(c, 0); + ubifs_exit_authentication(c); + kfree(c->auth_key_name); + kfree(c->auth_hash_name); kfree(c->cbuf); kfree(c->rcvrd_mst_node); kfree(c->mst_node); -- 2.18.0