aboutsummaryrefslogtreecommitdiff
path: root/crypto/clmul.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/clmul.c')
-rw-r--r--crypto/clmul.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/crypto/clmul.c b/crypto/clmul.c
index 36ada1b..9e3e61a 100644
--- a/crypto/clmul.c
+++ b/crypto/clmul.c
@@ -92,3 +92,20 @@ uint64_t clmul_32(uint32_t n, uint32_t m32)
}
return r;
}
+
+Int128 clmul_64_gen(uint64_t n, uint64_t m)
+{
+ uint64_t rl = 0, rh = 0;
+
+ /* Bit 0 can only influence the low 64-bit result. */
+ if (n & 1) {
+ rl = m;
+ }
+
+ for (int i = 1; i < 64; ++i) {
+ uint64_t mask = -((n >> i) & 1);
+ rl ^= (m << i) & mask;
+ rh ^= (m >> (64 - i)) & mask;
+ }
+ return int128_make128(rl, rh);
+}