void Serpent::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const { word32 a, b, c, d, e; Block::Get(inBlock)(a)(b)(c)(d); const word32 *k = m_key + 96; unsigned int i=4; beforeI7(KX); goto start; do { c = b; b = d; d = e; k -= 32; beforeI7(ILT); start: beforeI7(I7); afterI7(KX); afterI7(ILT); afterI7(I6); afterI6(KX); afterI6(ILT); afterI6(I5); afterI5(KX); afterI5(ILT); afterI5(I4); afterI4(KX); afterI4(ILT); afterI4(I3); afterI3(KX); afterI3(ILT); afterI3(I2); afterI2(KX); afterI2(ILT); afterI2(I1); afterI1(KX); afterI1(ILT); afterI1(I0); afterI0(KX); } while (--i != 0); Block::Put(xorBlock, outBlock)(a)(d)(b)(e); }
void serpent_decrypt_block(block128_t* block, uint32_t* subkey) { //char* function_name = "serpent_decrypt_block()"; uint32_t a, b, c, d, e; int j; // Change to little endian. a = mirror_bytes32(block->x0); b = mirror_bytes32(block->x1); c = mirror_bytes32(block->x2); d = mirror_bytes32(block->x3); // Decrypt the current block. j = 4; subkey += 96; beforeI7(KX); goto start; do { c = b; b = d; d = e; subkey -= 32; beforeI7(inverse_linear_transformation); start: beforeI7(I7); afterI7(KX); afterI7(inverse_linear_transformation); afterI7(I6); afterI6(KX); afterI6(inverse_linear_transformation); afterI6(I5); afterI5(KX); afterI5(inverse_linear_transformation); afterI5(I4); afterI4(KX); afterI4(inverse_linear_transformation); afterI4(I3); afterI3(KX); afterI3(inverse_linear_transformation); afterI3(I2); afterI2(KX); afterI2(inverse_linear_transformation); afterI2(I1); afterI1(KX); afterI1(inverse_linear_transformation); afterI1(I0); afterI0(KX); } while (--j != 0); // Restore to big endian, taking into account the significance of each block. block->x0 = mirror_bytes32(a); block->x1 = mirror_bytes32(d); block->x2 = mirror_bytes32(b); block->x3 = mirror_bytes32(e); }
void serpent_decrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks) { unsigned __int32 a, b, c, d, e; const unsigned __int32 *k = (unsigned __int32 *)ks + 104; unsigned int i=4; unsigned __int32 *in = (unsigned __int32 *) inBlock; unsigned __int32 *out = (unsigned __int32 *) outBlock; a = LE32(in[0]); b = LE32(in[1]); c = LE32(in[2]); d = LE32(in[3]); beforeI7(KX); goto start; do { c = b; b = d; d = e; k -= 32; beforeI7(ILT); start: beforeI7(I7); afterI7(KX); afterI7(ILT); afterI7(I6); afterI6(KX); afterI6(ILT); afterI6(I5); afterI5(KX); afterI5(ILT); afterI5(I4); afterI4(KX); afterI4(ILT); afterI4(I3); afterI3(KX); afterI3(ILT); afterI3(I2); afterI2(KX); afterI2(ILT); afterI2(I1); afterI1(KX); afterI1(ILT); afterI1(I0); afterI0(KX); } while (--i != 0); out[0] = LE32(a); out[1] = LE32(d); out[2] = LE32(b); out[3] = LE32(e); }
void serpent_decrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks) { unsigned __int32 a, b, c, d, e; const unsigned __int32 *k = (unsigned __int32 *)ks + 104; unsigned int i=4; unsigned __int32 *in = (unsigned __int32 *) inBlock; unsigned __int32 *out = (unsigned __int32 *) outBlock; a = LE32(in[0]); b = LE32(in[1]); c = LE32(in[2]); d = LE32(in[3]); KXf (k, 32, &a, &b, &c, &d); goto start; do { c = b; b = d; d = e; k -= 32; beforeI7(ILT); start: beforeI7(I7); KXf (k, 28, &d, &a, &b, &e); ILTf (&d, &a, &b, &e); afterI7(I6); KXf (k, 24, &a, &b, &c, &e); ILTf (&a, &b, &c, &e); afterI6(I5); KXf (k, 20, &b, &d, &e, &c); ILTf (&b, &d, &e, &c); afterI5(I4); KXf (k, 16, &b, &c, &e, &a); ILTf (&b, &c, &e, &a); afterI4(I3); KXf (k, 12, &a, &b, &e, &c); ILTf (&a, &b, &e, &c); afterI3(I2); KXf (k, 8, &b, &d, &e, &c); ILTf (&b, &d, &e, &c); afterI2(I1); KXf (k, 4, &a, &b, &c, &e); ILTf (&a, &b, &c, &e); afterI1(I0); KXf (k, 0, &a, &d, &b, &e); } while (--i != 0); out[0] = LE32(a); out[1] = LE32(d); out[2] = LE32(b); out[3] = LE32(e); }