Run some unit test cases based (poorly) around sodium's test infrastructure.
Increase in unity test task stack is due to signature tests, load a lot of data onto the stack.
[submodule "components/esp32/lib"]
path = components/esp32/lib
url = https://github.com/espressif/esp32-wifi-lib.git
+
[submodule "components/esptool_py/esptool"]
path = components/esptool_py/esptool
url = https://github.com/espressif/esptool.git
+
[submodule "components/bt/lib"]
path = components/bt/lib
url = https://github.com/espressif/esp32-bt-lib.git
+
[submodule "components/micro-ecc/micro-ecc"]
path = components/micro-ecc/micro-ecc
url = https://github.com/kmackay/micro-ecc.git
+
[submodule "components/coap/libcoap"]
path = components/coap/libcoap
url = https://github.com/obgm/libcoap.git
+
[submodule "components/aws_iot/aws-iot-device-sdk-embedded-C"]
path = components/aws_iot/aws-iot-device-sdk-embedded-C
url = https://github.com/espressif/aws-iot-device-sdk-embedded-C.git
+
[submodule "components/nghttp/nghttp2"]
path = components/nghttp/nghttp2
url = https://github.com/nghttp2/nghttp2.git
+
+[submodule "components/libsodium/libsodium"]
+ path = components/libsodium/libsodium
+ url = https://github.com/jedisct1/libsodium.git
--- /dev/null
+COMPONENT_SUBMODULES += libsodium
+
+# Common root directory for all source directories
+LSRC := libsodium/src/libsodium
+
+COMPONENT_SRCDIRS := private
+
+# Derived from libsodium/src/libsodium/Makefile.am
+# (ignoring the !MINIMAL set)
+COMPONENT_SRCDIRS += \
+ $(LSRC)/crypto_aead/chacha20poly1305/sodium \
+ $(LSRC)/crypto_aead/xchacha20poly1305/sodium \
+ $(LSRC)/crypto_auth \
+ $(LSRC)/crypto_auth/hmacsha256 \
+ $(LSRC)/crypto_auth/hmacsha512 \
+ $(LSRC)/crypto_auth/hmacsha512256 \
+ $(LSRC)/crypto_box \
+ $(LSRC)/crypto_box/curve25519xsalsa20poly1305 \
+ $(LSRC)/crypto_core/curve25519/ref10 \
+ $(LSRC)/crypto_core/hchacha20 \
+ $(LSRC)/crypto_core/hsalsa20/ref2 \
+ $(LSRC)/crypto_core/hsalsa20 \
+ $(LSRC)/crypto_core/salsa/ref \
+ $(LSRC)/crypto_generichash \
+ $(LSRC)/crypto_generichash/blake2b \
+ $(LSRC)/crypto_generichash/blake2b/ref \
+ $(LSRC)/crypto_hash \
+ $(LSRC)/crypto_hash/sha256 \
+ $(LSRC)/crypto_hash/sha256/cp \
+ $(LSRC)/crypto_hash/sha512 \
+ $(LSRC)/crypto_hash/sha512/cp \
+ $(LSRC)/crypto_kdf/blake2b \
+ $(LSRC)/crypto_kdf \
+ $(LSRC)/crypto_kx \
+ $(LSRC)/crypto_onetimeauth \
+ $(LSRC)/crypto_onetimeauth/poly1305 \
+ $(LSRC)/crypto_onetimeauth/poly1305/donna \
+ $(LSRC)/crypto_pwhash/argon2 \
+ $(LSRC)/crypto_pwhash \
+ $(LSRC)/crypto_pwhash/scryptsalsa208sha256 \
+ $(LSRC)/crypto_pwhash/scryptsalsa208sha256/nosse \
+ $(LSRC)/crypto_scalarmult \
+ $(LSRC)/crypto_scalarmult/curve25519 \
+ $(LSRC)/crypto_scalarmult/curve25519/ref10 \
+ $(LSRC)/crypto_secretbox \
+ $(LSRC)/crypto_secretbox/xsalsa20poly1305 \
+ $(LSRC)/crypto_shorthash \
+ $(LSRC)/crypto_shorthash/siphash24 \
+ $(LSRC)/crypto_shorthash/siphash24/ref \
+ $(LSRC)/crypto_sign \
+ $(LSRC)/crypto_sign/ed25519 \
+ $(LSRC)/crypto_sign/ed25519/ref10 \
+ $(LSRC)/crypto_stream/chacha20 \
+ $(LSRC)/crypto_stream/chacha20/ref \
+ $(LSRC)/crypto_stream \
+ $(LSRC)/crypto_stream/salsa20 \
+ $(LSRC)/crypto_stream/salsa20/ref \
+ $(LSRC)/crypto_stream/xsalsa20 \
+ $(LSRC)/crypto_verify/sodium \
+ $(LSRC)/randombytes \
+ $(LSRC)/sodium
+
+# Fix some warnings in current libsodium source files
+# (not applied to whole component as we compile some of our own files, also.)
+$(LSRC)/crypto_pwhash/argon2/argon2-fill-block-ref.o: CFLAGS += -Wno-unknown-pragmas
+$(LSRC)/crypto_pwhash/argon2/pwhash_argon2i.o: CFLAGS += -Wno-type-limits
+$(LSRC)/crypto_pwhash/argon2/argon2-core.o: CFLAGS += -Wno-type-limits
+$(LSRC)/crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.o: CFLAGS += -Wno-type-limits
+$(LSRC)/sodium/utils.o: CFLAGS += -Wno-unused-variable
+
+COMPONENT_ADD_INCLUDEDIRS := $(LSRC)/include port_include
+COMPONENT_PRIV_INCLUDEDIRS := $(LSRC)/include/sodium port_include/sodium private
+
+# Not using autoconf, but this needs to be set
+CFLAGS += -DCONFIGURED
+
+# Add the options from configure.ac (this needs checking if new versions are added )
+CFLAGS += -DNATIVE_LITTLE_ENDIAN -DHAVE_WEAK_SYMBOLS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS
+
+# randombytes.c needs to pull in platform-specific implementation
+$(LSRC)/randombytes/randombytes.o: CFLAGS+=-DRANDOMBYTES_DEFAULT_IMPLEMENTATION
--- /dev/null
+Subproject commit 70170c28c844a4786e75efc626e1aeebc93caebc
--- /dev/null
+
+#ifndef sodium_version_H
+#define sodium_version_H
+
+#include <sodium/export.h>
+
+/* IMPORTANT: As we don't use autotools, these version are not automatically
+ updated if we change submodules. They need to be changed manually.
+*/
+
+#define SODIUM_VERSION_STRING "1.0.12-idf"
+
+/* Note: these are not the same as the overall version, see
+ configure.ac for the relevant macros */
+#define SODIUM_LIBRARY_VERSION_MAJOR 9
+#define SODIUM_LIBRARY_VERSION_MINOR 4
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SODIUM_EXPORT
+const char *sodium_version_string(void);
+
+SODIUM_EXPORT
+int sodium_library_version_major(void);
+
+SODIUM_EXPORT
+int sodium_library_version_minor(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+// Copyright 2017 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#pragma once
+
+# include "export.h"
+# include "randombytes.h"
+
+SODIUM_EXPORT
+extern const struct randombytes_implementation randombytes_esp32_implementation;
+
+/* Defining RANDOMBYTES_DEFAULT_IMPLEMENTATION here allows us to compile with the ESP32 hardware
+ implementation as the default. No need to call randombytes_set_implementation().
+
+ Doing it in the header like this is easier than passing it via a -D argument to gcc.
+*/
+#undef RANDOMBYTES_DEFAULT_IMPLEMENTATION
+#define RANDOMBYTES_DEFAULT_IMPLEMENTATION &randombytes_esp32_implementation
--- /dev/null
+// Copyright 2017 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#include "randombytes_default.h"
+#include "esp_system.h"
+
+static void randombytes_esp32_random_buf(void * const buf, const size_t size)
+{
+ uint8_t *p = (uint8_t *)buf;
+ for (size_t i = 0; i < size; i++) {
+ p[i] = esp_random();
+ }
+}
+
+static const char *randombytes_esp32_implementation_name(void)
+{
+ return "esp32";
+}
+
+/*
+ Plug the ESP32 hardware RNG into libsodium's custom RNG support, as per
+ https://download.libsodium.org/doc/advanced/custom_rng.html
+
+ Note that this RNG is selected by default (see randombytes_default.h), so there
+ is no need to call randombytes_set_implementation().
+*/
+const struct randombytes_implementation randombytes_esp32_implementation = {
+ .implementation_name = randombytes_esp32_implementation_name,
+ .random = esp_random,
+ .stir = NULL,
+ .uniform = NULL,
+ .buf = randombytes_esp32_random_buf,
+ .close = NULL,
+};
+
--- /dev/null
+#
+#Component Makefile
+#
+
+LS_TESTDIR := ../libsodium/test/default
+
+COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
+
+COMPONENT_SRCDIRS := . $(LS_TESTDIR)
+
+COMPONENT_PRIV_INCLUDEDIRS := $(LS_TESTDIR)/../quirks
+
+COMPONENT_OBJS := test_sodium.o
+
+# The libsodium test suite is designed to be run each test case as an executable on a desktop computer and uses
+# filesytem to write & then compare contents of each file.
+#
+# For now, use their "BROWSER_TEST" mode with these hacks so that
+# multiple test cases can be combined into one ELF file.
+#
+# Run each test case from test_sodium.c as CASENAME_xmain().
+
+define sodium_testcase
+# this generates 'warning "main" redefined' warnings at
+# runtime. Only solution involves patching libsodium's cmptest.h
+$(LS_TESTDIR)/$(1).o: CFLAGS+=-Dxmain=$(1)_xmain -Dmain=$(1)_main
+ote:
+COMPONENT_OBJS += $(LS_TESTDIR)/$(1).o
+endef
+
+TEST_CASES := chacha20 aead_chacha20poly1305 box box2 ed25519_convert sign
+
+$(foreach case,$(TEST_CASES),$(eval $(call sodium_testcase,$(case))))
+
+# this seems odd, but it prevents the libsodium test harness from
+# trying to write to a file!
+CFLAGS += -DBROWSER_TESTS
+
+
--- /dev/null
+#include "unity.h"
+
+/* Note: a lot of these libsodium test programs assert() things, but they're not complete unit tests - most expect
+ output to be compared to the matching .exp file.
+
+ We don't do this automatically yet, maybe once we have more options for
+ internal filesystem storage.
+*/
+
+extern int aead_chacha20poly1305_xmain();
+
+TEST_CASE("aead_chacha20poly1305 test vectors", "[libsodium]")
+{
+ printf("Running aead_chacha20poly1305\n");
+ TEST_ASSERT_EQUAL(0, aead_chacha20poly1305_xmain());
+}
+
+extern int chacha20_xmain();
+
+TEST_CASE("chacha20 test vectors", "[libsodium]")
+{
+ printf("Running chacha20\n");
+ TEST_ASSERT_EQUAL(0, chacha20_xmain());
+}
+
+extern int box_xmain();
+extern int box2_xmain();
+
+TEST_CASE("box tests", "[libsodium]")
+{
+ printf("Running box\n");
+ TEST_ASSERT_EQUAL(0, box_xmain());
+
+ printf("Running box2\n");
+ TEST_ASSERT_EQUAL(0, box2_xmain());
+}
+
+extern int ed25519_convert_xmain();
+
+TEST_CASE("ed25519_convert tests", "[libsodium]")
+{
+ printf("Running ed25519_convert\n");
+ TEST_ASSERT_EQUAL(0, ed25519_convert_xmain() );
+}
+
+extern int sign_xmain();
+
+TEST_CASE("sign tests", "[libsodium]")
+{
+ printf("Running sign\n");
+ TEST_ASSERT_EQUAL(0, sign_xmain() );
+}
+
+
{
// Note: if unpinning this task, change the way run times are calculated in
// unity_platform
- xTaskCreatePinnedToCore(unityTask, "unityTask", 4096, NULL,
+ xTaskCreatePinnedToCore(unityTask, "unityTask", 8192, NULL,
UNITY_FREERTOS_PRIORITY, NULL, UNITY_FREERTOS_CPU);
}