summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cbits/threefish.h43
-rw-r--r--threefish.cabal4
2 files changed, 45 insertions, 2 deletions
diff --git a/cbits/threefish.h b/cbits/threefish.h
new file mode 100644
index 0000000..26b3201
--- /dev/null
+++ b/cbits/threefish.h
@@ -0,0 +1,43 @@
+#ifndef _THREEFISH_H
+#define _THREEFISH_H
+
+typedef unsigned long long W64;
+extern W64 key_const;
+
+typedef struct {
+ W64 key[4];
+ W64 tweak[2];
+ int outlen;
+} skein_t;
+
+#define rl(x, b) (((x) << ((b) & 63)) | ((x) >> ((64-(b)) & 63)))
+#define rr(x, b) (((x) >> ((b) & 63)) | ((x) << ((64-(b)) & 63)))
+
+typedef enum {
+ T_KEY = 0,
+ T_CONFIG = 4,
+ T_PERSONALIZATION = 8,
+ T_PUBKEY = 12,
+ T_KEYIDENTIFIER = 16,
+ T_NONCE = 20,
+ T_MSG = 48,
+ T_OUT = 63
+} UBIType;
+
+void encrypt256(W64* key, W64 t0, W64 t1, W64* in, W64* out);
+void decrypt256(W64* key, W64 t0, W64 t1, W64* in, W64* out);
+
+/* note that here outlen is in *bits* */
+void skein256_init(skein_t* ctx, W64* key, W64 outlen);
+/* firstlast & 1 if we're starting a new type, firstlast & 2 if it's the last update */
+void skein256_update(skein_t* ctx, int firstlast, UBIType type, W64 len, W64* data);
+void skein256_output(skein_t* ctx, int from, int to, W64* out);
+
+inline void init_tweak(UBIType type, W64* t);
+inline void mk_config_tweak(W64* t);
+inline void set_type(UBIType type, W64* t);
+inline void set_first(unsigned char first, W64* t);
+inline void set_last(unsigned char last, W64* t);
+inline void add_bytes(W64 bytes, W64* t);
+
+#endif
diff --git a/threefish.cabal b/threefish.cabal
index 74ecfa3..d9a804a 100644
--- a/threefish.cabal
+++ b/threefish.cabal
@@ -1,5 +1,5 @@
name: threefish
-version: 0.2.3
+version: 0.2.4
synopsis: The Threefish block cipher and the Skein hash function for Haskell.
description: Implements 256 and 512 bit variants of Threefish and Skein. Skein is usable as a "normal" hash function as well as in Skein-MAC, as a cryptographically secure PRNG, as a stream cipher and as a key derivation function, all implemented according to the specifications of the Skein 1.3 paper.
homepage: http://github.com/valderman/threefish
@@ -49,7 +49,7 @@ library
default-language: Haskell2010
ghc-options: -Wall -O2
include-dirs: cbits
- includes:
+ install-includes:
threefish.h
c-sources:
cbits/threefish256.c,