diff options
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/hashmap.c | 2 | ||||
-rw-r--r-- | src/basic/siphash24.c | 7 | ||||
-rw-r--r-- | src/basic/siphash24.h | 4 | ||||
-rw-r--r-- | src/basic/unaligned.h | 47 |
4 files changed, 54 insertions, 6 deletions
diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c index 4109a08c6c..d88ceb40aa 100644 --- a/src/basic/hashmap.c +++ b/src/basic/hashmap.c @@ -380,7 +380,7 @@ static unsigned base_bucket_hash(HashmapBase *h, const void *p) { h->hash_ops->hash(p, &state); - siphash24_finalize((uint8_t*)&hash, &state); + siphash24_finalize(&hash, &state); return (unsigned) (hash % n_buckets(h)); } diff --git a/src/basic/siphash24.c b/src/basic/siphash24.c index 3b61961389..d7640d395d 100644 --- a/src/basic/siphash24.c +++ b/src/basic/siphash24.c @@ -20,6 +20,7 @@ #include "sparse-endian.h" #include "siphash24.h" +#include "unaligned.h" #include "util.h" static inline uint64_t rotate_left(uint64_t x, uint8_t b) { @@ -104,7 +105,7 @@ void siphash24_compress(const void *_in, size_t inlen, struct siphash *state) { end -= ( state->inlen % sizeof (uint64_t) ); for ( ; in < end; in += 8 ) { - m = le64toh(*(le64_t*) in); + m = unaligned_read_le64(in); #ifdef DEBUG printf("(%3zu) v0 %08x %08x\n", state->inlen, (uint32_t) (state->v0 >> 32), (uint32_t) state->v0); printf("(%3zu) v1 %08x %08x\n", state->inlen, (uint32_t) (state->v1 >> 32), (uint32_t) state->v1); @@ -140,7 +141,7 @@ void siphash24_compress(const void *_in, size_t inlen, struct siphash *state) { } } -void siphash24_finalize(uint8_t out[8], struct siphash *state) { +void siphash24_finalize(uint64_t *out, struct siphash *state) { uint64_t b; b = state->padding | (( ( uint64_t )state->inlen ) << 56); @@ -173,7 +174,7 @@ void siphash24_finalize(uint8_t out[8], struct siphash *state) { } /* SipHash-2-4 */ -void siphash24(uint8_t out[8], const void *_in, size_t inlen, const uint8_t k[16]) { +void siphash24(uint64_t *out, const void *_in, size_t inlen, const uint8_t k[16]) { struct siphash state; siphash24_init(&state, k); diff --git a/src/basic/siphash24.h b/src/basic/siphash24.h index 6c5cd98ee8..dc08077d53 100644 --- a/src/basic/siphash24.h +++ b/src/basic/siphash24.h @@ -14,6 +14,6 @@ struct siphash { void siphash24_init(struct siphash *state, const uint8_t k[16]); void siphash24_compress(const void *in, size_t inlen, struct siphash *state); -void siphash24_finalize(uint8_t out[8], struct siphash *state); +void siphash24_finalize(uint64_t *out, struct siphash *state); -void siphash24(uint8_t out[8], const void *in, size_t inlen, const uint8_t k[16]); +void siphash24(uint64_t *out, const void *in, size_t inlen, const uint8_t k[16]); diff --git a/src/basic/unaligned.h b/src/basic/unaligned.h index d6181dd9a9..a8115eaa1f 100644 --- a/src/basic/unaligned.h +++ b/src/basic/unaligned.h @@ -21,8 +21,11 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ +#include <endian.h> #include <stdint.h> +/* BE */ + static inline uint16_t unaligned_read_be16(const void *_u) { const uint8_t *u = _u; @@ -64,3 +67,47 @@ static inline void unaligned_write_be64(void *_u, uint64_t a) { unaligned_write_be32(u, (uint32_t) (a >> 32)); unaligned_write_be32(u + 4, (uint32_t) a); } + +/* LE */ + +static inline uint16_t unaligned_read_le16(const void *_u) { + const uint8_t *u = _u; + + return (((uint16_t) u[1]) << 8) | + ((uint16_t) u[0]); +} + +static inline uint32_t unaligned_read_le32(const void *_u) { + const uint8_t *u = _u; + + return (((uint32_t) unaligned_read_le16(u + 2)) << 16) | + ((uint32_t) unaligned_read_le16(u)); +} + +static inline uint64_t unaligned_read_le64(const void *_u) { + const uint8_t *u = _u; + + return (((uint64_t) unaligned_read_le32(u + 4)) << 32) | + ((uint64_t) unaligned_read_le32(u)); +} + +static inline void unaligned_write_le16(void *_u, uint16_t a) { + uint8_t *u = _u; + + u[0] = (uint8_t) a; + u[1] = (uint8_t) (a >> 8); +} + +static inline void unaligned_write_le32(void *_u, uint32_t a) { + uint8_t *u = _u; + + unaligned_write_le16(u, (uint16_t) a); + unaligned_write_le16(u + 2, (uint16_t) (a >> 16)); +} + +static inline void unaligned_write_le64(void *_u, uint64_t a) { + uint8_t *u = _u; + + unaligned_write_le32(u, (uint32_t) a); + unaligned_write_le32(u + 4, (uint32_t) (a >> 32)); +} |