All pastes #82263 Raw Edit

Miscellany

public text v1 · immutable
·published 2006-07-08 06:03 UTC
rendered paste body
/* encrypt a block of text (woot, I found the crypto part!) */

#define f_nround(bo, bi, k) \
    f_rn(bo, bi, 0, k);     \
    f_rn(bo, bi, 1, k);     \
    f_rn(bo, bi, 2, k);     \
    f_rn(bo, bi, 3, k);     \
    k += 4

#define f_lround(bo, bi, k) \
    f_rl(bo, bi, 0, k);     \
    f_rl(bo, bi, 1, k);     \
    f_rl(bo, bi, 2, k);     \
    f_rl(bo, bi, 3, k)

static void aes_encrypt(void *ctx_arg, u8 *out, const u8 *in)
{
        const struct aes_ctx *ctx = ctx_arg;
        u32 b0[4], b1[4];
        const u32 *kp = E_KEY + 4;

        b0[0] = u32_in (in) ^ E_KEY[0];
        b0[1] = u32_in (in + 4) ^ E_KEY[1];
        b0[2] = u32_in (in + 8) ^ E_KEY[2];
        b0[3] = u32_in (in + 12) ^ E_KEY[3];

        if (ctx->key_length > 24) {
                f_nround (b1, b0, kp);
                f_nround (b0, b1, kp);
        }

        if (ctx->key_length > 16) {
                f_nround (b1, b0, kp);
                f_nround (b0, b1, kp);
        }

        f_nround (b1, b0, kp);
        f_nround (b0, b1, kp);
        f_nround (b1, b0, kp);
        f_nround (b0, b1, kp);
        f_nround (b1, b0, kp);
        f_nround (b0, b1, kp);
        f_nround (b1, b0, kp);
        f_nround (b0, b1, kp);
        f_nround (b1, b0, kp);
        f_lround (b0, b1, kp);

        u32_out (out, b0[0]);
        u32_out (out + 4, b0[1]);
        u32_out (out + 8, b0[2]);
        u32_out (out + 12, b0[3]);
}

/* decrypt a block of text */

#define i_nround(bo, bi, k) \
    i_rn(bo, bi, 0, k);     \
    i_rn(bo, bi, 1, k);     \
    i_rn(bo, bi, 2, k);     \
    i_rn(bo, bi, 3, k);     \
    k -= 4

#define i_lround(bo, bi, k) \
    i_rl(bo, bi, 0, k);     \
    i_rl(bo, bi, 1, k);     \
    i_rl(bo, bi, 2, k);     \
    i_rl(bo, bi, 3, k)

static void aes_decrypt(void *ctx_arg, u8 *out, const u8 *in)
{
        const struct aes_ctx *ctx = ctx_arg;
        u32 b0[4], b1[4];
        const int key_len = ctx->key_length;
        const u32 *kp = D_KEY + key_len + 20;

        b0[0] = u32_in (in) ^ E_KEY[key_len + 24];
        b0[1] = u32_in (in + 4) ^ E_KEY[key_len + 25];
        b0[2] = u32_in (in + 8) ^ E_KEY[key_len + 26];
        b0[3] = u32_in (in + 12) ^ E_KEY[key_len + 27];

        if (key_len > 24) {
                i_nround (b1, b0, kp);
                i_nround (b0, b1, kp);
        }

        if (key_len > 16) {
                i_nround (b1, b0, kp);
                i_nround (b0, b1, kp);
        }

        i_nround (b1, b0, kp);
        i_nround (b0, b1, kp);
        i_nround (b1, b0, kp);
        i_nround (b0, b1, kp);
        i_nround (b1, b0, kp);
        i_nround (b0, b1, kp);
        i_nround (b1, b0, kp);
        i_nround (b0, b1, kp);
        i_nround (b1, b0, kp);
        i_lround (b0, b1, kp);

        u32_out (out, b0[0]);
        u32_out (out + 4, b0[1]);
        u32_out (out + 8, b0[2]);
        u32_out (out + 12, b0[3]);
}