]> git.proxmox.com Git - mirror_qemu.git/commitdiff
crypto: Add generic 16-bit carry-less multiply routines
authorRichard Henderson <richard.henderson@linaro.org>
Tue, 11 Jul 2023 08:14:58 +0000 (09:14 +0100)
committerRichard Henderson <richard.henderson@linaro.org>
Fri, 15 Sep 2023 13:57:00 +0000 (13:57 +0000)
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
crypto/clmul.c
include/crypto/clmul.h

index 82d873fee5d76108f4253c691d2ce65c7519d808..2c87cfbf8ab7a9371e7d751dd1088be4712ec907 100644 (file)
@@ -58,3 +58,24 @@ uint64_t clmul_8x4_packed(uint32_t n, uint32_t m)
 {
     return clmul_8x4_even_int(unpack_8_to_16(n), unpack_8_to_16(m));
 }
+
+uint64_t clmul_16x2_even(uint64_t n, uint64_t m)
+{
+    uint64_t r = 0;
+
+    n &= 0x0000ffff0000ffffull;
+    m &= 0x0000ffff0000ffffull;
+
+    for (int i = 0; i < 16; ++i) {
+        uint64_t mask = (n & 0x0000000100000001ull) * 0xffffffffull;
+        r ^= m & mask;
+        n >>= 1;
+        m <<= 1;
+    }
+    return r;
+}
+
+uint64_t clmul_16x2_odd(uint64_t n, uint64_t m)
+{
+    return clmul_16x2_even(n >> 16, m >> 16);
+}
index 153b5e3057a7cf162314addedbae1f6646c7eff0..72672b237c39e355cdf2db0f7e221f99d341d8dd 100644 (file)
@@ -38,4 +38,20 @@ uint64_t clmul_8x4_odd(uint64_t, uint64_t);
  */
 uint64_t clmul_8x4_packed(uint32_t, uint32_t);
 
+/**
+ * clmul_16x2_even:
+ *
+ * Perform two 16x16->32 carry-less multiplies.
+ * The odd words of the inputs are ignored.
+ */
+uint64_t clmul_16x2_even(uint64_t, uint64_t);
+
+/**
+ * clmul_16x2_odd:
+ *
+ * Perform two 16x16->32 carry-less multiplies.
+ * The even words of the inputs are ignored.
+ */
+uint64_t clmul_16x2_odd(uint64_t, uint64_t);
+
 #endif /* CRYPTO_CLMUL_H */