This series introduces a generic Base64 encoder/decoder to the kernel library, eliminating duplicated implementations and delivering significant performance improvements.
The Base64 API has been extended to support multiple variants (Standard, URL-safe, and IMAP) as defined in RFC 4648 and RFC 3501. The API now takes a variant parameter and an option to control padding. As part of this series, users are migrated to the new interface while preserving their specific formats: fscrypt now uses BASE64_URLSAFE, Ceph uses BASE64_IMAP, and NVMe is updated to BASE64_STD. On the encoder side, the implementation processes input in 3-byte blocks, mapping 24 bits directly to 4 output symbols. This avoids bit-by-bit streaming and reduces loop overhead, achieving about a 2.7x speedup compared to previous implementations. On the decoder side, replace strchr() lookups with per-variant reverse tables and process input in 4-character groups. Each group is mapped to numeric values and combined into 3 bytes. Padded and unpadded forms are validated explicitly, rejecting invalid '=' usage and enforcing tail rules. This improves throughput by ~43-52x. Thanks, Guan-Chun Wu Link: https://lore.kernel.org/lkml/[email protected]/ --- v3 -> v4: - lib/base64: Implemented padding support in the first commit to address the previously mentioned issue. - lib/base64: Replace the manually written reverse lookup table initialization with the BASE64_REV_INIT() macro for cleaner and more maintainable code while keeping the same behavior. - lib/base64: Simplify branching and tail handling while preserving behavior, reducing overhead and improving performance. --- Guan-Chun Wu (4): lib/base64: rework encode/decode for speed and stricter validation lib: add KUnit tests for base64 encoding/decoding fscrypt: replace local base64url helpers with lib/base64 ceph: replace local base64 helpers with lib/base64 Kuan-Wei Chiu (2): lib/base64: Add support for multiple variants lib/base64: Optimize base64_decode() with reverse lookup tables drivers/nvme/common/auth.c | 4 +- fs/ceph/crypto.c | 60 +------- fs/ceph/crypto.h | 6 +- fs/ceph/dir.c | 5 +- fs/ceph/inode.c | 2 +- fs/crypto/fname.c | 89 +---------- include/linux/base64.h | 10 +- lib/Kconfig.debug | 19 ++- lib/base64.c | 161 +++++++++++++------- lib/tests/Makefile | 1 + lib/tests/base64_kunit.c | 294 +++++++++++++++++++++++++++++++++++++ 11 files changed, 445 insertions(+), 206 deletions(-) create mode 100644 lib/tests/base64_kunit.c -- 2.34.1
