lineage_android_kernel_xiao.../Documentation
Eric Biggers c16d27ebb9 fscrypt: add Speck128/256 support
fscrypt currently only supports AES encryption.  However, many low-end
mobile devices have older CPUs that don't have AES instructions, e.g.
the ARMv8 Cryptography Extensions.  Currently, user data on such devices
is not encrypted at rest because AES is too slow, even when the NEON
bit-sliced implementation of AES is used.  Unfortunately, it is
infeasible to encrypt these devices at all when AES is the only option.

Therefore, this patch updates fscrypt to support the Speck block cipher,
which was recently added to the crypto API.  The C implementation of
Speck is not especially fast, but Speck can be implemented very
efficiently with general-purpose vector instructions, e.g. ARM NEON.
For example, on an ARMv7 processor, we measured the NEON-accelerated
Speck128/256-XTS at 69 MB/s for both encryption and decryption, while
AES-256-XTS with the NEON bit-sliced implementation was only 22 MB/s
encryption and 19 MB/s decryption.

There are multiple variants of Speck.  This patch only adds support for
Speck128/256, which is the variant with a 128-bit block size and 256-bit
key size -- the same as AES-256.  This is believed to be the most secure
variant of Speck, and it's only about 6% slower than Speck128/128.
Speck64/128 would be at least 20% faster because it has 20% rounds, and
it can be even faster on CPUs that can't efficiently do the 64-bit
operations needed for Speck128.  However, Speck64's 64-bit block size is
not preferred security-wise.  ARM NEON also supports the needed 64-bit
operations even on 32-bit CPUs, resulting in Speck128 being fast enough
for our targeted use cases so far.

The chosen modes of operation are XTS for contents and CTS-CBC for
filenames.  These are the same modes of operation that fscrypt defaults
to for AES.  Note that as with the other fscrypt modes, Speck will not
be used unless userspace chooses to use it.  Nor are any of the existing
modes (which are all AES-based) being removed, of course.

We intentionally don't make CONFIG_FS_ENCRYPTION select
CONFIG_CRYPTO_SPECK, so people will have to enable Speck support
themselves if they need it.  This is because we shouldn't bloat the
FS_ENCRYPTION dependencies with every new cipher, especially ones that
aren't recommended for most users.  Moreover, CRYPTO_SPECK is just the
generic implementation, which won't be fast enough for many users; in
practice, they'll need to enable CRYPTO_SPECK_NEON to get acceptable
performance.

More details about our choice of Speck can be found in our patches that
added Speck to the crypto API, and the follow-on discussion threads.
We're planning a publication that explains the choice in more detail.
But briefly, we can't use ChaCha20 as we previously proposed, since it
would be insecure to use a stream cipher in this context, with potential
IV reuse during writes on f2fs and/or on wear-leveling flash storage.

We also evaluated many other lightweight and/or ARX-based block ciphers
such as Chaskey-LTS, RC5, LEA, CHAM, Threefish, RC6, NOEKEON, SPARX, and
XTEA.  However, all had disadvantages vs. Speck, such as insufficient
performance with NEON, much less published cryptanalysis, or an
insufficient security level.  Various design choices in Speck make it
perform better with NEON than competing ciphers while still having a
security margin similar to AES, and in the case of Speck128 also the
same available security levels.  Unfortunately, Speck does have some
political baggage attached -- it's an NSA designed cipher, and was
rejected from an ISO standard (though for context, as far as I know none
of the above-mentioned alternatives are ISO standards either).
Nevertheless, we believe it is a good solution to the problem from a
technical perspective.

Certain algorithms constructed from ChaCha or the ChaCha permutation,
such as MEM (Masked Even-Mansour) or HPolyC, may also meet our
performance requirements.  However, these are new constructions that
need more time to receive the cryptographic review and acceptance needed
to be confident in their security.  HPolyC hasn't been published yet,
and we are concerned that MEM makes stronger assumptions about the
underlying permutation than the ChaCha stream cipher does.  In contrast,
the XTS mode of operation is relatively well accepted, and Speck has
over 70 cryptanalysis papers.  Of course, these ChaCha-based algorithms
can still be added later if they become ready.

The best known attack on Speck128/256 is a differential cryptanalysis
attack on 25 of 34 rounds with 2^253 time complexity and 2^125 chosen
plaintexts, i.e. only marginally faster than brute force.  There is no
known attack on the full 34 rounds.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
2018-06-28 12:16:15 -07:00
..
80211 docs-rst: sphinxify 802.11 documentation 2016-10-11 16:19:17 -06:00
ABI f2fs: don't split checkpoint in fstrim 2018-05-30 11:40:42 -07:00
DocBook A single commit converting the mac80211 DocBook template over to Sphinx. 2016-10-14 14:11:22 -07:00
EDID
PCI PCI changes for the v4.9 merge window: 2016-10-07 11:46:37 -07:00
RCU kthread: kthread worker API cleanup 2016-10-11 15:06:33 -07:00
accounting tools: move accounting tool from Documentation 2016-09-23 13:07:15 -06:00
acpi Merge branches 'acpi-button', 'acpi-battery' and 'acpi-doc' 2016-10-02 01:40:20 +02:00
aoe
arm linux-kselftest-4.9-rc1-update 2016-10-14 15:17:12 -07:00
arm64 arm64: documentation: document tagged pointer stack constraints 2017-05-25 15:44:45 +02:00
auxdisplay samples: move auxdisplay example code from Documentation 2016-09-23 11:52:32 -06:00
backlight
blackfin samples: move blackfin gptimers-example from Documentation 2016-10-10 07:12:02 -06:00
block
blockdev
bus-devices
cdrom
cgroup-v1
cma
connector
console
cpu-freq
cpuidle
cris
crypto
dev-tools mm: kmemleak: avoid using __va() on addresses that don't have a lowmem mapping 2016-10-11 15:06:33 -07:00
development-process docs-rst: add inter-document cross references 2016-09-21 15:43:09 -06:00
device-mapper dm raid: fix activation of existing raid4/10 devices 2016-10-17 16:41:31 -04:00
devicetree net: phy: dp83867: allow RGMII_TXID/RGMII_RXID interface types 2017-07-05 14:40:27 +02:00
dmaengine
driver-api
driver-model power supply and reset changes for the v4.9 series 2016-10-06 18:21:15 -07:00
early-userspace
extcon
fault-injection
fb
features Documentation: MIPS supports HAVE_REGS_AND_STACK_ACCESS_API 2016-10-13 17:19:19 +02:00
filesystems fscrypt: add Speck128/256 support 2018-06-28 12:16:15 -07:00
firmware_class
fmc
fpga
frv
gpio gpio/board.txt: point to gpiod_set_value 2016-10-20 14:14:11 +02:00
gpu Merge tag 'drm-for-v4.9' of git://people.freedesktop.org/~airlied/linux 2016-10-11 18:12:22 -07:00
hid
hwmon
i2c i2c: Documentation: i2c-topology: fix minor whitespace nit 2016-11-10 21:18:56 +01:00
ia64 selftests: move ia64 tests from Documentation/ia64 2016-09-20 09:58:12 -06:00
ide
iio iio: Documentation: Correct the path used to create triggers. 2016-10-01 00:49:58 -06:00
infiniband IB/hfi1: Document new sysfs entries for hfi1 driver 2016-10-02 08:42:19 -04:00
input Input: ALPS - add V8 protocol documentation 2016-10-04 11:47:02 -07:00
ioctl
isdn
ja_JP
kbuild Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2016-10-14 14:26:58 -07:00
kdump Documentation: kdump: Add description of enable multi-cpus support 2016-09-20 18:02:54 -06:00
ko_KR
laptops tools: move laptops dslm tool from Documentation 2016-09-23 13:07:21 -06:00
leds Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds 2016-10-04 10:25:53 -07:00
livepatch
locking locking/lglock: Remove lglock implementation 2016-09-22 15:25:56 +02:00
m68k
media videodev2.h: go back to limited range Y'CbCr for SRGB and, ADOBERGB 2017-02-23 17:44:37 +01:00
memory-devices
metag
mic samples: move mic/mpssd example code from Documentation 2016-09-20 12:38:48 -06:00
mips
misc-devices samples: move misc-devices/mei example code from Documentation 2016-09-23 11:51:43 -06:00
mmc
mn10300
mtd
namespaces
netlabel
networking netfilter: fix nf_conntrack_helper documentation 2016-11-24 12:50:24 +01:00
nfc
nios2
nvdimm
nvmem
parisc
pcmcia tools: move pcmcia crc32hash tool from Documentation 2016-09-23 13:07:27 -06:00
perf perf: xgene: Add APM X-Gene SoC Performance Monitoring Unit driver 2016-09-15 11:20:55 -07:00
phy
platform
power power supply and reset changes for the v4.9 series 2016-10-06 18:21:15 -07:00
powerpc powerpc updates for 4.9 2016-10-07 20:19:31 -07:00
pps
prctl selftests: move prctl tests from Documentation/prctl 2016-09-20 09:09:09 -06:00
pti
ptp selftests: move ptp tests from Documentation/ptp 2016-09-20 09:54:38 -06:00
rapidio
s390
scheduler
scsi scsi: g_NCR5380: Stop using scsi_module.c 2016-09-29 21:52:43 -04:00
security KEYS: Differentiate uses of rcu_dereference_key() and user_key_payload() 2017-07-10 13:20:52 -07:00
serial
sh
sound
sphinx docs: sphinx-extensions: make rstFlatTable work with docutils 0.13 2017-01-09 08:32:18 +01:00
sphinx-static This is the documentation update pull for the 4.9 merge window. 2016-10-04 13:54:07 -07:00
spi Doc: update 00-INDEX files to reflect the runnable code move 2016-10-10 07:12:09 -06:00
sysctl mnt: Add a per mount namespace limit on the number of mounts 2016-09-30 12:46:48 -05:00
target
thermal thermal: Add support for hardware-tracked trip points 2016-09-27 14:02:16 +08:00
timers Doc: update 00-INDEX files to reflect the runnable code move 2016-10-10 07:12:09 -06:00
tpm
trace This release cycle is rather small. Just a few fixes to tracing. 2016-10-06 11:48:41 -07:00
usb
virtual KVM: PPC: Book3S HV: Save/restore XER in checkpointed register state 2017-01-09 08:32:22 +01:00
vm
w1
watchdog linux-kselftest-4.9-rc1-update 2016-10-14 15:17:12 -07:00
wimax
x86 Merge branch 'mm-pkeys-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2016-10-10 11:01:51 -07:00
xtensa
zh_CN
.gitignore
00-INDEX Doc: update 00-INDEX files to reflect the runnable code move 2016-10-10 07:12:09 -06:00
BUG-HUNTING
Changes docs: Clean up bare :: lines 2016-09-20 18:46:36 -06:00
CodeOfConflict URL changed for Linux Foundation TAB 2016-10-01 00:57:13 -06:00
CodingStyle docs: Remove space-before-label guidance from CodingStyle 2016-09-21 15:53:31 -06:00
DMA-API-HOWTO.txt Documentation: DMA-API-HOWTO: Fix a typo 2016-09-20 17:58:46 -06:00
DMA-API.txt dma-mapping: add dma_{map,unmap}_resource 2016-09-26 22:16:41 +05:30
DMA-ISA-LPC.txt
DMA-attributes.txt dma-mapping: introduce the DMA_ATTR_NO_WARN attribute 2016-10-11 15:06:32 -07:00
HOWTO docs: Clean up bare :: lines 2016-09-20 18:46:36 -06:00
IPMI.txt
IRQ-affinity.txt
IRQ-domain.txt
IRQ.txt
Intel-IOMMU.txt
Makefile samples: move blackfin gptimers-example from Documentation 2016-10-10 07:12:02 -06:00
Makefile.sphinx
ManagementStyle Documentation/HOWTO: add cross-references to other documents 2016-09-20 18:41:04 -06:00
SAK.txt
SM501.txt
SecurityBugs Documentation/HOWTO: add cross-references to other documents 2016-09-20 18:41:04 -06:00
SubmitChecklist docs-rst: add inter-document cross references 2016-09-21 15:43:09 -06:00
SubmittingDrivers docs-rst: add inter-document cross references 2016-09-21 15:43:09 -06:00
SubmittingPatches docs-rst: add inter-document cross references 2016-09-21 15:43:09 -06:00
VGA-softcursor.txt
adding-syscalls.txt
applying-patches.txt docs: Clean up bare :: lines 2016-09-20 18:46:36 -06:00
assoc_array.txt
atomic_ops.txt
bad_memory.txt
basic_profiling.txt
bcache.txt
binfmt_misc.txt
braille-console.txt
bt8xxgpio.txt
btmrvl.txt
bus-virt-phys-mapping.txt
cachetlb.txt
cgroup-v2.txt
circular-buffers.txt
clk.txt
conf.py docs-rst: fix LaTeX \DURole renewcommand with Sphinx 1.3+ 2017-01-12 11:39:32 +01:00
cpu-hotplug.txt
cpu-load.txt
cputopology.txt
crc32.txt
dcdbas.txt
debugging-modules.txt
debugging-via-ohci1394.txt
dell_rbu.txt
devices.txt
digsig.txt
dma-buf-sharing.txt
docutils.conf
dontdiff
dynamic-debug-howto.txt
edac.txt
efi-stub.txt
eisa.txt
email-clients.txt Documentation/email-clients.txt: convert it to ReST markup 2016-09-21 15:41:50 -06:00
flexible-arrays.txt
futex-requeue-pi.txt
gcc-plugins.txt
highuid.txt
hw_random.txt
hwspinlock.txt
index.rst docs-rst: sphinxify 802.11 documentation 2016-10-11 16:19:17 -06:00
init.txt
initrd.txt
intel_txt.txt
io-mapping.txt
io_ordering.txt
iostats.txt
irqflags-tracing.txt
isa.txt
isapnp.txt
java.txt
kernel-doc-nano-HOWTO.txt
kernel-docs.txt Documentation/kernel-docs.txt: reorder based on timestamp 2016-09-20 18:54:42 -06:00
kernel-documentation.rst This is the documentation update pull for the 4.9 merge window. 2016-10-04 13:54:07 -07:00
kernel-parameters.txt mm: larger stack guard gap, between vmas 2017-06-24 07:11:18 +02:00
kernel-per-CPU-kthreads.txt
kobject.txt
kprobes.txt
kref.txt
kselftest.txt kselftest: kselftest documentation improvement 2016-09-20 08:58:27 -06:00
ldm.txt
local_ops.txt
lockup-watchdogs.txt
logo.gif
logo.txt
lzo.txt
magic-number.txt
mailbox.txt
md-cluster.txt
md.txt
memory-barriers.txt
memory-hotplug.txt
men-chameleon-bus.txt
module-signing.txt
mono.txt
nommu-mmap.txt
ntb.txt
numastat.txt
oops-tracing.txt
padata.txt
parport-lowlevel.txt
parport.txt
percpu-rw-semaphore.txt
phy.txt
pi-futex.txt
pinctrl.txt
pnp.txt
preempt-locking.txt
printk-formats.txt
pwm.txt
ramoops.txt
rbtree.txt
remoteproc.txt remoteproc: Split driver and consumer dereferencing 2016-10-02 22:50:21 -07:00
rfkill.txt
robust-futex-ABI.txt
robust-futexes.txt
rpmsg.txt
rtc.txt
serial-console.txt
sgi-ioc4.txt
smsc_ece1099.txt
stable_api_nonsense.txt Documentation/HOWTO: add cross-references to other documents 2016-09-20 18:41:04 -06:00
stable_kernel_rules.txt Documentation: stable-kernel-rules: fix stable-tag format 2017-04-12 12:41:15 +02:00
static-keys.txt
svga.txt
sync_file.txt
sysfs-rules.txt
sysrq.txt
this_cpu_ops.txt
unaligned-memory-access.txt
unicode.txt
unshare.txt
vfio.txt
video-output.txt
vme_api.txt
volatile-considered-harmful.txt
workqueue.txt
xillybus.txt
xz.txt
zorro.txt