1. 20 Apr, 2016 6 commits
  2. 18 Apr, 2016 4 commits
  3. 15 Apr, 2016 9 commits
  4. 05 Apr, 2016 21 commits
    • Krzysztof Kozlowski's avatar
      hwrng: exynos - Fix misspelled Samsung address · 043809d8
      Krzysztof Kozlowski authored
      Correct smasung.com into samsung.com.
      Signed-off-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      043809d8
    • Tadeusz Struk's avatar
      crypto: qat - changed adf_dev_stop to void · f1420cee
      Tadeusz Struk authored
      It returns always zero anyway.
      Signed-off-by: default avatarTadeusz Struk <tadeusz.struk@intel.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      f1420cee
    • Tadeusz Struk's avatar
      crypto: qat - explicitly stop all VFs first · cb00bca4
      Tadeusz Struk authored
      When stopping devices it is not enought to loop backwards.
      We need to explicitly stop all VFs first.
      Signed-off-by: default avatarTadeusz Struk <tadeusz.struk@intel.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      cb00bca4
    • Stephan Mueller's avatar
      crypto: drbg - set HMAC key only when altered · 4218ebe8
      Stephan Mueller authored
      The HMAC implementation allows setting the HMAC key independently from
      the hashing operation. Therefore, the key only needs to be set when a
      new key is generated.
      
      This patch increases the speed of the HMAC DRBG by at least 35% depending
      on the use case.
      
      The patch is fully CAVS tested.
      Signed-off-by: default avatarStephan Mueller <smueller@chronox.de>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      4218ebe8
    • Corentin LABBE's avatar
      crypto: sun4i-ss - Replace spinlock_bh by spin_lock_irq{save|restore} · bdb6cf9f
      Corentin LABBE authored
      The current sun4i-ss driver could generate data corruption when ciphering/deciphering.
      It occurs randomly on end of handled data.
      No root cause have been found and the only way to remove it is to replace
      all spin_lock_bh by their irq counterparts.
      
      Fixes: 6298e948 ("crypto: sunxi-ss - Add Allwinner Security System crypto accelerator")
      Signed-off-by: default avatarLABBE Corentin <clabbe.montjoie@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      bdb6cf9f
    • Tudor Ambarus's avatar
    • Tudor Ambarus's avatar
      crypto: qat - avoid memory corruption or undefined behaviour · aa8b6dd4
      Tudor Ambarus authored
      memcopying to a (null pointer + offset) will result
      in memory corruption or undefined behaviour.
      Signed-off-by: default avatarTudor Ambarus <tudor-dan.ambarus@nxp.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      aa8b6dd4
    • Ahsan Atta's avatar
      crypto: qat - Remove redundant nrbg rings · 0c4935b3
      Ahsan Atta authored
      Remove redundant nrbg rings.
      Signed-off-by: default avatarAhsan Atta <ahsan.atta@intel.com>
      Signed-off-by: default avatarTadeusz Struk <tadeusz.struk@intel.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      0c4935b3
    • Tadeusz Struk's avatar
      crypto: qat - make sure const_tab is 1024 bytes aligned · 082ebe92
      Tadeusz Struk authored
      FW requires the const_tab to be 1024 bytes aligned.
      Signed-off-by: default avatarTadeusz Struk <tadeusz.struk@intel.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      082ebe92
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_raw_from_sgl(): fix out-of-bounds buffer access · 0bb5c9ea
      Nicolai Stange authored
      Within the copying loop in mpi_read_raw_from_sgl(), the last input SGE's
      byte count gets artificially extended as follows:
      
        if (sg_is_last(sg) && (len % BYTES_PER_MPI_LIMB))
          len += BYTES_PER_MPI_LIMB - (len % BYTES_PER_MPI_LIMB);
      
      Within the following byte copying loop, this causes reads beyond that
      SGE's allocated buffer:
      
        BUG: KASAN: slab-out-of-bounds in mpi_read_raw_from_sgl+0x331/0x650
                                           at addr ffff8801e168d4d8
        Read of size 1 by task systemd-udevd/721
        [...]
        Call Trace:
         [<ffffffff818c4d35>] dump_stack+0xbc/0x117
         [<ffffffff818c4c79>] ? _atomic_dec_and_lock+0x169/0x169
         [<ffffffff814af5d1>] ? print_section+0x61/0xb0
         [<ffffffff814b1109>] print_trailer+0x179/0x2c0
         [<ffffffff814bc524>] object_err+0x34/0x40
         [<ffffffff814bfdc7>] kasan_report_error+0x307/0x8c0
         [<ffffffff814bf315>] ? kasan_unpoison_shadow+0x35/0x50
         [<ffffffff814bf38e>] ? kasan_kmalloc+0x5e/0x70
         [<ffffffff814c0ad1>] kasan_report+0x71/0xa0
         [<ffffffff81938171>] ? mpi_read_raw_from_sgl+0x331/0x650
         [<ffffffff814bf1a6>] __asan_load1+0x46/0x50
         [<ffffffff81938171>] mpi_read_raw_from_sgl+0x331/0x650
         [<ffffffff817f41b6>] rsa_verify+0x106/0x260
         [<ffffffff817f40b0>] ? rsa_set_pub_key+0xf0/0xf0
         [<ffffffff818edc79>] ? sg_init_table+0x29/0x50
         [<ffffffff817f4d22>] ? pkcs1pad_sg_set_buf+0xb2/0x2e0
         [<ffffffff817f5b74>] pkcs1pad_verify+0x1f4/0x2b0
         [<ffffffff81831057>] public_key_verify_signature+0x3a7/0x5e0
         [<ffffffff81830cb0>] ? public_key_describe+0x80/0x80
         [<ffffffff817830f0>] ? keyring_search_aux+0x150/0x150
         [<ffffffff818334a4>] ? x509_request_asymmetric_key+0x114/0x370
         [<ffffffff814b83f0>] ? kfree+0x220/0x370
         [<ffffffff818312c2>] public_key_verify_signature_2+0x32/0x50
         [<ffffffff81830b5c>] verify_signature+0x7c/0xb0
         [<ffffffff81835d0c>] pkcs7_validate_trust+0x42c/0x5f0
         [<ffffffff813c391a>] system_verify_data+0xca/0x170
         [<ffffffff813c3850>] ? top_trace_array+0x9b/0x9b
         [<ffffffff81510b29>] ? __vfs_read+0x279/0x3d0
         [<ffffffff8129372f>] mod_verify_sig+0x1ff/0x290
        [...]
      
      The exact purpose of the len extension isn't clear to me, but due to
      its form, I suspect that it's a leftover somehow accounting for leading
      zero bytes within the most significant output limb.
      
      Note however that without that len adjustement, the total number of bytes
      ever processed by the inner loop equals nbytes and thus, the last output
      limb gets written at this point. Thus the net effect of the len adjustement
      cited above is just to keep the inner loop running for some more
      iterations, namely < BYTES_PER_MPI_LIMB ones, reading some extra bytes from
      beyond the last SGE's buffer and discarding them afterwards.
      
      Fix this issue by purging the extension of len beyond the last input SGE's
      buffer length.
      
      Fixes: 2d4d1eea ("lib/mpi: Add mpi sgl helpers")
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      0bb5c9ea
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_raw_from_sgl(): sanitize meaning of indices · 85d541a3
      Nicolai Stange authored
      Within the byte reading loop in mpi_read_raw_sgl(), there are two
      housekeeping indices used, z and x.
      
      At all times, the index z represents the number of output bytes covered
      by the input SGEs for which processing has completed so far. This includes
      any leading zero bytes within the most significant limb.
      
      The index x changes its meaning after the first outer loop's iteration
      though: while processing the first input SGE, it represents
      
        "number of leading zero bytes in most significant output limb" +
         "current position within current SGE"
      
      For the remaining SGEs OTOH, x corresponds just to
      
        "current position within current SGE"
      
      After all, it is only the sum of z and x that has any meaning for the
      output buffer and thus, the
      
        "number of leading zero bytes in most significant output limb"
      
      part can be moved away from x into z from the beginning, opening up the
      opportunity for cleaner code.
      
      Before the outer loop iterating over the SGEs, don't initialize z with
      zero, but with the number of leading zero bytes in the most significant
      output limb. For the inner loop iterating over a single SGE's bytes,
      get rid of the buf_shift offset to x' bounds and let x run from zero to
      sg->length - 1.
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      85d541a3
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_raw_from_sgl(): fix nbits calculation · 64c09b0b
      Nicolai Stange authored
      The number of bits, nbits, is calculated in mpi_read_raw_from_sgl() as
      follows:
      
        nbits = nbytes * 8;
      
      Afterwards, the number of leading zero bits of the first byte get
      subtracted:
      
        nbits -= count_leading_zeros(*(u8 *)(sg_virt(sgl) + lzeros));
      
      However, count_leading_zeros() takes an unsigned long and thus,
      the u8 gets promoted to an unsigned long.
      
      Thus, the above doesn't subtract the number of leading zeros in the most
      significant nonzero input byte from nbits, but the number of leading
      zeros of the most significant nonzero input byte promoted to unsigned long,
      i.e. BITS_PER_LONG - 8 too many.
      
      Fix this by subtracting
      
        count_leading_zeros(...) - (BITS_PER_LONG - 8)
      
      from nbits only.
      
      Fixes: 2d4d1eea ("lib/mpi: Add mpi sgl helpers")
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      64c09b0b
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_raw_from_sgl(): purge redundant clearing of nbits · 60e1b74c
      Nicolai Stange authored
      In mpi_read_raw_from_sgl(), unsigned nbits is calculated as follows:
      
        nbits = nbytes * 8;
      
      and redundantly cleared later on if nbytes == 0:
      
        if (nbytes > 0)
          ...
        else
          nbits = 0;
      
      Purge this redundant clearing for the sake of clarity.
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      60e1b74c
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_raw_from_sgl(): don't include leading zero SGEs in nbytes · ab1e912e
      Nicolai Stange authored
      At the very beginning of mpi_read_raw_from_sgl(), the leading zeros of
      the input scatterlist are counted:
      
        lzeros = 0;
        for_each_sg(sgl, sg, ents, i) {
          ...
          if (/* sg contains nonzero bytes */)
            break;
      
          /* sg contains nothing but zeros here */
          ents--;
          lzeros = 0;
        }
      
      Later on, the total number of trailing nonzero bytes is calculated by
      subtracting the number of leading zero bytes from the total number of input
      bytes:
      
        nbytes -= lzeros;
      
      However, since lzeros gets reset to zero for each completely zero leading
      sg in the loop above, it doesn't include those.
      
      Besides wasting resources by allocating a too large output buffer,
      this mistake propagates into the calculation of x, the number of
      leading zeros within the most significant output limb:
      
        x = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
      
      What's more, the low order bytes of the output, equal in number to the
      extra bytes in nbytes, are left uninitialized.
      
      Fix this by adjusting nbytes for each completely zero leading scatterlist
      entry.
      
      Fixes: 2d4d1eea ("lib/mpi: Add mpi sgl helpers")
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      ab1e912e
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_raw_from_sgl(): replace len argument by nbytes · b6985389
      Nicolai Stange authored
      Currently, the nbytes local variable is calculated from the len argument
      as follows:
      
        ... mpi_read_raw_from_sgl(..., unsigned int len)
        {
          unsigned nbytes;
          ...
          if (!ents)
            nbytes = 0;
          else
            nbytes = len - lzeros;
          ...
        }
      
      Given that nbytes is derived from len in a trivial way and that the len
      argument is shadowed by a local len variable in several loops, this is just
      confusing.
      
      Rename the len argument to nbytes and get rid of the nbytes local variable.
      Do the nbytes calculation in place.
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      b6985389
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_buffer(): fix buffer overflow · 462696fd
      Nicolai Stange authored
      Currently, mpi_read_buffer() writes full limbs to the output buffer
      and moves memory around to purge leading zero limbs afterwards.
      
      However, with
      
        commit 9cbe21d8 ("lib/mpi: only require buffers as big as needed for
                              the integer")
      
      the caller is only required to provide a buffer large enough to hold the
      result without the leading zeros.
      
      This might result in a buffer overflow for small MP numbers with leading
      zeros.
      
      Fix this by coping the result to its final destination within the output
      buffer and not copying the leading zeros at all.
      
      Fixes: 9cbe21d8 ("lib/mpi: only require buffers as big as needed for
                            the integer")
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      462696fd
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_buffer(): replace open coded endian conversion · 90f864e2
      Nicolai Stange authored
      Currently, the endian conversion from CPU order to BE is open coded in
      mpi_read_buffer().
      
      Replace this by the centrally provided cpu_to_be*() macros.
      Copy from the temporary storage on stack to the destination buffer
      by means of memcpy().
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      90f864e2
    • Nicolai Stange's avatar
      lib/mpi: mpi_read_buffer(): optimize skipping of leading zero limbs · f00fa241
      Nicolai Stange authored
      Currently, if the number of leading zeros is greater than fits into a
      complete limb, mpi_read_buffer() skips them by iterating over them
      limb-wise.
      
      Instead of skipping the high order zero limbs within the loop as shown
      above, adjust the copying loop's bounds.
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      f00fa241
    • Nicolai Stange's avatar
      lib/mpi: mpi_write_sgl(): replace open coded endian conversion · d7552906
      Nicolai Stange authored
      Currently, the endian conversion from CPU order to BE is open coded in
      mpi_write_sgl().
      
      Replace this by the centrally provided cpu_to_be*() macros.
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      d7552906
    • Nicolai Stange's avatar
      lib/mpi: mpi_write_sgl(): fix out-of-bounds stack access · cece762f
      Nicolai Stange authored
      Within the copying loop in mpi_write_sgl(), we have
      
        if (lzeros) {
          mpi_limb_t *limb1 = (void *)p - sizeof(alimb);
          mpi_limb_t *limb2 = (void *)p - sizeof(alimb)
                                     + lzeros;
          *limb1 = *limb2;
          ...
        }
      
      where p points past the end of alimb2 which lives on the stack and contains
      the current limb in BE order.
      
      The purpose of the above is to shift the non-zero bytes of alimb2 to its
      beginning in memory, i.e. to skip its leading zero bytes.
      
      However, limb2 points somewhere into the middle of alimb2 and thus, reading
      *limb2 pulls in lzero bytes from somewhere.
      
      Indeed, KASAN splats:
      
        BUG: KASAN: stack-out-of-bounds in mpi_write_to_sgl+0x4e3/0x6f0
                                            at addr ffff8800cb04f601
        Read of size 8 by task systemd-udevd/391
        page:ffffea00032c13c0 count:0 mapcount:0 mapping:   (null) index:0x0
        flags: 0x3fff8000000000()
        page dumped because: kasan: bad access detected
        CPU: 3 PID: 391 Comm: systemd-udevd Tainted: G  B  L
                                                    4.5.0-next-20160316+ #12
        [...]
        Call Trace:
         [<ffffffff8194889e>] dump_stack+0xdc/0x15e
         [<ffffffff819487c2>] ? _atomic_dec_and_lock+0xa2/0xa2
         [<ffffffff814892b5>] ? __dump_page+0x185/0x330
         [<ffffffff8150ffd6>] kasan_report_error+0x5e6/0x8b0
         [<ffffffff814724cd>] ? kzfree+0x2d/0x40
         [<ffffffff819c5bce>] ? mpi_free_limb_space+0xe/0x20
         [<ffffffff819c469e>] ? mpi_powm+0x37e/0x16f0
         [<ffffffff815109f1>] kasan_report+0x71/0xa0
         [<ffffffff819c0353>] ? mpi_write_to_sgl+0x4e3/0x6f0
         [<ffffffff8150ed34>] __asan_load8+0x64/0x70
         [<ffffffff819c0353>] mpi_write_to_sgl+0x4e3/0x6f0
         [<ffffffff819bfe70>] ? mpi_set_buffer+0x620/0x620
         [<ffffffff819c0e6f>] ? mpi_cmp+0xbf/0x180
         [<ffffffff8186e282>] rsa_verify+0x202/0x260
      
      What's more, since lzeros can be anything from 1 to sizeof(mpi_limb_t)-1,
      the above will cause unaligned accesses which is bad on non-x86 archs.
      
      Fix the issue, by preparing the starting point p for the upcoming copy
      operation instead of shifting the source memory, i.e. alimb2.
      
      Fixes: 2d4d1eea ("lib/mpi: Add mpi sgl helpers")
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      cece762f
    • Nicolai Stange's avatar
      lib/mpi: mpi_write_sgl(): purge redundant pointer arithmetic · ea122be0
      Nicolai Stange authored
      Within the copying loop in mpi_write_sgl(), we have
      
        if (lzeros) {
          ...
          p -= lzeros;
          y = lzeros;
        }
        p = p - (sizeof(alimb) - y);
      
      If lzeros == 0, then y == 0, too. Thus, lzeros gets subtracted and added
      back again to p.
      
      Purge this redundancy.
      Signed-off-by: default avatarNicolai Stange <nicstange@gmail.com>
      Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
      ea122be0