SPHINCS: strictly check integer conversions

This commit is contained in:
Joost Rijneveld 2019-04-11 11:14:49 +02:00
parent 7dcedfc56c
commit 26ffedc86b
No known key found for this signature in database
GPG Key ID: A4FE39CF49CBC553
3 changed files with 14 additions and 12 deletions

View File

@ -5,7 +5,7 @@ LIB=libsphincs-shake256-128f-simple_clean.a
HEADERS = params.h address.h wots.h utils.h fors.h api.h hash.h thash.h HEADERS = params.h address.h wots.h utils.h fors.h api.h hash.h thash.h
OBJECTS = address.o wots.o utils.o fors.o sign.o hash_shake256.o thash_shake256_simple.o OBJECTS = address.o wots.o utils.o fors.o sign.o hash_shake256.o thash_shake256_simple.o
CFLAGS=-Wall -Wextra -Wpedantic -Werror -std=c99 -I../../../common $(EXTRAFLAGS) CFLAGS=-Wall -Wconversion -Wextra -Wpedantic -Werror -std=c99 -I../../../common $(EXTRAFLAGS)
all: $(LIB) all: $(LIB)

View File

@ -50,7 +50,7 @@ static void message_to_indices(uint32_t *indices, const unsigned char *m) {
for (i = 0; i < SPX_FORS_TREES; i++) { for (i = 0; i < SPX_FORS_TREES; i++) {
indices[i] = 0; indices[i] = 0;
for (j = 0; j < SPX_FORS_HEIGHT; j++) { for (j = 0; j < SPX_FORS_HEIGHT; j++) {
indices[i] ^= ((m[offset >> 3] >> (offset & 0x7)) & 0x1) << j; indices[i] ^= (((uint32_t)m[offset >> 3] >> (offset & 0x7)) & 0x1) << j;
offset++; offset++;
} }
} }

View File

@ -53,12 +53,13 @@ static void gen_chain(unsigned char *out, const unsigned char *in,
* Interprets an array of bytes as integers in base w. * Interprets an array of bytes as integers in base w.
* This only works when log_w is a divisor of 8. * This only works when log_w is a divisor of 8.
*/ */
static void base_w(int *output, const int out_len, const unsigned char *input) { static void base_w(unsigned int *output, const size_t out_len,
int in = 0; const unsigned char *input) {
int out = 0; size_t in = 0;
size_t out = 0;
unsigned char total = 0; unsigned char total = 0;
int bits = 0; unsigned int bits = 0;
int consumed; size_t consumed;
for (consumed = 0; consumed < out_len; consumed++) { for (consumed = 0; consumed < out_len; consumed++) {
if (bits == 0) { if (bits == 0) {
@ -73,8 +74,9 @@ static void base_w(int *output, const int out_len, const unsigned char *input) {
} }
/* Computes the WOTS+ checksum over a message (in base_w). */ /* Computes the WOTS+ checksum over a message (in base_w). */
static void wots_checksum(int *csum_base_w, const int *msg_base_w) { static void wots_checksum(unsigned int *csum_base_w,
int csum = 0; const unsigned int *msg_base_w) {
unsigned int csum = 0;
unsigned char csum_bytes[(SPX_WOTS_LEN2 * SPX_WOTS_LOGW + 7) / 8]; unsigned char csum_bytes[(SPX_WOTS_LEN2 * SPX_WOTS_LOGW + 7) / 8];
unsigned int i; unsigned int i;
@ -92,7 +94,7 @@ static void wots_checksum(int *csum_base_w, const int *msg_base_w) {
} }
/* Takes a message and derives the matching chain lengths. */ /* Takes a message and derives the matching chain lengths. */
static void chain_lengths(int *lengths, const unsigned char *msg) { static void chain_lengths(unsigned int *lengths, const unsigned char *msg) {
base_w(lengths, SPX_WOTS_LEN1, msg); base_w(lengths, SPX_WOTS_LEN1, msg);
wots_checksum(lengths + SPX_WOTS_LEN1, lengths); wots_checksum(lengths + SPX_WOTS_LEN1, lengths);
} }
@ -125,7 +127,7 @@ void PQCLEAN_SPHINCSSHAKE256128FSIMPLE_CLEAN_wots_sign(
unsigned char *sig, const unsigned char *msg, unsigned char *sig, const unsigned char *msg,
const unsigned char *sk_seed, const unsigned char *pub_seed, const unsigned char *sk_seed, const unsigned char *pub_seed,
uint32_t addr[8]) { uint32_t addr[8]) {
int lengths[SPX_WOTS_LEN]; unsigned int lengths[SPX_WOTS_LEN];
uint32_t i; uint32_t i;
chain_lengths(lengths, msg); chain_lengths(lengths, msg);
@ -146,7 +148,7 @@ void PQCLEAN_SPHINCSSHAKE256128FSIMPLE_CLEAN_wots_pk_from_sig(
unsigned char *pk, unsigned char *pk,
const unsigned char *sig, const unsigned char *msg, const unsigned char *sig, const unsigned char *msg,
const unsigned char *pub_seed, uint32_t addr[8]) { const unsigned char *pub_seed, uint32_t addr[8]) {
int lengths[SPX_WOTS_LEN]; unsigned int lengths[SPX_WOTS_LEN];
uint32_t i; uint32_t i;
chain_lengths(lengths, msg); chain_lengths(lengths, msg);