Parameters:


The parameter sets below are the ones of our round-3 submission.


We select and implement four parameter sets: For NIST security level 1, we select two parameter sets: MAYO_one and MAYO_two, where MAYO_one has smaller public keys but larger signatures and conversely MAYO_two has smaller signatures but larger public keys. For NIST security level 3 and NIST security level 5, we select one parameter set each, which we refer to as MAYO_three and MAYO_five, respectively. The parameter sets and the corresponding key and signature sizes are displayed below. All sizes are reported in bytes -B-.


Parameter set MAYO_one MAYO_two MAYO_three MAYO_five
security level 1 1 3 5
$(n,m,o,k,q)$ (88, 80, 8, 10, 16) (86, 64, 13, 5, 16) (118, 108, 10, 11, 16) (154, 142, 12, 12, 16)
secret key size 24 B 24 B 32 B 40 B
public key size 1456 B 2928 B 2986 B 5554 B
signature size 464 B 239 B 681 B 964 B

Our specification also lists a range of additional parameter sets that showcase the possible trade-offs between public key size and signature size at each security level.


Cycle counts:


The fastest results on Intel x86-64 are on the 2.0 GHz Ice Lake platform, on which MAYO_two performs KeyGen in 26.9 μs, Signing (+ExpandSK) in 50.6 μs, and Verifying (+ExpandPK) in 20.9 μs with the GFNI/AVX-512 implementation. Batch signing (without ExpandSK) takes 31.3 μs, and batch verification (without ExpandPK) takes 11.4 μs.


All builds use -O3 compiler optimization level and -march=native build architecture. Turbo Boost was deactivated to achieve consistent timings. We report the CPU cycles using AES-NI. More results can be found in our specification.


Cycle counts for our GFNI/AVX-512 optimized implementation:


The GFNI implementation requires the AVX-512F, AVX-512BW, and GFNI instruction set extensions, available on Intel server architectures since Ice Lake and on AMD architectures since Zen 4. It was therefore evaluated on Ice Lake only.


On Intel Xeon Gold 6338 CPU (Ice Lake) with 2.0 GHz:


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 66,210 166,390 73,926
MAYO_two 53,874 101,126 41,890
MAYO_three 149,334 337,246 152,066
MAYO_five 325,646 752,656 348,120

The library was compiled on Ubuntu with clang version 18.1.8. Results are the median of 1000 benchmark runs.



Cycle counts for our AVX2 optimized implementation:


On Intel Xeon Gold 6338 CPU (Ice Lake) with 2.0 GHz for the AVX2 optimized implementation:


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 87,002 289,238 119,452
MAYO_two 72,552 140,176 49,064
MAYO_three 197,720 597,392 244,284
MAYO_five 571,546 1,515,402 639,410

The library was compiled on Ubuntu with clang version 18.1.8. Results are the median of 1000 benchmark runs.



On Intel Xeon E3-1225 v3 CPU (Haswell) at 3.20GHz for the AVX2 optimized implementation:


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 190,996 466,134 242,382
MAYO_two 152,835 232,389 112,449
MAYO_three 451,465 1,015,330 528,461
MAYO_five 1,137,678 2,390,175 1,254,135

The library was compiled on Ubuntu with clang version 18.1.3. Results are the median of 1000 benchmark runs.


On Intel i7-6700T CPU (Skylake) at 2.80GHz for the AVX2 optimized implementation:


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 149,119 363,653 188,988
MAYO_two 123,843 175,504 86,956
MAYO_three 361,791 789,086 407,824
MAYO_five 890,231 1,852,715 969,107

The library was compiled on Debian with clang version 19.1.7. Results are the median of 1000 benchmark runs.



Cycle counts for our optimized implementation:


All builds use -O3 compiler optimization level and -march=native build architecture. Turbo Boost was deactivated to achieve consistent timings. We report the CPU cycles using AES-NI. More results can be found in our specification.


On Intel Xeon Gold 6338 CPU (Ice Lake) with 2.0 GHz for the optimized implementation:


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 890,892 2,531,962 320,660
MAYO_two 1,599,408 909,718 98,106
MAYO_three 3,424,220 6,945,436 802,626
MAYO_five 6,943,014 15,877,932 1,558,240

The library was compiled on Ubuntu with clang version 18.1.8. Results are the median of 1000 benchmark runs.



On Intel Xeon E3-1225 v3 CPU (Haswell) at 3.20GHz for the optimized implementation:


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 944,171 2,349,559 471,308
MAYO_two 977,728 1,052,726 169,372
MAYO_three 2,754,470 6,245,908 1,158,512
MAYO_five 8,485,033 18,541,749 2,137,340

The library was compiled on Ubuntu with clang version 18.1.3. Results are the median of 1000 benchmark runs.


On Intel i7-6700T CPU (Skylake) at 2.80GHz for the optimized implementation:


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 839,914 1,831,210 370,396
MAYO_two 765,983 817,049 131,986
MAYO_three 2,478,116 4,789,861 894,661
MAYO_five 6,595,713 14,340,039 1,696,101

The library was compiled on Debian with clang version 19.1.7. Results are the median of 1000 benchmark runs.


Arm Cortex-M4 implementation:


We use the ST NUCLEO-L4R5ZI development board which comes with a STM32L4R5ZI Cortex-M4 CPU with $2$MB of flash memory and $640$KB of SRAM.


All builds use -O3 compiler optimization level using the Arm GNU toolchain.


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 9,631,297 19,223,231 11,539,985
MAYO_two 8,898,780 10,312,833 6,888,289
MAYO_three 27,169,341 43,708,718 28,475,402

The library was compiled with the Arm GNU toolchain (arm-none-eabi-gcc 13.2.1). Results are the average of 1000 benchmark runs.


Arm Neon implementation:


The NEON implementation is built with CMake option -DMAYO_BUILD_TYPE=neon. AES acceleration is used by default, if available. We report results on an Apple M3 processor.


Scheme KeyGen ExpandSK + Sign ExpandPK + Verify
MAYO_one 123,271 381,390 213,224
MAYO_two 112,322 214,151 128,003
MAYO_three 334,458 892,572 512,092
MAYO_five 795,090 1,789,597 1,033,879

The library was compiled with the Apple clang toolchain (clang-1700.4.4.1). Results are the average of 1000 benchmark runs.