Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3164710pxf; Sun, 21 Mar 2021 22:15:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxl8SeVAhcWWSMO4wP7eeEQld+baw5yjp0Im8zUs35i6WoB6mZUbZurjd1XIl/27l91COYS X-Received: by 2002:a17:907:94c3:: with SMTP id dn3mr17527725ejc.280.1616390115703; Sun, 21 Mar 2021 22:15:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616390115; cv=none; d=google.com; s=arc-20160816; b=dlxoflmhgp5WNAhYkqKeH3V0m2Phkc8CcRAqRDL+ORfNptMUBkMnbwd5rYfFKv5dlC jxaxoyj2vlFFP/avNG6tqhCLY2ekAg6pOI+83ye1Rfz1B2nDKkbGfEqGqpuXcmbInn1y GeUd2WZ/Mb0xUTT33HO+Db62/rHxIc/47k/PWL4KEZM4yVmpXsGGJ3poc7gQC4mVriUd kztZ8EnhN8luoOfq37+i7FlV5HO+TF5a/ncm2yRkrE6wIPoQGB/rwyjRE+J6qtqFPdMP /7Suk90Q8Nr4tR93t0lQd1BxFP22OB/rH07C7RJAFvxRcq+N4zAzWUzrgXXdFiAYMbFL PdyA== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=+UD3kcKWm98HnaROnS/AL0mhTd3m3LpzbSexNigjVPw=; b=Zokp57MgpI6CfY2m6wAadRWXaNrGqKwS/mYhpxxs9PqFxbjaOEjXOQRLedLe0j7rcN HwgmM9N4c9ocGtFcTT4V+kZXxfs1chO1CZMr6msBzLVfDjx1UKr7NJlgDCDFzBsXhfDh F+fSlBjF+dquEs872x2sVc66lyAapjU/BmyxJqibfRk+0rmS6JGx5TctMiLZnbC4n1bs 80ID6/fZswez2c6lN0belT/ksRj3HnPneRXIcmk0SwaXPQzreYop0gxW2ObgV055wGNs atf/QIO3JV/5hW75CG1p9j9D/BM9v3e1RU8tODW5HK2dXccGMxcyptovDKbAD3qcSx2c o6xg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=BqLzlYPt; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id se15si11013913ejb.204.2021.03.21.22.14.52; Sun, 21 Mar 2021 22:15:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=BqLzlYPt; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229548AbhCVFOE (ORCPT + 99 others); Mon, 22 Mar 2021 01:14:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:43856 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229455AbhCVFN4 (ORCPT ); Mon, 22 Mar 2021 01:13:56 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id EAA5561930; Mon, 22 Mar 2021 05:13:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1616390036; bh=swuzV5EcaNZWS3RrTQ3X/7Hc8ZdWHJlVaGVOm4GrSVg=; h=From:To:Cc:Subject:Date:From; b=BqLzlYPtWWJqI9Vh+X/fgywOFGwaoqqxGWUiA+ziLU5+fkuf+EK5ZEkHHQM+zZrn0 OFaCj5Pabg5gX6yDwuB7iwu+4vBKzinAHeznBt/S2Kps9B/DVH2Wvw3BV6+sfxtQCx 3/lQQzsED+KSFuViY1Nt/xICJUMtFME9TyzJ6brd2l6Kjy8nNi22Bv0lZlCem+6Si1 X6Si0jjR3TTSaDewjuy9rcM0/ZEAXsn0mJx6BxJsoYIjFa9/Z3EZXTzLP9KoHKmYDH kVwywfTLCMiHqNvM2xijxxTf0fuXjlJrW4dOWavmqju9noTXAIQNGkX/6feqk1Q3xm puT14p6BuVahQ== From: Eric Biggers To: Theodore Ts'o Cc: linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, Andy Lutomirski , Jann Horn , Herbert Xu , Ard Biesheuvel Subject: [PATCH RESEND] random: initialize ChaCha20 constants with correct endianness Date: Sun, 21 Mar 2021 22:13:47 -0700 Message-Id: <20210322051347.266831-1-ebiggers@kernel.org> X-Mailer: git-send-email 2.31.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org From: Eric Biggers On big endian CPUs, the ChaCha20-based CRNG is using the wrong endianness for the ChaCha20 constants. This doesn't matter cryptographically, but technically it means it's not ChaCha20 anymore. Fix it to always use the standard constants. Cc: linux-crypto@vger.kernel.org Cc: Andy Lutomirski Cc: Jann Horn Cc: Theodore Ts'o Acked-by: Herbert Xu Acked-by: Ard Biesheuvel Signed-off-by: Eric Biggers --- drivers/char/random.c | 4 ++-- include/crypto/chacha.h | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/char/random.c b/drivers/char/random.c index 0fe9e200e4c84..5d6acfecd919b 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -819,7 +819,7 @@ static bool __init crng_init_try_arch_early(struct crng_state *crng) static void __maybe_unused crng_initialize_secondary(struct crng_state *crng) { - memcpy(&crng->state[0], "expand 32-byte k", 16); + chacha_init_consts(crng->state); _get_random_bytes(&crng->state[4], sizeof(__u32) * 12); crng_init_try_arch(crng); crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1; @@ -827,7 +827,7 @@ static void __maybe_unused crng_initialize_secondary(struct crng_state *crng) static void __init crng_initialize_primary(struct crng_state *crng) { - memcpy(&crng->state[0], "expand 32-byte k", 16); + chacha_init_consts(crng->state); _extract_entropy(&input_pool, &crng->state[4], sizeof(__u32) * 12, 0); if (crng_init_try_arch_early(crng) && trust_cpu) { invalidate_batched_entropy(); diff --git a/include/crypto/chacha.h b/include/crypto/chacha.h index 3a1c72fdb7cf5..dabaee6987186 100644 --- a/include/crypto/chacha.h +++ b/include/crypto/chacha.h @@ -47,13 +47,18 @@ static inline void hchacha_block(const u32 *state, u32 *out, int nrounds) hchacha_block_generic(state, out, nrounds); } -void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv); -static inline void chacha_init_generic(u32 *state, const u32 *key, const u8 *iv) +static inline void chacha_init_consts(u32 *state) { state[0] = 0x61707865; /* "expa" */ state[1] = 0x3320646e; /* "nd 3" */ state[2] = 0x79622d32; /* "2-by" */ state[3] = 0x6b206574; /* "te k" */ +} + +void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv); +static inline void chacha_init_generic(u32 *state, const u32 *key, const u8 *iv) +{ + chacha_init_consts(state); state[4] = key[0]; state[5] = key[1]; state[6] = key[2]; -- 2.31.0