Skip to content

Commit 64807d8

Browse files
committed
Add optimized M55 native implementations.
Add unit tests for FIPS202 APIs Add unit tests for x4 keccak Add support for benchmarking on mps3 Signed-off-by: Brendan Moran <[email protected]>
1 parent abf8281 commit 64807d8

File tree

20 files changed

+7509
-25
lines changed

20 files changed

+7509
-25
lines changed

Makefile

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
# Copyright (c) The mldsa-native project authors
33
# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
44

5-
.PHONY: func kat acvp stack \
6-
func_44 kat_44 acvp_44 stack_44 \
7-
func_65 kat_65 acvp_65 stack_65 \
8-
func_87 kat_87 acvp_87 stack_87 \
9-
run_func run_kat run_acvp run_stack \
10-
run_func_44 run_kat_44 run_stack_44 \
11-
run_func_65 run_kat_65 run_stack_65 \
12-
run_func_87 run_kat_87 run_stack_87 \
5+
.PHONY: func kat acvp stack unit \
6+
func_44 kat_44 acvp_44 stack_44 unit_44 \
7+
func_65 kat_65 acvp_65 stack_65 unit_65 \
8+
func_87 kat_87 acvp_87 stack_87 unit_87 \
9+
run_func run_kat run_acvp run_stack run_unit \
10+
run_func_44 run_kat_44 run_stack_44 run_unit_44 \
11+
run_func_65 run_kat_65 run_stack_65 run_unit_65 \
12+
run_func_87 run_kat_87 run_stack_87 run_unit_87 \
1313
bench_44 bench_65 bench_87 bench \
1414
run_bench_44 run_bench_65 run_bench_87 run_bench \
1515
bench_components_44 bench_components_65 bench_components_87 bench_components \
@@ -46,7 +46,7 @@ quickcheck: test
4646
build: func kat acvp
4747
$(Q)echo " Everything builds fine!"
4848

49-
test: run_kat run_func run_acvp
49+
test: run_kat run_func run_acvp run_unit
5050
$(Q)echo " Everything checks fine!"
5151

5252
run_kat_44: kat_44
@@ -108,6 +108,23 @@ run_stack_87: stack_87
108108
$(Q)python3 scripts/stack $(MLDSA87_DIR)/bin/test_stack87 --build-dir $(MLDSA87_DIR) $(STACK_ANALYSIS_FLAGS)
109109
run_stack: run_stack_44 run_stack_65 run_stack_87
110110

111+
# Unit tests
112+
unit_44: $(MLDSA44_DIR)/bin/test_unit44
113+
$(Q)echo " UNIT ML-DSA-44: $^"
114+
unit_65: $(MLDSA65_DIR)/bin/test_unit65
115+
$(Q)echo " UNIT ML-DSA-65: $^"
116+
unit_87: $(MLDSA87_DIR)/bin/test_unit87
117+
$(Q)echo " UNIT ML-DSA-87: $^"
118+
unit: unit_44 unit_65 unit_87
119+
120+
run_unit_44: unit_44
121+
$(W) $(MLDSA44_DIR)/bin/test_unit44
122+
run_unit_65: unit_65
123+
$(W) $(MLDSA65_DIR)/bin/test_unit65
124+
run_unit_87: unit_87
125+
$(W) $(MLDSA87_DIR)/bin/test_unit87
126+
run_unit: run_unit_44 run_unit_65 run_unit_87
127+
111128
lib: $(BUILD_DIR)/libmldsa.a $(BUILD_DIR)/libmldsa44.a $(BUILD_DIR)/libmldsa65.a $(BUILD_DIR)/libmldsa87.a
112129

113130
# Enforce setting CYCLES make variable when

mldsa/fips202/fips202.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,18 @@
1717
#define SHA3_256_HASHBYTES 32
1818
#define SHA3_512_HASHBYTES 64
1919

20+
#ifndef FIPS202_NAMESPACE
2021
#define FIPS202_NAMESPACE(s) mldsa_fips202_ref_##s
22+
#endif
2123

24+
#define mld_shake128ctx FIPS202_NAMESPACE(shake128ctx)
2225
typedef struct
2326
{
2427
uint64_t s[MLD_KECCAK_LANES];
2528
unsigned int pos;
2629
} mld_shake128ctx;
2730

31+
#define mld_shake256ctx FIPS202_NAMESPACE(shake256ctx)
2832
typedef struct
2933
{
3034
uint64_t s[MLD_KECCAK_LANES];

mldsa/fips202/fips202x4.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
#include "keccakf1600.h"
1717

1818
/* Context for non-incremental API */
19+
#define mld_shake128x4ctx FIPS202_NAMESPACE(shake128x4ctx)
1920
typedef struct
2021
{
2122
uint64_t ctx[MLD_KECCAK_LANES * MLD_KECCAK_WAY];
2223
} mld_shake128x4ctx;
2324

25+
#define mld_shake256x4ctx FIPS202_NAMESPACE(shake256x4ctx)
2426
typedef struct
2527
{
2628
uint64_t ctx[MLD_KECCAK_LANES * MLD_KECCAK_WAY];

mldsa/fips202/keccakf1600.c

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,51 +39,61 @@
3939
void mld_keccakf1600_extract_bytes(uint64_t *state, unsigned char *data,
4040
unsigned offset, unsigned length)
4141
{
42+
#if defined(MLD_USE_FIPS202_X1_XOR_NATIVE)
43+
mld_keccakf1600_extract_bytes_native(state, data, offset, length);
44+
#elif defined(MLD_SYS_LITTLE_ENDIAN)
4245
unsigned i;
43-
#if defined(MLD_SYS_LITTLE_ENDIAN)
4446
uint8_t *state_ptr = (uint8_t *)state + offset;
4547
for (i = 0; i < length; i++)
4648
__loop__(invariant(i <= length))
4749
{
4850
data[i] = state_ptr[i];
4951
}
50-
#else /* MLD_SYS_LITTLE_ENDIAN */
52+
#else /* !MLD_USE_FIPS202_X1_XOR_NATIVE && MLD_SYS_LITTLE_ENDIAN */
53+
unsigned i;
5154
/* Portable version */
5255
for (i = 0; i < length; i++)
5356
__loop__(invariant(i <= length))
5457
{
5558
data[i] = (state[(offset + i) >> 3] >> (8 * ((offset + i) & 0x07))) & 0xFF;
5659
}
57-
#endif /* !MLD_SYS_LITTLE_ENDIAN */
60+
#endif /* !MLD_USE_FIPS202_X1_XOR_NATIVE && !MLD_SYS_LITTLE_ENDIAN */
5861
}
5962

6063
void mld_keccakf1600_xor_bytes(uint64_t *state, const unsigned char *data,
6164
unsigned offset, unsigned length)
6265
{
66+
#if defined(MLD_USE_FIPS202_X1_XOR_NATIVE)
67+
mld_keccakf1600_xor_bytes_native(state, data, offset, length);
68+
#elif defined(MLD_SYS_LITTLE_ENDIAN)
6369
unsigned i;
64-
#if defined(MLD_SYS_LITTLE_ENDIAN)
6570
uint8_t *state_ptr = (uint8_t *)state + offset;
6671
for (i = 0; i < length; i++)
6772
__loop__(invariant(i <= length))
6873
{
6974
state_ptr[i] ^= data[i];
7075
}
71-
#else /* MLD_SYS_LITTLE_ENDIAN */
76+
#else /* !MLD_USE_FIPS202_X1_XOR_NATIVE && MLD_SYS_LITTLE_ENDIAN */
77+
unsigned i;
7278
/* Portable version */
7379
for (i = 0; i < length; i++)
7480
__loop__(invariant(i <= length))
7581
{
7682
state[(offset + i) >> 3] ^= (uint64_t)data[i]
7783
<< (8 * ((offset + i) & 0x07));
7884
}
79-
#endif /* !MLD_SYS_LITTLE_ENDIAN */
85+
#endif /* !MLD_USE_FIPS202_X1_XOR_NATIVE && !MLD_SYS_LITTLE_ENDIAN */
8086
}
8187

8288
void mld_keccakf1600x4_extract_bytes(uint64_t *state, unsigned char *data0,
8389
unsigned char *data1, unsigned char *data2,
8490
unsigned char *data3, unsigned offset,
8591
unsigned length)
8692
{
93+
#if defined(MLD_USE_FIPS202_X4_XOR_NATIVE)
94+
mld_keccakf1600_extract_bytes_x4_native(state, data0, data1, data2, data3,
95+
offset, length);
96+
#else
8797
mld_keccakf1600_extract_bytes(state + MLD_KECCAK_LANES * 0, data0, offset,
8898
length);
8999
mld_keccakf1600_extract_bytes(state + MLD_KECCAK_LANES * 1, data1, offset,
@@ -92,6 +102,7 @@ void mld_keccakf1600x4_extract_bytes(uint64_t *state, unsigned char *data0,
92102
length);
93103
mld_keccakf1600_extract_bytes(state + MLD_KECCAK_LANES * 3, data3, offset,
94104
length);
105+
#endif /* !MLD_USE_FIPS202_X4_XOR_NATIVE */
95106
}
96107

97108
void mld_keccakf1600x4_xor_bytes(uint64_t *state, const unsigned char *data0,
@@ -100,6 +111,10 @@ void mld_keccakf1600x4_xor_bytes(uint64_t *state, const unsigned char *data0,
100111
const unsigned char *data3, unsigned offset,
101112
unsigned length)
102113
{
114+
#if defined(MLD_USE_FIPS202_X4_XOR_NATIVE)
115+
mld_keccakf1600_xor_bytes_x4_native(state, data0, data1, data2, data3, offset,
116+
length);
117+
#else
103118
mld_keccakf1600_xor_bytes(state + MLD_KECCAK_LANES * 0, data0, offset,
104119
length);
105120
mld_keccakf1600_xor_bytes(state + MLD_KECCAK_LANES * 1, data1, offset,
@@ -108,6 +123,7 @@ void mld_keccakf1600x4_xor_bytes(uint64_t *state, const unsigned char *data0,
108123
length);
109124
mld_keccakf1600_xor_bytes(state + MLD_KECCAK_LANES * 3, data3, offset,
110125
length);
126+
#endif /* !MLD_USE_FIPS202_X4_XOR_NATIVE */
111127
}
112128

113129
void mld_keccakf1600x4_permute(uint64_t *state)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* Copyright (c) The mlkem-native project authors
3+
* Copyright (c) The mldsa-native project authors
4+
* SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
5+
*/
6+
7+
#ifndef MLD_FIPS202_NATIVE_ARMV8_1_M_AUTO_H
8+
#define MLD_FIPS202_NATIVE_ARMV8_1_M_AUTO_H
9+
/* Default FIPS202 assembly profile for ARMV81M systems */
10+
11+
#include "x4_v8m_mve.h"
12+
13+
#endif /* !MLD_FIPS202_NATIVE_ARMV8_1_M_AUTO_H */

0 commit comments

Comments
 (0)