RFC: Add incremental encaps API to support ML-KEM Braid#1619
RFC: Add incremental encaps API to support ML-KEM Braid#1619mkannwischer wants to merge 13 commits into
Conversation
325ab51 to
285fc8a
Compare
There was a problem hiding this comment.
Intel Xeon 4th gen (c7i)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
11667 cycles |
11774 cycles |
0.99 |
ML-KEM-512 encaps |
13401 cycles |
13356 cycles |
1.00 |
ML-KEM-512 decaps |
17333 cycles |
17522 cycles |
0.99 |
ML-KEM-768 keypair |
20339 cycles |
20211 cycles |
1.01 |
ML-KEM-768 encaps |
21438 cycles |
21480 cycles |
1.00 |
ML-KEM-768 decaps |
27521 cycles |
27490 cycles |
1.00 |
ML-KEM-1024 keypair |
28756 cycles |
28747 cycles |
1.00 |
ML-KEM-1024 encaps |
30828 cycles |
30705 cycles |
1.00 |
ML-KEM-1024 decaps |
38764 cycles |
38459 cycles |
1.01 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
ppc64le (POWER10) benchmarks
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
59376 cycles |
59560 cycles |
1.00 |
ML-KEM-512 encaps |
72055 cycles |
72057 cycles |
1.00 |
ML-KEM-512 decaps |
91812 cycles |
91947 cycles |
1.00 |
ML-KEM-768 keypair |
98208 cycles |
98659 cycles |
1.00 |
ML-KEM-768 encaps |
114736 cycles |
115076 cycles |
1.00 |
ML-KEM-768 decaps |
140432 cycles |
140831 cycles |
1.00 |
ML-KEM-1024 keypair |
148862 cycles |
148847 cycles |
1.00 |
ML-KEM-1024 encaps |
167902 cycles |
167928 cycles |
1.00 |
ML-KEM-1024 decaps |
198941 cycles |
199093 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
AMD EPYC 3rd gen (c6a)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
13939 cycles |
13907 cycles |
1.00 |
ML-KEM-512 encaps |
15689 cycles |
15691 cycles |
1.00 |
ML-KEM-512 decaps |
21157 cycles |
21253 cycles |
1.00 |
ML-KEM-768 keypair |
23701 cycles |
23709 cycles |
1.00 |
ML-KEM-768 encaps |
25099 cycles |
25155 cycles |
1.00 |
ML-KEM-768 decaps |
33133 cycles |
33007 cycles |
1.00 |
ML-KEM-1024 keypair |
33205 cycles |
33204 cycles |
1.00 |
ML-KEM-1024 encaps |
35665 cycles |
35641 cycles |
1.00 |
ML-KEM-1024 decaps |
46453 cycles |
46195 cycles |
1.01 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'AMD EPYC 3rd gen (c6a)'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.03.
| Benchmark suite | Current: a4e4e31 | Previous: 2bf8e59 | Ratio |
|---|---|---|---|
ML-KEM-512 encaps |
16707 cycles |
15974 cycles |
1.05 |
ML-KEM-768 decaps |
35711 cycles |
33345 cycles |
1.07 |
ML-KEM-1024 decaps |
50650 cycles |
46735 cycles |
1.08 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Intel Xeon 4th gen (c7i) (no-opt)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
28423 cycles |
28218 cycles |
1.01 |
ML-KEM-512 encaps |
35312 cycles |
36635 cycles |
0.96 |
ML-KEM-512 decaps |
45241 cycles |
45192 cycles |
1.00 |
ML-KEM-768 keypair |
46322 cycles |
46296 cycles |
1.00 |
ML-KEM-768 encaps |
55233 cycles |
55812 cycles |
0.99 |
ML-KEM-768 decaps |
69681 cycles |
69913 cycles |
1.00 |
ML-KEM-1024 keypair |
70870 cycles |
70293 cycles |
1.01 |
ML-KEM-1024 encaps |
83960 cycles |
82553 cycles |
1.02 |
ML-KEM-1024 decaps |
101882 cycles |
98932 cycles |
1.03 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
AMD EPYC 4th gen (c7a)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
12697 cycles |
12706 cycles |
1.00 |
ML-KEM-512 encaps |
14226 cycles |
14177 cycles |
1.00 |
ML-KEM-512 decaps |
19050 cycles |
19036 cycles |
1.00 |
ML-KEM-768 keypair |
21894 cycles |
21905 cycles |
1.00 |
ML-KEM-768 encaps |
22989 cycles |
22946 cycles |
1.00 |
ML-KEM-768 decaps |
30055 cycles |
29897 cycles |
1.01 |
ML-KEM-1024 keypair |
30714 cycles |
30697 cycles |
1.00 |
ML-KEM-1024 encaps |
32722 cycles |
32787 cycles |
1.00 |
ML-KEM-1024 decaps |
42327 cycles |
42190 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'AMD EPYC 4th gen (c7a)'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.03.
| Benchmark suite | Current: a4e4e31 | Previous: 2bf8e59 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
13236 cycles |
12779 cycles |
1.04 |
ML-KEM-512 encaps |
15642 cycles |
14273 cycles |
1.10 |
ML-KEM-768 decaps |
32957 cycles |
30058 cycles |
1.10 |
ML-KEM-1024 keypair |
34340 cycles |
32987 cycles |
1.04 |
ML-KEM-1024 decaps |
47071 cycles |
42393 cycles |
1.11 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Intel Xeon 3rd gen (c6i)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
17471 cycles |
17431 cycles |
1.00 |
ML-KEM-512 encaps |
19845 cycles |
19836 cycles |
1.00 |
ML-KEM-512 decaps |
26406 cycles |
26354 cycles |
1.00 |
ML-KEM-768 keypair |
29863 cycles |
29796 cycles |
1.00 |
ML-KEM-768 encaps |
31769 cycles |
31052 cycles |
1.02 |
ML-KEM-768 decaps |
41439 cycles |
41419 cycles |
1.00 |
ML-KEM-1024 keypair |
42329 cycles |
42318 cycles |
1.00 |
ML-KEM-1024 encaps |
45595 cycles |
45892 cycles |
0.99 |
ML-KEM-1024 decaps |
59304 cycles |
61098 cycles |
0.97 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'Intel Xeon 3rd gen (c6i)'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.03.
| Benchmark suite | Current: a4e4e31 | Previous: 2bf8e59 | Ratio |
|---|---|---|---|
ML-KEM-512 encaps |
20660 cycles |
19953 cycles |
1.04 |
ML-KEM-768 keypair |
32264 cycles |
31153 cycles |
1.04 |
ML-KEM-1024 decaps |
61128 cycles |
58193 cycles |
1.05 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
AMD EPYC 3rd gen (c6a) (no-opt)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
40231 cycles |
40276 cycles |
1.00 |
ML-KEM-512 encaps |
48480 cycles |
48441 cycles |
1.00 |
ML-KEM-512 decaps |
62705 cycles |
62607 cycles |
1.00 |
ML-KEM-768 keypair |
63832 cycles |
63754 cycles |
1.00 |
ML-KEM-768 encaps |
74842 cycles |
75005 cycles |
1.00 |
ML-KEM-768 decaps |
93488 cycles |
93641 cycles |
1.00 |
ML-KEM-1024 keypair |
95299 cycles |
95232 cycles |
1.00 |
ML-KEM-1024 encaps |
109171 cycles |
109421 cycles |
1.00 |
ML-KEM-1024 decaps |
132011 cycles |
132194 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
AMD EPYC 4th gen (c7a) (no-opt)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
36582 cycles |
36601 cycles |
1.00 |
ML-KEM-512 encaps |
43100 cycles |
43070 cycles |
1.00 |
ML-KEM-512 decaps |
55713 cycles |
55708 cycles |
1.00 |
ML-KEM-768 keypair |
58695 cycles |
58652 cycles |
1.00 |
ML-KEM-768 encaps |
67682 cycles |
67635 cycles |
1.00 |
ML-KEM-768 decaps |
84507 cycles |
84425 cycles |
1.00 |
ML-KEM-1024 keypair |
89091 cycles |
88991 cycles |
1.00 |
ML-KEM-1024 encaps |
99378 cycles |
99229 cycles |
1.00 |
ML-KEM-1024 decaps |
121053 cycles |
120563 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Arm Cortex-A76 (Raspberry Pi 5) benchmarks
Details
| Benchmark suite | Current: a4e4e31 | Previous: 2bf8e59 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
28285 cycles |
28220 cycles |
1.00 |
ML-KEM-512 encaps |
34092 cycles |
34106 cycles |
1.00 |
ML-KEM-512 decaps |
44329 cycles |
44333 cycles |
1.00 |
ML-KEM-768 keypair |
47645 cycles |
47614 cycles |
1.00 |
ML-KEM-768 encaps |
53834 cycles |
53939 cycles |
1.00 |
ML-KEM-768 decaps |
68301 cycles |
68365 cycles |
1.00 |
ML-KEM-1024 keypair |
70227 cycles |
70253 cycles |
1.00 |
ML-KEM-1024 encaps |
78707 cycles |
78729 cycles |
1.00 |
ML-KEM-1024 decaps |
98290 cycles |
98443 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Graviton4
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
17676 cycles |
17646 cycles |
1.00 |
ML-KEM-512 encaps |
20593 cycles |
20606 cycles |
1.00 |
ML-KEM-512 decaps |
27028 cycles |
27084 cycles |
1.00 |
ML-KEM-768 keypair |
29923 cycles |
29905 cycles |
1.00 |
ML-KEM-768 encaps |
32788 cycles |
32773 cycles |
1.00 |
ML-KEM-768 decaps |
41939 cycles |
41963 cycles |
1.00 |
ML-KEM-1024 keypair |
43711 cycles |
43739 cycles |
1.00 |
ML-KEM-1024 encaps |
48758 cycles |
48736 cycles |
1.00 |
ML-KEM-1024 decaps |
61406 cycles |
61382 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Intel Xeon 3rd gen (c6i) (no-opt)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
45684 cycles |
45722 cycles |
1.00 |
ML-KEM-512 encaps |
54598 cycles |
54423 cycles |
1.00 |
ML-KEM-512 decaps |
69928 cycles |
69779 cycles |
1.00 |
ML-KEM-768 keypair |
73225 cycles |
74154 cycles |
0.99 |
ML-KEM-768 encaps |
86160 cycles |
86032 cycles |
1.00 |
ML-KEM-768 decaps |
106234 cycles |
106582 cycles |
1.00 |
ML-KEM-1024 keypair |
112133 cycles |
112073 cycles |
1.00 |
ML-KEM-1024 encaps |
124870 cycles |
124711 cycles |
1.00 |
ML-KEM-1024 decaps |
150839 cycles |
150591 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Graviton4 (no-opt)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
35448 cycles |
35408 cycles |
1.00 |
ML-KEM-512 encaps |
41305 cycles |
40111 cycles |
1.03 |
ML-KEM-512 decaps |
51288 cycles |
51135 cycles |
1.00 |
ML-KEM-768 keypair |
56738 cycles |
56671 cycles |
1.00 |
ML-KEM-768 encaps |
64836 cycles |
65149 cycles |
1.00 |
ML-KEM-768 decaps |
79062 cycles |
79291 cycles |
1.00 |
ML-KEM-1024 keypair |
88013 cycles |
87860 cycles |
1.00 |
ML-KEM-1024 encaps |
97113 cycles |
96876 cycles |
1.00 |
ML-KEM-1024 decaps |
116135 cycles |
115825 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Graviton3
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
18674 cycles |
18640 cycles |
1.00 |
ML-KEM-512 encaps |
21835 cycles |
21878 cycles |
1.00 |
ML-KEM-512 decaps |
28794 cycles |
28869 cycles |
1.00 |
ML-KEM-768 keypair |
31593 cycles |
31542 cycles |
1.00 |
ML-KEM-768 encaps |
34796 cycles |
34773 cycles |
1.00 |
ML-KEM-768 decaps |
44735 cycles |
44779 cycles |
1.00 |
ML-KEM-1024 keypair |
46064 cycles |
46077 cycles |
1.00 |
ML-KEM-1024 encaps |
51462 cycles |
51494 cycles |
1.00 |
ML-KEM-1024 decaps |
65067 cycles |
65017 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Graviton2
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
28337 cycles |
28270 cycles |
1.00 |
ML-KEM-512 encaps |
34209 cycles |
34120 cycles |
1.00 |
ML-KEM-512 decaps |
44538 cycles |
44375 cycles |
1.00 |
ML-KEM-768 keypair |
47612 cycles |
47674 cycles |
1.00 |
ML-KEM-768 encaps |
53936 cycles |
53909 cycles |
1.00 |
ML-KEM-768 decaps |
68333 cycles |
68363 cycles |
1.00 |
ML-KEM-1024 keypair |
70349 cycles |
70257 cycles |
1.00 |
ML-KEM-1024 encaps |
78617 cycles |
78760 cycles |
1.00 |
ML-KEM-1024 decaps |
98461 cycles |
98451 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Graviton3 (no-opt)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
38934 cycles |
38890 cycles |
1.00 |
ML-KEM-512 encaps |
46774 cycles |
44600 cycles |
1.05 |
ML-KEM-512 decaps |
56788 cycles |
56685 cycles |
1.00 |
ML-KEM-768 keypair |
62284 cycles |
62295 cycles |
1.00 |
ML-KEM-768 encaps |
71210 cycles |
72323 cycles |
0.98 |
ML-KEM-768 decaps |
86947 cycles |
87695 cycles |
0.99 |
ML-KEM-1024 keypair |
96359 cycles |
96156 cycles |
1.00 |
ML-KEM-1024 encaps |
106402 cycles |
106137 cycles |
1.00 |
ML-KEM-1024 decaps |
126922 cycles |
126582 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Graviton2 (no-opt)
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
59254 cycles |
59136 cycles |
1.00 |
ML-KEM-512 encaps |
69196 cycles |
68627 cycles |
1.01 |
ML-KEM-512 decaps |
87340 cycles |
87348 cycles |
1.00 |
ML-KEM-768 keypair |
95410 cycles |
95336 cycles |
1.00 |
ML-KEM-768 encaps |
110535 cycles |
109885 cycles |
1.01 |
ML-KEM-768 decaps |
134324 cycles |
134360 cycles |
1.00 |
ML-KEM-1024 keypair |
145962 cycles |
147936 cycles |
0.99 |
ML-KEM-1024 encaps |
161958 cycles |
163772 cycles |
0.99 |
ML-KEM-1024 decaps |
193999 cycles |
195429 cycles |
0.99 |
This comment was automatically generated by workflow using github-action-benchmark.
CBMC Results (ML-KEM-512)
Full Results (194 proofs)
|
CBMC Results (ML-KEM-768)
Full Results (194 proofs)
|
CBMC Results (ML-KEM-1024)
Full Results (194 proofs)
|
hanno-becker
left a comment
There was a problem hiding this comment.
What's the purpose of 0a01cc4? Tests also serve as documentation, and using internal constants rather than public ones sets a wrong example.
If this is needed, can it be done in a preparatory PR? It seems unrelated to this PR.
The main question here is if we want to add the new API in mlkem_native.h or not. If we don't, we can't test the API in the standard test_mlkem.c, but we could add it in a separate test that includes kem.h, but not mlkem_native.h. I agree with you that we don't want to keep it as is right now. |
|
Seeing that you also observed a slowdown on x86, I wonder if we should treat the incremental API as internal by default and only expose it in the public API if some new option |
4f0ace1 to
732adb5
Compare
There was a problem hiding this comment.
Mac Mini (M1, 2020) benchmarks
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
12320 cycles |
12320 cycles |
1 |
ML-KEM-512 encaps |
15047 cycles |
14999 cycles |
1.00 |
ML-KEM-512 decaps |
19599 cycles |
19552 cycles |
1.00 |
ML-KEM-768 keypair |
21264 cycles |
21264 cycles |
1 |
ML-KEM-768 encaps |
23880 cycles |
23870 cycles |
1.00 |
ML-KEM-768 decaps |
30427 cycles |
30414 cycles |
1.00 |
ML-KEM-1024 keypair |
30323 cycles |
30327 cycles |
1.00 |
ML-KEM-1024 encaps |
34616 cycles |
34573 cycles |
1.00 |
ML-KEM-1024 decaps |
44229 cycles |
44193 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Arm Cortex-A55 (Snapdragon 888) benchmarks
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
59787 cycles |
59728 cycles |
1.00 |
ML-KEM-512 encaps |
67447 cycles |
67429 cycles |
1.00 |
ML-KEM-512 decaps |
86139 cycles |
86125 cycles |
1.00 |
ML-KEM-768 keypair |
97408 cycles |
97470 cycles |
1.00 |
ML-KEM-768 encaps |
110758 cycles |
110896 cycles |
1.00 |
ML-KEM-768 decaps |
137357 cycles |
138405 cycles |
0.99 |
ML-KEM-1024 keypair |
154780 cycles |
154989 cycles |
1.00 |
ML-KEM-1024 encaps |
171299 cycles |
172090 cycles |
1.00 |
ML-KEM-1024 decaps |
207123 cycles |
209372 cycles |
0.99 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Arm Cortex-A72 (Raspberry Pi 4) benchmarks
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
50693 cycles |
51223 cycles |
0.99 |
ML-KEM-512 encaps |
58494 cycles |
59547 cycles |
0.98 |
ML-KEM-512 decaps |
74583 cycles |
75793 cycles |
0.98 |
ML-KEM-768 keypair |
85700 cycles |
86166 cycles |
0.99 |
ML-KEM-768 encaps |
93550 cycles |
94272 cycles |
0.99 |
ML-KEM-768 decaps |
117423 cycles |
117661 cycles |
1.00 |
ML-KEM-1024 keypair |
130295 cycles |
129800 cycles |
1.00 |
ML-KEM-1024 encaps |
141861 cycles |
142914 cycles |
0.99 |
ML-KEM-1024 decaps |
173922 cycles |
174806 cycles |
0.99 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
SpacemiT K1 8 (Banana Pi F3) benchmarks
Details
| Benchmark suite | Current: 856b540 | Previous: c0fb232 | Ratio |
|---|---|---|---|
ML-KEM-512 keypair |
155501 cycles |
155510 cycles |
1.00 |
ML-KEM-512 encaps |
163235 cycles |
163424 cycles |
1.00 |
ML-KEM-512 decaps |
206715 cycles |
206679 cycles |
1.00 |
ML-KEM-768 keypair |
249857 cycles |
249912 cycles |
1.00 |
ML-KEM-768 encaps |
270337 cycles |
270404 cycles |
1.00 |
ML-KEM-768 decaps |
332607 cycles |
332257 cycles |
1.00 |
ML-KEM-1024 keypair |
395706 cycles |
396307 cycles |
1.00 |
ML-KEM-1024 encaps |
423713 cycles |
423343 cycles |
1.00 |
ML-KEM-1024 decaps |
505216 cycles |
507057 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
1ce787b to
a4e4e31
Compare
Split K-PKE.Encrypt and ML-KEM.Encaps into two phases (u and v) to support protocols like MLKEMBraid that transmit large KEM components in parallel over bandwidth-constrained channels. CPA level (indcpa): - mlk_indcpa_enc_u: computes ct_u from ek_seed, outputs intermediate state (sp, epp) - mlk_indcpa_enc_v: computes ct_v from ek_vector using intermediate state from enc_u CCA KEM level (kem): - mlk_kem_enc_derand_u: FO transform + enc_u, outputs shared secret and intermediate state; only needs ek_seed and H(pk) - mlk_kem_enc_v: modulus check on ek_vector + enc_v; only needs ek_vector The test verifies that the incremental API produces identical ciphertexts and shared secrets as the standard API across all three parameter sets. Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Use mlk_kem_enc_derand_u + mlk_kem_enc_v as the single implementation for both the standard and incremental encapsulation API. Serialize the intermediate state (sp, epp) via 16-bit little-endian encoding into separate buffers sp_serial[MLKEM_POLYVEC16_BYTES] and epp_serial[MLKEM_POLY16_BYTES]. Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Add CBMC contracts for mlk_indcpa_enc_u and mlk_indcpa_enc_v, including an epp coefficient bound postcondition on enc_u (array_abs_bound ETA2+1) and a matching precondition on enc_v (array_abs_bound 16). Serialize epp as 4-bit nibbles (ETA2 - x) in 128 bytes instead of 16-bit LE (512 bytes), providing a natural coefficient bound on deserialization. Revert mlk_kem_enc_derand to call mlk_indcpa_enc directly, avoiding unnecessary serialization overhead. Add CBMC proofs for indcpa_enc_u, indcpa_enc_v, kem_enc_derand_u, and kem_enc_v. Update the indcpa_enc proof to compose enc_u and enc_v. Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Change mlk_kem_enc_derand_u and mlk_kem_enc_v from MLK_INTERNAL_API to MLK_EXTERNAL_API so they are not static in monolithic builds. Add -Wno-unused-function to the monolithic_build_multilevel_native example (matching mldsa-native) since those examples don't exercise the incremental API. Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
Signed-off-by: Hanno Becker <beckphan@amazon.co.uk>
Signed-off-by: Hanno Becker <beckphan@amazon.co.uk>
Signed-off-by: Matthias J. Kannwischer <matthias@zerorisc.com>
a4e4e31 to
856b540
Compare
Split ML-KEM encapsulation into two phases (mlk_kem_enc_derand_u / mlk_kem_enc_v) to support protocols like Braid that need to interleave encapsulation with other operations between computing the u- and v-components of the ciphertext. The first phase only requires the public seed and H(pk), not the full public key vector. Internally, K-PKE.Encrypt is refactored into mlk_indcpa_enc_u + mlk_indcpa_enc_v. The non-incremental KEM path calls mlk_indcpa_enc directly to avoid serialization overhead. The intermediate noise polynomial epp is serialized as 4-bit nibbles (128 bytes) - this is primarily done to not require a pre-condition on the allowed values.