Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ clean:
TEST_FLAGS := -lgtest -lpthread -fsanitize=address -fno-omit-frame-pointer
test:
mkdir -p bin
g++ -g -Wall -Wno-deprecated-declarations $(SRC_NO_MAIN) tests/tests.cpp -I include -o bin/run_tests $(TEST_FLAGS) -lssl -lcrypto
g++ -g -Wall -Wno-deprecated-declarations $(SRC_NO_MAIN) tests/tests.cpp -I include -o bin/run_tests $(TEST_FLAGS) -lssl -lcrypto -DSHRINCS_L
./bin/run_tests

BENCH_FLAGS := -lgtest -lpthread
benchmark:
mkdir -p bin
g++ -O3 -Wall -Wno-deprecated-declarations $(SRC_NO_MAIN) tests/bench.cpp -I include -o bin/bench $(BENCH_FLAGS) -lssl -lcrypto
g++ -O3 -Wall -Wno-deprecated-declarations $(SRC_NO_MAIN) tests/bench.cpp -I include -o bin/bench $(BENCH_FLAGS) -lssl -lcrypto -DSHRINCS_L
./bin/bench
4 changes: 2 additions & 2 deletions include/fors_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ using namespace HASH;
namespace FORS_C {
uint32_t extract_bits(const unsigned char* message, uint32_t start_bit_idx, uint32_t bits_amount);
void fors_msg_to_indices(const unsigned char* message, uint32_t* out_buffer);
uint32_t fors_grind(const unsigned char* message, const unsigned char* sk_prf, const unsigned char* pk_seed, const unsigned char* pk_root, unsigned char* adrs, uint32_t* out, unsigned char* digest_out, unsigned char* r_out);
uint32_t fors_grind(const unsigned char* message, uint32_t message_len, const unsigned char* sk_prf, const unsigned char* pk_seed, const unsigned char* pk_root, unsigned char* adrs, uint32_t* out, unsigned char* digest_out, unsigned char* r_out);
unsigned char* fors_sk_gen(const unsigned char* sk_seed, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t tree_idx, uint32_t leaf_idx);
unsigned char* fors_treehash(const unsigned char* sk_seed, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t tree_idx, uint32_t target_height, uint32_t start_idx);
unsigned char* fors_auth_path(const unsigned char* sk_seed, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t tree_idx, uint32_t leaf_idx);
unsigned char* fors_sign(const unsigned char* message, const unsigned char* sk_seed, const unsigned char* sk_prf, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, unsigned char* digest_out);
unsigned char* fors_sign(const unsigned char* message, uint32_t message_len, const unsigned char* sk_seed, const unsigned char* sk_prf, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, unsigned char* digest_out);
unsigned char* fors_pk_from_sig(const unsigned char* sig, uint32_t indices[K], SHA256_CTX hash_ctx, unsigned char* adrs);
}

Expand Down
10 changes: 5 additions & 5 deletions include/shrincs.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ namespace SHRINCS {

void shrincs_key_gen(PublicKey& out_pk, SecretKey& out_sk, State& out_state);
void shrincs_restore(const unsigned char* seed, PublicKey& out_pk, SecretKey& out_sk, State& out_state);
unsigned char* shrincs_sign_stateful(const unsigned char* message, SecretKey& sk, State& state);
unsigned char* shrincs_sign_stateless(const unsigned char* message, SecretKey& sk);
bool shrincs_verify_stateful(const unsigned char* message, const unsigned char* sig, uint32_t sig_len, PublicKey& pk);
bool shrincs_verify_stateless(const unsigned char* message, const unsigned char* sig, PublicKey& pk);
bool shrincs_verify(const unsigned char* message, const unsigned char* sig, uint32_t sig_len, PublicKey& pk);
unsigned char* shrincs_sign_stateful(const std::vector<unsigned char> message, SecretKey& sk, State& state);
unsigned char* shrincs_sign_stateless(const std::vector<unsigned char> message, SecretKey& sk);
bool shrincs_verify_stateful(const std::vector<unsigned char> message, const unsigned char* sig, uint32_t sig_len, PublicKey& pk);
bool shrincs_verify_stateless(const std::vector<unsigned char> message, const unsigned char* sig, PublicKey& pk);
bool shrincs_verify(const std::vector<unsigned char> message, const unsigned char* sig, uint32_t sig_len, PublicKey& pk);
}

#endif
4 changes: 2 additions & 2 deletions include/uxmss.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ namespace UXMSS
unsigned char* uxmss_treehash(const unsigned char* sk_seed, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t level);
unsigned char* uxmss_root(const unsigned char* sk_seed, SHA256_CTX hash_ctx, unsigned char* adrs);
unsigned char* uxmss_auth_path(const unsigned char* sk_seed, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t q);
unsigned char* uxmss_pk_from_sig(const unsigned char* wots_sig, const unsigned char* auth, const unsigned char* message, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t q);
unsigned char* uxmss_sign(const unsigned char* message, const unsigned char* sk_seed, const unsigned char* sk_prf, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t q);
unsigned char* uxmss_pk_from_sig(const unsigned char* wots_sig, const unsigned char* auth, const unsigned char* message, uint32_t message_len, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t q);
unsigned char* uxmss_sign(const unsigned char* message, uint32_t message_len, const unsigned char* sk_seed, const unsigned char* sk_prf, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t q);
}

#endif
4 changes: 2 additions & 2 deletions include/wots_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ namespace WOTS_C
void base_w(const unsigned char* message, unsigned char* out_buffer);
void chain(const unsigned char* m, uint32_t start, uint32_t steps, SHA256_CTX hash_ctx, unsigned char* adrs, unsigned char* out);
unsigned char* wots_pk_gen(const unsigned char* sk_seed, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t keypair, bool sf);
uint32_t wots_grind(const unsigned char* message, const unsigned char* pk_seed, unsigned char* adrs, uint32_t keypair, unsigned char* msg_out, bool sf);
bool wots_digest(const unsigned char* message, const unsigned char* pk_seed, uint32_t ctr, unsigned char* adrs, uint32_t keypair, unsigned char* msg_out, bool sf);
uint32_t wots_grind(const unsigned char* message, uint32_t message_len, const unsigned char* pk_seed, unsigned char* adrs, uint32_t keypair, unsigned char* msg_out, bool sf);
bool wots_digest(const unsigned char* message, uint32_t message_len, const unsigned char* pk_seed, uint32_t ctr, unsigned char* adrs, uint32_t keypair, unsigned char* msg_out, bool sf);
unsigned char* wots_sign(const unsigned char* message, uint32_t message_len, const unsigned char* sk_seed, const unsigned char* sk_prf, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t keypair, bool sf, bool is_internal);
unsigned char* wots_pk_from_sig(const unsigned char* sig, const unsigned char* message, uint32_t message_len, const unsigned char* pk_seed, const unsigned char* pk_root, SHA256_CTX hash_ctx, unsigned char* adrs, uint32_t keypair, bool sf, bool is_internal);
}
Expand Down
42 changes: 20 additions & 22 deletions kat/kat_gen_fail.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ int main()
unsigned char seed_alt[3*N];
randombytes(seed_alt, 3*N);

unsigned char* msg = new unsigned char[mlen];
randombytes(msg, mlen);
std::vector<unsigned char> msg = std::vector<unsigned char>(mlen);
randombytes(msg.data(), mlen);

//Wrong message
for (int ci = 0; ci < N_CORRUPTIONS; ++ci)
Expand All @@ -244,8 +244,9 @@ int main()
uint32_t slen = sf_siglen(1);

uint32_t off; unsigned char mask;
unsigned char* bad_msg = corrupt_within(msg, mlen, off, mask);
if(memcmp(bad_msg, msg, mlen) == 0) fprintf(stderr, "WARN: identical messages\n");
unsigned char* bad_msg_ptr = corrupt_within(msg.data(), mlen, off, mask);
std::vector<unsigned char> bad_msg = std::vector<unsigned char>(bad_msg_ptr, bad_msg_ptr + mlen);
if(memcmp(bad_msg.data(), msg.data(), mlen) == 0) fprintf(stderr, "WARN: identical messages\n");

if (off < 32)
fprintf(stderr, "INFO: corruption within first 32 bytes at byte=%u\n", off);
Expand All @@ -258,11 +259,10 @@ int main()
"SHRINCS-%s stateful wrong-msg byte=%u mask=0x%02x mlen=%zu",
VARIANT_NAME, off, mask, mlen);
write_fail_record(f, count++, lbl, seed,
mlen, msg, pk, sk, sig, slen,
"msg corrupted", bad_msg, mlen, ok);
mlen, msg.data(), pk, sk, sig, slen,
"msg corrupted", bad_msg.data(), mlen, ok);
if (ok) fprintf(stderr, "WARN [%s]: expected Fail, got Pass\n", lbl);
delete[] sig;
delete[] bad_msg;
}

{
Expand All @@ -271,7 +271,8 @@ int main()
unsigned char* sig = shrincs_sign_stateless(msg, sk);

uint32_t off; unsigned char mask;
unsigned char* bad_msg = corrupt_within(msg, mlen, off, mask);
unsigned char* bad_msg_ptr = corrupt_within(msg.data(), mlen, off, mask);
std::vector<unsigned char> bad_msg = std::vector<unsigned char>(bad_msg_ptr, bad_msg_ptr + mlen);
if (off < 32)
fprintf(stderr, "INFO: corruption within first 32 bytes at byte=%u\n", off);
else
Expand All @@ -284,11 +285,10 @@ int main()
"SHRINCS-%s stateless wrong-msg byte=%u mask=0x%02x mlen=%zu",
VARIANT_NAME, off, mask, mlen);
write_fail_record(f, count++, lbl, seed,
mlen, msg, pk, sk, sig, SL_SIZE,
"msg corrupted", bad_msg, mlen, ok);
mlen, msg.data(), pk, sk, sig, SL_SIZE,
"msg corrupted", bad_msg.data(), mlen, ok);
if (ok) fprintf(stderr, "WARN [%s]: expected Fail, got Pass\n", lbl);
delete[] sig;
delete[] bad_msg;
}
}

Expand All @@ -315,7 +315,7 @@ int main()
"SHRINCS-%s stateful wrong-pk ci=%d mlen=%zu",
VARIANT_NAME, ci, mlen);
write_fail_record(f, count++, lbl, seed,
mlen, msg, pk, sk, sig, slen,
mlen, msg.data(), pk, sk, sig, slen,
"pk corrupted", pk2_bytes, 2*N, ok);
if (ok) fprintf(stderr, "WARN [%s]: expected Fail, got Pass\n", lbl);
delete[] sig;
Expand Down Expand Up @@ -343,7 +343,7 @@ int main()
"SHRINCS-%s stateless wrong-pk ci=%d mlen=%zu",
VARIANT_NAME, ci, mlen);
write_fail_record(f, count++, lbl, seed,
mlen, msg, pk, sk, sig, SL_SIZE,
mlen, msg.data(), pk, sk, sig, SL_SIZE,
"pk corrupted", pk2_bytes, 2*N, ok);
if (ok) fprintf(stderr, "WARN [%s]: expected Fail, got Pass\n", lbl);
delete[] sig;
Expand Down Expand Up @@ -372,7 +372,7 @@ int main()
"SHRINCS-%s stateful corrupted-sig byte=%u mask=0x%02x mlen=%zu",
VARIANT_NAME, off, mask, mlen);
write_fail_record(f, count++, lbl, seed,
mlen, msg, pk, sk, sig, slen,
mlen, msg.data(), pk, sk, sig, slen,
"sig corrupted", bad, slen, ok);
if (ok) fprintf(stderr, "WARN [%s]: expected Fail, got Pass\n", lbl);
delete[] bad;
Expand All @@ -398,7 +398,7 @@ int main()
"SHRINCS-%s stateless corrupted-sig byte=%u mask=0x%02x mlen=%zu",
VARIANT_NAME, off, mask, mlen);
write_fail_record(f, count++, lbl, seed,
mlen, msg, pk, sk, sig, SL_SIZE,
mlen, msg.data(), pk, sk, sig, SL_SIZE,
"sig corrupted", bad, SL_SIZE, ok);
if (ok) fprintf(stderr, "WARN [%s]: expected Fail, got Pass\n", lbl);
delete[] bad;
Expand All @@ -419,7 +419,7 @@ int main()
"SHRINCS-%s cross-type stateless-sig-as-stateful mlen=%zu",
VARIANT_NAME, mlen);
write_fail_record(f, count++, lbl, seed,
mlen, msg, pk, sk, sig, SL_SIZE,
mlen, msg.data(), pk, sk, sig, SL_SIZE,
"sig corrupted (truncated to MAX_SF_SIZE)", sig, MAX_SF_SIZE, ok);
if (ok) fprintf(stderr, "WARN [%s]: expected Fail, got Pass\n", lbl);
delete[] sig;
Expand All @@ -439,20 +439,18 @@ int main()
snprintf(lbl, sizeof(lbl),
"SHRINCS-%s stateful invalid-state (valid=false) mlen=%zu",
VARIANT_NAME, mlen);
write_throw_record(f, count++, lbl, seed, mlen, msg, pk, sk, threw);
write_throw_record(f, count++, lbl, seed, mlen, msg.data(), pk, sk, threw);
if (!threw) fprintf(stderr, "WARN [%s]: expected throw, did not throw\n", lbl);
}

delete[] msg;
}

// Counter exhausted (once, outside message loop)
{
unsigned char seed[3*N];
randombytes(seed, 3*N);

unsigned char msg[32] = {};
randombytes(msg,32);
std::vector<unsigned char> msg = std::vector<unsigned char>(32);
randombytes(msg.data(),32);

PublicKey pk; SecretKey sk; State st;
keygen(seed, pk, sk, st);
Expand All @@ -473,7 +471,7 @@ int main()
snprintf(lbl, sizeof(lbl),
"SHRINCS-%s stateful counter-exhausted q > HSF+1=%u",
VARIANT_NAME, HSF + 1);
write_throw_record(f, count++, lbl, seed, 32, msg, pk, sk, threw);
write_throw_record(f, count++, lbl, seed, 32, msg.data(), pk, sk, threw);
if (!threw) fprintf(stderr, "WARN [%s]: expected throw, did not throw\n", lbl);
}

Expand Down
13 changes: 6 additions & 7 deletions kat/kat_gen_pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ static void write_record(FILE* f, int count, const char* label,

static void advance_to(SecretKey& sk, State& st, uint32_t target_q)
{
unsigned char dummy[32] = {};
std::vector<unsigned char> dummy = std::vector<unsigned char>(32, 0);

while (st.q < target_q - 1) {
unsigned char* tmp = shrincs_sign_stateful(dummy, sk, st);
delete[] tmp;
Expand Down Expand Up @@ -161,8 +162,8 @@ int main()
unsigned char seed[3*N];
randombytes(seed, 3*N);

unsigned char* msg = new unsigned char[mlen];
randombytes(msg, mlen);
std::vector<unsigned char> msg = std::vector<unsigned char>(mlen);
randombytes(msg.data(), mlen);

{
PublicKey pk; SecretKey sk; State st;
Expand All @@ -180,7 +181,7 @@ int main()
char lbl[128];
snprintf(lbl, sizeof(lbl),
"SHRINCS-%s stateless mlen=%zu", VARIANT_NAME, mlen);
write_record(f, count++, lbl, seed, mlen, msg, pk, sk, sig, SL_SIZE, ok);
write_record(f, count++, lbl, seed, mlen, msg.data(), pk, sk, sig, SL_SIZE, ok);
delete[] sig;
}

Expand All @@ -207,11 +208,9 @@ int main()
snprintf(lbl, sizeof(lbl),
"SHRINCS-%s stateful q=%u mlen=%zu",
VARIANT_NAME, target_q, mlen);
write_record(f, count++, lbl, seed, mlen, msg, pk, sk, sig, slen, ok);
write_record(f, count++, lbl, seed, mlen, msg.data(), pk, sk, sig, slen, ok);
delete[] sig;
}

delete[] msg;
}

fprintf(f, "# Total records: %d\n", count);
Expand Down
Loading