def interleaving_sliding_window(self, k, l): """Algorithm 3.5.1 menezez, 'Interleaving with NAF' """ R = None naf = [w_NAF(k, self.w1), w_NAF(l, self.w2)] #print(naf) _l = max([len(naf[0]), len(naf[1])]) #padding stage for i in range(_l - len(naf[0])): naf[0].insert(i, 0) for i in range(_l - len(naf[1])): naf[1].insert(i, 0) for i in range(_l): if R is None: R = None else: R = R.point_double() for j in range(2): if naf[j][i] != 0: if naf[j][i] > 0: if j == 0: R = self._P[naf[j][i]].add(R) else: R = self._Q[naf[j][i]].add(R) else: if j == 0: R = self._P[-naf[j][i]].inverse().add(R) else: R = self._Q[-naf[j][i]].inverse().add(R) return R
def sliding_window_left_to_right_scalar_mul(self, d): d = w_NAF(d, self.w) Q = None i = 0 while i < len(d): if d[i] == 0: if Q is None: Q = None else: Q = Q.point_double() i += 1 else: s = max(len(d) - i - self.w + 1, 0) s = len(d) - 1 - s while d[s] == 0: s -= 1 u = NAF(d[i:s + 1]) for j in range(1, i - s + 2): if Q is not None: Q = Q.point_double() else: Q = None if u > 0: Q = self._P[u].add(Q) if u < 0: Q = Q.add(self._P[-u].inverse()) i = 1 + s return Q
def interleaving_sliding_window(self, k, l): """Algorithm 3.5.1 menezez, 'Interleaving with NAF' """ #_P = {} # _Q = {} R = None naf = [w_NAF(k, self.w1), w_NAF(l, self.w2)] #print(naf) _l = max([len(naf[0]), len(naf[1])]) #precom stage # for i in range(1, 2**(w1 - 1), 2): # _P[i] = self.point1.right_to_left_scalar_mul(i) # for j in range(1, 2**(w2 - 1), 2): # _Q[j] = self.point2.right_to_left_scalar_mul(j) #padding stage for i in range(_l - len(naf[0])): naf[0].insert(i, 0) for i in range(_l - len(naf[1])): naf[1].insert(i, 0) for i in range(_l): if R is None: R = None else: R = R.point_double() for j in range(2): if naf[j][i] != 0: if naf[j][i] > 0: if j == 0: R = self._P[naf[j][i]].add(R) else: R = self._Q[naf[j][i]].add(R) else: if j == 0: R = self._P[-naf[j][i]].inverse().add(R) else: R = self._Q[-naf[j][i]].inverse().add(R) return R
def window_NAF_multiplication(self, d): d = w_NAF(d, self.w) # print(d) #_P = {} #for i in range(1, 2**(w-1), 2): # _P[i] = self.right_to_left_scalar_mul(i) Q = None for i in range(0, len(d)): if Q is None: Q = None else: Q = Q.point_double() if d[i] != 0: if d[i] > 0: Q = self.window_naf_precom[d[i]].add(Q) else: Q = self.window_naf_precom[-d[i]].inverse().add(Q) return Q
def sliding_window_left_to_right_scalar_mul(self, d): """ :param P: punct de pe o curba eliptica :param d: scalarul :param C: curba eliptica :return: punctul dP """ d = w_NAF(d, self.w) #print(d) Q = None i = 0 #m = 2 * ((2 ** w - (-1)**w) // 3) - 1 #_P = {} #for _i in range(1, m + 1, 2): #_P[_i] = self.left_to_right_scalar_mul(_i) while i < len(d): # print("Iteratie Noua") if d[i] == 0: if Q is None: Q = None else: Q = Q.point_double() i += 1 else: s = max(len(d) - i - self.w + 1, 0) s = len(d) - 1 - s #print("s is " + str(s)) while d[s] == 0: s -= 1 u = NAF(d[i:s + 1]) #print("u is " + str(u)) for j in range(1, i - s + 2): if Q is not None: Q = Q.point_double() else: Q = None if u > 0: Q = self._P[u].add(Q) if u < 0: Q = Q.add(self._P[-u].inverse()) i = 1 + s return Q
def left_to_right_scalar_mul(self, d): """:return dP :param P : punct de pe o curba eliptica :param d : scalar """ signed_d = w_NAF(d, 2) result = None for i in signed_d: if result is None: result = None else: result = result.point_double() if i == 1: result = self.point.add(result) if i == -1: result = self.point.inverse().add(result) return result