Skip to content

Commit 3ced09e

Browse files
committed
x86_64: Replace rej_uniform AVX2 intrinsics with assembly + HOL-Light proof
Replaces the intrinsics-based rej_uniform_avx2.c with a hand-written assembly routine (mld_rej_uniform_avx2_asm) and adds HOL-Light functional correctness and memory-safety proofs on top of s2n-bignum, plus the CBMC contract proof. Signed-off-by: Jake Massimo <jakemas@amazon.com>
1 parent 31c9b9e commit 3ced09e

25 files changed

Lines changed: 8175 additions & 270 deletions

.github/workflows/hol_light.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ jobs:
208208
needs: ["mldsa_specs.ml", "mldsa_utils.ml", "mldsa_zetas.ml", "subroutine_signatures.ml"]
209209
- name: intt_avx2_asm
210210
needs: ["mldsa_specs.ml", "mldsa_utils.ml", "mldsa_zetas.ml", "subroutine_signatures.ml"]
211+
- name: rej_uniform_avx2_asm
212+
needs: ["mldsa_specs.ml", "mldsa_rej_uniform_table.ml"]
211213
- name: nttunpack_avx2_asm
212214
needs: ["mldsa_specs.ml", "subroutine_signatures.ml"]
213215
- name: pointwise_avx2_asm

BIBLIOGRAPHY.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ source code and documentation.
308308
- [dev/x86_64/src/poly_use_hint_88_avx2_asm.S](dev/x86_64/src/poly_use_hint_88_avx2_asm.S)
309309
- [dev/x86_64/src/polyz_unpack_17_avx2_asm.S](dev/x86_64/src/polyz_unpack_17_avx2_asm.S)
310310
- [dev/x86_64/src/polyz_unpack_19_avx2_asm.S](dev/x86_64/src/polyz_unpack_19_avx2_asm.S)
311-
- [dev/x86_64/src/rej_uniform_avx2.c](dev/x86_64/src/rej_uniform_avx2.c)
311+
- [dev/x86_64/src/rej_uniform_avx2_asm.S](dev/x86_64/src/rej_uniform_avx2_asm.S)
312312
- [dev/x86_64/src/rej_uniform_eta2_avx2.c](dev/x86_64/src/rej_uniform_eta2_avx2.c)
313313
- [dev/x86_64/src/rej_uniform_eta4_avx2.c](dev/x86_64/src/rej_uniform_eta4_avx2.c)
314314
- [mldsa/src/native/x86_64/src/intt_avx2_asm.S](mldsa/src/native/x86_64/src/intt_avx2_asm.S)
@@ -326,7 +326,7 @@ source code and documentation.
326326
- [mldsa/src/native/x86_64/src/poly_use_hint_88_avx2_asm.S](mldsa/src/native/x86_64/src/poly_use_hint_88_avx2_asm.S)
327327
- [mldsa/src/native/x86_64/src/polyz_unpack_17_avx2_asm.S](mldsa/src/native/x86_64/src/polyz_unpack_17_avx2_asm.S)
328328
- [mldsa/src/native/x86_64/src/polyz_unpack_19_avx2_asm.S](mldsa/src/native/x86_64/src/polyz_unpack_19_avx2_asm.S)
329-
- [mldsa/src/native/x86_64/src/rej_uniform_avx2.c](mldsa/src/native/x86_64/src/rej_uniform_avx2.c)
329+
- [mldsa/src/native/x86_64/src/rej_uniform_avx2_asm.S](mldsa/src/native/x86_64/src/rej_uniform_avx2_asm.S)
330330
- [mldsa/src/native/x86_64/src/rej_uniform_eta2_avx2.c](mldsa/src/native/x86_64/src/rej_uniform_eta2_avx2.c)
331331
- [mldsa/src/native/x86_64/src/rej_uniform_eta4_avx2.c](mldsa/src/native/x86_64/src/rej_uniform_eta4_avx2.c)
332332
- [proofs/hol_light/x86_64/mldsa/intt_avx2_asm.S](proofs/hol_light/x86_64/mldsa/intt_avx2_asm.S)
@@ -344,6 +344,7 @@ source code and documentation.
344344
- [proofs/hol_light/x86_64/mldsa/poly_use_hint_88_avx2_asm.S](proofs/hol_light/x86_64/mldsa/poly_use_hint_88_avx2_asm.S)
345345
- [proofs/hol_light/x86_64/mldsa/polyz_unpack_17_avx2_asm.S](proofs/hol_light/x86_64/mldsa/polyz_unpack_17_avx2_asm.S)
346346
- [proofs/hol_light/x86_64/mldsa/polyz_unpack_19_avx2_asm.S](proofs/hol_light/x86_64/mldsa/polyz_unpack_19_avx2_asm.S)
347+
- [proofs/hol_light/x86_64/mldsa/rej_uniform_avx2_asm.S](proofs/hol_light/x86_64/mldsa/rej_uniform_avx2_asm.S)
347348

348349
### `Round3_Spec`
349350

dev/x86_64/meta.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ static MLD_INLINE int mld_rej_uniform_native(int32_t *r, unsigned len,
8080
}
8181

8282
/* Safety: outlen is at most MLDSA_N and, hence, this cast is safe. */
83-
return (int)mld_rej_uniform_avx2(r, buf);
83+
return (int)mld_rej_uniform_avx2_asm(r, buf, mld_rej_uniform_table);
8484
}
8585

8686
#if !defined(MLD_CONFIG_NO_KEYPAIR_API)

dev/x86_64/src/arith_native_x86_64.h

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,21 @@ __contract__(
7777
r[i] == old(*(int32_t (*)[MLDSA_N])r)[j])))
7878
);
7979

80-
#define mld_rej_uniform_avx2 MLD_NAMESPACE(mld_rej_uniform_avx2)
81-
MLD_MUST_CHECK_RETURN_VALUE
82-
unsigned mld_rej_uniform_avx2(int32_t *r,
83-
const uint8_t buf[MLD_AVX2_REJ_UNIFORM_BUFLEN]);
80+
#define mld_rej_uniform_avx2_asm MLD_NAMESPACE(rej_uniform_avx2_asm)
81+
/* This contract must be kept in sync with the HOL-Light specification
82+
* in proofs/hol_light/x86_64/proofs/rej_uniform_avx2_asm.ml */
83+
MLD_MUST_CHECK_RETURN_VALUE MLD_SYSV_ABI
84+
unsigned mld_rej_uniform_avx2_asm(
85+
int32_t *r, const uint8_t buf[MLD_AVX2_REJ_UNIFORM_BUFLEN],
86+
const uint8_t table[256][8])
87+
__contract__(
88+
requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
89+
requires(memory_no_alias(buf, 840))
90+
requires(table == mld_rej_uniform_table)
91+
assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
92+
ensures(return_value <= MLDSA_N)
93+
ensures(array_bound(r, 0, return_value, 0, MLDSA_Q))
94+
);
8495

8596
#if !defined(MLD_CONFIG_NO_KEYPAIR_API)
8697
#define mld_rej_uniform_eta2_avx2 MLD_NAMESPACE(mld_rej_uniform_eta2_avx2)

dev/x86_64/src/rej_uniform_avx2.c

Lines changed: 0 additions & 126 deletions
This file was deleted.

0 commit comments

Comments
 (0)