: ROL ( X1 Count -- X2 ) 2dup lshift -rot negate 32 + rshift or ; : F1 ( Data Mask Rotation -- Output ) >r + r> rol ( I ) dup 22 rshift $3FC and sbox1 + @ ( I Sx0 ) over 14 rshift $3FC and sbox2 + @ xor ( I Sx0^Sx1 ) over 6 rshift $3FC and sbox3 + @ - ( I Sx0^Sx1-Sx2 ) swap 2 lshift $3FC and sbox4 + @ xor ( I Sx0^Sx1-Sx2^Sx3 ) ; : 4swap ( x1 x2 x3 x4 -- x4 x3 x2 x1 ) swap 2swap swap ; : FEISTEL ( Xt1 Xt2 Xt3 Xt4 "Name" -- ) CREATE 4swap , , , , DOES> ( data mask rotation xt-ptr -- ) >r -rot r> dup cell+ >r @ execute swap rol dup 22 rshift $3FC and sbox1 + @ over 14 rshift $3FC and sbox2 + @ r> dup cell+ >r @ execute over 6 rshift $3FC and sbox3 + @ r> dup cell+ >r @ execute swap 2 lshift $3FC and sbox4 + @ r> @ execute ;