RFC: Validate s1/s2 coefficient bounds during signing#1003
RFC: Validate s1/s2 coefficient bounds during signing#1003mkannwischer wants to merge 1 commit intomainfrom
Conversation
Validate s1 and s2 coefficient bounds in unpack_sk, ensuring that signing rejects secret keys with out-of-range s1/s2 encodings. Neither FIPS 204 nor the FIPS 140-3 IG describe this check, but it is covered by Wycheproof test vectors. The bounds check was previously only performed in pk_from_sk. By moving it into unpack_sk, both signing and pk_from_sk benefit from the same check. Note that pk_from_sk performs additional validation beyond this: it recomputes t0 and tr from (rho, s1, s2) and checks them against the stored values to verify internal consistency of the secret key. Signed-off-by: Matthias J. Kannwischer <matthias@zerorisc.com>
There was a problem hiding this comment.
Arm Cortex-A76 (Raspberry Pi 5) benchmarks (opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
113075 cycles |
113125 cycles |
1.00 |
ML-DSA-44 sign |
356894 cycles |
355404 cycles |
1.00 |
ML-DSA-44 verify |
117859 cycles |
117806 cycles |
1.00 |
ML-DSA-65 keypair |
196228 cycles |
196440 cycles |
1.00 |
ML-DSA-65 sign |
590827 cycles |
588870 cycles |
1.00 |
ML-DSA-65 verify |
194601 cycles |
194523 cycles |
1.00 |
ML-DSA-87 keypair |
322487 cycles |
322254 cycles |
1.00 |
ML-DSA-87 sign |
753981 cycles |
752961 cycles |
1.00 |
ML-DSA-87 verify |
320055 cycles |
320091 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 (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
212351 cycles |
212677 cycles |
1.00 |
ML-DSA-44 sign |
768639 cycles |
759475 cycles |
1.01 |
ML-DSA-44 verify |
228664 cycles |
228953 cycles |
1.00 |
ML-DSA-65 keypair |
379802 cycles |
380253 cycles |
1.00 |
ML-DSA-65 sign |
1263677 cycles |
1251269 cycles |
1.01 |
ML-DSA-65 verify |
371430 cycles |
372050 cycles |
1.00 |
ML-DSA-87 keypair |
604884 cycles |
605509 cycles |
1.00 |
ML-DSA-87 sign |
1609482 cycles |
1591320 cycles |
1.01 |
ML-DSA-87 verify |
618678 cycles |
617579 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Intel Xeon 4th gen (c7i)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
34419 cycles |
34508 cycles |
1.00 |
ML-DSA-44 sign |
120151 cycles |
119762 cycles |
1.00 |
ML-DSA-44 verify |
38152 cycles |
38106 cycles |
1.00 |
ML-DSA-65 keypair |
60697 cycles |
61327 cycles |
0.99 |
ML-DSA-65 sign |
200789 cycles |
202109 cycles |
0.99 |
ML-DSA-65 verify |
62922 cycles |
62771 cycles |
1.00 |
ML-DSA-87 keypair |
94415 cycles |
94593 cycles |
1.00 |
ML-DSA-87 sign |
238324 cycles |
240827 cycles |
0.99 |
ML-DSA-87 verify |
95168 cycles |
96019 cycles |
0.99 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Intel Xeon 4th gen (c7i) (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
93705 cycles |
93753 cycles |
1.00 |
ML-DSA-44 sign |
337113 cycles |
333304 cycles |
1.01 |
ML-DSA-44 verify |
99826 cycles |
99738 cycles |
1.00 |
ML-DSA-65 keypair |
159853 cycles |
159678 cycles |
1.00 |
ML-DSA-65 sign |
548333 cycles |
544024 cycles |
1.01 |
ML-DSA-65 verify |
160896 cycles |
160787 cycles |
1.00 |
ML-DSA-87 keypair |
267790 cycles |
267177 cycles |
1.00 |
ML-DSA-87 sign |
716080 cycles |
705890 cycles |
1.01 |
ML-DSA-87 verify |
269063 cycles |
270246 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
AMD EPYC 3rd gen (c6a)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
69067 cycles |
69272 cycles |
1.00 |
ML-DSA-44 sign |
187689 cycles |
188132 cycles |
1.00 |
ML-DSA-44 verify |
68991 cycles |
69431 cycles |
0.99 |
ML-DSA-65 keypair |
119329 cycles |
119537 cycles |
1.00 |
ML-DSA-65 sign |
300691 cycles |
300738 cycles |
1.00 |
ML-DSA-65 verify |
115591 cycles |
115521 cycles |
1.00 |
ML-DSA-87 keypair |
202863 cycles |
204457 cycles |
0.99 |
ML-DSA-87 sign |
393831 cycles |
395562 cycles |
1.00 |
ML-DSA-87 verify |
195687 cycles |
196251 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Graviton4
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
68016 cycles |
68092 cycles |
1.00 |
ML-DSA-44 sign |
203534 cycles |
202357 cycles |
1.01 |
ML-DSA-44 verify |
70933 cycles |
70840 cycles |
1.00 |
ML-DSA-65 keypair |
121073 cycles |
120892 cycles |
1.00 |
ML-DSA-65 sign |
333019 cycles |
332262 cycles |
1.00 |
ML-DSA-65 verify |
117954 cycles |
117993 cycles |
1.00 |
ML-DSA-87 keypair |
198182 cycles |
198285 cycles |
1.00 |
ML-DSA-87 sign |
430011 cycles |
428165 cycles |
1.00 |
ML-DSA-87 verify |
194700 cycles |
194638 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Intel Xeon 3rd gen (c6i)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
56997 cycles |
56810 cycles |
1.00 |
ML-DSA-44 sign |
184302 cycles |
181256 cycles |
1.02 |
ML-DSA-44 verify |
62355 cycles |
61127 cycles |
1.02 |
ML-DSA-65 keypair |
99691 cycles |
98683 cycles |
1.01 |
ML-DSA-65 sign |
303003 cycles |
298776 cycles |
1.01 |
ML-DSA-65 verify |
101664 cycles |
100109 cycles |
1.02 |
ML-DSA-87 keypair |
155226 cycles |
152672 cycles |
1.02 |
ML-DSA-87 sign |
360726 cycles |
355205 cycles |
1.02 |
ML-DSA-87 verify |
156317 cycles |
153314 cycles |
1.02 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
AMD EPYC 3rd gen (c6a) (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
134872 cycles |
135154 cycles |
1.00 |
ML-DSA-44 sign |
530269 cycles |
524730 cycles |
1.01 |
ML-DSA-44 verify |
147815 cycles |
147590 cycles |
1.00 |
ML-DSA-65 keypair |
228397 cycles |
228675 cycles |
1.00 |
ML-DSA-65 sign |
871540 cycles |
866364 cycles |
1.01 |
ML-DSA-65 verify |
236679 cycles |
236755 cycles |
1.00 |
ML-DSA-87 keypair |
371091 cycles |
372434 cycles |
1.00 |
ML-DSA-87 sign |
1087957 cycles |
1081953 cycles |
1.01 |
ML-DSA-87 verify |
382510 cycles |
383807 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Graviton4 (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
128392 cycles |
128232 cycles |
1.00 |
ML-DSA-44 sign |
453815 cycles |
447685 cycles |
1.01 |
ML-DSA-44 verify |
138201 cycles |
144647 cycles |
0.96 |
ML-DSA-65 keypair |
220724 cycles |
220666 cycles |
1.00 |
ML-DSA-65 sign |
735582 cycles |
727390 cycles |
1.01 |
ML-DSA-65 verify |
222772 cycles |
223179 cycles |
1.00 |
ML-DSA-87 keypair |
364622 cycles |
365048 cycles |
1.00 |
ML-DSA-87 sign |
937747 cycles |
925897 cycles |
1.01 |
ML-DSA-87 verify |
372918 cycles |
372806 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Intel Xeon 3rd gen (c6i) (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
157358 cycles |
157591 cycles |
1.00 |
ML-DSA-44 sign |
558028 cycles |
551560 cycles |
1.01 |
ML-DSA-44 verify |
169116 cycles |
169402 cycles |
1.00 |
ML-DSA-65 keypair |
268508 cycles |
267815 cycles |
1.00 |
ML-DSA-65 sign |
914833 cycles |
904542 cycles |
1.01 |
ML-DSA-65 verify |
274947 cycles |
274303 cycles |
1.00 |
ML-DSA-87 keypair |
448205 cycles |
448249 cycles |
1.00 |
ML-DSA-87 sign |
1169598 cycles |
1156908 cycles |
1.01 |
ML-DSA-87 verify |
457676 cycles |
458389 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Graviton3
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
72343 cycles |
72262 cycles |
1.00 |
ML-DSA-44 sign |
213593 cycles |
212358 cycles |
1.01 |
ML-DSA-44 verify |
75743 cycles |
75722 cycles |
1.00 |
ML-DSA-65 keypair |
127606 cycles |
127611 cycles |
1.00 |
ML-DSA-65 sign |
352890 cycles |
350840 cycles |
1.01 |
ML-DSA-65 verify |
125629 cycles |
125699 cycles |
1.00 |
ML-DSA-87 keypair |
205827 cycles |
208501 cycles |
0.99 |
ML-DSA-87 sign |
446676 cycles |
450025 cycles |
0.99 |
ML-DSA-87 verify |
205631 cycles |
205765 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
AMD EPYC 4th gen (c7a)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
40970 cycles |
41153 cycles |
1.00 |
ML-DSA-44 sign |
135862 cycles |
132931 cycles |
1.02 |
ML-DSA-44 verify |
44232 cycles |
43836 cycles |
1.01 |
ML-DSA-65 keypair |
73239 cycles |
72244 cycles |
1.01 |
ML-DSA-65 sign |
216331 cycles |
214745 cycles |
1.01 |
ML-DSA-65 verify |
74592 cycles |
73096 cycles |
1.02 |
ML-DSA-87 keypair |
114305 cycles |
108337 cycles |
1.06 |
ML-DSA-87 sign |
259210 cycles |
253357 cycles |
1.02 |
ML-DSA-87 verify |
116670 cycles |
110812 cycles |
1.05 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
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: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-87 keypair |
114305 cycles |
108337 cycles |
1.06 |
ML-DSA-87 verify |
116670 cycles |
110812 cycles |
1.05 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Graviton3 (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
138631 cycles |
138488 cycles |
1.00 |
ML-DSA-44 sign |
491225 cycles |
483902 cycles |
1.02 |
ML-DSA-44 verify |
148433 cycles |
162298 cycles |
0.91 |
ML-DSA-65 keypair |
241227 cycles |
241720 cycles |
1.00 |
ML-DSA-65 sign |
802903 cycles |
792693 cycles |
1.01 |
ML-DSA-65 verify |
240733 cycles |
241300 cycles |
1.00 |
ML-DSA-87 keypair |
395392 cycles |
396574 cycles |
1.00 |
ML-DSA-87 sign |
1026333 cycles |
1012397 cycles |
1.01 |
ML-DSA-87 verify |
402834 cycles |
402619 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
AMD EPYC 4th gen (c7a) (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
120281 cycles |
120615 cycles |
1.00 |
ML-DSA-44 sign |
451375 cycles |
447589 cycles |
1.01 |
ML-DSA-44 verify |
130196 cycles |
130296 cycles |
1.00 |
ML-DSA-65 keypair |
204546 cycles |
204314 cycles |
1.00 |
ML-DSA-65 sign |
735017 cycles |
728144 cycles |
1.01 |
ML-DSA-65 verify |
210314 cycles |
210151 cycles |
1.00 |
ML-DSA-87 keypair |
339014 cycles |
338739 cycles |
1.00 |
ML-DSA-87 sign |
938177 cycles |
924086 cycles |
1.02 |
ML-DSA-87 verify |
348545 cycles |
347015 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Graviton2
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
113283 cycles |
113486 cycles |
1.00 |
ML-DSA-44 sign |
357111 cycles |
355929 cycles |
1.00 |
ML-DSA-44 verify |
118047 cycles |
118313 cycles |
1.00 |
ML-DSA-65 keypair |
196488 cycles |
196525 cycles |
1.00 |
ML-DSA-65 sign |
590456 cycles |
588739 cycles |
1.00 |
ML-DSA-65 verify |
194638 cycles |
194868 cycles |
1.00 |
ML-DSA-87 keypair |
322230 cycles |
323107 cycles |
1.00 |
ML-DSA-87 sign |
755634 cycles |
753767 cycles |
1.00 |
ML-DSA-87 verify |
320307 cycles |
320405 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
oqs-bot
left a comment
There was a problem hiding this comment.
Graviton2 (no-opt)
Details
| Benchmark suite | Current: 6669315 | Previous: bb07ee8 | Ratio |
|---|---|---|---|
ML-DSA-44 keypair |
212863 cycles |
212744 cycles |
1.00 |
ML-DSA-44 sign |
769060 cycles |
760342 cycles |
1.01 |
ML-DSA-44 verify |
241107 cycles |
234472 cycles |
1.03 |
ML-DSA-65 keypair |
381208 cycles |
380565 cycles |
1.00 |
ML-DSA-65 sign |
1266242 cycles |
1254252 cycles |
1.01 |
ML-DSA-65 verify |
373043 cycles |
372074 cycles |
1.00 |
ML-DSA-87 keypair |
606211 cycles |
604302 cycles |
1.00 |
ML-DSA-87 sign |
1608784 cycles |
1594512 cycles |
1.01 |
ML-DSA-87 verify |
618129 cycles |
618492 cycles |
1.00 |
This comment was automatically generated by workflow using github-action-benchmark.
CBMC Results (ML-DSA-44)
Full Results (176 proofs)
|
|
Performance impact seems to be negligible. In the meantime, I have also verified that with this change, we pass the I have traced back where those testvectors got added to Wycheproof: C2SP/wycheproof#146 Thinking about it more: It seems inconsistent to validate some parts of the secret key ( My current opinion is that we should not partially validate the secret key. I recommend just skipping the invalid secret key tests in the Wycheproof tests (which is straightforward by filtering for @hanno-becker, @jakemas, @rod-chapman, @dkostic, would be great to hear your opinion. |
CBMC Results (ML-DSA-87)
Full Results (176 proofs)
|
CBMC Results (ML-DSA-65)
Full Results (176 proofs)
|
RFC: This PR is to evaluate the performance impact of this change and to discuss if such a check should be added or not. From a standard compliance point, I don't see a reason why it needs to be added. If performance impact is negligible, I wouldn't object adding it. It is just somewhat unclean, that it performs some input validation, while other parts of the inputs are not validated (see the other checks that have been added to pk_from_sk) - but the other checks would require recomputing the public key which is clearly too expensive. I am interested to hear what others think.
Validate s1 and s2 coefficient bounds in unpack_sk, ensuring that signing rejects secret keys with out-of-range s1/s2 encodings. Neither FIPS 204 nor the FIPS 140-3 IG describe this check, but it is covered by Wycheproof test vectors.
The bounds check was previously only performed in pk_from_sk. By moving it into unpack_sk, both signing and pk_from_sk benefit from the same check.
Note that pk_from_sk performs additional validation beyond this: it recomputes t0 and tr from (rho, s1, s2) and checks them against the stored values to verify internal consistency of the secret key.
TODO: