Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp153767imm; Fri, 5 Oct 2018 01:15:58 -0700 (PDT) X-Google-Smtp-Source: ACcGV61KyIFIvcFFao4QF4Qp8ffGxNEo4rgtiNb+MStfsaFt5VW+RdKGU1Cpk9X2m4PpG5EVtux3 X-Received: by 2002:a65:655a:: with SMTP id a26-v6mr9089189pgw.389.1538727358351; Fri, 05 Oct 2018 01:15:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538727358; cv=none; d=google.com; s=arc-20160816; b=I6/O/JbGYNpzi4SP72e1Cwz2W0uesa1VekXENaz+gXpN59LeIl5i7CUoiFWHSDC8L+ EHDlQ2O2SSMS/OgqeBphnnNsBXE4m1VNjH4rcoJ79bBaInWKguB2ieSPOP9sy1OsjmzE zQaImvJTEaHUBxbFdwT3+/NXEOArjr/7QhnJUNbR3mjIFKS1/JL5piboxq3lOd8pfayI UVHBI3Gj9rEcAhSsWUekv+DtZMGSQ2YzaYvKMGses9z4OwTwpigjouK2ovGQmSHInAyn D7rkH5FiM/NLbNYtt4tieoE2GtkA2+eSHDiXUnEm5gI9XnqukeLyz/GNQu8UxUW99jlF /5gA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=KnHDBIUvlzt9rTbfCGWIVDG2qN/TNs+CUrI8dKvj7bI=; b=nDMfMJjTb5xoecTm/7jbULz6ml3auog6YN4AMvOHAp86P3hh3X1u9HfvAndxqOeKWP GrsgNxauPXqdJo93xAxxFp3MyCar2WZx395QA0l0tSO3A9RGfDOFVub5NcQfI7kYYMJT UQVi1jXCMwyowfMjw4Nfo/7258mrBD9nRl4ZZI7KtCIbwiBCm60WN1Ow+dzCW3mCJ5fu 1EUBA6CrClb8QVWa0qZiYXVJchLhR2MusTryUZcxCkUjln/7OX4Fu9AMPduTYaSqDTI9 AdY4KAEiRh7t8iuKJhhv1nNNM5tyTsGlBHnqs/BVleYYdMch5DAd3eDAhRBut67KUtju +MFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=dcth4H3R; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r1-v6si7847310plb.166.2018.10.05.01.15.42; Fri, 05 Oct 2018 01:15:58 -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; dkim=pass header.i=@linaro.org header.s=google header.b=dcth4H3R; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728323AbeJEPLQ (ORCPT + 99 others); Fri, 5 Oct 2018 11:11:16 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:41933 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728200AbeJEPLQ (ORCPT ); Fri, 5 Oct 2018 11:11:16 -0400 Received: by mail-wr1-f67.google.com with SMTP id x12-v6so12564518wru.8 for ; Fri, 05 Oct 2018 01:13:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=KnHDBIUvlzt9rTbfCGWIVDG2qN/TNs+CUrI8dKvj7bI=; b=dcth4H3ROnKOQyOKfGZ3wqLPn8mtEolJcGhLyx8/0zKIcQk4TJIm7O7z4G7SlOSTnz ADXuQ1jpCFX+vFMMbgmBjMQkAEEQ3illmAB8I++XTVHTRcT2xR7sGGL04uEWMhdHhSOY r+yZxtiB9ejQw2hkDIA3w4InTwEjYyP2DEysE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=KnHDBIUvlzt9rTbfCGWIVDG2qN/TNs+CUrI8dKvj7bI=; b=exgZZJ8Yw/2gEy/7mB0opD4EewOsEDmzGFxzFkXlS0ygnryVj79U6ThKseq3b8GSul owNx+J2INZmlrEGJi3VdrVo0H1XT/oouCj966PJYBMgkvBHdKya5ExXvX2fu7JSB9NxJ 20ZOcCh9K3VcT++pGBMY8UvCNc2zAqdrQNxfi3TbBgrA+WPbniPle6ZtitsIzY50p7Qr cU4srSAl+1mYVDydjflaPVa2vo8KHL194rnqiXrUKbHq3RbuSzlaf822eUqZxbeKf0Re DU1qKipx+EX4MuzZFSFLDWf4iqDi7sWyjpZFFqQNnON0+TjpC+NoYpJI91QX18P5yqxk lWjQ== X-Gm-Message-State: ABuFfoiF8THByp+kk/vu5sRcCRCm32ndq31WypI2hdmChu6RhcOaC8sH VzCw7lVtk1C2PWjYOJ7XkTPQS9g/vas= X-Received: by 2002:adf:8523:: with SMTP id 32-v6mr7729900wrh.72.1538727218578; Fri, 05 Oct 2018 01:13:38 -0700 (PDT) Received: from localhost.localdomain ([2a01:cb1d:112:6f00:697e:67d9:a05d:22c7]) by smtp.gmail.com with ESMTPSA id t4-v6sm6565620wrb.45.2018.10.05.01.13.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Oct 2018 01:13:37 -0700 (PDT) From: Ard Biesheuvel To: linux-kernel@vger.kernel.org Cc: Ard Biesheuvel , "Jason A . Donenfeld" , Eric Biggers , Samuel Neves , Andy Lutomirski , Arnd Bergmann , Herbert Xu , "David S. Miller" , Catalin Marinas , Will Deacon , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Thomas Gleixner , Ingo Molnar , Kees Cook , "Martin K. Petersen" , Greg Kroah-Hartman , Andrew Morton , Richard Weinberger , Peter Zijlstra , linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 0/9] patchable function pointers for pluggable crypto routines Date: Fri, 5 Oct 2018 10:13:24 +0200 Message-Id: <20181005081333.15018-1-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Linux's crypto API is widely regarded as being difficult to use for cases where support for asynchronous accelerators or runtime dispatch of algorithms (i.e., passed in as a string) are not needed. This leads to kludgy code and also to actual security issues [0], although arguably, using AES in the wrong mode can be done using any kind of crypto abstraction. At the moment, the Zinc library [1] is being proposed as a solution for that, and while it does address the usability problems, it does a lot more than that, and what we end up with is a lot less flexible than what we have now. Currently, arch specific implementations (based on SIMD or optimized assembler) live in arch/*/crypto, where each sub-community is in charge of its own specialized versions of the various primitives (although still under the purview of the crypto maintainer). Any proposal to change this model should be judged on its own merit, and not blindly accepted as the fallout of cleaning up some library code. Also, Zinc removes the possibility to plug different versions of a routine, and instead, keeps all versions in the same module. Currently, the kernel's module support permits user land to take charge of the policies that decide which version to use in which context (by loading or blacklisting modules). Instead, Zinc moves to a model where the policy is hardcoded into the module (e.g., ChaCha20 on ARM uses NEON unless on Cortex-A5 or A7). In the ARM community, we have always attempted to avoid hardcoding policy like that: the ARM SoC space is a very heteregeneous one, and putting policy like that into the code will lead to an endless stream of patches from silicon vendors that want tweaks for their cores into various parts of the kernel. Creating monolithic modules for algorithms also makes it very difficult to support driver based implementations. The kernel's driver model is heavily based on modules, using alias strings to match drivers against the hardware. As an example, there ARM ST platforms that support synchronous hardware based CRC32, and plugging that into the monolithic Zinc model is difficult if not impossible. The primary justification for moving away from the module system is that it depends heavily on function pointers, and in the post-Spectre world, those are vulnerable and costly. For this reason, this series proposes a patchable function pointer abstraction that, in its generic incarnation, consists simply of function pointers and some plumbing to set or reset them (patch #1) Patch #2 illustrates how architectures could optimize these abstractions by using code patching techniques to get rid of the indirect calls, and use fixed jumps instead. This has the side effect of making the function pointer const, making it more robust as well. The remainder of the series shows how we can use this abstraction to clean up the CRC-T10DIF handling in the kernel, which is a pretty depressing example of how cumbersome it is to expose crypto API algorithms as library routines. Note that the various arch specific implementations are kept in their original place as modules, which can be automatically dispatched by udev (as before) based on CPU feature bits. Cc: Jason A. Donenfeld Cc: Eric Biggers Cc: Samuel Neves Cc: Andy Lutomirski Cc: Arnd Bergmann Cc: Herbert Xu Cc: "David S. Miller" Cc: Catalin Marinas Cc: Will Deacon Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Michael Ellerman Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Kees Cook Cc: "Martin K. Petersen" Cc: Greg Kroah-Hartman Cc: Andrew Morton Cc: Richard Weinberger Cc: Peter Zijlstra Cc: linux-kernel@vger.kernel.org Cc: linux-crypto@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linuxppc-dev@lists.ozlabs.org [0] commit 428490e38b2e ("security/keys: rewrite all of big_key crypto") [1] https://lore.kernel.org/lkml/20180925145622.29959-3-Jason@zx2c4.com/ Ard Biesheuvel (9): kernel: add support for patchable function pointers arm64: kernel: add arch support for patchable function pointers crypto: crc-t10dif - make crc_t10dif a static inline crypto: crc-t10dif - use patchable function pointer for core update routine crypto: crc-t10dif/arm64 - move PMULL based code into core library crypto: crc-t10dif/arm - move PMULL based code into core library crypto: crct10dif/generic - switch crypto API driver to core library crypto: crc-t10dif/powerpc - move PMULL based code into core library crypto: crc-t10dif/x86 - move PMULL based code into core library arch/Kconfig | 3 + arch/arm/crypto/crct10dif-ce-glue.c | 78 +++------- arch/arm64/Kconfig | 1 + arch/arm64/crypto/crct10dif-ce-glue.c | 61 ++------ arch/arm64/include/asm/ffp.h | 35 +++++ arch/arm64/kernel/insn.c | 22 +++ arch/powerpc/crypto/crct10dif-vpmsum_glue.c | 55 +------- arch/x86/crypto/crct10dif-pclmul_glue.c | 98 ++----------- crypto/Kconfig | 1 + crypto/Makefile | 2 +- crypto/crct10dif_common.c | 82 ----------- crypto/crct10dif_generic.c | 4 +- include/linux/crc-t10dif.h | 24 +++- include/linux/ffp.h | 43 ++++++ lib/Kconfig | 2 - lib/crc-t10dif.c | 149 +++++++------------- 16 files changed, 235 insertions(+), 425 deletions(-) create mode 100644 arch/arm64/include/asm/ffp.h delete mode 100644 crypto/crct10dif_common.c create mode 100644 include/linux/ffp.h -- 2.11.0