Commit f826bf77 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

SEED to support OPENSSL_SMALL_FOOTPRINT: ~2x size decrease on x86.

parent 3ebbe885
Loading
Loading
Loading
Loading
+41 −2
Original line number Diff line number Diff line
@@ -187,6 +187,11 @@ static const seed_word SS[4][256] = { {
#define KC14    0xde6e678d
#define KC15    0xbcdccf1b

#if defined(OPENSSL_SMALL_FOOTPRINT)
static const seed_word KC[] = {
	KC0,	KC1,	KC2,	KC3,	KC4,	KC5,	KC6,	KC7,
	KC8,	KC9,	KC10,	KC11,	KC12,	KC13,	KC14,	KC15	};
#endif

void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE *ks)
{
@@ -201,6 +206,8 @@ void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE
	t0 = (x1 + x3 - KC0) & 0xffffffff;
	t1 = (x2 - x4 + KC0) & 0xffffffff;                     KEYUPDATE_TEMP(t0, t1, &ks->data[0]);
	KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1);      KEYUPDATE_TEMP(t0, t1, &ks->data[2]);

#if !defined(OPENSSL_SMALL_FOOTPRINT)
	KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2);      KEYUPDATE_TEMP(t0, t1, &ks->data[4]);
	KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3);      KEYUPDATE_TEMP(t0, t1, &ks->data[6]);
	KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4);      KEYUPDATE_TEMP(t0, t1, &ks->data[8]);
@@ -215,6 +222,17 @@ void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE
	KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13);     KEYUPDATE_TEMP(t0, t1, &ks->data[26]);
	KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14);     KEYUPDATE_TEMP(t0, t1, &ks->data[28]);
	KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15);     KEYUPDATE_TEMP(t0, t1, &ks->data[30]);
#else
	{
	    int i;
	    for (i=2; i<16; i+=2) {
		KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC[i]);
		KEYUPDATE_TEMP(t0, t1, &ks->data[i*2]);
		KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC[i+1]);
		KEYUPDATE_TEMP(t0, t1, &ks->data[i*2+2]);
	    }
	}
#endif
}

void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_BLOCK_SIZE], const SEED_KEY_SCHEDULE *ks)
@@ -227,6 +245,7 @@ void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
	char2word(s+8,  x3);
	char2word(s+12, x4);

#if !defined(OPENSSL_SMALL_FOOTPRINT)	
	E_SEED(t0, t1, x1, x2, x3, x4, 0);
	E_SEED(t0, t1, x3, x4, x1, x2, 2);
	E_SEED(t0, t1, x1, x2, x3, x4, 4);
@@ -243,6 +262,15 @@ void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
	E_SEED(t0, t1, x3, x4, x1, x2, 26);
	E_SEED(t0, t1, x1, x2, x3, x4, 28);
	E_SEED(t0, t1, x3, x4, x1, x2, 30);
#else
	{
	    int i;
	    for (i=0;i<30;i+=4) {
		E_SEED(t0,t1,x1,x2,x3,x4,i);
		E_SEED(t0,t1,x3,x4,x1,x2,i+2);
	    }
	}
#endif

	word2char(x3, d);
	word2char(x4, d+4);
@@ -260,6 +288,7 @@ void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
	char2word(s+8,  x3);
	char2word(s+12, x4);

#if !defined(OPENSSL_SMALL_FOOTPRINT)
	E_SEED(t0, t1, x1, x2, x3, x4, 30);
	E_SEED(t0, t1, x3, x4, x1, x2, 28);
	E_SEED(t0, t1, x1, x2, x3, x4, 26);
@@ -276,6 +305,16 @@ void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
	E_SEED(t0, t1, x3, x4, x1, x2, 4);
	E_SEED(t0, t1, x1, x2, x3, x4, 2);
	E_SEED(t0, t1, x3, x4, x1, x2, 0);
#else
	{
	    int i;
	    for (i=30; i>0; i-=4) {
		E_SEED(t0, t1, x1, x2, x3, x4, i);
		E_SEED(t0, t1, x3, x4, x1, x2, i-2);

	    }
	}
#endif

	word2char(x3, d);
	word2char(x4, d+4);