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; }
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; }
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); }
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 */