private void RemoveInsert(int aLeftRemainingCount, int aRigthRemainingCount, string aStringToInsert) { Debug.Assert(aLeftRemainingCount >= 0); if (mSecureString != null) { while (mSecureString.Length > (aLeftRemainingCount + aRigthRemainingCount)) { mSecureString.RemoveAt(aLeftRemainingCount); } for (int i = 0; i < aStringToInsert.Length; ++i) { mSecureString.InsertAt(aLeftRemainingCount + i, aStringToInsert[i]); } } else { using (var newString = new PinnedArray <char>(aLeftRemainingCount + aRigthRemainingCount + aStringToInsert.Length)) { Array.Copy(mAltSecureString.Data, newString.Data, aLeftRemainingCount); using (var insertString = new PinnedArray <char>(Encoding.Unicode.GetChars( Encoding.Unicode.GetBytes(aStringToInsert)))) { Array.Copy(insertString.Data, 0, newString.Data, aLeftRemainingCount, insertString.Data.Length); Array.Copy(mAltSecureString.Data, mAltSecureString.Data.Length - aRigthRemainingCount, newString.Data, aLeftRemainingCount + insertString.Data.Length, aRigthRemainingCount); } mAltSecureString.Clear(); mAltSecureString = newString.Clone() as PinnedArray <char>; } } }
private void RemoveInsert(int aLeftRemainingCount, int aRigthRemainingCount, string aStringToInsert) { Debug.Assert(aLeftRemainingCount >= 0); if (mSecureString != null) { while (mSecureString.Length > (aLeftRemainingCount + aRigthRemainingCount)) { mSecureString.RemoveAt(aLeftRemainingCount); } for (int i = 0; i < aStringToInsert.Length; ++i) { mSecureString.InsertAt(aLeftRemainingCount + i, aStringToInsert[i]); } } else { using (var newString = new PinnedArray<char>(aLeftRemainingCount + aRigthRemainingCount + aStringToInsert.Length)) { Array.Copy(mAltSecureString.Data, newString.Data, aLeftRemainingCount); using (var insertString = new PinnedArray<char>(Encoding.Unicode.GetChars( Encoding.Unicode.GetBytes(aStringToInsert)))) { Array.Copy(insertString.Data, 0, newString.Data, aLeftRemainingCount, insertString.Data.Length); Array.Copy(mAltSecureString.Data, mAltSecureString.Data.Length - aRigthRemainingCount, newString.Data, aLeftRemainingCount + insertString.Data.Length, aRigthRemainingCount); } mAltSecureString.Clear(); mAltSecureString = newString.Clone() as PinnedArray<char>; } } }
/// <summary> /// removes leading element from array if the value of that element is 0 /// </summary> /// <param name="array"></param> public static void TrimLeadingZero(PinnedArray<byte> array) { if (array != null && array.Data != null && array.Data.Length > 0) { if (array.Data[0] == 0) { PinnedArray<byte> arrayCopy = (PinnedArray<byte>)array.Clone(); array.Data = new byte[array.Data.Length - 1]; Array.Copy(arrayCopy.Data, 1, array.Data, 0, array.Data.Length); arrayCopy.Dispose(); } } }
/// <summary> /// Computes a % (b -1) of 2 large numbers /// </summary> /// <param name="a">variable a</param> /// <param name="b">variable b</param> /// <returns></returns> public static PinnedArray<byte> ModMinusOne(PinnedArray<byte> a, PinnedArray<byte> b) { using (PinnedArray<byte> bMinusOne = (PinnedArray<byte>)b.Clone()) { PinnedArray<byte> result = (PinnedArray<byte>)a.Clone(); // shouldn't have to worry about borrowing because b should be prime and // therefore not end in zero bMinusOne.Data[bMinusOne.Data.Length - 1]--; int bShift = a.Data.Length - b.Data.Length; while (bShift >= 0) { while (CompareBigInt(result.Data, bMinusOne.Data, bShift) >= 0) { result.Data = SubtractBigInt(result.Data, bMinusOne.Data, bShift); TrimLeadingZero(result); } bShift--; } return result; } }