feat: add Jasmin assembly integration for crypto acceleration

- Integrated `zupt_mac_verify_ct` in `zupt_decrypt_buffer()` to replace C XOR loop for HMAC-SHA256
- Integrated `zupt_ct_select_32` in `zupt_mlkem768_decaps()` to replace C `cmov()` for FO transformation
- Added `include/zupt_jasmin.h` with extern declarations and ABI docs
- Added `#ifdef ZUPT_USE_JASMIN` guards with clean C fallbacks in `zupt_crypto.c` and `zupt_mlkem.c`
- Makefile now auto-detects `jasmin/*.s`, assembles and links with `-DZUPT_USE_JASMIN`

Closes #3
This commit is contained in:
Cristian Cezar Moisés 2026-03-28 23:00:28 -03:00
commit 06c877ec86
43 changed files with 1913 additions and 546 deletions

View file

@ -0,0 +1,31 @@
/* Zupt — ML-KEM Constant-Time Select (Jasmin)
* Copyright (c) 2026 Cristian Cezar Moisés — MIT License
*
* CT-REQUIRED: FO implicit rejection must not leak via timing.
* Operates in u64 chunks: 4 × 8 = 32 bytes, no byte access.
*/
export fn zupt_ct_select_32(
reg u64 out_ptr,
reg u64 a_ptr,
reg u64 b_ptr,
reg u64 cond)
{
reg u64 mask va vb tmp sel;
inline int i;
mask = 0;
mask -= cond;
/* 4 × u64 = 32 bytes */
for i = 0 to 4 {
va = [a_ptr + 8 * i];
vb = [b_ptr + 8 * i];
tmp = va;
tmp ^= vb;
tmp &= mask;
sel = va;
sel ^= tmp;
[out_ptr + 8 * i] = sel;
}
}