Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp6142951iog; Thu, 23 Jun 2022 12:14:13 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vAtWdCuglIlSAg1vbUxy28UAcUEiEa+92xgTAnBQQSbo4ufd4IUrlRatuzGQ11jXP1ILr0 X-Received: by 2002:a63:4853:0:b0:3fa:dc6:7ac2 with SMTP id x19-20020a634853000000b003fa0dc67ac2mr8723350pgk.298.1656011653387; Thu, 23 Jun 2022 12:14:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656011653; cv=none; d=google.com; s=arc-20160816; b=F4WrJYi3Jl+2U8LZSWymo1zlWppkIWd9Nk5unfhbV8ayCy8006kpcnqaqa/B5a2MHa 5dqSKRAuXsdiFvI1s47Fpe8VW2uv7IVvfpKB7h/1AeLTpZBFYvWvEnUhRMZ/50ZAPksQ D7VW3eNV8ZvZ13gRehD7k4pomS6zbstnyX4Yy/SDKvGAe514zdFsmWFHFs+s0oBm0+UU xwtioyDzxGIO4uQ98IJRXUO/RNO2HiNzWryeszW0aZwkHWogXdGyKNytS/Ltsws8VGdQ GttnZO8sMy1BPPJSQhoUFpJe2ruihdm79/L2UHnx+ZUJnbxzn5sXKziODCgQWgU3hO2K ERTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=nvYOD98J+Q2ArGFOyrQY7Bcq/npQxJ7aam54jTBqtkw=; b=qASnDaMo4qDw/7rkqL6zrbXhnVgYzd851VQ5RrMTDZZmVQqeOTtAOhx9TH6V4idQdC Ui27XT7NKwi85AYkpUhYrQdDyO18c/AjjVBBOAXUVM8nWlP8WfCVY3UYndQaYipkdbVu OXQY/31GoW1aV7bq4TYzFwYAauXO1pJ63ylKMast3ljZ0ZI+8mHvyhrtFZ+cJxaXpT+L 5KfM3+mKxh91L9V1tG3GLm5KnbS8bMnuzMtQ32mNn391AWvrnaxj7y7Wj4dmgYnebuCw 5agJ34/R7uZB8AB7AoDdGsJe2Owh/vKo7AR50s31vCXEHcHO9RSPU7pLqm3+rlozZ9gX MNSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="x4ju/Sap"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j3-20020a170903028300b0016a1f3f7c57si368939plr.607.2022.06.23.12.14.01; Thu, 23 Jun 2022 12:14:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="x4ju/Sap"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232587AbiFWRx6 (ORCPT + 99 others); Thu, 23 Jun 2022 13:53:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39676 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235311AbiFWRv4 (ORCPT ); Thu, 23 Jun 2022 13:51:56 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 81D64FEE; Thu, 23 Jun 2022 10:12:34 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 8EDCF61CD9; Thu, 23 Jun 2022 17:12:33 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5C4BFC341C4; Thu, 23 Jun 2022 17:12:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1656004352; bh=1kT8JIRzGtfVBD9TMMpDPDdHiT5R5w41p3SuW8XdLFA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=x4ju/SapFSLkJttSOmaHdO6AsGPGaA+qPfIStHYQpLULIgHtPIvZ+zpDkmcNEzePK T4CIdeUKaIEJgoz3Q0SzUoFG0DoCZwNJt0zbsYgjJlj3sCoo5TuKHo6p0T1sOaIVQx P1WHNJC8OZgK+D4bEzZYpXtOfcOv6nay6739jZ1U= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Hsin-Yi Wang , Stephen Boyd , Rob Herring , Will Deacon , "Jason A. Donenfeld" , Theodore Ts'o Subject: [PATCH 4.19 011/234] fdt: add support for rng-seed Date: Thu, 23 Jun 2022 18:41:18 +0200 Message-Id: <20220623164343.377050969@linuxfoundation.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220623164343.042598055@linuxfoundation.org> References: <20220623164343.042598055@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hsin-Yi Wang commit 428826f5358c922dc378830a1717b682c0823160 upstream. Introducing a chosen node, rng-seed, which is an entropy that can be passed to kernel called very early to increase initial device randomness. Bootloader should provide this entropy and the value is read from /chosen/rng-seed in DT. Obtain of_fdt_crc32 for CRC check after early_init_dt_scan_nodes(), since early_init_dt_scan_chosen() would modify fdt to erase rng-seed. Add a new interface add_bootloader_randomness() for rng-seed use case. Depends on whether the seed is trustworthy, rng seed would be passed to add_hwgenerator_randomness(). Otherwise it would be passed to add_device_randomness(). Decision is controlled by kernel config RANDOM_TRUST_BOOTLOADER. Signed-off-by: Hsin-Yi Wang Reviewed-by: Stephen Boyd Reviewed-by: Rob Herring Reviewed-by: Theodore Ts'o # drivers/char/random.c Signed-off-by: Will Deacon Signed-off-by: Jason A. Donenfeld Signed-off-by: Greg Kroah-Hartman --- drivers/char/Kconfig | 9 +++++++++ drivers/char/random.c | 14 ++++++++++++++ drivers/of/fdt.c | 14 ++++++++++++-- include/linux/random.h | 1 + 4 files changed, 36 insertions(+), 2 deletions(-) --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig @@ -568,3 +568,12 @@ config RANDOM_TRUST_CPU has not installed a hidden back door to compromise the CPU's random number generation facilities. This can also be configured at boot with "random.trust_cpu=on/off". + +config RANDOM_TRUST_BOOTLOADER + bool "Trust the bootloader to initialize Linux's CRNG" + help + Some bootloaders can provide entropy to increase the kernel's initial + device randomness. Say Y here to assume the entropy provided by the + booloader is trustworthy so it will be added to the kernel's entropy + pool. Otherwise, say N here so it will be regarded as device input that + only mixes the entropy pool. \ No newline at end of file --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -2503,3 +2503,17 @@ void add_hwgenerator_randomness(const ch } } EXPORT_SYMBOL_GPL(add_hwgenerator_randomness); + +/* Handle random seed passed by bootloader. + * If the seed is trustworthy, it would be regarded as hardware RNGs. Otherwise + * it would be regarded as device data. + * The decision is controlled by CONFIG_RANDOM_TRUST_BOOTLOADER. + */ +void add_bootloader_randomness(const void *buf, unsigned int size) +{ + if (IS_ENABLED(CONFIG_RANDOM_TRUST_BOOTLOADER)) + add_hwgenerator_randomness(buf, size, size * 8); + else + add_device_randomness(buf, size); +} +EXPORT_SYMBOL_GPL(add_bootloader_randomness); \ No newline at end of file --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -25,6 +25,7 @@ #include #include #include +#include #include /* for COMMAND_LINE_SIZE */ #include @@ -1077,6 +1078,7 @@ int __init early_init_dt_scan_chosen(uns { int l; const char *p; + const void *rng_seed; pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); @@ -1111,6 +1113,14 @@ int __init early_init_dt_scan_chosen(uns pr_debug("Command line is: %s\n", (char*)data); + rng_seed = of_get_flat_dt_prop(node, "rng-seed", &l); + if (rng_seed && l > 0) { + add_bootloader_randomness(rng_seed, l); + + /* try to clear seed so it won't be found. */ + fdt_nop_property(initial_boot_params, node, "rng-seed"); + } + /* break now */ return 1; } @@ -1213,8 +1223,6 @@ bool __init early_init_dt_verify(void *p /* Setup flat device-tree pointer */ initial_boot_params = params; - of_fdt_crc32 = crc32_be(~0, initial_boot_params, - fdt_totalsize(initial_boot_params)); return true; } @@ -1240,6 +1248,8 @@ bool __init early_init_dt_scan(void *par return false; early_init_dt_scan_nodes(); + of_fdt_crc32 = crc32_be(~0, initial_boot_params, + fdt_totalsize(initial_boot_params)); return true; } --- a/include/linux/random.h +++ b/include/linux/random.h @@ -19,6 +19,7 @@ struct random_ready_callback { }; extern void add_device_randomness(const void *, unsigned int); +extern void add_bootloader_randomness(const void *, unsigned int); #if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__) static inline void add_latent_entropy(void)