Exemple #1
0
int safer_ecb_encrypt(const unsigned char *block_in,
                             unsigned char *block_out,
                             symmetric_key *skey)
#endif
{   unsigned char a, b, c, d, e, f, g, h, t;
    unsigned int round;
    unsigned char *key;

    LTC_ARGCHK(block_in != NULL);
    LTC_ARGCHK(block_out != NULL);
    LTC_ARGCHK(skey != NULL);

    key = skey->safer.key;
    a = block_in[0]; b = block_in[1]; c = block_in[2]; d = block_in[3];
    e = block_in[4]; f = block_in[5]; g = block_in[6]; h = block_in[7];
    if (LTC_SAFER_MAX_NOF_ROUNDS < (round = *key)) round = LTC_SAFER_MAX_NOF_ROUNDS;
    while(round-- > 0)
    {
        a ^= *++key; b += *++key; c += *++key; d ^= *++key;
        e ^= *++key; f += *++key; g += *++key; h ^= *++key;
        a = EXP(a) + *++key; b = LOG(b) ^ *++key;
        c = LOG(c) ^ *++key; d = EXP(d) + *++key;
        e = EXP(e) + *++key; f = LOG(f) ^ *++key;
        g = LOG(g) ^ *++key; h = EXP(h) + *++key;
        PHT(a, b); PHT(c, d); PHT(e, f); PHT(g, h);
        PHT(a, c); PHT(e, g); PHT(b, d); PHT(f, h);
        PHT(a, e); PHT(b, f); PHT(c, g); PHT(d, h);
        t = b; b = e; e = c; c = t; t = d; d = f; f = g; g = t;
    }
    a ^= *++key; b += *++key; c += *++key; d ^= *++key;
    e ^= *++key; f += *++key; g += *++key; h ^= *++key;
    block_out[0] = a & 0xFF; block_out[1] = b & 0xFF;
    block_out[2] = c & 0xFF; block_out[3] = d & 0xFF;
    block_out[4] = e & 0xFF; block_out[5] = f & 0xFF;
    block_out[6] = g & 0xFF; block_out[7] = h & 0xFF;
    return CRYPT_OK;
}
Exemple #2
0
void SAFER::Encrypt(const byte *block_in, byte *block_out) const
{
    byte a, b, c, d, e, f, g, h, t;
    const byte *key = keySchedule+1;
    unsigned int round = keySchedule[0];

    a = block_in[0];
    b = block_in[1];
    c = block_in[2];
    d = block_in[3];
    e = block_in[4];
    f = block_in[5];
    g = block_in[6];
    h = block_in[7];
    while(round--)
    {
        a ^= key[0];
        b += key[1];
        c += key[2];
        d ^= key[3];
        e ^= key[4];
        f += key[5];
        g += key[6];
        h ^= key[7];
        a = EXP(a) + key[ 8];
        b = LOG(b) ^ key[ 9];
        c = LOG(c) ^ key[10];
        d = EXP(d) + key[11];
        e = EXP(e) + key[12];
        f = LOG(f) ^ key[13];
        g = LOG(g) ^ key[14];
        h = EXP(h) + key[15];
        key += 16;
        PHT(a, b);
        PHT(c, d);
        PHT(e, f);
        PHT(g, h);
        PHT(a, c);
        PHT(e, g);
        PHT(b, d);
        PHT(f, h);
        PHT(a, e);
        PHT(b, f);
        PHT(c, g);
        PHT(d, h);
        t = b;
        b = e;
        e = c;
        c = t;
        t = d;
        d = f;
        f = g;
        g = t;
    }
    a ^= key[0];
    b += key[1];
    c += key[2];
    d ^= key[3];
    e ^= key[4];
    f += key[5];
    g += key[6];
    h ^= key[7];
    block_out[0] = a & 0xFF;
    block_out[1] = b & 0xFF;
    block_out[2] = c & 0xFF;
    block_out[3] = d & 0xFF;
    block_out[4] = e & 0xFF;
    block_out[5] = f & 0xFF;
    block_out[6] = g & 0xFF;
    block_out[7] = h & 0xFF;
}
Exemple #3
0
void SAFER::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
{
	byte a, b, c, d, e, f, g, h, t;
	const byte *key = keySchedule+1;
	unsigned int round = keySchedule[0];

	Block::Get(inBlock)(a)(b)(c)(d)(e)(f)(g)(h);
	while(round--)
	{
		a ^= key[0]; b += key[1]; c += key[2]; d ^= key[3];
		e ^= key[4]; f += key[5]; g += key[6]; h ^= key[7];
		a = EXP(a) + key[ 8]; b = LOG(b) ^ key[ 9];
		c = LOG(c) ^ key[10]; d = EXP(d) + key[11];
		e = EXP(e) + key[12]; f = LOG(f) ^ key[13];
		g = LOG(g) ^ key[14]; h = EXP(h) + key[15];
		key += 16;
		PHT(a, b); PHT(c, d); PHT(e, f); PHT(g, h);
		PHT(a, c); PHT(e, g); PHT(b, d); PHT(f, h);
		PHT(a, e); PHT(b, f); PHT(c, g); PHT(d, h);
		t = b; b = e; e = c; c = t; t = d; d = f; f = g; g = t;
	}
	a ^= key[0]; b += key[1]; c += key[2]; d ^= key[3];
	e ^= key[4]; f += key[5]; g += key[6]; h ^= key[7];
	Block::Put(xorBlock, outBlock)(a)(b)(c)(d)(e)(f)(g)(h);
}
Exemple #4
0
WIN32DLL_DEFINE
    void _mcrypt_encrypt(const safer_key_t * key, safer_block_t * block_in)
{
	unsigned char a, b, c, d, e, f, g, h, t;
	unsigned int round;

	a = block_in[0];
	b = block_in[1];
	c = block_in[2];
	d = block_in[3];
	e = block_in[4];
	f = block_in[5];
	g = block_in[6];
	h = block_in[7];
	if (SAFER_MAX_NOF_ROUNDS < (round = *key))
		round = SAFER_MAX_NOF_ROUNDS;
	while (round--) {
		a ^= *++key;
		b += *++key;
		c += *++key;
		d ^= *++key;
		e ^= *++key;
		f += *++key;
		g += *++key;
		h ^= *++key;
		a = EXP(a) + *++key;
		b = LOG(b) ^ *++key;
		c = LOG(c) ^ *++key;
		d = EXP(d) + *++key;
		e = EXP(e) + *++key;
		f = LOG(f) ^ *++key;
		g = LOG(g) ^ *++key;
		h = EXP(h) + *++key;
		PHT(a, b);
		PHT(c, d);
		PHT(e, f);
		PHT(g, h);
		PHT(a, c);
		PHT(e, g);
		PHT(b, d);
		PHT(f, h);
		PHT(a, e);
		PHT(b, f);
		PHT(c, g);
		PHT(d, h);
		t = b;
		b = e;
		e = c;
		c = t;
		t = d;
		d = f;
		f = g;
		g = t;
	}
	a ^= *++key;
	b += *++key;
	c += *++key;
	d ^= *++key;
	e ^= *++key;
	f += *++key;
	g += *++key;
	h ^= *++key;
	block_in[0] = a & 0xFF;
	block_in[1] = b & 0xFF;
	block_in[2] = c & 0xFF;
	block_in[3] = d & 0xFF;
	block_in[4] = e & 0xFF;
	block_in[5] = f & 0xFF;
	block_in[6] = g & 0xFF;
	block_in[7] = h & 0xFF;
}				/* Safer_Encrypt_Block */