示例#1
0
//encryption
void aes_block_enc(uint8 *data, uint8 *key) 
{
	uint32 i;
	uint32 k0, k1, k2, k3;
	uint32 s0, s1, s2, s3;
	uint32 t0, t1, t2, t3;
    
	//load 128-bit message into 32-bit words
    LOAD32(data,  	   &s0); 
	LOAD32(data + 4,  &s1); 
	LOAD32(data + 8,  &s2); 
	LOAD32(data + 12, &s3);

	//load 128-bit key into 32-bit words
	LOAD32(key,      &k0);
	LOAD32(key + 4,  &k1);
	LOAD32(key + 8,  &k2);
	LOAD32(key + 12, &k3);

	//add round key
	s0 ^= k0;
	s1 ^= k1;
	s2 ^= k2;
	s3 ^= k3;

	//9 regular rounds
	for (i = 9; i != 0; i--) 
	{
		k0 ^= rcon[9 - i] ^ Te4_3(byte(k3, 2)) ^ Te4_2(byte(k3, 1)) ^ Te4_1(byte(k3, 0)) ^ Te4_0(byte(k3, 3));
		k1 ^= k0;
		k2 ^= k1;
		k3 ^= k2;

		t0 = Te0(byte(s0, 0)) ^ Te1(byte(s1, 1)) ^ Te2(byte(s2, 2)) ^ Te3(byte(s3, 3)) ^ k0;
		t1 = Te0(byte(s1, 3)) ^ Te1(byte(s2, 2)) ^ Te2(byte(s3, 1)) ^ Te3(byte(s0, 0)) ^ k1;
		t2 = Te0(byte(s2, 3)) ^ Te1(byte(s3, 2)) ^ Te2(byte(s0, 1)) ^ Te3(byte(s1, 0)) ^ k2;
		t3 = Te0(byte(s3, 3)) ^ Te1(byte(s0, 2)) ^ Te2(byte(s1, 1)) ^ Te3(byte(s2, 0)) ^ k3;

		s0 = t0; 
		s1 = t1; 
		s2 = t2; 
		s3 = t3;
	}

	// the last round for the full AES
	k0 ^= rcon[9] ^ Te4_3(byte(k3, 2)) ^ Te4_2(byte(k3, 1)) ^ Te4_1(byte(k3, 0)) ^ Te4_0(byte(k3, 3));
	k1 ^= k0;
	k2 ^= k1;
	k3 ^= k2;

	s0 = Te4_3(byte(t0, 3)) ^ Te4_2(byte(t1, 2)) ^ Te4_1(byte(t2, 1)) ^ Te4_0(byte(t3, 0)) ^ k0;
	s1 = Te4_3(byte(t1, 3)) ^ Te4_2(byte(t2, 2)) ^ Te4_1(byte(t3, 1)) ^ Te4_0(byte(t0, 0)) ^ k1;
	s2 = Te4_3(byte(t2, 3)) ^ Te4_2(byte(t3, 2)) ^ Te4_1(byte(t0, 1)) ^ Te4_0(byte(t1, 0)) ^ k2;
	s3 = Te4_3(byte(t3, 3)) ^ Te4_2(byte(t0, 2)) ^ Te4_1(byte(t1, 1)) ^ Te4_0(byte(t2, 0)) ^ k3;
	
	STORE32(s0, data);
	STORE32(s1, data + 4);
	STORE32(s2, data + 8);
	STORE32(s3, data + 12);
}
示例#2
0
文件: pelican.c 项目: DINKIN/omim
static void four_rounds(pelican_state *pelmac)
{
    ulong32 s0, s1, s2, s3, t0, t1, t2, t3;
    int r;

    LOAD32H(s0, pelmac->state      );
    LOAD32H(s1, pelmac->state  +  4);
    LOAD32H(s2, pelmac->state  +  8);
    LOAD32H(s3, pelmac->state  + 12);
    for (r = 0; r < 4; r++) {
        t0 =
            Te0(byte(s0, 3)) ^
            Te1(byte(s1, 2)) ^
            Te2(byte(s2, 1)) ^
            Te3(byte(s3, 0));
        t1 =
            Te0(byte(s1, 3)) ^
            Te1(byte(s2, 2)) ^
            Te2(byte(s3, 1)) ^
            Te3(byte(s0, 0));
        t2 =
            Te0(byte(s2, 3)) ^
            Te1(byte(s3, 2)) ^
            Te2(byte(s0, 1)) ^
            Te3(byte(s1, 0));
        t3 =
            Te0(byte(s3, 3)) ^
            Te1(byte(s0, 2)) ^
            Te2(byte(s1, 1)) ^
            Te3(byte(s2, 0));
        s0 = t0; s1 = t1; s2 = t2; s3 = t3;
    }
    STORE32H(s0, pelmac->state      );
    STORE32H(s1, pelmac->state  +  4);
    STORE32H(s2, pelmac->state  +  8);
    STORE32H(s3, pelmac->state  + 12);
}
int rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, rijndael_key *rijndael)
{
	unsigned long s0, s1, s2, s3, t0, t1, t2, t3, *rk;
	int Nr, r;

	LTC_ARGCHK(pt != NULL);
	LTC_ARGCHK(ct != NULL);
	LTC_ARGCHK(rijndael != NULL);

	Nr = rijndael->Nr;
	rk = rijndael->eK;

	/*
	* map byte array block to cipher state
	* and add initial round key:
	*/
	LOAD32H(s0, pt); s0 ^= rk[0];
	LOAD32H(s1, pt + 4); s1 ^= rk[1];
	LOAD32H(s2, pt + 8); s2 ^= rk[2];
	LOAD32H(s3, pt + 12); s3 ^= rk[3];

	/*
	* Nr - 1 full rounds:
	*/
	r = Nr >> 1;
	for (;;) {
		t0 =
			Te0(byte(s0, 3)) ^
			Te1(byte(s1, 2)) ^
			Te2(byte(s2, 1)) ^
			Te3(byte(s3, 0)) ^
			rk[4];
		t1 =
			Te0(byte(s1, 3)) ^
			Te1(byte(s2, 2)) ^
			Te2(byte(s3, 1)) ^
			Te3(byte(s0, 0)) ^
			rk[5];
		t2 =
			Te0(byte(s2, 3)) ^
			Te1(byte(s3, 2)) ^
			Te2(byte(s0, 1)) ^
			Te3(byte(s1, 0)) ^
			rk[6];
		t3 =
			Te0(byte(s3, 3)) ^
			Te1(byte(s0, 2)) ^
			Te2(byte(s1, 1)) ^
			Te3(byte(s2, 0)) ^
			rk[7];

		rk += 8;

		if (--r == 0)
			break;

		s0 =
			Te0(byte(t0, 3)) ^
			Te1(byte(t1, 2)) ^
			Te2(byte(t2, 1)) ^
			Te3(byte(t3, 0)) ^
			rk[0];
		s1 =
			Te0(byte(t1, 3)) ^
			Te1(byte(t2, 2)) ^
			Te2(byte(t3, 1)) ^
			Te3(byte(t0, 0)) ^
			rk[1];
		s2 =
			Te0(byte(t2, 3)) ^
			Te1(byte(t3, 2)) ^
			Te2(byte(t0, 1)) ^
			Te3(byte(t1, 0)) ^
			rk[2];
		s3 =
			Te0(byte(t3, 3)) ^
			Te1(byte(t0, 2)) ^
			Te2(byte(t1, 1)) ^
			Te3(byte(t2, 0)) ^
			rk[3];
	}

	/*
	* apply last round and
	* map cipher state to byte array block:
	*/
	s0 =
		(Te4_3[byte(t0, 3)]) ^
		(Te4_2[byte(t1, 2)]) ^
		(Te4_1[byte(t2, 1)]) ^
		(Te4_0[byte(t3, 0)]) ^
		rk[0];
	STORE32H(s0, ct);
	s1 =
		(Te4_3[byte(t1, 3)]) ^
		(Te4_2[byte(t2, 2)]) ^
		(Te4_1[byte(t3, 1)]) ^
		(Te4_0[byte(t0, 0)]) ^
		rk[1];
	STORE32H(s1, ct + 4);
	s2 =
		(Te4_3[byte(t2, 3)]) ^
		(Te4_2[byte(t3, 2)]) ^
		(Te4_1[byte(t0, 1)]) ^
		(Te4_0[byte(t1, 0)]) ^
		rk[2];
	STORE32H(s2, ct + 8);
	s3 =
		(Te4_3[byte(t3, 3)]) ^
		(Te4_2[byte(t0, 2)]) ^
		(Te4_1[byte(t1, 1)]) ^
		(Te4_0[byte(t2, 0)]) ^
		rk[3];
	STORE32H(s3, ct + 12);

	return CRYPT_OK;
}
示例#4
0
文件: aes.c 项目: goofwear/stepmania
int ECB_ENC(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
#endif
{
    ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;
    int Nr, r;
   
    LTC_ARGCHK(pt != NULL);
    LTC_ARGCHK(ct != NULL);
    LTC_ARGCHK(skey != NULL);
    
    Nr = skey->rijndael.Nr;
    rk = skey->rijndael.eK;
    
    /*
     * map byte array block to cipher state
     * and add initial round key:
     */
    LOAD32H(s0, pt      ); s0 ^= rk[0];
    LOAD32H(s1, pt  +  4); s1 ^= rk[1];
    LOAD32H(s2, pt  +  8); s2 ^= rk[2];
    LOAD32H(s3, pt  + 12); s3 ^= rk[3];

#ifdef LTC_SMALL_CODE

    for (r = 0; ; r++) {
        rk += 4;
        t0 =
            Te0(byte(s0, 3)) ^
            Te1(byte(s1, 2)) ^
            Te2(byte(s2, 1)) ^
            Te3(byte(s3, 0)) ^
            rk[0];
        t1 =
            Te0(byte(s1, 3)) ^
            Te1(byte(s2, 2)) ^
            Te2(byte(s3, 1)) ^
            Te3(byte(s0, 0)) ^
            rk[1];
        t2 =
            Te0(byte(s2, 3)) ^
            Te1(byte(s3, 2)) ^
            Te2(byte(s0, 1)) ^
            Te3(byte(s1, 0)) ^
            rk[2];
        t3 =
            Te0(byte(s3, 3)) ^
            Te1(byte(s0, 2)) ^
            Te2(byte(s1, 1)) ^
            Te3(byte(s2, 0)) ^
            rk[3];
        if (r == Nr-2) { 
           break;
        }
        s0 = t0; s1 = t1; s2 = t2; s3 = t3;
    }
    rk += 4;

#else

    /*
     * Nr - 1 full rounds:
     */
    r = Nr >> 1;
    for (;;) {
        t0 =
            Te0(byte(s0, 3)) ^
            Te1(byte(s1, 2)) ^
            Te2(byte(s2, 1)) ^
            Te3(byte(s3, 0)) ^
            rk[4];
        t1 =
            Te0(byte(s1, 3)) ^
            Te1(byte(s2, 2)) ^
            Te2(byte(s3, 1)) ^
            Te3(byte(s0, 0)) ^
            rk[5];
        t2 =
            Te0(byte(s2, 3)) ^
            Te1(byte(s3, 2)) ^
            Te2(byte(s0, 1)) ^
            Te3(byte(s1, 0)) ^
            rk[6];
        t3 =
            Te0(byte(s3, 3)) ^
            Te1(byte(s0, 2)) ^
            Te2(byte(s1, 1)) ^
            Te3(byte(s2, 0)) ^
            rk[7];

        rk += 8;
        if (--r == 0) {
            break;
        }

        s0 =
            Te0(byte(t0, 3)) ^
            Te1(byte(t1, 2)) ^
            Te2(byte(t2, 1)) ^
            Te3(byte(t3, 0)) ^
            rk[0];
        s1 =
            Te0(byte(t1, 3)) ^
            Te1(byte(t2, 2)) ^
            Te2(byte(t3, 1)) ^
            Te3(byte(t0, 0)) ^
            rk[1];
        s2 =
            Te0(byte(t2, 3)) ^
            Te1(byte(t3, 2)) ^
            Te2(byte(t0, 1)) ^
            Te3(byte(t1, 0)) ^
            rk[2];
        s3 =
            Te0(byte(t3, 3)) ^
            Te1(byte(t0, 2)) ^
            Te2(byte(t1, 1)) ^
            Te3(byte(t2, 0)) ^
            rk[3];
    }

#endif

    /*
     * apply last round and
     * map cipher state to byte array block:
     */
    s0 =
        (Te4_3[byte(t0, 3)]) ^
        (Te4_2[byte(t1, 2)]) ^
        (Te4_1[byte(t2, 1)]) ^
        (Te4_0[byte(t3, 0)]) ^
        rk[0];
    STORE32H(s0, ct);
    s1 =
        (Te4_3[byte(t1, 3)]) ^
        (Te4_2[byte(t2, 2)]) ^
        (Te4_1[byte(t3, 1)]) ^
        (Te4_0[byte(t0, 0)]) ^
        rk[1];
    STORE32H(s1, ct+4);
    s2 =
        (Te4_3[byte(t2, 3)]) ^
        (Te4_2[byte(t3, 2)]) ^
        (Te4_1[byte(t0, 1)]) ^
        (Te4_0[byte(t1, 0)]) ^
        rk[2];
    STORE32H(s2, ct+8);
    s3 =
        (Te4_3[byte(t3, 3)]) ^
        (Te4_2[byte(t0, 2)]) ^
        (Te4_1[byte(t1, 1)]) ^
        (Te4_0[byte(t2, 0)]) ^ 
        rk[3];
    STORE32H(s3, ct+12);

    return CRYPT_OK;
}
示例#5
0
文件: aes.c 项目: adh/dfsch
/**
  Encrypts a block of text with AES
  @param pt The input plaintext (16 bytes)
  @param ct The output ciphertext (16 bytes)
  @param skey The key as scheduled
  @return CRYPT_OK if successful
*/
static int aes_encrypt(aes_key_t* ctx, uint8_t* pt, uint8_t* ct)
{
    ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;
    int Nr, r;
   
    Nr = ctx->Nr;
    rk = ctx->eK;
    
    /*
     * map byte array block to cipher state
     * and add initial round key:
     */
    LOAD32H(s0, pt      ); s0 ^= rk[0];
    LOAD32H(s1, pt  +  4); s1 ^= rk[1];
    LOAD32H(s2, pt  +  8); s2 ^= rk[2];
    LOAD32H(s3, pt  + 12); s3 ^= rk[3];

    /*
     * Nr - 1 full rounds:
     */
    r = Nr >> 1;
    for (;;) {
        t0 =
            Te0(byte(s0, 3)) ^
            Te1(byte(s1, 2)) ^
            Te2(byte(s2, 1)) ^
            Te3(byte(s3, 0)) ^
            rk[4];
        t1 =
            Te0(byte(s1, 3)) ^
            Te1(byte(s2, 2)) ^
            Te2(byte(s3, 1)) ^
            Te3(byte(s0, 0)) ^
            rk[5];
        t2 =
            Te0(byte(s2, 3)) ^
            Te1(byte(s3, 2)) ^
            Te2(byte(s0, 1)) ^
            Te3(byte(s1, 0)) ^
            rk[6];
        t3 =
            Te0(byte(s3, 3)) ^
            Te1(byte(s0, 2)) ^
            Te2(byte(s1, 1)) ^
            Te3(byte(s2, 0)) ^
            rk[7];

        rk += 8;
        if (--r == 0) {
            break;
        }

        s0 =
            Te0(byte(t0, 3)) ^
            Te1(byte(t1, 2)) ^
            Te2(byte(t2, 1)) ^
            Te3(byte(t3, 0)) ^
            rk[0];
        s1 =
            Te0(byte(t1, 3)) ^
            Te1(byte(t2, 2)) ^
            Te2(byte(t3, 1)) ^
            Te3(byte(t0, 0)) ^
            rk[1];
        s2 =
            Te0(byte(t2, 3)) ^
            Te1(byte(t3, 2)) ^
            Te2(byte(t0, 1)) ^
            Te3(byte(t1, 0)) ^
            rk[2];
        s3 =
            Te0(byte(t3, 3)) ^
            Te1(byte(t0, 2)) ^
            Te2(byte(t1, 1)) ^
            Te3(byte(t2, 0)) ^
            rk[3];
    }

    /*
     * apply last round and
     * map cipher state to byte array block:
     */
    s0 =
        (Te4_3[byte(t0, 3)]) ^
        (Te4_2[byte(t1, 2)]) ^
        (Te4_1[byte(t2, 1)]) ^
        (Te4_0[byte(t3, 0)]) ^
        rk[0];
    STORE32H(s0, ct);
    s1 =
        (Te4_3[byte(t1, 3)]) ^
        (Te4_2[byte(t2, 2)]) ^
        (Te4_1[byte(t3, 1)]) ^
        (Te4_0[byte(t0, 0)]) ^
        rk[1];
    STORE32H(s1, ct+4);
    s2 =
        (Te4_3[byte(t2, 3)]) ^
        (Te4_2[byte(t3, 2)]) ^
        (Te4_1[byte(t0, 1)]) ^
        (Te4_0[byte(t1, 0)]) ^
        rk[2];
    STORE32H(s2, ct+8);
    s3 =
        (Te4_3[byte(t3, 3)]) ^
        (Te4_2[byte(t0, 2)]) ^
        (Te4_1[byte(t1, 1)]) ^
        (Te4_0[byte(t2, 0)]) ^ 
        rk[3];
    STORE32H(s3, ct+12);
}