rust_native_obf/
encoding.rs

1pub const fn mba_encode_u32(val: u32, key: u32) -> u32 {
2    let a = val ^ key;
3    let b = a.wrapping_mul(0x9e3779b1);
4    let c = b.rotate_left(13);
5    let d = c ^ 0xdeadbeef;
6    d
7}
8
9pub const fn mba_decode_u32(val: u32, key: u32) -> u32 {
10    let d = val ^ 0xdeadbeef;
11    let c = d.rotate_right(13);
12    let b = c.wrapping_mul(0x61c88647);
13    let a = b ^ key;
14    a
15}
16
17pub const fn mba_encode_u64(val: u64, key: u64) -> u64 {
18    let a = val ^ key;
19    let b = a.wrapping_mul(0x517cc1b727220a95);
20    let c = b.rotate_left(31);
21    let d = c ^ 0xcafebabe12345678;
22    d
23}
24
25pub const fn mba_decode_u64(val: u64, key: u64) -> u64 {
26    let d = val ^ 0xcafebabe12345678;
27    let c = d.rotate_right(31);
28    let b = c.wrapping_mul(0xbf58476d1ce4e5b9);
29    let a = b ^ key;
30    a
31}
32
33#[macro_export]
34macro_rules! obf_const {
35    ($val:expr, u32) => {{
36        const _KEY: u32 = $crate::ct_rand!(u32, stringify!($val));
37        const _ENC: u32 = $crate::encoding::mba_encode_u32($val, _KEY);
38        $crate::encoding::mba_decode_u32(_ENC, _KEY)
39    }};
40    ($val:expr, u64) => {{
41        const _KEY: u64 = $crate::ct_rand!(u64, stringify!($val));
42        const _ENC: u64 = $crate::encoding::mba_encode_u64($val, _KEY);
43        $crate::encoding::mba_decode_u64(_ENC, _KEY)
44    }};
45}
46
47pub fn runtime_encode(val: usize) -> usize {
48    let key = 0x9e3779b97f4a7c15usize;
49    val.wrapping_mul(key).rotate_left(7) ^ 0xdeadbeef
50}
51
52pub fn runtime_decode(val: usize) -> usize {
53    let key_inv = 0xf1bbcdcbfa53dcc9usize;
54    (val ^ 0xdeadbeef).rotate_right(7).wrapping_mul(key_inv)
55}
56