(no commit message)
authorlkcl <lkcl@web>
Sun, 24 Jan 2021 21:03:44 +0000 (21:03 +0000)
committerIkiWiki <ikiwiki.info>
Sun, 24 Jan 2021 21:03:44 +0000 (21:03 +0000)
openpower/sv/bitmanip.mdwn

index 5cc43ba7b1787bb1c94cacd1a7d4698ceb6dd6da..156fb2b5349fbf38057d46fb22b10bd9bd8e604f 100644 (file)
@@ -426,6 +426,56 @@ uint_xlen_t clmulr(uint_xlen_t RA, uint_xlen_t RB)
     return x;
 }
 ```
+# Galois Field Multiply
+
+```
+from functools import reduce
+
+# constants used in the multGF2 function
+mask1 = mask2 = polyred = None
+
+def setGF2(degree, irPoly):
+    """Define parameters of binary finite field GF(2^m)/g(x)
+       - degree: extension degree of binary field
+       - irPoly: coefficients of irreducible polynomial g(x)
+    """
+    def i2P(sInt):
+        """Convert an integer into a polynomial"""
+        return [(sInt >> i) & 1
+                for i in reversed(range(sInt.bit_length()))]    
+    
+    global mask1, mask2, polyred
+    mask1 = mask2 = 1 << degree
+    mask2 -= 1
+    polyred = reduce(lambda x, y: (x << 1) + y, i2P(irPoly)[1:])
+        
+def multGF2(p1, p2):
+    """Multiply two polynomials in GF(2^m)/g(x)"""
+    p = 0
+    while p2:
+        if p2 & 1:
+            p ^= p1
+        p1 <<= 1
+        if p1 & mask1:
+            p1 ^= polyred
+        p2 >>= 1
+    return p & mask2
+
+if __name__ == "__main__":
+  
+    # Define binary field GF(2^3)/x^3 + x + 1
+    setGF2(3, 0b1011)
+
+    # Evaluate the product (x^2 + x + 1)(x^2 + 1)
+    print("{:02x}".format(multGF2(0b111, 0b101)))
+    
+    # Define binary field GF(2^8)/x^8 + x^4 + x^3 + x + 1
+    # (used in the Advanced Encryption Standard-AES)
+    setGF2(8, 0b100011011)
+    
+    # Evaluate the product (x^7)(x^7 + x + 1)
+    print("{:02x}".format(multGF2(0b10000000, 0b10000011)))
+```
 
 # crc