[git commit] libbb/yescrypt: more efficient byteswapping
Denys Vlasenko
vda.linux at googlemail.com
Sun Jul 6 16:27:16 UTC 2025
commit: https://git.busybox.net/busybox/commit/?id=b8f76001662ad4b3073945589a0cb270b627c994
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master
function old new delta
static.smix1 631 604 -27
static.smix2 452 420 -32
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-59) Total: -59 bytes
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
libbb/yescrypt/alg-sha256.c | 10 ++--
libbb/yescrypt/alg-yescrypt-kdf.c | 8 +--
libbb/yescrypt/y.c | 122 --------------------------------------
3 files changed, 8 insertions(+), 132 deletions(-)
diff --git a/libbb/yescrypt/alg-sha256.c b/libbb/yescrypt/alg-sha256.c
index a17028b6b..28d8c5296 100644
--- a/libbb/yescrypt/alg-sha256.c
+++ b/libbb/yescrypt/alg-sha256.c
@@ -114,16 +114,12 @@ PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen,
{
HMAC_SHA256_CTX Phctx, PShctx, hctx;
size_t i;
- uint8_t ivec[4];
uint8_t U[32];
uint8_t T[32];
uint64_t j;
int k;
size_t clen;
- /* Sanity-check. */
- assert(dkLen <= 32 * (size_t)(UINT32_MAX));
-
/* Compute HMAC state after processing P. */
HMAC_SHA256_Init(&Phctx, passwd, passwdlen);
@@ -133,12 +129,14 @@ PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen,
/* Iterate through the blocks. */
for (i = 0; i * 32 < dkLen; i++) {
+ uint32_t ivec;
+
/* Generate INT(i + 1). */
- be32enc(ivec, (uint32_t)(i + 1));
+ ivec = SWAP_BE32((uint32_t)(i + 1));
/* Compute U_1 = PRF(P, S || INT(i)). */
memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
- HMAC_SHA256_Update(&hctx, ivec, 4);
+ HMAC_SHA256_Update(&hctx, &ivec, 4);
HMAC_SHA256_Final(&hctx, T);
if (c > 1) {
diff --git a/libbb/yescrypt/alg-yescrypt-kdf.c b/libbb/yescrypt/alg-yescrypt-kdf.c
index 5c1f1006a..ee8fb408e 100644
--- a/libbb/yescrypt/alg-yescrypt-kdf.c
+++ b/libbb/yescrypt/alg-yescrypt-kdf.c
@@ -501,7 +501,7 @@ static void smix1(uint8_t *B, size_t r, uint32_t N, yescrypt_flags_t flags,
salsa20_blk_t *dst = &X[i];
size_t k;
for (k = 0; k < 16; k++)
- tmp->w[k] = le32dec((const uint8_t *) &src->w[k]);
+ tmp->w[k] = SWAP_LE32(src->w[k]);
salsa20_simd_shuffle(tmp, dst);
}
@@ -591,7 +591,7 @@ static void smix1(uint8_t *B, size_t r, uint32_t N, yescrypt_flags_t flags,
salsa20_blk_t *dst = (salsa20_blk_t *)&B[i * 64];
size_t k;
for (k = 0; k < 16; k++)
- le32enc((uint8_t *)&tmp->w[k], src->w[k]);
+ tmp->w[k] = SWAP_LE32(src->w[k]);
salsa20_simd_unshuffle(tmp, dst);
}
}
@@ -621,7 +621,7 @@ static void smix2(uint8_t *B, size_t r, uint32_t N, uint64_t Nloop,
salsa20_blk_t *dst = &X[i];
size_t k;
for (k = 0; k < 16; k++)
- tmp->w[k] = le32dec((const uint8_t *)&src->w[k]);
+ tmp->w[k] = SWAP_LE32(src->w[k]);
salsa20_simd_shuffle(tmp, dst);
}
@@ -676,7 +676,7 @@ static void smix2(uint8_t *B, size_t r, uint32_t N, uint64_t Nloop,
salsa20_blk_t *dst = (salsa20_blk_t *)&B[i * 64];
size_t k;
for (k = 0; k < 16; k++)
- le32enc((uint8_t *)&tmp->w[k], src->w[k]);
+ tmp->w[k] = SWAP_LE32(src->w[k]);
salsa20_simd_unshuffle(tmp, dst);
}
}
diff --git a/libbb/yescrypt/y.c b/libbb/yescrypt/y.c
index 2c6afd4f8..92c6eb7a8 100644
--- a/libbb/yescrypt/y.c
+++ b/libbb/yescrypt/y.c
@@ -2,128 +2,6 @@
#include <libbb.h>
-#include <assert.h>
-
-static inline void
-cpu_to_le32 (unsigned char *buf, uint32_t n)
-{
- buf[0] = (unsigned char)((n & 0x000000FFu) >> 0);
- buf[1] = (unsigned char)((n & 0x0000FF00u) >> 8);
- buf[2] = (unsigned char)((n & 0x00FF0000u) >> 16);
- buf[3] = (unsigned char)((n & 0xFF000000u) >> 24);
-}
-static inline uint32_t
-le32_to_cpu (const unsigned char *buf)
-{
- return ((((uint32_t)buf[0]) << 0) |
- (((uint32_t)buf[1]) << 8) |
- (((uint32_t)buf[2]) << 16) |
- (((uint32_t)buf[3]) << 24) );
-}
-
-/* Alternative names used in code derived from Colin Percival's
- cryptography libraries. */
-#define le32enc cpu_to_le32
-#define le32dec le32_to_cpu
-#define le64enc cpu_to_le64
-#define le64dec le64_to_cpu
-
-#define be32enc cpu_to_be32
-#define be32dec be32_to_cpu
-#define be64enc cpu_to_be64
-#define be64dec be64_to_cpu
-
-#define be32enc_vect cpu_to_be32_vect
-#define be32dec_vect be32_to_cpu_vect
-#define be64enc_vect cpu_to_be64_vect
-#define be64dec_vect be64_to_cpu_vect
-
-
-//USED ONY BY SHA256 for be32_to_cpu_vect():
-static inline void
-cpu_to_be32(unsigned char *buf, uint32_t n)
-{
- buf[0] = (unsigned char)((n & 0xFF000000u) >> 24);
- buf[1] = (unsigned char)((n & 0x00FF0000u) >> 16);
- buf[2] = (unsigned char)((n & 0x0000FF00u) >> 8);
- buf[3] = (unsigned char)((n & 0x000000FFu) >> 0);
-}
-static inline void
-cpu_to_be64 (unsigned char *buf, uint64_t n)
-{
- buf[0] = (unsigned char)((n & 0xFF00000000000000ull) >> 56);
- buf[1] = (unsigned char)((n & 0x00FF000000000000ull) >> 48);
- buf[2] = (unsigned char)((n & 0x0000FF0000000000ull) >> 40);
- buf[3] = (unsigned char)((n & 0x000000FF00000000ull) >> 32);
- buf[4] = (unsigned char)((n & 0x00000000FF000000ull) >> 24);
- buf[5] = (unsigned char)((n & 0x0000000000FF0000ull) >> 16);
- buf[6] = (unsigned char)((n & 0x000000000000FF00ull) >> 8);
- buf[7] = (unsigned char)((n & 0x00000000000000FFull) >> 0);
-}
-static inline uint32_t
-be32_to_cpu (const unsigned char *buf)
-{
- return ((((uint32_t)buf[0]) << 24) |
- (((uint32_t)buf[1]) << 16) |
- (((uint32_t)buf[2]) << 8) |
- (((uint32_t)buf[3]) << 0) );
-}
-static inline uint64_t
-be64_to_cpu (const unsigned char *buf)
-{
- return ((((uint64_t)buf[0]) << 56) |
- (((uint64_t)buf[1]) << 48) |
- (((uint64_t)buf[2]) << 40) |
- (((uint64_t)buf[3]) << 32) |
- (((uint64_t)buf[4]) << 24) |
- (((uint64_t)buf[5]) << 16) |
- (((uint64_t)buf[6]) << 8) |
- (((uint64_t)buf[7]) << 0) );
-}
-/* Template: Define a function named cpu_to_<END><BITS>_vect that
- takes a vector SRC of LEN integers, each of type uint<BITS>_t, and
- writes them to the buffer DST in the endianness defined by END.
- Caution: LEN is the number of vector elements, not the total size
- of the buffers. */
-#define VECTOR_CPU_TO(end, bits) VECTOR_CPU_TO_(end##bits, uint##bits##_t)
-#define VECTOR_CPU_TO_(prim, stype) \
- static inline void \
- cpu_to_##prim##_vect(uint8_t *dst, const stype *src, size_t len) \
- { \
- while (len) \
- { \
- cpu_to_##prim(dst, *src); \
- src += 1; \
- dst += sizeof(stype); \
- len -= 1; \
- } \
- } struct _swallow_semicolon
-/* Template: Define a function named <END><BITS>_to_cpu_vect that
- reads a vector of LEN integers, each of type uint<BITS>_t, from the
- buffer SRC, in the endianness defined by END, and writes them to
- the vector DST. Caution: LEN is the number of vector elements, not
- the total size of the buffers. */
-#define VECTOR_TO_CPU(end, bits) VECTOR_TO_CPU_(end##bits, uint##bits##_t)
-#define VECTOR_TO_CPU_(prim, dtype) \
- static inline void \
- prim##_to_cpu_vect(dtype *dst, const uint8_t *src, size_t len) \
- { \
- while (len) \
- { \
- *dst = prim##_to_cpu(src); \
- src += sizeof(dtype); \
- dst += 1; \
- len -= 1; \
- } \
- } struct _swallow_semicolon
-/* These are the vectorized endianness-conversion functions that are
- presently used. Add more as necessary. */
-VECTOR_CPU_TO(be,32);
-VECTOR_CPU_TO(be,64);
-VECTOR_TO_CPU(be,32);
-VECTOR_TO_CPU(be,64);
-
-
#define YESCRYPT_INTERNAL
#include "alg-sha256.h"
#include "alg-yescrypt.h"
More information about the busybox-cvs
mailing list