Exemplo n.º 1
0
        internal Projective EcMult(BigInt d, Projective s)
        {
            var size = s.x.Length;

            if (d.IsZero() || s.z.IsZero())
            {
                return(new Projective()
                {
                    x = new BigInt(1, size), y = new BigInt(1, size), z = new BigInt(0, size)
                });
            }
            if (d.IsOne())
            {
                return(s.Clone());
            }
            if (!s.z.IsOne())
            {
                var affine = EcAffinify(s);
                s = EcProjectify(affine);
                affine.Clear();
            }
            else
            {
                s = s.Clone();
            }
            var r = s.Clone();
            var h = d.Mul3();

            for (var i = h.BitCount() - 2; i >= 1; i--)
            {
                var rTmp = r;
                r = EcDouble(r);
                rTmp.Clear();

                if (h.BitAt(i) && !d.BitAt(i))
                {
                    var u = EcFullAdd(r, s);
                    r.Clear();
                    r = u;
                }
                else if (!h.BitAt(i) && d.BitAt(i))
                {
                    var u = EcFullSub(r, s);
                    r.Clear();
                    r = u;
                }
            }
            h.Clear();

            return(r);
        }
Exemplo n.º 2
0
        internal Projective EcFullAdd(Projective s, Projective t)
        {
            if (s.z.IsZero())
            {
                return(t.Clone());
            }
            if (t.z.IsZero())
            {
                return(s.Clone());
            }
            Projective r = EcAdd(s, t);

            if (r.x.IsZero() && r.y.IsZero() && r.z.IsZero())
            {
                return(EcDouble(s));
            }
            return(r);
        }