From: "Lee, Chun-Yi" <joeyli.kernel@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: linux-security-module@vger.kernel.org, linux-efi@vger.kernel.org,
linux-pm@vger.kernel.org, linux-crypto@vger.kernel.org,
opensuse-kernel@opensuse.org, David Howells <dhowells@redhat.com>,
"Rafael J. Wysocki" <rjw@sisk.pl>,
Matthew Garrett <mjg59@srcf.ucam.org>,
Len Brown <len.brown@intel.com>, Pavel Machek <pavel@ucw.cz>,
Josh Boyer <jwboyer@redhat.com>, Vojtech Pavlik <vojtech@suse.cz>,
Matt Fleming <matt.fleming@intel.com>,
James Bottomley <james.bottomley@hansenpartnership.com>,
Greg KH <gregkh@linuxfoundation.org>,
JKosina@suse.com, Rusty Russell <rusty@rustcorp.com.au>,
Herbert Xu <herbert@gondor.apana.org.au>,
"David S. Miller" <davem@davemloft.net>,
"H. Peter Anvin" <hpa@zytor.com>, Michal Marek <mmarek@suse.cz>,
Gary Lin <GLin@suse.com>, Vivek Goyal <vgoyal@redhat.com>,
"Lee, Chun-Yi" <jlee@suse.com>
Subject: [PATCH 18/18] Hibernate: notify bootloader regenerate key-pair for snapshot verification
Date: Thu, 22 Aug 2013 19:01:57 +0800 [thread overview]
Message-ID: <1377169317-5959-19-git-send-email-jlee@suse.com> (raw)
In-Reply-To: <1377169317-5959-1-git-send-email-jlee@suse.com>
This patch introduced SNAPSHOT_REGEN_KEYS kernel config, enable this
option let kernel notify booloader (e.g. shim) to regenerate key-pair of
snapshot verification for each hibernate.
Kernel loaded S4 sign key in efi stub, so the private key forward from
efi bootloader to kernel in UEFI secure environment. Regenerate key-pair
for each hibernate will gain more security but it hurt the lifetime of
EFI flash memory.
Kernel write an non-volatile runtime efi variable, the name is
GenS4Key-fe141863-c070-478e-b8a3-878a5dc9ef21, to notify efi bootloader
regenerate key-pair for next hibernate cycle.
Userland hibernate tool can write GenS4Key at runtime, kernel will
respect the value but not overwrite it when S4. This mechanism let
userland tool can also notify bootloader to regenerate key-pair through
GenS4Key flag.
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
Signed-off-by: Lee, Chun-Yi <jlee@suse.com>
---
kernel/power/Kconfig | 15 +++++++++++++++
kernel/power/hibernate_keys.c | 39 +++++++++++++++++++++++++++++++++++++++
kernel/power/power.h | 2 ++
kernel/power/snapshot.c | 3 +++
4 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index 79b34fa..63bda98 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -78,6 +78,21 @@ config SNAPSHOT_VERIFICATION
dependent on UEFI environment. EFI bootloader should generate the
key-pair.
+config SNAPSHOT_REGEN_KEYS
+ bool "Regenerate key-pair for each snapshot verification"
+ depends on SNAPSHOT_VERIFICATION
+ help
+ Enabled this option let kernel notify booloader (e.g. shim) to
+ regenerate key-pair of snapshot verification for each hibernate.
+ Linux kernel write an non-volatile runtime EFI variable, the name
+ is GenS4Key-fe141863-c070-478e-b8a3-878a5dc9ef21, to notify EFI
+ bootloader regenerate key-pair for next hibernate cycle.
+
+ Userland hibernate tool can write GenS4Key at runtime then kernel
+ will respect the value but not overwrite it when S4. This mechanism
+ let userland tool can also notify bootloader to regenerate key-pair
+ through GenS4Key flag.
+
choice
prompt "Which hash algorithm should snapshot be signed with?"
depends on SNAPSHOT_VERIFICATION
diff --git a/kernel/power/hibernate_keys.c b/kernel/power/hibernate_keys.c
index 1bc5976..60d3e73 100644
--- a/kernel/power/hibernate_keys.c
+++ b/kernel/power/hibernate_keys.c
@@ -7,6 +7,8 @@
#include "power.h"
+static efi_char16_t efi_gens4key_name[9] = { 'G', 'e', 'n', 'S', '4', 'K', 'e', 'y', 0 };
+
static void *skey_data;
static void *skey_data_buf;
static unsigned long skey_dsize;
@@ -273,6 +275,42 @@ size_t get_key_length(const struct key *key)
return len;
}
+void set_key_regen_flag(void)
+{
+#ifdef CONFIG_SNAPSHOT_REGEN_KEYS
+ unsigned long datasize;
+ u8 gens4key;
+ efi_status_t status;
+
+ /* existing flag may set by userland, respect but not overwrite it */
+ datasize = 0;
+ status = efi.get_variable(efi_gens4key_name, &EFI_HIBERNATE_GUID,
+ NULL, &datasize, NULL);
+ if (status == EFI_BUFFER_TOO_SMALL)
+ return;
+
+ /* set flag of key-pair regeneration */
+ gens4key = 1;
+ status = efi.set_variable(efi_gens4key_name, &EFI_HIBERNATE_GUID,
+ EFI_VARIABLE_NON_VOLATILE |
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS,
+ 1, (void *)&gens4key);
+ if (status)
+ pr_err("PM: Set GenS4Key flag fail: 0x%lx\n", status);
+#endif
+}
+
+static void clean_key_regen_flag(void)
+{
+ /* clean flag of key-pair regeneration */
+ efi.set_variable(efi_gens4key_name, &EFI_HIBERNATE_GUID,
+ EFI_VARIABLE_NON_VOLATILE |
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS,
+ 0, NULL);
+}
+
static int __init init_sign_key_data(void)
{
skey_data = (void *)get_zeroed_page(GFP_KERNEL);
@@ -283,6 +321,7 @@ static int __init init_sign_key_data(void)
efi_erase_s4_skey_data();
pr_info("PM: Load s4 sign key from EFI\n");
}
+ clean_key_regen_flag();
return 0;
}
diff --git a/kernel/power/power.h b/kernel/power/power.h
index 84e0b06..3fcde36 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -181,6 +181,7 @@ extern void restore_sign_key_data(void);
extern bool swsusp_page_is_sign_key(struct page *page);
extern unsigned long get_skey_data_buf_pfn(void);
extern void clone_skey_data(void *page_addr);
+extern void set_key_regen_flag(void);
#else /* !CONFIG_SUSPEND */
static inline void restore_sign_key_data(void) {}
static inline bool swsusp_page_is_sign_key(struct page *page)
@@ -191,6 +192,7 @@ static inline unsigned long get_skey_data_buf_pfn(void)
{
return 0;
}
+static inline void set_key_regen_flag(void) {}
#endif /* !CONFIG_SNAPSHOT_VERIFICATION */
/* kernel/power/block_io.c */
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index f02e351..12174ff 100644
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -1769,6 +1769,9 @@ asmlinkage int swsusp_save(void)
printk(KERN_INFO "PM: Hibernation image created (%d pages copied)\n",
nr_pages);
+ /* set regenerate key flag */
+ set_key_regen_flag();
+
return 0;
}
--
1.6.4.2
prev parent reply other threads:[~2013-08-22 11:01 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-22 11:01 [RFC PATCH 00/18 v3] Signature verification of hibernate snapshot Lee, Chun-Yi
2013-08-22 11:01 ` [PATCH 03/18] asymmetric keys: separate the length checking of octet string from RSA_I2OSP Lee, Chun-Yi
2013-08-25 16:01 ` Pavel Machek
[not found] ` <20130825160147.GB5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-26 10:25 ` joeyli
2013-08-26 10:25 ` joeyli
2013-08-26 10:25 ` joeyli
2013-08-26 10:25 ` joeyli
2013-08-26 10:25 ` joeyli
[not found] ` <1377512731.27967.34.camel@linux-s257.site>
[not found] ` <1377512731.27967.34.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-08-26 11:27 ` Pavel Machek
[not found] ` <20130826112737.GA18300-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 8:36 ` Jiri Kosina
2013-08-22 11:01 ` [PATCH 05/18] asymmetric keys: implement RSASP1 Lee, Chun-Yi
2013-08-22 11:01 ` [PATCH 06/18] asymmetric keys: support parsing PKCS #8 private key information Lee, Chun-Yi
2013-08-25 16:10 ` Pavel Machek
2013-08-22 11:01 ` [PATCH 07/18] asymmetric keys: explicitly add the leading zero byte to encoded message Lee, Chun-Yi
2013-08-25 16:13 ` Pavel Machek
2013-08-22 11:01 ` [PATCH 08/18] Secure boot: Add new capability Lee, Chun-Yi
2013-08-25 16:14 ` Pavel Machek
2013-08-22 11:01 ` [PATCH 09/18] Secure boot: Add a dummy kernel parameter that will switch on Secure Boot mode Lee, Chun-Yi
2013-08-25 16:16 ` Pavel Machek
2013-08-22 11:01 ` [PATCH 14/18] Hibernate: applied SNAPSHOT_VERIFICATION config to switch signature check Lee, Chun-Yi
[not found] ` <1377169317-5959-1-git-send-email-jlee-IBi9RG/b67k@public.gmane.org>
2013-08-22 11:01 ` [PATCH 01/18] asymmetric keys: add interface and skeleton for implement signature generation Lee, Chun-Yi
2013-08-22 11:01 ` [PATCH 02/18] asymmetric keys: implement EMSA_PKCS1-v1_5-ENCODE in rsa Lee, Chun-Yi
[not found] ` <1377169317-5959-3-git-send-email-jlee-IBi9RG/b67k@public.gmane.org>
2013-08-25 15:53 ` Pavel Machek
2013-08-26 10:17 ` joeyli
2013-08-26 10:17 ` joeyli
2013-08-26 10:17 ` joeyli
[not found] ` <20130825155309.GA5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-26 10:17 ` joeyli
2013-08-26 10:17 ` joeyli
2013-08-22 11:01 ` [PATCH 04/18] asymmetric keys: implement OS2IP " Lee, Chun-Yi
2013-08-22 11:01 ` [PATCH 10/18] efi: Enable secure boot lockdown automatically when enabled in firmware Lee, Chun-Yi
2013-08-25 16:22 ` Pavel Machek
[not found] ` <20130825162243.GG5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-25 16:26 ` Matthew Garrett
2013-09-03 10:49 ` Matt Fleming
2013-08-22 11:01 ` [PATCH 11/18] Hibernate: introduced RSA key-pair to verify signature of snapshot Lee, Chun-Yi
2013-08-25 16:25 ` Pavel Machek
2013-08-27 9:04 ` joeyli
2013-08-27 9:04 ` joeyli
2013-08-27 9:04 ` joeyli
[not found] ` <20130825162554.GH5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 9:04 ` joeyli
2013-08-27 9:04 ` joeyli
[not found] ` <1377594283.20140.3.camel@linux-s257.site>
[not found] ` <1377594283.20140.3.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-08-27 11:29 ` Pavel Machek
2013-08-27 13:12 ` joeyli
[not found] ` <20130827112943.GA20527-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 12:01 ` Manfred Hollstein
[not found] ` <20130827120142.GA4314-FGSgn5mWDzkZXJsbVdw/lG363IjY150HP6IUcbMO39o@public.gmane.org>
2013-08-27 14:17 ` Pavel Machek
2013-08-27 13:12 ` joeyli
2013-08-27 13:12 ` joeyli
2013-08-27 13:12 ` joeyli
2013-08-27 13:12 ` joeyli
2013-09-05 8:53 ` Matt Fleming
2013-09-05 10:13 ` joeyli
2013-09-05 10:13 ` joeyli
[not found] ` <20130905085348.GJ28598-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-09-05 10:13 ` joeyli
2013-09-05 10:13 ` joeyli
2013-09-05 10:13 ` joeyli
[not found] ` <1378376016.6193.71.camel@linux-s257.site>
[not found] ` <1378376016.6193.71.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-09-05 10:31 ` Matt Fleming
[not found] ` <20130905103158.GM28598-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-09-05 13:28 ` joeyli
2013-09-05 13:28 ` joeyli
2013-09-05 13:28 ` joeyli
2013-09-05 13:28 ` joeyli
2013-09-05 13:28 ` joeyli
2013-08-22 11:01 ` [PATCH 12/18] Hibernate: generate and " Lee, Chun-Yi
2013-08-25 16:36 ` Pavel Machek
[not found] ` <20130825163648.GI5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 3:22 ` joeyli
2013-08-27 3:22 ` joeyli
2013-08-27 3:22 ` joeyli
2013-08-27 3:22 ` joeyli
2013-08-27 3:22 ` joeyli
2013-08-22 11:01 ` [PATCH 13/18] Hibernate: Avoid S4 sign key data included in snapshot image Lee, Chun-Yi
2013-08-25 16:39 ` Pavel Machek
2013-08-27 8:33 ` joeyli
2013-08-27 8:33 ` joeyli
2013-08-27 8:33 ` joeyli
[not found] ` <20130825163931.GJ5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 8:33 ` joeyli
2013-08-27 8:33 ` joeyli
2013-08-22 11:01 ` [PATCH 15/18] Hibernate: adapt to UEFI secure boot with signature check Lee, Chun-Yi
2013-08-25 16:42 ` Pavel Machek
2013-08-27 10:14 ` joeyli
2013-08-27 10:14 ` joeyli
2013-08-27 10:14 ` joeyli
2013-08-27 10:14 ` joeyli
[not found] ` <20130825164219.GK5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 10:14 ` joeyli
2013-08-22 11:01 ` [PATCH 16/18] Hibernate: show the verification time for monitor performance Lee, Chun-Yi
2013-08-28 21:01 ` [RFC PATCH 00/18 v3] Signature verification of hibernate snapshot Florian Weimer
2013-08-29 0:01 ` joeyli
2013-08-29 0:01 ` joeyli
[not found] ` <87eh9dzg00.fsf-ZqZwdwZz9NfTBotR3TxKnbNAH6kLmebB@public.gmane.org>
2013-08-29 0:01 ` joeyli
2013-08-29 0:01 ` joeyli
2013-08-29 0:01 ` joeyli
[not found] ` <1377734505.19568.39.camel@linux-s257.site>
[not found] ` <1377734505.19568.39.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-08-29 21:32 ` Pavel Machek
2013-08-29 22:30 ` joeyli
[not found] ` <20130829213249.GA25940-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-29 22:30 ` joeyli
2013-08-29 22:30 ` joeyli
2013-08-29 22:30 ` joeyli
2013-08-29 22:30 ` joeyli
2013-09-01 10:41 ` Florian Weimer
[not found] ` <87r4d8vn71.fsf-ZqZwdwZz9NfTBotR3TxKnbNAH6kLmebB@public.gmane.org>
2013-09-01 16:04 ` Matthew Garrett
[not found] ` <20130901160429.GA1375-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org>
2013-09-01 16:40 ` Florian Weimer
[not found] ` <87vc2ksdfa.fsf-ZqZwdwZz9NfTBotR3TxKnbNAH6kLmebB@public.gmane.org>
2013-09-01 16:46 ` Matthew Garrett
2013-09-02 2:12 ` joeyli
2013-09-02 2:12 ` joeyli
2013-09-02 2:12 ` joeyli
2013-09-02 2:12 ` joeyli
2013-09-02 2:12 ` joeyli
2013-08-22 11:01 ` [PATCH 17/18] Hibernate: introduced SNAPSHOT_SIG_HASH config for select hash algorithm Lee, Chun-Yi
[not found] ` <1377169317-5959-18-git-send-email-jlee-IBi9RG/b67k@public.gmane.org>
2013-08-25 16:43 ` Pavel Machek
2013-08-27 10:22 ` joeyli
2013-08-27 10:22 ` joeyli
2013-08-27 10:22 ` joeyli
2013-08-27 10:22 ` joeyli
[not found] ` <20130825164329.GL5171-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 10:22 ` joeyli
[not found] ` <1377598937.20140.12.camel@linux-s257.site>
2013-08-27 11:30 ` Pavel Machek
2013-08-27 12:54 ` joeyli
2013-08-27 12:54 ` joeyli
2013-08-27 12:54 ` joeyli
2013-08-27 12:54 ` joeyli
[not found] ` <20130827113044.GB20527-tWAi6jLit6GreWDznjuHag@public.gmane.org>
2013-08-27 12:54 ` joeyli
2013-08-22 11:01 ` Lee, Chun-Yi [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1377169317-5959-19-git-send-email-jlee@suse.com \
--to=joeyli.kernel@gmail.com \
--cc=GLin@suse.com \
--cc=JKosina@suse.com \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=gregkh@linuxfoundation.org \
--cc=herbert@gondor.apana.org.au \
--cc=hpa@zytor.com \
--cc=james.bottomley@hansenpartnership.com \
--cc=jlee@suse.com \
--cc=jwboyer@redhat.com \
--cc=len.brown@intel.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=matt.fleming@intel.com \
--cc=mjg59@srcf.ucam.org \
--cc=mmarek@suse.cz \
--cc=opensuse-kernel@opensuse.org \
--cc=pavel@ucw.cz \
--cc=rjw@sisk.pl \
--cc=rusty@rustcorp.com.au \
--cc=vgoyal@redhat.com \
--cc=vojtech@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).