1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- #pragma warning disable
- using System;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Math.EC.Multiplier;
- namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Math.EC.Endo
- {
- public abstract class EndoUtilities
- {
- public static readonly string PRECOMP_NAME = "bc_endo";
- public static BigInteger[] DecomposeScalar(ScalarSplitParameters p, BigInteger k)
- {
- int bits = p.Bits;
- BigInteger b1 = CalculateB(k, p.G1, bits);
- BigInteger b2 = CalculateB(k, p.G2, bits);
- BigInteger a = k.Subtract((b1.Multiply(p.V1A)).Add(b2.Multiply(p.V2A)));
- BigInteger b = (b1.Multiply(p.V1B)).Add(b2.Multiply(p.V2B)).Negate();
- return new BigInteger[]{ a, b };
- }
- public static ECPoint MapPoint(ECEndomorphism endomorphism, ECPoint p)
- {
- EndoPreCompInfo precomp = (EndoPreCompInfo)p.Curve.Precompute(p, PRECOMP_NAME,
- new MapPointCallback(endomorphism, p));
- return precomp.MappedPoint;
- }
- private static BigInteger CalculateB(BigInteger k, BigInteger g, int t)
- {
- bool negative = (g.SignValue < 0);
- BigInteger b = k.Multiply(g.Abs());
- bool extra = b.TestBit(t - 1);
- b = b.ShiftRight(t);
- if (extra)
- {
- b = b.Add(BigInteger.One);
- }
- return negative ? b.Negate() : b;
- }
- private class MapPointCallback
- : IPreCompCallback
- {
- private readonly ECEndomorphism m_endomorphism;
- private readonly ECPoint m_point;
- internal MapPointCallback(ECEndomorphism endomorphism, ECPoint point)
- {
- this.m_endomorphism = endomorphism;
- this.m_point = point;
- }
- public PreCompInfo Precompute(PreCompInfo existing)
- {
- EndoPreCompInfo existingEndo = existing as EndoPreCompInfo;
- if (CheckExisting(existingEndo, m_endomorphism))
- return existingEndo;
- ECPoint mappedPoint = m_endomorphism.PointMap.Map(m_point);
- EndoPreCompInfo result = new EndoPreCompInfo();
- result.Endomorphism = m_endomorphism;
- result.MappedPoint = mappedPoint;
- return result;
- }
- private bool CheckExisting(EndoPreCompInfo existingEndo, ECEndomorphism endomorphism)
- {
- return null != existingEndo
- && existingEndo.Endomorphism == endomorphism
- && existingEndo.MappedPoint != null;
- }
- }
- }
- }
- #pragma warning restore
- #endif
|