Esempio n. 1
0
    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
Esempio n. 2
0
 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
Esempio n. 3
0
    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
Esempio n. 4
0
 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
Esempio n. 5
0
    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
Esempio n. 6
0
    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