public static int[] GenerateCompactWindowNaf(int width, BigInteger k) { if (width == 2) { return(WNafUtilities.GenerateCompactNaf(k)); } if (width < 2 || width > 16) { throw new ArgumentException("must be in the range [2, 16]", "width"); } if (k.BitLength >> 16 != 0) { throw new ArgumentException("must have bitlength < 2^16", "k"); } if (k.SignValue == 0) { return(WNafUtilities.EMPTY_INTS); } int[] array = new int[k.BitLength / width + 1]; int num = 1 << width; int num2 = num - 1; int num3 = num >> 1; bool flag = false; int num4 = 0; int i = 0; while (i <= k.BitLength) { if (k.TestBit(i) == flag) { i++; } else { k = k.ShiftRight(i); int num5 = k.IntValue & num2; if (flag) { num5++; } flag = ((num5 & num3) != 0); if (flag) { num5 -= num; } int num6 = (num4 > 0) ? (i - 1) : i; array[num4++] = (num5 << 16 | num6); i = width; } } if (array.Length > num4) { array = WNafUtilities.Trim(array, num4); } return(array); }
public static byte[] GenerateJsf(BigInteger g, BigInteger h) { int num = Math.Max(g.BitLength, h.BitLength) + 1; byte[] array = new byte[num]; BigInteger bigInteger = g; BigInteger bigInteger2 = h; int num2 = 0; int num3 = 0; int num4 = 0; int num5 = 0; while ((num3 | num4) != 0 || bigInteger.BitLength > num5 || bigInteger2.BitLength > num5) { int num6 = (int)(((uint)bigInteger.IntValue >> num5) + (uint)num3 & 7u); int num7 = (int)(((uint)bigInteger2.IntValue >> num5) + (uint)num4 & 7u); int num8 = num6 & 1; if (num8 != 0) { num8 -= (num6 & 2); if (num6 + num8 == 4 && (num7 & 3) == 2) { num8 = -num8; } } int num9 = num7 & 1; if (num9 != 0) { num9 -= (num7 & 2); if (num7 + num9 == 4 && (num6 & 3) == 2) { num9 = -num9; } } if (num3 << 1 == 1 + num8) { num3 ^= 1; } if (num4 << 1 == 1 + num9) { num4 ^= 1; } if (++num5 == 30) { num5 = 0; bigInteger = bigInteger.ShiftRight(30); bigInteger2 = bigInteger2.ShiftRight(30); } array[num2++] = (byte)(num8 << 4 | (num9 & 15)); } if (array.Length > num2) { array = WNafUtilities.Trim(array, num2); } return(array); }
public static byte[] GenerateWindowNaf(int width, BigInteger k) { if (width == 2) { return(WNafUtilities.GenerateNaf(k)); } if (width < 2 || width > 8) { throw new ArgumentException("must be in the range [2, 8]", "width"); } if (k.SignValue == 0) { return(WNafUtilities.EMPTY_BYTES); } byte[] array = new byte[k.BitLength + 1]; int num = 1 << width; int num2 = num - 1; int num3 = num >> 1; bool flag = false; int num4 = 0; int i = 0; while (i <= k.BitLength) { if (k.TestBit(i) == flag) { i++; } else { k = k.ShiftRight(i); int num5 = k.IntValue & num2; if (flag) { num5++; } flag = ((num5 & num3) != 0); if (flag) { num5 -= num; } num4 += ((num4 > 0) ? (i - 1) : i); array[num4++] = (byte)num5; i = width; } } if (array.Length > num4) { array = WNafUtilities.Trim(array, num4); } return(array); }
public static int[] GenerateCompactNaf(BigInteger k) { if (k.BitLength >> 16 != 0) { throw new ArgumentException("must have bitlength < 2^16", "k"); } if (k.SignValue == 0) { return(WNafUtilities.EMPTY_INTS); } BigInteger bigInteger = k.ShiftLeft(1).Add(k); int bitLength = bigInteger.BitLength; int[] array = new int[bitLength >> 1]; BigInteger bigInteger2 = bigInteger.Xor(k); int num = bitLength - 1; int num2 = 0; int num3 = 0; for (int i = 1; i < num; i++) { if (!bigInteger2.TestBit(i)) { num3++; } else { int num4 = k.TestBit(i) ? -1 : 1; array[num2++] = (num4 << 16 | num3); num3 = 1; i++; } } array[num2++] = (65536 | num3); if (array.Length > num2) { array = WNafUtilities.Trim(array, num2); } return(array); }