/* A..D = IBox Input */ /* E..H = IBox Output */ /* A..H may be read multiple times */ /* A..D may not be written */ /* E..H will be written once */ #define IBox7(A,B,C,D, E,F,G,H) \ { \ register vector unsigned int \ T01, T02, T03, T04, \ T06, T07, T08, T09, \ T11, T12, T14, T15, \ T16; \ \ T01 = vec_and( A , B ); \ T02 = vec_or ( A , B ); \ T03 = vec_or ( C , T01 ); \ T04 = vec_and( D , T02 ); \ H = vec_xor( T03, T04 ); \ T06 = vec_nor( D , D ); \ T07 = vec_xor( B , T04 ); \ T08 = vec_xor( H , T06 ); \ T09 = vec_or ( T07, T08 ); \ F = vec_xor( A , T09 ); \ T11 = vec_xor( C , T07 ); \ T12 = vec_or ( D , F ); \ E = vec_xor( T11, T12 ); \ T14 = vec_and( A , H ); \ T15 = vec_xor( T03, F ); \ T16 = vec_xor( E , T14 ); \ G = vec_xor( T15, T16 ); \ } #define ib7(a,b,c,d,e,f,g,h) \ t1 = a & b; \ t2 = a | b; \ t3 = c | t1; \ t4 = d & t2; \ h = t3 ^ t4; \ t6 = ~d; \ t7 = b ^ t4; \ t8 = h ^ t6; \ t9 = t7 | t8; \ f = a ^ t9; \ t11 = c ^ t7; \ t12 = d | f; \ e = t11 ^ t12; \ t14 = a & h; \ t15 = t3 ^ f; \ t16 = e ^ t14; \ g = t15 ^ t16