
/* Partially optimised Serpent S Box boolean functions derived  */
/* using a recursive descent analyser but without a full search */
/* of all subtrees. The average number of terms per S box is    */
/* just less than 17.                                           */
/*                                                              */
/* Copyright:   Dr B. R Gladman (gladman@seven77.demon.co.uk)   */
/*              30th June 1998                                  */
/*                                                              */
/* I hereby give permission for the information in this file to */
/* be used freely subject only to acknowledgement of its origin */

/* 17 terms */

#define sb0(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t6,t7,t8,t9,t11,t12,t13,t15,t16;        \
    t1 = b ^ d;         \
    t2 = ~t1;           \
    t3 = a | d;         \
    t4 = b ^ c;         \
    h = t3 ^ t4;        \
    t6 = a ^ b;         \
    t7 = a | t4;        \
    t8 = c & t6;        \
    t9 = t2 | t8;       \
    e = t7 ^ t9;        \
    t11 = a ^ h;        \
    t12 = t1 & t6;      \
    t13 = e ^ t11;      \
    f = t12 ^ t13;      \
    t15 = e | f;        \
    t16 = t3 & t15;     \
    g = b ^ t16;        \
}

/* 17 terms */

#define ib0(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t6,t7,t8,t9,t11,t12,t13,t15,t16;        \
    t1 = a ^ d;         \
    t2 = c ^ d;         \
    t3 = ~t2;           \
    t4 = a | b;         \
    g = t3 ^ t4;        \
    t6 = b ^ t1;        \
    t7 = c | t6;        \
    t8 = a ^ t7;        \
    t9 = t2 & t8;       \
    f = t6 ^ t9;        \
    t11 = ~t8;          \
    t12 = b & d;        \
    t13 = f | t12;      \
    h = t11 ^ t13;      \
    t15 = t2 ^ t12;     \
    t16 = f | h;        \
    e = t15 ^ t16;      \
}

/* 18 terms */

#define sb1(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t9,t10,t12,t13,t14,t16,t17;    \
    t1 = a ^ d;         \
    t2 = b ^ d;         \
    t3 = a & b;         \
    t4 = ~c;            \
    t5 = t2 ^ t3;       \
    g = t4 ^ t5;        \
    t7 = a ^ t2;        \
    t8 = b | t4;        \
    t9 = d | g;         \
    t10 = t7 & t9;      \
    f = t8 ^ t10;       \
    t12 = c ^ d;        \
    t13 = t1 | t2;      \
    t14 = f ^ t12;      \
    h = t13 ^ t14;      \
    t16 = t1 | g;       \
    t17 = t8 ^ t14;     \
    e = t16 ^ t17;      \
}

/* 17 terms */

#define ib1(a,b,c,d,e,f,g,h)                                \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t9,t11,t12,t13,t15,t16;    \
    t1 = a ^ d;         \
    t2 = a & b;         \
    t3 = b ^ c;         \
    t4 = a ^ t3;        \
    t5 = b | d;         \
    h = t4 ^ t5;        \
    t7 = c | t1;        \
    t8 = b ^ t7;        \
    t9 = t4 & t8;       \
    f = t1 ^ t9;        \
    t11 = ~t2;          \
    t12 = h & f;        \
    t13 = t9 ^ t11;     \
    g = t12 ^ t13;      \
    t15 = a & d;        \
    t16 = c ^ t13;      \
    e = t15 ^ t16;      \
}

/* 16 terms */

#define sb2(a,b,c,d,e,f,g,h)                            \
{   u4byte  t1,t2,t3,t5,t6,t7,t9,t10,t11,t13,t14,t15;   \
    t1 = ~a;            \
    t2 = b ^ d;         \
    t3 = c & t1;        \
    e = t2 ^ t3;        \
    t5 = c ^ t1;        \
    t6 = c ^ e;         \
    t7 = b & t6;        \
    h = t5 ^ t7;        \
    t9 = d | t7;        \
    t10 = e | t5;       \
    t11 = t9 & t10;     \
    g = a ^ t11;        \
    t13 = d | t1;       \
    t14 = t2 ^ h;       \
    t15 = g ^ t13;      \
    f = t14 ^ t15;      \
}

/* 16 terms */

#define ib2(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t9,t11,t12,t14,t15;            \
    t1 = b ^ d;         \
    t2 = ~t1;           \
    t3 = a ^ c;         \
    t4 = c ^ t1;        \
    t5 = b & t4;        \
    e = t3 ^ t5;        \
    t7 = a | t2;        \
    t8 = d ^ t7;        \
    t9 = t3 | t8;       \
    h = t1 ^ t9;        \
    t11 = ~t4;          \
    t12 = e | h;        \
    f = t11 ^ t12;      \
    t14 = d & t11;      \
    t15 = t3 ^ t12;     \
    g = t14 ^ t15;      \
}

/* 18 terms */

#define sb3(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t5,t6,t8,t9,t10,t12,t13,t15,t16,t17;    \
    t1 = a ^ c;         \
    t2 = a | d;         \
    t3 = a & b;         \
    t4 = a & d;         \
    t5 = b | t4;        \
    t6 = t1 & t2;       \
    f = t5 ^ t6;        \
    t8 = b ^ d;         \
    t9 = c | t3;        \
    t10 = t6 ^ t8;      \
    h = t9 ^ t10;       \
    t12 = c ^ t3;       \
    t13 = t2 & h;       \
    g = t12 ^ t13;      \
    t15 = ~g;           \
    t16 = t2 ^ t3;      \
    t17 = f & t15;      \
    e = t16 ^ t17;      \
}

/* 17 terms */

#define ib3(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t9,t11,t12,t14,t15,t16;        \
    t1 = b ^ c;         \
    t2 = b | c;         \
    t3 = a ^ c;         \
    t4 = t2 ^ t3;       \
    t5 = d | t4;        \
    e = t1 ^ t5;        \
    t7 = a ^ d;         \
    t8 = t1 | t5;       \
    t9 = t2 ^ t7;       \
    g = t8 ^ t9;        \
    t11 = a & t4;       \
    t12 = e | t9;       \
    f = t11 ^ t12;      \
    t14 = a & g;        \
    t15 = t2 ^ t14;     \
    t16 = e & t15;      \
    h = t4 ^ t16;       \
}

/* 17 terms */

#define sb4(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t10,t11,t12,t14,t15,t16;       \
    t1 = ~a;            \
    t2 = a ^ d;         \
    t3 = a ^ b;         \
    t4 = c ^ t1;        \
    t5 = t2 | t3;       \
    e = t4 ^ t5;        \
    t7 = ~e;            \
    t8 = b | t7;        \
    h = t2 ^ t8;        \
    t10 = a & e;        \
    t11 = b ^ h;        \
    t12 = t8 & t11;     \
    g = t10 ^ t12;      \
    t14 = a | t7;       \
    t15 = t3 ^ t14;     \
    t16 = h & g;        \
    f = t15 ^ t16;      \
}

/* 17 terms */

#define ib4(a,b,c,d,e,f,g,h)                                    \
{   u4byte  t1,t2,t3,t4,t6,t7,t8,t10,t11,t12,t14,t15,t16;       \
    t1 = c ^ d;         \
    t2 = c | d;         \
    t3 = b ^ t2;        \
    t4 = a & t3;        \
    f = t1 ^ t4;        \
    t6 = a ^ d;         \
    t7 = b | d;         \
    t8 = t6 & t7;       \
    h = t3 ^ t8;        \
    t10 = ~a;           \
    t11 = c ^ h;        \
    t12 = t10 | t11;    \
    e = t3 ^ t12;       \
    t14 = c | t4;       \
    t15 = t7 ^ t14;     \
    t16 = h | t10;      \
    g = t15 ^ t16;      \
}

/* 17 terms */

#define sb5(a,b,c,d,e,f,g,h)                                \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t10,t11,t12,t14,t15,t16;   \
    t1 = ~a;            \
    t2 = a ^ b;         \
    t3 = a ^ d;         \
    t4 = c ^ t1;        \
    t5 = t2 | t3;       \
    e = t4 ^ t5;        \
    t7 = ~d;            \
    t8 = e & t7;        \
    f = t2 ^ t8;        \
    t10 = b | f;        \
    t11 = c | e;        \
    t12 = t7 ^ t10;     \
    h = t11 ^ t12;      \
    t14 = d | f;        \
    t15 = t1 ^ t14;     \
    t16 = e | h;        \
    g = t15 ^ t16;      \
}

/* 16 terms */

#define ib5(a,b,c,d,e,f,g,h)                                \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t10,t11,t13,t14,t15;       \
    t1 = ~c;            \
    t2 = b & t1;        \
    t3 = d ^ t2;        \
    t4 = a & t3;        \
    t5 = b ^ t1;        \
    h = t4 ^ t5;        \
    t7 = b | h;         \
    t8 = a & t7;        \
    f = t3 ^ t8;        \
    t10 = a | d;        \
    t11 = t1 ^ t7;      \
    e = t10 ^ t11;      \
    t13 = a ^ c;        \
    t14 = b & t10;      \
    t15 = t4 | t13;     \
    g = t14 ^ t15;      \
} 

/* 17 terms */

#define sb6(a,b,c,d,e,f,g,h)                                \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t9,t11,t12,t13,t15,t16;    \
    t1 = a ^ c;         \
    t2 = b | d;         \
    t3 = b ^ c;         \
    t4 = ~t3;           \
    t5 = a & d;         \
    f = t4 ^ t5;        \
    t7 = b | c;         \
    t8 = d ^ t1;        \
    t9 = t7 & t8;       \
    h = t2 ^ t9;        \
    t11 = t1 & t7;      \
    t12 = t4 ^ t8;      \
    t13 = h & t11;      \
    e = t12 ^ t13;      \
    t15 = t3 ^ t11;     \
    t16 = h | t15;      \
    g = t12 ^ t16;      \
}

/* 17 terms */

#define ib6(a,b,c,d,e,f,g,h)                                \
{   u4byte  t1,t2,t3,t4,t6,t7,t8,t9,t11,t12,t13,t15,t16;    \
    t1 = ~c;            \
    t2 = a ^ c;         \
    t3 = b ^ d;         \
    t4 = a | t1;        \
    f = t3 ^ t4;        \
    t6 = a | b;         \
    t7 = b & t2;        \
    t8 = f ^ t6;        \
    t9 = t7 | t8;       \
    e = c ^ t9;         \
    t11 = ~f;           \
    t12 = d | t2;       \
    t13 = t9 ^ t11;     \
    h = t12 ^ t13;      \
    t15 = b ^ t11;      \
    t16 = e & h;        \
    g = t15 ^ t16;      \
}

/* 17 terms */

#define sb7(a,b,c,d,e,f,g,h)                                \
{   u4byte  t1,t2,t3,t4,t5,t7,t8,t9,t11,t12,t13,t15,t16;    \
    t1 = ~c;            \
    t2 = b ^ c;         \
    t3 = b | t1;        \
    t4 = d ^ t3;        \
    t5 = a & t4;        \
    h = t2 ^ t5;        \
    t7 = a ^ d;         \
    t8 = b ^ t5;        \
    t9 = t2 | t8;       \
    f = t7 ^ t9;        \
    t11 = d & t3;       \
    t12 = t5 ^ f;       \
    t13 = h & t12;      \
    g = t11 ^ t13;      \
    t15 = t1 | t4;      \
    t16 = t12 ^ g;      \
    e = t15 ^ t16;      \
}

/* 17 terms */

#define ib7(a,b,c,d,e,f,g,h)                                \
{   u4byte  t1,t2,t3,t4,t6,t7,t8,t9,t11,t12,t14,t15,t16;    \
    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;      \
}
