public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/7] Add arc4random support
@ 2022-04-13 20:23 Adhemerval Zanella
  2022-04-13 20:23 ` [PATCH 1/7] stdlib: Add arc4random, arc4random_buf, and arc4random_uniform (BZ #4417) Adhemerval Zanella
                   ` (8 more replies)
  0 siblings, 9 replies; 34+ messages in thread
From: Adhemerval Zanella @ 2022-04-13 20:23 UTC (permalink / raw)
  To: libc-alpha

This patch adds the arc4random, arc4random_buf, and arc4random_uniform
along with optimized versions for x86_64, aarch64, and powerpc64.

The generic implementation is based on scalar Chacha20, with a global 
cache and locking.  It uses getrandom or /dev/urandom as fallback to 
get the initial entropy, and reseeds the internal state on every 16MB 
of consumed entropy.

It maintains an internal buffer which consumes at maximum one page on
most systems (assuming 4k pages).  The internal buffer optimizes the 
cipher encrypt calls, by amortize arc4random calls (where both
function call and locks cost are the dominating factor).

Fork detection is done by checking if MADV_WIPEONFORK supported.  If not
the fork callback will reset the state on the fork call.  It does not
handle direct clone calls, nor vfork or _Fork (arc4random is not
async-signal-safe due the internal lock usage, althought the
implementation does try to handle fork cases). 

The generic ChaCha20 implementation is based on the RFC8439 [1], which
a simple memcpy with xor implementation.  The optimized ones for x86_64,
aarch64, and powerpc64 use vectorized instruction and they are based on
libgcrypt code.

This patchset is different than the previous ones by using a much
simpler
scheme of fork detection (there is no attempt in using a global shared
counter to detect direct clone usages), and by using ChaCha20 instead
of AES.  ChaCha20 is used because is the standard cipher used on 
different arc4random implementation (BSDs, MacOSX), and recently on
Linux random subsystem.  It is also a much more simpler implementation
than AES and shows better performance when no specialized instructions
are present.

One possible improvement, not implemented in this patchset, it to use a
per-thread cache, since on some architecture the lock cost is somewhat
high.  Ideally it would reside in TCB to avoid require tuning static
TLS size, and it work similar to the malloc tcache where arc4random
would initially consume any thread local entropy thus avoid any locking.

[1] https://sourceware.org/pipermail/libc-alpha/2018-June/094879.html

Adhemerval Zanella (7):
  stdlib: Add arc4random, arc4random_buf, and arc4random_uniform (BZ
    #4417)
  stdlib: Add arc4random tests
  benchtests: Add arc4random benchtest
  x86: Add SSSE3 optimized chacha20
  x86: Add AVX2 optimized chacha20
  aarch64: Add optimized chacha20
  powerpc64: Add optimized chacha20

 LICENSES                                      |  21 ++
 NEWS                                          |   4 +-
 benchtests/Makefile                           |   6 +-
 benchtests/bench-arc4random.c                 | 243 ++++++++++++
 include/stdlib.h                              |  13 +
 posix/fork.c                                  |   2 +
 stdlib/Makefile                               |   6 +
 stdlib/Versions                               |   5 +
 stdlib/arc4random.c                           | 242 ++++++++++++
 stdlib/arc4random_uniform.c                   | 152 ++++++++
 stdlib/chacha20.c                             | 214 +++++++++++
 stdlib/stdlib.h                               |  14 +
 stdlib/tst-arc4random-chacha20.c              | 225 +++++++++++
 stdlib/tst-arc4random-fork.c                  | 174 +++++++++
 stdlib/tst-arc4random-stats.c                 | 146 +++++++
 stdlib/tst-arc4random-thread.c                | 278 ++++++++++++++
 sysdeps/aarch64/Makefile                      |   4 +
 sysdeps/aarch64/chacha20.S                    | 357 ++++++++++++++++++
 sysdeps/aarch64/chacha20_arch.h               |  43 +++
 sysdeps/generic/chacha20_arch.h               |  24 ++
 sysdeps/generic/not-cancel.h                  |   2 +
 sysdeps/mach/hurd/i386/libc.abilist           |   3 +
 sysdeps/mach/hurd/not-cancel.h                |   3 +
 sysdeps/powerpc/powerpc64/Makefile            |   3 +
 sysdeps/powerpc/powerpc64/chacha-ppc.c        | 254 +++++++++++++
 sysdeps/powerpc/powerpc64/chacha20_arch.h     |  53 +++
 sysdeps/unix/sysv/linux/aarch64/libc.abilist  |   3 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist    |   3 +
 sysdeps/unix/sysv/linux/arc/libc.abilist      |   3 +
 sysdeps/unix/sysv/linux/arm/be/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/arm/le/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/csky/libc.abilist     |   3 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist     |   3 +
 sysdeps/unix/sysv/linux/i386/libc.abilist     |   3 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist     |   3 +
 .../sysv/linux/m68k/coldfire/libc.abilist     |   3 +
 .../unix/sysv/linux/m68k/m680x0/libc.abilist  |   3 +
 .../sysv/linux/microblaze/be/libc.abilist     |   3 +
 .../sysv/linux/microblaze/le/libc.abilist     |   3 +
 .../sysv/linux/mips/mips32/fpu/libc.abilist   |   3 +
 .../sysv/linux/mips/mips32/nofpu/libc.abilist |   3 +
 .../sysv/linux/mips/mips64/n32/libc.abilist   |   3 +
 .../sysv/linux/mips/mips64/n64/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist    |   3 +
 sysdeps/unix/sysv/linux/not-cancel.h          |   7 +
 sysdeps/unix/sysv/linux/or1k/libc.abilist     |   3 +
 .../linux/powerpc/powerpc32/fpu/libc.abilist  |   3 +
 .../powerpc/powerpc32/nofpu/libc.abilist      |   3 +
 .../linux/powerpc/powerpc64/be/libc.abilist   |   3 +
 .../linux/powerpc/powerpc64/le/libc.abilist   |   3 +
 .../unix/sysv/linux/riscv/rv32/libc.abilist   |   3 +
 .../unix/sysv/linux/riscv/rv64/libc.abilist   |   3 +
 .../unix/sysv/linux/s390/s390-32/libc.abilist |   3 +
 .../unix/sysv/linux/s390/s390-64/libc.abilist |   3 +
 sysdeps/unix/sysv/linux/sh/be/libc.abilist    |   3 +
 sysdeps/unix/sysv/linux/sh/le/libc.abilist    |   3 +
 .../sysv/linux/sparc/sparc32/libc.abilist     |   3 +
 .../sysv/linux/sparc/sparc64/libc.abilist     |   3 +
 .../unix/sysv/linux/x86_64/64/libc.abilist    |   3 +
 .../unix/sysv/linux/x86_64/x32/libc.abilist   |   3 +
 sysdeps/x86_64/Makefile                       |   7 +
 sysdeps/x86_64/chacha20-avx2.S                | 317 ++++++++++++++++
 sysdeps/x86_64/chacha20-ssse3.S               | 330 ++++++++++++++++
 sysdeps/x86_64/chacha20_arch.h                |  56 +++
 64 files changed, 3305 insertions(+), 2 deletions(-)
 create mode 100644 benchtests/bench-arc4random.c
 create mode 100644 stdlib/arc4random.c
 create mode 100644 stdlib/arc4random_uniform.c
 create mode 100644 stdlib/chacha20.c
 create mode 100644 stdlib/tst-arc4random-chacha20.c
 create mode 100644 stdlib/tst-arc4random-fork.c
 create mode 100644 stdlib/tst-arc4random-stats.c
 create mode 100644 stdlib/tst-arc4random-thread.c
 create mode 100644 sysdeps/aarch64/chacha20.S
 create mode 100644 sysdeps/aarch64/chacha20_arch.h
 create mode 100644 sysdeps/generic/chacha20_arch.h
 create mode 100644 sysdeps/powerpc/powerpc64/chacha-ppc.c
 create mode 100644 sysdeps/powerpc/powerpc64/chacha20_arch.h
 create mode 100644 sysdeps/x86_64/chacha20-avx2.S
 create mode 100644 sysdeps/x86_64/chacha20-ssse3.S
 create mode 100644 sysdeps/x86_64/chacha20_arch.h

-- 
2.32.0


^ permalink raw reply	[flat|nested] 34+ messages in thread

end of thread, other threads:[~2022-04-15 10:22 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-13 20:23 [PATCH 0/7] Add arc4random support Adhemerval Zanella
2022-04-13 20:23 ` [PATCH 1/7] stdlib: Add arc4random, arc4random_buf, and arc4random_uniform (BZ #4417) Adhemerval Zanella
2022-04-13 20:23 ` [PATCH 2/7] stdlib: Add arc4random tests Adhemerval Zanella
2022-04-14 18:01   ` Noah Goldstein
2022-04-13 20:23 ` [PATCH 3/7] benchtests: Add arc4random benchtest Adhemerval Zanella
2022-04-14 19:17   ` Noah Goldstein
2022-04-14 19:48     ` Adhemerval Zanella
2022-04-14 20:33       ` Noah Goldstein
2022-04-14 20:48         ` Adhemerval Zanella
2022-04-13 20:23 ` [PATCH 4/7] x86: Add SSSE3 optimized chacha20 Adhemerval Zanella
2022-04-13 23:12   ` Noah Goldstein
2022-04-14 17:03     ` Adhemerval Zanella
2022-04-14 17:10       ` Noah Goldstein
2022-04-14 17:18         ` Adhemerval Zanella
2022-04-14 17:22           ` Noah Goldstein
2022-04-14 18:25             ` Adhemerval Zanella
2022-04-14 17:17   ` Noah Goldstein
2022-04-14 18:11     ` Adhemerval Zanella
2022-04-14 19:25   ` Noah Goldstein
2022-04-14 19:40     ` Adhemerval Zanella
2022-04-13 20:23 ` [PATCH 5/7] x86: Add AVX2 " Adhemerval Zanella
2022-04-13 23:04   ` Noah Goldstein
2022-04-14 17:16     ` Adhemerval Zanella
2022-04-14 17:20       ` Noah Goldstein
2022-04-14 18:12         ` Adhemerval Zanella
2022-04-13 20:24 ` [PATCH 6/7] aarch64: Add " Adhemerval Zanella
2022-04-13 20:24 ` [PATCH 7/7] powerpc64: " Adhemerval Zanella
2022-04-14  7:36 ` [PATCH 0/7] Add arc4random support Yann Droneaud
2022-04-14 18:39   ` Adhemerval Zanella
2022-04-14 18:43     ` Noah Goldstein
2022-04-15 10:22     ` Yann Droneaud
2022-04-14 11:49 ` Cristian Rodríguez
2022-04-14 19:26   ` Adhemerval Zanella
2022-04-14 20:36     ` Noah Goldstein

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).