//! Custom polynomial S-Box: S(x) = 192x^6 + 224x^5 + 120x^4 + 200x^3 + 150x^2 + 65x + 147 (mod 256)
//! Corresponds to pow_main_dispatch State 0x0E/0x0F
//! Evidence: constants 0xE0, 0x78, -0x40, 0x86838DC8, 0x96, 0x41, 0x93

/// Apply polynomial S-Box to each byte of a 32-byte buffer.
/// Decompiled:
///   iVar4 = iVar1 * iVar1;           // x^2
///   iVar10 = iVar4 * iVar4;          // x^4
///   result = iVar1 * iVar10 * 0xe0   // 224*x^5
///          + iVar10 * 0x78            // 120*x^4
///          + iVar10 * iVar4 * -0x40   // -64*x^6 = 192*x^6 (mod 256)
///          + ((iVar1 * 0x86838DC8 + 0x96) * iVar1 + 0x41) * iVar1
///          + 0x93;
pub fn apply_polynomial_sbox(buf: &mut [u8; 32]) {
    for b in buf.iter_mut() {
        let x = *b as u32;
        let x2 = x.wrapping_mul(x);
        let x4 = x2.wrapping_mul(x2);
        let result = x.wrapping_mul(x4).wrapping_mul(0xE0)                        // 224*x^5
            .wrapping_add(x4.wrapping_mul(0x78))                                   // 120*x^4
            .wrapping_add(x4.wrapping_mul(x2).wrapping_mul(0xFFFF_FFC0))           // 192*x^6 (-64 mod 2^32)
            .wrapping_add(
                x.wrapping_mul(0x86838DC8_u32).wrapping_add(0x96)                  // 200*x + 150
                    .wrapping_mul(x).wrapping_add(0x41)                            // *x + 65
                    .wrapping_mul(x)                                               // -> 200x^3+150x^2+65x
            )
            .wrapping_add(0x93);                                                   // + 147
        *b = result as u8;
    }
}
