OSDN Git Service

Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 2 May 2017 22:53:46 +0000 (15:53 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 2 May 2017 22:53:46 +0000 (15:53 -0700)
Pull crypto updates from Herbert Xu:
 "Here is the crypto update for 4.12:

  API:
   - Add batch registration for acomp/scomp
   - Change acomp testing to non-unique compressed result
   - Extend algorithm name limit to 128 bytes
   - Require setkey before accept(2) in algif_aead

  Algorithms:
   - Add support for deflate rfc1950 (zlib)

  Drivers:
   - Add accelerated crct10dif for powerpc
   - Add crc32 in stm32
   - Add sha384/sha512 in ccp
   - Add 3des/gcm(aes) for v5 devices in ccp
   - Add Queue Interface (QI) backend support in caam
   - Add new Exynos RNG driver
   - Add ThunderX ZIP driver
   - Add driver for hardware random generator on MT7623 SoC"

* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (101 commits)
  crypto: stm32 - Fix OF module alias information
  crypto: algif_aead - Require setkey before accept(2)
  crypto: scomp - add support for deflate rfc1950 (zlib)
  crypto: scomp - allow registration of multiple scomps
  crypto: ccp - Change ISR handler method for a v5 CCP
  crypto: ccp - Change ISR handler method for a v3 CCP
  crypto: crypto4xx - rename ce_ring_contol to ce_ring_control
  crypto: testmgr - Allow ecb(cipher_null) in FIPS mode
  Revert "crypto: arm64/sha - Add constant operand modifier to ASM_EXPORT"
  crypto: ccp - Disable interrupts early on unload
  crypto: ccp - Use only the relevant interrupt bits
  hwrng: mtk - Add driver for hardware random generator on MT7623 SoC
  dt-bindings: hwrng: Add Mediatek hardware random generator bindings
  crypto: crct10dif-vpmsum - Fix missing preempt_disable()
  crypto: testmgr - replace compression known answer test
  crypto: acomp - allow registration of multiple acomps
  hwrng: n2 - Use devm_kcalloc() in n2rng_probe()
  crypto: chcr - Fix error handling related to 'chcr_alloc_shash'
  padata: get_next is never NULL
  crypto: exynos - Add new Exynos RNG driver
  ...

1  2 
MAINTAINERS
crypto/algif_aead.c
crypto/xts.c
drivers/char/hw_random/Kconfig
drivers/char/hw_random/Makefile
include/linux/kernel.h
lib/Makefile
net/xfrm/xfrm_user.c

diff --combined MAINTAINERS
@@@ -2327,6 -2327,21 +2327,6 @@@ S:     Maintaine
  F:    drivers/auxdisplay/
  F:    include/linux/cfag12864b.h
  
 -AVR32 ARCHITECTURE
 -M:    Haavard Skinnemoen <hskinnemoen@gmail.com>
 -M:    Hans-Christian Egtvedt <egtvedt@samfundet.no>
 -W:    http://www.atmel.com/products/AVR32/
 -W:    http://mirror.egtvedt.no/avr32linux.org/
 -W:    http://avrfreaks.net/
 -S:    Maintained
 -F:    arch/avr32/
 -
 -AVR32/AT32AP MACHINE SUPPORT
 -M:    Haavard Skinnemoen <hskinnemoen@gmail.com>
 -M:    Hans-Christian Egtvedt <egtvedt@samfundet.no>
 -S:    Maintained
 -F:    arch/avr32/mach-at32ap/
 -
  AX.25 NETWORK LAYER
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-hams@vger.kernel.org
@@@ -2529,14 -2544,6 +2529,14 @@@ F:    block
  F:    kernel/trace/blktrace.c
  F:    lib/sbitmap.c
  
 +BFQ I/O SCHEDULER
 +M:    Paolo Valente <paolo.valente@linaro.org>
 +M:    Jens Axboe <axboe@kernel.dk>
 +L:    linux-block@vger.kernel.org
 +S:    Maintained
 +F:    block/bfq-*
 +F:    Documentation/block/bfq-iosched.txt
 +
  BLOCK2MTD DRIVER
  M:    Joern Engel <joern@lazybastard.org>
  L:    linux-mtd@lists.infradead.org
@@@ -2578,26 -2585,12 +2578,26 @@@ F:   include/uapi/linux/if_bonding.
  
  BPF (Safe dynamic programs and tools)
  M:    Alexei Starovoitov <ast@kernel.org>
 +M:    Daniel Borkmann <daniel@iogearbox.net>
  L:    netdev@vger.kernel.org
  L:    linux-kernel@vger.kernel.org
  S:    Supported
 +F:    arch/x86/net/bpf_jit*
 +F:    Documentation/networking/filter.txt
 +F:    include/linux/bpf*
 +F:    include/linux/filter.h
 +F:    include/uapi/linux/bpf*
 +F:    include/uapi/linux/filter.h
  F:    kernel/bpf/
 -F:    tools/testing/selftests/bpf/
 +F:    kernel/trace/bpf_trace.c
  F:    lib/test_bpf.c
 +F:    net/bpf/
 +F:    net/core/filter.c
 +F:    net/sched/act_bpf.c
 +F:    net/sched/cls_bpf.c
 +F:    samples/bpf/
 +F:    tools/net/bpf*
 +F:    tools/testing/selftests/bpf/
  
  BROADCOM B44 10/100 ETHERNET DRIVER
  M:    Michael Chan <michael.chan@broadcom.com>
@@@ -3223,6 -3216,7 +3223,6 @@@ F:      drivers/platform/chrome
  
  CISCO VIC ETHERNET NIC DRIVER
  M:    Christian Benvenuti <benve@cisco.com>
 -M:    Sujith Sankar <ssujith@cisco.com>
  M:    Govindarajulu Varadarajan <_govind@gmx.com>
  M:    Neel Patel <neepatel@cisco.com>
  S:    Supported
@@@ -3456,7 -3450,6 +3456,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  T:    git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
  B:    https://bugzilla.kernel.org
  F:    Documentation/cpu-freq/
 +F:    Documentation/devicetree/bindings/cpufreq/
  F:    drivers/cpufreq/
  F:    include/linux/cpufreq.h
  F:    tools/testing/selftests/cpufreq/
@@@ -4125,13 -4118,14 +4125,13 @@@ F:   drivers/block/drbd
  F:    lib/lru_cache.c
  F:    Documentation/blockdev/drbd/
  
 -DRIVER CORE, KOBJECTS, DEBUGFS, KERNFS AND SYSFS
 +DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
  S:    Supported
  F:    Documentation/kobject.txt
  F:    drivers/base/
  F:    fs/debugfs/
 -F:    fs/kernfs/
  F:    fs/sysfs/
  F:    include/linux/debugfs.h
  F:    include/linux/kobj*
@@@ -4701,7 -4695,6 +4701,7 @@@ L:      linux-edac@vger.kernel.or
  L:    linux-mips@linux-mips.org
  S:    Supported
  F:    drivers/edac/octeon_edac*
 +F:    drivers/edac/thunderx_edac*
  
  EDAC-E752X
  M:    Mark Gross <mark.gross@intel.com>
@@@ -4783,12 -4776,6 +4783,12 @@@ L:    linux-edac@vger.kernel.or
  S:    Maintained
  F:    drivers/edac/mpc85xx_edac.[ch]
  
 +EDAC-PND2
 +M:    Tony Luck <tony.luck@intel.com>
 +L:    linux-edac@vger.kernel.org
 +S:    Maintained
 +F:    drivers/edac/pnd2_edac.[ch]
 +
  EDAC-PASEMI
  M:    Egor Martovetsky <egor@pasemi.com>
  L:    linux-edac@vger.kernel.org
@@@ -4936,7 -4923,6 +4936,7 @@@ F:      include/linux/netfilter_bridge
  F:    net/bridge/
  
  ETHERNET PHY LIBRARY
 +M:    Andrew Lunn <andrew@lunn.ch>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
@@@ -5415,23 -5401,6 +5415,23 @@@ F:    fs/fuse
  F:    include/uapi/linux/fuse.h
  F:    Documentation/filesystems/fuse.txt
  
 +FUTEX SUBSYSTEM
 +M:    Thomas Gleixner <tglx@linutronix.de>
 +M:    Ingo Molnar <mingo@redhat.com>
 +R:    Peter Zijlstra <peterz@infradead.org>
 +R:    Darren Hart <dvhart@infradead.org>
 +L:    linux-kernel@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
 +S:    Maintained
 +F:    kernel/futex.c
 +F:    kernel/futex_compat.c
 +F:    include/asm-generic/futex.h
 +F:    include/linux/futex.h
 +F:    include/uapi/linux/futex.h
 +F:    tools/testing/selftests/futex/
 +F:    tools/perf/bench/futex*
 +F:    Documentation/*futex*
 +
  FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit)
  M:    Rik Faith <faith@cs.unc.edu>
  L:    linux-scsi@vger.kernel.org
@@@ -6036,7 -6005,7 +6036,7 @@@ M:      Sebastian Reichel <sre@kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi.git
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-hsi
 -F:    Documentation/device-drivers/serial-interfaces.rst
 +F:    Documentation/driver-api/hsi.rst
  F:    drivers/hsi/
  F:    include/linux/hsi/
  F:    include/uapi/linux/hsi/
@@@ -6242,7 -6211,7 +6242,7 @@@ F:      drivers/crypto/nx/nx_csbcpb.
  F:    drivers/crypto/nx/nx_debugfs.h
  
  IBM Power 842 compression accelerator
- M:    Dan Streetman <ddstreet@ieee.org>
+ M:    Haren Myneni <haren@us.ibm.com>
  S:    Supported
  F:    drivers/crypto/nx/Makefile
  F:    drivers/crypto/nx/Kconfig
@@@ -7115,9 -7084,9 +7115,9 @@@ S:      Maintaine
  F:    fs/autofs4/
  
  KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
 +M:    Masahiro Yamada <yamada.masahiro@socionext.com>
  M:    Michal Marek <mmarek@suse.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git for-next
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git rc-fixes
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git
  L:    linux-kbuild@vger.kernel.org
  S:    Maintained
  F:    Documentation/kbuild/
@@@ -7201,7 -7170,6 +7201,7 @@@ S:      Supporte
  F:    Documentation/s390/kvm.txt
  F:    arch/s390/include/asm/kvm*
  F:    arch/s390/kvm/
 +F:    arch/s390/mm/gmap.c
  
  KERNEL VIRTUAL MACHINE (KVM) FOR ARM
  M:    Christoffer Dall <christoffer.dall@linaro.org>
@@@ -7235,14 -7203,6 +7235,14 @@@ F:    arch/mips/include/uapi/asm/kvm
  F:    arch/mips/include/asm/kvm*
  F:    arch/mips/kvm/
  
 +KERNFS
 +M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 +M:    Tejun Heo <tj@kernel.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
 +S:    Supported
 +F:    include/linux/kernfs.h
 +F:    fs/kernfs/
 +
  KEXEC
  M:    Eric Biederman <ebiederm@xmission.com>
  W:    http://kernel.org/pub/linux/utils/kernel/kexec/
@@@ -7814,6 -7774,13 +7814,6 @@@ F:     include/net/mac80211.
  F:    net/mac80211/
  F:    drivers/net/wireless/mac80211_hwsim.[ch]
  
 -MACVLAN DRIVER
 -M:    Patrick McHardy <kaber@trash.net>
 -L:    netdev@vger.kernel.org
 -S:    Maintained
 -F:    drivers/net/macvlan.c
 -F:    include/linux/if_macvlan.h
 -
  MAILBOX API
  M:    Jassi Brar <jassisinghbrar@gmail.com>
  L:    linux-kernel@vger.kernel.org
@@@ -7886,8 -7853,6 +7886,8 @@@ F:      drivers/net/ethernet/marvell/mvneta.
  MARVELL MWIFIEX WIRELESS DRIVER
  M:    Amitkumar Karwar <akarwar@marvell.com>
  M:    Nishant Sarmukadam <nishants@marvell.com>
 +M:    Ganapathi Bhat <gbhat@marvell.com>
 +M:    Xinming Hu <huxm@marvell.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
  F:    drivers/net/wireless/marvell/mwifiex/
@@@ -8788,7 -8753,6 +8788,7 @@@ W:      http://www.linuxfoundation.org/en/Ne
  Q:    http://patchwork.ozlabs.org/project/netdev/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git
 +B:    mailto:netdev@vger.kernel.org
  S:    Maintained
  F:    net/
  F:    include/net/
@@@ -10850,7 -10814,6 +10850,7 @@@ F:   drivers/s390/block/dasd
  F:    block/partitions/ibm.c
  
  S390 NETWORK DRIVERS
 +M:    Julian Wiedmann <jwi@linux.vnet.ibm.com>
  M:    Ursula Braun <ubraun@linux.vnet.ibm.com>
  L:    linux-s390@vger.kernel.org
  W:    http://www.ibm.com/developerworks/linux/linux390/
@@@ -10881,7 -10844,6 +10881,7 @@@ S:   Supporte
  F:    drivers/s390/scsi/zfcp_*
  
  S390 IUCV NETWORK LAYER
 +M:    Julian Wiedmann <jwi@linux.vnet.ibm.com>
  M:    Ursula Braun <ubraun@linux.vnet.ibm.com>
  L:    linux-s390@vger.kernel.org
  W:    http://www.ibm.com/developerworks/linux/linux390/
@@@ -10897,16 -10859,6 +10897,16 @@@ W: http://www.ibm.com/developerworks/li
  S:    Supported
  F:    drivers/iommu/s390-iommu.c
  
 +S390 VFIO-CCW DRIVER
 +M:    Cornelia Huck <cornelia.huck@de.ibm.com>
 +M:    Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +L:    kvm@vger.kernel.org
 +S:    Supported
 +F:    drivers/s390/cio/vfio_ccw*
 +F:    Documentation/s390/vfio-ccw.txt
 +F:    include/uapi/linux/vfio_ccw.h
 +
  S3C24XX SD/MMC Driver
  M:    Ben Dooks <ben-linux@fluff.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -10954,6 -10906,14 +10954,14 @@@ L: alsa-devel@alsa-project.org (moderat
  S:    Supported
  F:    sound/soc/samsung/
  
+ SAMSUNG EXYNOS PSEUDO RANDOM NUMBER GENERATOR (RNG) DRIVER
+ M:    Krzysztof Kozlowski <krzk@kernel.org>
+ L:    linux-crypto@vger.kernel.org
+ L:    linux-samsung-soc@vger.kernel.org
+ S:    Maintained
+ F:    drivers/crypto/exynos-rng.c
+ F:    Documentation/devicetree/bindings/rng/samsung,exynos-rng4.txt
  SAMSUNG FRAMEBUFFER DRIVER
  M:    Jingoo Han <jingoohan1@gmail.com>
  L:    linux-fbdev@vger.kernel.org
@@@ -10978,6 -10938,14 +10986,14 @@@ F: Documentation/devicetree/bindings/re
  F:    Documentation/devicetree/bindings/regulator/samsung,s5m*.txt
  F:    Documentation/devicetree/bindings/clock/samsung,s2mps11.txt
  
+ SAMSUNG S5P Security SubSystem (SSS) DRIVER
+ M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Vladimir Zapolskiy <vz@mleia.com>
+ L:    linux-crypto@vger.kernel.org
+ L:    linux-samsung-soc@vger.kernel.org
+ S:    Maintained
+ F:    drivers/crypto/s5p-sss.c
  SAMSUNG S5P/EXYNOS4 SOC SERIES CAMERA SUBSYSTEM DRIVERS
  M:    Kyungmin Park <kyungmin.park@samsung.com>
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
@@@ -11147,7 -11115,6 +11163,7 @@@ F:   drivers/power/supply/bq27xxx_battery
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:    John Stultz <john.stultz@linaro.org>
  M:    Thomas Gleixner <tglx@linutronix.de>
 +R:    Stephen Boyd <sboyd@codeaurora.org>
  L:    linux-kernel@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Supported
@@@ -12503,6 -12470,7 +12519,6 @@@ F:   drivers/clk/ti
  F:    include/linux/clk/ti.h
  
  TI ETHERNET SWITCH DRIVER (CPSW)
 -M:    Mugunthan V N <mugunthanvnm@ti.com>
  R:    Grygorii Strashko <grygorii.strashko@ti.com>
  L:    linux-omap@vger.kernel.org
  L:    netdev@vger.kernel.org
@@@ -13343,7 -13311,7 +13359,7 @@@ F:   drivers/virtio
  F:    tools/virtio/
  F:    drivers/net/virtio_net.c
  F:    drivers/block/virtio_blk.c
 -F:    include/linux/virtio_*.h
 +F:    include/linux/virtio*.h
  F:    include/uapi/linux/virtio_*.h
  F:    drivers/crypto/virtio/
  
@@@ -13431,6 -13399,14 +13447,6 @@@ W:  https://linuxtv.or
  S:    Maintained
  F:    drivers/media/platform/vivid/*
  
 -VLAN (802.1Q)
 -M:    Patrick McHardy <kaber@trash.net>
 -L:    netdev@vger.kernel.org
 -S:    Maintained
 -F:    drivers/net/macvlan.c
 -F:    include/linux/if_*vlan.h
 -F:    net/8021q/
 -
  VLYNQ BUS
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    openwrt-devel@lists.openwrt.org (subscribers-only)
diff --combined crypto/algif_aead.c
@@@ -40,11 -40,15 +40,16 @@@ struct aead_async_req 
        struct aead_async_rsgl first_rsgl;
        struct list_head list;
        struct kiocb *iocb;
 +      struct sock *sk;
        unsigned int tsgls;
        char iv[];
  };
  
+ struct aead_tfm {
+       struct crypto_aead *aead;
+       bool has_key;
+ };
  struct aead_ctx {
        struct aead_sg_list tsgl;
        struct aead_async_rsgl first_rsgl;
@@@ -380,10 -384,12 +385,10 @@@ unlock
  
  static void aead_async_cb(struct crypto_async_request *_req, int err)
  {
 -      struct sock *sk = _req->data;
 -      struct alg_sock *ask = alg_sk(sk);
 -      struct aead_ctx *ctx = ask->private;
 -      struct crypto_aead *tfm = crypto_aead_reqtfm(&ctx->aead_req);
 -      struct aead_request *req = aead_request_cast(_req);
 +      struct aead_request *req = _req->data;
 +      struct crypto_aead *tfm = crypto_aead_reqtfm(req);
        struct aead_async_req *areq = GET_ASYM_REQ(req, tfm);
 +      struct sock *sk = areq->sk;
        struct scatterlist *sg = areq->tsgl;
        struct aead_async_rsgl *rsgl;
        struct kiocb *iocb = areq->iocb;
@@@ -446,12 -452,11 +451,12 @@@ static int aead_recvmsg_async(struct so
        memset(&areq->first_rsgl, '\0', sizeof(areq->first_rsgl));
        INIT_LIST_HEAD(&areq->list);
        areq->iocb = msg->msg_iocb;
 +      areq->sk = sk;
        memcpy(areq->iv, ctx->iv, crypto_aead_ivsize(tfm));
        aead_request_set_tfm(req, tfm);
        aead_request_set_ad(req, ctx->aead_assoclen);
        aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
 -                                aead_async_cb, sk);
 +                                aead_async_cb, req);
        used -= ctx->aead_assoclen;
  
        /* take over all tx sgls from ctx */
@@@ -723,24 -728,146 +728,146 @@@ static struct proto_ops algif_aead_ops 
        .poll           =       aead_poll,
  };
  
+ static int aead_check_key(struct socket *sock)
+ {
+       int err = 0;
+       struct sock *psk;
+       struct alg_sock *pask;
+       struct aead_tfm *tfm;
+       struct sock *sk = sock->sk;
+       struct alg_sock *ask = alg_sk(sk);
+       lock_sock(sk);
+       if (ask->refcnt)
+               goto unlock_child;
+       psk = ask->parent;
+       pask = alg_sk(ask->parent);
+       tfm = pask->private;
+       err = -ENOKEY;
+       lock_sock_nested(psk, SINGLE_DEPTH_NESTING);
+       if (!tfm->has_key)
+               goto unlock;
+       if (!pask->refcnt++)
+               sock_hold(psk);
+       ask->refcnt = 1;
+       sock_put(psk);
+       err = 0;
+ unlock:
+       release_sock(psk);
+ unlock_child:
+       release_sock(sk);
+       return err;
+ }
+ static int aead_sendmsg_nokey(struct socket *sock, struct msghdr *msg,
+                                 size_t size)
+ {
+       int err;
+       err = aead_check_key(sock);
+       if (err)
+               return err;
+       return aead_sendmsg(sock, msg, size);
+ }
+ static ssize_t aead_sendpage_nokey(struct socket *sock, struct page *page,
+                                      int offset, size_t size, int flags)
+ {
+       int err;
+       err = aead_check_key(sock);
+       if (err)
+               return err;
+       return aead_sendpage(sock, page, offset, size, flags);
+ }
+ static int aead_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
+                                 size_t ignored, int flags)
+ {
+       int err;
+       err = aead_check_key(sock);
+       if (err)
+               return err;
+       return aead_recvmsg(sock, msg, ignored, flags);
+ }
+ static struct proto_ops algif_aead_ops_nokey = {
+       .family         =       PF_ALG,
+       .connect        =       sock_no_connect,
+       .socketpair     =       sock_no_socketpair,
+       .getname        =       sock_no_getname,
+       .ioctl          =       sock_no_ioctl,
+       .listen         =       sock_no_listen,
+       .shutdown       =       sock_no_shutdown,
+       .getsockopt     =       sock_no_getsockopt,
+       .mmap           =       sock_no_mmap,
+       .bind           =       sock_no_bind,
+       .accept         =       sock_no_accept,
+       .setsockopt     =       sock_no_setsockopt,
+       .release        =       af_alg_release,
+       .sendmsg        =       aead_sendmsg_nokey,
+       .sendpage       =       aead_sendpage_nokey,
+       .recvmsg        =       aead_recvmsg_nokey,
+       .poll           =       aead_poll,
+ };
  static void *aead_bind(const char *name, u32 type, u32 mask)
  {
-       return crypto_alloc_aead(name, type, mask);
+       struct aead_tfm *tfm;
+       struct crypto_aead *aead;
+       tfm = kzalloc(sizeof(*tfm), GFP_KERNEL);
+       if (!tfm)
+               return ERR_PTR(-ENOMEM);
+       aead = crypto_alloc_aead(name, type, mask);
+       if (IS_ERR(aead)) {
+               kfree(tfm);
+               return ERR_CAST(aead);
+       }
+       tfm->aead = aead;
+       return tfm;
  }
  
  static void aead_release(void *private)
  {
-       crypto_free_aead(private);
+       struct aead_tfm *tfm = private;
+       crypto_free_aead(tfm->aead);
+       kfree(tfm);
  }
  
  static int aead_setauthsize(void *private, unsigned int authsize)
  {
-       return crypto_aead_setauthsize(private, authsize);
+       struct aead_tfm *tfm = private;
+       return crypto_aead_setauthsize(tfm->aead, authsize);
  }
  
  static int aead_setkey(void *private, const u8 *key, unsigned int keylen)
  {
-       return crypto_aead_setkey(private, key, keylen);
+       struct aead_tfm *tfm = private;
+       int err;
+       err = crypto_aead_setkey(tfm->aead, key, keylen);
+       tfm->has_key = !err;
+       return err;
  }
  
  static void aead_sock_destruct(struct sock *sk)
        af_alg_release_parent(sk);
  }
  
- static int aead_accept_parent(void *private, struct sock *sk)
+ static int aead_accept_parent_nokey(void *private, struct sock *sk)
  {
        struct aead_ctx *ctx;
        struct alg_sock *ask = alg_sk(sk);
-       unsigned int len = sizeof(*ctx) + crypto_aead_reqsize(private);
-       unsigned int ivlen = crypto_aead_ivsize(private);
+       struct aead_tfm *tfm = private;
+       struct crypto_aead *aead = tfm->aead;
+       unsigned int len = sizeof(*ctx) + crypto_aead_reqsize(aead);
+       unsigned int ivlen = crypto_aead_ivsize(aead);
  
        ctx = sock_kmalloc(sk, len, GFP_KERNEL);
        if (!ctx)
  
        ask->private = ctx;
  
-       aead_request_set_tfm(&ctx->aead_req, private);
+       aead_request_set_tfm(&ctx->aead_req, aead);
        aead_request_set_callback(&ctx->aead_req, CRYPTO_TFM_REQ_MAY_BACKLOG,
                                  af_alg_complete, &ctx->completion);
  
        return 0;
  }
  
+ static int aead_accept_parent(void *private, struct sock *sk)
+ {
+       struct aead_tfm *tfm = private;
+       if (!tfm->has_key)
+               return -ENOKEY;
+       return aead_accept_parent_nokey(private, sk);
+ }
  static const struct af_alg_type algif_type_aead = {
        .bind           =       aead_bind,
        .release        =       aead_release,
        .setkey         =       aead_setkey,
        .setauthsize    =       aead_setauthsize,
        .accept         =       aead_accept_parent,
+       .accept_nokey   =       aead_accept_parent_nokey,
        .ops            =       &algif_aead_ops,
+       .ops_nokey      =       &algif_aead_ops_nokey,
        .name           =       "aead",
        .owner          =       THIS_MODULE
  };
diff --combined crypto/xts.c
@@@ -39,11 -39,11 +39,11 @@@ struct xts_instance_ctx 
  };
  
  struct rctx {
-       be128 buf[XTS_BUFFER_SIZE / sizeof(be128)];
+       le128 buf[XTS_BUFFER_SIZE / sizeof(le128)];
  
-       be128 t;
+       le128 t;
  
-       be128 *ext;
+       le128 *ext;
  
        struct scatterlist srcbuf[2];
        struct scatterlist dstbuf[2];
@@@ -99,7 -99,7 +99,7 @@@ static int setkey(struct crypto_skciphe
  static int post_crypt(struct skcipher_request *req)
  {
        struct rctx *rctx = skcipher_request_ctx(req);
-       be128 *buf = rctx->ext ?: rctx->buf;
+       le128 *buf = rctx->ext ?: rctx->buf;
        struct skcipher_request *subreq;
        const int bs = XTS_BLOCK_SIZE;
        struct skcipher_walk w;
  
        while (w.nbytes) {
                unsigned int avail = w.nbytes;
-               be128 *wdst;
+               le128 *wdst;
  
                wdst = w.dst.virt.addr;
  
                do {
-                       be128_xor(wdst, buf++, wdst);
+                       le128_xor(wdst, buf++, wdst);
                        wdst++;
                } while ((avail -= bs) >= bs);
  
@@@ -150,7 -150,7 +150,7 @@@ out
  static int pre_crypt(struct skcipher_request *req)
  {
        struct rctx *rctx = skcipher_request_ctx(req);
-       be128 *buf = rctx->ext ?: rctx->buf;
+       le128 *buf = rctx->ext ?: rctx->buf;
        struct skcipher_request *subreq;
        const int bs = XTS_BLOCK_SIZE;
        struct skcipher_walk w;
  
        while (w.nbytes) {
                unsigned int avail = w.nbytes;
-               be128 *wsrc;
-               be128 *wdst;
+               le128 *wsrc;
+               le128 *wdst;
  
                wsrc = w.src.virt.addr;
                wdst = w.dst.virt.addr;
  
                do {
                        *buf++ = rctx->t;
-                       be128_xor(wdst++, &rctx->t, wsrc++);
+                       le128_xor(wdst++, &rctx->t, wsrc++);
                        gf128mul_x_ble(&rctx->t, &rctx->t);
                } while ((avail -= bs) >= bs);
  
@@@ -286,13 -286,6 +286,13 @@@ static void encrypt_done(struct crypto_
        struct rctx *rctx;
  
        rctx = skcipher_request_ctx(req);
 +
 +      if (err == -EINPROGRESS) {
 +              if (rctx->left != req->cryptlen)
 +                      return;
 +              goto out;
 +      }
 +
        subreq = &rctx->subreq;
        subreq->base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
  
        if (rctx->left)
                return;
  
 +out:
        skcipher_request_complete(req, err);
  }
  
@@@ -338,13 -330,6 +338,13 @@@ static void decrypt_done(struct crypto_
        struct rctx *rctx;
  
        rctx = skcipher_request_ctx(req);
 +
 +      if (err == -EINPROGRESS) {
 +              if (rctx->left != req->cryptlen)
 +                      return;
 +              goto out;
 +      }
 +
        subreq = &rctx->subreq;
        subreq->base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
  
        if (rctx->left)
                return;
  
 +out:
        skcipher_request_complete(req, err);
  }
  
@@@ -369,8 -353,8 +369,8 @@@ int xts_crypt(struct blkcipher_desc *de
        const unsigned int max_blks = req->tbuflen / bsize;
        struct blkcipher_walk walk;
        unsigned int nblocks;
-       be128 *src, *dst, *t;
-       be128 *t_buf = req->tbuf;
+       le128 *src, *dst, *t;
+       le128 *t_buf = req->tbuf;
        int err, i;
  
        BUG_ON(max_blks < 1);
                return err;
  
        nblocks = min(nbytes / bsize, max_blks);
-       src = (be128 *)walk.src.virt.addr;
-       dst = (be128 *)walk.dst.virt.addr;
+       src = (le128 *)walk.src.virt.addr;
+       dst = (le128 *)walk.dst.virt.addr;
  
        /* calculate first value of T */
        req->tweak_fn(req->tweak_ctx, (u8 *)&t_buf[0], walk.iv);
@@@ -400,7 -384,7 +400,7 @@@ first
                                t = &t_buf[i];
  
                                /* PP <- T xor P */
-                               be128_xor(dst + i, t, src + i);
+                               le128_xor(dst + i, t, src + i);
                        }
  
                        /* CC <- E(Key2,PP) */
  
                        /* C <- T xor CC */
                        for (i = 0; i < nblocks; i++)
-                               be128_xor(dst + i, dst + i, &t_buf[i]);
+                               le128_xor(dst + i, dst + i, &t_buf[i]);
  
                        src += nblocks;
                        dst += nblocks;
                        nblocks = min(nbytes / bsize, max_blks);
                } while (nblocks > 0);
  
-               *(be128 *)walk.iv = *t;
+               *(le128 *)walk.iv = *t;
  
                err = blkcipher_walk_done(desc, &walk, nbytes);
                nbytes = walk.nbytes;
                        break;
  
                nblocks = min(nbytes / bsize, max_blks);
-               src = (be128 *)walk.src.virt.addr;
-               dst = (be128 *)walk.dst.virt.addr;
+               src = (le128 *)walk.src.virt.addr;
+               dst = (le128 *)walk.dst.virt.addr;
        }
  
        return err;
@@@ -294,20 -294,6 +294,6 @@@ config HW_RANDOM_POWERN
  
          If unsure, say Y.
  
- config HW_RANDOM_EXYNOS
-       tristate "EXYNOS HW random number generator support"
-       depends on ARCH_EXYNOS || COMPILE_TEST
-       depends on HAS_IOMEM
-       default HW_RANDOM
-       ---help---
-         This driver provides kernel-side support for the Random Number
-         Generator hardware found on EXYNOS SOCs.
-         To compile this driver as a module, choose M here: the
-         module will be called exynos-rng.
-         If unsure, say Y.
  config HW_RANDOM_TPM
        tristate "TPM HW Random Number Generator support"
        depends on TCG_TPM
@@@ -423,20 -409,20 +409,34 @@@ config HW_RANDOM_CAVIU
  
           If unsure, say Y.
  
+ config HW_RANDOM_MTK
+       tristate "Mediatek Random Number Generator support"
+       depends on HW_RANDOM
+       depends on ARCH_MEDIATEK || COMPILE_TEST
+       default y
+       ---help---
+         This driver provides kernel-side support for the Random Number
+         Generator hardware found on Mediatek SoCs.
+         To compile this driver as a module, choose M here. the
+         module will be called mtk-rng.
+         If unsure, say Y.
 +config HW_RANDOM_S390
 +      tristate "S390 True Random Number Generator support"
 +      depends on S390
 +      default HW_RANDOM
 +      ---help---
 +        This driver provides kernel-side support for the True
 +        Random Number Generator available as CPACF extension
 +        on modern s390 hardware platforms.
 +
 +        To compile this driver as a module, choose M here: the
 +        module will be called s390-trng.
 +
 +        If unsure, say Y.
 +
  endif # HW_RANDOM
  
  config UML_RANDOM
@@@ -24,7 -24,6 +24,6 @@@ obj-$(CONFIG_HW_RANDOM_OCTEON) += octeo
  obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o
  obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o
  obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o
- obj-$(CONFIG_HW_RANDOM_EXYNOS)        += exynos-rng.o
  obj-$(CONFIG_HW_RANDOM_HISI)  += hisi-rng.o
  obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o
  obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o
@@@ -36,4 -35,4 +35,5 @@@ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-
  obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o
  obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o
  obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o
+ obj-$(CONFIG_HW_RANDOM_MTK)   += mtk-rng.o
 +obj-$(CONFIG_HW_RANDOM_S390) += s390-trng.o
diff --combined include/linux/kernel.h
@@@ -47,6 -47,7 +47,7 @@@
  
  /* @a is a power of 2 value */
  #define ALIGN(x, a)           __ALIGN_KERNEL((x), (a))
+ #define ALIGN_DOWN(x, a)      __ALIGN_KERNEL((x) - ((a) - 1), (a))
  #define __ALIGN_MASK(x, mask) __ALIGN_KERNEL_MASK((x), (mask))
  #define PTR_ALIGN(p, a)               ((typeof(p))ALIGN((unsigned long)(p), (a)))
  #define IS_ALIGNED(x, a)              (((x) & ((typeof(x))(a) - 1)) == 0)
@@@ -438,7 -439,6 +439,7 @@@ extern int get_option(char **str, int *
  extern char *get_options(const char *str, int nints, int *ints);
  extern unsigned long long memparse(const char *ptr, char **retptr);
  extern bool parse_option_str(const char *str, const char *option);
 +extern char *next_arg(char *args, char **param, char **val);
  
  extern int core_kernel_text(unsigned long addr);
  extern int core_kernel_data(unsigned long addr);
diff --combined lib/Makefile
@@@ -19,7 -19,7 +19,7 @@@ KCOV_INSTRUMENT_dynamic_debug.o := 
  lib-y := ctype.o string.o vsprintf.o cmdline.o \
         rbtree.o radix-tree.o dump_stack.o timerqueue.o\
         idr.o int_sqrt.o extable.o \
-        sha1.o chacha20.o md5.o irq_regs.o argv_split.o \
+        sha1.o chacha20.o irq_regs.o argv_split.o \
         flex_proportions.o ratelimit.o show_mem.o \
         is_single_threaded.o plist.o decompress.o kobject_uevent.o \
         earlycpio.o seq_buf.o siphash.o \
@@@ -41,7 -41,7 +41,7 @@@ obj-y += bcd.o div64.o sort.o parser.o 
         gcd.o lcm.o list_sort.o uuid.o flex_array.o iov_iter.o clz_ctz.o \
         bsearch.o find_bit.o llist.o memweight.o kfifo.o \
         percpu-refcount.o percpu_ida.o rhashtable.o reciprocal_div.o \
 -       once.o refcount.o
 +       once.o refcount.o usercopy.o
  obj-y += string_helpers.o
  obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o
  obj-y += hexdump.o
diff --combined net/xfrm/xfrm_user.c
@@@ -55,7 -55,7 +55,7 @@@ static int verify_one_alg(struct nlatt
                return -EINVAL;
        }
  
-       algp->alg_name[CRYPTO_MAX_ALG_NAME - 1] = '\0';
+       algp->alg_name[sizeof(algp->alg_name) - 1] = '\0';
        return 0;
  }
  
@@@ -71,7 -71,7 +71,7 @@@ static int verify_auth_trunc(struct nla
        if (nla_len(rt) < xfrm_alg_auth_len(algp))
                return -EINVAL;
  
-       algp->alg_name[CRYPTO_MAX_ALG_NAME - 1] = '\0';
+       algp->alg_name[sizeof(algp->alg_name) - 1] = '\0';
        return 0;
  }
  
@@@ -87,7 -87,7 +87,7 @@@ static int verify_aead(struct nlattr **
        if (nla_len(rt) < aead_len(algp))
                return -EINVAL;
  
-       algp->alg_name[CRYPTO_MAX_ALG_NAME - 1] = '\0';
+       algp->alg_name[sizeof(algp->alg_name) - 1] = '\0';
        return 0;
  }
  
@@@ -412,14 -412,7 +412,14 @@@ static inline int xfrm_replay_verify_le
        up = nla_data(rp);
        ulen = xfrm_replay_state_esn_len(up);
  
 -      if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen)
 +      /* Check the overall length and the internal bitmap length to avoid
 +       * potential overflow. */
 +      if (nla_len(rp) < ulen ||
 +          xfrm_replay_state_esn_len(replay_esn) != ulen ||
 +          replay_esn->bmp_len != up->bmp_len)
 +              return -EINVAL;
 +
 +      if (up->replay_window > up->bmp_len * sizeof(__u32) * 8)
                return -EINVAL;
  
        return 0;