summaryrefslogtreecommitdiffstats
path: root/comm/third_party/botan/src/lib/block/serpent/serpent_sbox.h
diff options
context:
space:
mode:
Diffstat (limited to 'comm/third_party/botan/src/lib/block/serpent/serpent_sbox.h')
-rw-r--r--comm/third_party/botan/src/lib/block/serpent/serpent_sbox.h446
1 files changed, 446 insertions, 0 deletions
diff --git a/comm/third_party/botan/src/lib/block/serpent/serpent_sbox.h b/comm/third_party/botan/src/lib/block/serpent/serpent_sbox.h
new file mode 100644
index 0000000000..31471e7247
--- /dev/null
+++ b/comm/third_party/botan/src/lib/block/serpent/serpent_sbox.h
@@ -0,0 +1,446 @@
+/*
+* Serpent SBox Expressions
+* (C) 1999-2007,2013 Jack Lloyd
+*
+* The sbox expressions used here were discovered by Dag Arne Osvik and
+* are described in his paper "Speeding Up Serpent".
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#ifndef BOTAN_SERPENT_SBOX_H_
+#define BOTAN_SERPENT_SBOX_H_
+
+#include <botan/build.h>
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE0(T& a, T& b, T& c, T& d)
+ {
+ d ^= a;
+ T t0 = b;
+ b &= d;
+ t0 ^= c;
+ b ^= a;
+ a |= d;
+ a ^= t0;
+ t0 ^= d;
+ d ^= c;
+ c |= b;
+ c ^= t0;
+ t0 = ~t0;
+ t0 |= b;
+ b ^= d;
+ b ^= t0;
+ d |= a;
+ b ^= d;
+ t0 ^= d;
+ d = a;
+ a = b;
+ b = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE1(T& a, T& b, T& c, T& d)
+ {
+ a = ~a;
+ c = ~c;
+ T t0 = a;
+ a &= b;
+ c ^= a;
+ a |= d;
+ d ^= c;
+ b ^= a;
+ a ^= t0;
+ t0 |= b;
+ b ^= d;
+ c |= a;
+ c &= t0;
+ a ^= b;
+ b &= c;
+ b ^= a;
+ a &= c;
+ t0 ^= a;
+ a = c;
+ c = d;
+ d = b;
+ b = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE2(T& a, T& b, T& c, T& d)
+ {
+ T t0 = a;
+ a &= c;
+ a ^= d;
+ c ^= b;
+ c ^= a;
+ d |= t0;
+ d ^= b;
+ t0 ^= c;
+ b = d;
+ d |= t0;
+ d ^= a;
+ a &= b;
+ t0 ^= a;
+ b ^= d;
+ b ^= t0;
+ a = c;
+ c = b;
+ b = d;
+ d = ~t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE3(T& a, T& b, T& c, T& d)
+ {
+ T t0 = a;
+ a |= d;
+ d ^= b;
+ b &= t0;
+ t0 ^= c;
+ c ^= d;
+ d &= a;
+ t0 |= b;
+ d ^= t0;
+ a ^= b;
+ t0 &= a;
+ b ^= d;
+ t0 ^= c;
+ b |= a;
+ b ^= c;
+ a ^= d;
+ c = b;
+ b |= d;
+ a ^= b;
+ b = c;
+ c = d;
+ d = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE4(T& a, T& b, T& c, T& d)
+ {
+ b ^= d;
+ d = ~d;
+ c ^= d;
+ d ^= a;
+ T t0 = b;
+ b &= d;
+ b ^= c;
+ t0 ^= d;
+ a ^= t0;
+ c &= t0;
+ c ^= a;
+ a &= b;
+ d ^= a;
+ t0 |= b;
+ t0 ^= a;
+ a |= d;
+ a ^= c;
+ c &= d;
+ a = ~a;
+ t0 ^= c;
+ c = a;
+ a = b;
+ b = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE5(T& a, T& b, T& c, T& d)
+ {
+ a ^= b;
+ b ^= d;
+ d = ~d;
+ T t0 = b;
+ b &= a;
+ c ^= d;
+ b ^= c;
+ c |= t0;
+ t0 ^= d;
+ d &= b;
+ d ^= a;
+ t0 ^= b;
+ t0 ^= c;
+ c ^= a;
+ a &= d;
+ c = ~c;
+ a ^= t0;
+ t0 |= d;
+ t0 ^= c;
+ c = a;
+ a = b;
+ b = d;
+ d = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE6(T& a, T& b, T& c, T& d)
+ {
+ c = ~c;
+ T t0 = d;
+ d &= a;
+ a ^= t0;
+ d ^= c;
+ c |= t0;
+ b ^= d;
+ c ^= a;
+ a |= b;
+ c ^= b;
+ t0 ^= a;
+ a |= d;
+ a ^= c;
+ t0 ^= d;
+ t0 ^= a;
+ d = ~d;
+ c &= t0;
+ d ^= c;
+ c = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxE7(T& a, T& b, T& c, T& d)
+ {
+ T t0 = b;
+ b |= c;
+ b ^= d;
+ t0 ^= c;
+ c ^= b;
+ d |= t0;
+ d &= a;
+ t0 ^= c;
+ d ^= b;
+ b |= t0;
+ b ^= a;
+ a |= t0;
+ a ^= c;
+ b ^= t0;
+ c ^= b;
+ b &= a;
+ b ^= t0;
+ c = ~c;
+ c |= a;
+ t0 ^= c;
+ c = b;
+ b = d;
+ d = a;
+ a = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD0(T& a, T& b, T& c, T& d)
+ {
+ c = ~c;
+ T t0 = b;
+ b |= a;
+ t0 = ~t0;
+ b ^= c;
+ c |= t0;
+ b ^= d;
+ a ^= t0;
+ c ^= a;
+ a &= d;
+ t0 ^= a;
+ a |= b;
+ a ^= c;
+ d ^= t0;
+ c ^= b;
+ d ^= a;
+ d ^= b;
+ c &= d;
+ t0 ^= c;
+ c = b;
+ b = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD1(T& a, T& b, T& c, T& d)
+ {
+ T t0 = b;
+ b ^= d;
+ d &= b;
+ t0 ^= c;
+ d ^= a;
+ a |= b;
+ c ^= d;
+ a ^= t0;
+ a |= c;
+ b ^= d;
+ a ^= b;
+ b |= d;
+ b ^= a;
+ t0 = ~t0;
+ t0 ^= b;
+ b |= a;
+ b ^= a;
+ b |= t0;
+ d ^= b;
+ b = a;
+ a = t0;
+ t0 = c;
+ c = d;
+ d = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD2(T& a, T& b, T& c, T& d)
+ {
+ c ^= d;
+ d ^= a;
+ T t0 = d;
+ d &= c;
+ d ^= b;
+ b |= c;
+ b ^= t0;
+ t0 &= d;
+ c ^= d;
+ t0 &= a;
+ t0 ^= c;
+ c &= b;
+ c |= a;
+ d = ~d;
+ c ^= d;
+ a ^= d;
+ a &= b;
+ d ^= t0;
+ d ^= a;
+ a = b;
+ b = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD3(T& a, T& b, T& c, T& d)
+ {
+ T t0 = c;
+ c ^= b;
+ a ^= c;
+ t0 &= c;
+ t0 ^= a;
+ a &= b;
+ b ^= d;
+ d |= t0;
+ c ^= d;
+ a ^= d;
+ b ^= t0;
+ d &= c;
+ d ^= b;
+ b ^= a;
+ b |= c;
+ a ^= d;
+ b ^= t0;
+ a ^= b;
+ t0 = a;
+ a = c;
+ c = d;
+ d = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD4(T& a, T& b, T& c, T& d)
+ {
+ T t0 = c;
+ c &= d;
+ c ^= b;
+ b |= d;
+ b &= a;
+ t0 ^= c;
+ t0 ^= b;
+ b &= c;
+ a = ~a;
+ d ^= t0;
+ b ^= d;
+ d &= a;
+ d ^= c;
+ a ^= b;
+ c &= a;
+ d ^= a;
+ c ^= t0;
+ c |= d;
+ d ^= a;
+ c ^= b;
+ b = d;
+ d = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD5(T& a, T& b, T& c, T& d)
+ {
+ b = ~b;
+ T t0 = d;
+ c ^= b;
+ d |= a;
+ d ^= c;
+ c |= b;
+ c &= a;
+ t0 ^= d;
+ c ^= t0;
+ t0 |= a;
+ t0 ^= b;
+ b &= c;
+ b ^= d;
+ t0 ^= c;
+ d &= t0;
+ t0 ^= b;
+ d ^= t0;
+ t0 = ~t0;
+ d ^= a;
+ a = b;
+ b = t0;
+ t0 = d;
+ d = c;
+ c = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD6(T& a, T& b, T& c, T& d)
+ {
+ a ^= c;
+ T t0 = c;
+ c &= a;
+ t0 ^= d;
+ c = ~c;
+ d ^= b;
+ c ^= d;
+ t0 |= a;
+ a ^= c;
+ d ^= t0;
+ t0 ^= b;
+ b &= d;
+ b ^= a;
+ a ^= d;
+ a |= c;
+ d ^= b;
+ t0 ^= a;
+ a = b;
+ b = c;
+ c = t0;
+ }
+
+template<typename T>
+BOTAN_FORCE_INLINE void SBoxD7(T& a, T& b, T& c, T& d)
+ {
+ T t0 = c;
+ c ^= a;
+ a &= d;
+ t0 |= d;
+ c = ~c;
+ d ^= b;
+ b |= a;
+ a ^= c;
+ c &= t0;
+ d &= t0;
+ b ^= c;
+ c ^= a;
+ a |= c;
+ t0 ^= b;
+ a ^= d;
+ d ^= t0;
+ t0 |= a;
+ d ^= c;
+ t0 ^= c;
+ c = b;
+ b = a;
+ a = d;
+ d = t0;
+ }
+
+#endif