libbb/pw_ascii64.c: add forgotten source file
This commit was genuinely broken at the time (not related to our build system): libbb/yescrypt eklenirken (2025-07-06 - 2025-07-07 arasi) once unutulan kaynak dosyalari (pw_encrypt_yes.c, hash_sha256_block.c, pw_ascii64.c), ardindan 64-bit'te derlenmeyen bir 'buflen' degiskeni (alg-yescrypt-kdf.c) vardi - busybox'in kendi kodundaki gercek hatalar (e5d3a8763 ile duzeltildi)
No binary (build failed)
—
(log yok)
| @@ -0,0 +1,91 @@ | |
| + | /* vi: set sw=4 ts=4: */ |
| + | /* |
| + | * Utility routines. |
| + | * |
| + | * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> |
| + | * |
| + | * Licensed under GPLv2 or later, see file LICENSE in this source tree. |
| + | */ |
| + | |
| + | /* Returns >=64 for invalid chars */ |
| + | int FAST_FUNC a2i64(char c) |
| + | { |
| + | unsigned char ch = c; |
| + | if (ch >= 'a') |
| + | /* "a..z" to 38..63 */ |
| + | /* anything after "z": positive int >= 64 */ |
| + | return (ch - 'a' + 38); |
| + | |
| + | if (ch > 'Z') |
| + | /* after "Z" but before "a": positive byte >= 64 */ |
| + | return ch; |
| + | |
| + | if (ch >= 'A') |
| + | /* "A..Z" to 12..37 */ |
| + | return (ch - 'A' + 12); |
| + | |
| + | if (ch > '9') |
| + | return 64; |
| + | |
| + | /* "./0123456789" to 0,1,2..11 */ |
| + | /* anything before "." becomes positive byte >= 64 */ |
| + | return (unsigned char)(ch - '.'); |
| + | } |
| + | |
| + | /* 0..63 -> |
| + | * "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
| + | */ |
| + | int FAST_FUNC i2a64(int i) |
| + | { |
| + | i &= 0x3f; |
| + | |
| + | i += '.'; |
| + | /* the above maps 0..11 to "./0123456789": |
| + | * ACSII codes of "./" are ('0'-2) and ('0'-1) */ |
| + | |
| + | if (i > '9') |
| + | i += ('A' - '9' - 1); |
| + | if (i > 'Z') |
| + | i += ('a' - 'Z' - 1); |
| + | return i; |
| + | } |
| + | |
| + | char* FAST_FUNC |
| + | num2str64_lsb_first(char *s, unsigned v, int n) |
| + | { |
| + | while (--n >= 0) { |
| + | *s++ = i2a64(v); |
| + | v >>= 6; |
| + | } |
| + | return s; |
| + | } |
| + | |
| + | static void |
| + | num2str64_4chars_msb_first(char *s, unsigned v) |
| + | { |
| + | *s++ = i2a64(v >> 18); /* bits 23..18 */ |
| + | *s++ = i2a64(v >> 12); /* bits 17..12 */ |
| + | *s++ = i2a64(v >> 6); /* bits 11..6 */ |
| + | *s = i2a64(v); /* bits 5..0 */ |
| + | } |
| + | |
| + | int FAST_FUNC crypt_make_rand64encoded(char *p, int cnt /*, int x */) |
| + | { |
| + | /* was: x += ... */ |
| + | unsigned x = getpid() + monotonic_us(); |
| + | do { |
| + | /* x = (x*1664525 + 1013904223) % 2^32 generator is lame |
| + | * (low-order bit is not "random", etc...), |
| + | * but for our purposes it is good enough */ |
| + | x = x*1664525 + 1013904223; |
| + | /* BTW, Park and Miller's "minimal standard generator" is |
| + | * x = x*16807 % ((2^31)-1) |
| + | * It has no problem with visibly alternating lowest bit |
| + | * but is also weak in cryptographic sense + needs div, |
| + | * which needs more code (and slower) on many CPUs */ |
| + | *p++ = i2a64(x >> 16); |
| + | *p++ = i2a64(x >> 22); |
| + | } while (--cnt); |
| + | *p = '\0'; |
| + | return x; |
| + | } |