From 67952004f323774bca8c9e3d3269be0045dcb4c2 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Tue, 29 Oct 2024 19:30:12 +0400 Subject: [PATCH 01/21] Change name of benchmark directory Signed-off-by: Anjan Roy --- {benchmarks => benches}/bench_common.hpp | 0 {benchmarks => benches}/bench_hashing.cpp | 0 {benchmarks => benches}/bench_keccak.cpp | 0 {benchmarks => benches}/bench_xof.cpp | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {benchmarks => benches}/bench_common.hpp (100%) rename {benchmarks => benches}/bench_hashing.cpp (100%) rename {benchmarks => benches}/bench_keccak.cpp (100%) rename {benchmarks => benches}/bench_xof.cpp (100%) diff --git a/benchmarks/bench_common.hpp b/benches/bench_common.hpp similarity index 100% rename from benchmarks/bench_common.hpp rename to benches/bench_common.hpp diff --git a/benchmarks/bench_hashing.cpp b/benches/bench_hashing.cpp similarity index 100% rename from benchmarks/bench_hashing.cpp rename to benches/bench_hashing.cpp diff --git a/benchmarks/bench_keccak.cpp b/benches/bench_keccak.cpp similarity index 100% rename from benchmarks/bench_keccak.cpp rename to benches/bench_keccak.cpp diff --git a/benchmarks/bench_xof.cpp b/benches/bench_xof.cpp similarity index 100% rename from benchmarks/bench_xof.cpp rename to benches/bench_xof.cpp From acac2021b6916c6e1388732f431e84455923441d Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Tue, 29 Oct 2024 19:34:04 +0400 Subject: [PATCH 02/21] Split a large Makefile into multiple smaller ones Also add more targets for building ASAN, UBSAN tests in both release and debug modes Signed-off-by: Anjan Roy --- Makefile | 113 +++++++---------------------------------------- benches/bench.mk | 39 ++++++++++++++++ tests/test.mk | 91 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 98 deletions(-) create mode 100644 benches/bench.mk create mode 100644 tests/test.mk diff --git a/Makefile b/Makefile index af85178..4daddee 100644 --- a/Makefile +++ b/Makefile @@ -1,113 +1,30 @@ CXX ?= clang++ -CXX_FLAGS = -std=c++20 -WARN_FLAGS = -Wall -Wextra -pedantic -OPT_FLAGS = -O3 -march=native -LINK_FLAGS = -flto -I_FLAGS = -I ./include +CXX_DEFS += +CXX_FLAGS := -std=c++20 +WARN_FLAGS := -Wall -Wextra -Wpedantic +DEBUG_FLAGS := -O1 -g +RELEASE_FLAGS := -O3 -march=native +LINK_OPT_FLAGS := -flto + +I_FLAGS := -I ./include PERF_DEFS = -DCYCLES_PER_BYTE -ASAN_FLAGS = -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address # From https://clang.llvm.org/docs/AddressSanitizer.html -UBSAN_FLAGS = -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=undefined # From https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html -SRC_DIR = include -SHA3_SOURCES := $(wildcard $(SRC_DIR)/*.hpp) -BUILD_DIR = build - -TEST_DIR = tests -TEST_BUILD_DIR := $(BUILD_DIR)/$(TEST_DIR) -ASAN_BUILD_DIR = $(TEST_BUILD_DIR)/asan -UBSAN_BUILD_DIR = $(TEST_BUILD_DIR)/ubsan -TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp) -TEST_OBJECTS := $(addprefix $(TEST_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) -ASAN_TEST_OBJECTS := $(addprefix $(ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) -UBSAN_TEST_OBJECTS := $(addprefix $(UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) -TEST_LINK_FLAGS = -lgtest -lgtest_main -TEST_BINARY = $(TEST_BUILD_DIR)/test.out -ASAN_TEST_BINARY = $(ASAN_BUILD_DIR)/test.out -UBSAN_TEST_BINARY = $(UBSAN_BUILD_DIR)/test.out - -BENCHMARK_DIR = benchmarks -BENCHMARK_SOURCES := $(wildcard $(BENCHMARK_DIR)/*.cpp) -BENCHMARK_BUILD_DIR := $(BUILD_DIR)/$(BENCHMARK_DIR) -PERF_BUILD_DIR := $(BUILD_DIR)/perfs -BENCHMARK_OBJECTS := $(addprefix $(BENCHMARK_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES)))) -PERF_OBJECTS := $(addprefix $(PERF_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES)))) -BENCHMARK_LINK_FLAGS = -lbenchmark -lbenchmark_main -BENCHMARK_BINARY = $(BENCHMARK_BUILD_DIR)/bench.out -PERF_LINK_FLAGS = -lbenchmark -lbenchmark_main -lpfm -PERF_BINARY = $(PERF_BUILD_DIR)/perf.out -GTEST_PARALLEL = ./gtest-parallel/gtest-parallel +SRC_DIR := include +SHA3_SOURCES := $(shell find $(SRC_DIR) -name '*.hpp') +BUILD_DIR := build all: test -$(TEST_BUILD_DIR): - mkdir -p $@ - -$(ASAN_BUILD_DIR): - mkdir -p $@ - -$(UBSAN_BUILD_DIR): - mkdir -p $@ - -$(BENCHMARK_BUILD_DIR): - mkdir -p $@ - -$(PERF_BUILD_DIR): - mkdir -p $@ +include tests/test.mk +include benches/bench.mk $(GTEST_PARALLEL): - git submodule update --init - -$(TEST_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(TEST_BUILD_DIR) - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) -c $< -o $@ - -$(ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(ASAN_BUILD_DIR) - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(ASAN_FLAGS) $(I_FLAGS) -c $< -o $@ - -$(UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(UBSAN_BUILD_DIR) - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(UBSAN_FLAGS) $(I_FLAGS) -c $< -o $@ - -$(TEST_BINARY): $(TEST_OBJECTS) - $(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ - -$(ASAN_TEST_BINARY): $(ASAN_TEST_OBJECTS) - $(CXX) $(ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ - -$(UBSAN_TEST_BINARY): $(UBSAN_TEST_OBJECTS) - $(CXX) $(UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ - -test: $(TEST_BINARY) $(GTEST_PARALLEL) - $(GTEST_PARALLEL) $< --print_test_times - -asan_test: $(ASAN_TEST_BINARY) $(GTEST_PARALLEL) - $(GTEST_PARALLEL) $< --print_test_times - -ubsan_test: $(UBSAN_TEST_BINARY) $(GTEST_PARALLEL) - $(GTEST_PARALLEL) $< --print_test_times - -$(BENCHMARK_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(BENCHMARK_BUILD_DIR) - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) -c $< -o $@ - -$(PERF_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(PERF_BUILD_DIR) - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(PERF_DEFS) $(I_FLAGS) -c $< -o $@ - -$(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS) - $(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@ - -benchmark: $(BENCHMARK_BINARY) - # Must *not* build google-benchmark with libPFM - ./$< --benchmark_min_warmup_time=.1 --benchmark_enable_random_interleaving=true --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_counters_tabular=true --benchmark_display_aggregates_only=true - -$(PERF_BINARY): $(PERF_OBJECTS) - $(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@ - -perf: $(PERF_BINARY) - # Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7 - ./$< --benchmark_min_warmup_time=.1 --benchmark_enable_random_interleaving=true --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_counters_tabular=true --benchmark_display_aggregates_only=true --benchmark_perf_counters=CYCLES + git submodule update --init gtest-parallel .PHONY: format clean clean: rm -rf $(BUILD_DIR) -format: $(SHA3_SOURCES) $(TEST_SOURCES) $(BENCHMARK_SOURCES) +format: $(SHA3_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) clang-format -i $^ diff --git a/benches/bench.mk b/benches/bench.mk new file mode 100644 index 0000000..491ff3b --- /dev/null +++ b/benches/bench.mk @@ -0,0 +1,39 @@ +BENCHMARK_BUILD_DIR := $(BUILD_DIR)/benchmark +PERF_BUILD_DIR := $(BUILD_DIR)/perf + +BENCHMARK_DIR := benches +BENCHMARK_SOURCES := $(wildcard $(BENCHMARK_DIR)/*.cpp) +BENCHMARK_HEADERS := $(wildcard $(BENCHMARK_DIR)/*.hpp) +BENCHMARK_OBJECTS := $(addprefix $(BENCHMARK_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES)))) +BENCHMARK_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpthread +BENCHMARK_BINARY := $(BENCHMARK_BUILD_DIR)/bench.out +PERF_OBJECTS := $(addprefix $(PERF_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES)))) +PERF_BINARY := $(PERF_BUILD_DIR)/perf.out +PERF_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpfm -lpthread +BENCHMARK_OUT_FILE := bench_result_on_$(shell uname -s)_$(shell uname -r)_$(shell uname -m)_with_$(CXX)_$(shell $(CXX) -dumpversion).json + +$(BENCHMARK_BUILD_DIR): + mkdir -p $@ + +$(PERF_BUILD_DIR): + mkdir -p $@ + +$(BENCHMARK_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(BENCHMARK_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) -c $< -o $@ + +$(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS) + $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@ + +benchmark: $(BENCHMARK_BINARY) + # Must *not* build google-benchmark with libPFM + ./$< --benchmark_min_warmup_time=.1 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) + +$(PERF_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(PERF_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $(PERF_DEFS) -c $< -o $@ + +$(PERF_BINARY): $(PERF_OBJECTS) + $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@ + +perf: $(PERF_BINARY) + # Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7 + ./$< --benchmark_min_warmup_time=.1 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_perf_counters=CYCLES --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) diff --git a/tests/test.mk b/tests/test.mk new file mode 100644 index 0000000..0b9e82f --- /dev/null +++ b/tests/test.mk @@ -0,0 +1,91 @@ +ASAN_FLAGS := -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address # From https://clang.llvm.org/docs/AddressSanitizer.html +DEBUG_ASAN_FLAGS := $(DEBUG_FLAGS) $(ASAN_FLAGS) +RELEASE_ASAN_FLAGS := -g $(RELEASE_FLAGS) $(ASAN_FLAGS) +UBSAN_FLAGS := -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=undefined # From https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html +DEBUG_UBSAN_FLAGS := $(DEBUG_FLAGS) $(UBSAN_FLAGS) +RELEASE_UBSAN_FLAGS := -g $(RELEASE_FLAGS) $(UBSAN_FLAGS) + +TEST_BUILD_DIR := $(BUILD_DIR)/test +ASAN_BUILD_DIR := $(BUILD_DIR)/asan +DEBUG_ASAN_BUILD_DIR := $(ASAN_BUILD_DIR)/debug +RELEASE_ASAN_BUILD_DIR := $(ASAN_BUILD_DIR)/release +UBSAN_BUILD_DIR := $(BUILD_DIR)/ubsan +DEBUG_UBSAN_BUILD_DIR := $(UBSAN_BUILD_DIR)/debug +RELEASE_UBSAN_BUILD_DIR := $(UBSAN_BUILD_DIR)/release + +TEST_DIR := tests +TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp) +TEST_HEADERS := $(wildcard $(TEST_DIR)/*.hpp) +TEST_OBJECTS := $(addprefix $(TEST_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +TEST_BINARY := $(TEST_BUILD_DIR)/test.out +TEST_LINK_FLAGS := -lgtest -lgtest_main +GTEST_PARALLEL := ./gtest-parallel/gtest-parallel + +DEBUG_ASAN_TEST_OBJECTS := $(addprefix $(DEBUG_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +RELEASE_ASAN_TEST_OBJECTS := $(addprefix $(RELEASE_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +DEBUG_ASAN_TEST_BINARY := $(DEBUG_ASAN_BUILD_DIR)/test.out +RELEASE_ASAN_TEST_BINARY := $(RELEASE_ASAN_BUILD_DIR)/test.out +DEBUG_UBSAN_TEST_OBJECTS := $(addprefix $(DEBUG_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +RELEASE_UBSAN_TEST_OBJECTS := $(addprefix $(RELEASE_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +DEBUG_UBSAN_TEST_BINARY := $(DEBUG_UBSAN_BUILD_DIR)/test.out +RELEASE_UBSAN_TEST_BINARY := $(RELEASE_UBSAN_BUILD_DIR)/test.out + +$(DEBUG_ASAN_BUILD_DIR): + mkdir -p $@ + +$(RELEASE_ASAN_BUILD_DIR): + mkdir -p $@ + +$(DEBUG_UBSAN_BUILD_DIR): + mkdir -p $@ + +$(RELEASE_UBSAN_BUILD_DIR): + mkdir -p $@ + +$(TEST_BUILD_DIR): + mkdir -p $@ + +$(TEST_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(TEST_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) -c $< -o $@ + +$(DEBUG_ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(DEBUG_ASAN_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(DEBUG_ASAN_FLAGS) $(I_FLAGS) -c $< -o $@ + +$(RELEASE_ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(RELEASE_ASAN_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_ASAN_FLAGS) $(I_FLAGS) -c $< -o $@ + +$(DEBUG_UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(DEBUG_UBSAN_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(DEBUG_UBSAN_FLAGS) $(I_FLAGS) -c $< -o $@ + +$(RELEASE_UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(RELEASE_UBSAN_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_UBSAN_FLAGS) $(I_FLAGS) -c $< -o $@ + +$(TEST_BINARY): $(TEST_OBJECTS) + $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ + +$(DEBUG_ASAN_TEST_BINARY): $(DEBUG_ASAN_TEST_OBJECTS) + $(CXX) $(DEBUG_ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ + +$(RELEASE_ASAN_TEST_BINARY): $(RELEASE_ASAN_TEST_OBJECTS) + $(CXX) $(RELEASE_ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ + +$(DEBUG_UBSAN_TEST_BINARY): $(DEBUG_UBSAN_TEST_OBJECTS) + $(CXX) $(DEBUG_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ + +$(RELEASE_UBSAN_TEST_BINARY): $(RELEASE_UBSAN_TEST_OBJECTS) + $(CXX) $(RELEASE_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ + +test: $(TEST_BINARY) $(GTEST_PARALLEL) + $(GTEST_PARALLEL) $< --print_test_times + +debug_asan_test: $(DEBUG_ASAN_TEST_BINARY) $(GTEST_PARALLEL) + $(GTEST_PARALLEL) $< --print_test_times + +release_asan_test: $(RELEASE_ASAN_TEST_BINARY) $(GTEST_PARALLEL) + $(GTEST_PARALLEL) $< --print_test_times + +debug_ubsan_test: $(DEBUG_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) + $(GTEST_PARALLEL) $< --print_test_times + +release_ubsan_test: $(RELEASE_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) + $(GTEST_PARALLEL) $< --print_test_times From 91b3da2c71ed47ced98683d54b182b7f76b6d5ef Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Tue, 29 Oct 2024 19:54:21 +0400 Subject: [PATCH 03/21] Change directory structure of library source tree Signed-off-by: Anjan Roy --- include/{ => sha3/internals}/keccak.hpp | 2 - include/{ => sha3/internals}/sponge.hpp | 1 - include/{ => sha3/internals}/utils.hpp | 63 ------------------------- include/{ => sha3}/sha3_224.hpp | 2 +- include/{ => sha3}/sha3_256.hpp | 2 +- include/{ => sha3}/sha3_384.hpp | 2 +- include/{ => sha3}/sha3_512.hpp | 2 +- include/{ => sha3}/shake128.hpp | 2 +- include/{ => sha3}/shake256.hpp | 2 +- 9 files changed, 6 insertions(+), 72 deletions(-) rename include/{ => sha3/internals}/keccak.hpp (99%) rename include/{ => sha3/internals}/sponge.hpp (99%) rename include/{ => sha3/internals}/utils.hpp (70%) rename include/{ => sha3}/sha3_224.hpp (98%) rename include/{ => sha3}/sha3_256.hpp (98%) rename include/{ => sha3}/sha3_384.hpp (98%) rename include/{ => sha3}/sha3_512.hpp (98%) rename include/{ => sha3}/shake128.hpp (98%) rename include/{ => sha3}/shake256.hpp (98%) diff --git a/include/keccak.hpp b/include/sha3/internals/keccak.hpp similarity index 99% rename from include/keccak.hpp rename to include/sha3/internals/keccak.hpp index 3241ab8..19f0188 100644 --- a/include/keccak.hpp +++ b/include/sha3/internals/keccak.hpp @@ -1,10 +1,8 @@ #pragma once -#include #include #include #include #include -#include // Keccak-p[1600, 24] permutation namespace keccak { diff --git a/include/sponge.hpp b/include/sha3/internals/sponge.hpp similarity index 99% rename from include/sponge.hpp rename to include/sha3/internals/sponge.hpp index ab99406..a69b5da 100644 --- a/include/sponge.hpp +++ b/include/sha3/internals/sponge.hpp @@ -3,7 +3,6 @@ #include "utils.hpp" #include #include -#include #include #include #include diff --git a/include/utils.hpp b/include/sha3/internals/utils.hpp similarity index 70% rename from include/utils.hpp rename to include/sha3/internals/utils.hpp index 1f53904..0a8eaf2 100644 --- a/include/utils.hpp +++ b/include/sha3/internals/utils.hpp @@ -1,14 +1,9 @@ #pragma once #include -#include #include #include #include -#include -#include #include -#include -#include // Utility ( or commonly used ) functions for SHA3 implementation namespace sha3_utils { @@ -105,62 +100,4 @@ u64_words_to_le_bytes(std::span words, } } -// Generates N -many random values of type T | N >= 0 -template -static inline void -random_data(std::span data) - requires(std::is_unsigned_v) -{ - std::random_device rd; - std::mt19937_64 gen(rd()); - std::uniform_int_distribution dis; - - const size_t len = data.size(); - for (size_t i = 0; i < len; i++) { - data[i] = dis(gen); - } -} - -// Given a bytearray of length N, this function converts it to human readable -// hex string of length N << 1 | N >= 0 -inline const std::string -to_hex(std::span bytes) -{ - std::stringstream ss; - ss << std::hex; - - for (size_t i = 0; i < bytes.size(); i++) { - ss << std::setw(2) << std::setfill('0') << static_cast(bytes[i]); - } - - return ss.str(); -} - -// Given a hex encoded string of length 2*L, this routine can be used for -// parsing it as a byte array of length L. -// -// Taken from -// https://github.com/itzmeanjan/ascon/blob/603ba1f223ddd3a46cb0b3d31d014312d96792b5/include/utils.hpp#L120-L145 -inline std::vector -from_hex(std::string_view hex) -{ - const size_t hlen = hex.length(); - assert(hlen % 2 == 0); - - const size_t blen = hlen / 2; - std::vector res(blen, 0); - - for (size_t i = 0; i < blen; i++) { - const size_t off = i * 2; - - uint8_t byte = 0; - auto sstr = hex.substr(off, 2); - std::from_chars(sstr.data(), sstr.data() + 2, byte, 16); - - res[i] = byte; - } - - return res; -} - } diff --git a/include/sha3_224.hpp b/include/sha3/sha3_224.hpp similarity index 98% rename from include/sha3_224.hpp rename to include/sha3/sha3_224.hpp index f265971..d367faf 100644 --- a/include/sha3_224.hpp +++ b/include/sha3/sha3_224.hpp @@ -1,5 +1,5 @@ #pragma once -#include "sponge.hpp" +#include "sha3/internals/sponge.hpp" // SHA3-224 Hash Function : Keccak[448](M || 01, 224) namespace sha3_224 { diff --git a/include/sha3_256.hpp b/include/sha3/sha3_256.hpp similarity index 98% rename from include/sha3_256.hpp rename to include/sha3/sha3_256.hpp index 1d82b03..8412666 100644 --- a/include/sha3_256.hpp +++ b/include/sha3/sha3_256.hpp @@ -1,5 +1,5 @@ #pragma once -#include "sponge.hpp" +#include "sha3/internals/sponge.hpp" // SHA3-256 Hash Function : Keccak[512](M || 01, 256) namespace sha3_256 { diff --git a/include/sha3_384.hpp b/include/sha3/sha3_384.hpp similarity index 98% rename from include/sha3_384.hpp rename to include/sha3/sha3_384.hpp index c481c78..1924047 100644 --- a/include/sha3_384.hpp +++ b/include/sha3/sha3_384.hpp @@ -1,5 +1,5 @@ #pragma once -#include "sponge.hpp" +#include "sha3/internals/sponge.hpp" // SHA3-384 Hash Function : Keccak[768](M || 01, 384) namespace sha3_384 { diff --git a/include/sha3_512.hpp b/include/sha3/sha3_512.hpp similarity index 98% rename from include/sha3_512.hpp rename to include/sha3/sha3_512.hpp index 6f51ed0..706a3cc 100644 --- a/include/sha3_512.hpp +++ b/include/sha3/sha3_512.hpp @@ -1,5 +1,5 @@ #pragma once -#include "sponge.hpp" +#include "sha3/internals/sponge.hpp" // SHA3-512 Hash Function : Keccak[1024](M || 01, 512) namespace sha3_512 { diff --git a/include/shake128.hpp b/include/sha3/shake128.hpp similarity index 98% rename from include/shake128.hpp rename to include/sha3/shake128.hpp index 093abe3..20ec367 100644 --- a/include/shake128.hpp +++ b/include/sha3/shake128.hpp @@ -1,5 +1,5 @@ #pragma once -#include "sponge.hpp" +#include "sha3/internals/sponge.hpp" // SHAKE128 Extendable Output Function : Keccak[256](M || 1111, d) namespace shake128 { diff --git a/include/shake256.hpp b/include/sha3/shake256.hpp similarity index 98% rename from include/shake256.hpp rename to include/sha3/shake256.hpp index 457cc5f..9e38718 100644 --- a/include/shake256.hpp +++ b/include/sha3/shake256.hpp @@ -1,5 +1,5 @@ #pragma once -#include "sponge.hpp" +#include "sha3/internals/sponge.hpp" // SHAKE256 Extendable Output Function : Keccak[512](M || 1111, d) namespace shake256 { From 2dc4e4dc8d3174f95c535c138c35428bab1e44e8 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Tue, 29 Oct 2024 20:20:24 +0400 Subject: [PATCH 04/21] Update tests to work with new directory structure of `sha3` headers Signed-off-by: Anjan Roy --- tests/test_conf.hpp | 8 +++--- tests/test_sha3_224.cpp | 10 +++++--- tests/test_sha3_256.cpp | 10 +++++--- tests/test_sha3_384.cpp | 10 +++++--- tests/test_sha3_512.cpp | 10 +++++--- tests/test_shake128.cpp | 10 +++++--- tests/test_shake256.cpp | 10 +++++--- tests/test_utils.hpp | 54 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 tests/test_utils.hpp diff --git a/tests/test_conf.hpp b/tests/test_conf.hpp index b1f6e87..3f37574 100644 --- a/tests/test_conf.hpp +++ b/tests/test_conf.hpp @@ -1,7 +1,7 @@ #pragma once #include -constexpr size_t MIN_MSG_LEN = 0; -constexpr size_t MAX_MSG_LEN = 513; -constexpr size_t MIN_OUT_LEN = 0; -constexpr size_t MAX_OUT_LEN = 513; +static constexpr size_t MIN_MSG_LEN = 0; +static constexpr size_t MAX_MSG_LEN = 513; +static constexpr size_t MIN_OUT_LEN = 0; +static constexpr size_t MAX_OUT_LEN = 513; diff --git a/tests/test_sha3_224.cpp b/tests/test_sha3_224.cpp index 012fe9e..30ba2ad 100644 --- a/tests/test_sha3_224.cpp +++ b/tests/test_sha3_224.cpp @@ -1,8 +1,10 @@ -#include "sha3_224.hpp" +#include "sha3/sha3_224.hpp" #include "test_conf.hpp" +#include "test_utils.hpp" #include #include #include +#include #include // Eval SHA3-224 hash on statically defined input message during @@ -54,7 +56,7 @@ TEST(Sha3Hashing, Sha3_224IncrementalAbsorption) auto _out0 = std::span(out0); auto _out1 = std::span(out1); - sha3_utils::random_data(_msg); + sha3_test_utils::random_data(_msg); sha3_224::sha3_224_t hasher; @@ -108,8 +110,8 @@ TEST(Sha3Hashing, Sha3_224KnownAnswerTests) auto msg2 = msg1.substr(msg1.find("="sv) + 2, msg1.size()); auto md2 = md1.substr(md1.find("="sv) + 2, md1.size()); - auto msg = sha3_utils::from_hex(msg2); - auto md = sha3_utils::from_hex(md2); + auto msg = sha3_test_utils::from_hex(msg2); + auto md = sha3_test_utils::from_hex(md2); std::vector digest(sha3_224::DIGEST_LEN); auto _digest = std::span(digest); diff --git a/tests/test_sha3_256.cpp b/tests/test_sha3_256.cpp index 9e2f6f3..47b6593 100644 --- a/tests/test_sha3_256.cpp +++ b/tests/test_sha3_256.cpp @@ -1,8 +1,10 @@ -#include "sha3_256.hpp" +#include "sha3/sha3_256.hpp" #include "test_conf.hpp" +#include "test_utils.hpp" #include #include #include +#include #include // Eval SHA3-256 hash on statically defined input message during @@ -54,7 +56,7 @@ TEST(Sha3Hashing, Sha3_256IncrementalAbsorption) auto _out0 = std::span(out0); auto _out1 = std::span(out1); - sha3_utils::random_data(_msg); + sha3_test_utils::random_data(_msg); sha3_256::sha3_256_t hasher; @@ -108,8 +110,8 @@ TEST(Sha3Hashing, Sha3_256KnownAnswerTests) auto msg2 = msg1.substr(msg1.find("="sv) + 2, msg1.size()); auto md2 = md1.substr(md1.find("="sv) + 2, md1.size()); - auto msg = sha3_utils::from_hex(msg2); - auto md = sha3_utils::from_hex(md2); + auto msg = sha3_test_utils::from_hex(msg2); + auto md = sha3_test_utils::from_hex(md2); std::vector digest(sha3_256::DIGEST_LEN); auto _digest = std::span(digest); diff --git a/tests/test_sha3_384.cpp b/tests/test_sha3_384.cpp index 2596926..985040d 100644 --- a/tests/test_sha3_384.cpp +++ b/tests/test_sha3_384.cpp @@ -1,8 +1,10 @@ -#include "sha3_384.hpp" +#include "sha3/sha3_384.hpp" #include "test_conf.hpp" +#include "test_utils.hpp" #include #include #include +#include #include // Eval SHA3-384 hash on statically defined input message during @@ -57,7 +59,7 @@ TEST(Sha3Hashing, Sha3_384IncrementalAbsorption) auto _out0 = std::span(out0); auto _out1 = std::span(out1); - sha3_utils::random_data(_msg); + sha3_test_utils::random_data(_msg); sha3_384::sha3_384_t hasher; @@ -111,8 +113,8 @@ TEST(Sha3Hashing, Sha3_384KnownAnswerTests) auto msg2 = msg1.substr(msg1.find("="sv) + 2, msg1.size()); auto md2 = md1.substr(md1.find("="sv) + 2, md1.size()); - auto msg = sha3_utils::from_hex(msg2); - auto md = sha3_utils::from_hex(md2); + auto msg = sha3_test_utils::from_hex(msg2); + auto md = sha3_test_utils::from_hex(md2); std::vector digest(sha3_384::DIGEST_LEN); auto _digest = std::span(digest); diff --git a/tests/test_sha3_512.cpp b/tests/test_sha3_512.cpp index a1658de..363e341 100644 --- a/tests/test_sha3_512.cpp +++ b/tests/test_sha3_512.cpp @@ -1,8 +1,10 @@ -#include "sha3_512.hpp" +#include "sha3/sha3_512.hpp" #include "test_conf.hpp" +#include "test_utils.hpp" #include #include #include +#include #include // Eval SHA3-512 hash on statically defined input message during @@ -58,7 +60,7 @@ TEST(Sha3Hashing, Sha3_512IncrementalAbsorption) auto _out0 = std::span(out0); auto _out1 = std::span(out1); - sha3_utils::random_data(_msg); + sha3_test_utils::random_data(_msg); sha3_512::sha3_512_t hasher; @@ -112,8 +114,8 @@ TEST(Sha3Hashing, Sha3_512KnownAnswerTests) auto msg2 = msg1.substr(msg1.find("="sv) + 2, msg1.size()); auto md2 = md1.substr(md1.find("="sv) + 2, md1.size()); - auto msg = sha3_utils::from_hex(msg2); - auto md = sha3_utils::from_hex(md2); + auto msg = sha3_test_utils::from_hex(msg2); + auto md = sha3_test_utils::from_hex(md2); std::vector digest(sha3_512::DIGEST_LEN); auto _digest = std::span(digest); diff --git a/tests/test_shake128.cpp b/tests/test_shake128.cpp index 4a29a00..68c5eb9 100644 --- a/tests/test_shake128.cpp +++ b/tests/test_shake128.cpp @@ -1,8 +1,10 @@ -#include "shake128.hpp" +#include "sha3/shake128.hpp" #include "test_conf.hpp" +#include "test_utils.hpp" #include #include #include +#include #include // Eval Shake128 Xof on statically defined input message during @@ -76,7 +78,7 @@ TEST(Sha3Xof, Shake128IncrementalAbsorptionAndSqueezing) auto _out0 = std::span(out0); auto _out1 = std::span(out1); - sha3_utils::random_data(_msg); + sha3_test_utils::random_data(_msg); shake128::shake128_t hasher; @@ -143,8 +145,8 @@ TEST(Sha3Xof, Shake128KnownAnswerTests) auto msg2 = msg1.substr(msg1.find("="sv) + 2, msg1.size()); auto out2 = out1.substr(out1.find("="sv) + 2, out1.size()); - auto msg = sha3_utils::from_hex(msg2); - auto out = sha3_utils::from_hex(out2); + auto msg = sha3_test_utils::from_hex(msg2); + auto out = sha3_test_utils::from_hex(out2); std::vector squeezed(out.size()); diff --git a/tests/test_shake256.cpp b/tests/test_shake256.cpp index ee5c0a7..c9525af 100644 --- a/tests/test_shake256.cpp +++ b/tests/test_shake256.cpp @@ -1,8 +1,10 @@ -#include "shake256.hpp" +#include "sha3/shake256.hpp" #include "test_conf.hpp" +#include "test_utils.hpp" #include #include #include +#include #include // Eval Shake256 Xof on statically defined input message during @@ -76,7 +78,7 @@ TEST(Sha3Xof, Shake256IncrementalAbsorptionAndSqueezing) auto _out0 = std::span(out0); auto _out1 = std::span(out1); - sha3_utils::random_data(_msg); + sha3_test_utils::random_data(_msg); shake256::shake256_t hasher; @@ -143,8 +145,8 @@ TEST(Sha3Xof, Shake256KnownAnswerTests) auto msg2 = msg1.substr(msg1.find("="sv) + 2, msg1.size()); auto out2 = out1.substr(out1.find("="sv) + 2, out1.size()); - auto msg = sha3_utils::from_hex(msg2); - auto out = sha3_utils::from_hex(out2); + auto msg = sha3_test_utils::from_hex(msg2); + auto out = sha3_test_utils::from_hex(out2); std::vector squeezed(out.size()); diff --git a/tests/test_utils.hpp b/tests/test_utils.hpp new file mode 100644 index 0000000..cce205b --- /dev/null +++ b/tests/test_utils.hpp @@ -0,0 +1,54 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +namespace sha3_test_utils { + +// Generates N -many random values of type T | N >= 0 +template +static inline void +random_data(std::span data) + requires(std::is_unsigned_v) +{ + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution dis; + + const size_t len = data.size(); + for (size_t i = 0; i < len; i++) { + data[i] = dis(gen); + } +} + +// Given a hex encoded string of length 2*L, this routine can be used for +// parsing it as a byte array of length L. +// +// Taken from +// https://github.com/itzmeanjan/ascon/blob/603ba1f223ddd3a46cb0b3d31d014312d96792b5/include/utils.hpp#L120-L145 +static inline std::vector +from_hex(std::string_view hex) +{ + const size_t hlen = hex.length(); + assert(hlen % 2 == 0); + + const size_t blen = hlen / 2; + std::vector res(blen, 0); + + for (size_t i = 0; i < blen; i++) { + const size_t off = i * 2; + + uint8_t byte = 0; + auto sstr = hex.substr(off, 2); + std::from_chars(sstr.data(), sstr.data() + 2, byte, 16); + + res[i] = byte; + } + + return res; +} + +} From b66c67fcb0033a1d398fc59d44f60283384d8497 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Tue, 29 Oct 2024 20:25:45 +0400 Subject: [PATCH 05/21] Update benchmarks to use new directory structure of `sha3` headers Signed-off-by: Anjan Roy --- benches/bench_common.hpp | 19 ++++++++++++++++++- benches/bench_hashing.cpp | 16 ++++++++-------- benches/bench_keccak.cpp | 5 ++--- benches/bench_xof.cpp | 8 ++++---- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/benches/bench_common.hpp b/benches/bench_common.hpp index 12e2e12..ad207a6 100644 --- a/benches/bench_common.hpp +++ b/benches/bench_common.hpp @@ -1,6 +1,7 @@ #pragma once - #include +#include +#include #include const auto compute_min = [](const std::vector& v) -> double { @@ -10,3 +11,19 @@ const auto compute_min = [](const std::vector& v) -> double { const auto compute_max = [](const std::vector& v) -> double { return *std::max_element(v.begin(), v.end()); }; + +// Generates N -many random values of type T | N >= 0 +template +static inline void +random_data(std::span data) + requires(std::is_unsigned_v) +{ + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution dis; + + const size_t len = data.size(); + for (size_t i = 0; i < len; i++) { + data[i] = dis(gen); + } +} diff --git a/benches/bench_hashing.cpp b/benches/bench_hashing.cpp index f94062e..8c2b58d 100644 --- a/benches/bench_hashing.cpp +++ b/benches/bench_hashing.cpp @@ -1,8 +1,8 @@ #include "bench_common.hpp" -#include "sha3_224.hpp" -#include "sha3_256.hpp" -#include "sha3_384.hpp" -#include "sha3_512.hpp" +#include "sha3/sha3_224.hpp" +#include "sha3/sha3_256.hpp" +#include "sha3/sha3_384.hpp" +#include "sha3/sha3_512.hpp" #include // Benchmarks SHA3-224 hash function with variable length input message. @@ -15,7 +15,7 @@ bench_sha3_224(benchmark::State& state) std::vector md(sha3_224::DIGEST_LEN); auto _md = std::span(md); - sha3_utils::random_data(msg); + random_data(msg); for (auto _ : state) { sha3_224::sha3_224_t hasher; @@ -47,7 +47,7 @@ bench_sha3_256(benchmark::State& state) std::vector md(sha3_256::DIGEST_LEN); auto _md = std::span(md); - sha3_utils::random_data(msg); + random_data(msg); for (auto _ : state) { sha3_256::sha3_256_t hasher; @@ -79,7 +79,7 @@ bench_sha3_384(benchmark::State& state) std::vector md(sha3_384::DIGEST_LEN); auto _md = std::span(md); - sha3_utils::random_data(msg); + random_data(msg); for (auto _ : state) { sha3_384::sha3_384_t hasher; @@ -111,7 +111,7 @@ bench_sha3_512(benchmark::State& state) std::vector md(sha3_512::DIGEST_LEN); auto _md = std::span(md); - sha3_utils::random_data(msg); + random_data(msg); for (auto _ : state) { sha3_512::sha3_512_t hasher; diff --git a/benches/bench_keccak.cpp b/benches/bench_keccak.cpp index 0994a81..3885f99 100644 --- a/benches/bench_keccak.cpp +++ b/benches/bench_keccak.cpp @@ -1,6 +1,5 @@ #include "bench_common.hpp" -#include "keccak.hpp" -#include "utils.hpp" +#include "sha3/internals/keccak.hpp" #include // Benchmarks Keccak-p[1600, 24] permutation. @@ -8,7 +7,7 @@ void bench_keccak_permutation(benchmark::State& state) { uint64_t st[keccak::LANE_CNT]{}; - sha3_utils::random_data(st); + random_data(st); for (auto _ : state) { keccak::permute(st); diff --git a/benches/bench_xof.cpp b/benches/bench_xof.cpp index 35622f5..a091b23 100644 --- a/benches/bench_xof.cpp +++ b/benches/bench_xof.cpp @@ -1,6 +1,6 @@ #include "bench_common.hpp" -#include "shake128.hpp" -#include "shake256.hpp" +#include "sha3/shake128.hpp" +#include "sha3/shake256.hpp" #include // Benchmarks SHAKE-128 extendable output function with variable length input @@ -17,7 +17,7 @@ bench_shake128(benchmark::State& state) std::vector msg(mlen); std::vector out(olen); - sha3_utils::random_data(msg); + random_data(msg); for (auto _ : state) { shake128::shake128_t hasher; @@ -53,7 +53,7 @@ bench_shake256(benchmark::State& state) std::vector msg(mlen); std::vector out(olen); - sha3_utils::random_data(msg); + random_data(msg); for (auto _ : state) { shake256::shake256_t hasher; From 7559110b1644099e355dc5cdf39c0e7fc480a6c6 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Tue, 29 Oct 2024 20:38:57 +0400 Subject: [PATCH 06/21] Refactor examples; make them easy to run from CLI Signed-off-by: Anjan Roy --- Makefile | 3 ++- examples/example.mk | 15 +++++++++++++++ examples/example_helper.hpp | 37 +++++++++++++++++++++++++++++++++++++ examples/sha3_224.cpp | 10 +++++----- examples/sha3_256.cpp | 10 +++++----- examples/sha3_384.cpp | 10 +++++----- examples/sha3_512.cpp | 10 +++++----- examples/shake128.cpp | 10 +++++----- examples/shake256.cpp | 10 +++++----- 9 files changed, 84 insertions(+), 31 deletions(-) create mode 100644 examples/example.mk create mode 100644 examples/example_helper.hpp diff --git a/Makefile b/Makefile index 4daddee..6512728 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ all: test include tests/test.mk include benches/bench.mk +include examples/example.mk $(GTEST_PARALLEL): git submodule update --init gtest-parallel @@ -26,5 +27,5 @@ $(GTEST_PARALLEL): clean: rm -rf $(BUILD_DIR) -format: $(SHA3_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) +format: $(SHA3_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) $(EXAMPLE_SOURCES) $(EXAMPLE_HEADERS) clang-format -i $^ diff --git a/examples/example.mk b/examples/example.mk new file mode 100644 index 0000000..0c595d6 --- /dev/null +++ b/examples/example.mk @@ -0,0 +1,15 @@ +EXAMPLE_BUILD_DIR := $(BUILD_DIR)/example + +EXAMPLE_DIR := examples +EXAMPLE_SOURCES := $(wildcard $(EXAMPLE_DIR)/*.cpp) +EXAMPLE_HEADERS := $(wildcard $(EXAMPLE_DIR)/*.hpp) +EXAMPLE_EXECS := $(addprefix $(EXAMPLE_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.exe,$(EXAMPLE_SOURCES)))) + +$(EXAMPLE_BUILD_DIR): + mkdir -p $@ + +$(EXAMPLE_BUILD_DIR)/%.exe: $(EXAMPLE_DIR)/%.cpp $(EXAMPLE_BUILD_DIR) + $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $< -o $@ + +example: $(EXAMPLE_EXECS) + $(foreach exec,$^,./$(exec); echo "--- --- ---";) diff --git a/examples/example_helper.hpp b/examples/example_helper.hpp new file mode 100644 index 0000000..2503714 --- /dev/null +++ b/examples/example_helper.hpp @@ -0,0 +1,37 @@ +#pragma once +#include +#include +#include +#include +#include + +// Generates N -many random values of type T | N >= 0 +template +static inline void +random_data(std::span data) + requires(std::is_unsigned_v) +{ + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution dis; + + const size_t len = data.size(); + for (size_t i = 0; i < len; i++) { + data[i] = dis(gen); + } +} + +// Given a bytearray of length N, this function converts it to human readable +// hex string of length N << 1 | N >= 0 +static inline std::string +to_hex(std::span bytes) +{ + std::stringstream ss; + ss << std::hex; + + for (size_t i = 0; i < bytes.size(); i++) { + ss << std::setw(2) << std::setfill('0') << static_cast(bytes[i]); + } + + return ss.str(); +} diff --git a/examples/sha3_224.cpp b/examples/sha3_224.cpp index d15a6d7..2e2faf0 100644 --- a/examples/sha3_224.cpp +++ b/examples/sha3_224.cpp @@ -1,5 +1,5 @@ -#include "sha3_224.hpp" -#include "utils.hpp" +#include "sha3/sha3_224.hpp" +#include "example_helper.hpp" #include #include @@ -16,7 +16,7 @@ main() std::vector dig(olen, 0); auto _dig = std::span(dig); - sha3_utils::random_data(msg); + random_data(msg); sha3_224::sha3_224_t hasher; hasher.absorb(msg); @@ -24,8 +24,8 @@ main() hasher.digest(_dig); std::cout << "SHA3-224" << std::endl << std::endl; - std::cout << "Input : " << sha3_utils::to_hex(msg) << "\n"; - std::cout << "Output : " << sha3_utils::to_hex(dig) << "\n"; + std::cout << "Input : " << to_hex(msg) << "\n"; + std::cout << "Output : " << to_hex(dig) << "\n"; return EXIT_SUCCESS; } diff --git a/examples/sha3_256.cpp b/examples/sha3_256.cpp index 1ddfb3f..b687c14 100644 --- a/examples/sha3_256.cpp +++ b/examples/sha3_256.cpp @@ -1,5 +1,5 @@ -#include "sha3_256.hpp" -#include "utils.hpp" +#include "sha3/sha3_256.hpp" +#include "example_helper.hpp" #include #include @@ -16,7 +16,7 @@ main() std::vector dig(olen, 0); auto _dig = std::span(dig); - sha3_utils::random_data(msg); + random_data(msg); sha3_256::sha3_256_t hasher; hasher.absorb(msg); @@ -24,8 +24,8 @@ main() hasher.digest(_dig); std::cout << "SHA3-256" << std::endl << std::endl; - std::cout << "Input : " << sha3_utils::to_hex(msg) << "\n"; - std::cout << "Output : " << sha3_utils::to_hex(dig) << "\n"; + std::cout << "Input : " << to_hex(msg) << "\n"; + std::cout << "Output : " << to_hex(dig) << "\n"; return EXIT_SUCCESS; } diff --git a/examples/sha3_384.cpp b/examples/sha3_384.cpp index 42246bf..29c1c91 100644 --- a/examples/sha3_384.cpp +++ b/examples/sha3_384.cpp @@ -1,5 +1,5 @@ -#include "sha3_384.hpp" -#include "utils.hpp" +#include "sha3/sha3_384.hpp" +#include "example_helper.hpp" #include #include @@ -16,7 +16,7 @@ main() std::vector dig(olen, 0); auto _dig = std::span(dig); - sha3_utils::random_data(msg); + random_data(msg); sha3_384::sha3_384_t hasher; hasher.absorb(msg); @@ -24,8 +24,8 @@ main() hasher.digest(_dig); std::cout << "SHA3-384" << std::endl << std::endl; - std::cout << "Input : " << sha3_utils::to_hex(msg) << "\n"; - std::cout << "Output : " << sha3_utils::to_hex(dig) << "\n"; + std::cout << "Input : " << to_hex(msg) << "\n"; + std::cout << "Output : " << to_hex(dig) << "\n"; return EXIT_SUCCESS; } diff --git a/examples/sha3_512.cpp b/examples/sha3_512.cpp index 8d2f848..d5fd15c 100644 --- a/examples/sha3_512.cpp +++ b/examples/sha3_512.cpp @@ -1,5 +1,5 @@ -#include "sha3_512.hpp" -#include "utils.hpp" +#include "sha3/sha3_512.hpp" +#include "example_helper.hpp" #include #include @@ -16,7 +16,7 @@ main() std::vector dig(olen, 0); auto _dig = std::span(dig); - sha3_utils::random_data(msg); + random_data(msg); sha3_512::sha3_512_t hasher; hasher.absorb(msg); @@ -24,8 +24,8 @@ main() hasher.digest(_dig); std::cout << "SHA3-512" << std::endl << std::endl; - std::cout << "Input : " << sha3_utils::to_hex(msg) << "\n"; - std::cout << "Output : " << sha3_utils::to_hex(dig) << "\n"; + std::cout << "Input : " << to_hex(msg) << "\n"; + std::cout << "Output : " << to_hex(dig) << "\n"; return EXIT_SUCCESS; } diff --git a/examples/shake128.cpp b/examples/shake128.cpp index 0d9ef01..ebdfd04 100644 --- a/examples/shake128.cpp +++ b/examples/shake128.cpp @@ -1,5 +1,5 @@ -#include "shake128.hpp" -#include "utils.hpp" +#include "sha3/shake128.hpp" +#include "example_helper.hpp" #include #include @@ -16,7 +16,7 @@ main() std::vector dig(olen, 0); auto _dig = std::span(dig); - sha3_utils::random_data(msg); + random_data(msg); // Create shake128 hasher shake128::shake128_t hasher; @@ -34,8 +34,8 @@ main() } std::cout << "SHAKE-128" << std::endl << std::endl; - std::cout << "Input : " << sha3_utils::to_hex(msg) << "\n"; - std::cout << "Output : " << sha3_utils::to_hex(dig) << "\n"; + std::cout << "Input : " << to_hex(msg) << "\n"; + std::cout << "Output : " << to_hex(dig) << "\n"; return EXIT_SUCCESS; } diff --git a/examples/shake256.cpp b/examples/shake256.cpp index a534128..c97786d 100644 --- a/examples/shake256.cpp +++ b/examples/shake256.cpp @@ -1,5 +1,5 @@ -#include "shake256.hpp" -#include "utils.hpp" +#include "sha3/shake256.hpp" +#include "example_helper.hpp" #include #include @@ -16,7 +16,7 @@ main() std::vector dig(olen, 0); auto _dig = std::span(dig); - sha3_utils::random_data(msg); + random_data(msg); // Create shake256 hasher shake256::shake256_t hasher; @@ -34,8 +34,8 @@ main() } std::cout << "SHAKE-256" << std::endl << std::endl; - std::cout << "Input : " << sha3_utils::to_hex(msg) << "\n"; - std::cout << "Output : " << sha3_utils::to_hex(dig) << "\n"; + std::cout << "Input : " << to_hex(msg) << "\n"; + std::cout << "Output : " << to_hex(dig) << "\n"; return EXIT_SUCCESS; } From eeaa9630e5f2df110de0d4a715988ff51547724f Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Tue, 29 Oct 2024 20:55:11 +0400 Subject: [PATCH 07/21] Update Github actions CI script to run tests and examples on Github provided infra - get rid of FlyCI Signed-off-by: Anjan Roy --- .github/workflows/test_ci.yml | 38 +++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test_ci.yml b/.github/workflows/test_ci.yml index 8f32bcd..3c5a051 100644 --- a/.github/workflows/test_ci.yml +++ b/.github/workflows/test_ci.yml @@ -1,4 +1,4 @@ -# Collects inspiration from https://github.com/itzmeanjan/dilithium/blob/15c2280f9448b3631a571ee2f33f8b0c695d4788/.github/workflows/test_ci.yml +# Collects inspiration from https://github.com/itzmeanjan/frodoPIR/blob/aa654db3d11384fce73086cbbd37c63e0cb30e33/.github/workflows/test_ci.yml name: Test SHA3 Hash and Extendable Output Functions on: @@ -8,31 +8,43 @@ on: branches: [ "master" ] jobs: - build-on-nix: + build: runs-on: ${{matrix.os}} strategy: matrix: - # From https://github.com/actions/runner-images#available-images - os: [ubuntu-latest, macos-latest, flyci-macos-large-latest-m1, flyci-macos-large-latest-m2] + os: [ubuntu-latest, macos-latest] + compiler: [g++, clang++] + build_type: [debug, release] + test_type: [standard, asan, ubsan] steps: - uses: actions/checkout@v4 - name: Setup Google-Test run: | pushd ~ - git clone https://github.com/google/googletest.git -b v1.14.0 + git clone https://github.com/google/googletest.git -b v1.15.2 pushd googletest mkdir build pushd build cmake .. -DBUILD_GMOCK=OFF - make - sudo make install + make -j + sudo make -j install popd popd popd - - name: Execute Tests on ${{matrix.os}} - run: make -j - - name: Execute Tests with AddressSanitizer on ${{matrix.os}} - run: make asan_test -j - - name: Execute Tests with UndefinedBehaviourSanitizer on ${{matrix.os}} - run: make ubsan_test -j + - name: Execute Tests on ${{matrix.os}}, compiled with ${{matrix.compiler}} + if: ${{matrix.test_type == 'standard'}} + run: | + CXX=${{matrix.compiler}} make -j + make clean + + - name: Execute Tests with ${{matrix.test_type}}, in ${{matrix.build_type}} mode, on ${{matrix.os}}, compiled with ${{matrix.compiler}} + if: ${{matrix.test_type != 'standard'}} + run: | + CXX=${{matrix.compiler}} make ${{matrix.build_type}}_${{matrix.test_type}}_test -j + make clean + + - name: Build and run examples + run: | + make example -j + make clean From 6768d590822a8fc9dd103b16512b3f67bcc198c5 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Wed, 30 Oct 2024 22:38:00 +0400 Subject: [PATCH 08/21] Minor code refactoring Signed-off-by: Anjan Roy --- include/sha3/internals/keccak.hpp | 10 +++- include/sha3/internals/sponge.hpp | 70 ++++++++++++++------------- include/sha3/internals/utils.hpp | 79 ++++++++++++++++++------------- include/sha3/sha3_224.hpp | 16 ++++--- include/sha3/sha3_256.hpp | 16 ++++--- include/sha3/sha3_384.hpp | 16 ++++--- include/sha3/sha3_512.hpp | 16 ++++--- include/sha3/shake128.hpp | 30 ++++++++++-- include/sha3/shake256.hpp | 27 +++++++++-- 9 files changed, 174 insertions(+), 106 deletions(-) diff --git a/include/sha3/internals/keccak.hpp b/include/sha3/internals/keccak.hpp index 19f0188..7202ee7 100644 --- a/include/sha3/internals/keccak.hpp +++ b/include/sha3/internals/keccak.hpp @@ -3,6 +3,7 @@ #include #include #include +#include // Keccak-p[1600, 24] permutation namespace keccak { @@ -13,8 +14,15 @@ static constexpr size_t L = 6; // Bit width of each lane of Keccak-p[1600, 24] state static constexpr size_t LANE_BW = 1ul << L; +// Bit length of Keccak-p[1600, 24] permutation state +static constexpr size_t STATE_BIT_LEN = 1600; + +// Byte length of Keccak-p[1600, 24] permutation state +static constexpr size_t STATE_BYTE_LEN = + STATE_BIT_LEN / std::numeric_limits::digits; + // # -of lanes ( each of 64 -bit width ) in Keccak-p[1600, 24] state -static constexpr size_t LANE_CNT = 1600 / LANE_BW; +static constexpr size_t LANE_CNT = STATE_BIT_LEN / LANE_BW; // Keccak-p[b, nr] permutation to be applied `nr` ( = 24 ) rounds // s.t. b = 1600, w = b/ 25, l = log2(w), nr = 12 + 2l diff --git a/include/sha3/internals/sponge.hpp b/include/sha3/internals/sponge.hpp index a69b5da..6776723 100644 --- a/include/sha3/internals/sponge.hpp +++ b/include/sha3/internals/sponge.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include // Keccak family of sponge functions @@ -21,7 +22,7 @@ namespace sponge { constexpr bool check_domain_separator(const size_t dom_sep_bit_len) { - return (dom_sep_bit_len == 2) | (dom_sep_bit_len == 4); + return (dom_sep_bit_len == 2u) | (dom_sep_bit_len == 4u); } // Pad10*1 - generates a padding, while also considering domain separator bits ( @@ -37,17 +38,18 @@ check_domain_separator(const size_t dom_sep_bit_len) // This function implementation collects motivation from // https://github.com/itzmeanjan/turboshake/blob/e1a6b950/src/sponge.rs#L70-L72 template -static inline constexpr std::array +static inline constexpr std::array::digits> pad10x1(const size_t offset) requires(check_domain_separator(ds_bits)) { - std::array res{}; + std::array::digits> res{}; - constexpr uint8_t mask = (1 << ds_bits) - 1; - constexpr uint8_t pad_byte = (1 << ds_bits) | (domain_separator & mask); + constexpr uint8_t mask = (1u << ds_bits) - 1u; + constexpr uint8_t pad_byte = (1u << ds_bits) | (domain_separator & mask); res[offset] = pad_byte; - res[(rate / 8) - 1] ^= 0x80; + res[res.size() - 1] ^= 0x80u; return res; } @@ -67,14 +69,14 @@ absorb(uint64_t state[keccak::LANE_CNT], size_t& offset, std::span msg) { - constexpr size_t rbytes = rate >> 3; // # -of bytes - constexpr size_t rwords = rbytes >> 3; // # -of 64 -bit words + constexpr size_t rbytes = rate >> 3u; // # -of bytes + constexpr size_t rwords = rbytes >> 3u; // # -of 64 -bit words std::array blk_bytes{}; std::array blk_words{}; - auto _blk_bytes = std::span(blk_bytes); - auto _blk_words = std::span(blk_words); + auto blk_bytes_span = std::span(blk_bytes); + auto blk_words_span = std::span(blk_words); const size_t mlen = msg.size(); const size_t blk_cnt = (offset + mlen) / rbytes; @@ -84,14 +86,14 @@ absorb(uint64_t state[keccak::LANE_CNT], for (size_t i = 0; i < blk_cnt; i++) { const size_t readable = rbytes - offset; - auto _msg = msg.subspan(moff, readable); - auto _blk = _blk_bytes.subspan(offset, readable); + auto msg_span = msg.subspan(moff, readable); + auto blk_span = blk_bytes_span.subspan(offset, readable); - std::copy(_msg.begin(), _msg.end(), _blk.begin()); - sha3_utils::le_bytes_to_u64_words(_blk_bytes, _blk_words); + std::copy(msg_span.begin(), msg_span.end(), blk_span.begin()); + sha3_utils::le_bytes_to_u64_words(blk_bytes_span, blk_words_span); for (size_t j = 0; j < rwords; j++) { - state[j] ^= _blk_words[j]; + state[j] ^= blk_words_span[j]; } keccak::permute(state); @@ -102,15 +104,15 @@ absorb(uint64_t state[keccak::LANE_CNT], const size_t rm_bytes = mlen - moff; - auto _msg = msg.subspan(moff, rm_bytes); - auto _blk = _blk_bytes.subspan(offset, rm_bytes); + auto msg_span = msg.subspan(moff, rm_bytes); + auto blk_span = blk_bytes_span.subspan(offset, rm_bytes); blk_bytes.fill(0x00); - std::copy(_msg.begin(), _msg.end(), _blk.begin()); - sha3_utils::le_bytes_to_u64_words(_blk_bytes, _blk_words); + std::copy(msg_span.begin(), msg_span.end(), blk_span.begin()); + sha3_utils::le_bytes_to_u64_words(blk_bytes_span, blk_words_span); for (size_t j = 0; j < rwords; j++) { - state[j] ^= _blk_words[j]; + state[j] ^= blk_words_span[j]; } offset += rm_bytes; @@ -132,19 +134,19 @@ static inline constexpr void finalize(uint64_t state[keccak::LANE_CNT], size_t& offset) requires(check_domain_separator(ds_bits)) { - constexpr size_t rbytes = rate >> 3; // # -of bytes - constexpr size_t rwords = rbytes >> 3; // # -of 64 -bit words + constexpr size_t rbytes = rate >> 3u; // # -of bytes + constexpr size_t rwords = rbytes >> 3u; // # -of 64 -bit words const auto padb = pad10x1(offset); std::array padw{}; - auto _padb = std::span(padb); - auto _padw = std::span(padw); + auto padb_span = std::span(padb); + auto padw_span = std::span(padw); - sha3_utils::le_bytes_to_u64_words(_padb, _padw); + sha3_utils::le_bytes_to_u64_words(padb_span, padw_span); for (size_t j = 0; j < rwords; j++) { - state[j] ^= _padw[j]; + state[j] ^= padw_span[j]; } keccak::permute(state); @@ -168,14 +170,14 @@ squeeze(uint64_t state[keccak::LANE_CNT], size_t& squeezable, std::span out) { - constexpr size_t rbytes = rate >> 3; // # -of bytes - constexpr size_t rwords = rbytes >> 3; // # -of 64 -bit words + constexpr size_t rbytes = rate >> 3u; // # -of bytes + constexpr size_t rwords = rbytes >> 3u; // # -of 64 -bit words std::array blk_bytes{}; - auto _blk_bytes = std::span(blk_bytes); + auto blk_bytes_span = std::span(blk_bytes); auto swords = std::span{ state, keccak::LANE_CNT }; - auto _swords = swords.template subspan<0, rwords>(); + auto swords_span = swords.template subspan<0, rwords>(); const size_t olen = out.size(); size_t off = 0; @@ -184,12 +186,12 @@ squeeze(uint64_t state[keccak::LANE_CNT], const size_t read = std::min(squeezable, olen - off); const size_t soff = rbytes - squeezable; - sha3_utils::u64_words_to_le_bytes(_swords, _blk_bytes); + sha3_utils::u64_words_to_le_bytes(swords_span, blk_bytes_span); - auto _blk = _blk_bytes.subspan(soff, read); - auto _out = out.subspan(off, read); + auto blk_span = blk_bytes_span.subspan(soff, read); + auto out_span = out.subspan(off, read); - std::copy(_blk.begin(), _blk.end(), _out.begin()); + std::copy(blk_span.begin(), blk_span.end(), out_span.begin()); squeezable -= read; off += read; diff --git a/include/sha3/internals/utils.hpp b/include/sha3/internals/utils.hpp index 0a8eaf2..b67f12f 100644 --- a/include/sha3/internals/utils.hpp +++ b/include/sha3/internals/utils.hpp @@ -1,8 +1,10 @@ #pragma once +#include "sha3/internals/keccak.hpp" #include #include #include #include +#include #include // Utility ( or commonly used ) functions for SHA3 implementation @@ -19,30 +21,30 @@ bswap(const uint64_t a) #if defined __GNUG__ return __builtin_bswap64(a); #else - return ((a & 0x00000000000000fful) << 56) | - ((a & 0x000000000000ff00ul) << 40) | - ((a & 0x0000000000ff0000ul) << 24) | - ((a & 0x00000000ff000000ul) << 0x8) | - ((a & 0x000000ff00000000ul) >> 0x8) | - ((a & 0x0000ff0000000000ul) >> 24) | - ((a & 0x00ff000000000000ul) >> 40) | - ((a & 0xff00000000000000ul) >> 56); + return ((a & 0x00000000000000fful) << 56u) | + ((a & 0x000000000000ff00ul) << 40u) | + ((a & 0x0000000000ff0000ul) << 24u) | + ((a & 0x00000000ff000000ul) << 0x8u) | + ((a & 0x000000ff00000000ul) >> 0x8u) | + ((a & 0x0000ff0000000000ul) >> 24u) | + ((a & 0x00ff000000000000ul) >> 40u) | + ((a & 0xff00000000000000ul) >> 56u); #endif } // Given a byte array of length 8, this routine can be used for interpreting // those 8 -bytes in little-endian order, as a 64 -bit unsigned integer. static inline constexpr uint64_t -le_bytes_to_u64(std::span bytes) +le_bytes_to_u64(std::span bytes) { - const uint64_t word = (static_cast(bytes[7]) << 56) | - (static_cast(bytes[6]) << 48) | - (static_cast(bytes[5]) << 40) | - (static_cast(bytes[4]) << 32) | - (static_cast(bytes[3]) << 24) | - (static_cast(bytes[2]) << 16) | - (static_cast(bytes[1]) << 8) | - (static_cast(bytes[0]) << 0); + const uint64_t word = (static_cast(bytes[7]) << 56u) | + (static_cast(bytes[6]) << 48u) | + (static_cast(bytes[5]) << 40u) | + (static_cast(bytes[4]) << 32u) | + (static_cast(bytes[3]) << 24u) | + (static_cast(bytes[2]) << 16u) | + (static_cast(bytes[1]) << 8u) | + (static_cast(bytes[0]) << 0u); if constexpr (std::endian::native == std::endian::big) { return bswap(word); @@ -56,33 +58,38 @@ le_bytes_to_u64(std::span bytes) // unsigned interger ) s.t. bytes in a word are placed in little-endian order. template static inline constexpr void -le_bytes_to_u64_words(std::span bytes, - std::span words) +le_bytes_to_u64_words( + std::span::digits> bytes, + std::span words) { + using u64_span_t = std::span; + constexpr size_t step_by_bytes = sizeof(uint64_t); + size_t off = 0; while (off < bytes.size()) { - words[off / 8] = le_bytes_to_u64(bytes.subspan(off, 8)); - off += 8; + words[off / step_by_bytes] = + le_bytes_to_u64(u64_span_t(bytes.subspan(off, step_by_bytes))); + off += step_by_bytes; } } // Given a 64 -bit unsigned integer as input, this routine can be used for // interpreting those 8 -bytes in little-endian byte order. static inline constexpr void -u64_to_le_bytes(uint64_t word, std::span bytes) +u64_to_le_bytes(uint64_t word, std::span bytes) { if constexpr (std::endian::native == std::endian::big) { word = bswap(word); } - bytes[0] = static_cast(word >> 0); - bytes[1] = static_cast(word >> 8); - bytes[2] = static_cast(word >> 16); - bytes[3] = static_cast(word >> 24); - bytes[4] = static_cast(word >> 32); - bytes[5] = static_cast(word >> 40); - bytes[6] = static_cast(word >> 48); - bytes[7] = static_cast(word >> 56); + bytes[0] = static_cast(word >> 0u); + bytes[1] = static_cast(word >> 8u); + bytes[2] = static_cast(word >> 16u); + bytes[3] = static_cast(word >> 24u); + bytes[4] = static_cast(word >> 32u); + bytes[5] = static_cast(word >> 40u); + bytes[6] = static_cast(word >> 48u); + bytes[7] = static_cast(word >> 56u); } // Given an array of rate/64 -many 64 -bit unsigned integer words, this routine @@ -90,12 +97,18 @@ u64_to_le_bytes(uint64_t word, std::span bytes) // rate/8 -many bytes output. template static inline constexpr void -u64_words_to_le_bytes(std::span words, - std::span bytes) +u64_words_to_le_bytes( + std::span words, + std::span::digits> bytes) { + using u64_span_t = std::span; + constexpr size_t step_by_bytes = sizeof(uint64_t); + size_t off = 0; while (off < words.size()) { - u64_to_le_bytes(words[off], bytes.subspan(off * 8, 8)); + u64_to_le_bytes( + words[off], + u64_span_t(bytes.subspan(off * step_by_bytes, step_by_bytes))); off++; } } diff --git a/include/sha3/sha3_224.hpp b/include/sha3/sha3_224.hpp index d367faf..aaed0d9 100644 --- a/include/sha3/sha3_224.hpp +++ b/include/sha3/sha3_224.hpp @@ -1,26 +1,28 @@ #pragma once #include "sha3/internals/sponge.hpp" +#include +#include // SHA3-224 Hash Function : Keccak[448](M || 01, 224) namespace sha3_224 { // Bit length of SHA3-224 message digest. -constexpr size_t DIGEST_BIT_LEN = 224; +static constexpr size_t DIGEST_BIT_LEN = 224; // Byte length of SHA3-224 message digest. -constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; +static constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; // Width of capacity portion of the sponge, in bits. -constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; +static constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; // Width of rate portion of the sponge, in bits. -constexpr size_t RATE = 1600 - CAPACITY; +static constexpr size_t RATE = 1600 - CAPACITY; // Domain separator bits, used for finalization. -constexpr uint8_t DOM_SEP = 0b00000010; +static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. -constexpr size_t DOM_SEP_BW = 2; +static constexpr size_t DOM_SEP_BW = 2; // Given arbitrary many input message bytes, this routine consumes it into // keccak[448] sponge state and squeezes out 28 -bytes digest. @@ -67,7 +69,7 @@ struct sha3_224_t inline constexpr void digest(std::span md) { if (finalized && !squeezed) { - size_t squeezable = RATE / 8; + size_t squeezable = RATE / std::numeric_limits::digits; sponge::squeeze(state, squeezable, md); squeezed = true; diff --git a/include/sha3/sha3_256.hpp b/include/sha3/sha3_256.hpp index 8412666..6b9e26c 100644 --- a/include/sha3/sha3_256.hpp +++ b/include/sha3/sha3_256.hpp @@ -1,26 +1,28 @@ #pragma once #include "sha3/internals/sponge.hpp" +#include +#include // SHA3-256 Hash Function : Keccak[512](M || 01, 256) namespace sha3_256 { // Bit length of SHA3-256 message digest. -constexpr size_t DIGEST_BIT_LEN = 256; +static constexpr size_t DIGEST_BIT_LEN = 256; // Byte length of SHA3-256 message digest. -constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; +static constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; // Width of capacity portion of the sponge, in bits. -constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; +static constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; // Width of rate portion of the sponge, in bits. -constexpr size_t RATE = 1600 - CAPACITY; +static constexpr size_t RATE = 1600 - CAPACITY; // Domain separator bits, used for finalization. -constexpr uint8_t DOM_SEP = 0b00000010; +static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. -constexpr size_t DOM_SEP_BW = 2; +static constexpr size_t DOM_SEP_BW = 2; // Given arbitrary many input message bytes, this routine consumes it into // keccak[512] sponge state and squeezes out 32 -bytes digest. @@ -67,7 +69,7 @@ struct sha3_256_t inline constexpr void digest(std::span md) { if (finalized && !squeezed) { - size_t squeezable = RATE / 8; + size_t squeezable = RATE / std::numeric_limits::digits; sponge::squeeze(state, squeezable, md); squeezed = true; diff --git a/include/sha3/sha3_384.hpp b/include/sha3/sha3_384.hpp index 1924047..c59b3bf 100644 --- a/include/sha3/sha3_384.hpp +++ b/include/sha3/sha3_384.hpp @@ -1,26 +1,28 @@ #pragma once #include "sha3/internals/sponge.hpp" +#include +#include // SHA3-384 Hash Function : Keccak[768](M || 01, 384) namespace sha3_384 { // Bit length of SHA3-384 message digest. -constexpr size_t DIGEST_BIT_LEN = 384; +static constexpr size_t DIGEST_BIT_LEN = 384; // Byte length of SHA3-384 message digest. -constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; +static constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; // Width of capacity portion of the sponge, in bits. -constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; +static constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; // Width of rate portion of the sponge, in bits. -constexpr size_t RATE = 1600 - CAPACITY; +static constexpr size_t RATE = 1600 - CAPACITY; // Domain separator bits, used for finalization. -constexpr uint8_t DOM_SEP = 0b00000010; +static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. -constexpr size_t DOM_SEP_BW = 2; +static constexpr size_t DOM_SEP_BW = 2; // Given arbitrary many input message bytes, this routine consumes it into // keccak[768] sponge state and squeezes out 48 -bytes digest. @@ -67,7 +69,7 @@ struct sha3_384_t inline constexpr void digest(std::span md) { if (finalized && !squeezed) { - size_t squeezable = RATE / 8; + size_t squeezable = RATE / std::numeric_limits::digits; sponge::squeeze(state, squeezable, md); squeezed = true; diff --git a/include/sha3/sha3_512.hpp b/include/sha3/sha3_512.hpp index 706a3cc..4718159 100644 --- a/include/sha3/sha3_512.hpp +++ b/include/sha3/sha3_512.hpp @@ -1,26 +1,28 @@ #pragma once #include "sha3/internals/sponge.hpp" +#include +#include // SHA3-512 Hash Function : Keccak[1024](M || 01, 512) namespace sha3_512 { // Bit length of SHA3-512 message digest. -constexpr size_t DIGEST_BIT_LEN = 512; +static constexpr size_t DIGEST_BIT_LEN = 512; // Byte length of SHA3-512 message digest. -constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; +static constexpr size_t DIGEST_LEN = DIGEST_BIT_LEN / 8; // Width of capacity portion of the sponge, in bits. -constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; +static constexpr size_t CAPACITY = 2 * DIGEST_BIT_LEN; // Width of rate portion of the sponge, in bits. -constexpr size_t RATE = 1600 - CAPACITY; +static constexpr size_t RATE = 1600 - CAPACITY; // Domain separator bits, used for finalization. -constexpr uint8_t DOM_SEP = 0b00000010; +static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. -constexpr size_t DOM_SEP_BW = 2; +static constexpr size_t DOM_SEP_BW = 2; // Given arbitrary many input message bytes, this routine consumes it into // keccak[1024] sponge state and squeezes out 64 -bytes digest. @@ -67,7 +69,7 @@ struct sha3_512_t inline constexpr void digest(std::span md) { if (finalized && !squeezed) { - size_t squeezable = RATE / 8; + size_t squeezable = RATE / std::numeric_limits::digits; sponge::squeeze(state, squeezable, md); squeezed = true; diff --git a/include/sha3/shake128.hpp b/include/sha3/shake128.hpp index 20ec367..16a955f 100644 --- a/include/sha3/shake128.hpp +++ b/include/sha3/shake128.hpp @@ -1,20 +1,26 @@ #pragma once +#include "sha3/internals/keccak.hpp" #include "sha3/internals/sponge.hpp" +#include +#include +#include +#include +#include // SHAKE128 Extendable Output Function : Keccak[256](M || 1111, d) namespace shake128 { // Width of capacity portion of the sponge, in bits. -constexpr size_t CAPACITY = 256; +static constexpr size_t CAPACITY = 256; // Width of rate portion of the sponge, in bits. -constexpr size_t RATE = 1600 - CAPACITY; +static constexpr size_t RATE = 1600 - CAPACITY; // Domain separator bits, used for finalization. -constexpr uint8_t DOM_SEP = 0b00001111; +static constexpr uint8_t DOM_SEP = 0b00001111; // Bit-width of domain separator, starting from least significant bit. -constexpr size_t DOM_SEP_BW = 4; +static constexpr size_t DOM_SEP_BW = 4; // SHAKE128 Extendable Output Function (Xof) // @@ -30,6 +36,7 @@ struct shake128_t public: inline constexpr shake128_t() = default; + inline constexpr size_t squeezable_num_bytes() const { return squeezable; } // Given N -many bytes input message, this routine consumes those into // keccak[256] sponge state. @@ -58,7 +65,7 @@ struct shake128_t sponge::finalize(state, offset); finalized = true; - squeezable = RATE / 8; + squeezable = RATE / std::numeric_limits::digits; } } @@ -80,6 +87,19 @@ struct shake128_t finalized = false; squeezable = 0; } + + // Given that sponge is already finalized, this routine can be used for + // zeroizing first n -bytes of permutation state s.t. n <= 200. + inline void ratchet(const size_t byte_len) + { + if (finalized) { + const auto ratchetable_portion_byte_len = + std::min(byte_len, keccak::STATE_BYTE_LEN); + + auto state_as_bytes = reinterpret_cast(state); + std::memset(state_as_bytes, 0, ratchetable_portion_byte_len); + } + } }; } diff --git a/include/sha3/shake256.hpp b/include/sha3/shake256.hpp index 9e38718..e682a7b 100644 --- a/include/sha3/shake256.hpp +++ b/include/sha3/shake256.hpp @@ -1,20 +1,23 @@ #pragma once #include "sha3/internals/sponge.hpp" +#include +#include +#include // SHAKE256 Extendable Output Function : Keccak[512](M || 1111, d) namespace shake256 { // Width of capacity portion of the sponge, in bits. -constexpr size_t CAPACITY = 512; +static constexpr size_t CAPACITY = 512; // Width of rate portion of the sponge, in bits. -constexpr size_t RATE = 1600 - CAPACITY; +static constexpr size_t RATE = 1600 - CAPACITY; // Domain separator bits, used for finalization. -constexpr uint8_t DOM_SEP = 0b00001111; +static constexpr uint8_t DOM_SEP = 0b00001111; // Bit-width of domain separator, starting from least significant bit. -constexpr size_t DOM_SEP_BW = 4; +static constexpr size_t DOM_SEP_BW = 4; // SHAKE256 Extendable Output Function (Xof) // @@ -30,6 +33,7 @@ struct shake256_t public: inline constexpr shake256_t() = default; + inline constexpr size_t squeezable_num_bytes() const { return squeezable; } // Given N -many bytes input message, this routine consumes those into // keccak[512] sponge state. @@ -58,7 +62,7 @@ struct shake256_t sponge::finalize(state, offset); finalized = true; - squeezable = RATE / 8; + squeezable = RATE / std::numeric_limits::digits; } } @@ -80,6 +84,19 @@ struct shake256_t finalized = false; squeezable = 0; } + + // Given that sponge is already finalized, this routine can be used for + // zeroizing first n -bytes of permutation state s.t. n <= 200. + inline void ratchet(const size_t byte_len) + { + if (finalized) { + const auto ratchetable_portion_byte_len = + std::min(byte_len, keccak::STATE_BYTE_LEN); + + auto state_as_bytes = reinterpret_cast(state); + std::memset(state_as_bytes, 0, ratchetable_portion_byte_len); + } + } }; } From 9516d21e618c33a6c43311e6e7b159c1bf2b30d4 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Wed, 30 Oct 2024 22:52:18 +0400 Subject: [PATCH 09/21] Increase columnlimit to 120 in clang-format style spec. file Signed-off-by: Anjan Roy --- .clang-format | 2 +- benches/bench_common.hpp | 9 +-- benches/bench_xof.cpp | 6 +- examples/example_helper.hpp | 3 +- include/sha3/internals/keccak.hpp | 114 +++++++++++++----------------- include/sha3/internals/sponge.hpp | 52 +++++--------- include/sha3/internals/utils.hpp | 62 ++++++---------- include/sha3/sha3_224.hpp | 28 ++++---- include/sha3/sha3_256.hpp | 28 ++++---- include/sha3/sha3_384.hpp | 28 ++++---- include/sha3/sha3_512.hpp | 28 ++++---- include/sha3/shake128.hpp | 36 +++++----- include/sha3/shake256.hpp | 36 +++++----- tests/test_sha3_224.cpp | 18 ++--- tests/test_sha3_256.cpp | 18 ++--- tests/test_sha3_384.cpp | 24 +++---- tests/test_sha3_512.cpp | 24 +++---- tests/test_shake128.cpp | 49 ++++++------- tests/test_shake256.cpp | 49 ++++++------- tests/test_utils.hpp | 3 +- 20 files changed, 252 insertions(+), 365 deletions(-) diff --git a/.clang-format b/.clang-format index 065dcdf..6f0145f 100644 --- a/.clang-format +++ b/.clang-format @@ -81,7 +81,7 @@ BreakBeforeTernaryOperators: true BreakConstructorInitializers: BeforeComma BreakInheritanceList: BeforeComma BreakStringLiterals: true -ColumnLimit: 80 +ColumnLimit: 120 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerIndentWidth: 2 diff --git a/benches/bench_common.hpp b/benches/bench_common.hpp index ad207a6..0ee5ecd 100644 --- a/benches/bench_common.hpp +++ b/benches/bench_common.hpp @@ -4,13 +4,8 @@ #include #include -const auto compute_min = [](const std::vector& v) -> double { - return *std::min_element(v.begin(), v.end()); -}; - -const auto compute_max = [](const std::vector& v) -> double { - return *std::max_element(v.begin(), v.end()); -}; +const auto compute_min = [](const std::vector& v) -> double { return *std::min_element(v.begin(), v.end()); }; +const auto compute_max = [](const std::vector& v) -> double { return *std::max_element(v.begin(), v.end()); }; // Generates N -many random values of type T | N >= 0 template diff --git a/benches/bench_xof.cpp b/benches/bench_xof.cpp index a091b23..4ed929e 100644 --- a/benches/bench_xof.cpp +++ b/benches/bench_xof.cpp @@ -3,8 +3,7 @@ #include "sha3/shake256.hpp" #include -// Benchmarks SHAKE-128 extendable output function with variable length input -// and squeezed output. +// Benchmarks SHAKE-128 extendable output function with variable length input and squeezed output. // // Note, all input bytes are absorbed in a single call to `absorb` function. // And all output bytes are squeezed in a single call to `squeeze` function. @@ -39,8 +38,7 @@ bench_shake128(benchmark::State& state) #endif } -// Benchmarks SHAKE-256 extendable output function with variable length input -// and squeezed output. +// Benchmarks SHAKE-256 extendable output function with variable length input and squeezed output. // // Note, all input bytes are absorbed in a single call to `absorb` function. // And all output bytes are squeezed in a single call to `squeeze` function. diff --git a/examples/example_helper.hpp b/examples/example_helper.hpp index 2503714..46d1700 100644 --- a/examples/example_helper.hpp +++ b/examples/example_helper.hpp @@ -21,8 +21,7 @@ random_data(std::span data) } } -// Given a bytearray of length N, this function converts it to human readable -// hex string of length N << 1 | N >= 0 +// Given a bytearray of length N, this function converts it to human readable hex string of length N << 1 | N >= 0 static inline std::string to_hex(std::span bytes) { diff --git a/include/sha3/internals/keccak.hpp b/include/sha3/internals/keccak.hpp index 7202ee7..acbaa1c 100644 --- a/include/sha3/internals/keccak.hpp +++ b/include/sha3/internals/keccak.hpp @@ -18,8 +18,7 @@ static constexpr size_t LANE_BW = 1ul << L; static constexpr size_t STATE_BIT_LEN = 1600; // Byte length of Keccak-p[1600, 24] permutation state -static constexpr size_t STATE_BYTE_LEN = - STATE_BIT_LEN / std::numeric_limits::digits; +static constexpr size_t STATE_BYTE_LEN = STATE_BIT_LEN / std::numeric_limits::digits; // # -of lanes ( each of 64 -bit width ) in Keccak-p[1600, 24] state static constexpr size_t LANE_CNT = STATE_BIT_LEN / LANE_BW; @@ -28,41 +27,36 @@ static constexpr size_t LANE_CNT = STATE_BIT_LEN / LANE_BW; // s.t. b = 1600, w = b/ 25, l = log2(w), nr = 12 + 2l static constexpr size_t ROUNDS = 12 + 2 * L; -// Leftwards circular rotation offset of 25 lanes ( each lane is 64 -bit wide ) -// of state array, as provided in table 2 below algorithm 2 in section 3.2.2 of -// https://dx.doi.org/10.6028/NIST.FIPS.202 +// Leftwards circular rotation offset of 25 lanes ( each lane is 64 -bit wide ) of state array, as provided in table 2 +// below algorithm 2 in section 3.2.2 of https://dx.doi.org/10.6028/NIST.FIPS.202 // -// Note, following offsets are obtained by performing % 64 ( bit width of lane ) -// on offsets provided in above mentioned link -static constexpr size_t ROT[LANE_CNT]{ - 0 % LANE_BW, 1 % LANE_BW, 190 % LANE_BW, 28 % LANE_BW, 91 % LANE_BW, - 36 % LANE_BW, 300 % LANE_BW, 6 % LANE_BW, 55 % LANE_BW, 276 % LANE_BW, - 3 % LANE_BW, 10 % LANE_BW, 171 % LANE_BW, 153 % LANE_BW, 231 % LANE_BW, - 105 % LANE_BW, 45 % LANE_BW, 15 % LANE_BW, 21 % LANE_BW, 136 % LANE_BW, - 210 % LANE_BW, 66 % LANE_BW, 253 % LANE_BW, 120 % LANE_BW, 78 % LANE_BW -}; - -// Precomputed table used for looking up source index during application of π -// step mapping function on keccak-[1600, 24] state +// Note, following offsets are obtained by performing % 64 ( bit width of lane ) on offsets provided in above mentioned +// link +static constexpr size_t ROT[LANE_CNT]{ 0 % LANE_BW, 1 % LANE_BW, 190 % LANE_BW, 28 % LANE_BW, 91 % LANE_BW, + 36 % LANE_BW, 300 % LANE_BW, 6 % LANE_BW, 55 % LANE_BW, 276 % LANE_BW, + 3 % LANE_BW, 10 % LANE_BW, 171 % LANE_BW, 153 % LANE_BW, 231 % LANE_BW, + 105 % LANE_BW, 45 % LANE_BW, 15 % LANE_BW, 21 % LANE_BW, 136 % LANE_BW, + 210 % LANE_BW, 66 % LANE_BW, 253 % LANE_BW, 120 % LANE_BW, 78 % LANE_BW }; + +// Precomputed table used for looking up source index during application of π step mapping function on keccak-[1600, 24] +// state // // print('to <= from') // for y in range(5): // for x in range(5): // print(f'{y * 5 + x} <= {x * 5 + (x + 3 * y) % 5}') // -// Table generated using above Python code snippet. See section 3.2.3 of the -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 -static constexpr size_t PERM[LANE_CNT]{ 0, 6, 12, 18, 24, 3, 9, 10, 16, - 22, 1, 7, 13, 19, 20, 4, 5, 11, - 17, 23, 2, 8, 14, 15, 21 }; - -// Computes single bit of Keccak-p[1600, 24] round constant ( at compile-time ), -// using binary LFSR, defined by primitive polynomial x^8 + x^6 + x^5 + x^4 + 1 +// Table generated using above Python code snippet. See section 3.2.3 of the specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 +static constexpr size_t PERM[LANE_CNT]{ 0, 6, 12, 18, 24, 3, 9, 10, 16, 22, 1, 7, 13, + 19, 20, 4, 5, 11, 17, 23, 2, 8, 14, 15, 21 }; + +// Computes single bit of Keccak-p[1600, 24] round constant ( at compile-time ), using binary LFSR, defined by primitive +// polynomial x^8 + x^6 + x^5 + x^4 + 1 // // See algorithm 5 in section 3.2.5 of http://dx.doi.org/10.6028/NIST.FIPS.202 // -// Taken from -// https://github.com/itzmeanjan/elephant/blob/2a21c7e/include/keccak.hpp#L24-L59 +// Taken from https://github.com/itzmeanjan/elephant/blob/2a21c7e/include/keccak.hpp#L24-L59 consteval static bool rc(const size_t t) { @@ -73,8 +67,7 @@ rc(const size_t t) // step 2 of algorithm 5 // - // note, step 3.a of algorithm 5 is also being - // executed in this statement ( for first iteration, with i = 1 ) ! + // note, step 3.a of algorithm 5 is also being executed in this statement ( for first iteration, with i = 1 ) ! uint16_t r = 0b10000000; // step 3 of algorithm 5 @@ -88,19 +81,17 @@ rc(const size_t t) // step 3.f of algorithm 5 // - // note, this statement also executes step 3.a for upcoming - // iterations ( i.e. when i > 1 ) + // note, this statement also executes step 3.a for upcoming iterations ( i.e. when i > 1 ) r >>= 1; } return static_cast((r >> 7) & 1); } -// Computes 64 -bit round constant ( at compile-time ), which is XOR-ed into -// very first lane ( = lane(0, 0) ) of Keccak-p[1600, 24] permutation state +// Computes 64 -bit round constant ( at compile-time ), which is XOR-ed into very first lane ( = lane(0, 0) ) of +// Keccak-p[1600, 24] permutation state // -// Taken from -// https://github.com/itzmeanjan/elephant/blob/2a21c7e/include/keccak.hpp#L61-L74 +// Taken from https://github.com/itzmeanjan/elephant/blob/2a21c7e/include/keccak.hpp#L61-L74 consteval static uint64_t compute_rc(const size_t r_idx) { @@ -126,16 +117,15 @@ compute_rcs() return res; } -// Round constants to be XORed with lane (0, 0) of keccak-p[1600, 24] -// permutation state, see section 3.2.5 of +// Round constants to be XORed with lane (0, 0) of keccak-p[1600, 24] permutation state, see section 3.2.5 of // https://dx.doi.org/10.s6028/NIST.FIPS.202 static constexpr auto RC = compute_rcs(); #if defined __APPLE__ && defined __aarch64__ // On Apple Silicon -// Keccak-p[1600, 24] round function, applying all five step mapping functions, -// updating state array. Note this implementation of round function applies four -// consecutive rounds in a single call i.e. if you invoke it to apply round `i` +// Keccak-p[1600, 24] round function, applying all five step mapping functions, updating state array. Note this +// implementation of round function applies four consecutive rounds in a single call i.e. if you invoke it to apply +// round `i` // // - it first applies round `i` // - then round `i+1` @@ -144,9 +134,8 @@ static constexpr auto RC = compute_rcs(); // // See section 3.3 of https://dx.doi.org/10.6028/NIST.FIPS.202 // -// This Keccak round function implementation is specifically targeting Apple -// Silicon CPUs. And this implementation collects a lot of inspiration from -// https://github.com/bwesterb/armed-keccak.git. +// This Keccak round function implementation is specifically targeting Apple Silicon CPUs. And this implementation +// collects a lot of inspiration from https://github.com/bwesterb/armed-keccak.git. static inline constexpr void roundx4(uint64_t* const state, const size_t ridx) { @@ -155,15 +144,13 @@ roundx4(uint64_t* const state, const size_t ridx) // Round ridx + 0 #if defined __clang__ - // Following - // https://clang.llvm.org/docs/LanguageExtensions.html#extensions-for-loop-hint-optimizations + // Following https://clang.llvm.org/docs/LanguageExtensions.html#extensions-for-loop-hint-optimizations #pragma clang loop unroll(enable) #pragma clang loop vectorize(enable) #pragma clang loop interleave(enable) #elif defined __GNUG__ - // Following - // https://gcc.gnu.org/onlinedocs/gcc/Loop-Specific-Pragmas.html#Loop-Specific-Pragmas + // Following https://gcc.gnu.org/onlinedocs/gcc/Loop-Specific-Pragmas.html#Loop-Specific-Pragmas #pragma GCC unroll 5 #pragma GCC ivdep @@ -596,8 +583,8 @@ roundx4(uint64_t* const state, const size_t ridx) #else // On everywhere else -// Keccak-p[1600, 24] step mapping function θ, see section 3.2.1 of SHA3 -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 +// Keccak-p[1600, 24] step mapping function θ, see section 3.2.1 of SHA3 specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 static inline constexpr void theta(uint64_t* const state) { @@ -643,8 +630,8 @@ theta(uint64_t* const state) } } -// Keccak-p[1600, 24] step mapping function ρ, see section 3.2.2 of SHA3 -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 +// Keccak-p[1600, 24] step mapping function ρ, see section 3.2.2 of SHA3 specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 static inline constexpr void rho(uint64_t* const state) { @@ -661,8 +648,8 @@ rho(uint64_t* const state) } } -// Keccak-p[1600, 24] step mapping function π, see section 3.2.3 of SHA3 -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 +// Keccak-p[1600, 24] step mapping function π, see section 3.2.3 of SHA3 specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 static inline constexpr void pi(const uint64_t* const __restrict istate, // input permutation state uint64_t* const __restrict ostate // output permutation state @@ -681,8 +668,8 @@ pi(const uint64_t* const __restrict istate, // input permutation state } } -// Keccak-p[1600, 24] step mapping function χ, see section 3.2.4 of SHA3 -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 +// Keccak-p[1600, 24] step mapping function χ, see section 3.2.4 of SHA3 specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 static inline constexpr void chi(uint64_t* const state) { @@ -708,18 +695,17 @@ chi(uint64_t* const state) } } -// Keccak-p[1600, 24] step mapping function ι, see section 3.2.5 of SHA3 -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 +// Keccak-p[1600, 24] step mapping function ι, see section 3.2.5 of SHA3 specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 static inline constexpr void iota(uint64_t* const state, const size_t ridx) { state[0] ^= RC[ridx]; } -// Keccak-p[1600, 24] round function, which applies all five step mapping -// functions in order, updates state array. Note this implementation of round -// function applies two consecutive rounds in a single call i.e. if you invoke -// it to apply round `i` - it first applies round `i` and then round `i+1`. +// Keccak-p[1600, 24] round function, which applies all five step mapping functions in order, updates state array. Note +// this implementation of round function applies two consecutive rounds in a single call i.e. if you invoke it to apply +// round `i` - it first applies round `i` and then round `i+1`. // // See section 3.3 of https://dx.doi.org/10.6028/NIST.FIPS.202 static inline constexpr void @@ -744,10 +730,8 @@ roundx2(uint64_t* const state, const size_t ridx) #endif -// Keccak-p[1600, 24] permutation, applying 24 rounds of permutation -// on state of dimension 5 x 5 x 64 ( = 1600 ) -bits, using algorithm 7 -// defined in section 3.3 of SHA3 specification -// https://dx.doi.org/10.6028/NIST.FIPS.202 +// Keccak-p[1600, 24] permutation, applying 24 rounds of permutation on state of dimension 5 x 5 x 64 ( = 1600 ) -bits, +// using algorithm 7 defined in section 3.3 of SHA3 specification https://dx.doi.org/10.6028/NIST.FIPS.202 inline constexpr void permute(uint64_t state[LANE_CNT]) { diff --git a/include/sha3/internals/sponge.hpp b/include/sha3/internals/sponge.hpp index 6776723..b5ea7f8 100644 --- a/include/sha3/internals/sponge.hpp +++ b/include/sha3/internals/sponge.hpp @@ -11,35 +11,28 @@ // Keccak family of sponge functions namespace sponge { -// Compile-time check to ensure that domain separator can only be 2/ 4 -bits -// wide. +// Compile-time check to ensure that domain separator can only be 2/ 4 -bits wide. // -// When used in context of extendable output functions ( SHAKE{128, 256} ) -// domain separator bits are 4 -bit wide. +// When used in context of extendable output functions ( SHAKE{128, 256} ) domain separator bits are 4 -bit wide. // -// See section 6.{1, 2} of SHA3 specification -// https://dx.doi.org/10.6028/NIST.FIPS.202 +// See section 6.{1, 2} of SHA3 specification https://dx.doi.org/10.6028/NIST.FIPS.202 constexpr bool check_domain_separator(const size_t dom_sep_bit_len) { return (dom_sep_bit_len == 2u) | (dom_sep_bit_len == 4u); } -// Pad10*1 - generates a padding, while also considering domain separator bits ( -// which are either 2 or 4 -bit wide ), such that when both domain separator -// bits and 10*1 padding is appended ( in order ) to actual message, total byte -// length of message consumed into keccak-p[1600, 24] permutation becomes -// multiple of `rate` -bits. The only parameter `offset` denotes how many bytes -// are already mixed with rate portion of permutation state meaning `offset` -// must ∈ [0, `rate/ 8`). This routine returns a byte array of length `rate/ 8` -// -bytes which can safely be mixed into permutation state duing sponge -// finalization phase. +// Pad10*1 - generates a padding, while also considering domain separator bits ( which are either 2 or 4 -bit wide ), +// such that when both domain separator bits and 10*1 padding is appended ( in order ) to actual message, total byte +// length of message consumed into keccak-p[1600, 24] permutation becomes multiple of `rate` -bits. The only parameter +// `offset` denotes how many bytes are already mixed with rate portion of permutation state meaning `offset` must ∈ [0, +// `rate/ 8`). This routine returns a byte array of length `rate/ 8` -bytes which can safely be mixed into permutation +// state duing sponge finalization phase. // // This function implementation collects motivation from // https://github.com/itzmeanjan/turboshake/blob/e1a6b950/src/sponge.rs#L70-L72 template -static inline constexpr std::array::digits> +static inline constexpr std::array::digits> pad10x1(const size_t offset) requires(check_domain_separator(ds_bits)) { @@ -54,9 +47,8 @@ pad10x1(const size_t offset) return res; } -// Given `mlen` (>=0) -bytes message, this routine consumes it into Keccak[c] -// permutation state s.t. `offset` ( second parameter ) denotes how many bytes -// are already consumed into rate portion of the state. +// Given `mlen` (>=0) -bytes message, this routine consumes it into Keccak[c] permutation state s.t. `offset` ( second +// parameter ) denotes how many bytes are already consumed into rate portion of the state. // // - `rate` portion of sponge will have bitwidth of 1600 - c. // - `offset` must ∈ [0, `rbytes`). @@ -65,9 +57,7 @@ pad10x1(const size_t offset) // https://github.com/itzmeanjan/turboshake/blob/e1a6b950/src/sponge.rs#L4-L56 template static inline constexpr void -absorb(uint64_t state[keccak::LANE_CNT], - size_t& offset, - std::span msg) +absorb(uint64_t state[keccak::LANE_CNT], size_t& offset, std::span msg) { constexpr size_t rbytes = rate >> 3u; // # -of bytes constexpr size_t rwords = rbytes >> 3u; // # -of 64 -bit words @@ -118,11 +108,9 @@ absorb(uint64_t state[keccak::LANE_CNT], offset += rm_bytes; } -// Given that N message bytes are already consumed into Keccak[c] permutation -// state, this routine finalizes sponge state and makes it ready for squeezing, -// by appending ( along with domain separation bits ) 10*1 padding bits to input -// message s.t. total absorbed message byte length becomes multiple of -// `rate/ 8` -bytes. +// Given that N message bytes are already consumed into Keccak[c] permutation state, this routine finalizes sponge state +// and makes it ready for squeezing, by appending ( along with domain separation bits ) 10*1 padding bits to input +// message s.t. total absorbed message byte length becomes multiple of `rate/ 8` -bytes. // // - `rate` portion of sponge will have bitwidth of 1600 - c. // - `offset` must ∈ [0, `rbytes`) @@ -153,8 +141,8 @@ finalize(uint64_t state[keccak::LANE_CNT], size_t& offset) offset = 0; } -// Given that Keccak[c] permutation state is finalized, this routine can be -// invoked for squeezing `olen` -bytes out of rate portion of the state. +// Given that Keccak[c] permutation state is finalized, this routine can be invoked for squeezing `olen` -bytes out of +// rate portion of the state. // // - `rate` portion of sponge will have bitwidth of 1600 - c. // - `squeezable` denotes how many bytes can be squeezed without permutating the @@ -166,9 +154,7 @@ finalize(uint64_t state[keccak::LANE_CNT], size_t& offset) // https://github.com/itzmeanjan/turboshake/blob/e1a6b950/src/sponge.rs#L83-L118 template static inline constexpr void -squeeze(uint64_t state[keccak::LANE_CNT], - size_t& squeezable, - std::span out) +squeeze(uint64_t state[keccak::LANE_CNT], size_t& squeezable, std::span out) { constexpr size_t rbytes = rate >> 3u; // # -of bytes constexpr size_t rwords = rbytes >> 3u; // # -of 64 -bit words diff --git a/include/sha3/internals/utils.hpp b/include/sha3/internals/utils.hpp index b67f12f..a2fe84f 100644 --- a/include/sha3/internals/utils.hpp +++ b/include/sha3/internals/utils.hpp @@ -10,8 +10,7 @@ // Utility ( or commonly used ) functions for SHA3 implementation namespace sha3_utils { -// Given a 64 -bit unsigned integer word, this routine swaps byte order and -// returns byte swapped 64 -bit word. +// Given a 64 -bit unsigned integer word, this routine swaps byte order and returns byte swapped 64 -bit word. // // Collects inspiration from // https://github.com/itzmeanjan/ascon/blob/6160fee18814c7c313262e365c53de96ab6602b4/include/utils.hpp#L17-L43. @@ -21,30 +20,22 @@ bswap(const uint64_t a) #if defined __GNUG__ return __builtin_bswap64(a); #else - return ((a & 0x00000000000000fful) << 56u) | - ((a & 0x000000000000ff00ul) << 40u) | - ((a & 0x0000000000ff0000ul) << 24u) | - ((a & 0x00000000ff000000ul) << 0x8u) | - ((a & 0x000000ff00000000ul) >> 0x8u) | - ((a & 0x0000ff0000000000ul) >> 24u) | - ((a & 0x00ff000000000000ul) >> 40u) | - ((a & 0xff00000000000000ul) >> 56u); + return ((a & 0x00000000000000fful) << 56u) | ((a & 0x000000000000ff00ul) << 40u) | + ((a & 0x0000000000ff0000ul) << 24u) | ((a & 0x00000000ff000000ul) << 0x8u) | + ((a & 0x000000ff00000000ul) >> 0x8u) | ((a & 0x0000ff0000000000ul) >> 24u) | + ((a & 0x00ff000000000000ul) >> 40u) | ((a & 0xff00000000000000ul) >> 56u); #endif } -// Given a byte array of length 8, this routine can be used for interpreting -// those 8 -bytes in little-endian order, as a 64 -bit unsigned integer. +// Given a byte array of length 8, this routine can be used for interpreting those 8 -bytes in little-endian order, as a +// 64 -bit unsigned integer. static inline constexpr uint64_t le_bytes_to_u64(std::span bytes) { - const uint64_t word = (static_cast(bytes[7]) << 56u) | - (static_cast(bytes[6]) << 48u) | - (static_cast(bytes[5]) << 40u) | - (static_cast(bytes[4]) << 32u) | - (static_cast(bytes[3]) << 24u) | - (static_cast(bytes[2]) << 16u) | - (static_cast(bytes[1]) << 8u) | - (static_cast(bytes[0]) << 0u); + const uint64_t word = (static_cast(bytes[7]) << 56u) | (static_cast(bytes[6]) << 48u) | + (static_cast(bytes[5]) << 40u) | (static_cast(bytes[4]) << 32u) | + (static_cast(bytes[3]) << 24u) | (static_cast(bytes[2]) << 16u) | + (static_cast(bytes[1]) << 8u) | (static_cast(bytes[0]) << 0u); if constexpr (std::endian::native == std::endian::big) { return bswap(word); @@ -53,28 +44,25 @@ le_bytes_to_u64(std::span bytes) } } -// Given a byte array holding rate/8 -many bytes, this routine can be invoked -// for interpreting those bytes as rate/ 64 -many words ( each word is 64 -bit -// unsigned interger ) s.t. bytes in a word are placed in little-endian order. +// Given a byte array holding rate/8 -many bytes, this routine can be invoked for interpreting those bytes as rate/ 64 +// -many words ( each word is 64 -bit unsigned interger ) s.t. bytes in a word are placed in little-endian order. template static inline constexpr void -le_bytes_to_u64_words( - std::span::digits> bytes, - std::span words) +le_bytes_to_u64_words(std::span::digits> bytes, + std::span words) { using u64_span_t = std::span; constexpr size_t step_by_bytes = sizeof(uint64_t); size_t off = 0; while (off < bytes.size()) { - words[off / step_by_bytes] = - le_bytes_to_u64(u64_span_t(bytes.subspan(off, step_by_bytes))); + words[off / step_by_bytes] = le_bytes_to_u64(u64_span_t(bytes.subspan(off, step_by_bytes))); off += step_by_bytes; } } -// Given a 64 -bit unsigned integer as input, this routine can be used for -// interpreting those 8 -bytes in little-endian byte order. +// Given a 64 -bit unsigned integer as input, this routine can be used for interpreting those 8 -bytes in little-endian +// byte order. static inline constexpr void u64_to_le_bytes(uint64_t word, std::span bytes) { @@ -92,23 +80,19 @@ u64_to_le_bytes(uint64_t word, std::span bytes) bytes[7] = static_cast(word >> 56u); } -// Given an array of rate/64 -many 64 -bit unsigned integer words, this routine -// can be used for interpreting words in little-endian byte-order, computing -// rate/8 -many bytes output. +// Given an array of rate/64 -many 64 -bit unsigned integer words, this routine can be used for interpreting words in +// little-endian byte-order, computing rate/8 -many bytes output. template static inline constexpr void -u64_words_to_le_bytes( - std::span words, - std::span::digits> bytes) +u64_words_to_le_bytes(std::span words, + std::span::digits> bytes) { using u64_span_t = std::span; constexpr size_t step_by_bytes = sizeof(uint64_t); size_t off = 0; while (off < words.size()) { - u64_to_le_bytes( - words[off], - u64_span_t(bytes.subspan(off * step_by_bytes, step_by_bytes))); + u64_to_le_bytes(words[off], u64_span_t(bytes.subspan(off * step_by_bytes, step_by_bytes))); off++; } } diff --git a/include/sha3/sha3_224.hpp b/include/sha3/sha3_224.hpp index aaed0d9..da2d4d8 100644 --- a/include/sha3/sha3_224.hpp +++ b/include/sha3/sha3_224.hpp @@ -24,11 +24,10 @@ static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. static constexpr size_t DOM_SEP_BW = 2; -// Given arbitrary many input message bytes, this routine consumes it into -// keccak[448] sponge state and squeezes out 28 -bytes digest. +// Given arbitrary many input message bytes, this routine consumes it into keccak[448] sponge state and squeezes out 28 +// -bytes digest. // -// See SHA3 hash function definition in section 6.1 of SHA3 specification -// https://dx.doi.org/10.6028/NIST.FIPS.202. +// See SHA3 hash function definition in section 6.1 of SHA3 specification https://dx.doi.org/10.6028/NIST.FIPS.202. struct sha3_224_t { private: @@ -41,9 +40,8 @@ struct sha3_224_t // Constructor inline constexpr sha3_224_t() = default; - // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary - // many times ( until the sponge is finalized ), each time absorbing arbitrary - // many message bytes into RATE portion of the sponge. + // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is + // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. inline constexpr void absorb(std::span msg) { if (!finalized) { @@ -51,10 +49,9 @@ struct sha3_224_t } } - // Finalizes the sponge after all message bytes are absorbed into it, now it - // should be ready for squeezing message digest bytes. Once finalized, you - // can't absorb any message bytes into sponge. After finalization, calling - // this function again and again doesn't mutate anything. + // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message + // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this + // function again and again doesn't mutate anything. inline constexpr void finalize() { if (!finalized) { @@ -63,9 +60,8 @@ struct sha3_224_t } } - // After sponge state is finalized, 28 message digest bytes can be squeezed by - // calling this function. Once digest bytes are squeezed, calling this - // function again and again returns nothing. + // After sponge state is finalized, 28 message digest bytes can be squeezed by calling this function. Once digest + // bytes are squeezed, calling this function again and again returns nothing. inline constexpr void digest(std::span md) { if (finalized && !squeezed) { @@ -76,8 +72,8 @@ struct sha3_224_t } } - // Reset the internal state of the SHA3-224 hasher, now it can again be used - // for another absorb->finalize->squeeze cycle. + // Reset the internal state of the SHA3-224 hasher, now it can again be used for another absorb->finalize->squeeze + // cycle. inline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); diff --git a/include/sha3/sha3_256.hpp b/include/sha3/sha3_256.hpp index 6b9e26c..7aa539f 100644 --- a/include/sha3/sha3_256.hpp +++ b/include/sha3/sha3_256.hpp @@ -24,11 +24,10 @@ static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. static constexpr size_t DOM_SEP_BW = 2; -// Given arbitrary many input message bytes, this routine consumes it into -// keccak[512] sponge state and squeezes out 32 -bytes digest. +// Given arbitrary many input message bytes, this routine consumes it into keccak[512] sponge state and squeezes out 32 +// -bytes digest. // -// See SHA3 hash function definition in section 6.1 of SHA3 specification -// https://dx.doi.org/10.6028/NIST.FIPS.202. +// See SHA3 hash function definition in section 6.1 of SHA3 specification https://dx.doi.org/10.6028/NIST.FIPS.202. struct sha3_256_t { private: @@ -41,9 +40,8 @@ struct sha3_256_t // Constructor inline constexpr sha3_256_t() = default; - // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary - // many times ( until the sponge is finalized ), each time absorbing arbitrary - // many message bytes into RATE portion of the sponge. + // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is + // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. inline constexpr void absorb(std::span msg) { if (!finalized) { @@ -51,10 +49,9 @@ struct sha3_256_t } } - // Finalizes the sponge after all message bytes are absorbed into it, now it - // should be ready for squeezing message digest bytes. Once finalized, you - // can't absorb any message bytes into sponge. After finalization, calling - // this function again and again doesn't mutate anything. + // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message + // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this + // function again and again doesn't mutate anything. inline constexpr void finalize() { if (!finalized) { @@ -63,9 +60,8 @@ struct sha3_256_t } } - // After sponge state is finalized, 32 message digest bytes can be squeezed by - // calling this function. Once digest bytes are squeezed, calling this - // function again and again returns nothing. + // After sponge state is finalized, 32 message digest bytes can be squeezed by calling this function. Once digest + // bytes are squeezed, calling this function again and again returns nothing. inline constexpr void digest(std::span md) { if (finalized && !squeezed) { @@ -76,8 +72,8 @@ struct sha3_256_t } } - // Reset the internal state of the SHA3-256 hasher, now it can again be used - // for another absorb->finalize->squeeze cycle. + // Reset the internal state of the SHA3-256 hasher, now it can again be used for another absorb->finalize->squeeze + // cycle. inline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); diff --git a/include/sha3/sha3_384.hpp b/include/sha3/sha3_384.hpp index c59b3bf..f5469c3 100644 --- a/include/sha3/sha3_384.hpp +++ b/include/sha3/sha3_384.hpp @@ -24,11 +24,10 @@ static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. static constexpr size_t DOM_SEP_BW = 2; -// Given arbitrary many input message bytes, this routine consumes it into -// keccak[768] sponge state and squeezes out 48 -bytes digest. +// Given arbitrary many input message bytes, this routine consumes it into keccak[768] sponge state and squeezes out 48 +// -bytes digest. // -// See SHA3 hash function definition in section 6.1 of SHA3 specification -// https://dx.doi.org/10.6028/NIST.FIPS.202. +// See SHA3 hash function definition in section 6.1 of SHA3 specification https://dx.doi.org/10.6028/NIST.FIPS.202. struct sha3_384_t { private: @@ -41,9 +40,8 @@ struct sha3_384_t // Constructor inline constexpr sha3_384_t() = default; - // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary - // many times ( until the sponge is finalized ), each time absorbing arbitrary - // many message bytes into RATE portion of the sponge. + // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is + // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. inline constexpr void absorb(std::span msg) { if (!finalized) { @@ -51,10 +49,9 @@ struct sha3_384_t } } - // Finalizes the sponge after all message bytes are absorbed into it, now it - // should be ready for squeezing message digest bytes. Once finalized, you - // can't absorb any message bytes into sponge. After finalization, calling - // this function again and again doesn't mutate anything. + // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message + // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this + // function again and again doesn't mutate anything. inline constexpr void finalize() { if (!finalized) { @@ -63,9 +60,8 @@ struct sha3_384_t } } - // After sponge state is finalized, 48 message digest bytes can be squeezed by - // calling this function. Once digest bytes are squeezed, calling this - // function again and again returns nothing. + // After sponge state is finalized, 48 message digest bytes can be squeezed by calling this function. Once digest + // bytes are squeezed, calling this function again and again returns nothing. inline constexpr void digest(std::span md) { if (finalized && !squeezed) { @@ -76,8 +72,8 @@ struct sha3_384_t } } - // Reset the internal state of the SHA3-384 hasher, now it can again be used - // for another absorb->finalize->squeeze cycle. + // Reset the internal state of the SHA3-384 hasher, now it can again be used for another absorb->finalize->squeeze + // cycle. inline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); diff --git a/include/sha3/sha3_512.hpp b/include/sha3/sha3_512.hpp index 4718159..fcfbbd9 100644 --- a/include/sha3/sha3_512.hpp +++ b/include/sha3/sha3_512.hpp @@ -24,11 +24,10 @@ static constexpr uint8_t DOM_SEP = 0b00000010; // Bit-width of domain separator, starting from least significant bit. static constexpr size_t DOM_SEP_BW = 2; -// Given arbitrary many input message bytes, this routine consumes it into -// keccak[1024] sponge state and squeezes out 64 -bytes digest. +// Given arbitrary many input message bytes, this routine consumes it into keccak[1024] sponge state and squeezes out 64 +// -bytes digest. // -// See SHA3 hash function definition in section 6.1 of SHA3 specification -// https://dx.doi.org/10.6028/NIST.FIPS.202. +// See SHA3 hash function definition in section 6.1 of SHA3 specification https://dx.doi.org/10.6028/NIST.FIPS.202. struct sha3_512_t { private: @@ -41,9 +40,8 @@ struct sha3_512_t // Constructor inline constexpr sha3_512_t() = default; - // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary - // many times ( until the sponge is finalized ), each time absorbing arbitrary - // many message bytes into RATE portion of the sponge. + // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is + // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. inline constexpr void absorb(std::span msg) { if (!finalized) { @@ -51,10 +49,9 @@ struct sha3_512_t } } - // Finalizes the sponge after all message bytes are absorbed into it, now it - // should be ready for squeezing message digest bytes. Once finalized, you - // can't absorb any message bytes into sponge. After finalization, calling - // this function again and again doesn't mutate anything. + // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message + // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this + // function again and again doesn't mutate anything. inline constexpr void finalize() { if (!finalized) { @@ -63,9 +60,8 @@ struct sha3_512_t } } - // After sponge state is finalized, 64 message digest bytes can be squeezed by - // calling this function. Once digest bytes are squeezed, calling this - // function again and again returns nothing. + // After sponge state is finalized, 64 message digest bytes can be squeezed by calling this function. Once digest + // bytes are squeezed, calling this function again and again returns nothing. inline constexpr void digest(std::span md) { if (finalized && !squeezed) { @@ -76,8 +72,8 @@ struct sha3_512_t } } - // Reset the internal state of the SHA3-512 hasher, now it can again be used - // for another absorb->finalize->squeeze cycle. + // Reset the internal state of the SHA3-512 hasher, now it can again be used for another absorb->finalize->squeeze + // cycle. inline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); diff --git a/include/sha3/shake128.hpp b/include/sha3/shake128.hpp index 16a955f..637d846 100644 --- a/include/sha3/shake128.hpp +++ b/include/sha3/shake128.hpp @@ -24,8 +24,8 @@ static constexpr size_t DOM_SEP_BW = 4; // SHAKE128 Extendable Output Function (Xof) // -// See SHA3 extendable output function definition in section 6.2 of SHA3 -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 +// See SHA3 extendable output function definition in section 6.2 of SHA3 specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 struct shake128_t { private: @@ -38,12 +38,10 @@ struct shake128_t inline constexpr shake128_t() = default; inline constexpr size_t squeezable_num_bytes() const { return squeezable; } - // Given N -many bytes input message, this routine consumes those into - // keccak[256] sponge state. + // Given N -many bytes input message, this routine consumes those into keccak[256] sponge state. // - // Note, this routine can be called arbitrary number of times, each time with - // arbitrary bytes of input message, until keccak[256] state is finalized ( by - // calling routine with similar name ). Once the sponge is finalized, it can't + // Note, this routine can be called arbitrary number of times, each time with arbitrary bytes of input message, until + // keccak[256] state is finalized ( by calling routine with similar name ). Once the sponge is finalized, it can't // absorb any more message bytes. inline constexpr void absorb(std::span msg) { @@ -52,12 +50,11 @@ struct shake128_t } } - // After consuming arbitrary many input bytes, this routine is invoked when - // no more input bytes remaining to be consumed by keccak[256] state. + // After consuming arbitrary many input bytes, this routine is invoked when no more input bytes remaining to be + // consumed by keccak[256] state. // - // Note, once this routine is called, calling absorb() or finalize() again, on - // same SHAKE128 object, doesn't do anything. After finalization, one might - // intend to read arbitrary many bytes by squeezing sponge, which is done by + // Note, once this routine is called, calling absorb() or finalize() again, on same SHAKE128 object, doesn't do + // anything. After finalization, one might intend to read arbitrary many bytes by squeezing sponge, which is done by // calling read() function, as many times required. inline constexpr void finalize() { @@ -69,8 +66,8 @@ struct shake128_t } } - // After sponge state is finalized, arbitrary many output bytes can be - // squeezed by calling this function any number of times required. + // After sponge state is finalized, arbitrary many output bytes can be squeezed by calling this function any number of + // times required. inline constexpr void squeeze(std::span dig) { if (finalized) { @@ -78,8 +75,8 @@ struct shake128_t } } - // Reset the internal state of the Shake128-Xof hasher, now it can again be - // used for another absorb->finalize->squeeze cycle. + // Reset the internal state of the Shake128-Xof hasher, now it can again be used for another absorb->finalize->squeeze + // cycle. inline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); @@ -88,13 +85,12 @@ struct shake128_t squeezable = 0; } - // Given that sponge is already finalized, this routine can be used for - // zeroizing first n -bytes of permutation state s.t. n <= 200. + // Given that sponge is already finalized, this routine can be used for zeroizing first n -bytes of permutation state + // s.t. n <= 200. inline void ratchet(const size_t byte_len) { if (finalized) { - const auto ratchetable_portion_byte_len = - std::min(byte_len, keccak::STATE_BYTE_LEN); + const auto ratchetable_portion_byte_len = std::min(byte_len, keccak::STATE_BYTE_LEN); auto state_as_bytes = reinterpret_cast(state); std::memset(state_as_bytes, 0, ratchetable_portion_byte_len); diff --git a/include/sha3/shake256.hpp b/include/sha3/shake256.hpp index e682a7b..9ba7480 100644 --- a/include/sha3/shake256.hpp +++ b/include/sha3/shake256.hpp @@ -21,8 +21,8 @@ static constexpr size_t DOM_SEP_BW = 4; // SHAKE256 Extendable Output Function (Xof) // -// See SHA3 extendable output function definition in section 6.2 of SHA3 -// specification https://dx.doi.org/10.6028/NIST.FIPS.202 +// See SHA3 extendable output function definition in section 6.2 of SHA3 specification +// https://dx.doi.org/10.6028/NIST.FIPS.202 struct shake256_t { private: @@ -35,12 +35,10 @@ struct shake256_t inline constexpr shake256_t() = default; inline constexpr size_t squeezable_num_bytes() const { return squeezable; } - // Given N -many bytes input message, this routine consumes those into - // keccak[512] sponge state. + // Given N -many bytes input message, this routine consumes those into keccak[512] sponge state. // - // Note, this routine can be called arbitrary number of times, each time with - // arbitrary bytes of input message, until keccak[512] state is finalized ( by - // calling routine with similar name ). Once the sponge is finalized, it can't + // Note, this routine can be called arbitrary number of times, each time with arbitrary bytes of input message, until + // keccak[512] state is finalized ( by calling routine with similar name ). Once the sponge is finalized, it can't // absorb any more message bytes. inline constexpr void absorb(std::span msg) { @@ -49,12 +47,11 @@ struct shake256_t } } - // After consuming arbitrary many input bytes, this routine is invoked when - // no more input bytes remaining to be consumed by keccak[512] state. + // After consuming arbitrary many input bytes, this routine is invoked when no more input bytes remaining to be + // consumed by keccak[512] state. // - // Note, once this routine is called, calling absorb() or finalize() again, on - // same SHAKE256 object, doesn't do anything. After finalization, one might - // intend to read arbitrary many bytes by squeezing sponge, which is done by + // Note, once this routine is called, calling absorb() or finalize() again, on same SHAKE256 object, doesn't do + // anything. After finalization, one might intend to read arbitrary many bytes by squeezing sponge, which is done by // calling read() function, as many times required. inline constexpr void finalize() { @@ -66,8 +63,8 @@ struct shake256_t } } - // After sponge state is finalized, arbitrary many output bytes can be - // squeezed by calling this function any number of times required. + // After sponge state is finalized, arbitrary many output bytes can be squeezed by calling this function any number of + // times required. inline constexpr void squeeze(std::span dig) { if (finalized) { @@ -75,8 +72,8 @@ struct shake256_t } } - // Reset the internal state of the Shake256-Xof hasher, now it can again be - // used for another absorb->finalize->squeeze cycle. + // Reset the internal state of the Shake256-Xof hasher, now it can again be used for another absorb->finalize->squeeze + // cycle. inline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); @@ -85,13 +82,12 @@ struct shake256_t squeezable = 0; } - // Given that sponge is already finalized, this routine can be used for - // zeroizing first n -bytes of permutation state s.t. n <= 200. + // Given that sponge is already finalized, this routine can be used for zeroizing first n -bytes of permutation state + // s.t. n <= 200. inline void ratchet(const size_t byte_len) { if (finalized) { - const auto ratchetable_portion_byte_len = - std::min(byte_len, keccak::STATE_BYTE_LEN); + const auto ratchetable_portion_byte_len = std::min(byte_len, keccak::STATE_BYTE_LEN); auto state_as_bytes = reinterpret_cast(state); std::memset(state_as_bytes, 0, ratchetable_portion_byte_len); diff --git a/tests/test_sha3_224.cpp b/tests/test_sha3_224.cpp index 30ba2ad..06bc691 100644 --- a/tests/test_sha3_224.cpp +++ b/tests/test_sha3_224.cpp @@ -7,8 +7,7 @@ #include #include -// Eval SHA3-224 hash on statically defined input message during -// compilation-time. +// Eval SHA3-224 hash on statically defined input message during compilation-time. constexpr std::array eval_sha3_224() { @@ -35,16 +34,14 @@ TEST(Sha3Hashing, CompileTimeEvalSha3_224) // Output = fc95d44e806cbbd484e379882238f555fda923878c443abe4ce4cdd6 constexpr auto md = eval_sha3_224(); - static_assert(md == - std::array{ - 252, 149, 212, 78, 128, 108, 187, 212, 132, 227, - 121, 136, 34, 56, 245, 85, 253, 169, 35, 135, - 140, 68, 58, 190, 76, 228, 205, 214 }, + static_assert(md == std::array{ 252, 149, 212, 78, 128, 108, 187, 212, 132, 227, + 121, 136, 34, 56, 245, 85, 253, 169, 35, 135, + 140, 68, 58, 190, 76, 228, 205, 214 }, "Must be able to compute Sha3-224 hash during compile-time !"); } -// Test that absorbing same input message bytes using both incremental and -// one-shot hashing, should yield same output bytes, for SHA3-224 hasher. +// Test that absorbing same input message bytes using both incremental and one-shot hashing, should yield same output +// bytes, for SHA3-224 hasher. TEST(Sha3Hashing, Sha3_224IncrementalAbsorption) { for (size_t mlen = MIN_MSG_LEN; mlen < MAX_MSG_LEN; mlen++) { @@ -84,8 +81,7 @@ TEST(Sha3Hashing, Sha3_224IncrementalAbsorption) } } -// Ensure that SHA3-224 implementation is conformant with FIPS 202 standard, by -// using KAT file generated following +// Ensure that SHA3-224 implementation is conformant with FIPS 202 standard, by using KAT file generated following // https://gist.github.com/itzmeanjan/448f97f9c49d781a5eb3ddd6ea6e7364. TEST(Sha3Hashing, Sha3_224KnownAnswerTests) { diff --git a/tests/test_sha3_256.cpp b/tests/test_sha3_256.cpp index 47b6593..dbce0e8 100644 --- a/tests/test_sha3_256.cpp +++ b/tests/test_sha3_256.cpp @@ -7,8 +7,7 @@ #include #include -// Eval SHA3-256 hash on statically defined input message during -// compilation-time. +// Eval SHA3-256 hash on statically defined input message during compilation-time. constexpr std::array eval_sha3_256() { @@ -35,16 +34,14 @@ TEST(Sha3Hashing, CompileTimeEvalSha3_256) // Output = c8ad478f4e1dd9d47dfc3b985708d92db1f8db48fe9cddd459e63c321f490402 constexpr auto md = eval_sha3_256(); - static_assert(md == - std::array{ - 200, 173, 71, 143, 78, 29, 217, 212, 125, 252, 59, - 152, 87, 8, 217, 45, 177, 248, 219, 72, 254, 156, - 221, 212, 89, 230, 60, 50, 31, 73, 4, 2 }, + static_assert(md == std::array{ 200, 173, 71, 143, 78, 29, 217, 212, 125, 252, 59, + 152, 87, 8, 217, 45, 177, 248, 219, 72, 254, 156, + 221, 212, 89, 230, 60, 50, 31, 73, 4, 2 }, "Must be able to compute Sha3-256 hash during compile-time !"); } -// Test that absorbing same input message bytes using both incremental and -// one-shot hashing, should yield same output bytes, for SHA3-256 hasher. +// Test that absorbing same input message bytes using both incremental and one-shot hashing, should yield same output +// bytes, for SHA3-256 hasher. TEST(Sha3Hashing, Sha3_256IncrementalAbsorption) { for (size_t mlen = MIN_MSG_LEN; mlen < MAX_MSG_LEN; mlen++) { @@ -84,8 +81,7 @@ TEST(Sha3Hashing, Sha3_256IncrementalAbsorption) } } -// Ensure that SHA3-256 implementation is conformant with FIPS 202 standard, by -// using KAT file generated following +// Ensure that SHA3-256 implementation is conformant with FIPS 202 standard, by using KAT file generated following // https://gist.github.com/itzmeanjan/448f97f9c49d781a5eb3ddd6ea6e7364. TEST(Sha3Hashing, Sha3_256KnownAnswerTests) { diff --git a/tests/test_sha3_384.cpp b/tests/test_sha3_384.cpp index 985040d..7861a59 100644 --- a/tests/test_sha3_384.cpp +++ b/tests/test_sha3_384.cpp @@ -7,8 +7,7 @@ #include #include -// Eval SHA3-384 hash on statically defined input message during -// compilation-time. +// Eval SHA3-384 hash on statically defined input message during compilation-time. constexpr std::array eval_sha3_384() { @@ -36,18 +35,16 @@ TEST(Sha3Hashing, CompileTimeEvalSha3_384) // d6e266970a3fdcd4a833da861599179a060b576959e993b4698529304ee38c23c7102a7084c4d568b1d95523d14077e7 constexpr auto md = eval_sha3_384(); - static_assert( - md == - std::array{ - 214, 226, 102, 151, 10, 63, 220, 212, 168, 51, 218, 134, - 21, 153, 23, 154, 6, 11, 87, 105, 89, 233, 147, 180, - 105, 133, 41, 48, 78, 227, 140, 35, 199, 16, 42, 112, - 132, 196, 213, 104, 177, 217, 85, 35, 209, 64, 119, 231 }, - "Must be able to compute Sha3-384 hash during compile-time !"); + static_assert(md == std::array{ 214, 226, 102, 151, 10, 63, 220, 212, 168, 51, + 218, 134, 21, 153, 23, 154, 6, 11, 87, 105, + 89, 233, 147, 180, 105, 133, 41, 48, 78, 227, + 140, 35, 199, 16, 42, 112, 132, 196, 213, 104, + 177, 217, 85, 35, 209, 64, 119, 231 }, + "Must be able to compute Sha3-384 hash during compile-time !"); } -// Test that absorbing same input message bytes using both incremental and -// one-shot hashing, should yield same output bytes, for SHA3-384 hasher. +// Test that absorbing same input message bytes using both incremental and one-shot hashing, should yield same output +// bytes, for SHA3-384 hasher. TEST(Sha3Hashing, Sha3_384IncrementalAbsorption) { for (size_t mlen = MIN_MSG_LEN; mlen < MAX_MSG_LEN; mlen++) { @@ -87,8 +84,7 @@ TEST(Sha3Hashing, Sha3_384IncrementalAbsorption) } } -// Ensure that SHA3-384 implementation is conformant with FIPS 202 standard, by -// using KAT file generated following +// Ensure that SHA3-384 implementation is conformant with FIPS 202 standard, by using KAT file generated following // https://gist.github.com/itzmeanjan/448f97f9c49d781a5eb3ddd6ea6e7364. TEST(Sha3Hashing, Sha3_384KnownAnswerTests) { diff --git a/tests/test_sha3_512.cpp b/tests/test_sha3_512.cpp index 363e341..ad7baa0 100644 --- a/tests/test_sha3_512.cpp +++ b/tests/test_sha3_512.cpp @@ -7,8 +7,7 @@ #include #include -// Eval SHA3-512 hash on statically defined input message during -// compilation-time. +// Eval SHA3-512 hash on statically defined input message during compilation-time. constexpr std::array eval_sha3_512() { @@ -36,19 +35,17 @@ TEST(Sha3Hashing, CompileTimeEvalSha3_512) // 989c1995da9d2d341f993c2e2ca695f3477075061bfbd2cdf0be75cf7ba99fbe33d8d2c4dcc31fa89917786b883e6c9d5b02ed81b7483a4cb3ea98671588f745 constexpr auto md = eval_sha3_512(); - static_assert(md == - std::array{ - 152, 156, 25, 149, 218, 157, 45, 52, 31, 153, 60, - 46, 44, 166, 149, 243, 71, 112, 117, 6, 27, 251, - 210, 205, 240, 190, 117, 207, 123, 169, 159, 190, 51, - 216, 210, 196, 220, 195, 31, 168, 153, 23, 120, 107, - 136, 62, 108, 157, 91, 2, 237, 129, 183, 72, 58, - 76, 179, 234, 152, 103, 21, 136, 247, 69 }, + static_assert(md == std::array{ 152, 156, 25, 149, 218, 157, 45, 52, 31, 153, 60, + 46, 44, 166, 149, 243, 71, 112, 117, 6, 27, 251, + 210, 205, 240, 190, 117, 207, 123, 169, 159, 190, 51, + 216, 210, 196, 220, 195, 31, 168, 153, 23, 120, 107, + 136, 62, 108, 157, 91, 2, 237, 129, 183, 72, 58, + 76, 179, 234, 152, 103, 21, 136, 247, 69 }, "Must be able to compute Sha3-512 hash during compile-time !"); } -// Test that absorbing same input message bytes using both incremental and -// one-shot hashing, should yield same output bytes, for SHA3-512 hasher. +// Test that absorbing same input message bytes using both incremental and one-shot hashing, should yield same output +// bytes, for SHA3-512 hasher. TEST(Sha3Hashing, Sha3_512IncrementalAbsorption) { for (size_t mlen = MIN_MSG_LEN; mlen < MAX_MSG_LEN; mlen++) { @@ -88,8 +85,7 @@ TEST(Sha3Hashing, Sha3_512IncrementalAbsorption) } } -// Ensure that SHA3-512 implementation is conformant with FIPS 202 standard, by -// using KAT file generated following +// Ensure that SHA3-512 implementation is conformant with FIPS 202 standard, by using KAT file generated following // https://gist.github.com/itzmeanjan/448f97f9c49d781a5eb3ddd6ea6e7364. TEST(Sha3Hashing, Sha3_512KnownAnswerTests) { diff --git a/tests/test_shake128.cpp b/tests/test_shake128.cpp index 68c5eb9..91814c5 100644 --- a/tests/test_shake128.cpp +++ b/tests/test_shake128.cpp @@ -7,8 +7,7 @@ #include #include -// Eval Shake128 Xof on statically defined input message during -// compilation-time. +// Eval Shake128 Xof on statically defined input message during compilation-time. constexpr std::array eval_shake128() { @@ -36,33 +35,26 @@ TEST(Sha3Xof, CompileTimeEvalShake128) // 9d32ba2aa8f40b0cdf108376d77abfd5c97f149e6ba0c9efe3499c7b3c039b0afac641a978ef435b3d83b9712da8ea826bb38078899b3efaec77d44a0460b220225d1b0b11a1d1c5cb0acb5aca92c6fb95f64a992eee6b6de24434aae4fba9d496bd8bd90624391f79c0db7d20eef1ddbfe8d771b4123e97ad7664012188590eb0b43c7073b7a9ab8af27229bc7246296ac0e172fca7314b8f100dc247d51c949bc4977c345d7c1d5536c96825f3650b7f80b5981b252ce4a858e54f9833cceaf38c12a91a8c6b341e197eb894553ca6f100f731f00f43b854098aace7a4e0ed8252782523f561dd994c291229eaf70185c98ed0026be1bd39c17dd817424009 constexpr auto md = eval_shake128(); - static_assert( - md == - std::array{ - 157, 50, 186, 42, 168, 244, 11, 12, 223, 16, 131, 118, 215, 122, - 191, 213, 201, 127, 20, 158, 107, 160, 201, 239, 227, 73, 156, 123, - 60, 3, 155, 10, 250, 198, 65, 169, 120, 239, 67, 91, 61, 131, - 185, 113, 45, 168, 234, 130, 107, 179, 128, 120, 137, 155, 62, 250, - 236, 119, 212, 74, 4, 96, 178, 32, 34, 93, 27, 11, 17, 161, - 209, 197, 203, 10, 203, 90, 202, 146, 198, 251, 149, 246, 74, 153, - 46, 238, 107, 109, 226, 68, 52, 170, 228, 251, 169, 212, 150, 189, - 139, 217, 6, 36, 57, 31, 121, 192, 219, 125, 32, 238, 241, 221, - 191, 232, 215, 113, 180, 18, 62, 151, 173, 118, 100, 1, 33, 136, - 89, 14, 176, 180, 60, 112, 115, 183, 169, 171, 138, 242, 114, 41, - 188, 114, 70, 41, 106, 192, 225, 114, 252, 167, 49, 75, 143, 16, - 13, 194, 71, 213, 28, 148, 155, 196, 151, 124, 52, 93, 124, 29, - 85, 54, 201, 104, 37, 243, 101, 11, 127, 128, 181, 152, 27, 37, - 44, 228, 168, 88, 229, 79, 152, 51, 204, 234, 243, 140, 18, 169, - 26, 140, 107, 52, 30, 25, 126, 184, 148, 85, 60, 166, 241, 0, - 247, 49, 240, 15, 67, 184, 84, 9, 138, 172, 231, 164, 224, 237, - 130, 82, 120, 37, 35, 245, 97, 221, 153, 76, 41, 18, 41, 234, - 247, 1, 133, 201, 142, 208, 2, 107, 225, 189, 57, 193, 125, 216, - 23, 66, 64, 9 }, - "Must be able to compute Shake128 Xof during compile-time !"); + static_assert(md == + std::array{ + 157, 50, 186, 42, 168, 244, 11, 12, 223, 16, 131, 118, 215, 122, 191, 213, 201, 127, 20, 158, + 107, 160, 201, 239, 227, 73, 156, 123, 60, 3, 155, 10, 250, 198, 65, 169, 120, 239, 67, 91, + 61, 131, 185, 113, 45, 168, 234, 130, 107, 179, 128, 120, 137, 155, 62, 250, 236, 119, 212, 74, + 4, 96, 178, 32, 34, 93, 27, 11, 17, 161, 209, 197, 203, 10, 203, 90, 202, 146, 198, 251, + 149, 246, 74, 153, 46, 238, 107, 109, 226, 68, 52, 170, 228, 251, 169, 212, 150, 189, 139, 217, + 6, 36, 57, 31, 121, 192, 219, 125, 32, 238, 241, 221, 191, 232, 215, 113, 180, 18, 62, 151, + 173, 118, 100, 1, 33, 136, 89, 14, 176, 180, 60, 112, 115, 183, 169, 171, 138, 242, 114, 41, + 188, 114, 70, 41, 106, 192, 225, 114, 252, 167, 49, 75, 143, 16, 13, 194, 71, 213, 28, 148, + 155, 196, 151, 124, 52, 93, 124, 29, 85, 54, 201, 104, 37, 243, 101, 11, 127, 128, 181, 152, + 27, 37, 44, 228, 168, 88, 229, 79, 152, 51, 204, 234, 243, 140, 18, 169, 26, 140, 107, 52, + 30, 25, 126, 184, 148, 85, 60, 166, 241, 0, 247, 49, 240, 15, 67, 184, 84, 9, 138, 172, + 231, 164, 224, 237, 130, 82, 120, 37, 35, 245, 97, 221, 153, 76, 41, 18, 41, 234, 247, 1, + 133, 201, 142, 208, 2, 107, 225, 189, 57, 193, 125, 216, 23, 66, 64, 9 }, + "Must be able to compute Shake128 Xof during compile-time !"); } -// Test that absorbing same message bytes using both incremental and one-shot -// hashing, should yield same output bytes, for SHAKE128 XOF. +// Test that absorbing same message bytes using both incremental and one-shot hashing, should yield same output bytes, +// for SHAKE128 XOF. // // This test collects inspiration from // https://github.com/itzmeanjan/turboshake/blob/e1a6b950c5374aff49f04f6d51d807e68077ab25/src/tests.rs#L372-L415 @@ -119,8 +111,7 @@ TEST(Sha3Xof, Shake128IncrementalAbsorptionAndSqueezing) } } -// Ensure that Shake128 Xof implementation is conformant with FIPS 202 standard, -// by using KAT file generated following +// Ensure that Shake128 Xof implementation is conformant with FIPS 202 standard, by using KAT file generated following // https://gist.github.com/itzmeanjan/448f97f9c49d781a5eb3ddd6ea6e7364. TEST(Sha3Xof, Shake128KnownAnswerTests) { diff --git a/tests/test_shake256.cpp b/tests/test_shake256.cpp index c9525af..f59dbc3 100644 --- a/tests/test_shake256.cpp +++ b/tests/test_shake256.cpp @@ -7,8 +7,7 @@ #include #include -// Eval Shake256 Xof on statically defined input message during -// compilation-time. +// Eval Shake256 Xof on statically defined input message during compilation-time. constexpr std::array eval_shake256() { @@ -36,33 +35,26 @@ TEST(Sha3Xof, CompileTimeEvalShake256) // 336c8aa7f2b08bda6bd7402cd2ea89760b7728a8b31802b80524756361165366ff8159f2f4568a2bfa286db6387895629938c2868a6421c37f988455763a75e4b9259e0a939aaa68295119ccea72c9f0ca7d048aa70eeeb4534c6bd08ecc6163217c790f33b84a89623f8e5538b734967e9490a48b7d0658afb4565364e8b234dfe6a2bceb12ce2130eec00bf2113615a276819d7815f5891d07600275f4d8fbc87b056f44bc2b141ca5ed9e4cb6e9a7bf71f520971dca1c8da6140e2af31faef5502e84991a2d9e9a80183c174cc105ef178d5f6fa45b0f284eb7bced20a47c3f584aca27eac5558da517af7569fe2e843461b4b65f81f819bf81aae6dfaa3b constexpr auto md = eval_shake256(); - static_assert( - md == - std::array{ - 51, 108, 138, 167, 242, 176, 139, 218, 107, 215, 64, 44, 210, 234, - 137, 118, 11, 119, 40, 168, 179, 24, 2, 184, 5, 36, 117, 99, - 97, 22, 83, 102, 255, 129, 89, 242, 244, 86, 138, 43, 250, 40, - 109, 182, 56, 120, 149, 98, 153, 56, 194, 134, 138, 100, 33, 195, - 127, 152, 132, 85, 118, 58, 117, 228, 185, 37, 158, 10, 147, 154, - 170, 104, 41, 81, 25, 204, 234, 114, 201, 240, 202, 125, 4, 138, - 167, 14, 238, 180, 83, 76, 107, 208, 142, 204, 97, 99, 33, 124, - 121, 15, 51, 184, 74, 137, 98, 63, 142, 85, 56, 183, 52, 150, - 126, 148, 144, 164, 139, 125, 6, 88, 175, 180, 86, 83, 100, 232, - 178, 52, 223, 230, 162, 188, 235, 18, 206, 33, 48, 238, 192, 11, - 242, 17, 54, 21, 162, 118, 129, 157, 120, 21, 245, 137, 29, 7, - 96, 2, 117, 244, 216, 251, 200, 123, 5, 111, 68, 188, 43, 20, - 28, 165, 237, 158, 76, 182, 233, 167, 191, 113, 245, 32, 151, 29, - 202, 28, 141, 166, 20, 14, 42, 243, 31, 174, 245, 80, 46, 132, - 153, 26, 45, 158, 154, 128, 24, 60, 23, 76, 193, 5, 239, 23, - 141, 95, 111, 164, 91, 15, 40, 78, 183, 188, 237, 32, 164, 124, - 63, 88, 74, 202, 39, 234, 197, 85, 141, 165, 23, 175, 117, 105, - 254, 46, 132, 52, 97, 180, 182, 95, 129, 248, 25, 191, 129, 170, - 230, 223, 170, 59 }, - "Must be able to compute Shake256 Xof during compile-time !"); + static_assert(md == + std::array{ + 51, 108, 138, 167, 242, 176, 139, 218, 107, 215, 64, 44, 210, 234, 137, 118, 11, 119, 40, 168, + 179, 24, 2, 184, 5, 36, 117, 99, 97, 22, 83, 102, 255, 129, 89, 242, 244, 86, 138, 43, + 250, 40, 109, 182, 56, 120, 149, 98, 153, 56, 194, 134, 138, 100, 33, 195, 127, 152, 132, 85, + 118, 58, 117, 228, 185, 37, 158, 10, 147, 154, 170, 104, 41, 81, 25, 204, 234, 114, 201, 240, + 202, 125, 4, 138, 167, 14, 238, 180, 83, 76, 107, 208, 142, 204, 97, 99, 33, 124, 121, 15, + 51, 184, 74, 137, 98, 63, 142, 85, 56, 183, 52, 150, 126, 148, 144, 164, 139, 125, 6, 88, + 175, 180, 86, 83, 100, 232, 178, 52, 223, 230, 162, 188, 235, 18, 206, 33, 48, 238, 192, 11, + 242, 17, 54, 21, 162, 118, 129, 157, 120, 21, 245, 137, 29, 7, 96, 2, 117, 244, 216, 251, + 200, 123, 5, 111, 68, 188, 43, 20, 28, 165, 237, 158, 76, 182, 233, 167, 191, 113, 245, 32, + 151, 29, 202, 28, 141, 166, 20, 14, 42, 243, 31, 174, 245, 80, 46, 132, 153, 26, 45, 158, + 154, 128, 24, 60, 23, 76, 193, 5, 239, 23, 141, 95, 111, 164, 91, 15, 40, 78, 183, 188, + 237, 32, 164, 124, 63, 88, 74, 202, 39, 234, 197, 85, 141, 165, 23, 175, 117, 105, 254, 46, + 132, 52, 97, 180, 182, 95, 129, 248, 25, 191, 129, 170, 230, 223, 170, 59 }, + "Must be able to compute Shake256 Xof during compile-time !"); } -// Test that absorbing same message bytes using both incremental and one-shot -// hashing, should yield same output bytes, for SHAKE256 XOF. +// Test that absorbing same message bytes using both incremental and one-shot hashing, should yield same output bytes, +// for SHAKE256 XOF. // // This test collects inspiration from // https://github.com/itzmeanjan/turboshake/blob/e1a6b950c5374aff49f04f6d51d807e68077ab25/src/tests.rs#L372-L415 @@ -119,8 +111,7 @@ TEST(Sha3Xof, Shake256IncrementalAbsorptionAndSqueezing) } } -// Ensure that Shake256 Xof implementation is conformant with FIPS 202 standard, -// by using KAT file generated following +// Ensure that Shake256 Xof implementation is conformant with FIPS 202 standard, by using KAT file generated following // https://gist.github.com/itzmeanjan/448f97f9c49d781a5eb3ddd6ea6e7364. TEST(Sha3Xof, Shake256KnownAnswerTests) { diff --git a/tests/test_utils.hpp b/tests/test_utils.hpp index cce205b..dc2217c 100644 --- a/tests/test_utils.hpp +++ b/tests/test_utils.hpp @@ -24,8 +24,7 @@ random_data(std::span data) } } -// Given a hex encoded string of length 2*L, this routine can be used for -// parsing it as a byte array of length L. +// Given a hex encoded string of length 2*L, this routine can be used for parsing it as a byte array of length L. // // Taken from // https://github.com/itzmeanjan/ascon/blob/603ba1f223ddd3a46cb0b3d31d014312d96792b5/include/utils.hpp#L120-L145 From 551e97c882e556db780dd928637aa457f29a05c0 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Thu, 31 Oct 2024 19:03:33 +0400 Subject: [PATCH 10/21] Apply permutation after zeroizing in ratchet operation Signed-off-by: Anjan Roy --- include/sha3/shake128.hpp | 4 +++- include/sha3/shake256.hpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/sha3/shake128.hpp b/include/sha3/shake128.hpp index 637d846..1c6e827 100644 --- a/include/sha3/shake128.hpp +++ b/include/sha3/shake128.hpp @@ -86,7 +86,7 @@ struct shake128_t } // Given that sponge is already finalized, this routine can be used for zeroizing first n -bytes of permutation state - // s.t. n <= 200. + // s.t. n <= 200 and applying permutation. inline void ratchet(const size_t byte_len) { if (finalized) { @@ -94,6 +94,8 @@ struct shake128_t auto state_as_bytes = reinterpret_cast(state); std::memset(state_as_bytes, 0, ratchetable_portion_byte_len); + + keccak::permute(state); } } }; diff --git a/include/sha3/shake256.hpp b/include/sha3/shake256.hpp index 9ba7480..cee6e04 100644 --- a/include/sha3/shake256.hpp +++ b/include/sha3/shake256.hpp @@ -83,7 +83,7 @@ struct shake256_t } // Given that sponge is already finalized, this routine can be used for zeroizing first n -bytes of permutation state - // s.t. n <= 200. + // s.t. n <= 200 and applying permutation. inline void ratchet(const size_t byte_len) { if (finalized) { @@ -91,6 +91,8 @@ struct shake256_t auto state_as_bytes = reinterpret_cast(state); std::memset(state_as_bytes, 0, ratchetable_portion_byte_len); + + keccak::permute(state); } } }; From 502fd00da8f54efcf3b0f7be705509f437851f5d Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Thu, 31 Oct 2024 19:11:02 +0400 Subject: [PATCH 11/21] Use less verbose pattern substitution in Makefile Signed-off-by: Anjan Roy --- benches/bench.mk | 4 ++-- examples/example.mk | 2 +- tests/test.mk | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/benches/bench.mk b/benches/bench.mk index 491ff3b..176fb65 100644 --- a/benches/bench.mk +++ b/benches/bench.mk @@ -4,10 +4,10 @@ PERF_BUILD_DIR := $(BUILD_DIR)/perf BENCHMARK_DIR := benches BENCHMARK_SOURCES := $(wildcard $(BENCHMARK_DIR)/*.cpp) BENCHMARK_HEADERS := $(wildcard $(BENCHMARK_DIR)/*.hpp) -BENCHMARK_OBJECTS := $(addprefix $(BENCHMARK_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES)))) +BENCHMARK_OBJECTS := $(addprefix $(BENCHMARK_BUILD_DIR)/, $(notdir $(BENCHMARK_SOURCES:.cpp=.o))) BENCHMARK_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpthread BENCHMARK_BINARY := $(BENCHMARK_BUILD_DIR)/bench.out -PERF_OBJECTS := $(addprefix $(PERF_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES)))) +PERF_OBJECTS := $(addprefix $(PERF_BUILD_DIR)/, $(notdir $(BENCHMARK_SOURCES:.cpp=.o))) PERF_BINARY := $(PERF_BUILD_DIR)/perf.out PERF_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpfm -lpthread BENCHMARK_OUT_FILE := bench_result_on_$(shell uname -s)_$(shell uname -r)_$(shell uname -m)_with_$(CXX)_$(shell $(CXX) -dumpversion).json diff --git a/examples/example.mk b/examples/example.mk index 0c595d6..5e58b24 100644 --- a/examples/example.mk +++ b/examples/example.mk @@ -3,7 +3,7 @@ EXAMPLE_BUILD_DIR := $(BUILD_DIR)/example EXAMPLE_DIR := examples EXAMPLE_SOURCES := $(wildcard $(EXAMPLE_DIR)/*.cpp) EXAMPLE_HEADERS := $(wildcard $(EXAMPLE_DIR)/*.hpp) -EXAMPLE_EXECS := $(addprefix $(EXAMPLE_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.exe,$(EXAMPLE_SOURCES)))) +EXAMPLE_EXECS := $(addprefix $(EXAMPLE_BUILD_DIR)/, $(notdir $(EXAMPLE_SOURCES:.cpp=.exe))) $(EXAMPLE_BUILD_DIR): mkdir -p $@ diff --git a/tests/test.mk b/tests/test.mk index 0b9e82f..2e421a3 100644 --- a/tests/test.mk +++ b/tests/test.mk @@ -16,17 +16,17 @@ RELEASE_UBSAN_BUILD_DIR := $(UBSAN_BUILD_DIR)/release TEST_DIR := tests TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp) TEST_HEADERS := $(wildcard $(TEST_DIR)/*.hpp) -TEST_OBJECTS := $(addprefix $(TEST_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +TEST_OBJECTS := $(addprefix $(TEST_BUILD_DIR)/, $(notdir $(TEST_SOURCES:.cpp=.o))) TEST_BINARY := $(TEST_BUILD_DIR)/test.out TEST_LINK_FLAGS := -lgtest -lgtest_main GTEST_PARALLEL := ./gtest-parallel/gtest-parallel -DEBUG_ASAN_TEST_OBJECTS := $(addprefix $(DEBUG_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) -RELEASE_ASAN_TEST_OBJECTS := $(addprefix $(RELEASE_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +DEBUG_ASAN_TEST_OBJECTS := $(addprefix $(DEBUG_ASAN_BUILD_DIR)/, $(notdir $(TEST_SOURCES:.cpp=.o))) +RELEASE_ASAN_TEST_OBJECTS := $(addprefix $(RELEASE_ASAN_BUILD_DIR)/, $(notdir $(TEST_SOURCES:.cpp=.o))) DEBUG_ASAN_TEST_BINARY := $(DEBUG_ASAN_BUILD_DIR)/test.out RELEASE_ASAN_TEST_BINARY := $(RELEASE_ASAN_BUILD_DIR)/test.out -DEBUG_UBSAN_TEST_OBJECTS := $(addprefix $(DEBUG_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) -RELEASE_UBSAN_TEST_OBJECTS := $(addprefix $(RELEASE_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) +DEBUG_UBSAN_TEST_OBJECTS := $(addprefix $(DEBUG_UBSAN_BUILD_DIR)/, $(notdir $(TEST_SOURCES:.cpp=.o))) +RELEASE_UBSAN_TEST_OBJECTS := $(addprefix $(RELEASE_UBSAN_BUILD_DIR)/, $(notdir $(TEST_SOURCES:.cpp=.o))) DEBUG_UBSAN_TEST_BINARY := $(DEBUG_UBSAN_BUILD_DIR)/test.out RELEASE_UBSAN_TEST_BINARY := $(RELEASE_UBSAN_BUILD_DIR)/test.out From 587e97cb2fd5411c187c7dfe11d142ff86dad15e Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Thu, 31 Oct 2024 19:26:38 +0400 Subject: [PATCH 12/21] Introduce compiler attribute based force-inline MACRO definition Signed-off-by: Anjan Roy --- include/sha3/internals/force_inline.hpp | 30 +++++++++++++++++++++++++ include/sha3/internals/keccak.hpp | 23 ++++++++++--------- include/sha3/internals/sponge.hpp | 13 ++++++----- include/sha3/internals/utils.hpp | 11 ++++----- include/sha3/sha3_224.hpp | 10 ++++----- include/sha3/sha3_256.hpp | 10 ++++----- include/sha3/sha3_384.hpp | 10 ++++----- include/sha3/sha3_512.hpp | 10 ++++----- include/sha3/shake128.hpp | 14 ++++++------ include/sha3/shake256.hpp | 14 ++++++------ 10 files changed, 89 insertions(+), 56 deletions(-) create mode 100644 include/sha3/internals/force_inline.hpp diff --git a/include/sha3/internals/force_inline.hpp b/include/sha3/internals/force_inline.hpp new file mode 100644 index 0000000..782fc3a --- /dev/null +++ b/include/sha3/internals/force_inline.hpp @@ -0,0 +1,30 @@ +#pragma once + +// Following content is taken from +// https://github.com/itzmeanjan/ml-kem/blob/b43b819e880a6b1e4e165211060ef8fc030b9b6d/include/ml_kem/internals/utility/force_inline.hpp + +#ifdef _MSC_VER +// MSVC +#define forceinline __forceinline + +#elif defined(__GNUC__) +// GCC +#if defined(__cplusplus) && __cplusplus >= 201103L +#define forceinline inline __attribute__((__always_inline__)) +#else +#define forceinline inline +#endif + +#elif defined(__CLANG__) +// Clang +#if __has_attribute(__always_inline__) +#define forceinline inline __attribute__((__always_inline__)) +#else +#define forceinline inline +#endif + +#else +// Others +#define forceinline inline + +#endif diff --git a/include/sha3/internals/keccak.hpp b/include/sha3/internals/keccak.hpp index acbaa1c..98341ee 100644 --- a/include/sha3/internals/keccak.hpp +++ b/include/sha3/internals/keccak.hpp @@ -1,4 +1,5 @@ #pragma once +#include "sha3/internals/force_inline.hpp" #include #include #include @@ -57,7 +58,7 @@ static constexpr size_t PERM[LANE_CNT]{ 0, 6, 12, 18, 24, 3, 9, 10, 16, 22, // See algorithm 5 in section 3.2.5 of http://dx.doi.org/10.6028/NIST.FIPS.202 // // Taken from https://github.com/itzmeanjan/elephant/blob/2a21c7e/include/keccak.hpp#L24-L59 -consteval static bool +static consteval bool rc(const size_t t) { // step 1 of algorithm 5 @@ -92,7 +93,7 @@ rc(const size_t t) // Keccak-p[1600, 24] permutation state // // Taken from https://github.com/itzmeanjan/elephant/blob/2a21c7e/include/keccak.hpp#L61-L74 -consteval static uint64_t +static consteval uint64_t compute_rc(const size_t r_idx) { uint64_t tmp = 0; @@ -106,7 +107,7 @@ compute_rc(const size_t r_idx) } // Compile-time evaluate Keccak-p[1600, 24] round constants. -consteval std::array +static consteval std::array compute_rcs() { std::array res; @@ -136,7 +137,7 @@ static constexpr auto RC = compute_rcs(); // // This Keccak round function implementation is specifically targeting Apple Silicon CPUs. And this implementation // collects a lot of inspiration from https://github.com/bwesterb/armed-keccak.git. -static inline constexpr void +static forceinline constexpr void roundx4(uint64_t* const state, const size_t ridx) { std::array bc{}, d{}; @@ -585,7 +586,7 @@ roundx4(uint64_t* const state, const size_t ridx) // Keccak-p[1600, 24] step mapping function θ, see section 3.2.1 of SHA3 specification // https://dx.doi.org/10.6028/NIST.FIPS.202 -static inline constexpr void +static forceinline constexpr void theta(uint64_t* const state) { uint64_t c[5]{}; @@ -632,7 +633,7 @@ theta(uint64_t* const state) // Keccak-p[1600, 24] step mapping function ρ, see section 3.2.2 of SHA3 specification // https://dx.doi.org/10.6028/NIST.FIPS.202 -static inline constexpr void +static forceinline constexpr void rho(uint64_t* const state) { #if defined __clang__ @@ -650,7 +651,7 @@ rho(uint64_t* const state) // Keccak-p[1600, 24] step mapping function π, see section 3.2.3 of SHA3 specification // https://dx.doi.org/10.6028/NIST.FIPS.202 -static inline constexpr void +static forceinline constexpr void pi(const uint64_t* const __restrict istate, // input permutation state uint64_t* const __restrict ostate // output permutation state ) @@ -670,7 +671,7 @@ pi(const uint64_t* const __restrict istate, // input permutation state // Keccak-p[1600, 24] step mapping function χ, see section 3.2.4 of SHA3 specification // https://dx.doi.org/10.6028/NIST.FIPS.202 -static inline constexpr void +static forceinline constexpr void chi(uint64_t* const state) { #if defined __clang__ @@ -697,7 +698,7 @@ chi(uint64_t* const state) // Keccak-p[1600, 24] step mapping function ι, see section 3.2.5 of SHA3 specification // https://dx.doi.org/10.6028/NIST.FIPS.202 -static inline constexpr void +static forceinline constexpr void iota(uint64_t* const state, const size_t ridx) { state[0] ^= RC[ridx]; @@ -708,7 +709,7 @@ iota(uint64_t* const state, const size_t ridx) // round `i` - it first applies round `i` and then round `i+1`. // // See section 3.3 of https://dx.doi.org/10.6028/NIST.FIPS.202 -static inline constexpr void +static forceinline constexpr void roundx2(uint64_t* const state, const size_t ridx) { uint64_t tmp[LANE_CNT]{}; @@ -732,7 +733,7 @@ roundx2(uint64_t* const state, const size_t ridx) // Keccak-p[1600, 24] permutation, applying 24 rounds of permutation on state of dimension 5 x 5 x 64 ( = 1600 ) -bits, // using algorithm 7 defined in section 3.3 of SHA3 specification https://dx.doi.org/10.6028/NIST.FIPS.202 -inline constexpr void +forceinline constexpr void permute(uint64_t state[LANE_CNT]) { #if defined __APPLE__ && defined __aarch64__ // On Apple Silicon diff --git a/include/sha3/internals/sponge.hpp b/include/sha3/internals/sponge.hpp index b5ea7f8..cdcdb18 100644 --- a/include/sha3/internals/sponge.hpp +++ b/include/sha3/internals/sponge.hpp @@ -1,6 +1,7 @@ #pragma once -#include "keccak.hpp" -#include "utils.hpp" +#include "sha3/internals/force_inline.hpp" +#include "sha3/internals/keccak.hpp" +#include "sha3/internals/utils.hpp" #include #include #include @@ -32,7 +33,7 @@ check_domain_separator(const size_t dom_sep_bit_len) // This function implementation collects motivation from // https://github.com/itzmeanjan/turboshake/blob/e1a6b950/src/sponge.rs#L70-L72 template -static inline constexpr std::array::digits> +static forceinline constexpr std::array::digits> pad10x1(const size_t offset) requires(check_domain_separator(ds_bits)) { @@ -56,7 +57,7 @@ pad10x1(const size_t offset) // This function implementation collects inspiration from // https://github.com/itzmeanjan/turboshake/blob/e1a6b950/src/sponge.rs#L4-L56 template -static inline constexpr void +static forceinline constexpr void absorb(uint64_t state[keccak::LANE_CNT], size_t& offset, std::span msg) { constexpr size_t rbytes = rate >> 3u; // # -of bytes @@ -118,7 +119,7 @@ absorb(uint64_t state[keccak::LANE_CNT], size_t& offset, std::span -static inline constexpr void +static forceinline constexpr void finalize(uint64_t state[keccak::LANE_CNT], size_t& offset) requires(check_domain_separator(ds_bits)) { @@ -153,7 +154,7 @@ finalize(uint64_t state[keccak::LANE_CNT], size_t& offset) // This function implementation collects motivation from // https://github.com/itzmeanjan/turboshake/blob/e1a6b950/src/sponge.rs#L83-L118 template -static inline constexpr void +static forceinline constexpr void squeeze(uint64_t state[keccak::LANE_CNT], size_t& squeezable, std::span out) { constexpr size_t rbytes = rate >> 3u; // # -of bytes diff --git a/include/sha3/internals/utils.hpp b/include/sha3/internals/utils.hpp index a2fe84f..a7b8bd8 100644 --- a/include/sha3/internals/utils.hpp +++ b/include/sha3/internals/utils.hpp @@ -1,4 +1,5 @@ #pragma once +#include "sha3/internals/force_inline.hpp" #include "sha3/internals/keccak.hpp" #include #include @@ -14,7 +15,7 @@ namespace sha3_utils { // // Collects inspiration from // https://github.com/itzmeanjan/ascon/blob/6160fee18814c7c313262e365c53de96ab6602b4/include/utils.hpp#L17-L43. -static inline constexpr uint64_t +static forceinline constexpr uint64_t bswap(const uint64_t a) { #if defined __GNUG__ @@ -29,7 +30,7 @@ bswap(const uint64_t a) // Given a byte array of length 8, this routine can be used for interpreting those 8 -bytes in little-endian order, as a // 64 -bit unsigned integer. -static inline constexpr uint64_t +static forceinline constexpr uint64_t le_bytes_to_u64(std::span bytes) { const uint64_t word = (static_cast(bytes[7]) << 56u) | (static_cast(bytes[6]) << 48u) | @@ -47,7 +48,7 @@ le_bytes_to_u64(std::span bytes) // Given a byte array holding rate/8 -many bytes, this routine can be invoked for interpreting those bytes as rate/ 64 // -many words ( each word is 64 -bit unsigned interger ) s.t. bytes in a word are placed in little-endian order. template -static inline constexpr void +static forceinline constexpr void le_bytes_to_u64_words(std::span::digits> bytes, std::span words) { @@ -63,7 +64,7 @@ le_bytes_to_u64_words(std::span bytes) { if constexpr (std::endian::native == std::endian::big) { @@ -83,7 +84,7 @@ u64_to_le_bytes(uint64_t word, std::span bytes) // Given an array of rate/64 -many 64 -bit unsigned integer words, this routine can be used for interpreting words in // little-endian byte-order, computing rate/8 -many bytes output. template -static inline constexpr void +static forceinline constexpr void u64_words_to_le_bytes(std::span words, std::span::digits> bytes) { diff --git a/include/sha3/sha3_224.hpp b/include/sha3/sha3_224.hpp index da2d4d8..f81298b 100644 --- a/include/sha3/sha3_224.hpp +++ b/include/sha3/sha3_224.hpp @@ -38,11 +38,11 @@ struct sha3_224_t public: // Constructor - inline constexpr sha3_224_t() = default; + forceinline constexpr sha3_224_t() = default; // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. - inline constexpr void absorb(std::span msg) + forceinline constexpr void absorb(std::span msg) { if (!finalized) { sponge::absorb(state, offset, msg); @@ -52,7 +52,7 @@ struct sha3_224_t // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this // function again and again doesn't mutate anything. - inline constexpr void finalize() + forceinline constexpr void finalize() { if (!finalized) { sponge::finalize(state, offset); @@ -62,7 +62,7 @@ struct sha3_224_t // After sponge state is finalized, 28 message digest bytes can be squeezed by calling this function. Once digest // bytes are squeezed, calling this function again and again returns nothing. - inline constexpr void digest(std::span md) + forceinline constexpr void digest(std::span md) { if (finalized && !squeezed) { size_t squeezable = RATE / std::numeric_limits::digits; @@ -74,7 +74,7 @@ struct sha3_224_t // Reset the internal state of the SHA3-224 hasher, now it can again be used for another absorb->finalize->squeeze // cycle. - inline constexpr void reset() + forceinline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); offset = 0; diff --git a/include/sha3/sha3_256.hpp b/include/sha3/sha3_256.hpp index 7aa539f..3c0f9ce 100644 --- a/include/sha3/sha3_256.hpp +++ b/include/sha3/sha3_256.hpp @@ -38,11 +38,11 @@ struct sha3_256_t public: // Constructor - inline constexpr sha3_256_t() = default; + forceinline constexpr sha3_256_t() = default; // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. - inline constexpr void absorb(std::span msg) + forceinline constexpr void absorb(std::span msg) { if (!finalized) { sponge::absorb(state, offset, msg); @@ -52,7 +52,7 @@ struct sha3_256_t // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this // function again and again doesn't mutate anything. - inline constexpr void finalize() + forceinline constexpr void finalize() { if (!finalized) { sponge::finalize(state, offset); @@ -62,7 +62,7 @@ struct sha3_256_t // After sponge state is finalized, 32 message digest bytes can be squeezed by calling this function. Once digest // bytes are squeezed, calling this function again and again returns nothing. - inline constexpr void digest(std::span md) + forceinline constexpr void digest(std::span md) { if (finalized && !squeezed) { size_t squeezable = RATE / std::numeric_limits::digits; @@ -74,7 +74,7 @@ struct sha3_256_t // Reset the internal state of the SHA3-256 hasher, now it can again be used for another absorb->finalize->squeeze // cycle. - inline constexpr void reset() + forceinline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); offset = 0; diff --git a/include/sha3/sha3_384.hpp b/include/sha3/sha3_384.hpp index f5469c3..0652189 100644 --- a/include/sha3/sha3_384.hpp +++ b/include/sha3/sha3_384.hpp @@ -38,11 +38,11 @@ struct sha3_384_t public: // Constructor - inline constexpr sha3_384_t() = default; + forceinline constexpr sha3_384_t() = default; // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. - inline constexpr void absorb(std::span msg) + forceinline constexpr void absorb(std::span msg) { if (!finalized) { sponge::absorb(state, offset, msg); @@ -52,7 +52,7 @@ struct sha3_384_t // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this // function again and again doesn't mutate anything. - inline constexpr void finalize() + forceinline constexpr void finalize() { if (!finalized) { sponge::finalize(state, offset); @@ -62,7 +62,7 @@ struct sha3_384_t // After sponge state is finalized, 48 message digest bytes can be squeezed by calling this function. Once digest // bytes are squeezed, calling this function again and again returns nothing. - inline constexpr void digest(std::span md) + forceinline constexpr void digest(std::span md) { if (finalized && !squeezed) { size_t squeezable = RATE / std::numeric_limits::digits; @@ -74,7 +74,7 @@ struct sha3_384_t // Reset the internal state of the SHA3-384 hasher, now it can again be used for another absorb->finalize->squeeze // cycle. - inline constexpr void reset() + forceinline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); offset = 0; diff --git a/include/sha3/sha3_512.hpp b/include/sha3/sha3_512.hpp index fcfbbd9..dccd038 100644 --- a/include/sha3/sha3_512.hpp +++ b/include/sha3/sha3_512.hpp @@ -38,11 +38,11 @@ struct sha3_512_t public: // Constructor - inline constexpr sha3_512_t() = default; + forceinline constexpr sha3_512_t() = default; // Given N(>=0) -bytes message as input, this routine can be invoked arbitrary many times ( until the sponge is // finalized ), each time absorbing arbitrary many message bytes into RATE portion of the sponge. - inline constexpr void absorb(std::span msg) + forceinline constexpr void absorb(std::span msg) { if (!finalized) { sponge::absorb(state, offset, msg); @@ -52,7 +52,7 @@ struct sha3_512_t // Finalizes the sponge after all message bytes are absorbed into it, now it should be ready for squeezing message // digest bytes. Once finalized, you can't absorb any message bytes into sponge. After finalization, calling this // function again and again doesn't mutate anything. - inline constexpr void finalize() + forceinline constexpr void finalize() { if (!finalized) { sponge::finalize(state, offset); @@ -62,7 +62,7 @@ struct sha3_512_t // After sponge state is finalized, 64 message digest bytes can be squeezed by calling this function. Once digest // bytes are squeezed, calling this function again and again returns nothing. - inline constexpr void digest(std::span md) + forceinline constexpr void digest(std::span md) { if (finalized && !squeezed) { size_t squeezable = RATE / std::numeric_limits::digits; @@ -74,7 +74,7 @@ struct sha3_512_t // Reset the internal state of the SHA3-512 hasher, now it can again be used for another absorb->finalize->squeeze // cycle. - inline constexpr void reset() + forceinline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); offset = 0; diff --git a/include/sha3/shake128.hpp b/include/sha3/shake128.hpp index 1c6e827..b70d8c2 100644 --- a/include/sha3/shake128.hpp +++ b/include/sha3/shake128.hpp @@ -35,15 +35,15 @@ struct shake128_t size_t squeezable = 0; public: - inline constexpr shake128_t() = default; - inline constexpr size_t squeezable_num_bytes() const { return squeezable; } + forceinline constexpr shake128_t() = default; + forceinline constexpr size_t squeezable_num_bytes() const { return squeezable; } // Given N -many bytes input message, this routine consumes those into keccak[256] sponge state. // // Note, this routine can be called arbitrary number of times, each time with arbitrary bytes of input message, until // keccak[256] state is finalized ( by calling routine with similar name ). Once the sponge is finalized, it can't // absorb any more message bytes. - inline constexpr void absorb(std::span msg) + forceinline constexpr void absorb(std::span msg) { if (!finalized) { sponge::absorb(state, offset, msg); @@ -56,7 +56,7 @@ struct shake128_t // Note, once this routine is called, calling absorb() or finalize() again, on same SHAKE128 object, doesn't do // anything. After finalization, one might intend to read arbitrary many bytes by squeezing sponge, which is done by // calling read() function, as many times required. - inline constexpr void finalize() + forceinline constexpr void finalize() { if (!finalized) { sponge::finalize(state, offset); @@ -68,7 +68,7 @@ struct shake128_t // After sponge state is finalized, arbitrary many output bytes can be squeezed by calling this function any number of // times required. - inline constexpr void squeeze(std::span dig) + forceinline constexpr void squeeze(std::span dig) { if (finalized) { sponge::squeeze(state, squeezable, dig); @@ -77,7 +77,7 @@ struct shake128_t // Reset the internal state of the Shake128-Xof hasher, now it can again be used for another absorb->finalize->squeeze // cycle. - inline constexpr void reset() + forceinline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); offset = 0; @@ -87,7 +87,7 @@ struct shake128_t // Given that sponge is already finalized, this routine can be used for zeroizing first n -bytes of permutation state // s.t. n <= 200 and applying permutation. - inline void ratchet(const size_t byte_len) + forceinline void ratchet(const size_t byte_len) { if (finalized) { const auto ratchetable_portion_byte_len = std::min(byte_len, keccak::STATE_BYTE_LEN); diff --git a/include/sha3/shake256.hpp b/include/sha3/shake256.hpp index cee6e04..e5a8ee6 100644 --- a/include/sha3/shake256.hpp +++ b/include/sha3/shake256.hpp @@ -32,15 +32,15 @@ struct shake256_t size_t squeezable = 0; public: - inline constexpr shake256_t() = default; - inline constexpr size_t squeezable_num_bytes() const { return squeezable; } + forceinline constexpr shake256_t() = default; + forceinline constexpr size_t squeezable_num_bytes() const { return squeezable; } // Given N -many bytes input message, this routine consumes those into keccak[512] sponge state. // // Note, this routine can be called arbitrary number of times, each time with arbitrary bytes of input message, until // keccak[512] state is finalized ( by calling routine with similar name ). Once the sponge is finalized, it can't // absorb any more message bytes. - inline constexpr void absorb(std::span msg) + forceinline constexpr void absorb(std::span msg) { if (!finalized) { sponge::absorb(state, offset, msg); @@ -53,7 +53,7 @@ struct shake256_t // Note, once this routine is called, calling absorb() or finalize() again, on same SHAKE256 object, doesn't do // anything. After finalization, one might intend to read arbitrary many bytes by squeezing sponge, which is done by // calling read() function, as many times required. - inline constexpr void finalize() + forceinline constexpr void finalize() { if (!finalized) { sponge::finalize(state, offset); @@ -65,7 +65,7 @@ struct shake256_t // After sponge state is finalized, arbitrary many output bytes can be squeezed by calling this function any number of // times required. - inline constexpr void squeeze(std::span dig) + forceinline constexpr void squeeze(std::span dig) { if (finalized) { sponge::squeeze(state, squeezable, dig); @@ -74,7 +74,7 @@ struct shake256_t // Reset the internal state of the Shake256-Xof hasher, now it can again be used for another absorb->finalize->squeeze // cycle. - inline constexpr void reset() + forceinline constexpr void reset() { std::fill(std::begin(state), std::end(state), 0); offset = 0; @@ -84,7 +84,7 @@ struct shake256_t // Given that sponge is already finalized, this routine can be used for zeroizing first n -bytes of permutation state // s.t. n <= 200 and applying permutation. - inline void ratchet(const size_t byte_len) + forceinline void ratchet(const size_t byte_len) { if (finalized) { const auto ratchetable_portion_byte_len = std::min(byte_len, keccak::STATE_BYTE_LEN); From df43bdfd9fbaf24fefad6a9d67ba6e9150051e8d Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 00:05:26 +0400 Subject: [PATCH 13/21] Reduce min. warmup time to 50ms when running benchmarks Signed-off-by: Anjan Roy --- benches/bench.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benches/bench.mk b/benches/bench.mk index 176fb65..fef062f 100644 --- a/benches/bench.mk +++ b/benches/bench.mk @@ -26,7 +26,7 @@ $(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS) benchmark: $(BENCHMARK_BINARY) # Must *not* build google-benchmark with libPFM - ./$< --benchmark_min_warmup_time=.1 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) + ./$< --benchmark_min_warmup_time=.05 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) $(PERF_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(PERF_BUILD_DIR) $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $(PERF_DEFS) -c $< -o $@ @@ -36,4 +36,4 @@ $(PERF_BINARY): $(PERF_OBJECTS) perf: $(PERF_BINARY) # Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7 - ./$< --benchmark_min_warmup_time=.1 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_perf_counters=CYCLES --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) + ./$< --benchmark_min_warmup_time=.05 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_perf_counters=CYCLES --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) From f977615754c8d8b525a61a257aa28c12182aa9d9 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 00:09:51 +0400 Subject: [PATCH 14/21] Add benchmark results JSON file to vcs Signed-off-by: Anjan Roy --- ...x_6.11.0-9-generic_x86_64_with_g++_14.json | 3390 +++++++++++++++++ 1 file changed, 3390 insertions(+) create mode 100644 bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14.json diff --git a/bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14.json b/bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14.json new file mode 100644 index 0000000..d13aef4 --- /dev/null +++ b/bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14.json @@ -0,0 +1,3390 @@ +{ + "context": { + "date": "2024-11-04T00:01:46+04:00", + "host_name": "linux", + "executable": "./build/perf/perf.out", + "num_cpus": 16, + "mhz_per_cpu": 2238, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 49152, + "num_sharing": 2 + }, + { + "type": "Instruction", + "level": 1, + "size": 32768, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 2, + "size": 1310720, + "num_sharing": 2 + }, + { + "type": "Unified", + "level": 3, + "size": 18874368, + "num_sharing": 16 + } + ], + "load_avg": [0.525879,0.49707,0.463867], + "library_version": "v1.9.0-8-g3fd1e6a7", + "library_build_type": "release", + "json_schema_version": 1 + }, + "benchmarks": [ + { + "name": "sha3_224/64_mean", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4648330730593065e+02, + "cpu_time": 2.4646853805874326e+02, + "time_unit": "ns", + "CYCLES": 1.1451047135823333e+03, + "CYCLES/ BYTE": 1.2446790365025359e+01, + "bytes_per_second": 3.7333495354794091e+08 + }, + { + "name": "sha3_224/64_median", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4515471173674578e+02, + "cpu_time": 2.4515998145061135e+02, + "time_unit": "ns", + "CYCLES": 1.1453723280361010e+03, + "CYCLES/ BYTE": 1.2449699217783706e+01, + "bytes_per_second": 3.7526516213295454e+08 + }, + { + "name": "sha3_224/64_stddev", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4038650977097924e+00, + "cpu_time": 3.3981380576855136e+00, + "time_unit": "ns", + "CYCLES": 1.4256984486697926e+00, + "CYCLES/ BYTE": 1.5496722270831070e-02, + "bytes_per_second": 5.0096596329251751e+06 + }, + { + "name": "sha3_224/64_cv", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.3809718535969564e-02, + "cpu_time": 1.3787309668204397e-02, + "time_unit": "ns", + "CYCLES": 1.2450376212404654e-03, + "CYCLES/ BYTE": 1.2450376214558747e-03, + "bytes_per_second": 1.3418672924451666e-02 + }, + { + "name": "sha3_224/64_min", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4397640749497646e+02, + "cpu_time": 2.4396051228633502e+02, + "time_unit": "ns", + "CYCLES": 1.1418019782501392e+03, + "CYCLES/ BYTE": 1.2410891067936296e+01, + "bytes_per_second": 3.6009343260354370e+08 + }, + { + "name": "sha3_224/64_max", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5548937537862162e+02, + "cpu_time": 2.5548924715128118e+02, + "time_unit": "ns", + "CYCLES": 1.1467004818273958e+03, + "CYCLES/ BYTE": 1.2464135672036912e+01, + "bytes_per_second": 3.7711020991798925e+08 + }, + { + "name": "sha3_224/256_mean", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4287195832654908e+02, + "cpu_time": 4.4285993163643678e+02, + "time_unit": "ns", + "CYCLES": 2.0702496335864384e+03, + "CYCLES/ BYTE": 7.2896113858677412e+00, + "bytes_per_second": 6.4128889179593670e+08 + }, + { + "name": "sha3_224/256_median", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4275414501482021e+02, + "cpu_time": 4.4277008021997392e+02, + "time_unit": "ns", + "CYCLES": 2.0700561681718423e+03, + "CYCLES/ BYTE": 7.2889301696191628e+00, + "bytes_per_second": 6.4141743431131005e+08 + }, + { + "name": "sha3_224/256_stddev", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.5432780742841106e-01, + "cpu_time": 9.4136723794291777e-01, + "time_unit": "ns", + "CYCLES": 3.9015331483664197e+00, + "CYCLES/ BYTE": 1.3737792776489071e-02, + "bytes_per_second": 1.3630062413943673e+06 + }, + { + "name": "sha3_224/256_cv", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.1548616693512646e-03, + "cpu_time": 2.1256545708807262e-03, + "time_unit": "ns", + "CYCLES": 1.8845713507542182e-03, + "CYCLES/ BYTE": 1.8845713508298017e-03, + "bytes_per_second": 2.1254168890673486e-03 + }, + { + "name": "sha3_224/256_min", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4168354733981215e+02, + "cpu_time": 4.4168193600060550e+02, + "time_unit": "ns", + "CYCLES": 2.0645950058020735e+03, + "CYCLES/ BYTE": 7.2697007246551886e+00, + "bytes_per_second": 6.3951232291917396e+08 + }, + { + "name": "sha3_224/256_max", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4424544978499944e+02, + "cpu_time": 4.4408839333013748e+02, + "time_unit": "ns", + "CYCLES": 2.0787198292172247e+03, + "CYCLES/ BYTE": 7.3194360183705092e+00, + "bytes_per_second": 6.4299663819534290e+08 + }, + { + "name": "sha3_224/1024_mean", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7717674831640938e+03, + "cpu_time": 1.7716489999370642e+03, + "time_unit": "ns", + "CYCLES": 8.2882259021964892e+03, + "CYCLES/ BYTE": 7.8785417321259406e+00, + "bytes_per_second": 5.9379822362954748e+08 + }, + { + "name": "sha3_224/1024_median", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7714937566793292e+03, + "cpu_time": 1.7711341934671793e+03, + "time_unit": "ns", + "CYCLES": 8.2865461262508652e+03, + "CYCLES/ BYTE": 7.8769449869304804e+00, + "bytes_per_second": 5.9396974193161726e+08 + }, + { + "name": "sha3_224/1024_stddev", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5126800415069916e+00, + "cpu_time": 2.5947500779725732e+00, + "time_unit": "ns", + "CYCLES": 1.2686397696567129e+01, + "CYCLES/ BYTE": 1.2059313399316219e-02, + "bytes_per_second": 8.6887393104715331e+05 + }, + { + "name": "sha3_224/1024_cv", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.4181770832703998e-03, + "cpu_time": 1.4645960221605684e-03, + "time_unit": "ns", + "CYCLES": 1.5306529824681862e-03, + "CYCLES/ BYTE": 1.5306529824094925e-03, + "bytes_per_second": 1.4632477775636075e-03 + }, + { + "name": "sha3_224/1024_min", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7685831959247218e+03, + "cpu_time": 1.7684527408899260e+03, + "time_unit": "ns", + "CYCLES": 8.2686067593932912e+03, + "CYCLES/ BYTE": 7.8598923568377295e+00, + "bytes_per_second": 5.9221355274505413e+08 + }, + { + "name": "sha3_224/1024_max", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7764013090718568e+03, + "cpu_time": 1.7763862294669275e+03, + "time_unit": "ns", + "CYCLES": 8.3125597457360436e+03, + "CYCLES/ BYTE": 7.9016727621065055e+00, + "bytes_per_second": 5.9487029292657793e+08 + }, + { + "name": "sha3_224/4096_mean", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.4349992947925057e+03, + "cpu_time": 6.4342894312315584e+03, + "time_unit": "ns", + "CYCLES": 3.0098056761615044e+04, + "CYCLES/ BYTE": 7.2982678859396319e+00, + "bytes_per_second": 6.4094311032192576e+08 + }, + { + "name": "sha3_224/4096_median", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.4398453171139181e+03, + "cpu_time": 6.4382611310840812e+03, + "time_unit": "ns", + "CYCLES": 3.0105962343289088e+04, + "CYCLES/ BYTE": 7.3001848553077320e+00, + "bytes_per_second": 6.4054563894110203e+08 + }, + { + "name": "sha3_224/4096_stddev", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2429964384831855e+01, + "cpu_time": 1.2259817259062178e+01, + "time_unit": "ns", + "CYCLES": 4.5796316155226691e+01, + "CYCLES/ BYTE": 1.1104829329119414e-02, + "bytes_per_second": 1.2217670814066357e+06 + }, + { + "name": "sha3_224/4096_cv", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.9316186087061033e-03, + "cpu_time": 1.9053879049260583e-03, + "time_unit": "ns", + "CYCLES": 1.5215705292187538e-03, + "CYCLES/ BYTE": 1.5215705291543567e-03, + "bytes_per_second": 1.9062020665031880e-03 + }, + { + "name": "sha3_224/4096_min", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.4171908646668671e+03, + "cpu_time": 6.4165332780235840e+03, + "time_unit": "ns", + "CYCLES": 3.0037113845870208e+04, + "CYCLES/ BYTE": 7.2834902633050937e+00, + "bytes_per_second": 6.3932494877358222e+08 + }, + { + "name": "sha3_224/4096_max", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.4504415099744620e+03, + "cpu_time": 6.4505538348082209e+03, + "time_unit": "ns", + "CYCLES": 3.0158062361725664e+04, + "CYCLES/ BYTE": 7.3128182254426921e+00, + "bytes_per_second": 6.4271465935111165e+08 + }, + { + "name": "sha3_224/16384_mean", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5302222591713467e+04, + "cpu_time": 2.5301514910536800e+04, + "time_unit": "ns", + "CYCLES": 1.1826052555575639e+05, + "CYCLES/ BYTE": 7.2057351666924419e+00, + "bytes_per_second": 6.4865912642270231e+08 + }, + { + "name": "sha3_224/16384_median", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5286972166932981e+04, + "cpu_time": 2.5287458883065290e+04, + "time_unit": "ns", + "CYCLES": 1.1819306135911802e+05, + "CYCLES/ BYTE": 7.2016245039677074e+00, + "bytes_per_second": 6.4901737997078860e+08 + }, + { + "name": "sha3_224/16384_stddev", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.0738278947609196e+01, + "cpu_time": 5.0394788919541632e+01, + "time_unit": "ns", + "CYCLES": 2.4512049109486642e+02, + "CYCLES/ BYTE": 1.4935443036848680e-02, + "bytes_per_second": 1.2911209344097520e+06 + }, + { + "name": "sha3_224/16384_cv", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.0052894074304006e-03, + "cpu_time": 1.9917696271441339e-03, + "time_unit": "ns", + "CYCLES": 2.0727160643244330e-03, + "CYCLES/ BYTE": 2.0727160645433920e-03, + "bytes_per_second": 1.9904459550737683e-03 + }, + { + "name": "sha3_224/16384_min", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5220352611713635e+04, + "cpu_time": 2.5220582324236391e+04, + "time_unit": "ns", + "CYCLES": 1.1789591053677932e+05, + "CYCLES/ BYTE": 7.1835187994625471e+00, + "bytes_per_second": 6.4623463142589533e+08 + }, + { + "name": "sha3_224/16384_max", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5395382252169835e+04, + "cpu_time": 2.5396348635459952e+04, + "time_unit": "ns", + "CYCLES": 1.1874434050243991e+05, + "CYCLES/ BYTE": 7.2352145078259751e+00, + "bytes_per_second": 6.5073834493616951e+08 + }, + { + "name": "sha3_256/64_mean", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4456998200026655e+02, + "cpu_time": 2.4454666023757491e+02, + "time_unit": "ns", + "CYCLES": 1.1430561177916418e+03, + "CYCLES/ BYTE": 1.1906834560329601e+01, + "bytes_per_second": 3.9256403617164159e+08 + }, + { + "name": "sha3_256/64_median", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4464696799831282e+02, + "cpu_time": 2.4463476287791127e+02, + "time_unit": "ns", + "CYCLES": 1.1432066018883429e+03, + "CYCLES/ BYTE": 1.1908402103003571e+01, + "bytes_per_second": 3.9242174592335689e+08 + }, + { + "name": "sha3_256/64_stddev", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0180415395960695e-01, + "cpu_time": 3.9350028141195986e-01, + "time_unit": "ns", + "CYCLES": 1.7746419018098063e+00, + "CYCLES/ BYTE": 1.8485853145275746e-02, + "bytes_per_second": 6.3243057335612387e+05 + }, + { + "name": "sha3_256/64_cv", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.6429005337178669e-03, + "cpu_time": 1.6091010240322963e-03, + "time_unit": "ns", + "CYCLES": 1.5525413618697687e-03, + "CYCLES/ BYTE": 1.5525413619893302e-03, + "bytes_per_second": 1.6110252470493882e-03 + }, + { + "name": "sha3_256/64_min", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4375379826984653e+02, + "cpu_time": 2.4376968416215323e+02, + "time_unit": "ns", + "CYCLES": 1.1398533174810957e+03, + "CYCLES/ BYTE": 1.1873472057094746e+01, + "bytes_per_second": 3.9178404332698268e+08 + }, + { + "name": "sha3_256/64_max", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4510542724368662e+02, + "cpu_time": 2.4503295025693143e+02, + "time_unit": "ns", + "CYCLES": 1.1463565639404530e+03, + "CYCLES/ BYTE": 1.1941214207713054e+01, + "bytes_per_second": 3.9381435115673256e+08 + }, + { + "name": "sha3_256/256_mean", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4233417797572292e+02, + "cpu_time": 4.4230391227442715e+02, + "time_unit": "ns", + "CYCLES": 2.0681073315592453e+03, + "CYCLES/ BYTE": 7.1809282345807155e+00, + "bytes_per_second": 6.5113822674052119e+08 + }, + { + "name": "sha3_256/256_median", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4247989754083108e+02, + "cpu_time": 4.4246889071008826e+02, + "time_unit": "ns", + "CYCLES": 2.0679611240669428e+03, + "CYCLES/ BYTE": 7.1804205696768850e+00, + "bytes_per_second": 6.5089330524761009e+08 + }, + { + "name": "sha3_256/256_stddev", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.3485055351607629e-01, + "cpu_time": 8.6205864507125496e-01, + "time_unit": "ns", + "CYCLES": 3.3366164589310991e+00, + "CYCLES/ BYTE": 1.1585473814004120e-02, + "bytes_per_second": 1.2697260790720002e+06 + }, + { + "name": "sha3_256/256_cv", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.8873751907136063e-03, + "cpu_time": 1.9490188107049598e-03, + "time_unit": "ns", + "CYCLES": 1.6133671633064923e-03, + "CYCLES/ BYTE": 1.6133671630657342e-03, + "bytes_per_second": 1.9500100392324017e-03 + }, + { + "name": "sha3_256/256_min", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4084172755289046e+02, + "cpu_time": 4.4083535475950032e+02, + "time_unit": "ns", + "CYCLES": 2.0630922567722787e+03, + "CYCLES/ BYTE": 7.1635147804593009e+00, + "bytes_per_second": 6.4931693006291330e+08 + }, + { + "name": "sha3_256/256_max", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4353482727775793e+02, + "cpu_time": 4.4354303217089262e+02, + "time_unit": "ns", + "CYCLES": 2.0730823874873035e+03, + "CYCLES/ BYTE": 7.1982027343309145e+00, + "bytes_per_second": 6.5330513283608961e+08 + }, + { + "name": "sha3_256/1024_mean", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7653921409902846e+03, + "cpu_time": 1.7651996703837940e+03, + "time_unit": "ns", + "CYCLES": 8.2517041460919627e+03, + "CYCLES/ BYTE": 7.8141137747083009e+00, + "bytes_per_second": 5.9823414452852142e+08 + }, + { + "name": "sha3_256/1024_median", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7652604662648318e+03, + "cpu_time": 1.7648294393998708e+03, + "time_unit": "ns", + "CYCLES": 8.2516994872636806e+03, + "CYCLES/ BYTE": 7.8141093629390914e+00, + "bytes_per_second": 5.9835814559815240e+08 + }, + { + "name": "sha3_256/1024_stddev", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1077275917436191e+00, + "cpu_time": 2.9841526223906190e+00, + "time_unit": "ns", + "CYCLES": 6.7858871164427050e+00, + "CYCLES/ BYTE": 6.4260294621771930e-03, + "bytes_per_second": 1.0107973033600752e+06 + }, + { + "name": "sha3_256/1024_cv", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.7603610662956510e-03, + "cpu_time": 1.6905467820203010e-03, + "time_unit": "ns", + "CYCLES": 8.2236190201469186e-04, + "CYCLES/ BYTE": 8.2236190148345708e-04, + "bytes_per_second": 1.6896349240592108e-03 + }, + { + "name": "sha3_256/1024_min", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7616091711702543e+03, + "cpu_time": 1.7616056981927952e+03, + "time_unit": "ns", + "CYCLES": 8.2393080332899735e+03, + "CYCLES/ BYTE": 7.8023750315245968e+00, + "bytes_per_second": 5.9672678236263728e+08 + }, + { + "name": "sha3_256/1024_max", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7699902378175507e+03, + "cpu_time": 1.7696541050477895e+03, + "time_unit": "ns", + "CYCLES": 8.2609605470871265e+03, + "CYCLES/ BYTE": 7.8228793059537187e+00, + "bytes_per_second": 5.9945310183960843e+08 + }, + { + "name": "sha3_256/4096_mean", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.9084226887724390e+03, + "cpu_time": 6.9084790437038191e+03, + "time_unit": "ns", + "CYCLES": 3.1969872035432876e+04, + "CYCLES/ BYTE": 7.7446395434672688e+00, + "bytes_per_second": 5.9757039310952222e+08 + }, + { + "name": "sha3_256/4096_median", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8981068369305649e+03, + "cpu_time": 6.8979335388832096e+03, + "time_unit": "ns", + "CYCLES": 3.1975520261341946e+04, + "CYCLES/ BYTE": 7.7460078152475642e+00, + "bytes_per_second": 5.9844151655793071e+08 + }, + { + "name": "sha3_256/4096_stddev", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.2401757934410718e+01, + "cpu_time": 6.2412823103629989e+01, + "time_unit": "ns", + "CYCLES": 2.1068583579914819e+01, + "CYCLES/ BYTE": 5.1038235367623632e-03, + "bytes_per_second": 5.3860960872462057e+06 + }, + { + "name": "sha3_256/4096_cv", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 9.0327069934249948e-03, + "cpu_time": 9.0342349899014563e-03, + "time_unit": "ns", + "CYCLES": 6.5901369753885997e-04, + "CYCLES/ BYTE": 6.5901369690827280e-04, + "bytes_per_second": 9.0133248724373234e-03 + }, + { + "name": "sha3_256/4096_min", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8291066901879776e+03, + "cpu_time": 6.8291804434003916e+03, + "time_unit": "ns", + "CYCLES": 3.1914151323838887e+04, + "CYCLES/ BYTE": 7.7311413090694980e+00, + "bytes_per_second": 5.8992111754936624e+08 + }, + { + "name": "sha3_256/4096_max", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.9973009347553980e+03, + "cpu_time": 6.9975457348406544e+03, + "time_unit": "ns", + "CYCLES": 3.1988872559095580e+04, + "CYCLES/ BYTE": 7.7492423835018363e+00, + "bytes_per_second": 6.0446491847923446e+08 + }, + { + "name": "sha3_256/16384_mean", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.7095408543905687e+04, + "cpu_time": 2.7094780250723230e+04, + "time_unit": "ns", + "CYCLES": 1.2468449832208295e+05, + "CYCLES/ BYTE": 7.5953032603608026e+00, + "bytes_per_second": 6.0587752850479198e+08 + }, + { + "name": "sha3_256/16384_median", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.7100053809196670e+04, + "cpu_time": 2.7099005785920879e+04, + "time_unit": "ns", + "CYCLES": 1.2466524561234329e+05, + "CYCLES/ BYTE": 7.5941304588415752e+00, + "bytes_per_second": 6.0577947322401381e+08 + }, + { + "name": "sha3_256/16384_stddev", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.5931345196515366e+01, + "cpu_time": 7.6695749901463429e+01, + "time_unit": "ns", + "CYCLES": 7.4014689304939765e+01, + "CYCLES/ BYTE": 4.5086920876870737e-03, + "bytes_per_second": 1.7166553458578172e+06 + }, + { + "name": "sha3_256/16384_cv", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.8023694521333909e-03, + "cpu_time": 2.8306466851457939e-03, + "time_unit": "ns", + "CYCLES": 5.9361580870900441e-04, + "CYCLES/ BYTE": 5.9361580876138656e-04, + "bytes_per_second": 2.8333372094097066e-03 + }, + { + "name": "sha3_256/16384_min", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6955351398240349e+04, + "cpu_time": 2.6957049180327991e+04, + "time_unit": "ns", + "CYCLES": 1.2459223722275796e+05, + "CYCLES/ BYTE": 7.5896830666884716e+00, + "bytes_per_second": 6.0336974330513799e+08 + }, + { + "name": "sha3_256/16384_max", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.7207809064905283e+04, + "cpu_time": 2.7207197878495623e+04, + "time_unit": "ns", + "CYCLES": 1.2482701716489875e+05, + "CYCLES/ BYTE": 7.6039849637487054e+00, + "bytes_per_second": 6.0896872985562670e+08 + }, + { + "name": "sha3_384/64_mean", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3076510292935660e+02, + "cpu_time": 2.3076521552230042e+02, + "time_unit": "ns", + "CYCLES": 1.0560618010260685e+03, + "CYCLES/ BYTE": 9.4291232234470410e+00, + "bytes_per_second": 4.8534900691156387e+08 + }, + { + "name": "sha3_384/64_median", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3108934449694425e+02, + "cpu_time": 2.3108428111561096e+02, + "time_unit": "ns", + "CYCLES": 1.0573331398915072e+03, + "CYCLES/ BYTE": 9.4404744633170292e+00, + "bytes_per_second": 4.8467165225333345e+08 + }, + { + "name": "sha3_384/64_stddev", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.3465971998742692e-01, + "cpu_time": 9.3739463261637357e-01, + "time_unit": "ns", + "CYCLES": 2.7522409240710108e+00, + "CYCLES/ BYTE": 2.4573579678392427e-02, + "bytes_per_second": 1.9773392894852979e+06 + }, + { + "name": "sha3_384/64_cv", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.0502645682677215e-03, + "cpu_time": 4.0621140863657873e-03, + "time_unit": "ns", + "CYCLES": 2.6061362331228502e-03, + "CYCLES/ BYTE": 2.6061362330366245e-03, + "bytes_per_second": 4.0740565270088042e-03 + }, + { + "name": "sha3_384/64_min", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2910050212152828e+02, + "cpu_time": 2.2911492593823345e+02, + "time_unit": "ns", + "CYCLES": 1.0514004907139656e+03, + "CYCLES/ BYTE": 9.3875043813746935e+00, + "bytes_per_second": 4.8302587976625127e+08 + }, + { + "name": "sha3_384/64_max", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3185702499907393e+02, + "cpu_time": 2.3187163398822378e+02, + "time_unit": "ns", + "CYCLES": 1.0597511809044811e+03, + "CYCLES/ BYTE": 9.4620641152185812e+00, + "bytes_per_second": 4.8883764137738371e+08 + }, + { + "name": "sha3_384/256_mean", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6606847121280009e+02, + "cpu_time": 6.6598164215239308e+02, + "time_unit": "ns", + "CYCLES": 3.0226109800267077e+03, + "CYCLES/ BYTE": 9.9427992764036457e+00, + "bytes_per_second": 4.5647386561623967e+08 + }, + { + "name": "sha3_384/256_median", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6633740116638614e+02, + "cpu_time": 6.6630387216708641e+02, + "time_unit": "ns", + "CYCLES": 3.0310659483711056e+03, + "CYCLES/ BYTE": 9.9706116722733746e+00, + "bytes_per_second": 4.5624832237052864e+08 + }, + { + "name": "sha3_384/256_stddev", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2982315300082603e+00, + "cpu_time": 2.2814424172192780e+00, + "time_unit": "ns", + "CYCLES": 2.7402187021897440e+01, + "CYCLES/ BYTE": 9.0138773098178707e-02, + "bytes_per_second": 1.5656017430978771e+06 + }, + { + "name": "sha3_384/256_cv", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.4504433543049448e-03, + "cpu_time": 3.4256836417380222e-03, + "time_unit": "ns", + "CYCLES": 9.0657339641025576e-03, + "CYCLES/ BYTE": 9.0657339640856458e-03, + "bytes_per_second": 3.4297730078901999e-03 + }, + { + "name": "sha3_384/256_min", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6179053502127942e+02, + "cpu_time": 6.6161024219658452e+02, + "time_unit": "ns", + "CYCLES": 2.9447796981429356e+03, + "CYCLES/ BYTE": 9.6867753228386029e+00, + "bytes_per_second": 4.5424012227583194e+08 + }, + { + "name": "sha3_384/256_max", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6925132819107796e+02, + "cpu_time": 6.6924955566870767e+02, + "time_unit": "ns", + "CYCLES": 3.0335370548280798e+03, + "CYCLES/ BYTE": 9.9787403119344731e+00, + "bytes_per_second": 4.5948502700124818e+08 + }, + { + "name": "sha3_384/1024_mean", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2071090744649500e+03, + "cpu_time": 2.2071022395219079e+03, + "time_unit": "ns", + "CYCLES": 9.9733050011795240e+03, + "CYCLES/ BYTE": 9.3034561578167203e+00, + "bytes_per_second": 4.8571126664030021e+08 + }, + { + "name": "sha3_384/1024_median", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2080609734986188e+03, + "cpu_time": 2.2080781709522989e+03, + "time_unit": "ns", + "CYCLES": 9.9718897302822988e+03, + "CYCLES/ BYTE": 9.3021359424275190e+00, + "bytes_per_second": 4.8549052576838255e+08 + }, + { + "name": "sha3_384/1024_stddev", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5718262743975622e+00, + "cpu_time": 8.5317739770875693e+00, + "time_unit": "ns", + "CYCLES": 1.3253693740789522e+01, + "CYCLES/ BYTE": 1.2363520281079430e-02, + "bytes_per_second": 1.8785278290500664e+06 + }, + { + "name": "sha3_384/1024_cv", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8837347793858148e-03, + "cpu_time": 3.8655998006398118e-03, + "time_unit": "ns", + "CYCLES": 1.3289169176338269e-03, + "CYCLES/ BYTE": 1.3289169176867307e-03, + "bytes_per_second": 3.8675813349852445e-03 + }, + { + "name": "sha3_384/1024_min", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1927063615470393e+03, + "cpu_time": 2.1927579617834431e+03, + "time_unit": "ns", + "CYCLES": 9.9542577809231734e+03, + "CYCLES/ BYTE": 9.2856882284731093e+00, + "bytes_per_second": 4.8288470620335990e+08 + }, + { + "name": "sha3_384/1024_max", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2200509554223368e+03, + "cpu_time": 2.2199916175198614e+03, + "time_unit": "ns", + "CYCLES": 1.0000600330266572e+04, + "CYCLES/ BYTE": 9.3289182185322499e+00, + "bytes_per_second": 4.8888204657485616e+08 + }, + { + "name": "sha3_384/4096_mean", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.8120278923232436e+03, + "cpu_time": 8.8122651787402992e+03, + "time_unit": "ns", + "CYCLES": 3.9738464970682806e+04, + "CYCLES/ BYTE": 9.5893979176358144e+00, + "bytes_per_second": 4.7026335243168080e+08 + }, + { + "name": "sha3_384/4096_median", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.8301317697547529e+03, + "cpu_time": 8.8303340899061222e+03, + "time_unit": "ns", + "CYCLES": 3.9744071464598703e+04, + "CYCLES/ BYTE": 9.5907508360518108e+00, + "bytes_per_second": 4.6929159607600951e+08 + }, + { + "name": "sha3_384/4096_stddev", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.2115170589984452e+01, + "cpu_time": 4.2098696272748022e+01, + "time_unit": "ns", + "CYCLES": 5.4855340537726271e+01, + "CYCLES/ BYTE": 1.3237292598044195e-02, + "bytes_per_second": 2.2530622693056865e+06 + }, + { + "name": "sha3_384/4096_cv", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.7792824880495254e-03, + "cpu_time": 4.7772843212108103e-03, + "time_unit": "ns", + "CYCLES": 1.3804091471121493e-03, + "CYCLES/ BYTE": 1.3804091468244900e-03, + "bytes_per_second": 4.7910649589327893e-03 + }, + { + "name": "sha3_384/4096_min", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.7422769687505461e+03, + "cpu_time": 8.7426551289324580e+03, + "time_unit": "ns", + "CYCLES": 3.9635526322426078e+04, + "CYCLES/ BYTE": 9.5645575102379521e+00, + "bytes_per_second": 4.6783695926401556e+08 + }, + { + "name": "sha3_384/4096_max", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.8575599899153494e+03, + "cpu_time": 8.8577867095391375e+03, + "time_unit": "ns", + "CYCLES": 3.9819978942059141e+04, + "CYCLES/ BYTE": 9.6090682775239227e+00, + "bytes_per_second": 4.7399788037916267e+08 + }, + { + "name": "sha3_384/16384_mean", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4964373189551683e+04, + "cpu_time": 3.4959622296626854e+04, + "time_unit": "ns", + "CYCLES": 1.5662882165178572e+05, + "CYCLES/ BYTE": 9.5319390002303876e+00, + "bytes_per_second": 4.7002928619552702e+08 + }, + { + "name": "sha3_384/16384_median", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4969619791682919e+04, + "cpu_time": 3.4969567336309541e+04, + "time_unit": "ns", + "CYCLES": 1.5652621763392858e+05, + "CYCLES/ BYTE": 9.5256948414026645e+00, + "bytes_per_second": 4.6989444695350862e+08 + }, + { + "name": "sha3_384/16384_stddev", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.7942052489762290e+01, + "cpu_time": 6.1868506344760839e+01, + "time_unit": "ns", + "CYCLES": 3.9330708415058314e+02, + "CYCLES/ BYTE": 2.3935435987809370e-02, + "bytes_per_second": 8.3176044369624706e+05 + }, + { + "name": "sha3_384/16384_cv", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.9431794793354179e-03, + "cpu_time": 1.7697132371687649e-03, + "time_unit": "ns", + "CYCLES": 2.5110773355939311e-03, + "CYCLES/ BYTE": 2.5110773356009568e-03, + "bytes_per_second": 1.7695928065006652e-03 + }, + { + "name": "sha3_384/16384_min", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4872193452432803e+04, + "cpu_time": 3.4871388640873265e+04, + "time_unit": "ns", + "CYCLES": 1.5623049479166666e+05, + "CYCLES/ BYTE": 9.5076980764159362e+00, + "bytes_per_second": 4.6867840311604470e+08 + }, + { + "name": "sha3_384/16384_max", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.5062035714244776e+04, + "cpu_time": 3.5060288442459845e+04, + "time_unit": "ns", + "CYCLES": 1.5759066369047618e+05, + "CYCLES/ BYTE": 9.5904736909978201e+00, + "bytes_per_second": 4.7121725404246771e+08 + }, + { + "name": "sha3_512/64_mean", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3345256882808491e+02, + "cpu_time": 2.3344940588666859e+02, + "time_unit": "ns", + "CYCLES": 1.0786285911677194e+03, + "CYCLES/ BYTE": 8.4267858684978076e+00, + "bytes_per_second": 5.4848318670271122e+08 + }, + { + "name": "sha3_512/64_median", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3209831897043381e+02, + "cpu_time": 2.3207474182120094e+02, + "time_unit": "ns", + "CYCLES": 1.0813293209157664e+03, + "CYCLES/ BYTE": 8.4478853196544250e+00, + "bytes_per_second": 5.5154654925301099e+08 + }, + { + "name": "sha3_512/64_stddev", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6276513877941330e+00, + "cpu_time": 4.6208210210480170e+00, + "time_unit": "ns", + "CYCLES": 1.0547771412635530e+01, + "CYCLES/ BYTE": 8.2404464161215080e-02, + "bytes_per_second": 1.0357862415453190e+07 + }, + { + "name": "sha3_512/64_cv", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.9822662098021068e-02, + "cpu_time": 1.9793672224170326e-02, + "time_unit": "ns", + "CYCLES": 9.7788724487791953e-03, + "CYCLES/ BYTE": 9.7788724487791953e-03, + "bytes_per_second": 1.8884557752300541e-02 + }, + { + "name": "sha3_512/64_min", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3105770210728491e+02, + "cpu_time": 2.3106065647552654e+02, + "time_unit": "ns", + "CYCLES": 1.0489117735136658e+03, + "CYCLES/ BYTE": 8.1946232305755142e+00, + "bytes_per_second": 5.1933202572426629e+08 + }, + { + "name": "sha3_512/64_max", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4649358252326434e+02, + "cpu_time": 2.4647045369768938e+02, + "time_unit": "ns", + "CYCLES": 1.0842898782702503e+03, + "CYCLES/ BYTE": 8.4710146739863301e+00, + "bytes_per_second": 5.5396709224513733e+08 + }, + { + "name": "sha3_512/256_mean", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5770851727897241e+02, + "cpu_time": 8.5769177448940752e+02, + "time_unit": "ns", + "CYCLES": 3.9900842703960402e+03, + "CYCLES/ BYTE": 1.2469013344987628e+01, + "bytes_per_second": 3.7309757063372934e+08 + }, + { + "name": "sha3_512/256_median", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5700031700235775e+02, + "cpu_time": 8.5699446933975833e+02, + "time_unit": "ns", + "CYCLES": 3.9902050283765648e+03, + "CYCLES/ BYTE": 1.2469390713676766e+01, + "bytes_per_second": 3.7339816327094281e+08 + }, + { + "name": "sha3_512/256_stddev", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6569622332910132e+00, + "cpu_time": 2.6387278186726699e+00, + "time_unit": "ns", + "CYCLES": 7.1866421739032367e+00, + "CYCLES/ BYTE": 2.2458256791338387e-02, + "bytes_per_second": 1.1442505646657019e+06 + }, + { + "name": "sha3_512/256_cv", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.0977449562003450e-03, + "cpu_time": 3.0765455576900348e-03, + "time_unit": "ns", + "CYCLES": 1.8011254116169126e-03, + "CYCLES/ BYTE": 1.8011254114477548e-03, + "bytes_per_second": 3.0668936351478287e-03 + }, + { + "name": "sha3_512/256_min", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5478870846932602e+02, + "cpu_time": 8.5477525883614305e+02, + "time_unit": "ns", + "CYCLES": 3.9815668726686281e+03, + "CYCLES/ BYTE": 1.2442396477089464e+01, + "bytes_per_second": 3.7054585229577559e+08 + }, + { + "name": "sha3_512/256_max", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.6366351919668125e+02, + "cpu_time": 8.6359082962982666e+02, + "time_unit": "ns", + "CYCLES": 4.0051166086003768e+03, + "CYCLES/ BYTE": 1.2515989401876178e+01, + "bytes_per_second": 3.7436741025437510e+08 + }, + { + "name": "sha3_512/1024_mean", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1902272598216314e+03, + "cpu_time": 3.1902584351686451e+03, + "time_unit": "ns", + "CYCLES": 1.4773722575403910e+04, + "CYCLES/ BYTE": 1.3578789131805065e+01, + "bytes_per_second": 3.4104277275261539e+08 + }, + { + "name": "sha3_512/1024_median", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1877335575880434e+03, + "cpu_time": 3.1876139411414747e+03, + "time_unit": "ns", + "CYCLES": 1.4770675454254200e+04, + "CYCLES/ BYTE": 1.3575988468983638e+01, + "bytes_per_second": 3.4132183202354372e+08 + }, + { + "name": "sha3_512/1024_stddev", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2436058516225497e+01, + "cpu_time": 1.2321453790539213e+01, + "time_unit": "ns", + "CYCLES": 3.1451863957865712e+01, + "CYCLES/ BYTE": 2.8907963196898503e-02, + "bytes_per_second": 1.3150153099843871e+06 + }, + { + "name": "sha3_512/1024_cv", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8981732345051839e-03, + "cpu_time": 3.8622118053855633e-03, + "time_unit": "ns", + "CYCLES": 2.1289058189185488e-03, + "CYCLES/ BYTE": 2.1289058189429065e-03, + "bytes_per_second": 3.8558662286570988e-03 + }, + { + "name": "sha3_512/1024_min", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1742136253386070e+03, + "cpu_time": 3.1744084626298168e+03, + "time_unit": "ns", + "CYCLES": 1.4737099844386470e+04, + "CYCLES/ BYTE": 1.3545128533443448e+01, + "bytes_per_second": 3.3864379111445117e+08 + }, + { + "name": "sha3_512/1024_max", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.2130861824130511e+03, + "cpu_time": 3.2128154377774772e+03, + "time_unit": "ns", + "CYCLES": 1.4818257105588356e+04, + "CYCLES/ BYTE": 1.3619721604401063e+01, + "bytes_per_second": 3.4274102177092040e+08 + }, + { + "name": "sha3_512/4096_mean", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2114216639716446e+04, + "cpu_time": 1.2114043438644261e+04, + "time_unit": "ns", + "CYCLES": 5.5882218121434053e+04, + "CYCLES/ BYTE": 1.3433225509960108e+01, + "bytes_per_second": 3.4341300234498078e+08 + }, + { + "name": "sha3_512/4096_median", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2108006770012755e+04, + "cpu_time": 1.2107588989185157e+04, + "time_unit": "ns", + "CYCLES": 5.5886294345567570e+04, + "CYCLES/ BYTE": 1.3434205371530666e+01, + "bytes_per_second": 3.4358628382825261e+08 + }, + { + "name": "sha3_512/4096_stddev", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8441130709368394e+01, + "cpu_time": 6.8679062373053313e+01, + "time_unit": "ns", + "CYCLES": 3.5953238729339141e+01, + "CYCLES/ BYTE": 8.6426054652229758e-03, + "bytes_per_second": 1.9418676489469274e+06 + }, + { + "name": "sha3_512/4096_cv", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 5.6496538525639562e-03, + "cpu_time": 5.6693756069888680e-03, + "time_unit": "ns", + "CYCLES": 6.4337529786687186e-04, + "CYCLES/ BYTE": 6.4337529797403375e-04, + "bytes_per_second": 5.6546130626591549e-03 + }, + { + "name": "sha3_512/4096_min", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2038948224523174e+04, + "cpu_time": 1.2037718555735248e+04, + "time_unit": "ns", + "CYCLES": 5.5833769479690025e+04, + "CYCLES/ BYTE": 1.3421579201848564e+01, + "bytes_per_second": 3.4015102544878203e+08 + }, + { + "name": "sha3_512/4096_max", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2229574384824178e+04, + "cpu_time": 1.2229861704845540e+04, + "time_unit": "ns", + "CYCLES": 5.5930391552414207e+04, + "CYCLES/ BYTE": 1.3444805661638030e+01, + "bytes_per_second": 3.4558043376234365e+08 + }, + { + "name": "sha3_512/16384_mean", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.9030269355369019e+04, + "cpu_time": 4.9024326232333930e+04, + "time_unit": "ns", + "CYCLES": 2.2303737052740436e+05, + "CYCLES/ BYTE": 1.3560151418251724e+01, + "bytes_per_second": 3.3566072152940071e+08 + }, + { + "name": "sha3_512/16384_median", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8588348500413951e+04, + "cpu_time": 4.8587576697690645e+04, + "time_unit": "ns", + "CYCLES": 2.2295551551189244e+05, + "CYCLES/ BYTE": 1.3555174824409804e+01, + "bytes_per_second": 3.3852287802824920e+08 + }, + { + "name": "sha3_512/16384_stddev", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1326766009698583e+03, + "cpu_time": 1.1208574541866656e+03, + "time_unit": "ns", + "CYCLES": 3.5437995376428637e+02, + "CYCLES/ BYTE": 2.1545473842555618e-02, + "bytes_per_second": 7.4757947723403377e+06 + }, + { + "name": "sha3_512/16384_cv", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.3101578185513796e-02, + "cpu_time": 2.2863291356106503e-02, + "time_unit": "ns", + "CYCLES": 1.5888815086292640e-03, + "CYCLES/ BYTE": 1.5888815086206036e-03, + "bytes_per_second": 2.2271878396369141e-02 + }, + { + "name": "sha3_512/16384_min", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8038309893037280e+04, + "cpu_time": 4.8036893485005399e+04, + "time_unit": "ns", + "CYCLES": 2.2252923371251291e+05, + "CYCLES/ BYTE": 1.3529257886217955e+01, + "bytes_per_second": 3.2147518014896858e+08 + }, + { + "name": "sha3_512/16384_max", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.1221915201413169e+04, + "cpu_time": 5.1164136504653798e+04, + "time_unit": "ns", + "CYCLES": 2.2344194381247845e+05, + "CYCLES/ BYTE": 1.3584748529455158e+01, + "bytes_per_second": 3.4240349045747942e+08 + }, + { + "name": "keccak-p[1600, 24]_mean", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1700272375763925e+02, + "cpu_time": 2.1698529648510765e+02, + "time_unit": "ns", + "CYCLES": 9.5670386431771897e+02, + "CYCLES/ BYTE": 4.7835193215885949e+00, + "bytes_per_second": 9.2172906193294859e+08 + }, + { + "name": "keccak-p[1600, 24]_median", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1719143618524473e+02, + "cpu_time": 2.1720469825720807e+02, + "time_unit": "ns", + "CYCLES": 9.5658602046307919e+02, + "CYCLES/ BYTE": 4.7829301023153956e+00, + "bytes_per_second": 9.2079046112890816e+08 + }, + { + "name": "keccak-p[1600, 24]_stddev", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.7879253146769969e-01, + "cpu_time": 6.5687370752211671e-01, + "time_unit": "ns", + "CYCLES": 5.8498422919586546e-01, + "CYCLES/ BYTE": 2.9249211456586635e-03, + "bytes_per_second": 2.7974083152327500e+06 + }, + { + "name": "keccak-p[1600, 24]_cv", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.1280369191393795e-03, + "cpu_time": 3.0272728989597683e-03, + "time_unit": "ns", + "CYCLES": 6.1145799762505574e-04, + "CYCLES/ BYTE": 6.1145799755802060e-04, + "bytes_per_second": 3.0349572675579238e-03 + }, + { + "name": "keccak-p[1600, 24]_min", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1559591700057643e+02, + "cpu_time": 2.1560345145795799e+02, + "time_unit": "ns", + "CYCLES": 9.5570418179477679e+02, + "CYCLES/ BYTE": 4.7785209089738840e+00, + "bytes_per_second": 9.1878159037118316e+08 + }, + { + "name": "keccak-p[1600, 24]_max", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1768833275626167e+02, + "cpu_time": 2.1767959011803987e+02, + "time_unit": "ns", + "CYCLES": 9.5766953538543146e+02, + "CYCLES/ BYTE": 4.7883476769271569e+00, + "bytes_per_second": 9.2762893472973621e+08 + }, + { + "name": "shake128/64/64_mean", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5247156233292108e+02, + "cpu_time": 2.5247501532029992e+02, + "time_unit": "ns", + "CYCLES": 1.1592195398647302e+03, + "CYCLES/ BYTE": 9.0564026551932049e+00, + "bytes_per_second": 5.0727522802129006e+08 + }, + { + "name": "shake128/64/64_median", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4794208645655993e+02, + "cpu_time": 2.4795319884055078e+02, + "time_unit": "ns", + "CYCLES": 1.1591379371924190e+03, + "CYCLES/ BYTE": 9.0557651343157737e+00, + "bytes_per_second": 5.1622663914993787e+08 + }, + { + "name": "shake128/64/64_stddev", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.4527593047197316e+00, + "cpu_time": 6.4551888854580044e+00, + "time_unit": "ns", + "CYCLES": 1.1412140311358936e+00, + "CYCLES/ BYTE": 8.9157346182491687e-03, + "bytes_per_second": 1.2793138046021739e+07 + }, + { + "name": "shake128/64/64_cv", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.5558360890605234e-02, + "cpu_time": 2.5567634394511048e-02, + "time_unit": "ns", + "CYCLES": 9.8446755932794436e-04, + "CYCLES/ BYTE": 9.8446755932794436e-04, + "bytes_per_second": 2.5219323434979204e-02 + }, + { + "name": "shake128/64/64_min", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4735469590595613e+02, + "cpu_time": 2.4735798930022656e+02, + "time_unit": "ns", + "CYCLES": 1.1573150736690138e+03, + "CYCLES/ BYTE": 9.0415240130391705e+00, + "bytes_per_second": 4.8932925020663851e+08 + }, + { + "name": "shake128/64/64_max", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6156669874679199e+02, + "cpu_time": 2.6158256418545790e+02, + "time_unit": "ns", + "CYCLES": 1.1614678048175288e+03, + "CYCLES/ BYTE": 9.0739672251369434e+00, + "bytes_per_second": 5.1746863063574702e+08 + }, + { + "name": "shake128/256/64_mean", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4660514950419793e+02, + "cpu_time": 4.4659575150596231e+02, + "time_unit": "ns", + "CYCLES": 2.0630249518347741e+03, + "CYCLES/ BYTE": 6.4469529744836693e+00, + "bytes_per_second": 7.1655984682909751e+08 + }, + { + "name": "shake128/256/64_median", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4717164480983604e+02, + "cpu_time": 4.4714009658732709e+02, + "time_unit": "ns", + "CYCLES": 2.0631569576274451e+03, + "CYCLES/ BYTE": 6.4473654925857664e+00, + "bytes_per_second": 7.1565937648453116e+08 + }, + { + "name": "shake128/256/64_stddev", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.9530454424332442e+00, + "cpu_time": 2.9501515985294224e+00, + "time_unit": "ns", + "CYCLES": 2.8331715334391738e+00, + "CYCLES/ BYTE": 8.8536610425681145e-03, + "bytes_per_second": 4.7393057826366657e+06 + }, + { + "name": "shake128/256/64_cv", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 6.6122064327103934e-03, + "cpu_time": 6.6058657937995103e-03, + "time_unit": "ns", + "CYCLES": 1.3733093877121851e-03, + "CYCLES/ BYTE": 1.3733093878007070e-03, + "bytes_per_second": 6.6139706314956408e-03 + }, + { + "name": "shake128/256/64_min", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4249077474862906e+02, + "cpu_time": 4.4249838164841049e+02, + "time_unit": "ns", + "CYCLES": 2.0581953645786507e+03, + "CYCLES/ BYTE": 6.4318605143082834e+00, + "bytes_per_second": 7.0925618804691768e+08 + }, + { + "name": "shake128/256/64_max", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.5119937192269481e+02, + "cpu_time": 4.5117688839795056e+02, + "time_unit": "ns", + "CYCLES": 2.0670115596542378e+03, + "CYCLES/ BYTE": 6.4594111239194936e+00, + "bytes_per_second": 7.2316648663871896e+08 + }, + { + "name": "shake128/1024/64_mean", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.6401295306153602e+03, + "cpu_time": 1.6396943867607617e+03, + "time_unit": "ns", + "CYCLES": 7.0501999526541231e+03, + "CYCLES/ BYTE": 6.4799631917776850e+00, + "bytes_per_second": 6.6395384673380244e+08 + }, + { + "name": "shake128/1024/64_median", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.6535588685372848e+03, + "cpu_time": 1.6535091113288713e+03, + "time_unit": "ns", + "CYCLES": 7.1783280408716046e+03, + "CYCLES/ BYTE": 6.5977279787422836e+00, + "bytes_per_second": 6.5799462419821358e+08 + }, + { + "name": "shake128/1024/64_stddev", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.2939825083032709e+01, + "cpu_time": 4.2791811424878880e+01, + "time_unit": "ns", + "CYCLES": 3.4359114102284332e+02, + "CYCLES/ BYTE": 3.1580068108721560e-01, + "bytes_per_second": 1.7699322873622783e+07 + }, + { + "name": "shake128/1024/64_cv", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.6180752362236971e-02, + "cpu_time": 2.6097431186194807e-02, + "time_unit": "ns", + "CYCLES": 4.8734949835500023e-02, + "CYCLES/ BYTE": 4.8734949835506740e-02, + "bytes_per_second": 2.6657459642249703e-02 + }, + { + "name": "shake128/1024/64_min", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.5619589962680698e+03, + "cpu_time": 1.5619735413616311e+03, + "time_unit": "ns", + "CYCLES": 6.0877428788496054e+03, + "CYCLES/ BYTE": 5.5953519107073575e+00, + "bytes_per_second": 6.3855083799402547e+08 + }, + { + "name": "shake128/1024/64_max", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7042544345521371e+03, + "cpu_time": 1.7038580724721874e+03, + "time_unit": "ns", + "CYCLES": 7.1815116768148337e+03, + "CYCLES/ BYTE": 6.6006541147195161e+00, + "bytes_per_second": 6.9655469263042033e+08 + }, + { + "name": "shake128/4096/64_mean", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.9041313912253463e+03, + "cpu_time": 5.9020995179611873e+03, + "time_unit": "ns", + "CYCLES": 2.5655546254767996e+04, + "CYCLES/ BYTE": 6.1671986189346137e+00, + "bytes_per_second": 7.0483693469101286e+08 + }, + { + "name": "shake128/4096/64_median", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.9076684201996777e+03, + "cpu_time": 5.9027051179947021e+03, + "time_unit": "ns", + "CYCLES": 2.5649262627321121e+04, + "CYCLES/ BYTE": 6.1656881315675776e+00, + "bytes_per_second": 7.0476162894165671e+08 + }, + { + "name": "shake128/4096/64_stddev", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.4074373351750575e+01, + "cpu_time": 1.2838459592001897e+01, + "time_unit": "ns", + "CYCLES": 2.1135392466168238e+01, + "CYCLES/ BYTE": 5.0806231906324866e-03, + "bytes_per_second": 1.5346695330873898e+06 + }, + { + "name": "shake128/4096/64_cv", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.3838177742229365e-03, + "cpu_time": 2.1752360415021933e-03, + "time_unit": "ns", + "CYCLES": 8.2381377719604380e-04, + "CYCLES/ BYTE": 8.2381377746354575e-04, + "bytes_per_second": 2.1773398321700602e-03 + }, + { + "name": "shake128/4096/64_min", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.8793120677439892e+03, + "cpu_time": 5.8794410026405894e+03, + "time_unit": "ns", + "CYCLES": 2.5631801567674058e+04, + "CYCLES/ BYTE": 6.1614907614601098e+00, + "bytes_per_second": 7.0299493400839424e+08 + }, + { + "name": "shake128/4096/64_max", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.9185379972815954e+03, + "cpu_time": 5.9175390870602305e+03, + "time_unit": "ns", + "CYCLES": 2.5690328624722304e+04, + "CYCLES/ BYTE": 6.1755597655582459e+00, + "bytes_per_second": 7.0755025828674018e+08 + }, + { + "name": "shake128/16384/64_mean", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3112957698717993e+04, + "cpu_time": 2.3109569920186554e+04, + "time_unit": "ns", + "CYCLES": 1.0045693463584968e+05, + "CYCLES/ BYTE": 6.1075470960511726e+00, + "bytes_per_second": 7.1174323651114488e+08 + }, + { + "name": "shake128/16384/64_median", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3104712338073743e+04, + "cpu_time": 2.3105499667442720e+04, + "time_unit": "ns", + "CYCLES": 1.0046321566345193e+05, + "CYCLES/ BYTE": 6.1079289678655115e+00, + "bytes_per_second": 7.1186545657605815e+08 + }, + { + "name": "shake128/16384/64_stddev", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.2755460906644046e+01, + "cpu_time": 5.3737595770563722e+01, + "time_unit": "ns", + "CYCLES": 8.1520242565577391e+01, + "CYCLES/ BYTE": 4.9562404279087516e-03, + "bytes_per_second": 1.6559809226813104e+06 + }, + { + "name": "shake128/16384/64_cv", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.2825058391194230e-03, + "cpu_time": 2.3253395003090534e-03, + "time_unit": "ns", + "CYCLES": 8.1149442655286405e-04, + "CYCLES/ BYTE": 8.1149442647985518e-04, + "bytes_per_second": 2.3266549476447045e-03 + }, + { + "name": "shake128/16384/64_min", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3030047888190551e+04, + "cpu_time": 2.3011306617891743e+04, + "time_unit": "ns", + "CYCLES": 1.0028952011972065e+05, + "CYCLES/ BYTE": 6.0973686843215376e+00, + "bytes_per_second": 7.0968936837264240e+08 + }, + { + "name": "shake128/16384/64_max", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3183486864079856e+04, + "cpu_time": 2.3176337046891640e+04, + "time_unit": "ns", + "CYCLES": 1.0057289890256069e+05, + "CYCLES/ BYTE": 6.1145974527335047e+00, + "bytes_per_second": 7.1477905505858386e+08 + }, + { + "name": "shake256/64/64_mean", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6106749102685001e+02, + "cpu_time": 2.6101499808887780e+02, + "time_unit": "ns", + "CYCLES": 1.1499892693931965e+03, + "CYCLES/ BYTE": 8.9842911671343479e+00, + "bytes_per_second": 4.9040275663018918e+08 + }, + { + "name": "shake256/64/64_median", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6132451825801519e+02, + "cpu_time": 2.6124333485600584e+02, + "time_unit": "ns", + "CYCLES": 1.1501599345558279e+03, + "CYCLES/ BYTE": 8.9856244887174057e+00, + "bytes_per_second": 4.8996466289599824e+08 + }, + { + "name": "shake256/64/64_stddev", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2434277786734962e+00, + "cpu_time": 1.2085011485841510e+00, + "time_unit": "ns", + "CYCLES": 1.0342207433599833e+00, + "CYCLES/ BYTE": 8.0798495574998692e-03, + "bytes_per_second": 2.2751796637550285e+06 + }, + { + "name": "shake256/64/64_cv", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.7628594957677571e-03, + "cpu_time": 4.6300065415116349e-03, + "time_unit": "ns", + "CYCLES": 8.9933077715212103e-04, + "CYCLES/ BYTE": 8.9933077715212103e-04, + "bytes_per_second": 4.6394104294783410e-03 + }, + { + "name": "shake256/64/64_min", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5900770786943951e+02, + "cpu_time": 2.5901225540007425e+02, + "time_unit": "ns", + "CYCLES": 1.1484416940904473e+03, + "CYCLES/ BYTE": 8.9722007350816195e+00, + "bytes_per_second": 4.8740855943919849e+08 + }, + { + "name": "shake256/64/64_max", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6261010749002202e+02, + "cpu_time": 2.6261336105232527e+02, + "time_unit": "ns", + "CYCLES": 1.1516690631787969e+03, + "CYCLES/ BYTE": 8.9974145560843510e+00, + "bytes_per_second": 4.9418511028479809e+08 + }, + { + "name": "shake256/256/64_mean", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.7513248412782951e+02, + "cpu_time": 4.7505504268970310e+02, + "time_unit": "ns", + "CYCLES": 2.0675380581305162e+03, + "CYCLES/ BYTE": 6.4610564316578651e+00, + "bytes_per_second": 6.7361488902613211e+08 + }, + { + "name": "shake256/256/64_median", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.7462799021046123e+02, + "cpu_time": 4.7463790805346827e+02, + "time_unit": "ns", + "CYCLES": 2.0660279589856536e+03, + "CYCLES/ BYTE": 6.4563373718301680e+00, + "bytes_per_second": 6.7419815557293940e+08 + }, + { + "name": "shake256/256/64_stddev", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.8972048734778237e+00, + "cpu_time": 1.8067992757745137e+00, + "time_unit": "ns", + "CYCLES": 3.8605589473312212e+00, + "CYCLES/ BYTE": 1.2064246709310663e-02, + "bytes_per_second": 2.5520227545206393e+06 + }, + { + "name": "shake256/256/64_cv", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.9930018191881829e-03, + "cpu_time": 3.8033472196077299e-03, + "time_unit": "ns", + "CYCLES": 1.8672250951559113e-03, + "CYCLES/ BYTE": 1.8672250949857523e-03, + "bytes_per_second": 3.7885486144912640e-03 + }, + { + "name": "shake256/256/64_min", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.7343844994385319e+02, + "cpu_time": 4.7344856587444110e+02, + "time_unit": "ns", + "CYCLES": 2.0639751919609735e+03, + "CYCLES/ BYTE": 6.4499224748780417e+00, + "bytes_per_second": 6.6797390768622339e+08 + }, + { + "name": "shake256/256/64_max", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.7929072980508033e+02, + "cpu_time": 4.7906062844346604e+02, + "time_unit": "ns", + "CYCLES": 2.0752850121035299e+03, + "CYCLES/ BYTE": 6.4852656628235303e+00, + "bytes_per_second": 6.7589179282647610e+08 + }, + { + "name": "shake256/1024/64_mean", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.8984692720040578e+03, + "cpu_time": 1.8982605603678876e+03, + "time_unit": "ns", + "CYCLES": 8.2491802267137227e+03, + "CYCLES/ BYTE": 7.5819671201412859e+00, + "bytes_per_second": 5.7316039233940101e+08 + }, + { + "name": "shake256/1024/64_median", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.8998284942776784e+03, + "cpu_time": 1.8998959803764228e+03, + "time_unit": "ns", + "CYCLES": 8.2508641722810389e+03, + "CYCLES/ BYTE": 7.5835148642288965e+00, + "bytes_per_second": 5.7266293137264872e+08 + }, + { + "name": "shake256/1024/64_stddev", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.1977582972832455e+00, + "cpu_time": 5.3437964752347131e+00, + "time_unit": "ns", + "CYCLES": 9.4295407476684634e+00, + "CYCLES/ BYTE": 8.6668573082780333e-03, + "bytes_per_second": 1.6150735013146892e+06 + }, + { + "name": "shake256/1024/64_cv", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.7378680150015803e-03, + "cpu_time": 2.8151016708681301e-03, + "time_unit": "ns", + "CYCLES": 1.1430882207097768e-03, + "CYCLES/ BYTE": 1.1430882211629178e-03, + "bytes_per_second": 2.8178386415059747e-03 + }, + { + "name": "shake256/1024/64_min", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.8899517030233812e+03, + "cpu_time": 1.8900228184151445e+03, + "time_unit": "ns", + "CYCLES": 8.2358165837878296e+03, + "CYCLES/ BYTE": 7.5696843600991084e+00, + "bytes_per_second": 5.7116453184159136e+08 + }, + { + "name": "shake256/1024/64_max", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.9049476927537967e+03, + "cpu_time": 1.9048801866110091e+03, + "time_unit": "ns", + "CYCLES": 8.2601201074751370e+03, + "CYCLES/ BYTE": 7.5920221576058236e+00, + "bytes_per_second": 5.7565442564991319e+08 + }, + { + "name": "shake256/4096/64_mean", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.3768015843997855e+03, + "cpu_time": 7.3743449415727564e+03, + "time_unit": "ns", + "CYCLES": 3.1946660527423941e+04, + "CYCLES/ BYTE": 7.6794857037076785e+00, + "bytes_per_second": 5.6412412905118644e+08 + }, + { + "name": "shake256/4096/64_median", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.3753574323942985e+03, + "cpu_time": 7.3737369723128722e+03, + "time_unit": "ns", + "CYCLES": 3.1936989709443100e+04, + "CYCLES/ BYTE": 7.6771609878468983e+00, + "bytes_per_second": 5.6416441617293477e+08 + }, + { + "name": "shake256/4096/64_stddev", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8063914449780281e+01, + "cpu_time": 2.5823212384449128e+01, + "time_unit": "ns", + "CYCLES": 3.9483093354974756e+01, + "CYCLES/ BYTE": 9.4911282102747539e-03, + "bytes_per_second": 1.9757369768266219e+06 + }, + { + "name": "shake256/4096/64_cv", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8043471996222471e-03, + "cpu_time": 3.5017635585326591e-03, + "time_unit": "ns", + "CYCLES": 1.2359067490350462e-03, + "CYCLES/ BYTE": 1.2359067490277909e-03, + "bytes_per_second": 3.5023089335846354e-03 + }, + { + "name": "shake256/4096/64_min", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.3275250552367124e+03, + "cpu_time": 7.3275442678174713e+03, + "time_unit": "ns", + "CYCLES": 3.1879927150226340e+04, + "CYCLES/ BYTE": 7.6634440264967161e+00, + "bytes_per_second": 5.6091678782225251e+08 + }, + { + "name": "shake256/4096/64_max", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.4251062744019628e+03, + "cpu_time": 7.4164298347195336e+03, + "time_unit": "ns", + "CYCLES": 3.2013131171702284e+04, + "CYCLES/ BYTE": 7.6954642239668951e+00, + "bytes_per_second": 5.6772089638143742e+08 + }, + { + "name": "shake256/16384/64_mean", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8774755698026613e+04, + "cpu_time": 2.8771971428571705e+04, + "time_unit": "ns", + "CYCLES": 1.2458168933658933e+05, + "CYCLES/ BYTE": 7.5742758594716282e+00, + "bytes_per_second": 5.7167256975138414e+08 + }, + { + "name": "shake256/16384/64_median", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8773892653629031e+04, + "cpu_time": 2.8774830179080505e+04, + "time_unit": "ns", + "CYCLES": 1.2460299247049246e+05, + "CYCLES/ BYTE": 7.5755710402779961e+00, + "bytes_per_second": 5.7161068006911445e+08 + }, + { + "name": "shake256/16384/64_stddev", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.3457954145040006e+01, + "cpu_time": 9.0731061211269790e+01, + "time_unit": "ns", + "CYCLES": 1.9813258529674192e+02, + "CYCLES/ BYTE": 1.2045998619158093e-02, + "bytes_per_second": 1.7982860643228535e+06 + }, + { + "name": "shake256/16384/64_cv", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.2479147738324462e-03, + "cpu_time": 3.1534530553985686e-03, + "time_unit": "ns", + "CYCLES": 1.5903828752990819e-03, + "CYCLES/ BYTE": 1.5903828752282078e-03, + "bytes_per_second": 3.1456574260768080e-03 + }, + { + "name": "shake256/16384/64_min", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8667739926763159e+04, + "cpu_time": 2.8664427757428533e+04, + "time_unit": "ns", + "CYCLES": 1.2424952523402523e+05, + "CYCLES/ BYTE": 7.5540810575161252e+00, + "bytes_per_second": 5.6781401661702371e+08 + }, + { + "name": "shake256/16384/64_max", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8966713675139094e+04, + "cpu_time": 2.8967231379731442e+04, + "time_unit": "ns", + "CYCLES": 1.2489852055352056e+05, + "CYCLES/ BYTE": 7.5935384577772709e+00, + "bytes_per_second": 5.7381225744991243e+08 + } + ] +} From ae032720f8478126a314fe42a60fa17e0023f014 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 00:11:00 +0400 Subject: [PATCH 15/21] Simplify README file - reduce clutter Signed-off-by: Anjan Roy --- README.md | 719 ++++-------------------------------------------------- 1 file changed, 49 insertions(+), 670 deletions(-) diff --git a/README.md b/README.md index f5b41b3..54e84c0 100644 --- a/README.md +++ b/README.md @@ -41,13 +41,7 @@ SHAKE-256 | N ( >=0 ) -bytes message | M ( >=0 ) -bytes digest | Given N -bytes ```bash $ g++ --version -g++ (Ubuntu 13.2.0-4ubuntu3) 13.2.0 - -$ clang++ --version -Ubuntu clang version 17.0.2 (1~exp1ubuntu2.1) -Target: x86_64-pc-linux-gnu -Thread model: posix -InstalledDir: /usr/bin +g++ (Ubuntu 14.2.0-4ubuntu2) 14.2.0 ``` - Build tools such as `cmake` and `make`. @@ -86,29 +80,30 @@ Issue following command for running all the test cases. make -j # Run tests without any sort of sanitizers make asan_test -j # Run tests with AddressSanitizer enabled make ubsan_test -j # Run tests with UndefinedBehaviourSanitizer enabled + +CXX=clang++ make -j # Specify which compiler to use ``` ```bash -[18/18] Sha3Xof.Shake256IncrementalAbsorptionAndSqueezing (1149 ms) PASSED TESTS (18/18): - 1 ms: build/tests/test.out Sha3Hashing.CompileTimeEvalSha3_512 - 1 ms: build/tests/test.out Sha3Xof.CompileTimeEvalShake128 - 1 ms: build/tests/test.out Sha3Hashing.CompileTimeEvalSha3_384 - 1 ms: build/tests/test.out Sha3Xof.CompileTimeEvalShake256 - 2 ms: build/tests/test.out Sha3Hashing.CompileTimeEvalSha3_224 - 2 ms: build/tests/test.out Sha3Hashing.CompileTimeEvalSha3_256 - 5 ms: build/tests/test.out Sha3Hashing.Sha3_224KnownAnswerTests - 5 ms: build/tests/test.out Sha3Hashing.Sha3_256KnownAnswerTests - 6 ms: build/tests/test.out Sha3Hashing.Sha3_512KnownAnswerTests - 6 ms: build/tests/test.out Sha3Hashing.Sha3_512IncrementalAbsorption - 6 ms: build/tests/test.out Sha3Hashing.Sha3_384IncrementalAbsorption - 6 ms: build/tests/test.out Sha3Hashing.Sha3_256IncrementalAbsorption - 6 ms: build/tests/test.out Sha3Hashing.Sha3_224IncrementalAbsorption - 7 ms: build/tests/test.out Sha3Xof.Shake128KnownAnswerTests - 7 ms: build/tests/test.out Sha3Hashing.Sha3_384KnownAnswerTests - 7 ms: build/tests/test.out Sha3Xof.Shake256KnownAnswerTests - 1054 ms: build/tests/test.out Sha3Xof.Shake128IncrementalAbsorptionAndSqueezing - 1149 ms: build/tests/test.out Sha3Xof.Shake256IncrementalAbsorptionAndSqueezing + 3 ms: build/test/test.out Sha3Xof.CompileTimeEvalShake256 + 4 ms: build/test/test.out Sha3Xof.CompileTimeEvalShake128 + 12 ms: build/test/test.out Sha3Hashing.CompileTimeEvalSha3_224 + 13 ms: build/test/test.out Sha3Hashing.CompileTimeEvalSha3_256 + 13 ms: build/test/test.out Sha3Hashing.CompileTimeEvalSha3_512 + 16 ms: build/test/test.out Sha3Hashing.CompileTimeEvalSha3_384 + 18 ms: build/test/test.out Sha3Hashing.Sha3_224IncrementalAbsorption + 18 ms: build/test/test.out Sha3Hashing.Sha3_256IncrementalAbsorption + 19 ms: build/test/test.out Sha3Hashing.Sha3_384IncrementalAbsorption + 19 ms: build/test/test.out Sha3Hashing.Sha3_512IncrementalAbsorption + 21 ms: build/test/test.out Sha3Hashing.Sha3_384KnownAnswerTests + 21 ms: build/test/test.out Sha3Hashing.Sha3_224KnownAnswerTests + 21 ms: build/test/test.out Sha3Xof.Shake128KnownAnswerTests + 21 ms: build/test/test.out Sha3Hashing.Sha3_256KnownAnswerTests + 22 ms: build/test/test.out Sha3Hashing.Sha3_512KnownAnswerTests + 22 ms: build/test/test.out Sha3Xof.Shake256KnownAnswerTests + 1078 ms: build/test/test.out Sha3Xof.Shake128IncrementalAbsorptionAndSqueezing + 1159 ms: build/test/test.out Sha3Xof.Shake256IncrementalAbsorptionAndSqueezing ``` ## Benchmarking @@ -121,620 +116,16 @@ For benchmarking SHA3 hash and extendable output functions, targeting CPU system > [!NOTE] > When benchmarking extendable output functions ( Xofs ), fixed length output of 32/ 64 -bytes are squeezed from sponge ( s.t. all output bytes are requested in a single call to the `squeeze` function ), for input message byte array of length N s.t. N = 2^i (i.e. power of 2). -> [!NOTE] -> Following performance figures were collected by issuing `make perf` - on machines running GNU/Linux kernel, with `google-benchmark` library compiled with *libPFM* support. - ```bash make perf -j # You must issue this if you built your google-benchmark library with libPFM support. -make benchmark -j # Or you can simply use this. +make benchmark -j # Else you have to issue this one. ``` -### On 12th Gen Intel(R) Core(TM) i7-1260P ( compiled with `Ubuntu clang version 17.0.2 (1~exp1ubuntu2.1)` ) - -```bash -2024-01-20T16:32:22+04:00 -Running ./build/perfs/perf.out -Run on (16 X 4199.2 MHz CPU s) -CPU Caches: - L1 Data 48 KiB (x8) - L1 Instruction 32 KiB (x8) - L2 Unified 1280 KiB (x8) - L3 Unified 18432 KiB (x1) -Load Average: 1.03, 0.94, 0.72 -------------------------------------------------------------------------------------------------------------- -Benchmark Time CPU Iterations CYCLES CYCLES/ BYTE bytes_per_second -------------------------------------------------------------------------------------------------------------- -sha3_512/16384_mean 47078 ns 47073 ns 10 196.189k 11.9278 333.249Mi/s -sha3_512/16384_median 47123 ns 47120 ns 10 196.171k 11.9268 332.894Mi/s -sha3_512/16384_stddev 375 ns 376 ns 10 280.473 0.0170521 2.66302Mi/s -sha3_512/16384_cv 0.80 % 0.80 % 10 0.14% 0.14% 0.80% -sha3_512/16384_min 46537 ns 46536 ns 10 195.8k 11.9042 329.629Mi/s -sha3_512/16384_max 47587 ns 47587 ns 10 196.741k 11.9614 337.072Mi/s -shake256/1024/64_mean 1697 ns 1697 ns 10 7.06365k 6.49232 611.49Mi/s -shake256/1024/64_median 1694 ns 1694 ns 10 7.06479k 6.49337 612.661Mi/s -shake256/1024/64_stddev 22.2 ns 22.2 ns 10 6.53775 6.00896m 7.8507Mi/s -shake256/1024/64_cv 1.31 % 1.31 % 10 0.09% 0.09% 1.28% -shake256/1024/64_min 1670 ns 1670 ns 10 7.05263k 6.4822 591.563Mi/s -shake256/1024/64_max 1754 ns 1754 ns 10 7.0719k 6.49991 621.295Mi/s -sha3_384/1024_mean 2120 ns 2120 ns 10 8.77788k 8.18832 482.406Mi/s -sha3_384/1024_median 2108 ns 2108 ns 10 8.77528k 8.18589 485.01Mi/s -sha3_384/1024_stddev 46.4 ns 46.4 ns 10 16.016 0.0149403 10.3393Mi/s -sha3_384/1024_cv 2.19 % 2.19 % 10 0.18% 0.18% 2.14% -sha3_384/1024_min 2072 ns 2072 ns 10 8.7518k 8.16399 462.86Mi/s -sha3_384/1024_max 2209 ns 2209 ns 10 8.80363k 8.21235 493.522Mi/s -sha3_256/1024_mean 1696 ns 1696 ns 10 7.06628k 6.69155 593.884Mi/s -sha3_256/1024_median 1688 ns 1688 ns 10 7.06231k 6.68779 596.644Mi/s -sha3_256/1024_stddev 29.6 ns 29.6 ns 10 8.20204 7.76708m 10.0777Mi/s -sha3_256/1024_cv 1.74 % 1.74 % 10 0.12% 0.12% 1.70% -sha3_256/1024_min 1665 ns 1665 ns 10 7.05768k 6.68341 568.538Mi/s -sha3_256/1024_max 1771 ns 1771 ns 10 7.07858k 6.7032 605.012Mi/s -sha3_224/256_mean 450 ns 450 ns 10 1.88327k 6.63123 602.425Mi/s -sha3_224/256_median 449 ns 449 ns 10 1.88234k 6.62796 603.486Mi/s -sha3_224/256_stddev 5.76 ns 5.77 ns 10 4.11249 0.0144806 7.58021Mi/s -sha3_224/256_cv 1.28 % 1.28 % 10 0.22% 0.22% 1.26% -sha3_224/256_min 444 ns 444 ns 10 1.87915k 6.61674 583.642Mi/s -sha3_224/256_max 464 ns 464 ns 10 1.89181k 6.66131 610.465Mi/s -sha3_224/1024_mean 1705 ns 1705 ns 10 7.11719k 6.76539 588.434Mi/s -sha3_224/1024_median 1701 ns 1701 ns 10 7.11954k 6.76763 589.703Mi/s -sha3_224/1024_stddev 27.8 ns 27.8 ns 10 13.0981 0.0124506 9.39551Mi/s -sha3_224/1024_cv 1.63 % 1.63 % 10 0.18% 0.18% 1.60% -sha3_224/1024_min 1675 ns 1675 ns 10 7.09816k 6.7473 566.411Mi/s -sha3_224/1024_max 1771 ns 1771 ns 10 7.13747k 6.78467 598.933Mi/s -sha3_384/16384_mean 32770 ns 32768 ns 10 136.423k 8.30227 478.248Mi/s -sha3_384/16384_median 32754 ns 32754 ns 10 136.378k 8.29953 478.439Mi/s -sha3_384/16384_stddev 215 ns 216 ns 10 283.637 0.0172612 3.14624Mi/s -sha3_384/16384_cv 0.66 % 0.66 % 10 0.21% 0.21% 0.66% -sha3_384/16384_min 32385 ns 32382 ns 10 135.995k 8.27622 472.853Mi/s -sha3_384/16384_max 33142 ns 33141 ns 10 136.902k 8.33143 483.934Mi/s -shake256/16384/64_mean 25386 ns 25385 ns 10 104.586k 6.3586 618.132Mi/s -shake256/16384/64_median 25199 ns 25197 ns 10 104.61k 6.36005 622.527Mi/s -shake256/16384/64_stddev 497 ns 497 ns 10 126.374 7.68322m 11.8281Mi/s -shake256/16384/64_cv 1.96 % 1.96 % 10 0.12% 0.12% 1.91% -shake256/16384/64_min 24969 ns 24968 ns 10 104.365k 6.34518 595.478Mi/s -shake256/16384/64_max 26343 ns 26342 ns 10 104.774k 6.37003 628.257Mi/s -shake256/64/64_mean 226 ns 226 ns 10 943.79 7.37336 539.91Mi/s -shake256/64/64_median 225 ns 225 ns 10 943.411 7.3704 542.65Mi/s -shake256/64/64_stddev 3.86 ns 3.87 ns 10 2.08899 0.0163202 8.89311Mi/s -shake256/64/64_cv 1.71 % 1.71 % 10 0.22% 0.22% 1.65% -shake256/64/64_min 224 ns 224 ns 10 941.407 7.35474 515.542Mi/s -shake256/64/64_max 237 ns 237 ns 10 946.997 7.39841 546.137Mi/s -shake128/256/64_mean 451 ns 451 ns 10 1.87769k 5.86778 676.797Mi/s -shake128/256/64_median 449 ns 449 ns 10 1.87731k 5.8666 679.475Mi/s -shake128/256/64_stddev 6.62 ns 6.62 ns 10 6.2563 0.0195509 9.77397Mi/s -shake128/256/64_cv 1.47 % 1.47 % 10 0.33% 0.33% 1.44% -shake128/256/64_min 445 ns 445 ns 10 1.87026k 5.84456 657.905Mi/s -shake128/256/64_max 464 ns 464 ns 10 1.88865k 5.90202 686.472Mi/s -sha3_256/4096_mean 6501 ns 6500 ns 10 26.9396k 6.52608 605.728Mi/s -sha3_256/4096_median 6484 ns 6484 ns 10 26.9337k 6.52463 607.18Mi/s -sha3_256/4096_stddev 95.1 ns 95.1 ns 10 25.8319 6.25772m 8.60066Mi/s -sha3_256/4096_cv 1.46 % 1.46 % 10 0.10% 0.10% 1.42% -sha3_256/4096_min 6407 ns 6407 ns 10 26.9063k 6.51799 582.404Mi/s -sha3_256/4096_max 6760 ns 6760 ns 10 26.9973k 6.54005 614.465Mi/s -shake128/16384/64_mean 20473 ns 20472 ns 10 85.2039k 5.1802 766.287Mi/s -shake128/16384/64_median 20493 ns 20493 ns 10 85.2611k 5.18367 765.451Mi/s -shake128/16384/64_stddev 190 ns 190 ns 10 467.964 0.0284511 7.10767Mi/s -shake128/16384/64_cv 0.93 % 0.93 % 10 0.55% 0.55% 0.93% -shake128/16384/64_min 20201 ns 20201 ns 10 84.4673k 5.13542 754.681Mi/s -shake128/16384/64_max 20787 ns 20785 ns 10 85.7988k 5.21637 776.512Mi/s -sha3_384/64_mean 228 ns 228 ns 10 939.351 8.38706 469.139Mi/s -sha3_384/64_median 226 ns 226 ns 10 947.031 8.45563 472.125Mi/s -sha3_384/64_stddev 4.31 ns 4.31 ns 10 24.7589 0.221062 8.77855Mi/s -sha3_384/64_cv 1.89 % 1.89 % 10 2.64% 2.64% 1.87% -sha3_384/64_min 223 ns 223 ns 10 869.022 7.75913 454.531Mi/s -sha3_384/64_max 235 ns 235 ns 10 950.115 8.48317 479.098Mi/s -shake128/64/64_mean 230 ns 230 ns 10 956.516 7.47278 531.434Mi/s -shake128/64/64_median 229 ns 229 ns 10 957.289 7.47882 533.223Mi/s -shake128/64/64_stddev 3.38 ns 3.38 ns 10 2.75085 0.021491 7.64794Mi/s -shake128/64/64_cv 1.47 % 1.47 % 10 0.29% 0.29% 1.44% -shake128/64/64_min 226 ns 226 ns 10 950.46 7.42547 512.269Mi/s -shake128/64/64_max 238 ns 238 ns 10 959.436 7.49559 539.297Mi/s -shake128/4096/64_mean 5271 ns 5271 ns 10 21.876k 5.25865 752.773Mi/s -shake128/4096/64_median 5262 ns 5262 ns 10 21.8532k 5.25317 753.976Mi/s -shake128/4096/64_stddev 57.5 ns 57.5 ns 10 123.224 0.0296211 8.09954Mi/s -shake128/4096/64_cv 1.09 % 1.09 % 10 0.56% 0.56% 1.08% -shake128/4096/64_min 5204 ns 5204 ns 10 21.6725k 5.20974 733.432Mi/s -shake128/4096/64_max 5409 ns 5409 ns 10 22.0734k 5.3061 762.394Mi/s -sha3_384/4096_mean 8345 ns 8344 ns 10 34.6399k 8.35905 473.729Mi/s -sha3_384/4096_median 8321 ns 8321 ns 10 34.6334k 8.35748 474.958Mi/s -sha3_384/4096_stddev 131 ns 131 ns 10 61.8703 0.0149301 7.29331Mi/s -sha3_384/4096_cv 1.57 % 1.57 % 10 0.18% 0.18% 1.54% -sha3_384/4096_min 8209 ns 8209 ns 10 34.5658k 8.34117 457.128Mi/s -sha3_384/4096_max 8646 ns 8645 ns 10 34.7457k 8.38459 481.45Mi/s -shake256/4096/64_mean 6567 ns 6566 ns 10 26.9033k 6.46715 604.542Mi/s -shake256/4096/64_median 6500 ns 6500 ns 10 26.9327k 6.4742 610.387Mi/s -shake256/4096/64_stddev 169 ns 169 ns 10 198.957 0.0478261 15.3932Mi/s -shake256/4096/64_cv 2.57 % 2.57 % 10 0.74% 0.74% 2.55% -shake256/4096/64_min 6331 ns 6331 ns 10 26.3655k 6.33785 582.197Mi/s -shake256/4096/64_max 6814 ns 6814 ns 10 27.0824k 6.51018 626.632Mi/s -sha3_224/16384_mean 23908 ns 23907 ns 10 99.2535k 6.04762 654.753Mi/s -sha3_224/16384_median 23853 ns 23853 ns 10 99.1969k 6.04417 656.185Mi/s -sha3_224/16384_stddev 223 ns 223 ns 10 257.736 0.0157041 6.08101Mi/s -sha3_224/16384_cv 0.93 % 0.93 % 10 0.26% 0.26% 0.93% -sha3_224/16384_min 23642 ns 23642 ns 10 98.9093k 6.02664 643.085Mi/s -sha3_224/16384_max 24339 ns 24338 ns 10 99.6413k 6.07125 662.037Mi/s -sha3_512/256_mean 862 ns 862 ns 10 3.56823k 11.1507 354.154Mi/s -sha3_512/256_median 855 ns 855 ns 10 3.56642k 11.145 356.95Mi/s -sha3_512/256_stddev 18.2 ns 18.2 ns 10 6.50433 0.020326 7.34607Mi/s -sha3_512/256_cv 2.11 % 2.11 % 10 0.18% 0.18% 2.07% -sha3_512/256_min 843 ns 843 ns 10 3.5613k 11.1291 341.393Mi/s -sha3_512/256_max 894 ns 894 ns 10 3.58141k 11.1919 362.115Mi/s -shake256/256/64_mean 444 ns 444 ns 10 1.8628k 5.82126 688.092Mi/s -shake256/256/64_median 444 ns 444 ns 10 1.8645k 5.82655 687.267Mi/s -shake256/256/64_stddev 3.00 ns 3.00 ns 10 3.06097 9.56552m 4.66754Mi/s -shake256/256/64_cv 0.68 % 0.68 % 10 0.16% 0.16% 0.68% -shake256/256/64_min 438 ns 438 ns 10 1.85831k 5.80723 680.75Mi/s -shake256/256/64_max 448 ns 448 ns 10 1.86634k 5.8323 696.864Mi/s -sha3_512/1024_mean 3163 ns 3163 ns 10 13.0816k 12.0235 328.133Mi/s -sha3_512/1024_median 3150 ns 3150 ns 10 13.0817k 12.0236 329.422Mi/s -sha3_512/1024_stddev 42.8 ns 42.8 ns 10 23.3898 0.021498 4.32226Mi/s -sha3_512/1024_cv 1.35 % 1.35 % 10 0.18% 0.18% 1.32% -sha3_512/1024_min 3132 ns 3132 ns 10 13.0397k 11.985 316.492Mi/s -sha3_512/1024_max 3279 ns 3278 ns 10 13.1255k 12.0639 331.332Mi/s -sha3_384/256_mean 647 ns 647 ns 10 2.69961k 8.88029 448.373Mi/s -sha3_384/256_median 645 ns 644 ns 10 2.69926k 8.87914 449.836Mi/s -sha3_384/256_stddev 6.36 ns 6.37 ns 10 3.21142 0.0105639 4.39387Mi/s -sha3_384/256_cv 0.98 % 0.98 % 10 0.12% 0.12% 0.98% -sha3_384/256_min 639 ns 639 ns 10 2.69471k 8.86419 440.796Mi/s -sha3_384/256_max 658 ns 658 ns 10 2.70448k 8.89632 453.811Mi/s -sha3_512/64_mean 226 ns 226 ns 10 936.855 7.31918 540.182Mi/s -sha3_512/64_median 225 ns 225 ns 10 940.248 7.34569 542.557Mi/s -sha3_512/64_stddev 2.98 ns 2.98 ns 10 12.7421 0.0995479 6.98803Mi/s -sha3_512/64_cv 1.32 % 1.32 % 10 1.36% 1.36% 1.29% -sha3_512/64_min 223 ns 223 ns 10 901.144 7.04019 522.984Mi/s -sha3_512/64_max 233 ns 233 ns 10 944.174 7.37636 546.214Mi/s -sha3_224/64_mean 229 ns 229 ns 10 956.933 10.4014 383.458Mi/s -sha3_224/64_median 228 ns 228 ns 10 956.708 10.399 385.106Mi/s -sha3_224/64_stddev 3.52 ns 3.52 ns 10 3.9546 0.0429848 5.82002Mi/s -sha3_224/64_cv 1.54 % 1.54 % 10 0.41% 0.41% 1.52% -sha3_224/64_min 225 ns 225 ns 10 951.42 10.3415 372.426Mi/s -sha3_224/64_max 236 ns 236 ns 10 963.04 10.4678 390.144Mi/s -sha3_224/4096_mean 6097 ns 6097 ns 10 25.3631k 6.15011 645.17Mi/s -sha3_224/4096_median 6087 ns 6086 ns 10 25.3494k 6.1468 646.198Mi/s -sha3_224/4096_stddev 62.2 ns 62.1 ns 10 76.6335 0.0185823 6.56813Mi/s -sha3_224/4096_cv 1.02 % 1.02 % 10 0.30% 0.30% 1.02% -sha3_224/4096_min 5994 ns 5994 ns 10 25.2631k 6.12588 634.169Mi/s -sha3_224/4096_max 6202 ns 6202 ns 10 25.5052k 6.18458 656.197Mi/s -keccak-p[1600, 24]_mean 201 ns 201 ns 10 836.028 4.18014 947.066Mi/s -keccak-p[1600, 24]_median 202 ns 202 ns 10 835.852 4.17926 944.329Mi/s -keccak-p[1600, 24]_stddev 1.56 ns 1.56 ns 10 0.953858 4.76929m 7.36137Mi/s -keccak-p[1600, 24]_cv 0.77 % 0.77 % 10 0.11% 0.11% 0.78% -keccak-p[1600, 24]_min 198 ns 198 ns 10 834.91 4.17455 936.229Mi/s -keccak-p[1600, 24]_max 204 ns 204 ns 10 837.704 4.18852 962.401Mi/s -sha3_256/16384_mean 25310 ns 25309 ns 10 104.779k 6.38275 618.77Mi/s -sha3_256/16384_median 25196 ns 25194 ns 10 104.793k 6.38362 621.404Mi/s -sha3_256/16384_stddev 476 ns 476 ns 10 209.428 0.0127576 11.4012Mi/s -sha3_256/16384_cv 1.88 % 1.88 % 10 0.20% 0.20% 1.84% -sha3_256/16384_min 24771 ns 24770 ns 10 104.476k 6.36426 592.49Mi/s -sha3_256/16384_max 26424 ns 26423 ns 10 105.07k 6.40045 632.034Mi/s -shake128/1024/64_mean 1511 ns 1511 ns 10 6.24248k 5.73758 686.751Mi/s -shake128/1024/64_median 1504 ns 1504 ns 10 6.23871k 5.73411 689.881Mi/s -shake128/1024/64_stddev 21.5 ns 21.5 ns 10 30.5501 0.0280791 9.64082Mi/s -shake128/1024/64_cv 1.42 % 1.42 % 10 0.49% 0.49% 1.40% -shake128/1024/64_min 1485 ns 1485 ns 10 6.20875k 5.70657 666.979Mi/s -shake128/1024/64_max 1556 ns 1556 ns 10 6.31645k 5.80556 698.568Mi/s -sha3_256/64_mean 227 ns 227 ns 10 945.557 9.84955 403.273Mi/s -sha3_256/64_median 227 ns 227 ns 10 944.72 9.84083 403.878Mi/s -sha3_256/64_stddev 2.80 ns 2.80 ns 10 3.757 0.0391354 4.8898Mi/s -sha3_256/64_cv 1.23 % 1.23 % 10 0.40% 0.40% 1.21% -sha3_256/64_min 224 ns 224 ns 10 939.278 9.78415 391.182Mi/s -sha3_256/64_max 234 ns 234 ns 10 950.283 9.89879 408.808Mi/s -sha3_512/4096_mean 11925 ns 11924 ns 10 49.2576k 11.8408 332.756Mi/s -sha3_512/4096_median 11876 ns 11875 ns 10 49.2575k 11.8408 334.075Mi/s -sha3_512/4096_stddev 159 ns 158 ns 10 106.902 0.0256976 4.34838Mi/s -sha3_512/4096_cv 1.33 % 1.33 % 10 0.22% 0.22% 1.31% -sha3_512/4096_min 11766 ns 11766 ns 10 49.099k 11.8027 322.616Mi/s -sha3_512/4096_max 12298 ns 12297 ns 10 49.4537k 11.8879 337.189Mi/s -sha3_256/256_mean 448 ns 448 ns 10 1.8696k 6.49166 613.655Mi/s -sha3_256/256_median 447 ns 447 ns 10 1.8684k 6.48751 614.217Mi/s -sha3_256/256_stddev 4.74 ns 4.74 ns 10 4.80987 0.016701 6.48242Mi/s -sha3_256/256_cv 1.06 % 1.06 % 10 0.26% 0.26% 1.06% -sha3_256/256_min 441 ns 441 ns 10 1.86248k 6.46695 602.375Mi/s -sha3_256/256_max 456 ns 456 ns 10 1.8775k 6.51911 622.879Mi/s -``` +### On 12th Gen Intel(R) Core(TM) i7-1260P -### On Apple M1 Max ( compiled with `Apple clang version 15.0.0 (clang-1500.1.0.2.5)` ) +Compiled with `g++ (Ubuntu 14.2.0-4ubuntu2) 14.2.0` while running on `Linux 6.11.0-9-generic x86_64`. -```bash -2024-01-20T16:13:19+04:00 -Running ./build/benchmarks/bench.out -Run on (10 X 24 MHz CPU s) -CPU Caches: - L1 Data 64 KiB - L1 Instruction 128 KiB - L2 Unified 4096 KiB (x10) -Load Average: 2.73, 3.26, 3.72 -------------------------------------------------------------------------------------- -Benchmark Time CPU Iterations bytes_per_second -------------------------------------------------------------------------------------- -sha3_384/256_mean 734 ns 732 ns 10 395.832Mi/s -sha3_384/256_median 731 ns 730 ns 10 397.168Mi/s -sha3_384/256_stddev 8.10 ns 7.83 ns 10 4.12066Mi/s -sha3_384/256_cv 1.10 % 1.07 % 10 1.04% -sha3_384/256_min 730 ns 730 ns 10 384.11Mi/s -sha3_384/256_max 757 ns 755 ns 10 397.216Mi/s -sha3_256/256_mean 517 ns 515 ns 10 533.919Mi/s -sha3_256/256_median 513 ns 512 ns 10 536.355Mi/s -sha3_256/256_stddev 12.6 ns 7.65 ns 10 7.65515Mi/s -sha3_256/256_cv 2.44 % 1.49 % 10 1.43% -sha3_256/256_min 512 ns 512 ns 10 512.133Mi/s -sha3_256/256_max 553 ns 536 ns 10 536.405Mi/s -sha3_224/256_mean 517 ns 517 ns 10 524.214Mi/s -sha3_224/256_median 517 ns 517 ns 10 524.326Mi/s -sha3_224/256_stddev 0.324 ns 0.345 ns 10 357.38Ki/s -sha3_224/256_cv 0.06 % 0.07 % 10 0.07% -sha3_224/256_min 517 ns 517 ns 10 523.222Mi/s -sha3_224/256_max 518 ns 518 ns 10 524.347Mi/s -sha3_256/16384_mean 29774 ns 29740 ns 10 526.42Mi/s -sha3_256/16384_median 29776 ns 29739 ns 10 526.432Mi/s -sha3_256/16384_stddev 7.40 ns 4.47 ns 10 81.0949Ki/s -sha3_256/16384_cv 0.02 % 0.02 % 10 0.02% -sha3_256/16384_min 29763 ns 29734 ns 10 526.301Mi/s -sha3_256/16384_max 29784 ns 29746 ns 10 526.526Mi/s -shake128/256/64_mean 531 ns 530 ns 10 575.569Mi/s -shake128/256/64_median 530 ns 529 ns 10 576.448Mi/s -shake128/256/64_stddev 2.58 ns 2.61 ns 10 2.79422Mi/s -shake128/256/64_cv 0.49 % 0.49 % 10 0.49% -shake128/256/64_min 530 ns 529 ns 10 567.616Mi/s -shake128/256/64_max 538 ns 538 ns 10 576.479Mi/s -shake256/4096/64_mean 7647 ns 7637 ns 10 519.457Mi/s -shake256/4096/64_median 7647 ns 7637 ns 10 519.456Mi/s -shake256/4096/64_stddev 2.35 ns 0.404 ns 10 28.1501Ki/s -shake256/4096/64_cv 0.03 % 0.01 % 10 0.01% -shake256/4096/64_min 7645 ns 7637 ns 10 519.393Mi/s -shake256/4096/64_max 7652 ns 7638 ns 10 519.485Mi/s -sha3_512/64_mean 253 ns 253 ns 10 483.055Mi/s -sha3_512/64_median 252 ns 251 ns 10 485.423Mi/s -sha3_512/64_stddev 4.10 ns 4.08 ns 10 7.49395Mi/s -sha3_512/64_cv 1.62 % 1.61 % 10 1.55% -sha3_512/64_min 252 ns 251 ns 10 461.727Mi/s -sha3_512/64_max 265 ns 264 ns 10 485.477Mi/s -shake256/64/64_mean 271 ns 271 ns 10 450.256Mi/s -shake256/64/64_median 271 ns 271 ns 10 451.014Mi/s -shake256/64/64_stddev 1.55 ns 1.49 ns 10 2.44808Mi/s -shake256/64/64_cv 0.57 % 0.55 % 10 0.54% -shake256/64/64_min 271 ns 271 ns 10 443.29Mi/s -shake256/64/64_max 276 ns 275 ns 10 451.16Mi/s -shake128/1024/64_mean 1816 ns 1803 ns 10 575.609Mi/s -shake128/1024/64_median 1800 ns 1798 ns 10 577.014Mi/s -shake128/1024/64_stddev 46.9 ns 12.3 ns 10 3.8613Mi/s -shake128/1024/64_cv 2.58 % 0.68 % 10 0.67% -shake128/1024/64_min 1800 ns 1798 ns 10 564.735Mi/s -shake128/1024/64_max 1949 ns 1837 ns 10 577.148Mi/s -sha3_224/1024_mean 2020 ns 2018 ns 10 497.314Mi/s -sha3_224/1024_median 2012 ns 2010 ns 10 499.175Mi/s -sha3_224/1024_stddev 24.7 ns 24.6 ns 10 5.88352Mi/s -sha3_224/1024_cv 1.22 % 1.22 % 10 1.18% -sha3_224/1024_min 2012 ns 2010 ns 10 480.569Mi/s -sha3_224/1024_max 2091 ns 2088 ns 10 499.218Mi/s -sha3_384/16384_mean 37832 ns 37784 ns 10 414.745Mi/s -sha3_384/16384_median 37825 ns 37781 ns 10 414.775Mi/s -sha3_384/16384_stddev 17.4 ns 9.89 ns 10 111.108Ki/s -sha3_384/16384_cv 0.05 % 0.03 % 10 0.03% -sha3_384/16384_min 37816 ns 37779 ns 10 414.441Mi/s -sha3_384/16384_max 37874 ns 37812 ns 10 414.805Mi/s -sha3_224/16384_mean 28393 ns 28349 ns 10 552.113Mi/s -sha3_224/16384_median 28387 ns 28349 ns 10 552.117Mi/s -sha3_224/16384_stddev 22.8 ns 1.44 ns 10 28.6494Ki/s -sha3_224/16384_cv 0.08 % 0.01 % 10 0.01% -sha3_224/16384_min 28377 ns 28347 ns 10 552.07Mi/s -sha3_224/16384_max 28453 ns 28351 ns 10 552.145Mi/s -sha3_512/4096_mean 12512 ns 12497 ns 10 317.471Mi/s -sha3_512/4096_median 12510 ns 12494 ns 10 317.538Mi/s -sha3_512/4096_stddev 7.05 ns 6.11 ns 10 158.695Ki/s -sha3_512/4096_cv 0.06 % 0.05 % 10 0.05% -sha3_512/4096_min 12507 ns 12493 ns 10 317.092Mi/s -sha3_512/4096_max 12531 ns 12511 ns 10 317.561Mi/s -sha3_512/16384_mean 50271 ns 50202 ns 10 312.515Mi/s -sha3_512/16384_median 49954 ns 49894 ns 10 314.385Mi/s -sha3_512/16384_stddev 732 ns 710 ns 10 4.30358Mi/s -sha3_512/16384_cv 1.46 % 1.41 % 10 1.38% -sha3_512/16384_min 49933 ns 49877 ns 10 301.568Mi/s -sha3_512/16384_max 52161 ns 52015 ns 10 314.494Mi/s -keccak-p[1600, 24]_mean 210 ns 209 ns 10 910.792Mi/s -keccak-p[1600, 24]_median 210 ns 209 ns 10 910.799Mi/s -keccak-p[1600, 24]_stddev 0.061 ns 0.014 ns 10 64.3826Ki/s -keccak-p[1600, 24]_cv 0.03 % 0.01 % 10 0.01% -keccak-p[1600, 24]_min 210 ns 209 ns 10 910.691Mi/s -keccak-p[1600, 24]_max 210 ns 209 ns 10 910.854Mi/s -sha3_384/4096_mean 9591 ns 9579 ns 10 412.574Mi/s -sha3_384/4096_median 9590 ns 9578 ns 10 412.594Mi/s -sha3_384/4096_stddev 3.48 ns 1.56 ns 10 68.6457Ki/s -sha3_384/4096_cv 0.04 % 0.02 % 10 0.02% -sha3_384/4096_min 9587 ns 9577 ns 10 412.459Mi/s -sha3_384/4096_max 9597 ns 9582 ns 10 412.639Mi/s -shake128/64/64_mean 278 ns 278 ns 10 438.941Mi/s -shake128/64/64_median 278 ns 278 ns 10 438.957Mi/s -shake128/64/64_stddev 0.152 ns 0.032 ns 10 51.5279Ki/s -shake128/64/64_cv 0.05 % 0.01 % 10 0.01% -shake128/64/64_min 278 ns 278 ns 10 438.871Mi/s -shake128/64/64_max 279 ns 278 ns 10 439.012Mi/s -sha3_256/1024_mean 1995 ns 1992 ns 10 505.488Mi/s -sha3_256/1024_median 1992 ns 1989 ns 10 506.203Mi/s -sha3_256/1024_stddev 8.81 ns 8.81 ns 10 2.20981Mi/s -sha3_256/1024_cv 0.44 % 0.44 % 10 0.44% -sha3_256/1024_min 1990 ns 1989 ns 10 499.201Mi/s -sha3_256/1024_max 2020 ns 2017 ns 10 506.235Mi/s -sha3_256/4096_mean 7659 ns 7651 ns 10 514.586Mi/s -sha3_256/4096_median 7644 ns 7635 ns 10 515.624Mi/s -sha3_256/4096_stddev 42.9 ns 40.6 ns 10 2.69423Mi/s -sha3_256/4096_cv 0.56 % 0.53 % 10 0.52% -sha3_256/4096_min 7641 ns 7634 ns 10 507.011Mi/s -sha3_256/4096_max 7780 ns 7765 ns 10 515.672Mi/s -sha3_256/64_mean 271 ns 271 ns 10 338.262Mi/s -sha3_256/64_median 271 ns 271 ns 10 338.262Mi/s -sha3_256/64_stddev 0.098 ns 0.030 ns 10 37.8028Ki/s -sha3_256/64_cv 0.04 % 0.01 % 10 0.01% -sha3_256/64_min 271 ns 271 ns 10 338.205Mi/s -sha3_256/64_max 271 ns 271 ns 10 338.336Mi/s -sha3_512/256_mean 925 ns 923 ns 10 330.489Mi/s -sha3_512/256_median 925 ns 923 ns 10 330.494Mi/s -sha3_512/256_stddev 0.613 ns 0.060 ns 10 22.1389Ki/s -sha3_512/256_cv 0.07 % 0.01 % 10 0.01% -sha3_512/256_min 924 ns 923 ns 10 330.451Mi/s -sha3_512/256_max 926 ns 924 ns 10 330.522Mi/s -sha3_224/4096_mean 7273 ns 7263 ns 10 541.606Mi/s -sha3_224/4096_median 7244 ns 7234 ns 10 543.707Mi/s -sha3_224/4096_stddev 89.4 ns 90.2 ns 10 6.52127Mi/s -sha3_224/4096_cv 1.23 % 1.24 % 10 1.20% -sha3_224/4096_min 7241 ns 7233 ns 10 523.05Mi/s -sha3_224/4096_max 7527 ns 7519 ns 10 543.734Mi/s -sha3_224/64_mean 272 ns 271 ns 10 323.182Mi/s -sha3_224/64_median 272 ns 271 ns 10 323.247Mi/s -sha3_224/64_stddev 0.194 ns 0.157 ns 10 191.57Ki/s -sha3_224/64_cv 0.07 % 0.06 % 10 0.06% -sha3_224/64_min 272 ns 271 ns 10 322.66Mi/s -sha3_224/64_max 272 ns 272 ns 10 323.285Mi/s -sha3_384/64_mean 252 ns 251 ns 10 425.074Mi/s -sha3_384/64_median 252 ns 251 ns 10 425.092Mi/s -sha3_384/64_stddev 0.071 ns 0.028 ns 10 47.8782Ki/s -sha3_384/64_cv 0.03 % 0.01 % 10 0.01% -sha3_384/64_min 251 ns 251 ns 10 424.952Mi/s -sha3_384/64_max 252 ns 251 ns 10 425.113Mi/s -shake128/16384/64_mean 24833 ns 24796 ns 10 632.6Mi/s -shake128/16384/64_median 24829 ns 24795 ns 10 632.626Mi/s -shake128/16384/64_stddev 15.4 ns 3.05 ns 10 79.7538Ki/s -shake128/16384/64_cv 0.06 % 0.01 % 10 0.01% -shake128/16384/64_min 24817 ns 24793 ns 10 632.438Mi/s -shake128/16384/64_max 24866 ns 24802 ns 10 632.673Mi/s -shake256/256/64_mean 513 ns 513 ns 10 595.316Mi/s -shake256/256/64_median 513 ns 513 ns 10 595.332Mi/s -shake256/256/64_stddev 0.163 ns 0.034 ns 10 40.9232Ki/s -shake256/256/64_cv 0.03 % 0.01 % 10 0.01% -shake256/256/64_min 513 ns 513 ns 10 595.222Mi/s -shake256/256/64_max 514 ns 513 ns 10 595.354Mi/s -shake256/16384/64_mean 29791 ns 29754 ns 10 527.191Mi/s -shake256/16384/64_median 29786 ns 29752 ns 10 527.232Mi/s -shake256/16384/64_stddev 15.4 ns 5.76 ns 10 104.489Ki/s -shake256/16384/64_cv 0.05 % 0.02 % 10 0.02% -shake256/16384/64_min 29778 ns 29748 ns 10 526.944Mi/s -shake256/16384/64_max 29830 ns 29768 ns 10 527.297Mi/s -sha3_384/1024_mean 2407 ns 2404 ns 10 425.212Mi/s -sha3_384/1024_median 2407 ns 2404 ns 10 425.212Mi/s -sha3_384/1024_stddev 0.667 ns 0.064 ns 10 11.5857Ki/s -sha3_384/1024_cv 0.03 % 0.00 % 10 0.00% -sha3_384/1024_min 2406 ns 2404 ns 10 425.197Mi/s -sha3_384/1024_max 2409 ns 2404 ns 10 425.227Mi/s -shake256/1024/64_mean 1993 ns 1990 ns 10 521.301Mi/s -shake256/1024/64_median 1993 ns 1990 ns 10 521.31Mi/s -shake256/1024/64_stddev 1.56 ns 0.101 ns 10 27.1673Ki/s -shake256/1024/64_cv 0.08 % 0.01 % 10 0.01% -shake256/1024/64_min 1992 ns 1990 ns 10 521.241Mi/s -shake256/1024/64_max 1997 ns 1991 ns 10 521.33Mi/s -sha3_512/1024_mean 3332 ns 3328 ns 10 311.783Mi/s -sha3_512/1024_median 3332 ns 3328 ns 10 311.77Mi/s -sha3_512/1024_stddev 1.02 ns 0.431 ns 10 41.3057Ki/s -sha3_512/1024_cv 0.03 % 0.01 % 10 0.01% -sha3_512/1024_min 3331 ns 3327 ns 10 311.746Mi/s -sha3_512/1024_max 3334 ns 3328 ns 10 311.858Mi/s -shake128/4096/64_mean 6361 ns 6352 ns 10 624.596Mi/s -shake128/4096/64_median 6360 ns 6351 ns 10 624.689Mi/s -shake128/4096/64_stddev 4.09 ns 1.91 ns 10 192.71Ki/s -shake128/4096/64_cv 0.06 % 0.03 % 10 0.03% -shake128/4096/64_min 6356 ns 6350 ns 10 624.315Mi/s -shake128/4096/64_max 6369 ns 6355 ns 10 624.792Mi/s -``` - -### On ARM Cortex-A72 i.e. Raspberry Pi 4B ( compiled with `gcc version 13.2.0 (Ubuntu 13.2.0-4ubuntu3)` ) - -```bash -2024-01-20T16:20:37+04:00 -Running ./build/perfs/perf.out -Run on (4 X 1800 MHz CPU s) -CPU Caches: - L1 Data 32 KiB (x4) - L1 Instruction 48 KiB (x4) - L2 Unified 1024 KiB (x1) -Load Average: 0.59, 0.74, 1.06 -------------------------------------------------------------------------------------------------------------- -Benchmark Time CPU Iterations CYCLES CYCLES/ BYTE bytes_per_second -------------------------------------------------------------------------------------------------------------- -sha3_384/256_mean 2809 ns 2809 ns 10 5.04865k 16.6074 103.22Mi/s -sha3_384/256_median 2809 ns 2809 ns 10 5.04856k 16.6071 103.221Mi/s -sha3_384/256_stddev 0.443 ns 0.294 ns 10 0.230906 759.558u 11.0744Ki/s -sha3_384/256_cv 0.02 % 0.01 % 10 0.00% 0.00% 0.01% -sha3_384/256_min 2808 ns 2808 ns 10 5.04844k 16.6067 103.202Mi/s -sha3_384/256_max 2809 ns 2809 ns 10 5.04919k 16.6092 103.238Mi/s -sha3_384/4096_mean 35057 ns 35057 ns 10 63.0092k 15.2049 112.733Mi/s -sha3_384/4096_median 35056 ns 35056 ns 10 63.009k 15.2049 112.735Mi/s -sha3_384/4096_stddev 7.12 ns 4.96 ns 10 2.59006 625.015u 16.3467Ki/s -sha3_384/4096_cv 0.02 % 0.01 % 10 0.00% 0.00% 0.01% -sha3_384/4096_min 35045 ns 35049 ns 10 63.0054k 15.204 112.707Mi/s -sha3_384/4096_max 35069 ns 35065 ns 10 63.0137k 15.206 112.757Mi/s -sha3_512/256_mean 3665 ns 3665 ns 10 6.58859k 20.5893 83.2633Mi/s -sha3_512/256_median 3665 ns 3665 ns 10 6.58842k 20.5888 83.2666Mi/s -sha3_512/256_stddev 0.699 ns 0.691 ns 10 1.39233 4.35103m 16.0704Ki/s -sha3_512/256_cv 0.02 % 0.02 % 10 0.02% 0.02% 0.02% -sha3_512/256_min 3664 ns 3664 ns 10 6.58654k 20.5829 83.2405Mi/s -sha3_512/256_max 3666 ns 3666 ns 10 6.59106k 20.5971 83.285Mi/s -sha3_512/64_mean 1044 ns 1044 ns 10 1.87614k 14.6573 116.958Mi/s -sha3_512/64_median 1044 ns 1044 ns 10 1.87613k 14.6573 116.958Mi/s -sha3_512/64_stddev 0.153 ns 0.087 ns 10 0.0163249 127.538u 9.93599Ki/s -sha3_512/64_cv 0.01 % 0.01 % 10 0.00% 0.00% 0.01% -sha3_512/64_min 1043 ns 1044 ns 10 1.87612k 14.6572 116.941Mi/s -sha3_512/64_max 1044 ns 1044 ns 10 1.87617k 14.6576 116.973Mi/s -sha3_224/64_mean 1116 ns 1116 ns 10 2.00537k 21.7975 78.6454Mi/s -sha3_224/64_median 1116 ns 1116 ns 10 2.0053k 21.7968 78.6396Mi/s -sha3_224/64_stddev 0.522 ns 0.476 ns 10 0.876682 9.52915m 34.3417Ki/s -sha3_224/64_cv 0.05 % 0.04 % 10 0.04% 0.04% 0.04% -sha3_224/64_min 1115 ns 1115 ns 10 2.00457k 21.7888 78.5768Mi/s -sha3_224/64_max 1116 ns 1117 ns 10 2.00743k 21.8199 78.6826Mi/s -shake128/256/64_mean 2065 ns 2065 ns 10 3.71232k 11.601 147.754Mi/s -shake128/256/64_median 2065 ns 2065 ns 10 3.71231k 11.601 147.759Mi/s -shake128/256/64_stddev 0.346 ns 0.259 ns 10 0.05968 186.5u 18.9387Ki/s -shake128/256/64_cv 0.02 % 0.01 % 10 0.00% 0.00% 0.01% -shake128/256/64_min 2065 ns 2065 ns 10 3.71223k 11.6007 147.714Mi/s -shake128/256/64_max 2066 ns 2066 ns 10 3.71243k 11.6013 147.775Mi/s -shake256/1024/64_mean 7317 ns 7317 ns 10 13.1525k 12.0887 141.804Mi/s -shake256/1024/64_median 7316 ns 7317 ns 10 13.1524k 12.0886 141.807Mi/s -shake256/1024/64_stddev 1.39 ns 0.839 ns 10 0.780465 717.339u 16.6491Ki/s -shake256/1024/64_cv 0.02 % 0.01 % 10 0.01% 0.01% 0.01% -shake256/1024/64_min 7315 ns 7316 ns 10 13.1515k 12.0877 141.786Mi/s -shake256/1024/64_max 7319 ns 7318 ns 10 13.1539k 12.09 141.833Mi/s -shake256/64/64_mean 1136 ns 1136 ns 10 2.04103k 15.9455 107.497Mi/s -shake256/64/64_median 1135 ns 1135 ns 10 2.04083k 15.944 107.514Mi/s -shake256/64/64_stddev 0.444 ns 0.405 ns 10 0.470208 3.6735m 39.2242Ki/s -shake256/64/64_cv 0.04 % 0.04 % 10 0.02% 0.02% 0.04% -shake256/64/64_min 1135 ns 1135 ns 10 2.04057k 15.942 107.411Mi/s -shake256/64/64_max 1137 ns 1136 ns 10 2.0421k 15.9539 107.53Mi/s -sha3_512/16384_mean 198486 ns 198488 ns 10 356.755k 21.6899 79.0278Mi/s -sha3_512/16384_median 198490 ns 198484 ns 10 356.73k 21.6883 79.0292Mi/s -sha3_512/16384_stddev 87.8 ns 86.8 ns 10 155.444 9.45064m 35.3845Ki/s -sha3_512/16384_cv 0.04 % 0.04 % 10 0.04% 0.04% 0.04% -sha3_512/16384_min 198380 ns 198386 ns 10 356.604k 21.6807 78.9526Mi/s -sha3_512/16384_max 198655 ns 198677 ns 10 357.142k 21.7134 79.0683Mi/s -sha3_224/256_mean 2017 ns 2016 ns 10 3.62396k 12.7604 134.316Mi/s -sha3_224/256_median 2016 ns 2016 ns 10 3.62407k 12.7608 134.32Mi/s -sha3_224/256_stddev 1.32 ns 1.14 ns 10 1.49815 5.27519m 78.095Ki/s -sha3_224/256_cv 0.07 % 0.06 % 10 0.04% 0.04% 0.06% -sha3_224/256_min 2014 ns 2015 ns 10 3.62128k 12.751 134.183Mi/s -sha3_224/256_max 2019 ns 2018 ns 10 3.62651k 12.7694 134.443Mi/s -shake256/256/64_mean 2027 ns 2027 ns 10 3.64366k 11.3864 150.534Mi/s -shake256/256/64_median 2027 ns 2027 ns 10 3.64369k 11.3865 150.531Mi/s -shake256/256/64_stddev 0.573 ns 0.508 ns 10 0.670622 2.09569m 38.647Ki/s -shake256/256/64_cv 0.03 % 0.03 % 10 0.02% 0.02% 0.03% -shake256/256/64_min 2026 ns 2027 ns 10 3.64274k 11.3836 150.479Mi/s -shake256/256/64_max 2028 ns 2028 ns 10 3.64468k 11.3896 150.587Mi/s -shake128/4096/64_mean 22446 ns 22446 ns 10 40.3432k 9.69789 176.746Mi/s -shake128/4096/64_median 22446 ns 22446 ns 10 40.3431k 9.69786 176.745Mi/s -shake128/4096/64_stddev 5.63 ns 3.78 ns 10 1.29789 311.993u 30.4457Ki/s -shake128/4096/64_cv 0.03 % 0.02 % 10 0.00% 0.00% 0.02% -shake128/4096/64_min 22437 ns 22440 ns 10 40.3411k 9.69739 176.695Mi/s -shake128/4096/64_max 22454 ns 22453 ns 10 40.345k 9.69831 176.798Mi/s -sha3_224/4096_mean 25960 ns 25961 ns 10 46.6643k 11.3153 151.496Mi/s -sha3_224/4096_median 25961 ns 25961 ns 10 46.6632k 11.315 151.495Mi/s -sha3_224/4096_stddev 3.64 ns 2.81 ns 10 4.74013 1.1494m 16.7751Ki/s -sha3_224/4096_cv 0.01 % 0.01 % 10 0.01% 0.01% 0.01% -sha3_224/4096_min 25955 ns 25957 ns 10 46.6591k 11.314 151.464Mi/s -sha3_224/4096_max 25966 ns 25966 ns 10 46.6757k 11.3181 151.516Mi/s -sha3_384/1024_mean 8920 ns 8921 ns 10 16.035k 14.958 114.601Mi/s -sha3_384/1024_median 8920 ns 8920 ns 10 16.0346k 14.9577 114.607Mi/s -sha3_384/1024_stddev 2.74 ns 2.41 ns 10 1.37496 1.28261m 31.6902Ki/s -sha3_384/1024_cv 0.03 % 0.03 % 10 0.01% 0.01% 0.03% -sha3_384/1024_min 8918 ns 8919 ns 10 16.0336k 14.9568 114.516Mi/s -sha3_384/1024_max 8928 ns 8927 ns 10 16.0383k 14.9611 114.624Mi/s -sha3_384/16384_mean 138096 ns 138094 ns 10 248.196k 15.1044 113.479Mi/s -sha3_384/16384_median 138136 ns 138125 ns 10 248.218k 15.1058 113.453Mi/s -sha3_384/16384_stddev 174 ns 177 ns 10 334.625 0.0203642 148.935Ki/s -sha3_384/16384_cv 0.13 % 0.13 % 10 0.13% 0.13% 0.13% -sha3_384/16384_min 137890 ns 137893 ns 10 247.834k 15.0824 113.199Mi/s -sha3_384/16384_max 138420 ns 138435 ns 10 248.857k 15.1446 113.644Mi/s -sha3_384/64_mean 1060 ns 1060 ns 10 1.90527k 17.0114 100.768Mi/s -sha3_384/64_median 1060 ns 1060 ns 10 1.90537k 17.0123 100.775Mi/s -sha3_384/64_stddev 0.320 ns 0.336 ns 10 0.722997 6.45533m 32.7525Ki/s -sha3_384/64_cv 0.03 % 0.03 % 10 0.04% 0.04% 0.03% -sha3_384/64_min 1059 ns 1059 ns 10 1.9041k 17.0009 100.711Mi/s -sha3_384/64_max 1061 ns 1061 ns 10 1.90615k 17.0192 100.82Mi/s -sha3_512/4096_mean 49713 ns 49714 ns 10 89.3619k 21.4812 79.8016Mi/s -sha3_512/4096_median 49709 ns 49713 ns 10 89.362k 21.4813 79.8036Mi/s -sha3_512/4096_stddev 18.5 ns 16.0 ns 10 23.0994 5.55275m 26.2649Ki/s -sha3_512/4096_cv 0.04 % 0.03 % 10 0.03% 0.03% 0.03% -sha3_512/4096_min 49692 ns 49698 ns 10 89.3225k 21.4718 79.7405Mi/s -sha3_512/4096_max 49757 ns 49752 ns 10 89.4112k 21.4931 79.8279Mi/s -shake256/16384/64_mean 107051 ns 107054 ns 10 192.402k 11.6976 146.526Mi/s -shake256/16384/64_median 107085 ns 107083 ns 10 192.414k 11.6983 146.484Mi/s -shake256/16384/64_stddev 204 ns 201 ns 10 354.397 0.0215465 281.878Ki/s -shake256/16384/64_cv 0.19 % 0.19 % 10 0.18% 0.18% 0.19% -shake256/16384/64_min 106814 ns 106825 ns 10 192.022k 11.6745 146.204Mi/s -shake256/16384/64_max 107278 ns 107289 ns 10 192.818k 11.7229 146.838Mi/s -sha3_256/256_mean 2013 ns 2013 ns 10 3.61754k 12.5609 136.463Mi/s -sha3_256/256_median 2013 ns 2013 ns 10 3.61741k 12.5605 136.461Mi/s -sha3_256/256_stddev 0.419 ns 0.485 ns 10 0.982835 3.41262m 33.6599Ki/s -sha3_256/256_cv 0.02 % 0.02 % 10 0.03% 0.03% 0.02% -sha3_256/256_min 2012 ns 2012 ns 10 3.61602k 12.5556 136.405Mi/s -sha3_256/256_max 2013 ns 2014 ns 10 3.61951k 12.5677 136.521Mi/s -shake128/64/64_mean 1173 ns 1173 ns 10 2.10873k 16.4745 104.053Mi/s -shake128/64/64_median 1173 ns 1173 ns 10 2.1087k 16.4742 104.052Mi/s -shake128/64/64_stddev 0.223 ns 0.145 ns 10 0.0999248 780.663u 13.1417Ki/s -shake128/64/64_cv 0.02 % 0.01 % 10 0.00% 0.00% 0.01% -shake128/64/64_min 1173 ns 1173 ns 10 2.10862k 16.4736 104.033Mi/s -shake128/64/64_max 1173 ns 1173 ns 10 2.10895k 16.4762 104.072Mi/s -sha3_256/16384_mean 108442 ns 108447 ns 10 194.921k 11.8738 144.362Mi/s -sha3_256/16384_median 108380 ns 108382 ns 10 194.809k 11.867 144.448Mi/s -sha3_256/16384_stddev 311 ns 313 ns 10 564.025 0.0343582 425.739Ki/s -sha3_256/16384_cv 0.29 % 0.29 % 10 0.29% 0.29% 0.29% -sha3_256/16384_min 108049 ns 108061 ns 10 194.233k 11.8319 143.676Mi/s -sha3_256/16384_max 108964 ns 108964 ns 10 195.85k 11.9304 144.877Mi/s -shake128/16384/64_mean 87417 ns 87420 ns 10 157.108k 9.55182 179.434Mi/s -shake128/16384/64_median 87360 ns 87366 ns 10 157.032k 9.54721 179.544Mi/s -shake128/16384/64_stddev 148 ns 149 ns 10 250.579 0.0152346 312.577Ki/s -shake128/16384/64_cv 0.17 % 0.17 % 10 0.16% 0.16% 0.17% -shake128/16384/64_min 87169 ns 87162 ns 10 156.637k 9.52314 178.964Mi/s -shake128/16384/64_max 87651 ns 87649 ns 10 157.471k 9.57387 179.964Mi/s -sha3_256/64_mean 1112 ns 1112 ns 10 1.99811k 20.8136 82.3571Mi/s -sha3_256/64_median 1112 ns 1112 ns 10 1.99807k 20.8133 82.3575Mi/s -sha3_256/64_stddev 0.946 ns 0.937 ns 10 1.70455 0.0177557 71.0998Ki/s -sha3_256/64_cv 0.09 % 0.08 % 10 0.09% 0.09% 0.08% -sha3_256/64_min 1110 ns 1110 ns 10 1.99573k 20.7889 82.2608Mi/s -sha3_256/64_max 1113 ns 1113 ns 10 2.00053k 20.8389 82.4637Mi/s -sha3_512/1024_mean 13218 ns 13218 ns 10 23.7582k 21.8365 78.499Mi/s -sha3_512/1024_median 13219 ns 13219 ns 10 23.7595k 21.8378 78.4923Mi/s -sha3_512/1024_stddev 5.95 ns 5.35 ns 10 9.384 8.625m 32.5618Ki/s -sha3_512/1024_cv 0.05 % 0.04 % 10 0.04% 0.04% 0.04% -sha3_512/1024_min 13206 ns 13208 ns 10 23.7442k 21.8237 78.4465Mi/s -sha3_512/1024_max 13227 ns 13227 ns 10 23.7738k 21.8509 78.5595Mi/s -shake128/1024/64_mean 6500 ns 6500 ns 10 11.6832k 10.7382 159.624Mi/s -shake128/1024/64_median 6500 ns 6500 ns 10 11.6832k 10.7382 159.629Mi/s -shake128/1024/64_stddev 1.67 ns 1.11 ns 10 0.150961 138.751u 27.8682Ki/s -shake128/1024/64_cv 0.03 % 0.02 % 10 0.00% 0.00% 0.02% -shake128/1024/64_min 6498 ns 6499 ns 10 11.6829k 10.7379 159.562Mi/s -shake128/1024/64_max 6504 ns 6503 ns 10 11.6834k 10.7384 159.655Mi/s -shake256/4096/64_mean 27567 ns 27568 ns 10 49.5523k 11.9116 143.908Mi/s -shake256/4096/64_median 27565 ns 27567 ns 10 49.5523k 11.9116 143.913Mi/s -shake256/4096/64_stddev 5.84 ns 3.87 ns 10 1.24483 299.238u 20.6705Ki/s -shake256/4096/64_cv 0.02 % 0.01 % 10 0.00% 0.00% 0.01% -shake256/4096/64_min 27561 ns 27563 ns 10 49.5502k 11.9111 143.871Mi/s -shake256/4096/64_max 27580 ns 27575 ns 10 49.5539k 11.912 143.933Mi/s -sha3_256/4096_mean 27886 ns 27885 ns 10 50.1184k 12.1411 141.176Mi/s -sha3_256/4096_median 27890 ns 27888 ns 10 50.1157k 12.1404 141.163Mi/s -sha3_256/4096_stddev 21.3 ns 20.7 ns 10 36.7096 8.89282m 107.092Ki/s -sha3_256/4096_cv 0.08 % 0.07 % 10 0.07% 0.07% 0.07% -sha3_256/4096_min 27854 ns 27857 ns 10 50.0751k 12.1306 141.039Mi/s -sha3_256/4096_max 27915 ns 27913 ns 10 50.1666k 12.1528 141.319Mi/s -sha3_224/1024_mean 7334 ns 7334 ns 10 13.1817k 12.5301 136.794Mi/s -sha3_224/1024_median 7335 ns 7334 ns 10 13.1818k 12.5302 136.796Mi/s -sha3_224/1024_stddev 1.39 ns 0.948 ns 10 0.795119 755.817u 18.0968Ki/s -sha3_224/1024_cv 0.02 % 0.01 % 10 0.01% 0.01% 0.01% -sha3_224/1024_min 7332 ns 7333 ns 10 13.1806k 12.5291 136.77Mi/s -sha3_224/1024_max 7336 ns 7335 ns 10 13.1832k 12.5316 136.816Mi/s -keccak-p[1600, 24]_mean 862 ns 862 ns 10 1.54907k 7.74537 221.318Mi/s -keccak-p[1600, 24]_median 862 ns 862 ns 10 1.54908k 7.74541 221.322Mi/s -keccak-p[1600, 24]_stddev 0.200 ns 0.136 ns 10 0.016987 84.935u 35.8821Ki/s -keccak-p[1600, 24]_cv 0.02 % 0.02 % 10 0.00% 0.00% 0.02% -keccak-p[1600, 24]_min 861 ns 862 ns 10 1.54904k 7.74522 221.258Mi/s -keccak-p[1600, 24]_max 862 ns 862 ns 10 1.54909k 7.74546 221.375Mi/s -sha3_256/1024_mean 7366 ns 7366 ns 10 13.2407k 12.5385 136.712Mi/s -sha3_256/1024_median 7365 ns 7366 ns 10 13.2411k 12.5389 136.721Mi/s -sha3_256/1024_stddev 3.53 ns 3.43 ns 10 6.45902 6.1165m 65.257Ki/s -sha3_256/1024_cv 0.05 % 0.05 % 10 0.05% 0.05% 0.05% -sha3_256/1024_min 7361 ns 7362 ns 10 13.2305k 12.5289 136.62Mi/s -sha3_256/1024_max 7371 ns 7371 ns 10 13.2523k 12.5496 136.792Mi/s -sha3_224/16384_mean 101629 ns 101627 ns 10 182.654k 11.1293 154.011Mi/s -sha3_224/16384_median 101604 ns 101585 ns 10 182.538k 11.1222 154.075Mi/s -sha3_224/16384_stddev 177 ns 180 ns 10 324.501 0.0197722 279.456Ki/s -sha3_224/16384_cv 0.17 % 0.18 % 10 0.18% 0.18% 0.18% -sha3_224/16384_min 101395 ns 101407 ns 10 182.286k 11.1069 153.594Mi/s -sha3_224/16384_max 101893 ns 101903 ns 10 183.169k 11.1607 154.346Mi/s -``` +I maintain benchmark results in JSON format @ [bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14](./bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14.json). ## Usage @@ -758,8 +149,7 @@ As this library implements all Sha3 hash functions and xofs as `constexpr` - one ```cpp #include "sha3_256.hpp" -// Eval SHA3-256 hash on statically defined input message during -// compilation-time. +// Eval SHA3-256 hash on statically defined input message during compilation-time. constexpr std::array eval_sha3_256() { @@ -796,54 +186,43 @@ main() } ``` -I maintain examples of using Sha3 hash function and xof API, inside [examples](./examples/) directory. +I maintain examples of using Sha3 hash function and xof API, inside [examples](./examples/) directory. Run them all by issuing ```bash -$ g++ -std=c++20 -Wall -O3 -march=native -I include examples/sha3_224.cpp && ./a.out -SHA3-224 - -Input : 043f0fa310343b6ca42c3d2ab6f168574fd41774d49c9c1e5922c2cd60b43dbb -Output : 3bfbd5e41e850f29daf9c08dbcaca7c43ca939e7d6c0b6d8993c6af4 +make example -j +``` -# --- +```bash +SHA3-224 -$ g++ -std=c++20 -Wall -O3 -march=native -I include examples/sha3_256.cpp && ./a.out +Input : 2c85bd27e447424ffecd668a690d385304553230e898e50e1bbda2035a852a3c +Output : a39d989bab91337bcc2af474aa6235a3ab05680c0d4cd02e5243b7cd +--- --- --- SHA3-256 -Input : 70a3bf382218c7f4ae25775ab1d21f9d48e2f03af70dcdec790a338e982e6fa8 -Output : 57be0ef9634da2d94219c53032809f4ffc145df6782279a8059afe607715d675 - -# --- - -$ g++ -std=c++20 -Wall -O3 -march=native -I include examples/sha3_384.cpp && ./a.out +Input : 5753f01c245b2cc4417850703e6cbeed822870a2b8f8144c2c30b35d2f9be2db +Output : c54d90ded2536dce8a73d06f474cdfd3cf14ddaaf54c0c2598347304e5fcb208 +--- --- --- SHA3-384 -Input : 314686636dc0499f2ebf0a201fe2d44e2e8888ac1109939998230f2cba5d0e94 -Output : 554f4506a1b73724d0ce25cc4a0c0b4fc26478cde43013a59c7e25a22e3e73fbcfa731fe9f5050f77e82530fba7de512 - -# --- - -$ g++ -std=c++20 -Wall -O3 -march=native -I include examples/sha3_512.cpp && ./a.out +Input : 0633acdbe5f78361622e4fefa816a41af0705f0d6e5e14cf339127e035275e11 +Output : 18094d6c42a25e8f64357f834f8f7d64ac456b32fc1bc09fd3084565f7b4e9eae8ada85adb6be35f89effedcdf84831a +--- --- --- SHA3-512 -Input : 2c3c0ae485204067f1ecbc69a8fefd19a94c9c1552158a8d57a6612b3202f373 -Output : 578386bdd6eb816d6d0cbc984351c889f70675a2661ba605aa65ce204b88a6d6553946c52eeac937647929f99a2ddd7cc6645bc1e89df8ab795faba6dd7d0d45 - -# --- - -$ g++ -std=c++20 -Wall -O3 -march=native -I include examples/shake128.cpp && ./a.out +Input : 9c3679d1a7ba47a5fb7cd05fa60fe05939e6bf267b7e4b95c1b7a306ee83d5d0 +Output : 31e4c24bf38c287ba66f992b7bddebf99bfe6dca03830e9845880af5019a02aa32e1e5aef47cec902731d0b83815a5faed3ecabc44b68082bbd199a12b40579c +--- --- --- SHAKE-128 -Input : 8814e9f091cd4ee6ac6795be43b25b4d741143f4d7f7e9858731447359eaa1e8 -Output : d32991406e38740f9b9b2674e59259891bfd23f9d6ea71a816c3133466163dacb3b1cefc341cbda8 - -# --- - -$ g++ -std=c++20 -Wall -O3 -march=native -I include examples/shake256.cpp && ./a.out +Input : 09ad8b662f1e7c1fc151f2b896a33d22695a6e1e67e316bd4953c3475a8bd6b3 +Output : b7e3784fa89e4c9edd7eacd6e3ffa67c7032b22fbf31c58a7f0b268b0040c9099607a7ac68cc8722 +--- --- --- SHAKE-256 -Input : a6506638e34127e0a8415241479c968c20422f46497663eaf244f205a756f0b3 -Output : ce679163b642380365c3c11dcbca7a36ddd01cefba35b8ec18ad937268f584999c6e8ae061c251dd +Input : 5f6b6c5c905cca71d9f83cd90b7db3a4f4ca5303e97e25e343e2c829ae0ce7c3 +Output : be24aea2c7d7488d28d638ee46baba5474994171b6bc42fce59679f5578e57ac59f4521cbeb88bd5 +--- --- --- ``` > [!NOTE] From b1e55c0edcc281c8a8b3d703ed3df44ca8c94c5a Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 13:58:48 +0400 Subject: [PATCH 16/21] Add ability to generate help text for Makefile commands Signed-off-by: Anjan Roy --- Makefile | 19 +++++++++++++------ benches/bench.mk | 4 ++-- examples/example.mk | 2 +- tests/test.mk | 10 +++++----- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 6512728..e63caf1 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,12 @@ +.DEFAULT_GOAL := help + +.PHONY: help +help: + @for file in $(MAKEFILE_LIST); do \ + grep -E '^[a-zA-Z_-]+:.*?## .*$$' $${file} | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}';\ + done + + CXX ?= clang++ CXX_DEFS += CXX_FLAGS := -std=c++20 @@ -13,8 +22,6 @@ SRC_DIR := include SHA3_SOURCES := $(shell find $(SRC_DIR) -name '*.hpp') BUILD_DIR := build -all: test - include tests/test.mk include benches/bench.mk include examples/example.mk @@ -22,10 +29,10 @@ include examples/example.mk $(GTEST_PARALLEL): git submodule update --init gtest-parallel -.PHONY: format clean - -clean: +.PHONY: clean +clean: ## Remove build directory rm -rf $(BUILD_DIR) -format: $(SHA3_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) $(EXAMPLE_SOURCES) $(EXAMPLE_HEADERS) +.PHONY: format +format: $(SHA3_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) $(EXAMPLE_SOURCES) $(EXAMPLE_HEADERS) ## Format source code clang-format -i $^ diff --git a/benches/bench.mk b/benches/bench.mk index fef062f..ecf1c9c 100644 --- a/benches/bench.mk +++ b/benches/bench.mk @@ -24,7 +24,7 @@ $(BENCHMARK_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(BENCHMARK_BUILD_DIR) $(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS) $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@ -benchmark: $(BENCHMARK_BINARY) +benchmark: $(BENCHMARK_BINARY) ## Build and run all benchmarks, without libPFM -based CPU CYCLE counter statistics # Must *not* build google-benchmark with libPFM ./$< --benchmark_min_warmup_time=.05 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) @@ -34,6 +34,6 @@ $(PERF_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(PERF_BUILD_DIR) $(PERF_BINARY): $(PERF_OBJECTS) $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@ -perf: $(PERF_BINARY) +perf: $(PERF_BINARY) ## Build and run all benchmarks, while also collecting libPFM -based CPU CYCLE counter statistics # Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7 ./$< --benchmark_min_warmup_time=.05 --benchmark_enable_random_interleaving=false --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_report_aggregates_only=true --benchmark_counters_tabular=true --benchmark_perf_counters=CYCLES --benchmark_out_format=json --benchmark_out=$(BENCHMARK_OUT_FILE) diff --git a/examples/example.mk b/examples/example.mk index 5e58b24..a0387d4 100644 --- a/examples/example.mk +++ b/examples/example.mk @@ -11,5 +11,5 @@ $(EXAMPLE_BUILD_DIR): $(EXAMPLE_BUILD_DIR)/%.exe: $(EXAMPLE_DIR)/%.cpp $(EXAMPLE_BUILD_DIR) $(CXX) $(CXX_DEFS) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $< -o $@ -example: $(EXAMPLE_EXECS) +example: $(EXAMPLE_EXECS) ## Build and run all example programs, demonstrating usage of SHA3 API $(foreach exec,$^,./$(exec); echo "--- --- ---";) diff --git a/tests/test.mk b/tests/test.mk index 2e421a3..d234e30 100644 --- a/tests/test.mk +++ b/tests/test.mk @@ -75,17 +75,17 @@ $(DEBUG_UBSAN_TEST_BINARY): $(DEBUG_UBSAN_TEST_OBJECTS) $(RELEASE_UBSAN_TEST_BINARY): $(RELEASE_UBSAN_TEST_OBJECTS) $(CXX) $(RELEASE_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ -test: $(TEST_BINARY) $(GTEST_PARALLEL) +test: $(TEST_BINARY) $(GTEST_PARALLEL) ## Build and run all tests in RELEASE mode $(GTEST_PARALLEL) $< --print_test_times -debug_asan_test: $(DEBUG_ASAN_TEST_BINARY) $(GTEST_PARALLEL) +debug_asan_test: $(DEBUG_ASAN_TEST_BINARY) $(GTEST_PARALLEL) ## Build and run all tests in DEBUG mode, with Address Sanitizer $(GTEST_PARALLEL) $< --print_test_times -release_asan_test: $(RELEASE_ASAN_TEST_BINARY) $(GTEST_PARALLEL) +release_asan_test: $(RELEASE_ASAN_TEST_BINARY) $(GTEST_PARALLEL) ## Build and run all tests in RELEASE mode, with Address Sanitizer $(GTEST_PARALLEL) $< --print_test_times -debug_ubsan_test: $(DEBUG_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) +debug_ubsan_test: $(DEBUG_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) ## Build and run all tests in DEBUG mode, with Undefined Behavior Sanitizer $(GTEST_PARALLEL) $< --print_test_times -release_ubsan_test: $(RELEASE_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) +release_ubsan_test: $(RELEASE_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) ## Build and run all tests in RELEASE mode, with Undefined Behavior Sanitizer $(GTEST_PARALLEL) $< --print_test_times From a412bbacf83174b91dd353b1697919bfed1abb51 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 13:59:32 +0400 Subject: [PATCH 17/21] Mention all new Makefile targets in README file Signed-off-by: Anjan Roy --- README.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 54e84c0..76bb647 100644 --- a/README.md +++ b/README.md @@ -77,11 +77,19 @@ Some compile-time executed tests ( using `static_assert` ) are also implemented, Issue following command for running all the test cases. ```bash -make -j # Run tests without any sort of sanitizers -make asan_test -j # Run tests with AddressSanitizer enabled -make ubsan_test -j # Run tests with UndefinedBehaviourSanitizer enabled - -CXX=clang++ make -j # Specify which compiler to use +# Shows help message - which targets are available and what do each of them do +make +# or +make help + +make test -j +make debug_asan_test -j +make debug_ubsan_test -j +make release_asan_test -j +make release_ubsan_test -j + +# Specify which compiler to use +CXX=clang++ make test -j ``` ```bash From dfdb203f6c5b340074b9a7b2b2505bbc0c786f5b Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 14:01:05 +0400 Subject: [PATCH 18/21] Use correct command to run tests on Github Actions CI Signed-off-by: Anjan Roy --- .github/workflows/test_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_ci.yml b/.github/workflows/test_ci.yml index 3c5a051..e06d784 100644 --- a/.github/workflows/test_ci.yml +++ b/.github/workflows/test_ci.yml @@ -35,7 +35,7 @@ jobs: - name: Execute Tests on ${{matrix.os}}, compiled with ${{matrix.compiler}} if: ${{matrix.test_type == 'standard'}} run: | - CXX=${{matrix.compiler}} make -j + CXX=${{matrix.compiler}} make test -j make clean - name: Execute Tests with ${{matrix.test_type}}, in ${{matrix.build_type}} mode, on ${{matrix.os}}, compiled with ${{matrix.compiler}} From 8ead77edaa1f424831344b26b59597dfc45300f9 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 14:08:15 +0400 Subject: [PATCH 19/21] Add link to source of inspiration for Makefile target documentation Signed-off-by: Anjan Roy --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e63caf1..8445dd9 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,9 @@ .DEFAULT_GOAL := help +# Collects inspiration from https://github.com/0xPolygonMiden/crypto/blob/3909b0199368b13fdfa934a324f984572d521e39/Makefile#L1-L5 +# and https://github.com/gtramontina/sourcing/blob/853252ee184c16bc69dd53e8457107d718aca04f/Makefile#L68-L72 .PHONY: help -help: +help: @for file in $(MAKEFILE_LIST); do \ grep -E '^[a-zA-Z_-]+:.*?## .*$$' $${file} | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}';\ done From c82d3e78f7c03c78e76595e80b8396571d1b16f9 Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 14:13:37 +0400 Subject: [PATCH 20/21] Remove unnecessary backtick Signed-off-by: Anjan Roy --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76bb647..737328b 100644 --- a/README.md +++ b/README.md @@ -234,4 +234,4 @@ Output : be24aea2c7d7488d28d638ee46baba5474994171b6bc42fce59679f5578e57ac59f4521 ``` > [!NOTE] -> This library doesn't expose any raw pointer + length -based interfaces, rather everything is wrapped under much safer `std::span`` - which one can easily create from `std::{array, vector}` or even raw pointers and length pair. See https://en.cppreference.com/w/cpp/container/span. I made this choice because this gives us much better type safety and compile-time error reporting. +> This library doesn't expose any raw pointer + length -based interfaces, rather everything is wrapped under much safer `std::span` - which one can easily create from `std::{array, vector}` or even raw pointers and length pair. See https://en.cppreference.com/w/cpp/container/span. I made this choice because this gives us much better type safety and compile-time error reporting. From 5296725250f317e4bdf89dbc7430b04b6eddc6ff Mon Sep 17 00:00:00 2001 From: Anjan Roy Date: Mon, 4 Nov 2024 15:14:30 +0400 Subject: [PATCH 21/21] Add benchmark results in JSON format for more targets Signed-off-by: Anjan Roy --- README.md | 15 + ...n_Darwin_24.1.0_arm64_with_c++_16.0.0.json | 3012 ++++++++++++++++ ...ux_6.8.0-1016-aws_aarch64_with_g++_13.json | 3018 +++++++++++++++++ 3 files changed, 6045 insertions(+) create mode 100644 bench_result_on_Darwin_24.1.0_arm64_with_c++_16.0.0.json create mode 100644 bench_result_on_Linux_6.8.0-1016-aws_aarch64_with_g++_13.json diff --git a/README.md b/README.md index 737328b..cdc4ea4 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,21 @@ Compiled with `g++ (Ubuntu 14.2.0-4ubuntu2) 14.2.0` while running on `Linux 6.11 I maintain benchmark results in JSON format @ [bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14](./bench_result_on_Linux_6.11.0-9-generic_x86_64_with_g++_14.json). +### On Apple M1 Max + +Compiled with `Apple Clang version 16.0.0` while running kernel `Darwin 24.1.0 arm64`. + +Maintaining benchmark results in JSON format @ [bench_result_on_Darwin_24.1.0_arm64_with_c++_16.0.0](./bench_result_on_Darwin_24.1.0_arm64_with_c++_16.0.0.json). + +### On AWS EC2 Instance `c8g.medium` i.e. ARM Neoverse-V2 + +Compiled with `g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0 ` while running on `Linux 6.8.0-1016-aws aarch64`. + +I maintain benchmark results in JSON format @ [bench_result_on_Linux_6.8.0-1016-aws_aarch64_with_g++_13](./bench_result_on_Linux_6.8.0-1016-aws_aarch64_with_g++_13.json). + +> [!NOTE] +> More about AWS EC2 instances @ https://aws.amazon.com/ec2/instance-types/c8g. + ## Usage `sha3` - C++ header-only library is written such that it's fairly easy for one to start using it in their project. All one needs to do diff --git a/bench_result_on_Darwin_24.1.0_arm64_with_c++_16.0.0.json b/bench_result_on_Darwin_24.1.0_arm64_with_c++_16.0.0.json new file mode 100644 index 0000000..457513b --- /dev/null +++ b/bench_result_on_Darwin_24.1.0_arm64_with_c++_16.0.0.json @@ -0,0 +1,3012 @@ +{ + "context": { + "date": "2024-11-04T14:49:06+04:00", + "host_name": "m1-mac.local", + "executable": "./build/benchmark/bench.out", + "num_cpus": 10, + "mhz_per_cpu": 24, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 65536, + "num_sharing": 0 + }, + { + "type": "Instruction", + "level": 1, + "size": 131072, + "num_sharing": 0 + }, + { + "type": "Unified", + "level": 2, + "size": 4194304, + "num_sharing": 1 + } + ], + "load_avg": [2.73828,2.95703,2.44678], + "library_version": "v1.8.4-15-g65668db2", + "library_build_type": "release", + "json_schema_version": 1 + }, + "benchmarks": [ + { + "name": "sha3_224/64_mean", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2489539534374435e+02, + "cpu_time": 2.2488054132189731e+02, + "time_unit": "ns", + "bytes_per_second": 4.0910989169077373e+08 + }, + { + "name": "sha3_224/64_median", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2468403200425328e+02, + "cpu_time": 2.2464794707160141e+02, + "time_unit": "ns", + "bytes_per_second": 4.0952967239379442e+08 + }, + { + "name": "sha3_224/64_stddev", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.2989692698724606e-01, + "cpu_time": 7.2484616215218400e-01, + "time_unit": "ns", + "bytes_per_second": 1.3089448549966582e+06 + }, + { + "name": "sha3_224/64_cv", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.2454952039886161e-03, + "cpu_time": 3.2232498102831783e-03, + "time_unit": "ns", + "bytes_per_second": 3.1994945162216364e-03 + }, + { + "name": "sha3_224/64_min", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2444691391347669e+02, + "cpu_time": 2.2444624799701637e+02, + "time_unit": "ns", + "bytes_per_second": 4.0548167380429888e+08 + }, + { + "name": "sha3_224/64_max", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2691746191862757e+02, + "cpu_time": 2.2689064868663522e+02, + "time_unit": "ns", + "bytes_per_second": 4.0989769631267333e+08 + }, + { + "name": "sha3_224/256_mean", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4408685524527709e+02, + "cpu_time": 4.4407979673339634e+02, + "time_unit": "ns", + "bytes_per_second": 6.3954714053090799e+08 + }, + { + "name": "sha3_224/256_median", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4304022824844367e+02, + "cpu_time": 4.4304221080979886e+02, + "time_unit": "ns", + "bytes_per_second": 6.4102261498691475e+08 + }, + { + "name": "sha3_224/256_stddev", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.7923847299086599e+00, + "cpu_time": 2.7902243910772278e+00, + "time_unit": "ns", + "bytes_per_second": 3.9679481050817971e+06 + }, + { + "name": "sha3_224/256_cv", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 6.2879247537429945e-03, + "cpu_time": 6.2831599446807112e-03, + "time_unit": "ns", + "bytes_per_second": 6.2043090393428700e-03 + }, + { + "name": "sha3_224/256_min", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4227483501686481e+02, + "cpu_time": 4.4227615455621105e+02, + "time_unit": "ns", + "bytes_per_second": 6.2893851200887954e+08 + }, + { + "name": "sha3_224/256_max", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.5155434566335998e+02, + "cpu_time": 4.5155447564004533e+02, + "time_unit": "ns", + "bytes_per_second": 6.4213274234730422e+08 + }, + { + "name": "sha3_224/1024_mean", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7092493633189515e+03, + "cpu_time": 1.7092379855974148e+03, + "time_unit": "ns", + "bytes_per_second": 6.1548078019845223e+08 + }, + { + "name": "sha3_224/1024_median", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7086127223386284e+03, + "cpu_time": 1.7086170577573150e+03, + "time_unit": "ns", + "bytes_per_second": 6.1570327651700592e+08 + }, + { + "name": "sha3_224/1024_stddev", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1099402264237646e+00, + "cpu_time": 3.1076970532615658e+00, + "time_unit": "ns", + "bytes_per_second": 1.1186997451446329e+06 + }, + { + "name": "sha3_224/1024_cv", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.8194771887379895e-03, + "cpu_time": 1.8181769182805520e-03, + "time_unit": "ns", + "bytes_per_second": 1.8176030529887960e-03 + }, + { + "name": "sha3_224/1024_min", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7054690395776204e+03, + "cpu_time": 1.7054695537157736e+03, + "time_unit": "ns", + "bytes_per_second": 6.1382829538795412e+08 + }, + { + "name": "sha3_224/1024_max", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7138312595604380e+03, + "cpu_time": 1.7138343212658692e+03, + "time_unit": "ns", + "bytes_per_second": 6.1683892140317965e+08 + }, + { + "name": "sha3_224/4096_mean", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.2311687430248703e+03, + "cpu_time": 6.2309868508434138e+03, + "time_unit": "ns", + "bytes_per_second": 6.6188282670052159e+08 + }, + { + "name": "sha3_224/4096_median", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.2202142367375545e+03, + "cpu_time": 6.2202151680170282e+03, + "time_unit": "ns", + "bytes_per_second": 6.6300041143575478e+08 + }, + { + "name": "sha3_224/4096_stddev", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4386676965717029e+01, + "cpu_time": 4.4042511263698941e+01, + "time_unit": "ns", + "bytes_per_second": 4.6216614514638204e+06 + }, + { + "name": "sha3_224/4096_cv", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 7.1233309185220152e-03, + "cpu_time": 7.0683043180772304e-03, + "time_unit": "ns", + "bytes_per_second": 6.9825976215499514e-03 + }, + { + "name": "sha3_224/4096_min", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.1925979100521363e+03, + "cpu_time": 6.1925886571921701e+03, + "time_unit": "ns", + "bytes_per_second": 6.5004457905314732e+08 + }, + { + "name": "sha3_224/4096_max", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.3453147835140890e+03, + "cpu_time": 6.3441802806924470e+03, + "time_unit": "ns", + "bytes_per_second": 6.6595736101578796e+08 + }, + { + "name": "sha3_224/16384_mean", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4476433905769598e+04, + "cpu_time": 2.4476339754816090e+04, + "time_unit": "ns", + "bytes_per_second": 6.7052940059717846e+08 + }, + { + "name": "sha3_224/16384_median", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4448507795707304e+04, + "cpu_time": 2.4448423817863360e+04, + "time_unit": "ns", + "bytes_per_second": 6.7129075987193990e+08 + }, + { + "name": "sha3_224/16384_stddev", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.5561829397906223e+01, + "cpu_time": 6.5500136309241526e+01, + "time_unit": "ns", + "bytes_per_second": 1.7883750157851246e+06 + }, + { + "name": "sha3_224/16384_cv", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.6785695028249991e-03, + "cpu_time": 2.6760592868610334e-03, + "time_unit": "ns", + "bytes_per_second": 2.6671090248874762e-03 + }, + { + "name": "sha3_224/16384_min", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4421344135664469e+04, + "cpu_time": 2.4421366024518462e+04, + "time_unit": "ns", + "bytes_per_second": 6.6644279456107593e+08 + }, + { + "name": "sha3_224/16384_max", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4626379163492140e+04, + "cpu_time": 2.4626269702276641e+04, + "time_unit": "ns", + "bytes_per_second": 6.7203447929664338e+08 + }, + { + "name": "sha3_256/64_mean", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3852483954264181e+02, + "cpu_time": 2.3852343713769886e+02, + "time_unit": "ns", + "bytes_per_second": 4.0247752000760716e+08 + }, + { + "name": "sha3_256/64_median", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3843808839612217e+02, + "cpu_time": 2.3843343633044023e+02, + "time_unit": "ns", + "bytes_per_second": 4.0262810916556096e+08 + }, + { + "name": "sha3_256/64_stddev", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6012104663902242e-01, + "cpu_time": 4.6030819045527521e-01, + "time_unit": "ns", + "bytes_per_second": 7.7591377241432073e+05 + }, + { + "name": "sha3_256/64_cv", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.9290278007157626e-03, + "cpu_time": 1.9298237354744331e-03, + "time_unit": "ns", + "bytes_per_second": 1.9278437523657353e-03 + }, + { + "name": "sha3_256/64_min", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3790048725996286e+02, + "cpu_time": 2.3790098880657615e+02, + "time_unit": "ns", + "bytes_per_second": 4.0095863642233056e+08 + }, + { + "name": "sha3_256/64_max", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3942576387899831e+02, + "cpu_time": 2.3942619332654303e+02, + "time_unit": "ns", + "bytes_per_second": 4.0352921810700065e+08 + }, + { + "name": "sha3_256/256_mean", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6207689914612763e+02, + "cpu_time": 4.6204973550205193e+02, + "time_unit": "ns", + "bytes_per_second": 6.2332224676590538e+08 + }, + { + "name": "sha3_256/256_median", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6136016045017107e+02, + "cpu_time": 4.6133550864356414e+02, + "time_unit": "ns", + "bytes_per_second": 6.2427455095164919e+08 + }, + { + "name": "sha3_256/256_stddev", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2108241183507480e+00, + "cpu_time": 2.2106468359729630e+00, + "time_unit": "ns", + "bytes_per_second": 2.9550439310289640e+06 + }, + { + "name": "sha3_256/256_cv", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.7845372110922055e-03, + "cpu_time": 4.7844348045582756e-03, + "time_unit": "ns", + "bytes_per_second": 4.7407965083247844e-03 + }, + { + "name": "sha3_256/256_min", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6044959372541496e+02, + "cpu_time": 4.6045055289134660e+02, + "time_unit": "ns", + "bytes_per_second": 6.1556469792606008e+08 + }, + { + "name": "sha3_256/256_max", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6786569769101288e+02, + "cpu_time": 4.6786308729256223e+02, + "time_unit": "ns", + "bytes_per_second": 6.2547432768087018e+08 + }, + { + "name": "sha3_256/1024_mean", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7459579708244032e+03, + "cpu_time": 1.7458093766621864e+03, + "time_unit": "ns", + "bytes_per_second": 6.0488477387536073e+08 + }, + { + "name": "sha3_256/1024_median", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7448271570866357e+03, + "cpu_time": 1.7447379752285729e+03, + "time_unit": "ns", + "bytes_per_second": 6.0524937572666621e+08 + }, + { + "name": "sha3_256/1024_stddev", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6386950399802824e+00, + "cpu_time": 6.5995004683473724e+00, + "time_unit": "ns", + "bytes_per_second": 2.2746102935726522e+06 + }, + { + "name": "sha3_256/1024_cv", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8023223645215448e-03, + "cpu_time": 3.7801953389464318e-03, + "time_unit": "ns", + "bytes_per_second": 3.7604026284208405e-03 + }, + { + "name": "sha3_256/1024_min", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7392469411828388e+03, + "cpu_time": 1.7392543248651277e+03, + "time_unit": "ns", + "bytes_per_second": 5.9932776056752872e+08 + }, + { + "name": "sha3_256/1024_max", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7619778119481093e+03, + "cpu_time": 1.7619741141308539e+03, + "time_unit": "ns", + "bytes_per_second": 6.0715674809771633e+08 + }, + { + "name": "sha3_256/4096_mean", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.7056755596867833e+03, + "cpu_time": 6.7055452070497295e+03, + "time_unit": "ns", + "bytes_per_second": 6.1561153500049376e+08 + }, + { + "name": "sha3_256/4096_median", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.7041810198185294e+03, + "cpu_time": 6.7041839805129521e+03, + "time_unit": "ns", + "bytes_per_second": 6.1573489700399947e+08 + }, + { + "name": "sha3_256/4096_stddev", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1597924199779550e+01, + "cpu_time": 1.1527786847351726e+01, + "time_unit": "ns", + "bytes_per_second": 1.0581136932653105e+06 + }, + { + "name": "sha3_256/4096_cv", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.7295683479684010e-03, + "cpu_time": 1.7191423652221799e-03, + "time_unit": "ns", + "bytes_per_second": 1.7188009533714501e-03 + }, + { + "name": "sha3_256/4096_min", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6888960694970083e+03, + "cpu_time": 6.6888761522663535e+03, + "time_unit": "ns", + "bytes_per_second": 6.1394378263186085e+08 + }, + { + "name": "sha3_256/4096_max", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.7244312445857167e+03, + "cpu_time": 6.7237426565410351e+03, + "time_unit": "ns", + "bytes_per_second": 6.1714403227533722e+08 + }, + { + "name": "sha3_256/16384_mean", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6338441300860293e+04, + "cpu_time": 2.6337664041994733e+04, + "time_unit": "ns", + "bytes_per_second": 6.2329366376281297e+08 + }, + { + "name": "sha3_256/16384_median", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6327365391310148e+04, + "cpu_time": 2.6326771653543117e+04, + "time_unit": "ns", + "bytes_per_second": 6.2354778041155863e+08 + }, + { + "name": "sha3_256/16384_stddev", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8214690563669222e+01, + "cpu_time": 6.8323395855220127e+01, + "time_unit": "ns", + "bytes_per_second": 1.6118790795783107e+06 + }, + { + "name": "sha3_256/16384_cv", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.5899289097810478e-03, + "cpu_time": 2.5941327122359914e-03, + "time_unit": "ns", + "bytes_per_second": 2.5860668466408353e-03 + }, + { + "name": "sha3_256/16384_min", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6253163658713147e+04, + "cpu_time": 2.6253093363329921e+04, + "time_unit": "ns", + "bytes_per_second": 6.1952867593994844e+08 + }, + { + "name": "sha3_256/16384_max", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6497445639326226e+04, + "cpu_time": 2.6497562804649286e+04, + "time_unit": "ns", + "bytes_per_second": 6.2529774197694051e+08 + }, + { + "name": "sha3_384/64_mean", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4086152568808120e+02, + "cpu_time": 2.4085916419479440e+02, + "time_unit": "ns", + "bytes_per_second": 4.6500336664684296e+08 + }, + { + "name": "sha3_384/64_median", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4086050903328788e+02, + "cpu_time": 2.4086036649565722e+02, + "time_unit": "ns", + "bytes_per_second": 4.6499971616553742e+08 + }, + { + "name": "sha3_384/64_stddev", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.3148001135779157e-01, + "cpu_time": 4.3066461403953660e-01, + "time_unit": "ns", + "bytes_per_second": 8.3137332837233169e+05 + }, + { + "name": "sha3_384/64_cv", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.7914027992854439e-03, + "cpu_time": 1.7880349933093573e-03, + "time_unit": "ns", + "bytes_per_second": 1.7878866864285232e-03 + }, + { + "name": "sha3_384/64_min", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4021978226996453e+02, + "cpu_time": 2.4022142946701965e+02, + "time_unit": "ns", + "bytes_per_second": 4.6368041413049632e+08 + }, + { + "name": "sha3_384/64_max", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4155147477948748e+02, + "cpu_time": 2.4154567798604313e+02, + "time_unit": "ns", + "bytes_per_second": 4.6623650624548727e+08 + }, + { + "name": "sha3_384/256_mean", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.7265619389317669e+02, + "cpu_time": 6.7261722921045896e+02, + "time_unit": "ns", + "bytes_per_second": 4.5197558401416636e+08 + }, + { + "name": "sha3_384/256_median", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.7169396857836932e+02, + "cpu_time": 6.7168878056721962e+02, + "time_unit": "ns", + "bytes_per_second": 4.5259059388699210e+08 + }, + { + "name": "sha3_384/256_stddev", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4004762941464657e+00, + "cpu_time": 3.3076634524131769e+00, + "time_unit": "ns", + "bytes_per_second": 2.2053413330205572e+06 + }, + { + "name": "sha3_384/256_cv", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 5.0552961899678703e-03, + "cpu_time": 4.9176014362519753e-03, + "time_unit": "ns", + "bytes_per_second": 4.8793373160427944e-03 + }, + { + "name": "sha3_384/256_min", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6966732436252084e+02, + "cpu_time": 6.6966572975870474e+02, + "time_unit": "ns", + "bytes_per_second": 4.4646539429825962e+08 + }, + { + "name": "sha3_384/256_max", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8122904290337738e+02, + "cpu_time": 6.8090383685350957e+02, + "time_unit": "ns", + "bytes_per_second": 4.5395782775017899e+08 + }, + { + "name": "sha3_384/1024_mean", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1472840602133247e+03, + "cpu_time": 2.1472159811698725e+03, + "time_unit": "ns", + "bytes_per_second": 4.9925239692304420e+08 + }, + { + "name": "sha3_384/1024_median", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1475964352772185e+03, + "cpu_time": 2.1473321411649872e+03, + "time_unit": "ns", + "bytes_per_second": 4.9922412403371823e+08 + }, + { + "name": "sha3_384/1024_stddev", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.6081992584842242e+00, + "cpu_time": 3.6097095271982282e+00, + "time_unit": "ns", + "bytes_per_second": 8.3888369889196602e+05 + }, + { + "name": "sha3_384/1024_cv", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.6803548842651784e-03, + "cpu_time": 1.6811115224801662e-03, + "time_unit": "ns", + "bytes_per_second": 1.6802797624250029e-03 + }, + { + "name": "sha3_384/1024_min", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1424660314210591e+03, + "cpu_time": 2.1424488361074450e+03, + "time_unit": "ns", + "bytes_per_second": 4.9783684565425414e+08 + }, + { + "name": "sha3_384/1024_max", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1533197304264513e+03, + "cpu_time": 2.1533159093340792e+03, + "time_unit": "ns", + "bytes_per_second": 5.0036200721959209e+08 + }, + { + "name": "sha3_384/4096_mean", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5162173863710523e+03, + "cpu_time": 8.5161614929560401e+03, + "time_unit": "ns", + "bytes_per_second": 4.8660528871118760e+08 + }, + { + "name": "sha3_384/4096_median", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5118237782660271e+03, + "cpu_time": 8.5118009391961205e+03, + "time_unit": "ns", + "bytes_per_second": 4.8685350076891643e+08 + }, + { + "name": "sha3_384/4096_stddev", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.3443769213192578e+01, + "cpu_time": 1.3390704254934050e+01, + "time_unit": "ns", + "bytes_per_second": 7.6520727779544226e+05 + }, + { + "name": "sha3_384/4096_cv", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.5786080372616304e-03, + "cpu_time": 1.5723873092366649e-03, + "time_unit": "ns", + "bytes_per_second": 1.5725420490643534e-03 + }, + { + "name": "sha3_384/4096_min", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.4947525756930590e+03, + "cpu_time": 8.4947246447521211e+03, + "time_unit": "ns", + "bytes_per_second": 4.8563911461795026e+08 + }, + { + "name": "sha3_384/4096_max", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5330700714850209e+03, + "cpu_time": 8.5330853204854866e+03, + "time_unit": "ns", + "bytes_per_second": 4.8783217506174076e+08 + }, + { + "name": "sha3_384/16384_mean", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.3890356061783634e+04, + "cpu_time": 3.3888579724171272e+04, + "time_unit": "ns", + "bytes_per_second": 4.8489251826630378e+08 + }, + { + "name": "sha3_384/16384_median", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.3827566656597483e+04, + "cpu_time": 3.3827486087587618e+04, + "time_unit": "ns", + "bytes_per_second": 4.8575882814035308e+08 + }, + { + "name": "sha3_384/16384_stddev", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.6033479326689655e+02, + "cpu_time": 1.5799071494431135e+02, + "time_unit": "ns", + "bytes_per_second": 2.2418088205375588e+06 + }, + { + "name": "sha3_384/16384_cv", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.7309857994586738e-03, + "cpu_time": 4.6620636282264545e-03, + "time_unit": "ns", + "bytes_per_second": 4.6233108082446295e-03 + }, + { + "name": "sha3_384/16384_min", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.3746300023067146e+04, + "cpu_time": 3.3746189208807744e+04, + "time_unit": "ns", + "bytes_per_second": 4.7907685579047191e+08 + }, + { + "name": "sha3_384/16384_max", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4306829178603512e+04, + "cpu_time": 3.4299298330509766e+04, + "time_unit": "ns", + "bytes_per_second": 4.8692905436893755e+08 + }, + { + "name": "sha3_512/64_mean", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3798388209202412e+02, + "cpu_time": 2.3797567713589723e+02, + "time_unit": "ns", + "bytes_per_second": 5.3787124470059919e+08 + }, + { + "name": "sha3_512/64_median", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3795463166001224e+02, + "cpu_time": 2.3795409985354763e+02, + "time_unit": "ns", + "bytes_per_second": 5.3791887830500555e+08 + }, + { + "name": "sha3_512/64_stddev", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.6474335983672418e-01, + "cpu_time": 3.6699226461355916e-01, + "time_unit": "ns", + "bytes_per_second": 8.2856717742270138e+05 + }, + { + "name": "sha3_512/64_cv", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.5326389192007735e-03, + "cpu_time": 1.5421419072335963e-03, + "time_unit": "ns", + "bytes_per_second": 1.5404563556542519e-03 + }, + { + "name": "sha3_512/64_min", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3751731617501750e+02, + "cpu_time": 2.3751660771141920e+02, + "time_unit": "ns", + "bytes_per_second": 5.3614836533397800e+08 + }, + { + "name": "sha3_512/64_max", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3874031146392531e+02, + "cpu_time": 2.3873988671077291e+02, + "time_unit": "ns", + "bytes_per_second": 5.3890968397257924e+08 + }, + { + "name": "sha3_512/256_mean", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.7824345812992783e+02, + "cpu_time": 8.7823579975028315e+02, + "time_unit": "ns", + "bytes_per_second": 3.6436831681907111e+08 + }, + { + "name": "sha3_512/256_median", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.7778446928027347e+02, + "cpu_time": 8.7775832752963345e+02, + "time_unit": "ns", + "bytes_per_second": 3.6456505700825649e+08 + }, + { + "name": "sha3_512/256_stddev", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.8670068010347876e+00, + "cpu_time": 1.8673070509809069e+00, + "time_unit": "ns", + "bytes_per_second": 7.7361985715064080e+05 + }, + { + "name": "sha3_512/256_cv", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.1258419675681565e-03, + "cpu_time": 2.1262023838152077e-03, + "time_unit": "ns", + "bytes_per_second": 2.1231809173320234e-03 + }, + { + "name": "sha3_512/256_min", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.7602217967359206e+02, + "cpu_time": 8.7602662801715871e+02, + "time_unit": "ns", + "bytes_per_second": 3.6305725410915732e+08 + }, + { + "name": "sha3_512/256_max", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.8140263887151286e+02, + "cpu_time": 8.8140368048888593e+02, + "time_unit": "ns", + "bytes_per_second": 3.6528569996131682e+08 + }, + { + "name": "sha3_512/1024_mean", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1742524433887552e+03, + "cpu_time": 3.1741791180344176e+03, + "time_unit": "ns", + "bytes_per_second": 3.4277019666044152e+08 + }, + { + "name": "sha3_512/1024_median", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1698050551890319e+03, + "cpu_time": 3.1697965393523746e+03, + "time_unit": "ns", + "bytes_per_second": 3.4323972193640208e+08 + }, + { + "name": "sha3_512/1024_stddev", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2118808781393154e+01, + "cpu_time": 1.2039474008735279e+01, + "time_unit": "ns", + "bytes_per_second": 1.2921037126450457e+06 + }, + { + "name": "sha3_512/1024_cv", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8178465630967287e-03, + "cpu_time": 3.7929409655339860e-03, + "time_unit": "ns", + "bytes_per_second": 3.7695917709118761e-03 + }, + { + "name": "sha3_512/1024_min", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.1650714603779261e+03, + "cpu_time": 3.1650846995776315e+03, + "time_unit": "ns", + "bytes_per_second": 3.3952440139173377e+08 + }, + { + "name": "sha3_512/1024_max", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.2047559151056203e+03, + "cpu_time": 3.2044824923929282e+03, + "time_unit": "ns", + "bytes_per_second": 3.4375067439591414e+08 + }, + { + "name": "sha3_512/4096_mean", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2025805377093047e+04, + "cpu_time": 1.2025246548323430e+04, + "time_unit": "ns", + "bytes_per_second": 3.4594003168995106e+08 + }, + { + "name": "sha3_512/4096_median", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2032069120904813e+04, + "cpu_time": 1.2031343795557763e+04, + "time_unit": "ns", + "bytes_per_second": 3.4576354188892865e+08 + }, + { + "name": "sha3_512/4096_stddev", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.3947528075746892e+01, + "cpu_time": 2.3389885746739161e+01, + "time_unit": "ns", + "bytes_per_second": 6.7322698721902107e+05 + }, + { + "name": "sha3_512/4096_cv", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.9913450554723375e-03, + "cpu_time": 1.9450649641774033e-03, + "time_unit": "ns", + "bytes_per_second": 1.9460800299122396e-03 + }, + { + "name": "sha3_512/4096_min", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1986950773588598e+04, + "cpu_time": 1.1986965097332841e+04, + "time_unit": "ns", + "bytes_per_second": 3.4493621741541350e+08 + }, + { + "name": "sha3_512/4096_max", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2060222108929458e+04, + "cpu_time": 1.2060200668896505e+04, + "time_unit": "ns", + "bytes_per_second": 3.4704364000572765e+08 + }, + { + "name": "sha3_512/16384_mean", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8137677220011043e+04, + "cpu_time": 4.8137735849056589e+04, + "time_unit": "ns", + "bytes_per_second": 3.4168755400167978e+08 + }, + { + "name": "sha3_512/16384_median", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8131639446175017e+04, + "cpu_time": 4.8131560891939444e+04, + "time_unit": "ns", + "bytes_per_second": 3.4173003681174105e+08 + }, + { + "name": "sha3_512/16384_stddev", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0120958067812259e+02, + "cpu_time": 1.0113486438808064e+02, + "time_unit": "ns", + "bytes_per_second": 7.1650964301489573e+05 + }, + { + "name": "sha3_512/16384_cv", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.1025023749182757e-03, + "cpu_time": 2.1009476786611825e-03, + "time_unit": "ns", + "bytes_per_second": 2.0969731985361496e-03 + }, + { + "name": "sha3_512/16384_min", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8001743749256915e+04, + "cpu_time": 4.8002058319039141e+04, + "time_unit": "ns", + "bytes_per_second": 3.4006128007262659e+08 + }, + { + "name": "sha3_512/16384_max", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8367910452129552e+04, + "cpu_time": 4.8367753001715493e+04, + "time_unit": "ns", + "bytes_per_second": 3.4265197318582898e+08 + }, + { + "name": "keccak-p[1600, 24]_mean", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0460051100334726e+02, + "cpu_time": 2.0459718273322429e+02, + "time_unit": "ns", + "bytes_per_second": 9.7753319096925640e+08 + }, + { + "name": "keccak-p[1600, 24]_median", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0464062012681447e+02, + "cpu_time": 2.0463727358616808e+02, + "time_unit": "ns", + "bytes_per_second": 9.7733906696818137e+08 + }, + { + "name": "keccak-p[1600, 24]_stddev", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.5540705322651767e-01, + "cpu_time": 3.5331730856683929e-01, + "time_unit": "ns", + "bytes_per_second": 1.6884440841016257e+06 + }, + { + "name": "keccak-p[1600, 24]_cv", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.7370780331076648e-03, + "cpu_time": 1.7268923444929945e-03, + "time_unit": "ns", + "bytes_per_second": 1.7272498772419971e-03 + }, + { + "name": "keccak-p[1600, 24]_min", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0413552327556943e+02, + "cpu_time": 2.0413466399592028e+02, + "time_unit": "ns", + "bytes_per_second": 9.7539302016314721e+08 + }, + { + "name": "keccak-p[1600, 24]_max", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0504948133124776e+02, + "cpu_time": 2.0504555175773902e+02, + "time_unit": "ns", + "bytes_per_second": 9.7974540964780521e+08 + }, + { + "name": "shake128/64/64_mean", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6076693761188068e+02, + "cpu_time": 2.6075351996546289e+02, + "time_unit": "ns", + "bytes_per_second": 4.9089328475288737e+08 + }, + { + "name": "shake128/64/64_median", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6035550307314867e+02, + "cpu_time": 2.6035515566779634e+02, + "time_unit": "ns", + "bytes_per_second": 4.9163614174306309e+08 + }, + { + "name": "shake128/64/64_stddev", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1479192728894465e+00, + "cpu_time": 1.1295660917940962e+00, + "time_unit": "ns", + "bytes_per_second": 2.1167829391350769e+06 + }, + { + "name": "shake128/64/64_cv", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.4020890201885267e-03, + "cpu_time": 4.3319303683559424e-03, + "time_unit": "ns", + "bytes_per_second": 4.3121040863303975e-03 + }, + { + "name": "shake128/64/64_min", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5965917618671870e+02, + "cpu_time": 2.5965940778978660e+02, + "time_unit": "ns", + "bytes_per_second": 4.8632520943330646e+08 + }, + { + "name": "shake128/64/64_max", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6323827752746899e+02, + "cpu_time": 2.6319836503880356e+02, + "time_unit": "ns", + "bytes_per_second": 4.9295344655343819e+08 + }, + { + "name": "shake128/256/64_mean", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8524663764027144e+02, + "cpu_time": 4.8523248776607591e+02, + "time_unit": "ns", + "bytes_per_second": 6.5947891538498652e+08 + }, + { + "name": "shake128/256/64_median", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8515314633944564e+02, + "cpu_time": 4.8515329148725203e+02, + "time_unit": "ns", + "bytes_per_second": 6.5958534365686107e+08 + }, + { + "name": "shake128/256/64_stddev", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.2199035114400001e-01, + "cpu_time": 6.9762251908048500e-01, + "time_unit": "ns", + "bytes_per_second": 9.4725288955191080e+05 + }, + { + "name": "shake128/256/64_cv", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.4878832641788114e-03, + "cpu_time": 1.4377077723963106e-03, + "time_unit": "ns", + "bytes_per_second": 1.4363656933579587e-03 + }, + { + "name": "shake128/256/64_min", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8425080319026381e+02, + "cpu_time": 4.8424893223357486e+02, + "time_unit": "ns", + "bytes_per_second": 6.5750200740426719e+08 + }, + { + "name": "shake128/256/64_max", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8679413465055313e+02, + "cpu_time": 4.8669052930091965e+02, + "time_unit": "ns", + "bytes_per_second": 6.6081715146797621e+08 + }, + { + "name": "shake128/1024/64_mean", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.5293702137652017e+03, + "cpu_time": 1.5293253566096669e+03, + "time_unit": "ns", + "bytes_per_second": 7.1142603472142708e+08 + }, + { + "name": "shake128/1024/64_median", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.5288595465329277e+03, + "cpu_time": 1.5288611374458715e+03, + "time_unit": "ns", + "bytes_per_second": 7.1164082481814134e+08 + }, + { + "name": "shake128/1024/64_stddev", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1480450087383818e+00, + "cpu_time": 2.1171131786951123e+00, + "time_unit": "ns", + "bytes_per_second": 9.8365285338092956e+05 + }, + { + "name": "shake128/1024/64_cv", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.4045291253908015e-03, + "cpu_time": 1.3843445212917290e-03, + "time_unit": "ns", + "bytes_per_second": 1.3826495030732158e-03 + }, + { + "name": "shake128/1024/64_min", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.5270789938678640e+03, + "cpu_time": 1.5270740026370447e+03, + "time_unit": "ns", + "bytes_per_second": 7.0927487266186130e+08 + }, + { + "name": "shake128/1024/64_max", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.5339696297952892e+03, + "cpu_time": 1.5339610099492297e+03, + "time_unit": "ns", + "bytes_per_second": 7.1247365754454279e+08 + }, + { + "name": "shake128/4096/64_mean", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.3181335475286296e+03, + "cpu_time": 5.3180321636315111e+03, + "time_unit": "ns", + "bytes_per_second": 7.8226142565629160e+08 + }, + { + "name": "shake128/4096/64_median", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.3142187597923148e+03, + "cpu_time": 5.3142037029995035e+03, + "time_unit": "ns", + "bytes_per_second": 7.8280794094868088e+08 + }, + { + "name": "shake128/4096/64_stddev", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6552021690670678e+01, + "cpu_time": 2.6374551287910283e+01, + "time_unit": "ns", + "bytes_per_second": 3.8514986794210668e+06 + }, + { + "name": "shake128/4096/64_cv", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.9927331559790501e-03, + "cpu_time": 4.9594568961576118e-03, + "time_unit": "ns", + "bytes_per_second": 4.9235441670791658e-03 + }, + { + "name": "shake128/4096/64_min", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.2918330213018971e+03, + "cpu_time": 5.2917918108203003e+03, + "time_unit": "ns", + "bytes_per_second": 7.7279807896037436e+08 + }, + { + "name": "shake128/4096/64_max", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.3837030756332988e+03, + "cpu_time": 5.3830361555716372e+03, + "time_unit": "ns", + "bytes_per_second": 7.8612314103021049e+08 + }, + { + "name": "shake128/16384/64_mean", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0683332700767744e+04, + "cpu_time": 2.0682906360424375e+04, + "time_unit": "ns", + "bytes_per_second": 7.9524973939282608e+08 + }, + { + "name": "shake128/16384/64_median", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0670028488004737e+04, + "cpu_time": 2.0670126619552906e+04, + "time_unit": "ns", + "bytes_per_second": 7.9573786757282257e+08 + }, + { + "name": "shake128/16384/64_stddev", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.7230966539554849e+01, + "cpu_time": 4.6862212437715314e+01, + "time_unit": "ns", + "bytes_per_second": 1.7994393070040210e+06 + }, + { + "name": "shake128/16384/64_cv", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.2835278638534732e-03, + "cpu_time": 2.2657460040230921e-03, + "time_unit": "ns", + "bytes_per_second": 2.2627348590870265e-03 + }, + { + "name": "shake128/16384/64_min", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0631146936038967e+04, + "cpu_time": 2.0631183745582988e+04, + "time_unit": "ns", + "bytes_per_second": 7.9214635391554236e+08 + }, + { + "name": "shake128/16384/64_max", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0764489991791128e+04, + "cpu_time": 2.0763839811542788e+04, + "time_unit": "ns", + "bytes_per_second": 7.9723976107388484e+08 + }, + { + "name": "shake256/64/64_mean", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5414615862682498e+02, + "cpu_time": 2.5414128989662964e+02, + "time_unit": "ns", + "bytes_per_second": 5.0365834045366585e+08 + }, + { + "name": "shake256/64/64_median", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5416346378068175e+02, + "cpu_time": 2.5416444327874251e+02, + "time_unit": "ns", + "bytes_per_second": 5.0361098429488981e+08 + }, + { + "name": "shake256/64/64_stddev", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.7005117596592239e-01, + "cpu_time": 4.6173246972349113e-01, + "time_unit": "ns", + "bytes_per_second": 9.1518052918293420e+05 + }, + { + "name": "shake256/64/64_cv", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.8495309097160944e-03, + "cpu_time": 1.8168337380804903e-03, + "time_unit": "ns", + "bytes_per_second": 1.8170661650486982e-03 + }, + { + "name": "shake256/64/64_min", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5321675179269323e+02, + "cpu_time": 2.5321660169851378e+02, + "time_unit": "ns", + "bytes_per_second": 5.0186439716310155e+08 + }, + { + "name": "shake256/64/64_max", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5508824156670320e+02, + "cpu_time": 2.5504897482975088e+02, + "time_unit": "ns", + "bytes_per_second": 5.0549608177903003e+08 + }, + { + "name": "shake256/256/64_mean", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8425655663122905e+02, + "cpu_time": 4.8425720391206153e+02, + "time_unit": "ns", + "bytes_per_second": 6.6081029300296640e+08 + }, + { + "name": "shake256/256/64_median", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8408665060125452e+02, + "cpu_time": 4.8408873576393478e+02, + "time_unit": "ns", + "bytes_per_second": 6.6103615774102616e+08 + }, + { + "name": "shake256/256/64_stddev", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.3217830444393153e+00, + "cpu_time": 1.3218177048926343e+00, + "time_unit": "ns", + "bytes_per_second": 1.8029148781977110e+06 + }, + { + "name": "shake256/256/64_cv", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.7295098565818261e-03, + "cpu_time": 2.7295777826625151e-03, + "time_unit": "ns", + "bytes_per_second": 2.7283395814017950e-03 + }, + { + "name": "shake256/256/64_min", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8225819822542081e+02, + "cpu_time": 4.8226078731244218e+02, + "time_unit": "ns", + "bytes_per_second": 6.5804419897345638e+08 + }, + { + "name": "shake256/256/64_max", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8628707928644280e+02, + "cpu_time": 4.8628952355965976e+02, + "time_unit": "ns", + "bytes_per_second": 6.6354140419192255e+08 + }, + { + "name": "shake256/1024/64_mean", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7620105889757619e+03, + "cpu_time": 1.7620016129845094e+03, + "time_unit": "ns", + "bytes_per_second": 6.1748396073593295e+08 + }, + { + "name": "shake256/1024/64_median", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7607243498904641e+03, + "cpu_time": 1.7606923232017775e+03, + "time_unit": "ns", + "bytes_per_second": 6.1793878459700513e+08 + }, + { + "name": "shake256/1024/64_stddev", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.9711324601528180e+00, + "cpu_time": 4.9639166946666409e+00, + "time_unit": "ns", + "bytes_per_second": 1.7313487975897738e+06 + }, + { + "name": "shake256/1024/64_cv", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.8212841008194421e-03, + "cpu_time": 2.8172032636557412e-03, + "time_unit": "ns", + "bytes_per_second": 2.8038765501314537e-03 + }, + { + "name": "shake256/1024/64_min", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7574973286413685e+03, + "cpu_time": 1.7574852563133641e+03, + "time_unit": "ns", + "bytes_per_second": 6.1305741511286700e+08 + }, + { + "name": "shake256/1024/64_max", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7747476562907668e+03, + "cpu_time": 1.7747114269871340e+03, + "time_unit": "ns", + "bytes_per_second": 6.1906635978402007e+08 + }, + { + "name": "shake256/4096/64_mean", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6695030829182506e+03, + "cpu_time": 6.6694656851105447e+03, + "time_unit": "ns", + "bytes_per_second": 6.2374168632959425e+08 + }, + { + "name": "shake256/4096/64_median", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6667428656853426e+03, + "cpu_time": 6.6667537402044427e+03, + "time_unit": "ns", + "bytes_per_second": 6.2399196980485725e+08 + }, + { + "name": "shake256/4096/64_stddev", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.6775224911135563e+01, + "cpu_time": 1.6804343729685169e+01, + "time_unit": "ns", + "bytes_per_second": 1.5719072664307451e+06 + }, + { + "name": "shake256/4096/64_cv", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.5152136077573476e-03, + "cpu_time": 2.5195937010667208e-03, + "time_unit": "ns", + "bytes_per_second": 2.5201253994752665e-03 + }, + { + "name": "shake256/4096/64_min", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6459431494111777e+03, + "cpu_time": 6.6459748278317329e+03, + "time_unit": "ns", + "bytes_per_second": 6.2189845286531138e+08 + }, + { + "name": "shake256/4096/64_max", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.6892187137840565e+03, + "cpu_time": 6.6891949655661201e+03, + "time_unit": "ns", + "bytes_per_second": 6.2594278608744156e+08 + }, + { + "name": "shake256/16384/64_mean", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5883368101010688e+04, + "cpu_time": 2.5883132530120449e+04, + "time_unit": "ns", + "bytes_per_second": 6.3547372994043529e+08 + }, + { + "name": "shake256/16384/64_median", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5865396203566430e+04, + "cpu_time": 2.5865523632993423e+04, + "time_unit": "ns", + "bytes_per_second": 6.3590440401788640e+08 + }, + { + "name": "shake256/16384/64_stddev", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8185220285462464e+01, + "cpu_time": 4.7945887433884998e+01, + "time_unit": "ns", + "bytes_per_second": 1.1765932042790132e+06 + }, + { + "name": "shake256/16384/64_cv", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.8616286758901728e-03, + "cpu_time": 1.8523989466147463e-03, + "time_unit": "ns", + "bytes_per_second": 1.8515213908044611e-03 + }, + { + "name": "shake256/16384/64_min", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5809839483526594e+04, + "cpu_time": 2.5809823911028343e+04, + "time_unit": "ns", + "bytes_per_second": 6.3362271237511897e+08 + }, + { + "name": "shake256/16384/64_max", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5960503610418946e+04, + "cpu_time": 2.5958665430955087e+04, + "time_unit": "ns", + "bytes_per_second": 6.3727672287496281e+08 + } + ] +} diff --git a/bench_result_on_Linux_6.8.0-1016-aws_aarch64_with_g++_13.json b/bench_result_on_Linux_6.8.0-1016-aws_aarch64_with_g++_13.json new file mode 100644 index 0000000..b854292 --- /dev/null +++ b/bench_result_on_Linux_6.8.0-1016-aws_aarch64_with_g++_13.json @@ -0,0 +1,3018 @@ +{ + "context": { + "date": "2024-11-04T10:29:34+00:00", + "host_name": "ip-172-31-32-155", + "executable": "./build/benchmark/bench.out", + "num_cpus": 2, + "mhz_per_cpu": 2000, + "cpu_scaling_enabled": false, + "caches": [ + { + "type": "Data", + "level": 1, + "size": 65536, + "num_sharing": 1 + }, + { + "type": "Instruction", + "level": 1, + "size": 65536, + "num_sharing": 1 + }, + { + "type": "Unified", + "level": 2, + "size": 2097152, + "num_sharing": 1 + }, + { + "type": "Unified", + "level": 3, + "size": 37748736, + "num_sharing": 2 + } + ], + "load_avg": [2.01611,1.08984,0.429688], + "library_version": "v1.9.0-18-gd99cdd73", + "library_build_type": "release", + "json_schema_version": 1 + }, + "benchmarks": [ + { + "name": "sha3_224/64_mean", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.7166519086521737e+02, + "cpu_time": 3.7119503726624083e+02, + "time_unit": "ns", + "bytes_per_second": 2.4784816229653728e+08 + }, + { + "name": "sha3_224/64_median", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.7116943346301417e+02, + "cpu_time": 3.7115743694170249e+02, + "time_unit": "ns", + "bytes_per_second": 2.4787324957943419e+08 + }, + { + "name": "sha3_224/64_stddev", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.3194180457933704e+00, + "cpu_time": 1.1425887511563518e-01, + "time_unit": "ns", + "bytes_per_second": 7.6240444246475745e+04 + }, + { + "name": "sha3_224/64_cv", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.5500178069456365e-03, + "cpu_time": 3.0781358489360034e-04, + "time_unit": "ns", + "bytes_per_second": 3.0760947969127187e-04 + }, + { + "name": "sha3_224/64_min", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.7111319604094331e+02, + "cpu_time": 3.7112419428822932e+02, + "time_unit": "ns", + "bytes_per_second": 2.4764102596530452e+08 + }, + { + "name": "sha3_224/64_max", + "family_index": 0, + "per_family_instance_index": 0, + "run_name": "sha3_224/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.7538039405965480e+02, + "cpu_time": 3.7150548719213253e+02, + "time_unit": "ns", + "bytes_per_second": 2.4789545229311907e+08 + }, + { + "name": "sha3_224/256_mean", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.9068537566509292e+02, + "cpu_time": 6.8983880725463018e+02, + "time_unit": "ns", + "bytes_per_second": 4.1169315907959157e+08 + }, + { + "name": "sha3_224/256_median", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8920053258973644e+02, + "cpu_time": 6.8903837301938586e+02, + "time_unit": "ns", + "bytes_per_second": 4.1216864372634763e+08 + }, + { + "name": "sha3_224/256_stddev", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6925504708783747e+00, + "cpu_time": 1.8931293104776252e+00, + "time_unit": "ns", + "bytes_per_second": 1.1255995875272721e+06 + }, + { + "name": "sha3_224/256_cv", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8983748110861523e-03, + "cpu_time": 2.7443067722034407e-03, + "time_unit": "ns", + "bytes_per_second": 2.7340740614775743e-03 + }, + { + "name": "sha3_224/256_min", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8869340434522871e+02, + "cpu_time": 6.8868601792019331e+02, + "time_unit": "ns", + "bytes_per_second": 4.0952348285202563e+08 + }, + { + "name": "sha3_224/256_max", + "family_index": 0, + "per_family_instance_index": 1, + "run_name": "sha3_224/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.9637650605381464e+02, + "cpu_time": 6.9348892528006411e+02, + "time_unit": "ns", + "bytes_per_second": 4.1237950620468485e+08 + }, + { + "name": "sha3_224/1024_mean", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6693831673759300e+03, + "cpu_time": 2.6612259007297075e+03, + "time_unit": "ns", + "bytes_per_second": 3.9530663269079870e+08 + }, + { + "name": "sha3_224/1024_median", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6606450003796258e+03, + "cpu_time": 2.6607236527059922e+03, + "time_unit": "ns", + "bytes_per_second": 3.9538115852183527e+08 + }, + { + "name": "sha3_224/1024_stddev", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.0277792831466030e+01, + "cpu_time": 1.3671043463485260e+00, + "time_unit": "ns", + "bytes_per_second": 2.0290007302302661e+05 + }, + { + "name": "sha3_224/1024_cv", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 7.5964339175029717e-03, + "cpu_time": 5.1371225042326030e-04, + "time_unit": "ns", + "bytes_per_second": 5.1327262495423685e-04 + }, + { + "name": "sha3_224/1024_min", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6602293820306595e+03, + "cpu_time": 2.6603085094253570e+03, + "time_unit": "ns", + "bytes_per_second": 3.9481133106196940e+08 + }, + { + "name": "sha3_224/1024_max", + "family_index": 0, + "per_family_instance_index": 2, + "run_name": "sha3_224/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.7244366828827979e+03, + "cpu_time": 2.6645638491942836e+03, + "time_unit": "ns", + "bytes_per_second": 3.9544285795155329e+08 + }, + { + "name": "sha3_224/4096_mean", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.4240584028528356e+03, + "cpu_time": 9.4170794604413350e+03, + "time_unit": "ns", + "bytes_per_second": 4.3792777275120842e+08 + }, + { + "name": "sha3_224/4096_median", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.4157186154460633e+03, + "cpu_time": 9.4158647066738340e+03, + "time_unit": "ns", + "bytes_per_second": 4.3798420313207674e+08 + }, + { + "name": "sha3_224/4096_stddev", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2951571301564453e+01, + "cpu_time": 3.8936229149302841e+00, + "time_unit": "ns", + "bytes_per_second": 1.8090328349162455e+05 + }, + { + "name": "sha3_224/4096_cv", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.4354232879771412e-03, + "cpu_time": 4.1346395464606259e-04, + "time_unit": "ns", + "bytes_per_second": 4.1308931460347842e-04 + }, + { + "name": "sha3_224/4096_min", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.4146085172215007e+03, + "cpu_time": 9.4148875134553418e+03, + "time_unit": "ns", + "bytes_per_second": 4.3743387822568262e+08 + }, + { + "name": "sha3_224/4096_max", + "family_index": 0, + "per_family_instance_index": 3, + "run_name": "sha3_224/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.4884231700725086e+03, + "cpu_time": 9.4277105758880643e+03, + "time_unit": "ns", + "bytes_per_second": 4.3802966250060457e+08 + }, + { + "name": "sha3_224/16384_mean", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.6851560756500163e+04, + "cpu_time": 3.6783850144470736e+04, + "time_unit": "ns", + "bytes_per_second": 4.4617415527700353e+08 + }, + { + "name": "sha3_224/16384_median", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.6782876411872378e+04, + "cpu_time": 3.6777262411347496e+04, + "time_unit": "ns", + "bytes_per_second": 4.4625398761662114e+08 + }, + { + "name": "sha3_224/16384_stddev", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.5467233247003816e+02, + "cpu_time": 1.7301127476574912e+01, + "time_unit": "ns", + "bytes_per_second": 2.0975159996277789e+05 + }, + { + "name": "sha3_224/16384_cv", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 4.1971718237946223e-03, + "cpu_time": 4.7034574707714710e-04, + "time_unit": "ns", + "bytes_per_second": 4.7011149678213734e-04 + }, + { + "name": "sha3_224/16384_min", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.6767961124245325e+04, + "cpu_time": 3.6769066456527500e+04, + "time_unit": "ns", + "bytes_per_second": 4.4576797632659203e+08 + }, + { + "name": "sha3_224/16384_max", + "family_index": 0, + "per_family_instance_index": 4, + "run_name": "sha3_224/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.7208750985032340e+04, + "cpu_time": 3.6817359863409627e+04, + "time_unit": "ns", + "bytes_per_second": 4.4635345907963425e+08 + }, + { + "name": "sha3_256/64_mean", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.1625346217786898e+02, + "cpu_time": 4.1575459684123041e+02, + "time_unit": "ns", + "bytes_per_second": 2.3090546976441348e+08 + }, + { + "name": "sha3_256/64_median", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.1570468026366206e+02, + "cpu_time": 4.1571247179669854e+02, + "time_unit": "ns", + "bytes_per_second": 2.3092884270000845e+08 + }, + { + "name": "sha3_256/64_stddev", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.6165268910266739e+00, + "cpu_time": 1.4492584825562058e-01, + "time_unit": "ns", + "bytes_per_second": 8.0426868388891773e+04 + }, + { + "name": "sha3_256/64_cv", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8835157852354801e-03, + "cpu_time": 3.4858507724681940e-04, + "time_unit": "ns", + "bytes_per_second": 3.4831079779508515e-04 + }, + { + "name": "sha3_256/64_min", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.1564512231318685e+02, + "cpu_time": 4.1565745457784249e+02, + "time_unit": "ns", + "bytes_per_second": 2.3068365131320858e+08 + }, + { + "name": "sha3_256/64_max", + "family_index": 1, + "per_family_instance_index": 0, + "run_name": "sha3_256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.2084052962829412e+02, + "cpu_time": 4.1615432846455559e+02, + "time_unit": "ns", + "bytes_per_second": 2.3095940886589235e+08 + }, + { + "name": "sha3_256/256_mean", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.6070573183216163e+02, + "cpu_time": 7.5846894445256544e+02, + "time_unit": "ns", + "bytes_per_second": 3.7971236430059147e+08 + }, + { + "name": "sha3_256/256_median", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.5845524849299977e+02, + "cpu_time": 7.5839592099776132e+02, + "time_unit": "ns", + "bytes_per_second": 3.7974887798593533e+08 + }, + { + "name": "sha3_256/256_stddev", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.4491055322671063e+00, + "cpu_time": 2.8334154801886341e-01, + "time_unit": "ns", + "bytes_per_second": 1.4174749784977073e+05 + }, + { + "name": "sha3_256/256_cv", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 7.1632239698561518e-03, + "cpu_time": 3.7357040138719024e-04, + "time_unit": "ns", + "bytes_per_second": 3.7330229715026939e-04 + }, + { + "name": "sha3_256/256_min", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.5822433429199862e+02, + "cpu_time": 7.5824681971048290e+02, + "time_unit": "ns", + "bytes_per_second": 3.7933817224075294e+08 + }, + { + "name": "sha3_256/256_max", + "family_index": 1, + "per_family_instance_index": 1, + "run_name": "sha3_256/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.7537545016862191e+02, + "cpu_time": 7.5921702869706530e+02, + "time_unit": "ns", + "bytes_per_second": 3.7982355153163111e+08 + }, + { + "name": "sha3_256/1024_mean", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8163893801935033e+03, + "cpu_time": 2.8104564489582908e+03, + "time_unit": "ns", + "bytes_per_second": 3.7573974956998223e+08 + }, + { + "name": "sha3_256/1024_median", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8099715487133808e+03, + "cpu_time": 2.8099989462486446e+03, + "time_unit": "ns", + "bytes_per_second": 3.7580085359927332e+08 + }, + { + "name": "sha3_256/1024_stddev", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.9943188984411787e+01, + "cpu_time": 1.2972944886182562e+00, + "time_unit": "ns", + "bytes_per_second": 1.7327423836167622e+05 + }, + { + "name": "sha3_256/1024_cv", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 7.0811192247293483e-03, + "cpu_time": 4.6159565614301002e-04, + "time_unit": "ns", + "bytes_per_second": 4.6115493119900421e-04 + }, + { + "name": "sha3_256/1024_min", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8095414074103705e+03, + "cpu_time": 2.8096246035887680e+03, + "time_unit": "ns", + "bytes_per_second": 3.7527489732587284e+08 + }, + { + "name": "sha3_256/1024_max", + "family_index": 1, + "per_family_instance_index": 2, + "run_name": "sha3_256/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.8731320902404386e+03, + "cpu_time": 2.8139372164907004e+03, + "time_unit": "ns", + "bytes_per_second": 3.7585092280696797e+08 + }, + { + "name": "sha3_256/4096_mean", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0431390782790306e+04, + "cpu_time": 1.0418534097699448e+04, + "time_unit": "ns", + "bytes_per_second": 3.9621699246756285e+08 + }, + { + "name": "sha3_256/4096_median", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0417642851807052e+04, + "cpu_time": 1.0417354011054720e+04, + "time_unit": "ns", + "bytes_per_second": 3.9626185316259497e+08 + }, + { + "name": "sha3_256/4096_stddev", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.7774361024842598e+01, + "cpu_time": 2.6818498311479022e+00, + "time_unit": "ns", + "bytes_per_second": 1.0196578547246227e+05 + }, + { + "name": "sha3_256/4096_cv", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.6625750681936581e-03, + "cpu_time": 2.5741143677209736e-04, + "time_unit": "ns", + "bytes_per_second": 2.5734834045717999e-04 + }, + { + "name": "sha3_256/4096_min", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0415629294893773e+04, + "cpu_time": 1.0415936585001484e+04, + "time_unit": "ns", + "bytes_per_second": 3.9603434680456579e+08 + }, + { + "name": "sha3_256/4096_max", + "family_index": 1, + "per_family_instance_index": 3, + "run_name": "sha3_256/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0487151703019003e+04, + "cpu_time": 1.0423338362712962e+04, + "time_unit": "ns", + "bytes_per_second": 3.9631577691670555e+08 + }, + { + "name": "sha3_256/16384_mean", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0238768303187644e+04, + "cpu_time": 4.0194686075222628e+04, + "time_unit": "ns", + "bytes_per_second": 4.0841225556229907e+08 + }, + { + "name": "sha3_256/16384_median", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0194124031007887e+04, + "cpu_time": 4.0191872667240888e+04, + "time_unit": "ns", + "bytes_per_second": 4.0844078468089378e+08 + }, + { + "name": "sha3_256/16384_stddev", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.5336752491441456e+02, + "cpu_time": 1.6210206811866477e+01, + "time_unit": "ns", + "bytes_per_second": 1.6461510872084918e+05 + }, + { + "name": "sha3_256/16384_cv", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.8114368650360754e-03, + "cpu_time": 4.0329228549091728e-04, + "time_unit": "ns", + "bytes_per_second": 4.0306113854053735e-04 + }, + { + "name": "sha3_256/16384_min", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0179437553828626e+04, + "cpu_time": 4.0179116279069509e+04, + "time_unit": "ns", + "bytes_per_second": 4.0800854629019672e+08 + }, + { + "name": "sha3_256/16384_max", + "family_index": 1, + "per_family_instance_index": 4, + "run_name": "sha3_256/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0674576227398204e+04, + "cpu_time": 4.0234451335056343e+04, + "time_unit": "ns", + "bytes_per_second": 4.0857045948896545e+08 + }, + { + "name": "sha3_384/64_mean", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.5345526890869741e+02, + "cpu_time": 3.5322443416129965e+02, + "time_unit": "ns", + "bytes_per_second": 3.1707887233948177e+08 + }, + { + "name": "sha3_384/64_median", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.5325744339094661e+02, + "cpu_time": 3.5325148036999678e+02, + "time_unit": "ns", + "bytes_per_second": 3.1705458076873934e+08 + }, + { + "name": "sha3_384/64_stddev", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.5544463617426718e-01, + "cpu_time": 8.0728636880423157e-02, + "time_unit": "ns", + "bytes_per_second": 7.2487240789757358e+04 + }, + { + "name": "sha3_384/64_cv", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.8543920372101682e-03, + "cpu_time": 2.2854771378459760e-04, + "time_unit": "ns", + "bytes_per_second": 2.2860949471319110e-04 + }, + { + "name": "sha3_384/64_min", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.5311237216705905e+02, + "cpu_time": 3.5304651080821145e+02, + "time_unit": "ns", + "bytes_per_second": 3.1700222063858873e+08 + }, + { + "name": "sha3_384/64_max", + "family_index": 2, + "per_family_instance_index": 0, + "run_name": "sha3_384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.5531359422765894e+02, + "cpu_time": 3.5330982784404580e+02, + "time_unit": "ns", + "bytes_per_second": 3.1723865431669074e+08 + }, + { + "name": "sha3_384/256_mean", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.5033025573373163e+02, + "cpu_time": 9.4754800081184783e+02, + "time_unit": "ns", + "bytes_per_second": 3.2082812651113880e+08 + }, + { + "name": "sha3_384/256_median", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.4744398552197129e+02, + "cpu_time": 9.4745545632906419e+02, + "time_unit": "ns", + "bytes_per_second": 3.2085941152206802e+08 + }, + { + "name": "sha3_384/256_stddev", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.3769650853111974e+00, + "cpu_time": 4.0471013881982920e-01, + "time_unit": "ns", + "bytes_per_second": 1.3694257618641068e+05 + }, + { + "name": "sha3_384/256_cv", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 6.7102620871390293e-03, + "cpu_time": 4.2711307339900282e-04, + "time_unit": "ns", + "bytes_per_second": 4.2684093092335587e-04 + }, + { + "name": "sha3_384/256_min", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.4715982680494687e+02, + "cpu_time": 9.4718784926593742e+02, + "time_unit": "ns", + "bytes_per_second": 3.2049798333209896e+08 + }, + { + "name": "sha3_384/256_max", + "family_index": 2, + "per_family_instance_index": 1, + "run_name": "sha3_384/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.6526492794782496e+02, + "cpu_time": 9.4852390907245194e+02, + "time_unit": "ns", + "bytes_per_second": 3.2095006311113197e+08 + }, + { + "name": "sha3_384/1024_mean", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.0284182764130787e+03, + "cpu_time": 3.0215493847415719e+03, + "time_unit": "ns", + "bytes_per_second": 3.5478500350564051e+08 + }, + { + "name": "sha3_384/1024_median", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.0207716635724332e+03, + "cpu_time": 3.0208615992401142e+03, + "time_unit": "ns", + "bytes_per_second": 3.5486564504443026e+08 + }, + { + "name": "sha3_384/1024_stddev", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.8502380797362722e+01, + "cpu_time": 1.9684346876302441e+00, + "time_unit": "ns", + "bytes_per_second": 2.3089866503581015e+05 + }, + { + "name": "sha3_384/1024_cv", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 6.1095856346757103e-03, + "cpu_time": 6.5146533681381517e-04, + "time_unit": "ns", + "bytes_per_second": 6.5081292262720799e-04 + }, + { + "name": "sha3_384/1024_min", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.0200497171973029e+03, + "cpu_time": 3.0201396744527315e+03, + "time_unit": "ns", + "bytes_per_second": 3.5424106168657106e+08 + }, + { + "name": "sha3_384/1024_max", + "family_index": 2, + "per_family_instance_index": 2, + "run_name": "sha3_384/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.0776111998609649e+03, + "cpu_time": 3.0261878589007133e+03, + "time_unit": "ns", + "bytes_per_second": 3.5495047102225602e+08 + }, + { + "name": "sha3_384/4096_mean", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1929788778456188e+04, + "cpu_time": 1.1898176885830801e+04, + "time_unit": "ns", + "bytes_per_second": 3.4828877401889819e+08 + }, + { + "name": "sha3_384/4096_median", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1895320973495032e+04, + "cpu_time": 1.1895470905538556e+04, + "time_unit": "ns", + "bytes_per_second": 3.4836788243641376e+08 + }, + { + "name": "sha3_384/4096_stddev", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5999268888056790e+01, + "cpu_time": 7.3985991774144129e+00, + "time_unit": "ns", + "bytes_per_second": 2.1635119602559216e+05 + }, + { + "name": "sha3_384/4096_cv", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 7.2087838674362347e-03, + "cpu_time": 6.2182628888508070e-04, + "time_unit": "ns", + "bytes_per_second": 6.2118337472988122e-04 + }, + { + "name": "sha3_384/4096_min", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1892297315663651e+04, + "cpu_time": 1.1892452429493838e+04, + "time_unit": "ns", + "bytes_per_second": 3.4775145948111093e+08 + }, + { + "name": "sha3_384/4096_max", + "family_index": 2, + "per_family_instance_index": 3, + "run_name": "sha3_384/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2164442490654223e+04, + "cpu_time": 1.1916556744818185e+04, + "time_unit": "ns", + "bytes_per_second": 3.4845630239585280e+08 + }, + { + "name": "sha3_384/16384_mean", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6824854545452028e+04, + "cpu_time": 4.6801325701871472e+04, + "time_unit": "ns", + "bytes_per_second": 3.5110118229418671e+08 + }, + { + "name": "sha3_384/16384_median", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6800052306157464e+04, + "cpu_time": 4.6798749665775096e+04, + "time_unit": "ns", + "bytes_per_second": 3.5112049183693731e+08 + }, + { + "name": "sha3_384/16384_stddev", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.1216502112771522e+01, + "cpu_time": 1.0796267870218232e+01, + "time_unit": "ns", + "bytes_per_second": 8.0980905933593545e+04 + }, + { + "name": "sha3_384/16384_cv", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.7344741996782106e-03, + "cpu_time": 2.3068294985897192e-04, + "time_unit": "ns", + "bytes_per_second": 2.3064834303445855e-04 + }, + { + "name": "sha3_384/16384_min", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6787078876995845e+04, + "cpu_time": 4.6788469251336763e+04, + "time_unit": "ns", + "bytes_per_second": 3.5095223651018304e+08 + }, + { + "name": "sha3_384/16384_max", + "family_index": 2, + "per_family_instance_index": 4, + "run_name": "sha3_384/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.7054536430474036e+04, + "cpu_time": 4.6821186163101193e+04, + "time_unit": "ns", + "bytes_per_second": 3.5119764042142785e+08 + }, + { + "name": "sha3_512/64_mean", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4508420608150783e+02, + "cpu_time": 3.4460490163732533e+02, + "time_unit": "ns", + "bytes_per_second": 3.7143988057440734e+08 + }, + { + "name": "sha3_512/64_median", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4462171119045928e+02, + "cpu_time": 3.4460765850055390e+02, + "time_unit": "ns", + "bytes_per_second": 3.7143689887502921e+08 + }, + { + "name": "sha3_512/64_stddev", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2039797406078947e+00, + "cpu_time": 6.0144739865068152e-02, + "time_unit": "ns", + "bytes_per_second": 6.4834776138690839e+04 + }, + { + "name": "sha3_512/64_cv", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.4889447833017259e-03, + "cpu_time": 1.7453245609479651e-04, + "time_unit": "ns", + "bytes_per_second": 1.7454985188566216e-04 + }, + { + "name": "sha3_512/64_min", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4457141696409428e+02, + "cpu_time": 3.4447285239443875e+02, + "time_unit": "ns", + "bytes_per_second": 3.7133355683594018e+08 + }, + { + "name": "sha3_512/64_max", + "family_index": 3, + "per_family_instance_index": 0, + "run_name": "sha3_512/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.4842516065494021e+02, + "cpu_time": 3.4470356272312875e+02, + "time_unit": "ns", + "bytes_per_second": 3.7158225709303081e+08 + }, + { + "name": "sha3_512/256_mean", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2524798349245100e+03, + "cpu_time": 1.2500346319264768e+03, + "time_unit": "ns", + "bytes_per_second": 2.5599300112750995e+08 + }, + { + "name": "sha3_512/256_median", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2497390113319427e+03, + "cpu_time": 1.2497760149906267e+03, + "time_unit": "ns", + "bytes_per_second": 2.5604588054822546e+08 + }, + { + "name": "sha3_512/256_stddev", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.5784921095675237e+00, + "cpu_time": 7.9714284554692050e-01, + "time_unit": "ns", + "bytes_per_second": 1.6299906978479555e+05 + }, + { + "name": "sha3_512/256_cv", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 6.8492057679192661e-03, + "cpu_time": 6.3769660870788259e-04, + "time_unit": "ns", + "bytes_per_second": 6.3673252419743230e-04 + }, + { + "name": "sha3_512/256_min", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2495324440079123e+03, + "cpu_time": 1.2495696528955039e+03, + "time_unit": "ns", + "bytes_per_second": 2.5553700079206714e+08 + }, + { + "name": "sha3_512/256_max", + "family_index": 3, + "per_family_instance_index": 1, + "run_name": "sha3_512/256", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.2768901400912753e+03, + "cpu_time": 1.2522648344784598e+03, + "time_unit": "ns", + "bytes_per_second": 2.5608816544039437e+08 + }, + { + "name": "sha3_512/1024_mean", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.5446740613671427e+03, + "cpu_time": 4.5322022527187792e+03, + "time_unit": "ns", + "bytes_per_second": 2.4005993823367330e+08 + }, + { + "name": "sha3_512/1024_median", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.5321808324700742e+03, + "cpu_time": 4.5314255405230160e+03, + "time_unit": "ns", + "bytes_per_second": 2.4010104428874916e+08 + }, + { + "name": "sha3_512/1024_stddev", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.2482643944349448e+01, + "cpu_time": 2.0118447373223640e+00, + "time_unit": "ns", + "bytes_per_second": 1.0650822140410384e+05 + }, + { + "name": "sha3_512/1024_cv", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 7.1474089243218275e-03, + "cpu_time": 4.4390003471612462e-04, + "time_unit": "ns", + "bytes_per_second": 4.4367345167117887e-04 + }, + { + "name": "sha3_512/1024_min", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.5302773821844876e+03, + "cpu_time": 4.5304113477472220e+03, + "time_unit": "ns", + "bytes_per_second": 2.3981725207809675e+08 + }, + { + "name": "sha3_512/1024_max", + "family_index": 3, + "per_family_instance_index": 2, + "run_name": "sha3_512/1024", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.6339324184349880e+03, + "cpu_time": 4.5367878689798836e+03, + "time_unit": "ns", + "bytes_per_second": 2.4015479312734270e+08 + }, + { + "name": "sha3_512/4096_mean", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7069401437973316e+04, + "cpu_time": 1.7060315123080687e+04, + "time_unit": "ns", + "bytes_per_second": 2.4384076610492140e+08 + }, + { + "name": "sha3_512/4096_median", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7058930538628723e+04, + "cpu_time": 1.7059217158177031e+04, + "time_unit": "ns", + "bytes_per_second": 2.4385644204077619e+08 + }, + { + "name": "sha3_512/4096_stddev", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.3760643532062275e+01, + "cpu_time": 4.9073752463119558e+00, + "time_unit": "ns", + "bytes_per_second": 7.0099338289003994e+04 + }, + { + "name": "sha3_512/4096_cv", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.9778457759483535e-03, + "cpu_time": 2.8764856984809324e-04, + "time_unit": "ns", + "bytes_per_second": 2.8747997887621955e-04 + }, + { + "name": "sha3_512/4096_min", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7055535461856995e+04, + "cpu_time": 1.7056038995856608e+04, + "time_unit": "ns", + "bytes_per_second": 2.4365216037788495e+08 + }, + { + "name": "sha3_512/4096_max", + "family_index": 3, + "per_family_instance_index": 3, + "run_name": "sha3_512/4096", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.7165276017549586e+04, + "cpu_time": 1.7073519863514339e+04, + "time_unit": "ns", + "bytes_per_second": 2.4390188138116834e+08 + }, + { + "name": "sha3_512/16384_mean", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8170811327170144e+04, + "cpu_time": 6.8084194944093411e+04, + "time_unit": "ns", + "bytes_per_second": 2.4158326880097061e+08 + }, + { + "name": "sha3_512/16384_median", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8079800437535072e+04, + "cpu_time": 6.8077695187166391e+04, + "time_unit": "ns", + "bytes_per_second": 2.4160629931740260e+08 + }, + { + "name": "sha3_512/16384_stddev", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.1020668370578534e+02, + "cpu_time": 2.7239015712345019e+01, + "time_unit": "ns", + "bytes_per_second": 9.6604762606542383e+04 + }, + { + "name": "sha3_512/16384_cv", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.0835291470560126e-03, + "cpu_time": 4.0007839902802747e-04, + "time_unit": "ns", + "bytes_per_second": 3.9988184233954804e-04 + }, + { + "name": "sha3_512/16384_min", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8055280505584728e+04, + "cpu_time": 6.8056142440447002e+04, + "time_unit": "ns", + "bytes_per_second": 2.4136424704286933e+08 + }, + { + "name": "sha3_512/16384_max", + "family_index": 3, + "per_family_instance_index": 4, + "run_name": "sha3_512/16384", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.8652052989788615e+04, + "cpu_time": 6.8145966942148763e+04, + "time_unit": "ns", + "bytes_per_second": 2.4168281377971044e+08 + }, + { + "name": "keccak-p[1600, 24]_mean", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.9804556252285454e+02, + "cpu_time": 2.9786709945291955e+02, + "time_unit": "ns", + "bytes_per_second": 6.7144042778442240e+08 + }, + { + "name": "keccak-p[1600, 24]_median", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.9783443479698542e+02, + "cpu_time": 2.9782967868598428e+02, + "time_unit": "ns", + "bytes_per_second": 6.7152474825460410e+08 + }, + { + "name": "keccak-p[1600, 24]_stddev", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 6.3086384273361318e-01, + "cpu_time": 7.9067907163372697e-02, + "time_unit": "ns", + "bytes_per_second": 1.7818120586085710e+05 + }, + { + "name": "keccak-p[1600, 24]_cv", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.1166691340530788e-03, + "cpu_time": 2.6544693022020064e-04, + "time_unit": "ns", + "bytes_per_second": 2.6537157800999325e-04 + }, + { + "name": "keccak-p[1600, 24]_min", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.9779604026106676e+02, + "cpu_time": 2.9779441731258220e+02, + "time_unit": "ns", + "bytes_per_second": 6.7107141799330211e+08 + }, + { + "name": "keccak-p[1600, 24]_max", + "family_index": 4, + "per_family_instance_index": 0, + "run_name": "keccak-p[1600, 24]", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.9983410191184373e+02, + "cpu_time": 2.9803087218057641e+02, + "time_unit": "ns", + "bytes_per_second": 6.7160426244682908e+08 + }, + { + "name": "shake128/64/64_mean", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0055817981821554e+02, + "cpu_time": 3.9992329868203274e+02, + "time_unit": "ns", + "bytes_per_second": 3.2006139500802451e+08 + }, + { + "name": "shake128/64/64_median", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9989445913307361e+02, + "cpu_time": 3.9989144850858577e+02, + "time_unit": "ns", + "bytes_per_second": 3.2008686476855743e+08 + }, + { + "name": "shake128/64/64_stddev", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.3078416217145747e+00, + "cpu_time": 1.1100361130511194e-01, + "time_unit": "ns", + "bytes_per_second": 8.8809750751483254e+04 + }, + { + "name": "shake128/64/64_cv", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.2650478447553101e-03, + "cpu_time": 2.7756225173909574e-04, + "time_unit": "ns", + "bytes_per_second": 2.7747723448264244e-04 + }, + { + "name": "shake128/64/64_min", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9983527787410696e+02, + "cpu_time": 3.9977821636967144e+02, + "time_unit": "ns", + "bytes_per_second": 3.1985697936334527e+08 + }, + { + "name": "shake128/64/64_max", + "family_index": 5, + "per_family_instance_index": 0, + "run_name": "shake128/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0347116990407176e+02, + "cpu_time": 4.0017885573350861e+02, + "time_unit": "ns", + "bytes_per_second": 3.2017752533479595e+08 + }, + { + "name": "shake128/256/64_mean", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.1492401993541353e+02, + "cpu_time": 7.1415106181102306e+02, + "time_unit": "ns", + "bytes_per_second": 4.4808450401799500e+08 + }, + { + "name": "shake128/256/64_median", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.1410453086961104e+02, + "cpu_time": 7.1408104502813683e+02, + "time_unit": "ns", + "bytes_per_second": 4.4812840535241526e+08 + }, + { + "name": "shake128/256/64_stddev", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.8096777069833352e+00, + "cpu_time": 2.0758712706940127e-01, + "time_unit": "ns", + "bytes_per_second": 1.3020245324854467e+05 + }, + { + "name": "shake128/256/64_cv", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.5312867612796424e-03, + "cpu_time": 2.9067677438297009e-04, + "time_unit": "ns", + "bytes_per_second": 2.9057566615451572e-04 + }, + { + "name": "shake128/256/64_min", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.1392543092242181e+02, + "cpu_time": 7.1394662123212140e+02, + "time_unit": "ns", + "bytes_per_second": 4.4778281529541856e+08 + }, + { + "name": "shake128/256/64_max", + "family_index": 5, + "per_family_instance_index": 1, + "run_name": "shake128/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.1841074717011713e+02, + "cpu_time": 7.1463215887122510e+02, + "time_unit": "ns", + "bytes_per_second": 4.4821278017640513e+08 + }, + { + "name": "shake128/1024/64_mean", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2833844096616231e+03, + "cpu_time": 2.2819760509471203e+03, + "time_unit": "ns", + "bytes_per_second": 4.7677988401366800e+08 + }, + { + "name": "shake128/1024/64_median", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2815402706970904e+03, + "cpu_time": 2.2813560515986160e+03, + "time_unit": "ns", + "bytes_per_second": 4.7690933611171615e+08 + }, + { + "name": "shake128/1024/64_stddev", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 5.0013981819275468e+00, + "cpu_time": 1.2137252250446469e+00, + "time_unit": "ns", + "bytes_per_second": 2.5348273786639408e+05 + }, + { + "name": "shake128/1024/64_cv", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.1903443681078249e-03, + "cpu_time": 5.3187465510030115e-04, + "time_unit": "ns", + "bytes_per_second": 5.3165568927217451e-04 + }, + { + "name": "shake128/1024/64_min", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2806977865369349e+03, + "cpu_time": 2.2807010765998925e+03, + "time_unit": "ns", + "bytes_per_second": 4.7632253324195760e+08 + }, + { + "name": "shake128/1024/64_max", + "family_index": 5, + "per_family_instance_index": 2, + "run_name": "shake128/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.2973249181552269e+03, + "cpu_time": 2.2841665553691719e+03, + "time_unit": "ns", + "bytes_per_second": 4.7704629561626232e+08 + }, + { + "name": "shake128/4096/64_mean", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.3367287572770874e+03, + "cpu_time": 8.3150637103480749e+03, + "time_unit": "ns", + "bytes_per_second": 5.0029692049944288e+08 + }, + { + "name": "shake128/4096/64_median", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.3170582155137054e+03, + "cpu_time": 8.3165339788522342e+03, + "time_unit": "ns", + "bytes_per_second": 5.0020838191953045e+08 + }, + { + "name": "shake128/4096/64_stddev", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.4123801203006465e+01, + "cpu_time": 3.7652511693678696e+00, + "time_unit": "ns", + "bytes_per_second": 2.2664679828484546e+05 + }, + { + "name": "shake128/4096/64_cv", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 5.2926996292749747e-03, + "cpu_time": 4.5282288873890703e-04, + "time_unit": "ns", + "bytes_per_second": 4.5302457200533145e-04 + }, + { + "name": "shake128/4096/64_min", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.3121713199507176e+03, + "cpu_time": 8.3066653795886232e+03, + "time_unit": "ns", + "bytes_per_second": 5.0001972105546802e+08 + }, + { + "name": "shake128/4096/64_max", + "family_index": 5, + "per_family_instance_index": 3, + "run_name": "shake128/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 8.4327734941202270e+03, + "cpu_time": 8.3196718545797594e+03, + "time_unit": "ns", + "bytes_per_second": 5.0080264581525958e+08 + }, + { + "name": "shake128/16384/64_mean", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.2267856587723014e+04, + "cpu_time": 3.2247541135893400e+04, + "time_unit": "ns", + "bytes_per_second": 5.1005454740999740e+08 + }, + { + "name": "shake128/16384/64_median", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.2258302368365996e+04, + "cpu_time": 3.2256448263968217e+04, + "time_unit": "ns", + "bytes_per_second": 5.0991354947284466e+08 + }, + { + "name": "shake128/16384/64_stddev", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.8703261633231946e+01, + "cpu_time": 1.8732080348110220e+01, + "time_unit": "ns", + "bytes_per_second": 2.9652957856443548e+05 + }, + { + "name": "shake128/16384/64_cv", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 1.5093429432112371e-03, + "cpu_time": 5.8088398954735544e-04, + "time_unit": "ns", + "bytes_per_second": 5.8136836554086436e-04 + }, + { + "name": "shake128/16384/64_min", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.2238030121878033e+04, + "cpu_time": 3.2201976546333048e+04, + "time_unit": "ns", + "bytes_per_second": 5.0978209602236587e+08 + }, + { + "name": "shake128/16384/64_max", + "family_index": 5, + "per_family_instance_index": 4, + "run_name": "shake128/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.2403389054951753e+04, + "cpu_time": 3.2264765923200193e+04, + "time_unit": "ns", + "bytes_per_second": 5.1077610022894657e+08 + }, + { + "name": "shake256/64/64_mean", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9874482098843936e+02, + "cpu_time": 3.9823370160091679e+02, + "time_unit": "ns", + "bytes_per_second": 3.2141932561654252e+08 + }, + { + "name": "shake256/64/64_median", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9823826324788428e+02, + "cpu_time": 3.9821761287553193e+02, + "time_unit": "ns", + "bytes_per_second": 3.2143229213751030e+08 + }, + { + "name": "shake256/64/64_stddev", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.1421871997016446e+00, + "cpu_time": 1.0367757944612552e-01, + "time_unit": "ns", + "bytes_per_second": 8.3660499699246619e+04 + }, + { + "name": "shake256/64/64_cv", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 2.8644565134922700e-03, + "cpu_time": 2.6034355964685350e-04, + "time_unit": "ns", + "bytes_per_second": 2.6028459719641965e-04 + }, + { + "name": "shake256/64/64_min", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9811706758170527e+02, + "cpu_time": 3.9812885479776776e+02, + "time_unit": "ns", + "bytes_per_second": 3.2126049054273897e+08 + }, + { + "name": "shake256/64/64_max", + "family_index": 6, + "per_family_instance_index": 0, + "run_name": "shake256/64/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0127171437762615e+02, + "cpu_time": 3.9843056886253333e+02, + "time_unit": "ns", + "bytes_per_second": 3.2150395144059187e+08 + }, + { + "name": "shake256/256/64_mean", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.3248671011440945e+02, + "cpu_time": 7.3173180865574625e+02, + "time_unit": "ns", + "bytes_per_second": 4.3731873199229568e+08 + }, + { + "name": "shake256/256/64_median", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.3172225503154402e+02, + "cpu_time": 7.3166220255983274e+02, + "time_unit": "ns", + "bytes_per_second": 4.3736030092756224e+08 + }, + { + "name": "shake256/256/64_stddev", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.5428953613579273e+00, + "cpu_time": 2.2292589981867753e-01, + "time_unit": "ns", + "bytes_per_second": 1.3317709551911353e+05 + }, + { + "name": "shake256/256/64_cv", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.4715924893173071e-03, + "cpu_time": 3.0465519905197437e-04, + "time_unit": "ns", + "bytes_per_second": 3.0453096512101779e-04 + }, + { + "name": "shake256/256/64_min", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.3150325335376397e+02, + "cpu_time": 7.3151302648149885e+02, + "time_unit": "ns", + "bytes_per_second": 4.3700175516928971e+08 + }, + { + "name": "shake256/256/64_max", + "family_index": 6, + "per_family_instance_index": 1, + "run_name": "shake256/256/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.3971513685001560e+02, + "cpu_time": 7.3226250516095865e+02, + "time_unit": "ns", + "bytes_per_second": 4.3744948950419450e+08 + }, + { + "name": "shake256/1024/64_mean", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6955666000114511e+03, + "cpu_time": 2.6926207579457596e+03, + "time_unit": "ns", + "bytes_per_second": 4.0406731549919868e+08 + }, + { + "name": "shake256/1024/64_median", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6924281662789749e+03, + "cpu_time": 2.6924643234825558e+03, + "time_unit": "ns", + "bytes_per_second": 4.0409077701168036e+08 + }, + { + "name": "shake256/1024/64_stddev", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 9.4459881788316515e+00, + "cpu_time": 5.5320259264879901e-01, + "time_unit": "ns", + "bytes_per_second": 8.2992623840002445e+04 + }, + { + "name": "shake256/1024/64_cv", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 3.5042681485931478e-03, + "cpu_time": 2.0545135850131587e-04, + "time_unit": "ns", + "bytes_per_second": 2.0539306362225932e-04 + }, + { + "name": "shake256/1024/64_min", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.6921416870157364e+03, + "cpu_time": 2.6920855044319496e+03, + "time_unit": "ns", + "bytes_per_second": 4.0386724182761341e+08 + }, + { + "name": "shake256/1024/64_max", + "family_index": 6, + "per_family_instance_index": 2, + "run_name": "shake256/1024/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.7223959699283546e+03, + "cpu_time": 2.6939545655559791e+03, + "time_unit": "ns", + "bytes_per_second": 4.0414763877627146e+08 + }, + { + "name": "shake256/4096/64_mean", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0236277561295734e+04, + "cpu_time": 1.0214913776999461e+04, + "time_unit": "ns", + "bytes_per_second": 4.0724773162481236e+08 + }, + { + "name": "shake256/4096/64_median", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0213192133682171e+04, + "cpu_time": 1.0213423744892112e+04, + "time_unit": "ns", + "bytes_per_second": 4.0730709943068910e+08 + }, + { + "name": "shake256/4096/64_stddev", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 7.0834593157486623e+01, + "cpu_time": 3.5990127778276055e+00, + "time_unit": "ns", + "bytes_per_second": 1.4338070588164366e+05 + }, + { + "name": "shake256/4096/64_cv", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 6.9199562764220499e-03, + "cpu_time": 3.5232923707406781e-04, + "time_unit": "ns", + "bytes_per_second": 3.5207244816218373e-04 + }, + { + "name": "shake256/4096/64_min", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0212447898424329e+04, + "cpu_time": 1.0212749854057298e+04, + "time_unit": "ns", + "bytes_per_second": 4.0686282409330249e+08 + }, + { + "name": "shake256/4096/64_max", + "family_index": 6, + "per_family_instance_index": 3, + "run_name": "shake256/4096/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 1.0437824868654248e+04, + "cpu_time": 1.0224576328079613e+04, + "time_unit": "ns", + "bytes_per_second": 4.0733397561356354e+08 + }, + { + "name": "shake256/16384/64_mean", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "mean", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9758303116147246e+04, + "cpu_time": 3.9652930991501766e+04, + "time_unit": "ns", + "bytes_per_second": 4.1479917564922035e+08 + }, + { + "name": "shake256/16384/64_median", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "median", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9647256515582085e+04, + "cpu_time": 3.9644243767706052e+04, + "time_unit": "ns", + "bytes_per_second": 4.1488999251446736e+08 + }, + { + "name": "shake256/16384/64_stddev", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "stddev", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 2.4382557952865233e+02, + "cpu_time": 1.8113907704572860e+01, + "time_unit": "ns", + "bytes_per_second": 1.8937876569442978e+05 + }, + { + "name": "shake256/16384/64_cv", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "cv", + "aggregate_unit": "percentage", + "iterations": 10, + "real_time": 6.1326958249791636e-03, + "cpu_time": 4.5681131890237684e-04, + "time_unit": "ns", + "bytes_per_second": 4.5655530871782662e-04 + }, + { + "name": "shake256/16384/64_min", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "min", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 3.9638170538246515e+04, + "cpu_time": 3.9639340793201220e+04, + "time_unit": "ns", + "bytes_per_second": 4.1438008246673095e+08 + }, + { + "name": "shake256/16384/64_max", + "family_index": 6, + "per_family_instance_index": 4, + "run_name": "shake256/16384/64", + "run_type": "aggregate", + "repetitions": 10, + "threads": 1, + "aggregate_name": "max", + "aggregate_unit": "time", + "iterations": 10, + "real_time": 4.0340483569411139e+04, + "cpu_time": 3.9693027478753276e+04, + "time_unit": "ns", + "bytes_per_second": 4.1494131009416527e+08 + } + ] +}