diff options
Diffstat (limited to '')
| -rw-r--r-- | obfuscator/keccak-tiny/.depend | 8 | ||||
| -rw-r--r-- | obfuscator/keccak-tiny/keccak-tiny-unrolled.c | 163 | ||||
| -rw-r--r-- | obfuscator/keccak-tiny/keccak-tiny.c | 163 | ||||
| -rw-r--r-- | obfuscator/keccak-tiny/keccak-tiny.h | 23 | ||||
| -rw-r--r-- | obfuscator/keccak-tiny/keccak-tiny.hpp | 4 | ||||
| -rw-r--r-- | obfuscator/makefile | 11 | ||||
| -rw-r--r-- | obfuscator/obfuscator.cpp | 1 | 
7 files changed, 371 insertions, 2 deletions
| diff --git a/obfuscator/keccak-tiny/.depend b/obfuscator/keccak-tiny/.depend new file mode 100644 index 0000000..d52bbf2 --- /dev/null +++ b/obfuscator/keccak-tiny/.depend @@ -0,0 +1,8 @@ +keccak-tiny-unrolled.o: keccak-tiny-unrolled.c keccak-tiny.h +keccak-tiny.o: keccak-tiny.c keccak-tiny.h + +keccak-tiny-unrolled.odbg: keccak-tiny-unrolled.c keccak-tiny.h  +keccak-tiny.odbg: keccak-tiny.c keccak-tiny.h + +keccak-tiny-unrolled.ocov: keccak-tiny-unrolled.c keccak-tiny.h  +keccak-tiny.ocov: keccak-tiny.c keccak-tiny.h diff --git a/obfuscator/keccak-tiny/keccak-tiny-unrolled.c b/obfuscator/keccak-tiny/keccak-tiny-unrolled.c new file mode 100644 index 0000000..c238af4 --- /dev/null +++ b/obfuscator/keccak-tiny/keccak-tiny-unrolled.c @@ -0,0 +1,163 @@ +/** libkeccak-tiny + * + * A single-file implementation of SHA-3 and SHAKE. + * + * Implementor: David Leon Gil + * License: CC0, attribution kindly requested. Blame taken too, + * but not liability. + */ +#include "keccak-tiny.h" + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/******** The Keccak-f[1600] permutation ********/ + +/*** Constants. ***/ +static const uint8_t rho[24] = \ +  { 1,  3,   6, 10, 15, 21, +    28, 36, 45, 55,  2, 14, +    27, 41, 56,  8, 25, 43, +    62, 18, 39, 61, 20, 44}; +static const uint8_t pi[24] = \ +  {10,  7, 11, 17, 18, 3, +    5, 16,  8, 21, 24, 4, +   15, 23, 19, 13, 12, 2, +   20, 14, 22,  9, 6,  1}; +static const uint64_t RC[24] = \ +  {1ULL, 0x8082ULL, 0x800000000000808aULL, 0x8000000080008000ULL, +   0x808bULL, 0x80000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL, +   0x8aULL, 0x88ULL, 0x80008009ULL, 0x8000000aULL, +   0x8000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL, +   0x8000000000008002ULL, 0x8000000000000080ULL, 0x800aULL, 0x800000008000000aULL, +   0x8000000080008081ULL, 0x8000000000008080ULL, 0x80000001ULL, 0x8000000080008008ULL}; + +/*** Helper macros to unroll the permutation. ***/ +#define rol(x, s) (((x) << s) | ((x) >> (64 - s))) +#define REPEAT6(e) e e e e e e +#define REPEAT24(e) REPEAT6(e e e e) +#define REPEAT5(e) e e e e e +#define FOR5(v, s, e) \ +  v = 0;            \ +  REPEAT5(e; v += s;) + +/*** Keccak-f[1600] ***/ +static inline void keccakf(void* state) { +  uint64_t* a = (uint64_t*)state; +  uint64_t b[5] = {0}; +  uint64_t t = 0; +  uint8_t x, y, i = 0; + +  REPEAT24( +      // Theta +      FOR5(x, 1, +           b[x] = 0; +           FOR5(y, 5, +                b[x] ^= a[x + y]; )) +      FOR5(x, 1, +           FOR5(y, 5, +                a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); )) +      // Rho and pi +      t = a[1]; +      x = 0; +      REPEAT24(b[0] = a[pi[x]]; +               a[pi[x]] = rol(t, rho[x]); +               t = b[0]; +               x++; ) +      // Chi +      FOR5(y, +         5, +         FOR5(x, 1, +              b[x] = a[y + x];) +         FOR5(x, 1, +              a[y + x] = b[x] ^ ((~b[(x + 1) % 5]) & b[(x + 2) % 5]); )) +      // Iota +      a[0] ^= RC[i]; +      i++; ) +} + +/******** The FIPS202-defined functions. ********/ + +/*** Some helper macros. ***/ + +#define _(S) do { S } while (0) +#define FOR(i, ST, L, S) \ +  _(for (size_t i = 0; i < L; i += ST) { S; }) +#define mkapply_ds(NAME, S)                                          \ +  static inline void NAME(uint8_t* dst,                              \ +                          const uint8_t* src,                        \ +                          size_t len) {                              \ +    FOR(i, 1, len, S);                                               \ +  } +#define mkapply_sd(NAME, S)                                          \ +  static inline void NAME(const uint8_t* src,                        \ +                          uint8_t* dst,                              \ +                          size_t len) {                              \ +    FOR(i, 1, len, S);                                               \ +  } + +mkapply_ds(xorin, dst[i] ^= src[i])  // xorin +mkapply_sd(setout, dst[i] = src[i])  // setout + +#define P keccakf +#define Plen 200 + +// Fold P*F over the full blocks of an input. +#define foldP(I, L, F) \ +  while (L >= rate) {  \ +    F(a, I, rate);     \ +    P(a);              \ +    I += rate;         \ +    L -= rate;         \ +  } + +/** The sponge-based hash construction. **/ +static inline int hash(uint8_t* out, size_t outlen, +                       const uint8_t* in, size_t inlen, +                       size_t rate, uint8_t delim) { +  if ((out == NULL) || ((in == NULL) && inlen != 0) || (rate >= Plen)) { +    return -1; +  } +  uint8_t a[Plen] = {0}; +  // Absorb input. +  foldP(in, inlen, xorin); +  // Xor in the DS and pad frame. +  a[inlen] ^= delim; +  a[rate - 1] ^= 0x80; +  // Xor in the last block. +  xorin(a, in, inlen); +  // Apply P +  P(a); +  // Squeeze output. +  foldP(out, outlen, setout); +  setout(a, out, outlen); +  memset_s(a, 200, 0, 200); +  return 0; +} + +/*** Helper macros to define SHA3 and SHAKE instances. ***/ +#define defshake(bits)                                            \ +  int shake##bits(uint8_t* out, size_t outlen,                    \ +                  const uint8_t* in, size_t inlen) {              \ +    return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x1f);  \ +  } +#define defsha3(bits)                                             \ +  int sha3_##bits(uint8_t* out, size_t outlen,                    \ +                  const uint8_t* in, size_t inlen) {              \ +    if (outlen > (bits/8)) {                                      \ +      return -1;                                                  \ +    }                                                             \ +    return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x06);  \ +  } + +/*** FIPS202 SHAKE VOFs ***/ +defshake(128) +defshake(256) + +/*** FIPS202 SHA3 FOFs ***/ +defsha3(224) +defsha3(256) +defsha3(384) +defsha3(512) diff --git a/obfuscator/keccak-tiny/keccak-tiny.c b/obfuscator/keccak-tiny/keccak-tiny.c new file mode 100644 index 0000000..76d89fa --- /dev/null +++ b/obfuscator/keccak-tiny/keccak-tiny.c @@ -0,0 +1,163 @@ +/** libkeccak-tiny + * + * A single-file implementation of SHA-3 and SHAKE. + * + * Implementor: David Leon Gil + * License: CC0, attribution kindly requested. Blame taken too, + * but not liability. + */ +#include "keccak-tiny.h" + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/******** The Keccak-f[1600] permutation ********/ + +/*** Constants. ***/ +static const uint8_t rho[24] = \ +  { 1,  3,   6, 10, 15, 21, +    28, 36, 45, 55,  2, 14, +    27, 41, 56,  8, 25, 43, +    62, 18, 39, 61, 20, 44}; +static const uint8_t pi[24] = \ +  {10,  7, 11, 17, 18, 3, +    5, 16,  8, 21, 24, 4, +   15, 23, 19, 13, 12, 2, +   20, 14, 22,  9, 6,  1}; +static const uint64_t RC[24] = \ +  {1ULL, 0x8082ULL, 0x800000000000808aULL, 0x8000000080008000ULL, +   0x808bULL, 0x80000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL, +   0x8aULL, 0x88ULL, 0x80008009ULL, 0x8000000aULL, +   0x8000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL, +   0x8000000000008002ULL, 0x8000000000000080ULL, 0x800aULL, 0x800000008000000aULL, +   0x8000000080008081ULL, 0x8000000000008080ULL, 0x80000001ULL, 0x8000000080008008ULL}; + +/*** Helper macros to unroll the permutation. ***/ +#define rol(x, s) (((x) << s) | ((x) >> (64 - s))) +#define REPEAT6(e) e e e e e e +#define REPEAT24(e) REPEAT6(e e e e) +#define REPEAT5(e) e e e e e +#define FOR5(v, s, e) \ +  v = 0;            \ +  REPEAT5(e; v += s;) + +/*** Keccak-f[1600] ***/ +static inline void keccakf(void* state) { +  uint64_t* a = (uint64_t*)state; +  uint64_t b[5] = {0}; +  uint64_t t = 0; +  uint8_t x, y; + +  for (int i = 0; i < 24; i++) { +    // Theta +    FOR5(x, 1, +         b[x] = 0; +         FOR5(y, 5, +              b[x] ^= a[x + y]; )) +    FOR5(x, 1, +         FOR5(y, 5, +              a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); )) +    // Rho and pi +    t = a[1]; +    x = 0; +    REPEAT24(b[0] = a[pi[x]]; +             a[pi[x]] = rol(t, rho[x]); +             t = b[0]; +             x++; ) +    // Chi +    FOR5(y, +       5, +       FOR5(x, 1, +            b[x] = a[y + x];) +       FOR5(x, 1, +            a[y + x] = b[x] ^ ((~b[(x + 1) % 5]) & b[(x + 2) % 5]); )) +    // Iota +    a[0] ^= RC[i]; +  } +} + +/******** The FIPS202-defined functions. ********/ + +/*** Some helper macros. ***/ + +#define _(S) do { S } while (0) +#define FOR(i, ST, L, S) \ +  _(for (size_t i = 0; i < L; i += ST) { S; }) +#define mkapply_ds(NAME, S)                                          \ +  static inline void NAME(uint8_t* dst,                              \ +                          const uint8_t* src,                        \ +                          size_t len) {                              \ +    FOR(i, 1, len, S);                                               \ +  } +#define mkapply_sd(NAME, S)                                          \ +  static inline void NAME(const uint8_t* src,                        \ +                          uint8_t* dst,                              \ +                          size_t len) {                              \ +    FOR(i, 1, len, S);                                               \ +  } + +mkapply_ds(xorin, dst[i] ^= src[i])  // xorin +mkapply_sd(setout, dst[i] = src[i])  // setout + +#define P keccakf +#define Plen 200 + +// Fold P*F over the full blocks of an input. +#define foldP(I, L, F) \ +  while (L >= rate) {  \ +    F(a, I, rate);     \ +    P(a);              \ +    I += rate;         \ +    L -= rate;         \ +  } + +/** The sponge-based hash construction. **/ +static inline int hash(uint8_t* out, size_t outlen, +                       const uint8_t* in, size_t inlen, +                       size_t rate, uint8_t delim) { +  if ((out == NULL) || ((in == NULL) && inlen != 0) || (rate >= Plen)) { +    return -1; +  } +  uint8_t a[Plen] = {0}; +  // Absorb input. +  foldP(in, inlen, xorin); +  // Xor in the DS and pad frame. +  a[inlen] ^= delim; +  a[rate - 1] ^= 0x80; +  // Xor in the last block. +  xorin(a, in, inlen); +  // Apply P +  P(a); +  // Squeeze output. +  foldP(out, outlen, setout); +  setout(a, out, outlen); +  memset_s(a, 200, 0, 200); +  return 0; +} + +/*** Helper macros to define SHA3 and SHAKE instances. ***/ +#define defshake(bits)                                            \ +  int shake##bits(uint8_t* out, size_t outlen,                    \ +                  const uint8_t* in, size_t inlen) {              \ +    return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x1f);  \ +  } +#define defsha3(bits)                                             \ +  int sha3_##bits(uint8_t* out, size_t outlen,                    \ +                  const uint8_t* in, size_t inlen) {              \ +    if (outlen > (bits/8)) {                                      \ +      return -1;                                                  \ +    }                                                             \ +    return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x06);  \ +  } + +/*** FIPS202 SHAKE VOFs ***/ +defshake(128) +defshake(256) + +/*** FIPS202 SHA3 FOFs ***/ +defsha3(224) +defsha3(256) +defsha3(384) +defsha3(512) diff --git a/obfuscator/keccak-tiny/keccak-tiny.h b/obfuscator/keccak-tiny/keccak-tiny.h new file mode 100644 index 0000000..e914b96 --- /dev/null +++ b/obfuscator/keccak-tiny/keccak-tiny.h @@ -0,0 +1,23 @@ +#ifndef KECCAK_FIPS202_H +#define KECCAK_FIPS202_H +#define __STDC_WANT_LIB_EXT1__ 1 +#include <stdint.h> +#include <stdlib.h> + +#ifndef __STDC_LIB_EXT1__ +#define memset_s(W,WL,V,OL) memset(W,V,OL) +#endif + +#define decshake(bits) \ +  int shake##bits(uint8_t*, size_t, const uint8_t*, size_t); + +#define decsha3(bits) \ +  int sha3_##bits(uint8_t*, size_t, const uint8_t*, size_t); + +decshake(128) +decshake(256) +decsha3(224) +decsha3(256) +decsha3(384) +decsha3(512) +#endif diff --git a/obfuscator/keccak-tiny/keccak-tiny.hpp b/obfuscator/keccak-tiny/keccak-tiny.hpp new file mode 100644 index 0000000..fe9ab4c --- /dev/null +++ b/obfuscator/keccak-tiny/keccak-tiny.hpp @@ -0,0 +1,4 @@ + +extern "C" { +#include "keccak-tiny.h" +} diff --git a/obfuscator/makefile b/obfuscator/makefile index 9a9981f..960fb80 100644 --- a/obfuscator/makefile +++ b/obfuscator/makefile @@ -23,11 +23,18 @@ depend: .depend  .cpp.o:  	$(CXX) -v $(CXX_FLAGS) -c $< -o $@ -$(OBSC): $(OBSC).o ../mutator_aux.o +./keccak-tiny/.o:./keccak-tiny/.c +	$(CC) $(CC_FLAGS) -c $< -o $@ + +$(OBSC): $(OBSC).o ../mutator_aux.o ./keccak-tiny/keccak-tiny.o  	$(CXX) -v $^ $(LD_FLAGS) -o $@  clean: -	rm -f *.o *~ $(OBSC) +	rm -f *.o *~ $(OBSC) *.out ./keccak-tiny/*.o +	rm ./.depend + +deepclean: +	rm -f *.o *~ $(OBSC) *.out FILE*.cpp FILE*.hpp ./keccak-tiny/*.o  	rm ./.depend  help: diff --git a/obfuscator/obfuscator.cpp b/obfuscator/obfuscator.cpp index 75740e9..e28cb55 100644 --- a/obfuscator/obfuscator.cpp +++ b/obfuscator/obfuscator.cpp @@ -23,6 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*  /*included modules*/  /*project headers*/  #include "../mutator_aux.h" +#include "./keccak-tiny/keccak-tiny.hpp"  /*standard headers*/  #include <cassert>  #include <cstdlib> | 
