Fixture 150

obfuscation composite

C · 3 functions · 4 lanes · 9 of 12 function-lanes behave identically

2 of 4 lanes have a function that returns a different result after decompilation: gcc-O2 (1/3), clang-O0 (2/3).

The whole adversarial stack at once — which is how real obfuscated code arrives, because the passes compose:

* control-flow flattening (145): a dispatcher loop over a state variable, * opaque predicates (146): guards that are constant at runtime but not at compile time, including a volatile sentinel, * instruction substitution (147) and MBA (149): every add/sub/xor rewritten into mixed boolean-arithmetic form, * dispatch obfuscation (148): the dispatcher's successor comes from a table and the per-state operation from a function-pointer table.

Why the combination is worse than the sum: each pass individually leaves one recovery handle intact, and the next pass removes it. Flattening alone leaves readable state constants — until the successor is a table load. A jump table alone can be resolved by range analysis on the index — until the index is an MBA expression that the range analysis cannot narrow. An MBA expression alone can be attacked by symbolic simplification — until it is spread across dispatcher states so no single basic block contains a whole identity.

This is where "confident nonsense" is generated in practice: with no handle left, a decompiler that keeps guessing produces structured, well-typed, named output that is wrong about the loop trip count, the operation applied, and the branch taken, all at once. Only an execution differential separates that from the truth, which is the point of this corpus.

Fully defined for every input: unsigned arithmetic throughout, literal shift counts below 32, all indices masked to their table size, all buffer bounds validated against small constants, and every dispatcher carrying a step budget so it terminates.

tests/decompiler_fixtures/src/150_obfuscation_composite.c source
#include <stdint.h>

/* The whole adversarial stack at once — which is how real obfuscated code
 * arrives, because the passes compose:
 *
 *   * control-flow flattening (145): a dispatcher loop over a state variable,
 *   * opaque predicates (146): guards that are constant at runtime but not at
 *     compile time, including a `volatile` sentinel,
 *   * instruction substitution (147) and MBA (149): every add/sub/xor rewritten
 *     into mixed boolean-arithmetic form,
 *   * dispatch obfuscation (148): the dispatcher's successor comes from a table
 *     and the per-state operation from a function-pointer table.
 *
 * Why the combination is worse than the sum: each pass individually leaves one
 * recovery handle intact, and the next pass removes it. Flattening alone leaves
 * readable state constants — until the successor is a table load. A jump table
 * alone can be resolved by range analysis on the index — until the index is an
 * MBA expression that the range analysis cannot narrow. An MBA expression alone
 * can be attacked by symbolic simplification — until it is spread across
 * dispatcher states so no single basic block contains a whole identity.
 *
 * This is where "confident nonsense" is generated in practice: with no handle
 * left, a decompiler that keeps guessing produces structured, well-typed,
 * named output that is wrong about the loop trip count, the operation applied,
 * and the branch taken, all at once. Only an execution differential separates
 * that from the truth, which is the point of this corpus.
 *
 * Fully defined for every input: unsigned arithmetic throughout, literal shift
 * counts below 32, all indices masked to their table size, all buffer bounds
 * validated against small constants, and every dispatcher carrying a step
 * budget so it terminates.
 */

#define COMP150_S_ENTRY 0
#define COMP150_S_TEST 1
#define COMP150_S_MIX 2
#define COMP150_S_GUARD 3
#define COMP150_S_STORE 4
#define COMP150_S_STEP 5
#define COMP150_S_DONE 6

#define COMP150_MAX_ELEMS 16
#define COMP150_MAX_BYTES 16
#define COMP150_MAX_ROUNDS 4
#define COMP150_MAX_STEPS 512
#define COMP150_OPS 4

/* Never written; reads always yield zero but the compiler cannot know it. */
static volatile uint32_t comp150_sentinel = 0u;

static uint32_t comp150_add(uint32_t x, uint32_t y) {
    return (x ^ y) + ((x & y) << 1);
}

static uint32_t comp150_sub(uint32_t x, uint32_t y) {
    return (x ^ y) - (((~x) & y) << 1);
}

static uint32_t comp150_xor(uint32_t x, uint32_t y) {
    return (x | y) - (x & y);
}

/* Identically zero for every input pair. */
static uint32_t comp150_nonce(uint32_t x, uint32_t y) {
    return comp150_add(x, y) - (x | y) - (x & y);
}

static uint32_t comp150_op_mix(uint32_t a, uint32_t b) {
    return comp150_add(a, comp150_xor(b, 0x2545F491u));
}

static uint32_t comp150_op_fold(uint32_t a, uint32_t b) {
    return comp150_sub(a, (b << 3) | (b >> 29));
}

static uint32_t comp150_op_scatter(uint32_t a, uint32_t b) {
    return comp150_xor((a << 5) ^ (a >> 11), b);
}

static uint32_t comp150_op_seal(uint32_t a, uint32_t b) {
    return comp150_add(a * 0x9E3779B1u, comp150_nonce(a, b));
}

typedef uint32_t (*comp150_stage)(uint32_t, uint32_t);

static comp150_stage const COMP150_STAGES[COMP150_OPS] = {
    comp150_op_mix,
    comp150_op_fold,
    comp150_op_scatter,
    comp150_op_seal,
};

/* State -> successor when the guard is taken, and the operation slot per state.
 * The dispatcher's edges therefore live in .rodata, not in the code. */
static const uint8_t COMP150_SLOT_MAP[8] = {1, 3, 0, 2, 2, 0, 3, 1};
static const uint8_t COMP150_STIR_MAP[8] = {6, 4, 7, 5, 1, 3, 0, 2};

/* Flattened loop, table-selected operation per element, opaque guard choosing
 * between two live arms, MBA arithmetic in every state. */
__attribute__((noinline)) int32_t
obfuscated_transform(int32_t *values, int32_t count, int32_t seed) {
    int32_t state = COMP150_S_ENTRY;
    int32_t index = 0;
    int32_t steps;
    uint32_t acc = 0u;
    uint32_t current = 0u;

    if (values == 0 || count < 0 || count > COMP150_MAX_ELEMS) {
        return -1;
    }

    for (steps = 0; steps < COMP150_MAX_STEPS && state != COMP150_S_DONE; ++steps) {
        switch (state) {
        case COMP150_S_ENTRY:
            acc = (uint32_t)seed ^ comp150_sentinel;
            index = 0;
            state = COMP150_S_TEST;
            break;
        case COMP150_S_TEST:
            state = (index < count) ? COMP150_S_MIX : COMP150_S_DONE;
            break;
        case COMP150_S_MIX: {
            uint32_t slot = (uint32_t)COMP150_SLOT_MAP[(uint32_t)index & 7u];
            current = COMP150_STAGES[slot & (uint32_t)(COMP150_OPS - 1)](
                acc, (uint32_t)values[index]);
            state = COMP150_S_GUARD;
            break;
        }
        case COMP150_S_GUARD:
            /* `n * (n + 1)` is always even, so the first arm always runs; the
             * second is structurally live and dynamically dead. */
            if (((current * (current + 1u)) & 1u) == 0u) {
                acc = comp150_add(current, comp150_nonce(acc, current));
            } else {
                acc = comp150_sub(current, 0x1234u);
            }
            state = COMP150_S_STORE;
            break;
        case COMP150_S_STORE:
            values[index] = (int32_t)acc;
            state = COMP150_S_STEP;
            break;
        case COMP150_S_STEP:
            index += 1;
            state = COMP150_S_TEST;
            break;
        default:
            state = COMP150_S_DONE;
            break;
        }
    }
    return (int32_t)comp150_xor(acc, (uint32_t)index);
}

/* Nested obfuscation: a bounded outer round loop wrapped around a flattened
 * inner walk whose successor comes from a stir table and whose accumulator
 * update is MBA. Both bounds are validated. */
__attribute__((noinline)) uint32_t
obfuscated_digest(uint8_t *data, int32_t length, int32_t rounds) {
    int32_t round;
    uint32_t acc = 0x811C9DC5u;
    uint32_t cursor = 0u;

    if (data == 0 || length < 0 || length > COMP150_MAX_BYTES) {
        return 0u;
    }
    if (rounds < 0 || rounds > COMP150_MAX_ROUNDS) {
        return 0u;
    }

    for (round = 0; round < rounds; ++round) {
        int32_t state = COMP150_S_TEST;
        int32_t index = 0;
        int32_t steps;

        for (steps = 0; steps < COMP150_MAX_STEPS && state != COMP150_S_DONE; ++steps) {
            switch (state) {
            case COMP150_S_TEST:
                state = (index < length) ? COMP150_S_MIX : COMP150_S_DONE;
                break;
            case COMP150_S_MIX: {
                uint32_t byte = (uint32_t)data[index];
                uint32_t slot = (uint32_t)COMP150_SLOT_MAP[cursor & 7u];
                acc = COMP150_STAGES[slot & (uint32_t)(COMP150_OPS - 1)](acc, byte);
                cursor = (uint32_t)COMP150_STIR_MAP[cursor & 7u];
                state = COMP150_S_STEP;
                break;
            }
            case COMP150_S_STEP:
                index += 1;
                state = COMP150_S_TEST;
                break;
            default:
                state = COMP150_S_DONE;
                break;
            }
        }
        acc = comp150_xor(acc, comp150_add((uint32_t)round, comp150_nonce(acc, cursor)));
    }
    return comp150_add(acc, (uint32_t)length);
}

/* No loop, no buffer: a chain of opaque predicates whose (constant) outcomes
 * select table entries, with MBA arithmetic between them. The whole function is
 * a fixed sequence of three stages dressed up as input-dependent branching. */
__attribute__((noinline)) int32_t
obfuscated_predicate_chain(int32_t a, int32_t b, int32_t c) {
    uint32_t x = (uint32_t)a;
    uint32_t y = (uint32_t)b;
    uint32_t z = (uint32_t)c;
    uint32_t gate = comp150_sentinel;
    uint32_t first;
    uint32_t second;
    uint32_t slot;

    /* A square is 0 or 1 modulo 4, so the second arm is unreachable. */
    if (((x * x) & 3u) < 2u) {
        first = comp150_add(x, comp150_nonce(y, z));
    } else {
        first = comp150_sub(x, y);
    }

    /* `(v | 1)` is odd, so the first arm always runs. */
    slot = ((y | 1u) & 1u) ? (uint32_t)COMP150_SLOT_MAP[first & 7u]
                           : (uint32_t)COMP150_STIR_MAP[first & 7u];
    second = COMP150_STAGES[slot & (uint32_t)(COMP150_OPS - 1)](first, y);

    /* The sentinel is always zero, so the blend always yields `second`. */
    second = second ^ ((second ^ z) & (0u - (gate & 1u)));
    return (int32_t)comp150_xor(second, comp150_add(z, gate));
}

Recovered C

Generated by glaurung decompile --style decbench at b47f6b43. baseline.json records the result after recompiling the C and calling it beside the original with seeded inputs.

gcc -O2

1/3
obfuscated_digest fail 87 lines
// glaurung: obfuscated_digest @ 0x1270
uint32_t obfuscated_digest(uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int acc;
    int index;
    unsigned int cursor;
    unsigned int byte;
    int round;
    int state;
    long local_10;
    long local_18;
    long local_20;
    long local_30;
    long local_8;
    long ret;
    long var1;
    long var14;
    long var17;
    long var24;
    long var28;
    long var3;
    long var39;
    long var4;
    long var43;
    long var5;
    long var50;
    long var6;
    long var62;
    int var68;
    long var7;
    if ((arg0 == 0)) {
        return 0;
    }
    local_8 = var1;
    ret = 0;
    local_10 = var3;
    local_18 = var4;
    local_20 = var5;
    local_30 = var6;
    var7 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    var14 = (unsigned long)((unsigned int)(arg2));
    ret = 0;
    if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        var17 = 0x811c9dc5;
    } else {
        var24 = 0;
        var28 = 0;
        acc = 0x811c9dc5;
        do {
            index = 0;
            cursor = var28;
            while (((((unsigned int)(var7) == (unsigned int)(index)) | ((long)((int)(var7)) < (long)(index))) == 0)) {
                var39 = (unsigned long)((unsigned int)((cursor & 7)));
                index = (index + 1);
                var43 = ((long (*)(void))(COMP150_STAGES[(unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((var39 == 0) ? 1 : ((var39 == 1) ? 3 : ((var39 == 2) ? 0 : ((var39 == 3) ? 2 : ((var39 == 4) ? 2 : ((var39 == 5) ? 0 : ((var39 == 6) ? 3 : ((var39 == 7) ? 1 : *(char *)((0x2008 + var39)))))))))))) & 3)))]))();
                acc = (unsigned long)((unsigned int)(var43));
                cursor = (unsigned int)((unsigned char)(((var39 == 0) ? 6 : ((var39 == 1) ? 4 : ((var39 == 2) ? 7 : ((var39 == 3) ? 5 : ((var39 == 4) ? 1 : ((var39 == 5) ? 3 : ((var39 == 6) ? 0 : ((var39 == 7) ? 2 : *(char *)((0x2000 + var39))))))))))));
            }
            var50 = (unsigned long)((unsigned int)((acc & cursor)));
            var62 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var50 + var50))) - (unsigned long)((unsigned int)((acc | cursor)))))) + (unsigned long)((unsigned int)((acc ^ cursor)))))) - var50)));
            var68 = (var24 + 1);
            acc = (unsigned long)((unsigned int)((acc ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var62 ^ var24))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var62)) & var24))) * 2)))))));
            var24 = (unsigned long)((unsigned int)(var68));
            var28 = (unsigned long)(cursor);
            var17 = (unsigned long)(acc);
        } while (((unsigned int)(var14) != (unsigned int)(var68)));
    }
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)((var7 ^ var17))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var7)) & var17))) * 2)));
}
obfuscated_predicate_chain pass 30 lines
// glaurung: obfuscated_predicate_chain @ 0x1370
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int32_t obfuscated_predicate_chain(int32_t arg0, int32_t arg1, int32_t arg2) {
    extern unsigned char glaurung_global_4024[16];
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int z;
    unsigned int first;
    unsigned int gate;
    unsigned int x;
    long var12;
    long var18;
    long var33;
    long var5;
    z = (unsigned long)((unsigned int)(arg2));
    var5 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) & (unsigned long)((unsigned int)(arg2)))));
    var12 = (unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0])));
    var18 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var5 + var5))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) | (unsigned long)((unsigned int)(arg2)))))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) ^ (unsigned long)((unsigned int)(arg2)))))))) - var5)));
    var33 = ((long (*)(int))(COMP150_STAGES[(unsigned long)((unsigned int)(((unsigned int)((unsigned char)((((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))) == 7) ? 1 : *(char *)((0x2008 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ var18))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned long)((unsigned int)(arg0)))) & var18))) * 2)))))) & 7))))))))))))))) & 3)))]))(arg0);
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)(z) ^ var12))) + ((unsigned long)((unsigned int)(((unsigned long)(z) & var12))) * 2)))) ^ (unsigned long)((unsigned int)(var33))))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((z ^ (unsigned long)((unsigned int)(var33))))) & (-(unsigned long)((unsigned int)((var12 & 1)))))))));
}
obfuscated_transform fail 62 lines
// glaurung: obfuscated_transform @ 0x1190
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int32_t obfuscated_transform(int32_t * arg0, int32_t arg1, int32_t arg2) {
    extern unsigned char glaurung_global_4024[16];
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    int index;
    unsigned int acc;
    unsigned int current;
    int state;
    int steps;
    long var1;
    long var16;
    long var23;
    int var30;
    long var36;
    long var4;
    long var42;
    long var53;
    long var8;
    if ((arg0 == 0)) {
        return (unsigned int)(-1);
    }
    var1 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return 0xffffffff;
    } else {
        var4 = (long)arg0;
        var8 = (long)(0x2008);
        index = 0;
        acc = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) ^ (unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))))));
        while (1) {
            var16 = (unsigned long)((unsigned int)(index));
            if (((((unsigned int)(var1) == (unsigned int)(index)) | ((long)((int)(var1)) < (long)(index))) != 0)) {
                break;
            }
            var23 = ((long (*)(unsigned int, long))(COMP150_STAGES[(unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((var8 + (unsigned long)((unsigned int)((index & 7))))))) & 3)))]))(acc, (unsigned long)((unsigned int)(*(int *)((var4 + index * 4)))));
            current = (unsigned long)((unsigned int)(var23));
            if (((unsigned long)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var23 + 1))) * (unsigned long)((unsigned int)(var23))))) & 1))) != 0)) {
                var30 = (~current);
                var36 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var30 + var30))) & 0x2468)));
                acc = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((current ^ 0x1234))) - var36)));
                current = var36;
            } else {
                var42 = (unsigned long)((unsigned int)((current & acc)));
                var53 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var42 + var42))) - (unsigned long)((unsigned int)((current | acc)))))) + (unsigned long)((unsigned int)((acc ^ current)))))) - var42)));
                acc = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var53 ^ current))) + ((unsigned long)((unsigned int)((current & var53))) * 2))));
            }
            *(int *)((var4 + index * 4)) = acc;
            index = (index + 1);
        }
        return (unsigned int)((var16 ^ acc));
    }
}

clang -O0

2/3
obfuscated_digest pass 123 lines
// glaurung: obfuscated_digest @ 0x1390
uint32_t obfuscated_digest(uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern unsigned int comp150_add(unsigned int, unsigned int);
    extern unsigned int comp150_nonce(unsigned int, unsigned int);
    extern unsigned int comp150_xor(unsigned int, unsigned int);
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int acc;
    unsigned int cursor;
    int round;
    int state;
    int index;
    int steps;
    unsigned int byte;
    unsigned int slot;
    signed char local_39;
    int local_4;
    int local_40;
    int local_44;
    int local_48;
    long var45;
    unsigned int var61;
    unsigned int var63;
    unsigned int var65;
    unsigned int var70;
    acc = -0x7ee3623bLL;
    cursor = 0;
    if ((arg0 != 0)) {
        if ((0 <= (long)(arg1))) {
            if ((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16))) {
                goto L_13db;
            }
        }
    }
    local_4 = 0;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_13db: ;
    if ((0 <= (long)(arg2))) {
        if ((((unsigned long)((unsigned int)(arg2)) == 4) | ((long)(arg2) < 4))) {
            goto L_13fb;
        }
    }
    local_4 = 0;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_13fb: ;
    round = 0;
    L_1402: ;
    if ((arg2 <= round)) {
        goto L_1578;
    }
    state = 1;
    index = 0;
    steps = 0;
    L_1423: ;
    local_39 = 0;
    if (((long)(steps) < 512)) {
        local_39 = ((unsigned long)((unsigned int)(state)) != 6);
    }
    if (((unsigned long)((unsigned char)((local_39 & 1))) == 0)) {
        goto L_153c;
    }
    local_40 = state;
    if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(state)) - 1))) == 0)) {
        goto L_1485;
    }
    goto L_1463;
    L_1463: ;
    if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_40)) - 2))) == 0)) {
        goto L_14a2;
    }
    goto L_1474;
    L_1474: ;
    if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_40)) - 5))) == 0)) {
        goto L_150d;
    }
    goto L_1522;
    L_1485: ;
    state = ((index < arg1) ? 2 : 6);
    goto L_1529;
    L_14a2: ;
    byte = (unsigned char)(arg0[index]);
    slot = (unsigned char)(((unsigned long)((unsigned int)((cursor & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)((cursor & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)((cursor & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)((cursor & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)((cursor & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)((cursor & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)((cursor & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)((cursor & 7))) == 7) ? 1 : *(char *)((0x2018 + (unsigned long)((unsigned int)((cursor & 7)))))))))))));
    var45 = ((long (*)(unsigned int, unsigned int))(COMP150_STAGES[(unsigned long)((unsigned int)((unsigned long)((unsigned int)((unsigned long)((unsigned int)((slot & 3)))))))]))(acc, byte);
    acc = var45;
    cursor = (unsigned char)(((unsigned long)((unsigned int)((cursor & 7))) == 0) ? 6 : (((unsigned long)((unsigned int)((cursor & 7))) == 1) ? 4 : (((unsigned long)((unsigned int)((cursor & 7))) == 2) ? 7 : (((unsigned long)((unsigned int)((cursor & 7))) == 3) ? 5 : (((unsigned long)((unsigned int)((cursor & 7))) == 4) ? 1 : (((unsigned long)((unsigned int)((cursor & 7))) == 5) ? 3 : (((unsigned long)((unsigned int)((cursor & 7))) == 6) ? 0 : (((unsigned long)((unsigned int)((cursor & 7))) == 7) ? 2 : *(char *)((0x2020 + (unsigned long)((unsigned int)((cursor & 7)))))))))))));
    state = 5;
    goto L_1529;
    L_150d: ;
    index = ((unsigned int)(index) + 1);
    state = 1;
    goto L_1529;
    L_1522: ;
    state = 6;
    L_1529: ;
    goto L_152e;
    L_152e: ;
    steps = ((unsigned int)(steps) + 1);
    goto L_1423;
    L_153c: ;
    local_44 = acc;
    local_48 = round;
    var61 = comp150_nonce(acc, cursor);
    var63 = comp150_add((unsigned long)((unsigned int)(local_48)), var61);
    var65 = comp150_xor((unsigned long)((unsigned int)(local_44)), var63);
    acc = var65;
    round = ((unsigned int)(round) + 1);
    goto L_1402;
    L_1578: ;
    var70 = comp150_add(acc, (unsigned long)((unsigned int)(arg1)));
    local_4 = var70;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
obfuscated_predicate_chain pass 59 lines
// glaurung: obfuscated_predicate_chain @ 0x1590
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int32_t obfuscated_predicate_chain(int32_t arg0, int32_t arg1, int32_t arg2) {
    extern unsigned int comp150_add(unsigned int, unsigned int);
    extern unsigned int comp150_nonce(unsigned int, unsigned int);
    extern unsigned int comp150_sub(unsigned int, unsigned int);
    extern unsigned int comp150_xor(unsigned int, unsigned int);
    extern unsigned char glaurung_global_4024[16];
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int x;
    unsigned int y;
    unsigned int z;
    unsigned int gate;
    unsigned int first;
    unsigned int slot;
    unsigned int second;
    int local_2c;
    int local_30;
    int local_34;
    unsigned int ret;
    unsigned int var12;
    unsigned int var14;
    long var43;
    unsigned int var61;
    unsigned int var9;
    // x86-64 prologue: save rbp, frame 64 bytes
    x = arg0;
    y = arg1;
    z = arg2;
    gate = *(int *)(&glaurung_global_4024[0]);
    if (((unsigned long)(2) <= (unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((x * x))) & 3)))))) {
        var9 = comp150_sub(x, y);
        first = var9;
    } else {
        local_2c = x;
        var12 = comp150_nonce(y, z);
        var14 = comp150_add((unsigned long)((unsigned int)(local_2c)), var12);
        first = var14;
    }
    local_30 = (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((y | 1))) & 1))) == 0) ? (unsigned char)(((unsigned long)((unsigned int)((first & 7))) == 0) ? 6 : (((unsigned long)((unsigned int)((first & 7))) == 1) ? 4 : (((unsigned long)((unsigned int)((first & 7))) == 2) ? 7 : (((unsigned long)((unsigned int)((first & 7))) == 3) ? 5 : (((unsigned long)((unsigned int)((first & 7))) == 4) ? 1 : (((unsigned long)((unsigned int)((first & 7))) == 5) ? 3 : (((unsigned long)((unsigned int)((first & 7))) == 6) ? 0 : (((unsigned long)((unsigned int)((first & 7))) == 7) ? 2 : *(char *)((0x2020 + (unsigned long)((unsigned int)((first & 7))))))))))))) : (unsigned char)(((unsigned long)((unsigned int)((first & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)((first & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)((first & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)((first & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)((first & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)((first & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)((first & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)((first & 7))) == 7) ? 1 : *(char *)((0x2018 + (unsigned long)((unsigned int)((first & 7))))))))))))));
    slot = local_30;
    var43 = ((long (*)(unsigned int, unsigned int))(COMP150_STAGES[(unsigned long)((unsigned int)((unsigned long)((unsigned int)((unsigned long)((unsigned int)((slot & 3)))))))]))(first, y);
    second = var43;
    second = (second ^ (unsigned int)(((unsigned long)((unsigned int)((second ^ z))) & (unsigned long)((unsigned int)((0 - (unsigned long)((unsigned int)((gate & 1)))))))));
    local_34 = second;
    var61 = comp150_add(z, gate);
    ret = comp150_xor((unsigned long)((unsigned int)(local_34)), var61);
    // x86-64 epilogue: restore rbp
    return ret;
}
obfuscated_transform fail 61 lines
// glaurung: obfuscated_transform @ 0x1100
int32_t obfuscated_transform(int32_t * arg0, int32_t arg1, int32_t arg2) {
    extern unsigned int comp150_sub(unsigned int, unsigned int);
    extern unsigned int comp150_xor(unsigned int, unsigned int);
    int state;
    int index;
    unsigned int acc;
    unsigned int current;
    int steps;
    unsigned int slot;
    signed char local_31;
    int local_4;
    long local_40;
    unsigned int var58;
    unsigned int var68;
    state = 0;
    index = 0;
    acc = 0;
    current = 0;
    if ((arg0 != 0)) {
        if ((0 <= (long)(arg1))) {
            if ((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16))) {
                goto L_1159;
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1159: ;
    steps = 0;
    L_1160: ;
    local_31 = 0;
    if (((long)(steps) < 512)) {
        local_31 = ((unsigned long)((unsigned int)(state)) != 6);
    }
    if (((unsigned long)((unsigned char)((local_31 & 1))) == 0)) {
        goto L_12db;
    }
    local_40 = (unsigned int)(state);
    if (((unsigned long)(5) < (unsigned long)((unsigned long)((unsigned int)(state))))) {
        goto L_12c1;
    }
    /* unrecovered indirect jump through ((long)((int)(*(int *)((0x2000 + (local_40 * 4))))) + 0x2000) */
    var58 = comp150_sub(current, 0x1234);
    acc = var58;
    state = 4;
    goto L_12c8;
    L_12c1: ;
    state = 6;
    L_12c8: ;
    goto L_12cd;
    L_12cd: ;
    steps = ((unsigned int)(steps) + 1);
    goto L_1160;
    L_12db: ;
    var68 = comp150_xor(acc, (unsigned long)((unsigned int)(index)));
    local_4 = var68;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

3/3
obfuscated_digest pass 136 lines
// glaurung: obfuscated_digest @ 0x1260
uint32_t obfuscated_digest(uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int acc;
    int index;
    int state;
    unsigned int byte;
    unsigned int cursor;
    int round;
    int steps;
    long ret;
    long var1;
    long var13;
    long var15;
    long var17;
    long var2;
    long var28;
    int var36;
    long var39;
    long var41;
    long var47;
    long var54;
    long var55;
    long var56;
    int var57;
    long var60;
    long var66;
    int var69;
    long var8;
    // x86-64 prologue: save callee registers, frame 56 bytes
    ret = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore callee registers
        return ret;
    }
    var1 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        // x86-64 epilogue: restore callee registers
        return ret;
    }
    if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        // x86-64 epilogue: restore callee registers
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        var41 = 0x811c9dc5;
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(((unsigned long)((unsigned int)((0x811c9dc5 ^ var1))) + ((unsigned long)((unsigned int)((0x811c9dc5 & var1))) * 2)));
    }
    var2 = (long)arg0;
    var8 = 0;
    var13 = 0;
    var15 = 0x811c9dc5;
    goto L_12dc;
    L_12b0: ;
    var28 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var17)) ^ acc))) - var17))) - acc))) + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var17)) & acc))) * 2))));
    var15 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var28)) ^ var13))) + ((unsigned long)((unsigned int)((var28 & var13))) * 2)))) ^ acc)));
    var36 = (var13 + 1);
    var8 = var17;
    var13 = (unsigned long)((unsigned int)(var36));
    var41 = var15;
    if (((unsigned int)(var36) == (unsigned int)(arg2))) {
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var41)) ^ var1))) + ((unsigned long)((unsigned int)((var41 & var1))) * 2)));
    }
    L_12dc: ;
    var39 = 0;
    var47 = var8;
    index = 0;
    acc = (unsigned long)((unsigned int)(var15));
    state = 1;
    L_12f0: ;
    if (((unsigned long)((unsigned int)(state)) != 5)) {
        if (((unsigned long)((unsigned int)(state)) == 2)) {
            goto L_1340;
        }
        var17 = var47;
        if (((unsigned long)((unsigned int)(state)) != 1)) {
            goto L_12b0;
        }
        var54 = var47;
        var55 = (unsigned long)((unsigned int)(index));
        var56 = (unsigned long)(acc);
        state = (unsigned long)((unsigned int)(((((long)((int)(var1)) <= (long)(index)) * 4) + 2)));
        if (((unsigned long)((unsigned long)((unsigned int)(var39))) <= (unsigned long)(510))) {
            goto L_1385;
        }
        var17 = var47;
        goto L_12b0;
    }
    var57 = (index + 1);
    index = (unsigned long)((unsigned int)(var57));
    state = 1;
    var54 = var47;
    var55 = (unsigned long)((unsigned int)(var57));
    var56 = (unsigned long)(acc);
    if (((unsigned long)((unsigned long)((unsigned int)(var39))) <= (unsigned long)(510))) {
        goto L_1385;
    }
    var17 = var47;
    goto L_12b0;
    L_1340: ;
    var60 = (unsigned long)((unsigned int)((var47 & 7)));
    var66 = ((long (*)(unsigned int, unsigned int))(COMP150_STAGES[(unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((var60 == 0) ? 1 : ((var60 == 1) ? 3 : ((var60 == 2) ? 0 : ((var60 == 3) ? 2 : ((var60 == 4) ? 2 : ((var60 == 5) ? 0 : ((var60 == 6) ? 3 : ((var60 == 7) ? 1 : *(char *)((var60 + 0x2018)))))))))))) & 3)))]))(acc, (unsigned int)((unsigned char)(*(char *)((var2 + (long)(index))))));
    var69 = (unsigned int)((unsigned char)(((var60 == 0) ? 6 : ((var60 == 1) ? 4 : ((var60 == 2) ? 7 : ((var60 == 3) ? 5 : ((var60 == 4) ? 1 : ((var60 == 5) ? 3 : ((var60 == 6) ? 0 : ((var60 == 7) ? 2 : *(char *)((var60 + 0x2020))))))))))));
    var17 = (unsigned long)((unsigned int)(var69));
    acc = var66;
    var54 = (unsigned long)((unsigned int)(var69));
    var55 = (unsigned long)((unsigned int)(index));
    var56 = var66;
    state = 5;
    if (((unsigned long)(510) < (unsigned long)((unsigned long)((unsigned int)(var39))))) {
        goto L_12b0;
    }
    L_1385: ;
    var39 = (unsigned long)((unsigned int)((var39 + 1)));
    var47 = var54;
    index = var55;
    acc = var56;
    if (((unsigned long)((unsigned int)(state)) != 6)) {
        goto L_12f0;
    }
    var17 = var54;
    index = var55;
    acc = var56;
    goto L_12b0;
}
obfuscated_predicate_chain pass 36 lines
// glaurung: obfuscated_predicate_chain @ 0x13c0
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int32_t obfuscated_predicate_chain(int32_t arg0, int32_t arg1, int32_t arg2) {
    extern unsigned char glaurung_global_4024[16];
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int z;
    unsigned int first;
    unsigned int gate;
    unsigned int second;
    long var1;
    long var25;
    long var39;
    long var9;
    // x86-64 prologue: save callee registers, frame 24 bytes
    z = (unsigned long)((unsigned int)(arg2));
    var1 = (unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0])));
    if (0) {
        var9 = (unsigned long)((unsigned int)(((~arg0) & arg1)));
        first = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) ^ arg0))) - (unsigned long)((unsigned int)((var9 + var9))))));
    } else {
        var25 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((z ^ arg1))) - z))) - arg1))) + ((unsigned long)((unsigned int)((z & arg1))) * 2))));
        first = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var25)) ^ arg0))) + ((unsigned long)((unsigned int)((var25 & arg0))) * 2))));
    }
    var39 = ((long (*)(unsigned int))(COMP150_STAGES[(unsigned long)((unsigned int)(((unsigned int)((unsigned char)((((unsigned long)((unsigned int)((first & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)((first & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)((first & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)((first & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)((first & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)((first & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)((first & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)((first & 7))) == 7) ? 1 : *(char *)(((unsigned long)((unsigned int)((first & 7))) + 0x2018)))))))))))) & 3)))]))(first);
    // x86-64 epilogue: restore callee registers
    return (unsigned int)(((unsigned long)((unsigned int)((var39 ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) ^ z))) + ((unsigned long)((unsigned int)((var1 & z))) * 2))))))) ^ (unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) & 1)))) & (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var39)) ^ z))))))));
}
obfuscated_transform pass 186 lines
// glaurung: obfuscated_transform @ 0x1100
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int32_t obfuscated_transform(int32_t * arg0, int32_t arg1, int32_t arg2) {
    extern unsigned char glaurung_global_4024[16];
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int current;
    unsigned int acc;
    int index;
    int state;
    int steps;
    long var0;
    long var1;
    long var15;
    long var19;
    long var2;
    long var21;
    long var22;
    long var24;
    long var25;
    long var26;
    long var27;
    long var28;
    long var3;
    long var38;
    long var53;
    long var69;
    long var72;
    long var75;
    // x86-64 prologue: save callee registers, frame 56 bytes
    var0 = 0xffffffff;
    var1 = 0xffffffff;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(var1);
    }
    var2 = (unsigned long)((unsigned int)(arg1));
    var1 = var0;
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(var1);
    }
    var3 = (long)arg0;
    var15 = 0;
    current = 0;
    acc = 0;
    index = 0;
    var19 = 0;
    L_116d: ;
    while (1) {
        var21 = (unsigned long)(acc);
        var22 = (unsigned long)((unsigned int)(index));
        if (((unsigned long)(5) < (unsigned long)((unsigned long)((unsigned int)(var19))))) {
            var1 = (unsigned long)((unsigned int)((var21 ^ var22)));
            // x86-64 epilogue: restore callee registers
            return (unsigned int)(var1);
        }
        goto L_1176;
        L_1140: ;
        *(int *)((var3 + ((long)(index) * 4))) = acc;
        var24 = 5;
        var21 = (unsigned long)(acc);
        var22 = (unsigned long)((unsigned int)(index));
        if (((unsigned long)(510) < (unsigned long)((unsigned long)((unsigned int)(var15))))) {
            var1 = (unsigned long)((unsigned int)((var21 ^ var22)));
            // x86-64 epilogue: restore callee registers
            return (unsigned int)(var1);
        }
        var25 = (unsigned long)(current);
        var26 = (unsigned long)(acc);
        var27 = (unsigned long)((unsigned int)(index));
        var28 = var24;
        L_1160: ;
        var15 = (unsigned long)((unsigned int)((var15 + 1)));
        current = var25;
        acc = var26;
        index = var27;
        var19 = var28;
        var21 = var26;
        var22 = var27;
        if (((unsigned long)((unsigned int)(var28)) == 6)) {
            var1 = (unsigned long)((unsigned int)((var21 ^ var22)));
            // x86-64 epilogue: restore callee registers
            return (unsigned int)(var1);
        }
        goto L_116d;
        L_1176: ;
        switch ((unsigned long)((unsigned int)(var19))) {
            case 0:
                goto L_1182;
            case 1:
                goto L_1190;
            case 2:
                goto L_11ad;
            case 3:
                goto L_11e7;
            case 4:
                goto L_1140;
            case 5:
                goto L_120c;
        }
        L_1182: ;
        var38 = 0;
        acc = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))) ^ arg2)));
        goto L_120f;
        L_1190: ;
        var25 = (unsigned long)(current);
        var26 = (unsigned long)(acc);
        var27 = (unsigned long)((unsigned int)(index));
        var28 = (unsigned long)((unsigned int)(((((long)((int)(var2)) <= (long)(index)) * 4) + 2)));
        if (((unsigned long)((unsigned long)((unsigned int)(var15))) <= (unsigned long)(510))) {
            goto L_1160;
        }
        var21 = (unsigned long)(acc);
        var22 = (unsigned long)((unsigned int)(index));
        var1 = (unsigned long)((unsigned int)((acc ^ index)));
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(var1);
        L_11ad: ;
        var53 = ((long (*)(unsigned int, long))(COMP150_STAGES[(unsigned long)((unsigned int)(((unsigned int)((unsigned char)((((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 7) ? 1 : *(char *)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) + 0x2018)))))))))))) & 3)))]))(acc, (unsigned long)((unsigned int)(*(int *)((var3 + ((long)(index) * 4))))));
        var25 = var53;
        var26 = (unsigned long)(acc);
        var27 = (unsigned long)((unsigned int)(index));
        var28 = 3;
        if (((unsigned long)((unsigned long)((unsigned int)(var15))) <= (unsigned long)(510))) {
            goto L_1160;
        }
        var21 = (unsigned long)(acc);
        var22 = (unsigned long)((unsigned int)(index));
        var1 = (unsigned long)((unsigned int)((acc ^ index)));
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(var1);
        L_11e7: ;
        if (((unsigned long)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((current + 1))) * current))) & 1))) != 0)) {
            goto L_1223;
        }
        var69 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((current ^ acc))) - (unsigned long)((unsigned int)((acc + current)))))) + ((unsigned long)((unsigned int)((current & acc))) * 2))));
        var72 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var69)) ^ current)));
        var75 = (unsigned long)((unsigned int)((var72 + ((unsigned long)((unsigned int)((var69 & current))) * 2))));
        goto L_123a;
        L_120c: ;
        var38 = (unsigned long)((unsigned int)((index + 1)));
        L_120f: ;
        var25 = (unsigned long)(current);
        var26 = (unsigned long)(acc);
        var27 = var38;
        var28 = 1;
        if (((unsigned long)((unsigned long)((unsigned int)(var15))) <= (unsigned long)(510))) {
            goto L_1160;
        }
        var21 = (unsigned long)(acc);
        var22 = var38;
        var1 = (unsigned long)((unsigned int)((acc ^ var38)));
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(var1);
        L_1223: ;
        var72 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((current + current))) | -0x246aLL)));
        var75 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((current ^ 0x1234))) + var72))) + 2)));
        L_123a: ;
        var25 = (unsigned long)(current);
        var26 = var75;
        var27 = (unsigned long)((unsigned int)(index));
        var28 = 4;
        var21 = var75;
        var22 = (unsigned long)((unsigned int)(index));
        if (((unsigned long)((unsigned long)((unsigned int)(var15))) <= (unsigned long)(510))) {
            goto L_1160;
        }
        var1 = (unsigned long)((unsigned int)((var21 ^ var22)));
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(var1);
    }
    var21 = (unsigned long)(acc);
    var22 = (unsigned long)((unsigned int)(index));
    var1 = (unsigned long)((unsigned int)((acc ^ index)));
    // x86-64 epilogue: restore callee registers
    return (unsigned int)(var1);
}

gcc -O0

3/3
obfuscated_digest pass 96 lines
// glaurung: obfuscated_digest @ 0x1425
uint32_t obfuscated_digest(uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern unsigned int comp150_add(unsigned int, unsigned int);
    extern unsigned int comp150_nonce(unsigned int, unsigned int);
    extern unsigned int comp150_xor(unsigned int, unsigned int);
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int acc;
    unsigned int cursor;
    int round;
    int state;
    int index;
    int steps;
    unsigned int byte;
    unsigned int slot;
    unsigned int ret;
    long var29;
    unsigned int var40;
    unsigned int var44;
    unsigned int var48;
    // x86-64 prologue: save rbp, frame 48 bytes
    acc = -0x7ee3623bLL;
    cursor = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((long)(arg2) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((((unsigned long)((unsigned int)(arg2)) == 4) | ((long)(arg2) < 4)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    round = 0;
    while ((round < arg2)) {
        state = 1;
        index = 0;
        steps = 0;
        while (((((unsigned long)((unsigned int)(steps)) == 511) | ((long)(steps) < 511)) != 0)) {
            if (((unsigned long)((unsigned int)(state)) == 6)) {
                break;
            }
            if (((unsigned long)((unsigned int)(state)) == 5)) {
                index = (index + 1);
                state = 1;
            } else {
                if (((((unsigned long)((unsigned int)(state)) == 5) | ((long)(state) < 5)) == 0)) {
                    L_156b: ;
                    state = 6;
                } else {
                    if (((unsigned long)((unsigned int)(state)) == 1)) {
                        state = ((arg1 <= index) ? 6 : 2);
                    } else {
                        if (((unsigned long)((unsigned int)(state)) == 2)) {
                            byte = (unsigned char)(((unsigned int)((unsigned char)(arg0[index])) & 255));
                            slot = (unsigned char)(((unsigned int)((unsigned char)((((unsigned long)((unsigned int)((cursor & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)((cursor & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)((cursor & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)((cursor & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)((cursor & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)((cursor & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)((cursor & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)((cursor & 7))) == 7) ? 1 : *(char *)(((unsigned long)((unsigned int)((cursor & 7))) + 0x2000)))))))))))) & 255));
                            var29 = ((long (*)(unsigned int, unsigned int))(COMP150_STAGES[(unsigned long)((unsigned int)((slot & 3)))]))(acc, byte);
                            acc = var29;
                            cursor = (unsigned char)(((unsigned int)((unsigned char)((((unsigned long)((unsigned int)((cursor & 7))) == 0) ? 6 : (((unsigned long)((unsigned int)((cursor & 7))) == 1) ? 4 : (((unsigned long)((unsigned int)((cursor & 7))) == 2) ? 7 : (((unsigned long)((unsigned int)((cursor & 7))) == 3) ? 5 : (((unsigned long)((unsigned int)((cursor & 7))) == 4) ? 1 : (((unsigned long)((unsigned int)((cursor & 7))) == 5) ? 3 : (((unsigned long)((unsigned int)((cursor & 7))) == 6) ? 0 : (((unsigned long)((unsigned int)((cursor & 7))) == 7) ? 2 : *(char *)(((unsigned long)((unsigned int)((cursor & 7))) + 0x2008)))))))))))) & 255));
                            state = 5;
                        } else {
                            goto L_156b;
                        }
                    }
                }
            }
            steps = (steps + 1);
        }
        var40 = comp150_nonce(acc, cursor);
        var44 = comp150_add((unsigned long)((unsigned int)(round)), var40);
        var48 = comp150_xor(acc, var44);
        acc = var48;
        round = (round + 1);
    }
    ret = comp150_add(acc, (unsigned long)((unsigned int)(arg1)));
    // x86-64 epilogue: restore rbp
    return ret;
}
obfuscated_predicate_chain pass 53 lines
// glaurung: obfuscated_predicate_chain @ 0x15d9
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int32_t obfuscated_predicate_chain(int32_t arg0, int32_t arg1, int32_t arg2) {
    extern unsigned int comp150_add(unsigned int, unsigned int);
    extern unsigned int comp150_nonce(unsigned int, unsigned int);
    extern unsigned int comp150_sub(unsigned int, unsigned int);
    extern unsigned int comp150_xor(unsigned int, unsigned int);
    extern unsigned char glaurung_global_4024[16];
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    unsigned int x;
    unsigned int y;
    unsigned int z;
    unsigned int gate;
    unsigned int first;
    unsigned int slot;
    unsigned int second;
    unsigned int ret;
    unsigned int var11;
    unsigned int var15;
    unsigned int var19;
    long var37;
    unsigned int var51;
    // x86-64 prologue: save rbp, frame 48 bytes
    x = arg0;
    y = arg1;
    z = arg2;
    gate = *(int *)(&glaurung_global_4024[0]);
    if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((x * x))) & 2))) != 0)) {
        var11 = comp150_sub(x, y);
        first = var11;
    } else {
        var15 = comp150_nonce(y, z);
        var19 = comp150_add(x, var15);
        first = var19;
    }
    slot = (unsigned char)(((unsigned int)((unsigned char)((((unsigned long)((unsigned int)((first & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)((first & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)((first & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)((first & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)((first & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)((first & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)((first & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)((first & 7))) == 7) ? 1 : *(char *)(((unsigned long)((unsigned int)((first & 7))) + 0x2000)))))))))))) & 255));
    var37 = ((long (*)(unsigned int, unsigned int))(COMP150_STAGES[(unsigned long)((unsigned int)((unsigned long)((unsigned int)((slot & 3)))))]))(first, y);
    second = var37;
    second = (second ^ (unsigned int)(((-(unsigned long)((unsigned int)((gate & 1)))) & (unsigned long)((unsigned int)((second ^ z))))));
    var51 = comp150_add(z, gate);
    ret = comp150_xor(second, var51);
    // x86-64 epilogue: restore rbp
    return ret;
}
obfuscated_transform pass 95 lines
// glaurung: obfuscated_transform @ 0x124e
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int32_t obfuscated_transform(int32_t * arg0, int32_t arg1, int32_t arg2) {
    extern unsigned int comp150_add(unsigned int, unsigned int);
    extern unsigned int comp150_nonce(unsigned int, unsigned int);
    extern unsigned int comp150_sub(unsigned int, unsigned int);
    extern unsigned int comp150_xor(unsigned int, unsigned int);
    extern unsigned char glaurung_global_4024[16];
    extern void comp150_op_fold(void);
    extern void comp150_op_mix(void);
    extern void comp150_op_scatter(void);
    extern void comp150_op_seal(void);
    static void (*COMP150_STAGES[4])(void) = {
        (void (*)(void))comp150_op_mix,
        (void (*)(void))comp150_op_fold,
        (void (*)(void))comp150_op_scatter,
        (void (*)(void))comp150_op_seal,
    };
    int state;
    int index;
    unsigned int acc;
    unsigned int current;
    int steps;
    unsigned int slot;
    unsigned int ret;
    long var38;
    unsigned int var48;
    unsigned int var52;
    unsigned int var56;
    // x86-64 prologue: save rbp, frame 48 bytes
    state = 0;
    index = 0;
    acc = 0;
    current = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    steps = 0;
    while (((((unsigned long)((unsigned int)(steps)) == 511) | ((long)(steps) < 511)) != 0)) {
        if (((unsigned long)((unsigned int)(state)) == 6)) {
            break;
        }
        switch ((unsigned long)((unsigned int)(state))) {
            case 0:
                acc = ((unsigned int)(*(int *)(&glaurung_global_4024[0])) ^ (unsigned int)(arg2));
                index = 0;
                state = 1;
                break;
            case 1:
                state = ((arg1 <= index) ? 6 : 2);
                break;
            case 2:
                slot = (unsigned char)(((unsigned int)((unsigned char)((((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 0) ? 1 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 1) ? 3 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 2) ? 0 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 3) ? 2 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 4) ? 2 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 5) ? 0 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 6) ? 3 : (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) == 7) ? 1 : *(char *)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 7))) + 0x2000)))))))))))) & 255));
                var38 = ((long (*)(unsigned int, long))(COMP150_STAGES[(unsigned long)((unsigned int)((unsigned long)((unsigned int)((slot & 3)))))]))(acc, (unsigned long)((unsigned int)(arg0[(long)(index)])));
                current = var38;
                state = 3;
                break;
            case 3:
                if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((current + 1))) * current))) & 1))) != 0)) {
                    var48 = comp150_sub(current, 0x1234);
                    acc = var48;
                } else {
                    var52 = comp150_nonce(acc, current);
                    var56 = comp150_add(current, var52);
                    acc = var56;
                }
                state = 4;
                break;
            case 4:
                arg0[(long)(index)] = acc;
                state = 5;
                break;
            case 5:
                index = (index + 1);
                state = 1;
                break;
            default:
                state = 6;
                break;
        }
        steps = (steps + 1);
    }
    ret = comp150_xor(acc, (unsigned long)((unsigned int)(index)));
    // x86-64 epilogue: restore rbp
    return ret;
}

← 213 fixtures