hwsl2 0.1.1.0 → 0.1.1.1
raw patch · 5 files changed
+4/−352 lines, 5 files
Files
- hwsl2.cabal +3/−2
- src/Data/Hash/SL2.hs +1/−1
- src/gf2p127-inl.h +0/−140
- src/sl2-inl.h +0/−189
- src/tillich-zemor.h +0/−20
hwsl2.cabal view
@@ -10,7 +10,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 0.1.1.0+version: 0.1.1.1 -- A short (one-line) description of the package. synopsis: Hashing with SL2@@ -78,7 +78,8 @@ hs-source-dirs: src -- Options for foreign source files.- c-sources: src/tillich-zemor.c src/tillich-zemor.h src/sl2-inl.h src/gf2p127-inl.h+ c-sources: src/tillich-zemor.c+ includes: src/tillich-zemor.h src/sl2-inl.h src/gf2p127-inl.h cc-options: -msse2 -msse4.1 -mpclmul -- Base language which the package is written in.
src/Data/Hash/SL2.hs view
@@ -121,7 +121,7 @@ (+>) :: ByteString -> Hash -> Hash (+>) s h = fst $ unsafePerformIO $ withHashPtrCopy h $ prepend s --- | /O(n)/ Append the hash of the every 'ByteString' to the existing 'Hash', from left to right.+-- | /O(n)/ Append the hash of every 'ByteString' to the existing 'Hash', from left to right. -- A significantly faster equivalent of @('foldl' ('<+'))@. infixl 7 <| (<|) :: Foldable t => Hash -> t ByteString -> Hash
− src/gf2p127-inl.h
@@ -1,140 +0,0 @@-#pragma once--#include <stdio.h>-#include <smmintrin.h>-#include <wmmintrin.h>--typedef __m128i gf2p127_t;--static const inline-_Bool gf2p127_eq(const gf2p127_t a, const gf2p127_t b) {- _Bool lo = _mm_extract_epi64(a, 0) == _mm_extract_epi64(b, 0);- _Bool hi = _mm_extract_epi64(a, 1) == _mm_extract_epi64(b, 1);- return lo && hi;-}--static const inline-gf2p127_t gf2p127_zero() {- return _mm_setzero_si128();-}--static const inline-gf2p127_t gf2p127_from_int(int a) {- return _mm_cvtsi32_si128(a);-}--static const inline-gf2p127_t gf2p127_mul_bit(const gf2p127_t a, const _Bool bit) {- return _mm_slli_epi64(a, !bit * 64);-}--static const inline-gf2p127_t gf2p127_add(const gf2p127_t a, const gf2p127_t b) {- return _mm_xor_si128(a, b);-}--static const inline-gf2p127_t gf2p127_mul_00(const gf2p127_t a) {- return _mm_setzero_si128();-}--static const inline-gf2p127_t gf2p127_mul_01(const gf2p127_t a) {- return a;-}--static const uint32_t x127[4] = {0, 0, 0, 1 << 31};--static const inline-gf2p127_t gf2p127_mul_10_left(const gf2p127_t a) {- // Shift lower and upper halves left by one bit,- // resembling a multiplication by two.- gf2p127_t sl = _mm_slli_epi64(a, 1);- // Check for a x^127 overflow, and add the polynom and carry bit.- gf2p127_t one = _mm_srli_epi64(_mm_alignr_epi8(a, sl, 8), 63);- gf2p127_t over = _mm_and_si128(sl, _mm_loadu_si128(x127));- gf2p127_t x127x63 = _mm_unpackhi_epi64(over, over);- return _mm_xor_si128(_mm_xor_si128(sl, one), x127x63);-}--static const inline-gf2p127_t gf2p127_mul_10(const gf2p127_t a) {- // Shift lower and upper halves left by one bit,- // resembling a multiplication by two.- gf2p127_t sl = _mm_slli_epi64(a, 1);- // Check for a x^127 overflow, and add the polynom and carry bit.- gf2p127_t one = _mm_srli_epi64(_mm_alignr_epi8(a, sl, 8), 63);- gf2p127_t x127x63 = _mm_slli_epi64(_mm_unpacklo_epi64(one, one), 63);- return _mm_xor_si128(_mm_xor_si128(sl, one), x127x63);-}--static const inline-gf2p127_t gf2p127_mul_11(const gf2p127_t a) {- gf2p127_t mul01 = gf2p127_mul_01(a);- gf2p127_t mul10 = gf2p127_mul_10(a);- return _mm_xor_si128(mul01, mul10);-};--static const inline-gf2p127_t gf2p127_mul(const gf2p127_t a, const gf2p127_t b) {- gf2p127_t tmp, lo, hi;-- // Multiplication (Karatsuba):- // tmp <- (a0 + a1) * (b0 + b1)- tmp = _mm_xor_si128(_mm_unpacklo_epi64(a, b), _mm_unpackhi_epi64(a, b));- tmp = _mm_clmulepi64_si128(tmp, tmp, 0x10);- // lo <- a0 * b0- lo = _mm_clmulepi64_si128(a, b, 0x00);- // hi <- a1 * b1- hi = _mm_clmulepi64_si128(a, b, 0x11);- // tmp <- (a0 + a1) * (b0 + b1) + a0 * b0 + a1 * b1- tmp = _mm_xor_si128(tmp, _mm_xor_si128(lo, hi));- // lo <- a0 * b0 + low64[(a0 + a1) * (b0 + b1) + a0 * b0 + a1 * b1] * x^64- lo = _mm_xor_si128(lo, _mm_slli_si128(tmp, 8));- // hi <- a1 * b1 + high64[(a0 + a1) * (b0 + b1) + a0 * b0 + a1 * b1]- hi = _mm_xor_si128(hi, _mm_srli_si128(tmp, 8));-- // Reduction (modulo f(x) = x^127 + x^63 + 1)- // tmp <- low64[hi] * x^64 + high64[lo]- tmp = _mm_alignr_epi8(hi, lo, 8);- tmp = _mm_xor_si128(tmp, hi);- hi = _mm_slli_epi64(hi, 1);- lo = _mm_xor_si128(lo, hi);- hi = _mm_unpackhi_epi64(hi, tmp);- lo = _mm_xor_si128(lo, hi);- tmp = _mm_srli_epi64(tmp, 63);- lo = _mm_xor_si128(lo, tmp);- hi = _mm_unpacklo_epi64(tmp, tmp);- lo = _mm_xor_si128(lo, _mm_slli_epi64(hi, 63));-- return lo;-}--static inline-char *gf2p127_show(char *buf, const gf2p127_t m) {- __uint128_t a = (__uint128_t)m;- unsigned int k;- int n;- char *str = buf;- if (a & 1) {- str += sprintf(str, "1");- } else {- str += sprintf(str, "0");- }- a >>= 1;- for (k = 1; k < 128; k++) {- if (a & 1) {- n = sprintf(str, " + 2^%i", k);- str += n;- }- a >>= 1;- }- return buf;-}--static inline-char *gf2p127_hex(char *str, const gf2p127_t m) {- sprintf(str, "%.16llx%.16llx", _mm_extract_epi64(m, 1),- _mm_extract_epi64(m, 0));- return str;-}
− src/sl2-inl.h
@@ -1,189 +0,0 @@-#pragma once--#include "gf2p127-inl.h"--typedef gf2p127_t sl2_t[2][2];--static inline-_Bool sl2_eq(sl2_t a, sl2_t b) {- return gf2p127_eq(a[0][0], b[0][0]) &&- gf2p127_eq(a[0][1], b[0][1]) &&- gf2p127_eq(a[1][0], b[1][0]) &&- gf2p127_eq(a[1][1], b[1][1]);-}--static inline-void sl2_copy(sl2_t dst, sl2_t src) {- dst[0][0] = src[0][0];- dst[0][1] = src[0][1];- dst[1][0] = src[1][0];- dst[1][1] = src[1][1];-}--static inline-void sl2_mul_bit_left(sl2_t b, int bit) {- // A: {00 = 10, 01 = 01, 10 = 01, 11 = 00}- // B: {00 = 10, 01 = 11, 10 = 01, 11 = 01}- gf2p127_t b00 = b[0][0];- gf2p127_t b10 = b[1][0];- gf2p127_t b01 = b[0][1];- gf2p127_t b11 = b[1][1];- b[0][0] = gf2p127_zero();- b[0][1] = gf2p127_zero();- b[1][0] = gf2p127_add(b00, b[bit][0]);- b[1][1] = gf2p127_add(b01, b[bit][1]);- b[0][0] = gf2p127_add(b10, gf2p127_mul_10_left(b[1][0]));- b[0][1] = gf2p127_add(b11, gf2p127_mul_10_left(b[1][1]));-}--static inline-void sl2_mul_bits_left(sl2_t b, unsigned char byte) {- sl2_mul_bit_left(b, (byte >> 0) & 1);- sl2_mul_bit_left(b, (byte >> 1) & 1);- sl2_mul_bit_left(b, (byte >> 2) & 1);- sl2_mul_bit_left(b, (byte >> 3) & 1);- sl2_mul_bit_left(b, (byte >> 4) & 1);- sl2_mul_bit_left(b, (byte >> 5) & 1);- sl2_mul_bit_left(b, (byte >> 6) & 1);- sl2_mul_bit_left(b, (byte >> 7) & 1);-}--static inline-void sl2_mul_bit_right(sl2_t a, int bit) {- // A: {00 = 10, 01 = 01, 10 = 01, 11 = 00}- // B: {00 = 10, 01 = 11, 10 = 01, 11 = 01}- gf2p127_t a00 = a[0][0];- gf2p127_t a10 = a[1][0];- gf2p127_t a01 = a[0][1];- gf2p127_t a11 = a[1][1];- a[0][1] = gf2p127_zero();- a[1][1] = gf2p127_zero();- a[0][0] = gf2p127_add(gf2p127_mul_10(a00), a01);- a[1][0] = gf2p127_add(gf2p127_mul_10(a10), a11);- a[0][1] = gf2p127_add(a00, a[0][!bit]);- a[1][1] = gf2p127_add(a10, a[1][!bit]);-}--static inline-void sl2_mul_bits_right(sl2_t a, unsigned char byte) {- sl2_mul_bit_right(a, (byte >> 7) & 1);- sl2_mul_bit_right(a, (byte >> 6) & 1);- sl2_mul_bit_right(a, (byte >> 5) & 1);- sl2_mul_bit_right(a, (byte >> 4) & 1);- sl2_mul_bit_right(a, (byte >> 3) & 1);- sl2_mul_bit_right(a, (byte >> 2) & 1);- sl2_mul_bit_right(a, (byte >> 1) & 1);- sl2_mul_bit_right(a, (byte >> 0) & 1);-}--static inline-void sl2_mul(sl2_t c, sl2_t a, sl2_t b) {- // Strassen algorithm- gf2p127_t m0, m1, m2, m3, m4, m5, m6;- m0 = gf2p127_mul(gf2p127_add(a[0][0], a[1][1]),- gf2p127_add(b[0][0], b[1][1]));- m1 = gf2p127_mul(gf2p127_add(a[1][0], a[1][1]), b[0][0]);- m2 = gf2p127_mul(a[0][0], gf2p127_add(b[0][1], b[1][1]));- m3 = gf2p127_mul(a[1][1], gf2p127_add(b[1][0], b[0][0]));- m4 = gf2p127_mul(gf2p127_add(a[0][0], a[0][1]), b[1][1]);- m5 = gf2p127_mul(gf2p127_add(a[1][0], a[0][0]),- gf2p127_add(b[0][0], b[0][1]));- m6 = gf2p127_mul(gf2p127_add(a[0][1], a[1][1]),- gf2p127_add(b[1][0], b[1][1]));- c[0][0] = gf2p127_add(gf2p127_add(m0, m3), gf2p127_add(m4, m6));- c[0][1] = gf2p127_add(m2, m4);- c[1][0] = gf2p127_add(m1, m3);- c[1][1] = gf2p127_add(gf2p127_add(m0, m1), gf2p127_add(m2, m5));-}--static inline-void sl2_mul_byte_left(sl2_t b, unsigned char byte, sl2_t m[256]) {- sl2_mul(m[byte], b, b);-}--static inline-void sl2_mul_byte_right(sl2_t a, unsigned char byte, sl2_t m[256]) {- sl2_mul(a, m[byte], a);-}--static inline-void sl2_init(sl2_t m[2]) {- m[0][0][0] = gf2p127_from_int(2);- m[0][0][1] = gf2p127_from_int(1);- m[0][1][0] = gf2p127_from_int(1);- m[0][1][1] = gf2p127_from_int(0);- m[1][0][0] = gf2p127_from_int(2);- m[1][0][1] = gf2p127_from_int(3);- m[1][1][0] = gf2p127_from_int(1);- m[1][1][1] = gf2p127_from_int(1);-}--static inline-void sl2_unit(sl2_t a) {- a[0][0] = gf2p127_from_int(1);- a[0][1] = gf2p127_from_int(0);- a[1][0] = gf2p127_from_int(0);- a[1][1] = gf2p127_from_int(1);-}--static inline-char *sl2_hex(char *buf, sl2_t a) {- gf2p127_hex(&buf[0], a[0][0]);- gf2p127_hex(&buf[32], a[0][1]);- gf2p127_hex(&buf[64], a[1][0]);- gf2p127_hex(&buf[96], a[1][1]);- return buf;-}--static const unsigned char b64[64] =- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";--static const unsigned char unb64[256] = {- ['A'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,- ['a'] = 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,- ['0'] = 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,- ['-'] = 62, ['_'] = 63-};--static inline-void sl2_serialize(sl2_t m, unsigned char buf[86]) {-- int i, j;- unsigned char a, b, c, *data = (unsigned char *)m;-- for (i = j = 0; i <= 64 - 3; i += 3, j += 4) {- a = data[i + 0];- b = data[i + 1];- c = data[i + 2];- buf[j + 0] = b64[a >> 2];- buf[j + 1] = b64[((0x03 & a) << 4) + (b >> 4)];- buf[j + 2] = b64[((0x0f & b) << 2) + (c >> 6)];- buf[j + 3] = b64[0x3f & c];- }-- buf[84] = b64[data[i] >> 2];- buf[85] = b64[(0x3 & data[i]) << 4];--}--static inline-void sl2_unserialize(sl2_t m, unsigned char buf[86]) {-- int i, j;- unsigned char a, b, c, d, *data = (unsigned char *)m;-- for (i = j = 0; i <= 86 - 4; i += 4, j += 3) {- a = unb64[buf[i + 0]];- b = unb64[buf[i + 1]];- c = unb64[buf[i + 2]];- d = unb64[buf[i + 3]];- data[j + 0] = (a << 2) | (b >> 4);- data[j + 1] = (b << 4) | (c >> 2);- data[j + 2] = (c << 6) | (d);- }-- data[63] = (unb64[buf[i]] << 2) | (unb64[buf[i + 1]] >> 4);--}
− src/tillich-zemor.h
@@ -1,20 +0,0 @@-#pragma once--#include <stddef.h>--#define TZ_HASH_SIZE 64-typedef struct tz_hash_struct *tz_hash_t;--void tz_hash_copy(tz_hash_t dst, tz_hash_t src);--int tz_hash_eq(tz_hash_t a, tz_hash_t b);--void tz_hash_unit(tz_hash_t);--void tz_hash_append(tz_hash_t h, unsigned char *buf, size_t n);-void tz_hash_prepend(tz_hash_t h, unsigned char *buf, size_t n);--void tz_hash_concat(tz_hash_t c, tz_hash_t a, tz_hash_t b);--void tz_hash_serialize(tz_hash_t h, unsigned char str[86]);-void tz_hash_unserialize(tz_hash_t h, unsigned char str[86]);