4054af0c42
* Sebastian's HQC merge request * Clean up changes to common infrastructure * Fix Bitmask macro It assumed that ``unsigned long`` was 64 bit * Remove maxlen from nistseedexpander It's a complicated thing to handle because the value is larger than size_t supports on 32-bit platforms * Initialize buffers to help linter * Add Nistseedexpander test * Resolve UB in gf2x.c Some of the shifts could be larger than WORD_SIZE_BITS, ie. larger than the width of uint64_t. This apparently on Intel gets interpreted as the shift mod 64, but on ARM something else happened. * Fix Windows complaints * rename log, exp which appear to be existing functions on MS * Solve endianness problems * remove all spaces before ';' * Fix duplicate consistency * Fix duplicate consistency * Fix complaints by MSVC about narrowing int * Add nistseedexpander.obj to COMMON_OBJECTS_NOPATH * astyle format util.[ch] * add util.h to makefile * Sort includes in util.h * Fix more Windows MSVC complaints Co-authored-by: Sebastian Verschoor <sebastian@zeroknowledge.me> Co-authored-by: Thom Wiggers <thom@thomwiggers.nl>
70 lines
1.9 KiB
C
70 lines
1.9 KiB
C
#include "util.h"
|
|
#include "stddef.h"
|
|
|
|
#include "assert.h"
|
|
|
|
/* These functions should help with endianness-safe conversions
|
|
*
|
|
* load8 and store8 are copied from the McEliece implementations,
|
|
* which are in the public domain.
|
|
*/
|
|
|
|
|
|
void PQCLEAN_HQC1281CCA2_LEAKTIME_store8(unsigned char *out, uint64_t in) {
|
|
out[0] = (in >> 0x00) & 0xFF;
|
|
out[1] = (in >> 0x08) & 0xFF;
|
|
out[2] = (in >> 0x10) & 0xFF;
|
|
out[3] = (in >> 0x18) & 0xFF;
|
|
out[4] = (in >> 0x20) & 0xFF;
|
|
out[5] = (in >> 0x28) & 0xFF;
|
|
out[6] = (in >> 0x30) & 0xFF;
|
|
out[7] = (in >> 0x38) & 0xFF;
|
|
}
|
|
|
|
|
|
uint64_t PQCLEAN_HQC1281CCA2_LEAKTIME_load8(const unsigned char *in) {
|
|
uint64_t ret = in[7];
|
|
|
|
for (int8_t i = 6; i >= 0; i--) {
|
|
ret <<= 8;
|
|
ret |= in[i];
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void PQCLEAN_HQC1281CCA2_LEAKTIME_load8_arr(uint64_t *out64, size_t outlen, const uint8_t *in8, size_t inlen) {
|
|
size_t index_in = 0;
|
|
size_t index_out = 0;
|
|
|
|
// first copy by 8 bytes
|
|
if (inlen >= 8 && outlen >= 1) {
|
|
while (index_out < outlen && index_in + 8 <= inlen) {
|
|
out64[index_out] = PQCLEAN_HQC1281CCA2_LEAKTIME_load8(in8 + index_in);
|
|
|
|
index_in += 8;
|
|
index_out += 1;
|
|
}
|
|
}
|
|
|
|
// we now need to do the last 7 bytes if necessary
|
|
if (index_in >= inlen || index_out >= outlen) {
|
|
return;
|
|
}
|
|
out64[index_out] = in8[inlen - 1];
|
|
for (int8_t i = (int8_t)(inlen - index_in) - 2; i >= 0; i--) {
|
|
out64[index_out] <<= 8;
|
|
out64[index_out] |= in8[index_in + i];
|
|
}
|
|
}
|
|
|
|
void PQCLEAN_HQC1281CCA2_LEAKTIME_store8_arr(uint8_t *out8, size_t outlen, const uint64_t *in64, size_t inlen) {
|
|
for (size_t index_out = 0, index_in = 0; index_out < outlen && index_in < inlen;) {
|
|
out8[index_out] = (in64[index_in] >> ((index_out % 8) * 8)) & 0xFF;
|
|
index_out++;
|
|
if (index_out % 8 == 0) {
|
|
index_in++;
|
|
}
|
|
}
|
|
}
|