from ctypes import * from ctypes.wintypes import LPWSTR, LPCSTR, LPVOID g_lib = None def BN256_init(): global g_lib g_lib = cdll.LoadLibrary("../../bin/bn256.dll") ret = g_lib.BN256_init() if ret: print "ERR BN256_init" class Fr(Structure): _fields_ = [("v", c_ulonglong * 4)] def setInt(self, v): g_lib.BN256_Fr_setInt(self.v, v) def setStr(self, s): ret = g_lib.BN256_Fr_setStr(self.v, c_char_p(s)) if ret: print("ERR Fr:setStr") def __str__(self): svLen = 1024 sv = create_string_buffer('\0' * svLen) ret = g_lib.BN256_Fr_getStr(sv, svLen, self.v) if ret: print("ERR Fr:getStr") return sv.value def isZero(self, rhs): return g_lib.BN256_Fr_isZero(self.v) != 0 def isOne(self, rhs): return g_lib.BN256_Fr_isOne(self.v) != 0 def __eq__(self, rhs): return g_lib.BN256_Fr_isEqual(self.v, rhs.v) != 0 def __ne__(self, rhs): return not(P == Q) def __add__(self, rhs): ret = Fr() g_lib.BN256_Fr_add(ret.v, self.v, rhs.v) return ret def __sub__(self, rhs): ret = Fr() g_lib.BN256_Fr_sub(ret.v, self.v, rhs.v) return ret def __mul__(self, rhs): ret = Fr() g_lib.BN256_Fr_mul(ret.v, self.v, rhs.v) return ret def __div__(self, rhs): ret = Fr() g_lib.BN256_Fr_div(ret.v, self.v, rhs.v) return ret def __neg__(self): ret = Fr() g_lib.BN256_Fr_neg(ret.v, self.v) return ret def Fr_add(z, x, y): g_lib.BN256_Fr_add(z.v, x.v, y.v) def Fr_sub(z, x, y): g_lib.BN256_Fr_sub(z.v, x.v, y.v) def Fr_mul(z, x, y): g_lib.BN256_Fr_mul(z.v, x.v, y.v) def Fr_div(z, x, y): g_lib.BN256_Fr_div(z.v, x.v, y.v) BN256_init() P = Fr() Q = Fr() print P == Q print P != Q P.setInt(5) Q.setStr("34982034824") print Q R = Fr() Fr_add(R, P, Q) print R