diff --git a/.gitignore b/.gitignore index 47896ba7..83f8f4b6 100644 --- a/.gitignore +++ b/.gitignore @@ -109,6 +109,7 @@ test/default/browser test/default/chacha20 test/default/codecs test/default/codecs2 +test/default/codecs3 test/default/core_ed25519 test/default/core_ed25519_h2c test/default/core_keccak1600 @@ -133,6 +134,7 @@ test/default/kdf test/default/kdf_hkdf test/default/kdf_hkdf2 test/default/kdf_hkdf3 +test/default/kdf_hkdf4 test/default/keygen test/default/kem test/default/kem_mlkem768 @@ -145,6 +147,7 @@ test/default/onetimeauth2 test/default/onetimeauth7 test/default/pwhash_argon2i test/default/pwhash_argon2id +test/default/pwhash_argon2id2 test/default/pwhash_scrypt test/default/pwhash_scrypt_ll test/default/randombytes @@ -171,12 +174,14 @@ test/default/sodium_core test/default/sodium_utils test/default/sodium_utils2 test/default/sodium_utils3 +test/default/sodium_utils4 test/default/sodium_version test/default/stream test/default/stream2 test/default/stream3 test/default/stream4 test/default/stream5 +test/default/stream6 test/default/verify1 test/default/xchacha20 test/default/xof_shake128 diff --git a/test/default/Makefile.am b/test/default/Makefile.am index d031f64b..4ff3bad5 100644 --- a/test/default/Makefile.am +++ b/test/default/Makefile.am @@ -29,6 +29,7 @@ EXTRA_DIST = \ chacha20.exp \ codecs.exp \ codecs2.exp \ + codecs3.exp \ core_ed25519.exp \ core_ed25519_h2c.exp \ core_ristretto255.exp \ @@ -53,6 +54,7 @@ EXTRA_DIST = \ kdf_hkdf.exp \ kdf_hkdf2.exp \ kdf_hkdf3.exp \ + kdf_hkdf4.exp \ kem.exp \ kem_mlkem768.exp \ kem_xwing.exp \ @@ -65,6 +67,7 @@ EXTRA_DIST = \ onetimeauth7.exp \ pwhash_argon2i.exp \ pwhash_argon2id.exp \ + pwhash_argon2id2.exp \ pwhash_scrypt.exp \ pwhash_scrypt_ll.exp \ randombytes.exp \ @@ -91,12 +94,14 @@ EXTRA_DIST = \ sodium_utils.exp \ sodium_utils2.exp \ sodium_utils3.exp \ + sodium_utils4.exp \ sodium_version.exp \ stream.exp \ stream2.exp \ stream3.exp \ stream4.exp \ stream5.exp \ + stream6.exp \ verify1.exp \ xchacha20.exp \ xof_shake128.exp \ @@ -130,6 +135,7 @@ DISTCLEANFILES = \ chacha20.res \ codecs.res \ codecs2.res \ + codecs3.res \ core_ed25519.res \ core_ed25519_h2c.res \ core_ristretto255.res \ @@ -155,6 +161,7 @@ DISTCLEANFILES = \ kdf_hkdf.res \ kdf_hkdf2.res \ kdf_hkdf3.res \ + kdf_hkdf4.res \ kem.res \ kem_mlkem768.res \ kem_xwing.res \ @@ -167,6 +174,7 @@ DISTCLEANFILES = \ onetimeauth7.res \ pwhash_argon2i.res \ pwhash_argon2id.res \ + pwhash_argon2id2.res \ pwhash_scrypt.res \ pwhash_scrypt_ll.res \ randombytes.res \ @@ -193,12 +201,14 @@ DISTCLEANFILES = \ sodium_utils.res \ sodium_utils2.res \ sodium_utils3.res \ + sodium_utils4.res \ sodium_version.res \ stream.res \ stream2.res \ stream3.res \ stream4.res \ stream5.res \ + stream6.res \ verify1.res \ xchacha20.res \ xof_shake128.res \ @@ -242,6 +252,7 @@ TESTS_TARGETS = \ chacha20 \ codecs \ codecs2 \ + codecs3 \ core1 \ core2 \ core3 \ @@ -271,6 +282,7 @@ TESTS_TARGETS = \ onetimeauth7 \ pwhash_argon2i \ pwhash_argon2id \ + pwhash_argon2id2 \ randombytes \ scalarmult \ scalarmult2 \ @@ -305,7 +317,8 @@ TESTS_TARGETS = \ if !EMSCRIPTEN TESTS_TARGETS += \ sodium_utils2 \ - sodium_utils3 + sodium_utils3 \ + sodium_utils4 endif check_PROGRAMS = $(TESTS_TARGETS) @@ -387,6 +400,9 @@ codecs_LDADD = $(TESTS_LDADD) codecs2_SOURCE = cmptest.h codecs2.c codecs2_LDADD = $(TESTS_LDADD) +codecs3_SOURCE = cmptest.h codecs3.c +codecs3_LDADD = $(TESTS_LDADD) + core_ed25519_SOURCE = cmptest.h core_ed25519.c core_ed25519_LDADD = $(TESTS_LDADD) @@ -459,6 +475,9 @@ kdf_hkdf2_LDADD = $(TESTS_LDADD) kdf_hkdf3_SOURCE = cmptest.h kdf_hkdf3.c kdf_hkdf3_LDADD = $(TESTS_LDADD) +kdf_hkdf4_SOURCE = cmptest.h kdf_hkdf4.c +kdf_hkdf4_LDADD = $(TESTS_LDADD) + kem_SOURCE = cmptest.h kem.c kem_LDADD = $(TESTS_LDADD) @@ -495,6 +514,9 @@ pwhash_argon2i_LDADD = $(TESTS_LDADD) pwhash_argon2id_SOURCE = cmptest.h pwhash_argon2id.c pwhash_argon2id_LDADD = $(TESTS_LDADD) +pwhash_argon2id2_SOURCE = cmptest.h pwhash_argon2id2.c +pwhash_argon2id2_LDADD = $(TESTS_LDADD) + pwhash_scrypt_SOURCE = cmptest.h pwhash_scrypt.c pwhash_scrypt_LDADD = $(TESTS_LDADD) @@ -573,6 +595,9 @@ sodium_utils2_LDADD = $(TESTS_LDADD) sodium_utils3_SOURCE = cmptest.h sodium_utils3.c sodium_utils3_LDADD = $(TESTS_LDADD) +sodium_utils4_SOURCE = cmptest.h sodium_utils4.c +sodium_utils4_LDADD = $(TESTS_LDADD) + sodium_version_SOURCE = cmptest.h sodium_version.c sodium_version_LDADD = $(TESTS_LDADD) @@ -591,6 +616,9 @@ stream4_LDADD = $(TESTS_LDADD) stream5_SOURCE = cmptest.h stream5.c stream5_LDADD = $(TESTS_LDADD) +stream6_SOURCE = cmptest.h stream6.c +stream6_LDADD = $(TESTS_LDADD) + verify1_SOURCE = cmptest.h verify1.c verify1_LDADD = $(TESTS_LDADD) @@ -621,8 +649,10 @@ TESTS_TARGETS += \ kdf_hkdf \ kdf_hkdf2 \ kdf_hkdf3 \ + kdf_hkdf4 \ pwhash_scrypt \ stream5 \ + stream6 \ pwhash_scrypt_ll \ scalarmult_ed25519 \ scalarmult_ristretto255 \ diff --git a/test/default/codecs3.c b/test/default/codecs3.c new file mode 100644 index 00000000..e269ce53 --- /dev/null +++ b/test/default/codecs3.c @@ -0,0 +1,56 @@ +#define TEST_NAME "codecs3" +#include "cmptest.h" + +int +main(void) +{ + unsigned char ip_bytes[16]; + + assert(sodium_ip2bin(ip_bytes, "::1:2:3:4:5:6:7:8", + strlen("::1:2:3:4:5:6:7:8")) == -1); + printf("ipv6 double-colon full address: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, "1:2:3:4:5:6:7", + strlen("1:2:3:4:5:6:7")) == -1); + printf("ipv6 too few groups: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, "1:2:3:4:5:6:7:8:9", + strlen("1:2:3:4:5:6:7:8:9")) == -1); + printf("ipv6 too many groups: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, "1:2:3:4:5:6:7:8:a", + strlen("1:2:3:4:5:6:7:8:a")) == -1); + printf("ipv6 too many groups at end: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, "1:2:3:4:5:6:7:192.168.1.1", + strlen("1:2:3:4:5:6:7:192.168.1.1")) == -1); + printf("ipv6 embedded IPv4 too many groups: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, "::999.1.1.1", + strlen("::999.1.1.1")) == -1); + printf("ipv6 embedded IPv4 invalid: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, "::192.168.1.1", + strlen("::192.168.1.1")) == 0); + printf("ipv6 embedded IPv4 valid: ok\n"); + + assert(sodium_ip2bin(ip_bytes, "1:2:3:4:5:6:7:8:", + strlen("1:2:3:4:5:6:7:8:")) == -1); + printf("ipv6 trailing colon: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, ":1:2:3:4:5:6:7:8", + strlen(":1:2:3:4:5:6:7:8")) == -1); + printf("ipv6 single leading colon: rejected\n"); + + assert(sodium_ip2bin(ip_bytes, "1:2:3:4:5:6:7:8", + strlen("1:2:3:4:5:6:7:8")) == 0); + assert(ip_bytes[0] == 0 && ip_bytes[1] == 1); + assert(ip_bytes[14] == 0 && ip_bytes[15] == 8); + printf("ipv6 full 8 groups: ok\n"); + + assert(sodium_ip2bin(ip_bytes, "1:2:3:4:5:6:1.2.3.4", + strlen("1:2:3:4:5:6:1.2.3.4")) == 0); + printf("ipv6 embedded IPv4 6 groups: ok\n"); + + return 0; +} diff --git a/test/default/codecs3.exp b/test/default/codecs3.exp new file mode 100644 index 00000000..e1faed51 --- /dev/null +++ b/test/default/codecs3.exp @@ -0,0 +1,11 @@ +ipv6 double-colon full address: rejected +ipv6 too few groups: rejected +ipv6 too many groups: rejected +ipv6 too many groups at end: rejected +ipv6 embedded IPv4 too many groups: rejected +ipv6 embedded IPv4 invalid: rejected +ipv6 embedded IPv4 valid: ok +ipv6 trailing colon: rejected +ipv6 single leading colon: rejected +ipv6 full 8 groups: ok +ipv6 embedded IPv4 6 groups: ok diff --git a/test/default/kdf_hkdf4.c b/test/default/kdf_hkdf4.c new file mode 100644 index 00000000..bccc9629 --- /dev/null +++ b/test/default/kdf_hkdf4.c @@ -0,0 +1,42 @@ +#define TEST_NAME "kdf_hkdf4" +#include "cmptest.h" + +int +main(void) +{ + unsigned char prk256[crypto_kdf_hkdf_sha256_KEYBYTES]; + unsigned char prk512[crypto_kdf_hkdf_sha512_KEYBYTES]; + unsigned char out256[256]; + unsigned char out512[256]; + char hex[65]; + + crypto_kdf_hkdf_sha256_extract(prk256, NULL, 0, + (const unsigned char *) "input key material", 18); + + assert(crypto_kdf_hkdf_sha256_expand(out256, 100, "context", 7, prk256) == 0); + sodium_bin2hex(hex, sizeof hex, out256, 32); + printf("sha256 expand 100 first 32: %s\n", hex); + sodium_bin2hex(hex, sizeof hex, out256 + 64, 32); + printf("sha256 expand 100 bytes 64-95: %s\n", hex); + + crypto_kdf_hkdf_sha512_extract(prk512, NULL, 0, + (const unsigned char *) "input key material", 18); + + assert(crypto_kdf_hkdf_sha512_expand(out512, 200, "context", 7, prk512) == 0); + sodium_bin2hex(hex, sizeof hex, out512, 32); + printf("sha512 expand 200 first 32: %s\n", hex); + sodium_bin2hex(hex, sizeof hex, out512 + 128, 32); + printf("sha512 expand 200 bytes 128-159: %s\n", hex); + + assert(crypto_kdf_hkdf_sha512_expand(out512, 128, "ctx2", 4, prk512) == 0); + sodium_bin2hex(hex, sizeof hex, out512 + 64, 32); + printf("sha512 expand 128 second block: %s\n", hex); + + assert(crypto_kdf_hkdf_sha512_expand(out512, 64, "ctx3", 4, prk512) == 0); + sodium_bin2hex(hex, sizeof hex, out512, 32); + printf("sha512 expand 64: %s\n", hex); + + printf("ok\n"); + + return 0; +} diff --git a/test/default/kdf_hkdf4.exp b/test/default/kdf_hkdf4.exp new file mode 100644 index 00000000..9f8d381d --- /dev/null +++ b/test/default/kdf_hkdf4.exp @@ -0,0 +1,7 @@ +sha256 expand 100 first 32: 6c7c112b81dce760ab3e69dc3d908046a8b0eaa96cf0d0193196ddc422190535 +sha256 expand 100 bytes 64-95: 242987e3b48af0960bd7fc2f436ce4017f7f5706179b7063204347b1581be20a +sha512 expand 200 first 32: f8f7a3d9d607725ce796b192216c4eb3cb95fc91b946eeaa9cc5d60998123b9a +sha512 expand 200 bytes 128-159: 521f83b9f328f046a1358214abf716e356987c02dceb04ee139f7c120a5c8c55 +sha512 expand 128 second block: 5512dbbaf49f8f4351de113f123c8cd2dc93b67b4fd7c1e46d9e89a682489930 +sha512 expand 64: b31b0743dc48859226e25ee25337c18a6dbf21b1ec8124b11ac282be30e934b2 +ok diff --git a/test/default/pwhash_argon2id2.c b/test/default/pwhash_argon2id2.c new file mode 100644 index 00000000..e9cfb794 --- /dev/null +++ b/test/default/pwhash_argon2id2.c @@ -0,0 +1,56 @@ +#define TEST_NAME "pwhash_argon2id2" +#include "cmptest.h" + +int +main(void) +{ + char str_out[crypto_pwhash_STRBYTES]; + unsigned char out[32]; + int ret; + + ret = crypto_pwhash_argon2id_str(str_out, "test", 4, 3, 5000000); + if (ret != 0) { + printf("pwhash_argon2id_str failed\n"); + return 1; + } + printf("hash created: ok\n"); + + assert(crypto_pwhash_argon2id_str_verify(str_out, "test", 4) == 0); + printf("verify: ok\n"); + +#if SIZE_MAX > 0xFFFFFFFFULL + ret = crypto_pwhash_argon2id_str_needs_rehash(str_out, + (unsigned long long) 0x100000000ULL, + 5000000); + assert(ret == -1); + printf("needs_rehash opslimit overflow: rejected\n"); + + ret = crypto_pwhash_argon2id_str_needs_rehash(str_out, 3, + (size_t) 0x100000000ULL * 1024ULL); + assert(ret == -1); + printf("needs_rehash memlimit overflow: rejected\n"); +#else + printf("needs_rehash opslimit overflow: rejected\n"); + printf("needs_rehash memlimit overflow: rejected\n"); +#endif + + ret = crypto_pwhash_argon2id_str_needs_rehash(str_out, 3, 5000000); + assert(ret == 0); + printf("needs_rehash same params: ok\n"); + + ret = crypto_pwhash_argon2i_str_needs_rehash(str_out, 3, 5000000); + assert(ret == -1); + printf("argon2i needs_rehash on argon2id: rejected\n"); + + assert(crypto_pwhash_str_verify(str_out, "wrong", 5) == -1); + printf("verify wrong password: rejected\n"); + + ret = crypto_pwhash(out, sizeof out, + "test", 4, + (const unsigned char *) str_out + 30, + 3, 5000000, crypto_pwhash_ALG_ARGON2I13); + assert(ret == 0); + printf("pwhash argon2i alg: ok\n"); + + return 0; +} diff --git a/test/default/pwhash_argon2id2.exp b/test/default/pwhash_argon2id2.exp new file mode 100644 index 00000000..593495ad --- /dev/null +++ b/test/default/pwhash_argon2id2.exp @@ -0,0 +1,8 @@ +hash created: ok +verify: ok +needs_rehash opslimit overflow: rejected +needs_rehash memlimit overflow: rejected +needs_rehash same params: ok +argon2i needs_rehash on argon2id: rejected +verify wrong password: rejected +pwhash argon2i alg: ok diff --git a/test/default/sodium_utils4.c b/test/default/sodium_utils4.c new file mode 100644 index 00000000..027cc6ed --- /dev/null +++ b/test/default/sodium_utils4.c @@ -0,0 +1,51 @@ +#define TEST_NAME "sodium_utils4" +#include "cmptest.h" + +#undef sodium_malloc +#undef sodium_free +#undef sodium_allocarray + +int +main(void) +{ + void *buf; + + buf = sodium_allocarray(10, 100); + assert(buf != NULL); + memset(buf, 0, 1000); + sodium_free(buf); + printf("allocarray: ok\n"); + + buf = sodium_allocarray(0, 100); + sodium_free(buf); + printf("allocarray zero count: ok\n"); + + buf = sodium_allocarray(100, 0); + sodium_free(buf); + printf("allocarray zero size: ok\n"); + + buf = sodium_allocarray(SIZE_MAX / 2 + 1, SIZE_MAX / 2); + assert(buf == NULL); + printf("allocarray overflow: ok\n"); + + buf = sodium_malloc(SIZE_MAX - 1U); + assert(buf == NULL); + printf("malloc SIZE_MAX-1: ok\n"); + + sodium_free(NULL); + printf("free NULL: ok\n"); + + buf = sodium_malloc(100); + assert(buf != NULL); + memset(buf, 0x42, 100); + sodium_mprotect_noaccess(buf); + sodium_mprotect_readwrite(buf); + assert(((unsigned char *) buf)[0] == 0x42); + sodium_mprotect_readonly(buf); + assert(((unsigned char *) buf)[0] == 0x42); + sodium_mprotect_readwrite(buf); + sodium_free(buf); + printf("mprotect cycle: ok\n"); + + return 0; +} diff --git a/test/default/sodium_utils4.exp b/test/default/sodium_utils4.exp new file mode 100644 index 00000000..78ff9442 --- /dev/null +++ b/test/default/sodium_utils4.exp @@ -0,0 +1,7 @@ +allocarray: ok +allocarray zero count: ok +allocarray zero size: ok +allocarray overflow: ok +malloc SIZE_MAX-1: ok +free NULL: ok +mprotect cycle: ok diff --git a/test/default/stream6.c b/test/default/stream6.c new file mode 100644 index 00000000..d97d7797 --- /dev/null +++ b/test/default/stream6.c @@ -0,0 +1,52 @@ +#define TEST_NAME "stream6" +#include "cmptest.h" + +int +main(void) +{ + unsigned char key[crypto_stream_salsa2012_KEYBYTES]; + unsigned char nonce[crypto_stream_salsa2012_NONCEBYTES]; + unsigned char *buf; + unsigned char *out; + + memset(key, 0x01, sizeof key); + memset(nonce, 0x02, sizeof nonce); + + buf = (unsigned char *) sodium_malloc(256); + out = (unsigned char *) sodium_malloc(256); + + assert(crypto_stream_salsa2012_xor(out, buf, 0, nonce, key) == 0); + printf("xor_zero_len: ok\n"); + + memset(buf, 0, 100); + crypto_stream_salsa2012_xor(out, buf, 100, nonce, key); + { + unsigned char stream_out[100]; + + crypto_stream_salsa2012(stream_out, 100, nonce, key); + assert(memcmp(out, stream_out, 100) == 0); + } + printf("xor_tail_block: ok\n"); + + memset(buf, 0x55, 137); + crypto_stream_salsa2012_xor(out, buf, 137, nonce, key); + crypto_stream_salsa2012_xor(out, out, 137, nonce, key); + assert(memcmp(out, buf, 137) == 0); + printf("xor_roundtrip_137: ok\n"); + + memset(out, 0xab, 1); + crypto_stream_salsa2012(out, 0, nonce, key); + assert(out[0] == 0xab); + printf("stream_zero_len: ok\n"); + + memset(buf, 0x42, 256); + crypto_stream_salsa2012_xor(out, buf, 256, nonce, key); + crypto_stream_salsa2012_xor(out, out, 256, nonce, key); + assert(memcmp(out, buf, 256) == 0); + printf("xor_roundtrip_256: ok\n"); + + sodium_free(buf); + sodium_free(out); + + return 0; +} diff --git a/test/default/stream6.exp b/test/default/stream6.exp new file mode 100644 index 00000000..ec4c7150 --- /dev/null +++ b/test/default/stream6.exp @@ -0,0 +1,5 @@ +xor_zero_len: ok +xor_tail_block: ok +xor_roundtrip_137: ok +stream_zero_len: ok +xor_roundtrip_256: ok