08 Oct, 2020

1 commit

  • The sm2 code was split out of public_key.c in a way that breaks
    modular builds. This patch moves the code back into the same file
    as the original motivation was to minimise ifdefs and that has
    nothing to do with splitting the code out.

    Fixes: 215525639631 ("X.509: support OSCCA SM2-with-SM3...")
    Reported-by: kernel test robot
    Signed-off-by: Herbert Xu

    Herbert Xu
     

25 Sep, 2020

4 commits

  • The digital certificate format based on SM2 crypto algorithm as
    specified in GM/T 0015-2012. It was published by State Encryption
    Management Bureau, China.

    The method of generating Other User Information is defined as
    ZA=H256(ENTLA || IDA || a || b || xG || yG || xA || yA), it also
    specified in https://tools.ietf.org/html/draft-shen-sm2-ecdsa-02.

    The x509 certificate supports SM2-with-SM3 type certificate
    verification. Because certificate verification requires ZA
    in addition to tbs data, ZA also depends on elliptic curve
    parameters and public key data, so you need to access tbs in sig
    and calculate ZA. Finally calculate the digest of the
    signature and complete the verification work. The calculation
    process of ZA is declared in specifications GM/T 0009-2012
    and GM/T 0003.2-2012.

    Signed-off-by: Tianjia Zhang
    Tested-by: Xufeng Zhang
    Reviewed-by: Gilad Ben-Yossef
    Signed-off-by: Herbert Xu

    Tianjia Zhang
     
  • This new module implement the SM2 public key algorithm. It was
    published by State Encryption Management Bureau, China.
    List of specifications for SM2 elliptic curve public key cryptography:

    * GM/T 0003.1-2012
    * GM/T 0003.2-2012
    * GM/T 0003.3-2012
    * GM/T 0003.4-2012
    * GM/T 0003.5-2012

    IETF: https://tools.ietf.org/html/draft-shen-sm2-ecdsa-02
    oscca: http://www.oscca.gov.cn/sca/xxgk/2010-12/17/content_1002386.shtml
    scctc: http://www.gmbz.org.cn/main/bzlb.html

    Signed-off-by: Tianjia Zhang
    Tested-by: Xufeng Zhang
    Signed-off-by: Herbert Xu

    Tianjia Zhang
     
  • Both crypto_sm3_update and crypto_sm3_finup have been
    exported, exporting crypto_sm3_final, to avoid having to
    use crypto_sm3_finup(desc, NULL, 0, dgst) to calculate
    the hash in some cases.

    Signed-off-by: Tianjia Zhang
    Tested-by: Xufeng Zhang
    Signed-off-by: Herbert Xu

    Tianjia Zhang
     
  • Extend the user-space RNG interface:
    1. Add entropy input via ALG_SET_DRBG_ENTROPY setsockopt option;
    2. Add additional data input via sendmsg syscall.

    This allows DRBG to be tested with test vectors, for example for the
    purpose of CAVP testing, which otherwise isn't possible.

    To prevent erroneous use of entropy input, it is hidden under
    CRYPTO_USER_API_RNG_CAVP config option and requires CAP_SYS_ADMIN to
    succeed.

    Signed-off-by: Elena Petrova
    Acked-by: Stephan Müller
    Reviewed-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Elena Petrova
     

11 Sep, 2020

1 commit


28 Aug, 2020

3 commits


21 Aug, 2020

1 commit

  • Revert "crypto: hash - Add real ahash walk interface"
    This reverts commit 75ecb231ff45b54afa9f4ec9137965c3c00868f4.

    The callers of the functions in this commit were removed in ab8085c130ed

    Remove these unused calls.

    Fixes: ab8085c130ed ("crypto: x86 - remove SHA multibuffer routines and mcryptd")
    Cc: Ard Biesheuvel
    Signed-off-by: Ira Weiny
    Signed-off-by: Herbert Xu

    Ira Weiny
     

20 Aug, 2020

1 commit

  • The header file algapi.h includes skbuff.h unnecessarily since
    all we need is a forward declaration for struct sk_buff. This
    patch removes that inclusion.

    Unfortunately skbuff.h pulls in a lot of things and drivers over
    the years have come to rely on it so this patch adds a lot of
    missing inclusions that result from this.

    Signed-off-by: Herbert Xu

    Herbert Xu
     

19 Aug, 2020

1 commit

  • This patch moves crypto_yield into internal.h as it's only used
    by internal code such as skcipher. It also adds a missing inclusion
    of sched.h which is required for cond_resched.

    The header files in internal.h have been cleaned up to remove some
    ancient junk and add some more specific inclusions.

    Signed-off-by: Herbert Xu

    Herbert Xu
     

08 Aug, 2020

1 commit

  • As said by Linus:

    A symmetric naming is only helpful if it implies symmetries in use.
    Otherwise it's actively misleading.

    In "kzalloc()", the z is meaningful and an important part of what the
    caller wants.

    In "kzfree()", the z is actively detrimental, because maybe in the
    future we really _might_ want to use that "memfill(0xdeadbeef)" or
    something. The "zero" part of the interface isn't even _relevant_.

    The main reason that kzfree() exists is to clear sensitive information
    that should not be leaked to other future users of the same memory
    objects.

    Rename kzfree() to kfree_sensitive() to follow the example of the recently
    added kvfree_sensitive() and make the intention of the API more explicit.
    In addition, memzero_explicit() is used to clear the memory to make sure
    that it won't get optimized away by the compiler.

    The renaming is done by using the command sequence:

    git grep -w --name-only kzfree |\
    xargs sed -i 's/kzfree/kfree_sensitive/'

    followed by some editing of the kfree_sensitive() kerneldoc and adding
    a kzfree backward compatibility macro in slab.h.

    [akpm@linux-foundation.org: fs/crypto/inline_crypt.c needs linux/slab.h]
    [akpm@linux-foundation.org: fix fs/crypto/inline_crypt.c some more]

    Suggested-by: Joe Perches
    Signed-off-by: Waiman Long
    Signed-off-by: Andrew Morton
    Acked-by: David Howells
    Acked-by: Michal Hocko
    Acked-by: Johannes Weiner
    Cc: Jarkko Sakkinen
    Cc: James Morris
    Cc: "Serge E. Hallyn"
    Cc: Joe Perches
    Cc: Matthew Wilcox
    Cc: David Rientjes
    Cc: Dan Carpenter
    Cc: "Jason A . Donenfeld"
    Link: http://lkml.kernel.org/r/20200616154311.12314-3-longman@redhat.com
    Signed-off-by: Linus Torvalds

    Waiman Long
     

05 Aug, 2020

1 commit

  • Pull documentation updates from Jonathan Corbet:
    "It's been a busy cycle for documentation - hopefully the busiest for a
    while to come. Changes include:

    - Some new Chinese translations

    - Progress on the battle against double words words and non-HTTPS
    URLs

    - Some block-mq documentation

    - More RST conversions from Mauro. At this point, that task is
    essentially complete, so we shouldn't see this kind of churn again
    for a while. Unless we decide to switch to asciidoc or
    something...:)

    - Lots of typo fixes, warning fixes, and more"

    * tag 'docs-5.9' of git://git.lwn.net/linux: (195 commits)
    scripts/kernel-doc: optionally treat warnings as errors
    docs: ia64: correct typo
    mailmap: add entry for
    doc/zh_CN: add cpu-load Chinese version
    Documentation/admin-guide: tainted-kernels: fix spelling mistake
    MAINTAINERS: adjust kprobes.rst entry to new location
    devices.txt: document rfkill allocation
    PCI: correct flag name
    docs: filesystems: vfs: correct flag name
    docs: filesystems: vfs: correct sync_mode flag names
    docs: path-lookup: markup fixes for emphasis
    docs: path-lookup: more markup fixes
    docs: path-lookup: fix HTML entity mojibake
    CREDITS: Replace HTTP links with HTTPS ones
    docs: process: Add an example for creating a fixes tag
    doc/zh_CN: add Chinese translation prefer section
    doc/zh_CN: add clearing-warn-once Chinese version
    doc/zh_CN: add admin-guide index
    doc:it_IT: process: coding-style.rst: Correct __maybe_unused compiler label
    futex: MAINTAINERS: Re-add selftests directory
    ...

    Linus Torvalds
     

23 Jul, 2020

2 commits


16 Jul, 2020

7 commits

  • Introduce a new algorithm flag CRYPTO_ALG_ALLOCATES_MEMORY. If this
    flag is set, then the driver allocates memory in its request routine.
    Such drivers are not suitable for disk encryption because GFP_ATOMIC
    allocation can fail anytime (causing random I/O errors) and GFP_KERNEL
    allocation can recurse into the block layer, causing a deadlock.

    For now, this flag is only implemented for some algorithm types. We
    also assume some usage constraints for it to be meaningful, since there
    are lots of edge cases the crypto API allows (e.g., misaligned or
    fragmented scatterlists) that mean that nearly any crypto algorithm can
    allocate memory in some case. See the comment for details.

    Also add this flag to CRYPTO_ALG_INHERITED_FLAGS so that when a template
    is instantiated, this flag is set on the template instance if it is set
    on any algorithm the instance uses.

    Based on a patch by Mikulas Patocka
    (https://lore.kernel.org/r/alpine.LRH.2.02.2006301414580.30526@file01.intranet.prod.int.rdu2.redhat.com).

    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • CRYPTO_ALG_NEED_FALLBACK is handled inconsistently. When it's requested
    to be clear, some templates propagate that request to child algorithms,
    while others don't.

    It's apparently desired for NEED_FALLBACK to be propagated, to avoid
    deadlocks where a module tries to load itself while it's being
    initialized, and to avoid unnecessarily complex fallback chains where we
    have e.g. cbc-aes-$driver falling back to cbc(aes-$driver) where
    aes-$driver itself falls back to aes-generic, instead of cbc-aes-$driver
    simply falling back to cbc(aes-generic). There have been a number of
    fixes to this effect:

    commit 89027579bc6c ("crypto: xts - Propagate NEED_FALLBACK bit")
    commit d2c2a85cfe82 ("crypto: ctr - Propagate NEED_FALLBACK bit")
    commit e6c2e65c70a6 ("crypto: cbc - Propagate NEED_FALLBACK bit")

    But it seems that other templates can have the same problems too.

    To avoid this whack-a-mole, just add NEED_FALLBACK to INHERITED_FLAGS so
    that it's always inherited.

    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • The flag CRYPTO_ALG_ASYNC is "inherited" in the sense that when a
    template is instantiated, the template will have CRYPTO_ALG_ASYNC set if
    any of the algorithms it uses has CRYPTO_ALG_ASYNC set.

    We'd like to add a second flag (CRYPTO_ALG_ALLOCATES_MEMORY) that gets
    "inherited" in the same way. This is difficult because the handling of
    CRYPTO_ALG_ASYNC is hardcoded everywhere. Address this by:

    - Add CRYPTO_ALG_INHERITED_FLAGS, which contains the set of flags that
    have these inheritance semantics.

    - Add crypto_algt_inherited_mask(), for use by template ->create()
    methods. It returns any of these flags that the user asked to be
    unset and thus must be passed in the 'mask' to crypto_grab_*().

    - Also modify crypto_check_attr_type() to handle computing the 'mask'
    so that most templates can just use this.

    - Make crypto_grab_*() propagate these flags to the template instance
    being created so that templates don't have to do this themselves.

    Make crypto/simd.c propagate these flags too, since it "wraps" another
    algorithm, similar to a template.

    Based on a patch by Mikulas Patocka
    (https://lore.kernel.org/r/alpine.LRH.2.02.2006301414580.30526@file01.intranet.prod.int.rdu2.redhat.com).

    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • The type and mask arguments to aead_geniv_alloc() are always 0, so
    remove them.

    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • Add a function sha256() which computes a SHA-256 digest in one step,
    combining sha256_init() + sha256_update() + sha256_final().

    This is similar to how we also have blake2s().

    Reviewed-by: Ard Biesheuvel
    Tested-by: Hans de Goede
    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • Due to the fact that the x86 port does not support allocating objects
    on the stack with an alignment that exceeds 8 bytes, we have a rather
    ugly hack in the x86 code for ChaCha to ensure that the state array is
    aligned to 16 bytes, allowing the SSE3 implementation of the algorithm
    to use aligned loads.

    Given that the performance benefit of using of aligned loads appears to
    be limited (~0.25% for 1k blocks using tcrypt on a Corei7-8650U), and
    the fact that this hack has leaked into generic ChaCha code, let's just
    remove it.

    Cc: Martin Willi
    Cc: Herbert Xu
    Cc: Eric Biggers
    Signed-off-by: Ard Biesheuvel
    Reviewed-by: Martin Willi
    Reviewed-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Ard Biesheuvel
     
  • This patch adds a declaration for chacha20poly1305_selftest to
    silence a sparse warning.

    Signed-off-by: Herbert Xu

    Herbert Xu
     

09 Jul, 2020

1 commit

  • For a Linux server with NUMA, there are possibly multiple (de)compressors
    which are either local or remote to some NUMA node. Some drivers will
    automatically use the (de)compressor near the CPU calling acomp_alloc().
    However, it is not necessarily correct because users who send acomp_req
    could be from different NUMA node with the CPU which allocates acomp.

    Just like kernel has kmalloc() and kmalloc_node(), here crypto can have
    same support.

    Cc: Seth Jennings
    Cc: Dan Streetman
    Cc: Vitaly Wool
    Cc: Andrew Morton
    Cc: Jonathan Cameron
    Signed-off-by: Barry Song
    Signed-off-by: Herbert Xu

    Barry Song
     

20 Jun, 2020

1 commit

  • This file is almost compatible with ReST. Just minor changes
    were needed:

    - Adjust document and titles markups;
    - Adjust numbered list markups;
    - Add a comments markup for the Contents section;
    - Add markups for literal blocks.

    Acked-by: Jarkko Sakkinen
    Signed-off-by: Mauro Carvalho Chehab
    Link: https://lore.kernel.org/r/c2275ea94e0507a01b020ab66dfa824d8b1c2545.1592203650.git.mchehab+huawei@kernel.org
    Signed-off-by: Jonathan Corbet

    Mauro Carvalho Chehab
     

18 Jun, 2020

2 commits

  • AEAD does not support partial requests so we must not wake up
    while ctx->more is set. In order to distinguish between the
    case of no data sent yet and a zero-length request, a new init
    flag has been added to ctx.

    SKCIPHER has also been modified to ensure that at least a block
    of data is available if there is more data to come.

    Fixes: 2d97591ef43d ("crypto: af_alg - consolidation of...")
    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • The locking in af_alg_release_parent is broken as the BH socket
    lock can only be taken if there is a code-path to handle the case
    where the lock is owned by process-context. Instead of adding
    such handling, we can fix this by changing the ref counts to
    atomic_t.

    This patch also modifies the main refcnt to include both normal
    and nokey sockets. This way we don't have to fudge the nokey
    ref count when a socket changes from nokey to normal.

    Credits go to Mauricio Faria de Oliveira who diagnosed this bug
    and sent a patch for it:

    https://lore.kernel.org/linux-crypto/20200605161657.535043-1-mfo@canonical.com/

    Reported-by: Brian Moyles
    Reported-by: Mauricio Faria de Oliveira
    Fixes: 37f96694cf73 ("crypto: af_alg - Use bh_lock_sock in...")
    Cc:
    Signed-off-by: Herbert Xu

    Herbert Xu
     

08 May, 2020

7 commits

  • sounds very generic and important, like it's the
    header to include if you're doing cryptographic hashing in the kernel.
    But actually it only includes the library implementation of the SHA-1
    compression function (not even the full SHA-1). This should basically
    never be used anymore; SHA-1 is no longer considered secure, and there
    are much better ways to do cryptographic hashing in the kernel.

    Remove this header and fold it into which already
    contains constants and functions for SHA-1 (along with SHA-2).

    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • Currently the simplest use of the shash API is to use
    crypto_shash_digest() to digest a whole buffer. However, this still
    requires allocating a hash descriptor (struct shash_desc). Many users
    don't really want to preallocate one and instead just use a one-off
    descriptor on the stack like the following:

    {
    SHASH_DESC_ON_STACK(desc, tfm);
    int err;

    desc->tfm = tfm;

    err = crypto_shash_digest(desc, data, len, out);

    shash_desc_zero(desc);
    }

    Wrap this in a new helper function crypto_shash_tfm_digest() that can be
    used instead of the above.

    Signed-off-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • The SHA-256 / SHA-224 library functions can't fail, so remove the
    useless return value.

    Also long as the declarations are being changed anyway, also fix some
    parameter names in the declarations to match the definitions.

    Signed-off-by: Eric Biggers
    Reviewed-by: Jason A. Donenfeld
    Signed-off-by: Herbert Xu

    Eric Biggers
     
  • users may call crypto_has_acomp to confirm the existence of acomp before using
    crypto_acomp APIs. Right now, many acomp have scomp backend, for example, lz4,
    lzo, deflate etc. crypto_has_acomp will return false for them even though they
    support acomp APIs.

    Signed-off-by: Barry Song
    Signed-off-by: Herbert Xu

    Barry Song
     
  • Added support for batch requests, per crypto engine.
    A new callback is added, do_batch_requests, which executes a
    batch of requests. This has the crypto_engine structure as argument
    (for cases when more than one crypto-engine is used).
    The crypto_engine_alloc_init_and_set function, initializes
    crypto-engine, but also, sets the do_batch_requests callback.
    On crypto_pump_requests, if do_batch_requests callback is
    implemented in a driver, this will be executed. The link between
    the requests will be done in driver, if possible.
    do_batch_requests is available only if the hardware has support
    for multiple request.

    Signed-off-by: Iuliana Prodan
    Signed-off-by: Herbert Xu

    Iuliana Prodan
     
  • Added support for executing multiple requests, in parallel,
    for crypto engine based on a retry mechanism.
    If hardware was unable to execute a backlog request, enqueue it
    back in front of crypto-engine queue, to keep the order
    of requests.

    A new variable is added, retry_support (this is to keep the
    backward compatibility of crypto-engine) , which keeps track
    whether the hardware has support for retry mechanism and,
    also, if can run multiple requests.

    If do_one_request() returns:
    >= 0: hardware executed the request successfully;
    < 0: this is the old error path. If hardware has support for retry
    mechanism, the request is put back in front of crypto-engine queue.
    For backwards compatibility, if the retry support is not available,
    the crypto-engine will work as before.
    If hardware queue is full (-ENOSPC), requeue request regardless
    of MAY_BACKLOG flag.
    If hardware throws any other error code (like -EIO, -EINVAL,
    -ENOMEM, etc.) only MAY_BACKLOG requests are enqueued back into
    crypto-engine's queue, since the others can be dropped.

    The new crypto_engine_alloc_init_and_set function, initializes
    crypto-engine, sets the maximum size for crypto-engine software
    queue (not hardcoded anymore) and the retry_support variable
    is set, by default, to false.
    On crypto_pump_requests(), if do_one_request() returns >= 0,
    a new request is send to hardware, until there is no space in
    hardware and do_one_request() returns < 0.

    By default, retry_support is false and crypto-engine will
    work as before - will send requests to hardware,
    one-by-one, on crypto_pump_requests(), and complete it, on
    crypto_finalize_request(), and so on.

    To support multiple requests, in each driver, retry_support
    must be set on true, and if do_one_request() returns an error
    the request must not be freed, since it will be enqueued back
    into crypto-engine's queue.

    When all drivers, that use crypto-engine now, will be updated for
    retry mechanism, the retry_support variable can be removed.

    Signed-off-by: Iuliana Prodan
    Signed-off-by: Herbert Xu

    Iuliana Prodan
     
  • Add crypto_enqueue_request_head function that enqueues a
    request in front of queue.
    This will be used in crypto-engine, on error path. In case a request
    was not executed by hardware, enqueue it back in front of queue (to
    keep the order of requests).

    Signed-off-by: Iuliana Prodan
    Signed-off-by: Herbert Xu

    Iuliana Prodan
     

24 Apr, 2020

1 commit


08 Apr, 2020

1 commit

  • Since we're doing a static inline dispatch here, we normally branch
    based on whether or not there's an arch implementation. That would have
    been fine in general, except the crypto Makefile prior used to turn
    things off -- despite the Kconfig -- resulting in us needing to also
    hard code various assembler things into the dispatcher too. The horror!
    Now that the assembler config options are done by Kconfig, we can get
    rid of the inconsistency.

    Signed-off-by: Jason A. Donenfeld
    Acked-by: Herbert Xu
    Acked-by: Ingo Molnar
    Signed-off-by: Masahiro Yamada

    Jason A. Donenfeld
     

02 Apr, 2020

1 commit

  • Pull crypto updates from Herbert Xu:
    "API:
    - Fix out-of-sync IVs in self-test for IPsec AEAD algorithms

    Algorithms:
    - Use formally verified implementation of x86/curve25519

    Drivers:
    - Enhance hwrng support in caam

    - Use crypto_engine for skcipher/aead/rsa/hash in caam

    - Add Xilinx AES driver

    - Add uacce driver

    - Register zip engine to uacce in hisilicon

    - Add support for OCTEON TX CPT engine in marvell"

    * 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (162 commits)
    crypto: af_alg - bool type cosmetics
    crypto: arm[64]/poly1305 - add artifact to .gitignore files
    crypto: caam - limit single JD RNG output to maximum of 16 bytes
    crypto: caam - enable prediction resistance in HRWNG
    bus: fsl-mc: add api to retrieve mc version
    crypto: caam - invalidate entropy register during RNG initialization
    crypto: caam - check if RNG job failed
    crypto: caam - simplify RNG implementation
    crypto: caam - drop global context pointer and init_done
    crypto: caam - use struct hwrng's .init for initialization
    crypto: caam - allocate RNG instantiation descriptor with GFP_DMA
    crypto: ccree - remove duplicated include from cc_aead.c
    crypto: chelsio - remove set but not used variable 'adap'
    crypto: marvell - enable OcteonTX cpt options for build
    crypto: marvell - add the Virtual Function driver for CPT
    crypto: marvell - add support for OCTEON TX CPT engine
    crypto: marvell - create common Kconfig and Makefile for Marvell
    crypto: arm/neon - memzero_explicit aes-cbc key
    crypto: bcm - Use scnprintf() for avoiding potential buffer overflow
    crypto: atmel-i2c - Fix wakeup fail
    ...

    Linus Torvalds
     

12 Mar, 2020

1 commit


06 Mar, 2020

1 commit

  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva
    Reviewed-by: Horia Geantă
    Signed-off-by: Herbert Xu

    Gustavo A. R. Silva
     

05 Mar, 2020

1 commit

  • Some older version of GAS do not support the ADX instructions, similarly
    to how they also don't support AVX and such. This commit adds the same
    build-time detection mechanisms we use for AVX and others for ADX, and
    then makes sure that the curve25519 library dispatcher calls the right
    functions.

    Reported-by: Willy Tarreau
    Signed-off-by: Jason A. Donenfeld
    Signed-off-by: Herbert Xu

    Jason A. Donenfeld