Side-Channel › kem-19 · Report

Constant-time review: Lore

The CPA secret polynomial, recovered message mu, fallback seed z, and shared secret are secret. The ciphertext and public key are public. This traces Lore-SHAKE/Lore-L2 reference C; Lore-SM3 and other levels are not independently certified.

kem.c:184-236 decrypts under the CPA secret, re-encrypts, computes both candidate/fallback shared secrets, and selects with cmov. In the re-encryption path, indcpa.c:240-252 branches while packing overflow bits of the regenerated ciphertext. On a valid ciphertext those bits match public ciphertext encoding; on an invalid ciphertext they may be derived from private-key decryption. The unpacking branch at indcpa.c:302 reads the public ciphertext and is not a secret leak. Fixed public modulus arithmetic is not treated as a hardware divide without code-generation evidence.

The BCH path has stronger evidence. In the Lore-SM3/Lore-L2 reference tree, poly.c:540-578 derives a received codeword from the secret-dependent decryption result and invokes decode_bch; the SHAKE tree's corresponding code is one line later. The submitted decoder conditionally updates syndromes for each set received-word bit (bch_codec.c:403-418), returns early for zero syndromes and decoding failure (:544-550), evaluates a locator polynomial only to its secret-dependent degree (:489-499), and stops its root search after finding that many roots (:503-519). The reference and AVX decoder copies are byte-identical across SHAKE and SM3 at L2–L4. NEON uses a secret-indexed nibble table instead of the per-bit syndrome branch, while retaining the later early exits. Jinnuo Li reports complete Lore-L2 secret recovery from these timing signals on STM32F4 and x86; this is filed as kem-19-3, High / Probable / Side-channel, because the measurements and recovery have not been independently replayed.

Status: the BCH timing path is reported as kem-19-3; the separate re-encryption packing branch remains an unpromoted lead.