From 5d664bd667e43466d448cc0f38fb15e79114312c Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Mon, 9 Oct 2017 19:30:25 +0200 Subject: [PATCH 01/67] Include NuGet download count --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f58d2e7e..2e0704e9 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ SSH.NET SSH.NET is a Secure Shell (SSH-2) library for .NET, optimized for parallelism. [![Version](https://img.shields.io/nuget/vpre/SSH.NET.svg)](https://www.nuget.org/packages/SSH.NET) +[![NuGet download count](https://img.shields.io/nuget/dt/SSH.NET.svg) [![Build status](https://ci.appveyor.com/api/projects/status/ih77qu6tap3o92gu/branch/develop?svg=true)](https://ci.appveyor.com/api/projects/status/ih77qu6tap3o92gu/branch/develop) ## Introduction From 19167e7c80ef67be01243988a9b2f3d2a1590d9b Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Mon, 9 Oct 2017 19:33:00 +0200 Subject: [PATCH 02/67] Fix links --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e0704e9..0cc04fb9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ SSH.NET SSH.NET is a Secure Shell (SSH-2) library for .NET, optimized for parallelism. [![Version](https://img.shields.io/nuget/vpre/SSH.NET.svg)](https://www.nuget.org/packages/SSH.NET) -[![NuGet download count](https://img.shields.io/nuget/dt/SSH.NET.svg) +[![NuGet download count](https://img.shields.io/nuget/dt/SSH.NET.svg)](https://www.nuget.org/packages/SSH.NET) [![Build status](https://ci.appveyor.com/api/projects/status/ih77qu6tap3o92gu/branch/develop?svg=true)](https://ci.appveyor.com/api/projects/status/ih77qu6tap3o92gu/branch/develop) ## Introduction From f854227c0d283428464b8afb51426906a110dc60 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Thu, 12 Oct 2017 21:59:37 +0200 Subject: [PATCH 03/67] Raise the Closed event as part the Close() method to: * ensure the channel is closed at both ends before we raise this event * ensure we raise the event before the channel is disposed Fixes issue #319. --- ...onnectedAndChannelIsOpen_EofNotReceived.cs | 15 +- ...nelIsOpen_EofNotReceived_SendEofInvoked.cs | 28 +++- ...IsConnectedAndChannelIsOpen_EofReceived.cs | 17 +- ...nExceptionWaitingForChannelCloseMessage.cs | 141 ++++++++++++++++ ...tExceptionWaitingForChannelCloseMessage.cs | 157 ++++++++++++++++++ ...Open_DisposeChannelInClosedEventHandler.cs | 147 ++++++++++++++++ ...onnectedAndChannelIsOpen_EofNotReceived.cs | 15 +- ...IsConnectedAndChannelIsOpen_EofReceived.cs | 15 +- .../Renci.SshNet.Tests.csproj | 3 + src/Renci.SshNet/Channels/Channel.cs | 37 +++-- 10 files changed, 546 insertions(+), 29 deletions(-) create mode 100644 src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_ConnectionExceptionWaitingForChannelCloseMessage.cs create mode 100644 src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_OperationTimeoutExceptionWaitingForChannelCloseMessage.cs create mode 100644 src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_DisposeChannelInClosedEventHandler.cs diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs index d002e20a..d30f7f54 100644 --- a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs @@ -21,7 +21,7 @@ namespace Renci.SshNet.Tests.Classes.Channels private uint _remotePacketSize; private ChannelStub _channel; private Stopwatch _closeTimer; - private ManualResetEvent _channelClosedWaitHandle; + private ManualResetEvent _channelClosedEventHandlerCompleted; private List _channelClosedRegister; private IList _channelExceptionRegister; @@ -43,7 +43,7 @@ namespace Renci.SshNet.Tests.Classes.Channels _remotePacketSize = (uint)random.Next(0, int.MaxValue); _closeTimer = new Stopwatch(); _channelClosedRegister = new List(); - _channelClosedWaitHandle = new ManualResetEvent(false); + _channelClosedEventHandlerCompleted = new ManualResetEvent(false); _channelExceptionRegister = new List(); _sessionMock = new Mock(MockBehavior.Strict); @@ -80,7 +80,8 @@ namespace Renci.SshNet.Tests.Classes.Channels _channel.Closed += (sender, args) => { _channelClosedRegister.Add(args); - _channelClosedWaitHandle.Set(); + Thread.Sleep(50); + _channelClosedEventHandlerCompleted.Set(); }; _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); @@ -129,12 +130,16 @@ namespace Renci.SshNet.Tests.Classes.Channels [TestMethod] public void ClosedEventShouldHaveFiredOnce() { - _channelClosedWaitHandle.WaitOne(100); - Assert.AreEqual(1, _channelClosedRegister.Count); Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber); } + [TestMethod] + public void DisposeShouldBlockUntilClosedEventHandlerHasCompleted() + { + Assert.IsTrue(_channelClosedEventHandlerCompleted.WaitOne(0)); + } + [TestMethod] public void ExceptionShouldNeverHaveFired() { diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs index 37392208..17af2e84 100644 --- a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs @@ -10,6 +10,7 @@ using Renci.SshNet.Messages.Connection; namespace Renci.SshNet.Tests.Classes.Channels { [TestClass] + [Ignore] public class ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked { private Mock _sessionMock; @@ -21,7 +22,7 @@ namespace Renci.SshNet.Tests.Classes.Channels private uint _remotePacketSize; private ChannelStub _channel; private Stopwatch _closeTimer; - private ManualResetEvent _channelClosedWaitHandle; + private ManualResetEvent _channelClosedEventHandlerCompleted; private List _channelClosedRegister; private IList _channelExceptionRegister; @@ -32,6 +33,16 @@ namespace Renci.SshNet.Tests.Classes.Channels Act(); } + [TestCleanup] + public void TearDown() + { + if (_channelClosedEventHandlerCompleted != null) + { + _channelClosedEventHandlerCompleted.Dispose(); + _channelClosedEventHandlerCompleted = null; + } + } + private void Arrange() { var random = new Random(); @@ -42,7 +53,7 @@ namespace Renci.SshNet.Tests.Classes.Channels _remoteWindowSize = (uint)random.Next(0, int.MaxValue); _remotePacketSize = (uint)random.Next(0, int.MaxValue); _closeTimer = new Stopwatch(); - _channelClosedWaitHandle = new ManualResetEvent(false); + _channelClosedEventHandlerCompleted = new ManualResetEvent(false); _channelClosedRegister = new List(); _channelExceptionRegister = new List(); @@ -80,12 +91,13 @@ namespace Renci.SshNet.Tests.Classes.Channels _channel.Closed += (sender, args) => { _channelClosedRegister.Add(args); - _channelClosedWaitHandle.Set(); + Thread.Sleep(50); + _channelClosedEventHandlerCompleted.Set(); }; _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); _channel.SetIsOpen(true); - _channel.SendEof(); + //_channel.SendEof(); } private void Act() @@ -130,12 +142,16 @@ namespace Renci.SshNet.Tests.Classes.Channels [TestMethod] public void ClosedEventShouldHaveFiredOnce() { - _channelClosedWaitHandle.WaitOne(100); - Assert.AreEqual(1, _channelClosedRegister.Count); Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber); } + [TestMethod] + public void DisposeShouldBlockUntilClosedEventHandlerHasCompleted() + { + Assert.IsTrue(_channelClosedEventHandlerCompleted.WaitOne(0)); + } + [TestMethod] public void ExceptionShouldNeverHaveFired() { diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs index 79e1a596..97f6a0ba 100644 --- a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs @@ -23,6 +23,7 @@ namespace Renci.SshNet.Tests.Classes.Channels private List _channelEndOfDataRegister; private IList _channelExceptionRegister; private ManualResetEvent _channelClosedReceived; + private ManualResetEvent _channelClosedEventHandlerCompleted; private Thread _raiseChannelCloseReceivedThread; private void SetupData() @@ -39,6 +40,7 @@ namespace Renci.SshNet.Tests.Classes.Channels _channelEndOfDataRegister = new List(); _channelExceptionRegister = new List(); _channelClosedReceived = new ManualResetEvent(false); + _channelClosedEventHandlerCompleted = new ManualResetEvent(false); _raiseChannelCloseReceivedThread = null; } @@ -106,6 +108,12 @@ namespace Renci.SshNet.Tests.Classes.Channels _raiseChannelCloseReceivedThread.Abort(); } } + + if (_channelClosedEventHandlerCompleted != null) + { + _channelClosedEventHandlerCompleted.Dispose(); + _channelClosedEventHandlerCompleted = null; + } } private void Arrange() @@ -115,7 +123,12 @@ namespace Renci.SshNet.Tests.Classes.Channels SetupMocks(); _channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); - _channel.Closed += (sender, args) => _channelClosedRegister.Add(args); + _channel.Closed += (sender, args) => + { + _channelClosedRegister.Add(args); + Thread.Sleep(50); + _channelClosedEventHandlerCompleted.Set(); + }; _channel.EndOfData += (sender, args) => _channelEndOfDataRegister.Add(args); _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); @@ -173,7 +186,7 @@ namespace Renci.SshNet.Tests.Classes.Channels } [TestMethod] - public void EndOfDataEventShouldHaveFiredOnce() + public void EndOfDataEventShouldNotHaveFired() { Assert.AreEqual(1, _channelEndOfDataRegister.Count); Assert.AreEqual(_localChannelNumber, _channelEndOfDataRegister[0].ChannelNumber); diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_ConnectionExceptionWaitingForChannelCloseMessage.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_ConnectionExceptionWaitingForChannelCloseMessage.cs new file mode 100644 index 00000000..afe1f75a --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_ConnectionExceptionWaitingForChannelCloseMessage.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Renci.SshNet.Common; +using Renci.SshNet.Messages.Connection; + +namespace Renci.SshNet.Tests.Classes.Channels +{ + [TestClass] + public class ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_ConnectionExceptionWaitingForChannelCloseMessage + { + private Mock _sessionMock; + private uint _localChannelNumber; + private uint _localWindowSize; + private uint _localPacketSize; + private uint _remoteChannelNumber; + private uint _remoteWindowSize; + private uint _remotePacketSize; + private ChannelStub _channel; + private List _channelClosedRegister; + private List _channelEndOfDataRegister; + private IList _channelExceptionRegister; + private SshConnectionException _connectionException; + + private void SetupData() + { + var random = new Random(); + + _localChannelNumber = (uint)random.Next(0, int.MaxValue); + _localWindowSize = (uint)random.Next(0, int.MaxValue); + _localPacketSize = (uint)random.Next(0, int.MaxValue); + _remoteChannelNumber = (uint)random.Next(0, int.MaxValue); + _remoteWindowSize = (uint)random.Next(0, int.MaxValue); + _remotePacketSize = (uint)random.Next(0, int.MaxValue); + _channelClosedRegister = new List(); + _channelEndOfDataRegister = new List(); + _channelExceptionRegister = new List(); + _connectionException = new SshConnectionException(); + } + + private void CreateMocks() + { + _sessionMock = new Mock(MockBehavior.Strict); + } + + private void SetupMocks() + { + var sequence = new MockSequence(); + + _sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true); + _sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true); + _sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny())) + .Callback(w => + { + throw _connectionException; + }); + } + + [TestInitialize] + public void Initialize() + { + Arrange(); + Act(); + } + + private void Arrange() + { + SetupData(); + CreateMocks(); + SetupMocks(); + + _channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); + _channel.Closed += (sender, args) => + { + _channelClosedRegister.Add(args); + }; + _channel.EndOfData += (sender, args) => _channelEndOfDataRegister.Add(args); + _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); + _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); + _channel.SetIsOpen(true); + + _sessionMock.Raise( + s => s.ChannelEofReceived += null, + new MessageEventArgs(new ChannelEofMessage(_localChannelNumber))); + } + + private void Act() + { + _channel.Dispose(); + } + + [TestMethod] + public void IsOpenShouldReturnFalse() + { + Assert.IsFalse(_channel.IsOpen); + } + + [TestMethod] + public void TrySendMessageOnSessionShouldBeInvokedOnceForChannelCloseMessage() + { + _sessionMock.Verify( + p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber)), + Times.Once); + } + + [TestMethod] + public void TrySendMessageOnSessionShouldNeverBeInvokedForChannelEofMessage() + { + _sessionMock.Verify( + p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber)), + Times.Never); + } + + [TestMethod] + public void WaitOnHandleOnSessionShouldBeInvokedOnce() + { + _sessionMock.Verify(p => p.WaitOnHandle(It.IsAny()), Times.Once); + } + + [TestMethod] + public void ClosedEventShouldNotHaveFired() + { + Assert.AreEqual(0, _channelClosedRegister.Count); + } + + [TestMethod] + public void EndOfDataEventShouldNotHaveFired() + { + Assert.AreEqual(1, _channelEndOfDataRegister.Count); + Assert.AreEqual(_localChannelNumber, _channelEndOfDataRegister[0].ChannelNumber); + } + + [TestMethod] + public void ExceptionShouldNeverHaveFired() + { + Assert.AreEqual(0, _channelExceptionRegister.Count); + } + } +} diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_OperationTimeoutExceptionWaitingForChannelCloseMessage.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_OperationTimeoutExceptionWaitingForChannelCloseMessage.cs new file mode 100644 index 00000000..116776d5 --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_OperationTimeoutExceptionWaitingForChannelCloseMessage.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Renci.SshNet.Common; +using Renci.SshNet.Messages.Connection; + +namespace Renci.SshNet.Tests.Classes.Channels +{ + [TestClass] + public class ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_OperationTimeoutExceptionWaitingForChannelCloseMessage + { + private Mock _sessionMock; + private uint _localChannelNumber; + private uint _localWindowSize; + private uint _localPacketSize; + private uint _remoteChannelNumber; + private uint _remoteWindowSize; + private uint _remotePacketSize; + private ChannelStub _channel; + private List _channelClosedRegister; + private List _channelEndOfDataRegister; + private IList _channelExceptionRegister; + private SshOperationTimeoutException _operationTimeoutException; + private SshOperationTimeoutException _actualException; + + private void SetupData() + { + var random = new Random(); + + _localChannelNumber = (uint)random.Next(0, int.MaxValue); + _localWindowSize = (uint)random.Next(0, int.MaxValue); + _localPacketSize = (uint)random.Next(0, int.MaxValue); + _remoteChannelNumber = (uint)random.Next(0, int.MaxValue); + _remoteWindowSize = (uint)random.Next(0, int.MaxValue); + _remotePacketSize = (uint)random.Next(0, int.MaxValue); + _channelClosedRegister = new List(); + _channelEndOfDataRegister = new List(); + _channelExceptionRegister = new List(); + _operationTimeoutException = new SshOperationTimeoutException(); + _actualException = null; + } + + private void CreateMocks() + { + _sessionMock = new Mock(MockBehavior.Strict); + } + + private void SetupMocks() + { + var sequence = new MockSequence(); + + _sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true); + _sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true); + _sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny())) + .Callback(w => + { + throw _operationTimeoutException; + }); + } + + [TestInitialize] + public void Initialize() + { + Arrange(); + Act(); + } + + private void Arrange() + { + SetupData(); + CreateMocks(); + SetupMocks(); + + _channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); + _channel.Closed += (sender, args) => + { + _channelClosedRegister.Add(args); + }; + _channel.EndOfData += (sender, args) => _channelEndOfDataRegister.Add(args); + _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); + _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); + _channel.SetIsOpen(true); + + _sessionMock.Raise( + s => s.ChannelEofReceived += null, + new MessageEventArgs(new ChannelEofMessage(_localChannelNumber))); + } + + private void Act() + { + try + { + _channel.Dispose(); + } + catch (SshOperationTimeoutException ex) + { + _actualException = ex; + } + } + + [TestMethod] + public void IsOpenShouldReturnTrue() + { + Assert.IsTrue(_channel.IsOpen); + } + + [TestMethod] + public void TrySendMessageOnSessionShouldBeInvokedOnceForChannelCloseMessage() + { + _sessionMock.Verify( + p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber)), + Times.Once); + } + + [TestMethod] + public void TrySendMessageOnSessionShouldNeverBeInvokedForChannelEofMessage() + { + _sessionMock.Verify( + p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber)), + Times.Never); + } + + [TestMethod] + public void WaitOnHandleOnSessionShouldBeInvokedOnce() + { + _sessionMock.Verify(p => p.WaitOnHandle(It.IsAny()), Times.Once); + } + + [TestMethod] + public void ClosedEventShouldNotHaveFired() + { + Assert.AreEqual(0, _channelClosedRegister.Count); + } + + [TestMethod] + public void EndOfDataEventShouldNotHaveFired() + { + Assert.AreEqual(1, _channelEndOfDataRegister.Count); + Assert.AreEqual(_localChannelNumber, _channelEndOfDataRegister[0].ChannelNumber); + } + + [TestMethod] + public void ExceptionShouldNeverHaveFired() + { + Assert.AreEqual(0, _channelExceptionRegister.Count); + } + + [TestMethod] + public void DisposeShouldHaveThrownOperationTimeoutException() + { + Assert.IsNotNull(_actualException); + Assert.AreSame(_operationTimeoutException, _actualException); + } + } +} diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_DisposeChannelInClosedEventHandler.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_DisposeChannelInClosedEventHandler.cs new file mode 100644 index 00000000..44d745d0 --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_DisposeChannelInClosedEventHandler.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Renci.SshNet.Common; +using Renci.SshNet.Messages.Connection; + +namespace Renci.SshNet.Tests.Classes.Channels +{ + [TestClass] + public class ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_DisposeChannelInClosedEventHandler + { + private Mock _sessionMock; + private uint _localChannelNumber; + private uint _localWindowSize; + private uint _localPacketSize; + private uint _remoteChannelNumber; + private uint _remoteWindowSize; + private uint _remotePacketSize; + private ChannelStub _channel; + private List _channelClosedRegister; + private List _channelEndOfDataRegister; + private IList _channelExceptionRegister; + private ManualResetEvent _channelClosedEventHandlerCompleted; + + private void SetupData() + { + var random = new Random(); + + _localChannelNumber = (uint) random.Next(0, int.MaxValue); + _localWindowSize = (uint) random.Next(0, int.MaxValue); + _localPacketSize = (uint) random.Next(0, int.MaxValue); + _remoteChannelNumber = (uint) random.Next(0, int.MaxValue); + _remoteWindowSize = (uint) random.Next(0, int.MaxValue); + _remotePacketSize = (uint) random.Next(0, int.MaxValue); + _channelClosedRegister = new List(); + _channelEndOfDataRegister = new List(); + _channelExceptionRegister = new List(); + _channelClosedEventHandlerCompleted = new ManualResetEvent(false); + } + + private void CreateMocks() + { + _sessionMock = new Mock(MockBehavior.Strict); + } + + private void SetupMocks() + { + var sequence = new MockSequence(); + + _sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true); + _sessionMock.InSequence(sequence) + .Setup(p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber))) + .Returns(true); + _sessionMock.InSequence(sequence) + .Setup(p => p.WaitOnHandle(It.IsAny())) + .Callback(w => w.WaitOne()); + } + + [TestInitialize] + public void Initialize() + { + Arrange(); + Act(); + } + + private void Arrange() + { + SetupData(); + CreateMocks(); + SetupMocks(); + + _channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); + _channel.Closed += (sender, args) => + { + _channelClosedRegister.Add(args); + _channel.Dispose(); + _channelClosedEventHandlerCompleted.Set(); + }; + _channel.EndOfData += (sender, args) => _channelEndOfDataRegister.Add(args); + _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); + _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); + _channel.SetIsOpen(true); + } + + private void Act() + { + _sessionMock.Raise( + s => s.ChannelCloseReceived += null, + new MessageEventArgs(new ChannelCloseMessage(_localChannelNumber))); + } + + [TestMethod] + public void IsOpenShouldReturnFalse() + { + Assert.IsFalse(_channel.IsOpen); + } + + [TestMethod] + public void TrySendMessageOnSessionShouldBeInvokedOnceForChannelCloseMessage() + { + _sessionMock.Verify( + p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber)), + Times.Once); + } + + [TestMethod] + public void TrySendMessageOnSessionShouldNeverBeInvokedForChannelEofMessage() + { + _sessionMock.Verify( + p => p.TrySendMessage(It.Is(c => c.LocalChannelNumber == _remoteChannelNumber)), + Times.Never); + } + + [TestMethod] + public void WaitOnHandleOnSessionShouldBeInvokedOnce() + { + _sessionMock.Verify(p => p.WaitOnHandle(It.IsAny()), Times.Once); + } + + [TestMethod] + public void ClosedEventShouldHaveFiredOnce() + { + Assert.AreEqual(1, _channelClosedRegister.Count); + Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber); + } + + [TestMethod] + public void EndOfDataEventShouldNeverHaveFired() + { + Assert.AreEqual(0, _channelEndOfDataRegister.Count); + } + + [TestMethod] + public void ExceptionShouldNeverHaveFired() + { + Assert.AreEqual(0, _channelExceptionRegister.Count); + } + + [TestMethod] + public void ChannelCloseReceivedShouldBlockUntilClosedEventHandlerHasCompleted() + { + Assert.IsTrue(_channelClosedEventHandlerCompleted.WaitOne(0)); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs index 6d6bbd6a..9a2a6078 100644 --- a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs @@ -21,6 +21,7 @@ namespace Renci.SshNet.Tests.Classes.Channels private uint _remotePacketSize; private IList _channelClosedRegister; private IList _channelExceptionRegister; + private ManualResetEvent _channelClosedEventHandlerCompleted; private ChannelStub _channel; [TestInitialize] @@ -41,6 +42,7 @@ namespace Renci.SshNet.Tests.Classes.Channels _remotePacketSize = (uint)random.Next(0, int.MaxValue); _channelClosedRegister = new List(); _channelExceptionRegister = new List(); + _channelClosedEventHandlerCompleted = new ManualResetEvent(false); _sessionMock = new Mock(MockBehavior.Strict); @@ -53,7 +55,12 @@ namespace Renci.SshNet.Tests.Classes.Channels .Callback(w => w.WaitOne()); _channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); - _channel.Closed += (sender, args) => _channelClosedRegister.Add(args); + _channel.Closed += (sender, args) => + { + _channelClosedRegister.Add(args); + Thread.Sleep(100); + _channelClosedEventHandlerCompleted.Set(); + }; _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); _channel.SetIsOpen(true); @@ -105,5 +112,11 @@ namespace Renci.SshNet.Tests.Classes.Channels { Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString()); } + + [TestMethod] + public void ChannelCloseReceivedShouldBlockUntilClosedEventHandlerHasCompleted() + { + Assert.IsTrue(_channelClosedEventHandlerCompleted.WaitOne(0)); + } } } diff --git a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofReceived.cs b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofReceived.cs index 589b5665..97be46bd 100644 --- a/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofReceived.cs +++ b/src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofReceived.cs @@ -21,6 +21,7 @@ namespace Renci.SshNet.Tests.Classes.Channels private uint _remotePacketSize; private IList _channelClosedRegister; private IList _channelExceptionRegister; + private ManualResetEvent _channelClosedEventHandlerCompleted; private ChannelStub _channel; [TestInitialize] @@ -41,6 +42,7 @@ namespace Renci.SshNet.Tests.Classes.Channels _remotePacketSize = (uint)random.Next(0, int.MaxValue); _channelClosedRegister = new List(); _channelExceptionRegister = new List(); + _channelClosedEventHandlerCompleted = new ManualResetEvent(false); _sessionMock = new Mock(MockBehavior.Strict); @@ -55,7 +57,12 @@ namespace Renci.SshNet.Tests.Classes.Channels .Callback(w => w.WaitOne()); _channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize); - _channel.Closed += (sender, args) => _channelClosedRegister.Add(args); + _channel.Closed += (sender, args) => + { + _channelClosedRegister.Add(args); + Thread.Sleep(100); + _channelClosedEventHandlerCompleted.Set(); + }; _channel.Exception += (sender, args) => _channelExceptionRegister.Add(args); _channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize); _channel.SetIsOpen(true); @@ -110,5 +117,11 @@ namespace Renci.SshNet.Tests.Classes.Channels { Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString()); } + + [TestMethod] + public void ChannelCloseReceivedShouldBlockUntilClosedEventHandlerHasCompleted() + { + Assert.IsTrue(_channelClosedEventHandlerCompleted.WaitOne(0)); + } } } diff --git a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj index 61df8cdc..9b51190b 100644 --- a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj +++ b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj @@ -111,7 +111,10 @@ + + + diff --git a/src/Renci.SshNet/Channels/Channel.cs b/src/Renci.SshNet/Channels/Channel.cs index a5c449bf..88d2d6c5 100644 --- a/src/Renci.SshNet/Channels/Channel.cs +++ b/src/Renci.SshNet/Channels/Channel.cs @@ -400,21 +400,13 @@ namespace Renci.SshNet.Channels { _closeMessageReceived = true; - // signal that SSH_MSG_CHANNEL_CLOSE message was received from server - // we need to signal this before firing the Closed event, as a subscriber - // may very well react to the Closed event by closing or disposing the - // channel which in turn will wait for this handle to be signaled + // Signal that SSH_MSG_CHANNEL_CLOSE message was received from server. + // We need to signal this before invoking Close() as it may very well + // be blocked waiting for this signal. var channelClosedWaitHandle = _channelClosedWaitHandle; if (channelClosedWaitHandle != null) channelClosedWaitHandle.Set(); - // raise event signaling that the server has closed its end of the channel - var closed = Closed; - if (closed != null) - { - closed(this, new ChannelEventArgs(LocalChannelNumber)); - } - // close the channel Close(); } @@ -554,8 +546,9 @@ namespace Renci.SshNet.Channels { _closeMessageSent = true; - // wait for channel to be closed if we actually sent a close message (either to initiate closing - // the channel, or as response to a SSH_MSG_CHANNEL_CLOSE message sent by the server + // only wait for the channel to be closed by the server if we didn't send a + // SSH_MSG_CHANNEL_CLOSE as response to a SSH_MSG_CHANNEL_CLOSE sent by the + // server try { WaitOnHandle(_channelClosedWaitHandle); @@ -567,7 +560,22 @@ namespace Renci.SshNet.Channels } } - IsOpen = false; + if (IsOpen) + { + // mark sure the channel is marked closed before we raise the Closed event + // this also ensures don't raise the Closed event more than once + IsOpen = false; + + if (_closeMessageReceived) + { + // raise event signaling that both ends of the channel have been closed + var closed = Closed; + if (closed != null) + { + closed(this, new ChannelEventArgs(LocalChannelNumber)); + } + } + } } } @@ -837,6 +845,7 @@ namespace Renci.SshNet.Channels if (_isDisposed) return; + Console.WriteLine("IN DISPOSE"); if (disposing) { Close(); From 93555c95da668300a42989071b3621d4ad48912b Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Thu, 12 Oct 2017 22:05:37 +0200 Subject: [PATCH 04/67] Remove a trailing CWL. --- src/Renci.SshNet/Channels/Channel.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Renci.SshNet/Channels/Channel.cs b/src/Renci.SshNet/Channels/Channel.cs index 88d2d6c5..716d87db 100644 --- a/src/Renci.SshNet/Channels/Channel.cs +++ b/src/Renci.SshNet/Channels/Channel.cs @@ -845,7 +845,6 @@ namespace Renci.SshNet.Channels if (_isDisposed) return; - Console.WriteLine("IN DISPOSE"); if (disposing) { Close(); From 25bb64fde9aa33c138eafc2c130ad4e82bbfe57d Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Mon, 30 Oct 2017 12:20:41 +0100 Subject: [PATCH 05/67] Avoid using Result and Wait() on Task. --- src/Renci.SshNet/Abstractions/DnsAbstraction.cs | 14 ++++++++------ src/Renci.SshNet/Abstractions/ThreadAbstraction.cs | 2 +- src/Renci.SshNet/Shell.cs | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Renci.SshNet/Abstractions/DnsAbstraction.cs b/src/Renci.SshNet/Abstractions/DnsAbstraction.cs index cd9a399b..0af35aee 100644 --- a/src/Renci.SshNet/Abstractions/DnsAbstraction.cs +++ b/src/Renci.SshNet/Abstractions/DnsAbstraction.cs @@ -2,18 +2,20 @@ using System.Net; using System.Net.Sockets; -#if FEATURE_DEVICEINFORMATION_APM +#if FEATURE_DNS_SYNC +#elif FEATURE_DNS_APM +using Renci.SshNet.Common; +#elif FEATURE_DNS_TAP +#elif FEATURE_DEVICEINFORMATION_APM using System.Collections.Generic; using System.Linq; using System.Threading; using Microsoft.Phone.Net.NetworkInformation; -#endif // FEATURE_DEVICEINFORMATION_APM - -#if FEATURE_DATAGRAMSOCKET +#elif FEATURE_DATAGRAMSOCKET using System.Collections.Generic; using Windows.Networking; using Windows.Networking.Sockets; -#endif // FEATURE_DATAGRAMSOCKET +#endif namespace Renci.SshNet.Abstractions { @@ -41,7 +43,7 @@ namespace Renci.SshNet.Abstractions throw new SshOperationTimeoutException("Timeout resolving host name."); return Dns.EndGetHostAddresses(asyncResult); #elif FEATURE_DNS_TAP - return Dns.GetHostAddressesAsync(hostNameOrAddress).Result; + return Dns.GetHostAddressesAsync(hostNameOrAddress).GetAwaiter().GetResult(); #else IPAddress address; if (IPAddress.TryParse(hostNameOrAddress, out address)) diff --git a/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs b/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs index 47175030..ee21ec7e 100644 --- a/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs +++ b/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs @@ -13,7 +13,7 @@ namespace Renci.SshNet.Abstractions #if FEATURE_THREAD_SLEEP System.Threading.Thread.Sleep(millisecondsTimeout); #elif FEATURE_THREAD_TAP - System.Threading.Tasks.Task.Delay(millisecondsTimeout).Wait(); + System.Threading.Tasks.Task.Delay(millisecondsTimeout).GetAwaiter().GetResult(); #else #error Suspend of the current thread is not implemented. #endif diff --git a/src/Renci.SshNet/Shell.cs b/src/Renci.SshNet/Shell.cs index e2e2b558..c508be89 100644 --- a/src/Renci.SshNet/Shell.cs +++ b/src/Renci.SshNet/Shell.cs @@ -135,7 +135,7 @@ namespace Renci.SshNet if (WaitHandle.WaitAny(new[] {readWaitHandle, _channelClosedWaitHandle}) == 0) { - var read = readTask.Result; + var read = readTask.GetAwaiter().GetResult(); _channel.SendData(buffer, 0, read); continue; } From 2c461bbfb2094be253eda4c46c4dd5e1c07d91cc Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Mon, 30 Oct 2017 12:39:24 +0100 Subject: [PATCH 06/67] Use new csproj format introduced in VS 2017. Added support for .NET Standard 2.0. --- build/build.proj | 4 + build/nuget/SSH.NET.nuspec | 50 ++++---- .../Renci.SshNet.NETCore.csproj | 112 +++--------------- 3 files changed, 42 insertions(+), 124 deletions(-) diff --git a/build/build.proj b/build/build.proj index 96708a6c..ee7ab919 100644 --- a/build/build.proj +++ b/build/build.proj @@ -37,6 +37,10 @@ Renci.SshNet.NETCore\bin\$(Configuration)\netstandard1.3 netstandard1.3 + + Renci.SshNet.NETCore\bin\$(Configuration)\netstandard2.0 + netstandard2.0 + Renci.SshNet.WindowsPhone\bin\$(Configuration) wp71 diff --git a/build/nuget/SSH.NET.nuspec b/build/nuget/SSH.NET.nuspec index 039a9e11..a3520842 100644 --- a/build/nuget/SSH.NET.nuspec +++ b/build/nuget/SSH.NET.nuspec @@ -2,7 +2,7 @@ SSH.NET - 2016.1.0-beta4 + 2017.0.0-beta1 SSH.NET Renci olegkap,drieseng @@ -10,7 +10,7 @@ https://github.com/sshnet/SSH.NET/ false SSH.NET is a Secure Shell (SSH) library for .NET, optimized for parallelism and with broad framework support. - https://github.com/sshnet/SSH.NET/releases/tag/2016.1.0-beta4 + https://github.com/sshnet/SSH.NET/releases/tag/2017.0.0-beta1 A Secure Shell (SSH) library for .NET, optimized for parallelism. 2012-2017, RENCI en-US @@ -19,44 +19,34 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + - + - + - + - + - - + + diff --git a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj b/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj index d913f3d2..ba1c5b85 100644 --- a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj +++ b/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj @@ -1,113 +1,37 @@ - + - SSH.NET - netstandard1.3 - true + netstandard1.3;netstandard2.0 + true true + false Renci.SshNet ../Renci.SshNet.snk 5 true - true - false - false - false - false - false - false - false - false - false %(RecursiveDir)%(Filename)%(Extension) - - - 1.6.0 - - - - 4.0.1 - - - [1.2.0] - - - 4.0.11 - - - 4.0.1 - - - 4.0.0 - - - 4.0.11 - - - 4.1.0 - - - 4.0.1 - - - 4.0.1 - - - 4.1.0 - - - 4.0.0 - - - 4.1.0 - - - 4.0.1 - - - 4.1.0 - - - 4.2.0 - - - 4.1.0 - - - 4.0.11 - - - 4.0.0 - - - 4.0.10 - - - 4.0.1 - - - 4.0.1 - - - 4.0.1 - + + + + + + + + + - - - + + - FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_TAP;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 + FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_TAP;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 - - portable - - - none + + FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 \ No newline at end of file From e443594a291f434921dfa5fabdef0e6a8ab6ec04 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Mon, 30 Oct 2017 18:02:56 +0100 Subject: [PATCH 07/67] Prepare for 2017.0.0 beta1. --- src/Renci.SshNet/Properties/CommonAssemblyInfo.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Renci.SshNet/Properties/CommonAssemblyInfo.cs b/src/Renci.SshNet/Properties/CommonAssemblyInfo.cs index 8497d5fb..0425d1fb 100644 --- a/src/Renci.SshNet/Properties/CommonAssemblyInfo.cs +++ b/src/Renci.SshNet/Properties/CommonAssemblyInfo.cs @@ -9,9 +9,9 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -[assembly: AssemblyVersion("2016.1.0")] -[assembly: AssemblyFileVersion("2016.1.0")] -[assembly: AssemblyInformationalVersion("2016.1.0-beta4")] +[assembly: AssemblyVersion("2017.0.0")] +[assembly: AssemblyFileVersion("2017.0.0")] +[assembly: AssemblyInformationalVersion("2017.0.0-beta1")] [assembly: CLSCompliant(false)] // Setting ComVisible to false makes the types in this assembly not visible From 8156b625f7457eb500ec4c3a649f449e70d51bed Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Mon, 30 Oct 2017 18:26:55 +0100 Subject: [PATCH 08/67] Build .NET Standard 2.0 assembly. Remove seperate build script. --- build/build.cmd | 12 ------------ build/build.proj | 34 +++++++++++++++++++--------------- src/Renci.SshNet.VS2012.sln | 1 - src/Renci.SshNet.VS2015.sln | 3 +-- 4 files changed, 20 insertions(+), 30 deletions(-) delete mode 100644 build/build.cmd diff --git a/build/build.cmd b/build/build.cmd deleted file mode 100644 index 146c26fb..00000000 --- a/build/build.cmd +++ /dev/null @@ -1,12 +0,0 @@ -@echo off - -set MSBUILD14_EXE=%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe -set MSBUILD15_EXE=%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\\MSBuild\15.0\bin\MSBuild.exe - -call "%MSBUILD14_EXE%" build.proj /t:Clean -call "%MSBUILD15_EXE%" build.proj /t:Clean - -call "%MSBUILD14_EXE%" build.proj /t:Build -call "%MSBUILD15_EXE%" build.proj /t:Build - -call "%MSBUILD15_EXE%" build.proj /t:Package /p:ReleaseVersion=%1 \ No newline at end of file diff --git a/build/build.proj b/build/build.proj index ee7ab919..065a0070 100644 --- a/build/build.proj +++ b/build/build.proj @@ -1,5 +1,5 @@ - + Release @@ -11,17 +11,18 @@ $(MSBuildThisFileDirectory)..\src\Renci.SshNet.VS2012.sln - 14.0 - true + 14.0 + 14.0 $(MSBuildThisFileDirectory)..\src\Renci.SshNet.VS2015.sln - 14.0 - true + 14.0 + 14.0 $(MSBuildThisFileDirectory)..\src\Renci.SshNet.VS2017.sln - 15.0 + 15.0 + 15.0 @@ -62,15 +63,18 @@ uap10 - + + + + - - Configuration=Release + + Configuration=Release;VisualStudioVersion=%(VisualStudioVersion.VisualStudioVersion) - + @@ -79,17 +83,17 @@ FileName="$(MSBuildThisFileDirectory)target\nuget\nuget.exe"/> - - + + - - Configuration=Release + + Configuration=Release;VisualStudioVersion=%(VisualStudioVersion.VisualStudioVersion) - + diff --git a/src/Renci.SshNet.VS2012.sln b/src/Renci.SshNet.VS2012.sln index 93b4c3e8..394ac252 100644 --- a/src/Renci.SshNet.VS2012.sln +++ b/src/Renci.SshNet.VS2012.sln @@ -19,7 +19,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.WindowsPhone8" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{2D6CAE62-D053-476F-9BDD-2B1F27FA9C5D}" ProjectSection(SolutionItems) = preProject - ..\build\build.cmd = ..\build\build.cmd ..\build\build.proj = ..\build\build.proj EndProjectSection EndProject diff --git a/src/Renci.SshNet.VS2015.sln b/src/Renci.SshNet.VS2015.sln index 8171be89..56a14c91 100644 --- a/src/Renci.SshNet.VS2015.sln +++ b/src/Renci.SshNet.VS2015.sln @@ -1,11 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{2D6CAE62-D053-476F-9BDD-2B1F27FA9C5D}" ProjectSection(SolutionItems) = preProject - ..\build\build.cmd = ..\build\build.cmd ..\build\build.proj = ..\build\build.proj EndProjectSection EndProject From 66dcb0bfcb60338aa8d1a20c2fc5109f85296cb5 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sun, 5 Nov 2017 15:30:51 +0100 Subject: [PATCH 09/67] Ensure keep-alive timer is created when KeepAliveInterval is set after the connection has been established. Fixes issue #334. --- .../Renci.SshNet.Tests.NET35.csproj | 14 +- ...Connected_KeepAliveInterval_NegativeOne.cs | 121 ++++++++++++++++++ ...nected_KeepAliveInterval_NotNegativeOne.cs | 116 +++++++++++++++++ ...Connected_KeepAlivesNotSentConcurrently.cs | 27 +++- ...nected_KeepAliveInterval_NotNegativeOne.cs | 115 +++++++++++++++++ ...nected_KeepAliveInterval_NotNegativeOne.cs | 102 +++++++++++++++ .../Renci.SshNet.Tests.csproj | 4 + src/Renci.SshNet/BaseClient.cs | 37 +++++- src/Renci.SshNet/Session.cs | 2 +- 9 files changed, 523 insertions(+), 15 deletions(-) create mode 100644 src/Renci.SshNet.Tests/Classes/BaseClientTest_Connected_KeepAliveInterval_NegativeOne.cs create mode 100644 src/Renci.SshNet.Tests/Classes/BaseClientTest_Connected_KeepAliveInterval_NotNegativeOne.cs create mode 100644 src/Renci.SshNet.Tests/Classes/BaseClientTest_Disconnected_KeepAliveInterval_NotNegativeOne.cs create mode 100644 src/Renci.SshNet.Tests/Classes/BaseClientTest_NotConnected_KeepAliveInterval_NotNegativeOne.cs diff --git a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj index 33c9b1c2..bb1f0247 100644 --- a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj +++ b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj @@ -78,9 +78,21 @@ Classes\ForwardedPortStatusTest_Stopping.cs + + Classes\BaseClientTest_Connected_KeepAliveInterval_NegativeOne.cs + + + Classes\BaseClientTest_Connected_KeepAliveInterval_NotNegativeOne.cs + Classes\BaseClientTest_Connected_KeepAlivesNotSentConcurrently.cs + + Classes\BaseClientTest_Disconnected_KeepAliveInterval_NotNegativeOne.cs + + + Classes\BaseClientTest_NotConnected_KeepAliveInterval_NotNegativeOne.cs + Classes\Channels\ChannelDirectTcpipTest.cs @@ -1692,7 +1704,7 @@ - + - \ No newline at end of file + diff --git a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj b/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj index ba1c5b85..bf001750 100644 --- a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj +++ b/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj @@ -34,4 +34,4 @@ FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 - \ No newline at end of file + diff --git a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj index 910eb770..e6627600 100644 --- a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj +++ b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj @@ -602,6 +602,222 @@ Security\Algorithm.cs + + Security\Cryptography\BouncyCastle\asn1\sec\SECNamedCurves.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9Curve.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParameters.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParametersHolder.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECPoint.cs + + + Security\Cryptography\BouncyCastle\crypto\agreement\ECDHCBasicAgreement.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricCipherKeyPair.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricKeyParameter.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\GeneralDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\Sha256Digest.cs + + + Security\Cryptography\BouncyCastle\crypto\generators\ECKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IAsymmetricCipherKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\KeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECDomainParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPrivateKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPublicKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\CryptoApiRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\DigestRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\IRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\util\Pack.cs + + + Security\Cryptography\BouncyCastle\math\BigInteger.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\SimpleBigDecimal.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\Tnaf.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\ZTauElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECAlgorithms.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECCurve.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECFieldElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECLookupTable.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPoint.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPointMap.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\ECEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\GlvEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\LongArray.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\AbstractECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointCombMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\GlvMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\IPreCompCallback.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\PreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ValidityPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafL2RMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\field\FiniteFields.cs + + + Security\Cryptography\BouncyCastle\math\field\GenericPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\GF2Polynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\IFiniteField.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\PrimeField.cs + + + Security\Cryptography\BouncyCastle\math\raw\Mod.cs + + + Security\Cryptography\BouncyCastle\math\raw\Nat.cs + + + Security\Cryptography\BouncyCastle\security\DigestUtilities.cs + + + Security\Cryptography\BouncyCastle\security\SecureRandom.cs + + + Security\Cryptography\BouncyCastle\security\SecurityUtilityException.cs + + + Security\Cryptography\BouncyCastle\util\Arrays.cs + + + Security\Cryptography\BouncyCastle\util\BigIntegers.cs + + + Security\Cryptography\BouncyCastle\util\encoders\Hex.cs + + + Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs + + + Security\Cryptography\BouncyCastle\util\Enums.cs + + + Security\Cryptography\BouncyCastle\util\IMemoable.cs + + + Security\Cryptography\BouncyCastle\util\Integers.cs + + + Security\Cryptography\BouncyCastle\util\MemoableResetException.cs + + + Security\Cryptography\BouncyCastle\util\Times.cs + Security\CertificateHostAlgorithm.cs @@ -980,4 +1196,4 @@ --> - \ No newline at end of file + diff --git a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj index d968dd27..0575dbd8 100644 --- a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj +++ b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj @@ -717,4 +717,4 @@ --> - \ No newline at end of file + diff --git a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj index 87316c9d..369c3da7 100644 --- a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj +++ b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj @@ -666,6 +666,222 @@ Security\Algorithm.cs + + Security\Cryptography\BouncyCastle\asn1\sec\SECNamedCurves.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9Curve.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParameters.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParametersHolder.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECPoint.cs + + + Security\Cryptography\BouncyCastle\crypto\agreement\ECDHCBasicAgreement.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricCipherKeyPair.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricKeyParameter.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\GeneralDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\Sha256Digest.cs + + + Security\Cryptography\BouncyCastle\crypto\generators\ECKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IAsymmetricCipherKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\KeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECDomainParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPrivateKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPublicKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\CryptoApiRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\DigestRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\IRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\util\Pack.cs + + + Security\Cryptography\BouncyCastle\math\BigInteger.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\SimpleBigDecimal.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\Tnaf.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\ZTauElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECAlgorithms.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECCurve.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECFieldElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECLookupTable.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPoint.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPointMap.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\ECEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\GlvEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\LongArray.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\AbstractECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointCombMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\GlvMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\IPreCompCallback.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\PreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ValidityPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafL2RMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\field\FiniteFields.cs + + + Security\Cryptography\BouncyCastle\math\field\GenericPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\GF2Polynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\IFiniteField.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\PrimeField.cs + + + Security\Cryptography\BouncyCastle\math\raw\Mod.cs + + + Security\Cryptography\BouncyCastle\math\raw\Nat.cs + + + Security\Cryptography\BouncyCastle\security\DigestUtilities.cs + + + Security\Cryptography\BouncyCastle\security\SecureRandom.cs + + + Security\Cryptography\BouncyCastle\security\SecurityUtilityException.cs + + + Security\Cryptography\BouncyCastle\util\Arrays.cs + + + Security\Cryptography\BouncyCastle\util\BigIntegers.cs + + + Security\Cryptography\BouncyCastle\util\encoders\Hex.cs + + + Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs + + + Security\Cryptography\BouncyCastle\util\Enums.cs + + + Security\Cryptography\BouncyCastle\util\IMemoable.cs + + + Security\Cryptography\BouncyCastle\util\Integers.cs + + + Security\Cryptography\BouncyCastle\util\MemoableResetException.cs + + + Security\Cryptography\BouncyCastle\util\Times.cs + Security\CertificateHostAlgorithm.cs @@ -1034,4 +1250,4 @@ --> - \ No newline at end of file + diff --git a/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj b/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj index f1bd9c40..9300a9b4 100644 --- a/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj +++ b/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj @@ -631,6 +631,222 @@ Security\Algorithm.cs + + Security\Cryptography\BouncyCastle\asn1\sec\SECNamedCurves.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9Curve.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParameters.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParametersHolder.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECPoint.cs + + + Security\Cryptography\BouncyCastle\crypto\agreement\ECDHCBasicAgreement.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricCipherKeyPair.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricKeyParameter.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\GeneralDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\Sha256Digest.cs + + + Security\Cryptography\BouncyCastle\crypto\generators\ECKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IAsymmetricCipherKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\KeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECDomainParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPrivateKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPublicKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\CryptoApiRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\DigestRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\IRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\util\Pack.cs + + + Security\Cryptography\BouncyCastle\math\BigInteger.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\SimpleBigDecimal.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\Tnaf.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\ZTauElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECAlgorithms.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECCurve.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECFieldElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECLookupTable.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPoint.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPointMap.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\ECEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\GlvEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\LongArray.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\AbstractECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointCombMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\GlvMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\IPreCompCallback.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\PreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ValidityPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafL2RMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\field\FiniteFields.cs + + + Security\Cryptography\BouncyCastle\math\field\GenericPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\GF2Polynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\IFiniteField.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\PrimeField.cs + + + Security\Cryptography\BouncyCastle\math\raw\Mod.cs + + + Security\Cryptography\BouncyCastle\math\raw\Nat.cs + + + Security\Cryptography\BouncyCastle\security\DigestUtilities.cs + + + Security\Cryptography\BouncyCastle\security\SecureRandom.cs + + + Security\Cryptography\BouncyCastle\security\SecurityUtilityException.cs + + + Security\Cryptography\BouncyCastle\util\Arrays.cs + + + Security\Cryptography\BouncyCastle\util\BigIntegers.cs + + + Security\Cryptography\BouncyCastle\util\encoders\Hex.cs + + + Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs + + + Security\Cryptography\BouncyCastle\util\Enums.cs + + + Security\Cryptography\BouncyCastle\util\IMemoable.cs + + + Security\Cryptography\BouncyCastle\util\Integers.cs + + + Security\Cryptography\BouncyCastle\util\MemoableResetException.cs + + + Security\Cryptography\BouncyCastle\util\Times.cs + Security\CertificateHostAlgorithm.cs @@ -1007,4 +1223,4 @@ --> - \ No newline at end of file + diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index 0598d18c..2084f956 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -168,6 +168,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Renci.SshNet/Security/BouncyCastle/asn1/sec/SECNamedCurves.cs b/src/Renci.SshNet/Security/BouncyCastle/asn1/sec/SECNamedCurves.cs new file mode 100644 index 00000000..dc9462b3 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/asn1/sec/SECNamedCurves.cs @@ -0,0 +1,121 @@ +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9; +using Renci.SshNet.Security.Org.BouncyCastle.Math; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities.Encoders; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Asn1.Sec +{ + internal sealed class SecNamedCurves + { + /* + * secp256r1 + */ + internal class Secp256r1Holder + : X9ECParametersHolder + { + private Secp256r1Holder() {} + + internal static readonly X9ECParametersHolder Instance = new Secp256r1Holder(); + + protected override X9ECParameters CreateParameters() + { + // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1 + BigInteger p = FromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"); + BigInteger a = FromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"); + BigInteger b = FromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"); + byte[] S = Hex.Decode("C49D360886E704936A6678E1139D26B7819F7E90"); + BigInteger n = FromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"); + BigInteger h = BigInteger.One; + + ECCurve curve = new FpCurve(p, a, b, n, h); + X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04" + + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" + + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5")); + + return new X9ECParameters(curve, G, n, h, S); + } + } + + /* + * secp384r1 + */ + internal class Secp384r1Holder + : X9ECParametersHolder + { + private Secp384r1Holder() {} + + internal static readonly X9ECParametersHolder Instance = new Secp384r1Holder(); + + protected override X9ECParameters CreateParameters() + { + // p = 2^384 - 2^128 - 2^96 + 2^32 - 1 + BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"); + BigInteger a = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC"); + BigInteger b = FromHex("B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF"); + byte[] S = Hex.Decode("A335926AA319A27A1D00896A6773A4827ACDAC73"); + BigInteger n = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"); + BigInteger h = BigInteger.One; + + ECCurve curve = new FpCurve(p, a, b, n, h); + X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04" + + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" + + "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F")); + + return new X9ECParameters(curve, G, n, h, S); + } + } + + /* + * secp521r1 + */ + internal class Secp521r1Holder + : X9ECParametersHolder + { + private Secp521r1Holder() {} + + internal static readonly X9ECParametersHolder Instance = new Secp521r1Holder(); + + protected override X9ECParameters CreateParameters() + { + // p = 2^521 - 1 + BigInteger p = FromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + BigInteger a = FromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC"); + BigInteger b = FromHex("0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"); + byte[] S = Hex.Decode("D09E8800291CB85396CC6717393284AAA0DA64BA"); + BigInteger n = FromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"); + BigInteger h = BigInteger.One; + + ECCurve curve = new FpCurve(p, a, b, n, h); + X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04" + + "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" + + "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650")); + + return new X9ECParameters(curve, G, n, h, S); + } + } + + public static X9ECParameters GetByName( + string name) + { + switch(name) + { + case "P-256": + case "secp256r1": + return Secp256r1Holder.Instance.Parameters; + case "P-384": + case "secp384r1": + return Secp384r1Holder.Instance.Parameters; + case "P-521": + case "secp521r1": + return Secp521r1Holder.Instance.Parameters; + } + + return null; + } + + private static BigInteger FromHex(string hex) + { + return new BigInteger(1, Hex.Decode(hex)); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9Curve.cs b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9Curve.cs new file mode 100644 index 00000000..1faf777a --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9Curve.cs @@ -0,0 +1,40 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9 +{ + internal class X9Curve + { + private readonly ECCurve curve; + private readonly byte[] seed; + + public X9Curve( + ECCurve curve) + : this(curve, null) + { + } + + public X9Curve( + ECCurve curve, + byte[] seed) + { + if (curve == null) + throw new ArgumentNullException("curve"); + + this.curve = curve; + this.seed = Arrays.Clone(seed); + } + + public ECCurve Curve + { + get { return curve; } + } + + public byte[] GetSeed() + { + return Arrays.Clone(seed); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECParameters.cs b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECParameters.cs new file mode 100644 index 00000000..f8234b96 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECParameters.cs @@ -0,0 +1,93 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9 +{ + internal class X9ECParameters + { + private byte[] seed; + + public static X9ECParameters GetInstance(Object obj) + { + if (obj is X9ECParameters) + return (X9ECParameters)obj; + + return null; + } + + public X9ECParameters( + ECCurve curve, + ECPoint g, + BigInteger n) + : this(curve, g, n, null, null) + { + } + + public X9ECParameters( + ECCurve curve, + X9ECPoint g, + BigInteger n, + BigInteger h) + : this(curve, g, n, h, null) + { + } + + public X9ECParameters( + ECCurve curve, + ECPoint g, + BigInteger n, + BigInteger h) + : this(curve, g, n, h, null) + { + } + + public X9ECParameters( + ECCurve curve, + ECPoint g, + BigInteger n, + BigInteger h, + byte[] seed) + : this(curve, new X9ECPoint(g), n, h, seed) + { + } + + public X9ECParameters( + ECCurve curve, + X9ECPoint g, + BigInteger n, + BigInteger h, + byte[] seed) + { + this.Curve = curve; + this.BaseEntry = g; + this.N = n; + this.H = h; + this.seed = seed; + } + + public ECCurve Curve { get; private set; } + + public ECPoint G + { + get { return BaseEntry.Point; } + } + + public BigInteger N { get; private set; } + + public BigInteger H { get; private set; } + + public byte[] GetSeed() + { + return seed; + } + + public X9Curve CurveEntry + { + get { return new X9Curve(Curve, seed); } + } + + public X9ECPoint BaseEntry { get; private set; } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECParametersHolder.cs b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECParametersHolder.cs new file mode 100644 index 00000000..8574cb03 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECParametersHolder.cs @@ -0,0 +1,25 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9 +{ + internal abstract class X9ECParametersHolder + { + private X9ECParameters parameters; + + public X9ECParameters Parameters + { + get + { + lock (this) + { + if (parameters == null) + { + parameters = CreateParameters(); + } + + return parameters; + } + } + } + + protected abstract X9ECParameters CreateParameters(); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECPoint.cs b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECPoint.cs new file mode 100644 index 00000000..f4db7106 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/asn1/x9/X9ECPoint.cs @@ -0,0 +1,57 @@ +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9 +{ + internal class X9ECPoint + { + private readonly byte[] encoding; + + private ECCurve c; + private ECPoint p; + + public X9ECPoint(ECPoint p) + : this(p, false) + { + } + + public X9ECPoint(ECPoint p, bool compressed) + { + this.p = p.Normalize(); + this.encoding = p.GetEncoded(compressed); + } + + public X9ECPoint(ECCurve c, byte[] encoding) + { + this.c = c; + this.encoding = Arrays.Clone(encoding); + } + + public byte[] GetPointEncoding() + { + return Arrays.Clone(encoding); + } + + public ECPoint Point + { + get + { + if (p == null) + { + p = c.DecodePoint(encoding).Normalize(); + } + + return p; + } + } + + public bool IsPointCompressed + { + get + { + byte[] octets = encoding; + return octets != null && octets.Length > 0 && (octets[0] == 2 || octets[0] == 3); + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/AsymmetricCipherKeyPair.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/AsymmetricCipherKeyPair.cs new file mode 100644 index 00000000..e53a66fe --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/AsymmetricCipherKeyPair.cs @@ -0,0 +1,33 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto +{ + internal class AsymmetricCipherKeyPair + { + private readonly AsymmetricKeyParameter publicParameter; + private readonly AsymmetricKeyParameter privateParameter; + + public AsymmetricCipherKeyPair( + AsymmetricKeyParameter publicParameter, + AsymmetricKeyParameter privateParameter) + { + if (publicParameter.IsPrivate) + throw new ArgumentException("Expected a public key", "publicParameter"); + if (!privateParameter.IsPrivate) + throw new ArgumentException("Expected a private key", "privateParameter"); + + this.publicParameter = publicParameter; + this.privateParameter = privateParameter; + } + + public AsymmetricKeyParameter Public + { + get { return publicParameter; } + } + + public AsymmetricKeyParameter Private + { + get { return privateParameter; } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/AsymmetricKeyParameter.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/AsymmetricKeyParameter.cs new file mode 100644 index 00000000..fb66739f --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/AsymmetricKeyParameter.cs @@ -0,0 +1,42 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto +{ + internal abstract class AsymmetricKeyParameter + { + private readonly bool privateKey; + + protected AsymmetricKeyParameter( + bool privateKey) + { + this.privateKey = privateKey; + } + + public bool IsPrivate + { + get { return privateKey; } + } + + public override bool Equals( + object obj) + { + AsymmetricKeyParameter other = obj as AsymmetricKeyParameter; + + if (other == null) + { + return false; + } + + return Equals(other); + } + + protected bool Equals( + AsymmetricKeyParameter other) + { + return privateKey == other.privateKey; + } + + public override int GetHashCode() + { + return privateKey.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/IAsymmetricCipherKeyPairGenerator.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/IAsymmetricCipherKeyPairGenerator.cs new file mode 100644 index 00000000..6c19d1ea --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/IAsymmetricCipherKeyPairGenerator.cs @@ -0,0 +1,9 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto +{ + internal interface IAsymmetricCipherKeyPairGenerator + { + void Init(KeyGenerationParameters parameters); + + AsymmetricCipherKeyPair GenerateKeyPair(); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/IDigest.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/IDigest.cs new file mode 100644 index 00000000..2ff19e3a --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/IDigest.cs @@ -0,0 +1,61 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto +{ + /** + * interface that a message digest conforms to. + */ + internal interface IDigest + { + /** + * return the algorithm name + * + * @return the algorithm name + */ + string AlgorithmName { get; } + + /** + * return the size, in bytes, of the digest produced by this message digest. + * + * @return the size, in bytes, of the digest produced by this message digest. + */ + int GetDigestSize(); + + /** + * return the size, in bytes, of the internal buffer used by this digest. + * + * @return the size, in bytes, of the internal buffer used by this digest. + */ + int GetByteLength(); + + /** + * update the message digest with a single byte. + * + * @param inByte the input byte to be entered. + */ + void Update(byte input); + + /** + * update the message digest with a block of bytes. + * + * @param input the byte array containing the data. + * @param inOff the offset into the byte array where the data starts. + * @param len the length of the data. + */ + void BlockUpdate(byte[] input, int inOff, int length); + + /** + * Close the digest, producing the final digest value. The doFinal + * call leaves the digest reset. + * + * @param output the array the digest is to be copied into. + * @param outOff the offset into the out array the digest is to start at. + */ + int DoFinal(byte[] output, int outOff); + + /** + * reset the digest back to it's initial state. + */ + void Reset(); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/KeyGenerationParameters.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/KeyGenerationParameters.cs new file mode 100644 index 00000000..3be654e4 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/KeyGenerationParameters.cs @@ -0,0 +1,56 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Security; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto +{ + /** + * The base class for parameters to key generators. + */ + internal class KeyGenerationParameters + { + private SecureRandom random; + private int strength; + + /** + * initialise the generator with a source of randomness + * and a strength (in bits). + * + * @param random the random byte source. + * @param strength the size, in bits, of the keys we want to produce. + */ + public KeyGenerationParameters( + SecureRandom random, + int strength) + { + if (random == null) + throw new ArgumentNullException("random"); + if (strength < 1) + throw new ArgumentException("strength must be a positive value", "strength"); + + this.random = random; + this.strength = strength; + } + + /** + * return the random source associated with this + * generator. + * + * @return the generators random source. + */ + public SecureRandom Random + { + get { return random; } + } + + /** + * return the bit strength for keys produced by this generator, + * + * @return the strength of the keys this generator produces (in bits). + */ + public int Strength + { + get { return strength; } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/License.html b/src/Renci.SshNet/Security/BouncyCastle/crypto/License.html new file mode 100644 index 00000000..829aa6ba --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/License.html @@ -0,0 +1,39 @@ + + + + + License + + +

The Bouncy Castle Cryptographic C#® API

+

License:

+The Bouncy Castle License
+Copyright (c) 2000-2018 The Legion of the Bouncy Castle Inc. +(https://www.bouncycastle.org)
+Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sub license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", +WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ + diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/agreement/ECDHCBasicAgreement.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/agreement/ECDHCBasicAgreement.cs new file mode 100644 index 00000000..6814cb17 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/agreement/ECDHCBasicAgreement.cs @@ -0,0 +1,46 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Agreement +{ + internal class ECDHCBasicAgreement + { + private ECPrivateKeyParameters privKey; + + public virtual void Init( + AsymmetricKeyParameter parameters) + { + this.privKey = (ECPrivateKeyParameters)parameters; + } + + public virtual int GetFieldSize() + { + return (privKey.Parameters.Curve.FieldSize + 7) / 8; + } + + public virtual BigInteger CalculateAgreement( + ECPublicKeyParameters pubKey) + { + ECPublicKeyParameters pub = pubKey; + ECDomainParameters dp = privKey.Parameters; + if (!dp.Equals(pub.Parameters)) + throw new InvalidOperationException("ECDHC public key has wrong domain parameters"); + + BigInteger hd = dp.H.Multiply(privKey.D).Mod(dp.N); + + // Always perform calculations on the exact curve specified by our private key's parameters + ECPoint pubPoint = ECAlgorithms.CleanPoint(dp.Curve, pub.Q); + if (pubPoint.IsInfinity) + throw new InvalidOperationException("Infinity is not a valid public key for ECDHC"); + + ECPoint P = pubPoint.Multiply(hd).Normalize(); + if (P.IsInfinity) + throw new InvalidOperationException("Infinity is not a valid agreement value for ECDHC"); + + return P.AffineXCoord.ToBigInteger(); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/digests/GeneralDigest.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/digests/GeneralDigest.cs new file mode 100644 index 00000000..718f34ae --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/digests/GeneralDigest.cs @@ -0,0 +1,129 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Digests +{ + internal abstract class GeneralDigest + : IDigest, IMemoable + { + private const int BYTE_LENGTH = 64; + + private byte[] xBuf; + private int xBufOff; + + private long byteCount; + + internal GeneralDigest() + { + xBuf = new byte[4]; + } + + internal GeneralDigest(GeneralDigest t) + { + xBuf = new byte[t.xBuf.Length]; + CopyIn(t); + } + + protected void CopyIn(GeneralDigest t) + { + Array.Copy(t.xBuf, 0, xBuf, 0, t.xBuf.Length); + + xBufOff = t.xBufOff; + byteCount = t.byteCount; + } + + public void Update(byte input) + { + xBuf[xBufOff++] = input; + + if (xBufOff == xBuf.Length) + { + ProcessWord(xBuf, 0); + xBufOff = 0; + } + + byteCount++; + } + + public void BlockUpdate( + byte[] input, + int inOff, + int length) + { + length = System.Math.Max(0, length); + + // + // fill the current word + // + int i = 0; + if (xBufOff != 0) + { + while (i < length) + { + xBuf[xBufOff++] = input[inOff + i++]; + if (xBufOff == 4) + { + ProcessWord(xBuf, 0); + xBufOff = 0; + break; + } + } + } + + // + // process whole words. + // + int limit = ((length - i) & ~3) + i; + for (; i < limit; i += 4) + { + ProcessWord(input, inOff + i); + } + + // + // load in the remainder. + // + while (i < length) + { + xBuf[xBufOff++] = input[inOff + i++]; + } + + byteCount += length; + } + + public void Finish() + { + long bitLength = (byteCount << 3); + + // + // add the pad bytes. + // + Update((byte)128); + + while (xBufOff != 0) Update((byte)0); + ProcessLength(bitLength); + ProcessBlock(); + } + + public virtual void Reset() + { + byteCount = 0; + xBufOff = 0; + Array.Clear(xBuf, 0, xBuf.Length); + } + + public int GetByteLength() + { + return BYTE_LENGTH; + } + + internal abstract void ProcessWord(byte[] input, int inOff); + internal abstract void ProcessLength(long bitLength); + internal abstract void ProcessBlock(); + public abstract string AlgorithmName { get; } + public abstract int GetDigestSize(); + public abstract int DoFinal(byte[] output, int outOff); + public abstract IMemoable Copy(); + public abstract void Reset(IMemoable t); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/digests/Sha256Digest.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/digests/Sha256Digest.cs new file mode 100644 index 00000000..da700fcf --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/digests/Sha256Digest.cs @@ -0,0 +1,280 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Utilities; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Digests +{ + internal class Sha256Digest + : GeneralDigest + { + private const int DigestLength = 32; + + private uint H1, H2, H3, H4, H5, H6, H7, H8; + private uint[] X = new uint[64]; + private int xOff; + + public Sha256Digest() + { + initHs(); + } + + /** + * Copy constructor. This will copy the state of the provided + * message digest. + */ + public Sha256Digest(Sha256Digest t) : base(t) + { + CopyIn(t); + } + + private void CopyIn(Sha256Digest t) + { + base.CopyIn(t); + + H1 = t.H1; + H2 = t.H2; + H3 = t.H3; + H4 = t.H4; + H5 = t.H5; + H6 = t.H6; + H7 = t.H7; + H8 = t.H8; + + Array.Copy(t.X, 0, X, 0, t.X.Length); + xOff = t.xOff; + } + + public override string AlgorithmName + { + get { return "SHA-256"; } + } + + public override int GetDigestSize() + { + return DigestLength; + } + + internal override void ProcessWord( + byte[] input, + int inOff) + { + X[xOff] = Pack.BE_To_UInt32(input, inOff); + + if (++xOff == 16) + { + ProcessBlock(); + } + } + + internal override void ProcessLength( + long bitLength) + { + if (xOff > 14) + { + ProcessBlock(); + } + + X[14] = (uint)((ulong)bitLength >> 32); + X[15] = (uint)((ulong)bitLength); + } + + public override int DoFinal( + byte[] output, + int outOff) + { + Finish(); + + Pack.UInt32_To_BE((uint)H1, output, outOff); + Pack.UInt32_To_BE((uint)H2, output, outOff + 4); + Pack.UInt32_To_BE((uint)H3, output, outOff + 8); + Pack.UInt32_To_BE((uint)H4, output, outOff + 12); + Pack.UInt32_To_BE((uint)H5, output, outOff + 16); + Pack.UInt32_To_BE((uint)H6, output, outOff + 20); + Pack.UInt32_To_BE((uint)H7, output, outOff + 24); + Pack.UInt32_To_BE((uint)H8, output, outOff + 28); + + Reset(); + + return DigestLength; + } + + public override void Reset() + { + base.Reset(); + + initHs(); + + xOff = 0; + Array.Clear(X, 0, X.Length); + } + + private void initHs() + { + /* SHA-256 initial hash value + * The first 32 bits of the fractional parts of the square roots + * of the first eight prime numbers + */ + H1 = 0x6a09e667; + H2 = 0xbb67ae85; + H3 = 0x3c6ef372; + H4 = 0xa54ff53a; + H5 = 0x510e527f; + H6 = 0x9b05688c; + H7 = 0x1f83d9ab; + H8 = 0x5be0cd19; + } + + internal override void ProcessBlock() + { + // + // expand 16 word block into 64 word blocks. + // + for (int ti = 16; ti <= 63; ti++) + { + X[ti] = Theta1(X[ti - 2]) + X[ti - 7] + Theta0(X[ti - 15]) + X[ti - 16]; + } + + // + // set up working variables. + // + uint a = H1; + uint b = H2; + uint c = H3; + uint d = H4; + uint e = H5; + uint f = H6; + uint g = H7; + uint h = H8; + + int t = 0; + for(int i = 0; i < 8; ++i) + { + // t = 8 * i + h += Sum1Ch(e, f, g) + K[t] + X[t]; + d += h; + h += Sum0Maj(a, b, c); + ++t; + + // t = 8 * i + 1 + g += Sum1Ch(d, e, f) + K[t] + X[t]; + c += g; + g += Sum0Maj(h, a, b); + ++t; + + // t = 8 * i + 2 + f += Sum1Ch(c, d, e) + K[t] + X[t]; + b += f; + f += Sum0Maj(g, h, a); + ++t; + + // t = 8 * i + 3 + e += Sum1Ch(b, c, d) + K[t] + X[t]; + a += e; + e += Sum0Maj(f, g, h); + ++t; + + // t = 8 * i + 4 + d += Sum1Ch(a, b, c) + K[t] + X[t]; + h += d; + d += Sum0Maj(e, f, g); + ++t; + + // t = 8 * i + 5 + c += Sum1Ch(h, a, b) + K[t] + X[t]; + g += c; + c += Sum0Maj(d, e, f); + ++t; + + // t = 8 * i + 6 + b += Sum1Ch(g, h, a) + K[t] + X[t]; + f += b; + b += Sum0Maj(c, d, e); + ++t; + + // t = 8 * i + 7 + a += Sum1Ch(f, g, h) + K[t] + X[t]; + e += a; + a += Sum0Maj(b, c, d); + ++t; + } + + H1 += a; + H2 += b; + H3 += c; + H4 += d; + H5 += e; + H6 += f; + H7 += g; + H8 += h; + + // + // reset the offset and clean out the word buffer. + // + xOff = 0; + Array.Clear(X, 0, 16); + } + + private static uint Sum1Ch( + uint x, + uint y, + uint z) + { + return (((x >> 6) | (x << 26)) ^ ((x >> 11) | (x << 21)) ^ ((x >> 25) | (x << 7))) + + ((x & y) ^ ((~x) & z)); + } + + private static uint Sum0Maj( + uint x, + uint y, + uint z) + { + return (((x >> 2) | (x << 30)) ^ ((x >> 13) | (x << 19)) ^ ((x >> 22) | (x << 10))) + + ((x & y) ^ (x & z) ^ (y & z)); + } + + private static uint Theta0( + uint x) + { + return ((x >> 7) | (x << 25)) ^ ((x >> 18) | (x << 14)) ^ (x >> 3); + } + + private static uint Theta1( + uint x) + { + return ((x >> 17) | (x << 15)) ^ ((x >> 19) | (x << 13)) ^ (x >> 10); + } + + private static readonly uint[] K = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + }; + + public override IMemoable Copy() + { + return new Sha256Digest(this); + } + + public override void Reset(IMemoable other) + { + Sha256Digest d = (Sha256Digest)other; + + CopyIn(d); + } + + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/generators/ECKeyPairGenerator.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/generators/ECKeyPairGenerator.cs new file mode 100644 index 00000000..446c279c --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/generators/ECKeyPairGenerator.cs @@ -0,0 +1,91 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters; +using Renci.SshNet.Security.Org.BouncyCastle.Math; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier; +using Renci.SshNet.Security.Org.BouncyCastle.Security; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Generators +{ + internal class ECKeyPairGenerator + : IAsymmetricCipherKeyPairGenerator + { + private readonly string algorithm; + + private ECDomainParameters parameters; + private SecureRandom random; + + public ECKeyPairGenerator() + : this("EC") + { + } + + public ECKeyPairGenerator( + string algorithm) + { + if (algorithm == null) + throw new ArgumentNullException("algorithm"); + + this.algorithm = ECKeyParameters.VerifyAlgorithmName(algorithm); + } + + public void Init( + KeyGenerationParameters parameters) + { + if (parameters is ECKeyGenerationParameters) + { + ECKeyGenerationParameters ecP = (ECKeyGenerationParameters) parameters; + + this.parameters = ecP.DomainParameters; + } + + this.random = parameters.Random; + + if (this.random == null) + { + this.random = new SecureRandom(); + } + } + + public AsymmetricCipherKeyPair GenerateKeyPair() + { + BigInteger n = parameters.N; + BigInteger d; + int minWeight = n.BitLength >> 2; + + for (;;) + { + d = new BigInteger(n.BitLength, random); + + if (d.CompareTo(BigInteger.Two) < 0 || d.CompareTo(n) >= 0) + continue; + + if (WNafUtilities.GetNafWeight(d) < minWeight) + continue; + + break; + } + + ECPoint q = CreateBasePointMultiplier().Multiply(parameters.G, d); + + return new AsymmetricCipherKeyPair( + new ECPublicKeyParameters(algorithm, q, parameters), + new ECPrivateKeyParameters(algorithm, d, parameters)); + } + + protected virtual ECMultiplier CreateBasePointMultiplier() + { + return new FixedPointCombMultiplier(); + } + + internal static ECPublicKeyParameters GetCorrespondingPublicKey( + ECPrivateKeyParameters privKey) + { + ECDomainParameters ec = privKey.Parameters; + ECPoint q = new FixedPointCombMultiplier().Multiply(ec.G, privKey.D); + + return new ECPublicKeyParameters(privKey.AlgorithmName, q, ec); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECDomainParameters.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECDomainParameters.cs new file mode 100644 index 00000000..1d1b037f --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECDomainParameters.cs @@ -0,0 +1,91 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters +{ + internal class ECDomainParameters + { + internal ECCurve curve; + internal byte[] seed; + internal ECPoint g; + internal BigInteger n; + internal BigInteger h; + internal BigInteger hInv; + + public ECDomainParameters( + ECCurve curve, + ECPoint g, + BigInteger n, + BigInteger h, + byte[] seed) + { + if (curve == null) + throw new ArgumentNullException("curve"); + if (g == null) + throw new ArgumentNullException("g"); + if (n == null) + throw new ArgumentNullException("n"); + // we can't check for h == null here as h is optional in X9.62 as it is not required for ECDSA + + this.curve = curve; + this.g = Validate(curve, g); + this.n = n; + this.h = h; + this.seed = Arrays.Clone(seed); + } + + public ECCurve Curve + { + get { return curve; } + } + + public ECPoint G + { + get { return g; } + } + + public BigInteger N + { + get { return n; } + } + + public BigInteger H + { + get { return h; } + } + + public BigInteger HInv + { + get + { + lock (this) + { + if (hInv == null) + { + hInv = h.ModInverse(n); + } + return hInv; + } + } + } + + internal static ECPoint Validate(ECCurve c, ECPoint q) + { + if (q == null) + throw new ArgumentException("Point has null value", "q"); + + q = ECAlgorithms.ImportPoint(c, q).Normalize(); + + if (q.IsInfinity) + throw new ArgumentException("Point at infinity", "q"); + + if (!q.IsValid()) + throw new ArgumentException("Point not on curve", "q"); + + return q; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECKeyGenerationParameters.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECKeyGenerationParameters.cs new file mode 100644 index 00000000..88e33e3d --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECKeyGenerationParameters.cs @@ -0,0 +1,23 @@ +using Renci.SshNet.Security.Org.BouncyCastle.Security; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters +{ + internal class ECKeyGenerationParameters + : KeyGenerationParameters + { + private readonly ECDomainParameters domainParams; + + public ECKeyGenerationParameters( + ECDomainParameters domainParameters, + SecureRandom random) + : base(random, domainParameters.N.BitLength) + { + this.domainParams = domainParameters; + } + + public ECDomainParameters DomainParameters + { + get { return domainParams; } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECKeyParameters.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECKeyParameters.cs new file mode 100644 index 00000000..50426c54 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECKeyParameters.cs @@ -0,0 +1,79 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Security; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters +{ + internal abstract class ECKeyParameters + : AsymmetricKeyParameter + { + private static readonly string[] algorithms = { "EC", "ECDH" }; + + private readonly string algorithm; + private readonly ECDomainParameters parameters; + + protected ECKeyParameters( + string algorithm, + bool isPrivate, + ECDomainParameters parameters) + : base(isPrivate) + { + if (algorithm == null) + throw new ArgumentNullException("algorithm"); + if (parameters == null) + throw new ArgumentNullException("parameters"); + + this.algorithm = VerifyAlgorithmName(algorithm); + this.parameters = parameters; + } + + public string AlgorithmName + { + get { return algorithm; } + } + + public ECDomainParameters Parameters + { + get { return parameters; } + } + + public override bool Equals( + object obj) + { + if (obj == this) + return true; + + ECDomainParameters other = obj as ECDomainParameters; + + if (other == null) + return false; + + return Equals(other); + } + + protected bool Equals( + ECKeyParameters other) + { + return parameters.Equals(other.parameters) && base.Equals(other); + } + + public override int GetHashCode() + { + return parameters.GetHashCode() ^ base.GetHashCode(); + } + + internal ECKeyGenerationParameters CreateKeyGenerationParameters( + SecureRandom random) + { + return new ECKeyGenerationParameters(parameters, random); + } + + internal static string VerifyAlgorithmName(string algorithm) + { + if (Array.IndexOf(algorithms, algorithm, 0, algorithms.Length) < 0) + throw new ArgumentException("unrecognised algorithm: " + algorithm, "algorithm"); + return algorithm.ToUpper(); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECPrivateKeyParameters.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECPrivateKeyParameters.cs new file mode 100644 index 00000000..a11233c8 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECPrivateKeyParameters.cs @@ -0,0 +1,61 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters +{ + internal class ECPrivateKeyParameters + : ECKeyParameters + { + private readonly BigInteger d; + + public ECPrivateKeyParameters( + BigInteger d, + ECDomainParameters parameters) + : this("EC", d, parameters) + { + } + + public ECPrivateKeyParameters( + string algorithm, + BigInteger d, + ECDomainParameters parameters) + : base(algorithm, true, parameters) + { + if (d == null) + throw new ArgumentNullException("d"); + + this.d = d; + } + + public BigInteger D + { + get { return d; } + } + + public override bool Equals( + object obj) + { + if (obj == this) + return true; + + ECPrivateKeyParameters other = obj as ECPrivateKeyParameters; + + if (other == null) + return false; + + return Equals(other); + } + + protected bool Equals( + ECPrivateKeyParameters other) + { + return d.Equals(other.d) && base.Equals(other); + } + + public override int GetHashCode() + { + return d.GetHashCode() ^ base.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECPublicKeyParameters.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECPublicKeyParameters.cs new file mode 100644 index 00000000..6b1f3ec5 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/parameters/ECPublicKeyParameters.cs @@ -0,0 +1,60 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters +{ + internal class ECPublicKeyParameters + : ECKeyParameters + { + private readonly ECPoint q; + + public ECPublicKeyParameters( + ECPoint q, + ECDomainParameters parameters) + : this("EC", q, parameters) + { + } + + public ECPublicKeyParameters( + string algorithm, + ECPoint q, + ECDomainParameters parameters) + : base(algorithm, false, parameters) + { + if (q == null) + throw new ArgumentNullException("q"); + + this.q = ECDomainParameters.Validate(Parameters.Curve, q); + } + + public ECPoint Q + { + get { return q; } + } + + public override bool Equals(object obj) + { + if (obj == this) + return true; + + ECPublicKeyParameters other = obj as ECPublicKeyParameters; + + if (other == null) + return false; + + return Equals(other); + } + + protected bool Equals( + ECPublicKeyParameters other) + { + return q.Equals(other.q) && base.Equals(other); + } + + public override int GetHashCode() + { + return q.GetHashCode() ^ base.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/CryptoApiRandomGenerator.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/CryptoApiRandomGenerator.cs new file mode 100644 index 00000000..b0c40cb4 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/CryptoApiRandomGenerator.cs @@ -0,0 +1,73 @@ +#if !(NETCF_1_0 || PORTABLE) + +using System; +using System.Security.Cryptography; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Prng +{ + internal class CryptoApiRandomGenerator + : IRandomGenerator + { + private readonly RandomNumberGenerator rndProv; + + public CryptoApiRandomGenerator() +#if FEATURE_RNG_CREATE || FEATURE_RNG_CSP + : this(Abstractions.CryptoAbstraction.CreateRandomNumberGenerator()) +#endif + { + } + + public CryptoApiRandomGenerator(RandomNumberGenerator rng) + { + this.rndProv = rng; + } + + #region IRandomGenerator Members + + public virtual void AddSeedMaterial(byte[] seed) + { + // We don't care about the seed + } + + public virtual void AddSeedMaterial(long seed) + { + // We don't care about the seed + } + + public virtual void NextBytes(byte[] bytes) + { +#if FEATURE_RNG_CREATE || FEATURE_RNG_CSP + rndProv.GetBytes(bytes); +#else + if (bytes == null) + throw new ArgumentNullException("bytes"); + + var buffer = Windows.Security.Cryptography.CryptographicBuffer.GenerateRandom((uint)bytes.Length); + System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.CopyTo(buffer, bytes); +#endif + } + + public virtual void NextBytes(byte[] bytes, int start, int len) + { + if (start < 0) + throw new ArgumentException("Start offset cannot be negative", "start"); + if (bytes.Length < (start + len)) + throw new ArgumentException("Byte array too small for requested offset and length"); + + if (bytes.Length == len && start == 0) + { + NextBytes(bytes); + } + else + { + byte[] tmpBuf = new byte[len]; + NextBytes(tmpBuf); + Array.Copy(tmpBuf, 0, bytes, start, len); + } + } + + #endregion + } +} + +#endif diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/DigestRandomGenerator.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/DigestRandomGenerator.cs new file mode 100644 index 00000000..b0b69b7b --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/DigestRandomGenerator.cs @@ -0,0 +1,117 @@ +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Prng +{ + internal class DigestRandomGenerator + : IRandomGenerator + { + private const long CYCLE_COUNT = 10; + + private long stateCounter; + private long seedCounter; + private IDigest digest; + private byte[] state; + private byte[] seed; + + public DigestRandomGenerator( + IDigest digest) + { + this.digest = digest; + + this.seed = new byte[digest.GetDigestSize()]; + this.seedCounter = 1; + + this.state = new byte[digest.GetDigestSize()]; + this.stateCounter = 1; + } + + public void AddSeedMaterial( + byte[] inSeed) + { + lock (this) + { + DigestUpdate(inSeed); + DigestUpdate(seed); + DigestDoFinal(seed); + } + } + + public void AddSeedMaterial( + long rSeed) + { + lock (this) + { + DigestAddCounter(rSeed); + DigestUpdate(seed); + DigestDoFinal(seed); + } + } + + public void NextBytes( + byte[] bytes) + { + NextBytes(bytes, 0, bytes.Length); + } + + public void NextBytes( + byte[] bytes, + int start, + int len) + { + lock (this) + { + int stateOff = 0; + + GenerateState(); + + int end = start + len; + for (int i = start; i < end; ++i) + { + if (stateOff == state.Length) + { + GenerateState(); + stateOff = 0; + } + bytes[i] = state[stateOff++]; + } + } + } + + private void CycleSeed() + { + DigestUpdate(seed); + DigestAddCounter(seedCounter++); + DigestDoFinal(seed); + } + + private void GenerateState() + { + DigestAddCounter(stateCounter++); + DigestUpdate(state); + DigestUpdate(seed); + DigestDoFinal(state); + + if ((stateCounter % CYCLE_COUNT) == 0) + { + CycleSeed(); + } + } + + private void DigestAddCounter(long seedVal) + { + byte[] bytes = new byte[8]; + Pack.UInt64_To_LE((ulong)seedVal, bytes); + digest.BlockUpdate(bytes, 0, bytes.Length); + } + + private void DigestUpdate(byte[] inSeed) + { + digest.BlockUpdate(inSeed, 0, inSeed.Length); + } + + private void DigestDoFinal(byte[] result) + { + digest.DoFinal(result, 0); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/IRandomGenerator.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/IRandomGenerator.cs new file mode 100644 index 00000000..5bb0c354 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/IRandomGenerator.cs @@ -0,0 +1,26 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Prng +{ + /// Generic interface for objects generating random bytes. + internal interface IRandomGenerator + { + /// Add more seed material to the generator. + /// A byte array to be mixed into the generator's state. + void AddSeedMaterial(byte[] seed); + + /// Add more seed material to the generator. + /// A long value to be mixed into the generator's state. + void AddSeedMaterial(long seed); + + /// Fill byte array with random values. + /// Array to be filled. + void NextBytes(byte[] bytes); + + /// Fill byte array with random values. + /// Array to receive bytes. + /// Index to start filling at. + /// Length of segment to fill. + void NextBytes(byte[] bytes, int start, int len); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/util/Pack.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/util/Pack.cs new file mode 100644 index 00000000..594959eb --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/util/Pack.cs @@ -0,0 +1,345 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Utilities +{ + internal sealed class Pack + { + private Pack() + { + } + + internal static void UInt16_To_BE(ushort n, byte[] bs) + { + bs[0] = (byte)(n >> 8); + bs[1] = (byte)(n); + } + + internal static void UInt16_To_BE(ushort n, byte[] bs, int off) + { + bs[off] = (byte)(n >> 8); + bs[off + 1] = (byte)(n); + } + + internal static ushort BE_To_UInt16(byte[] bs) + { + uint n = (uint)bs[0] << 8 + | (uint)bs[1]; + return (ushort)n; + } + + internal static ushort BE_To_UInt16(byte[] bs, int off) + { + uint n = (uint)bs[off] << 8 + | (uint)bs[off + 1]; + return (ushort)n; + } + + internal static byte[] UInt32_To_BE(uint n) + { + byte[] bs = new byte[4]; + UInt32_To_BE(n, bs, 0); + return bs; + } + + internal static void UInt32_To_BE(uint n, byte[] bs) + { + bs[0] = (byte)(n >> 24); + bs[1] = (byte)(n >> 16); + bs[2] = (byte)(n >> 8); + bs[3] = (byte)(n); + } + + internal static void UInt32_To_BE(uint n, byte[] bs, int off) + { + bs[off] = (byte)(n >> 24); + bs[off + 1] = (byte)(n >> 16); + bs[off + 2] = (byte)(n >> 8); + bs[off + 3] = (byte)(n); + } + + internal static byte[] UInt32_To_BE(uint[] ns) + { + byte[] bs = new byte[4 * ns.Length]; + UInt32_To_BE(ns, bs, 0); + return bs; + } + + internal static void UInt32_To_BE(uint[] ns, byte[] bs, int off) + { + for (int i = 0; i < ns.Length; ++i) + { + UInt32_To_BE(ns[i], bs, off); + off += 4; + } + } + + internal static uint BE_To_UInt32(byte[] bs) + { + return (uint)bs[0] << 24 + | (uint)bs[1] << 16 + | (uint)bs[2] << 8 + | (uint)bs[3]; + } + + internal static uint BE_To_UInt32(byte[] bs, int off) + { + return (uint)bs[off] << 24 + | (uint)bs[off + 1] << 16 + | (uint)bs[off + 2] << 8 + | (uint)bs[off + 3]; + } + + internal static void BE_To_UInt32(byte[] bs, int off, uint[] ns) + { + for (int i = 0; i < ns.Length; ++i) + { + ns[i] = BE_To_UInt32(bs, off); + off += 4; + } + } + + internal static byte[] UInt64_To_BE(ulong n) + { + byte[] bs = new byte[8]; + UInt64_To_BE(n, bs, 0); + return bs; + } + + internal static void UInt64_To_BE(ulong n, byte[] bs) + { + UInt32_To_BE((uint)(n >> 32), bs); + UInt32_To_BE((uint)(n), bs, 4); + } + + internal static void UInt64_To_BE(ulong n, byte[] bs, int off) + { + UInt32_To_BE((uint)(n >> 32), bs, off); + UInt32_To_BE((uint)(n), bs, off + 4); + } + + internal static byte[] UInt64_To_BE(ulong[] ns) + { + byte[] bs = new byte[8 * ns.Length]; + UInt64_To_BE(ns, bs, 0); + return bs; + } + + internal static void UInt64_To_BE(ulong[] ns, byte[] bs, int off) + { + for (int i = 0; i < ns.Length; ++i) + { + UInt64_To_BE(ns[i], bs, off); + off += 8; + } + } + + internal static ulong BE_To_UInt64(byte[] bs) + { + uint hi = BE_To_UInt32(bs); + uint lo = BE_To_UInt32(bs, 4); + return ((ulong)hi << 32) | (ulong)lo; + } + + internal static ulong BE_To_UInt64(byte[] bs, int off) + { + uint hi = BE_To_UInt32(bs, off); + uint lo = BE_To_UInt32(bs, off + 4); + return ((ulong)hi << 32) | (ulong)lo; + } + + internal static void BE_To_UInt64(byte[] bs, int off, ulong[] ns) + { + for (int i = 0; i < ns.Length; ++i) + { + ns[i] = BE_To_UInt64(bs, off); + off += 8; + } + } + + internal static void UInt16_To_LE(ushort n, byte[] bs) + { + bs[0] = (byte)(n); + bs[1] = (byte)(n >> 8); + } + + internal static void UInt16_To_LE(ushort n, byte[] bs, int off) + { + bs[off] = (byte)(n); + bs[off + 1] = (byte)(n >> 8); + } + + internal static ushort LE_To_UInt16(byte[] bs) + { + uint n = (uint)bs[0] + | (uint)bs[1] << 8; + return (ushort)n; + } + + internal static ushort LE_To_UInt16(byte[] bs, int off) + { + uint n = (uint)bs[off] + | (uint)bs[off + 1] << 8; + return (ushort)n; + } + + internal static byte[] UInt32_To_LE(uint n) + { + byte[] bs = new byte[4]; + UInt32_To_LE(n, bs, 0); + return bs; + } + + internal static void UInt32_To_LE(uint n, byte[] bs) + { + bs[0] = (byte)(n); + bs[1] = (byte)(n >> 8); + bs[2] = (byte)(n >> 16); + bs[3] = (byte)(n >> 24); + } + + internal static void UInt32_To_LE(uint n, byte[] bs, int off) + { + bs[off] = (byte)(n); + bs[off + 1] = (byte)(n >> 8); + bs[off + 2] = (byte)(n >> 16); + bs[off + 3] = (byte)(n >> 24); + } + + internal static byte[] UInt32_To_LE(uint[] ns) + { + byte[] bs = new byte[4 * ns.Length]; + UInt32_To_LE(ns, bs, 0); + return bs; + } + + internal static void UInt32_To_LE(uint[] ns, byte[] bs, int off) + { + for (int i = 0; i < ns.Length; ++i) + { + UInt32_To_LE(ns[i], bs, off); + off += 4; + } + } + + internal static uint LE_To_UInt32(byte[] bs) + { + return (uint)bs[0] + | (uint)bs[1] << 8 + | (uint)bs[2] << 16 + | (uint)bs[3] << 24; + } + + internal static uint LE_To_UInt32(byte[] bs, int off) + { + return (uint)bs[off] + | (uint)bs[off + 1] << 8 + | (uint)bs[off + 2] << 16 + | (uint)bs[off + 3] << 24; + } + + internal static void LE_To_UInt32(byte[] bs, int off, uint[] ns) + { + for (int i = 0; i < ns.Length; ++i) + { + ns[i] = LE_To_UInt32(bs, off); + off += 4; + } + } + + internal static void LE_To_UInt32(byte[] bs, int bOff, uint[] ns, int nOff, int count) + { + for (int i = 0; i < count; ++i) + { + ns[nOff + i] = LE_To_UInt32(bs, bOff); + bOff += 4; + } + } + + internal static uint[] LE_To_UInt32(byte[] bs, int off, int count) + { + uint[] ns = new uint[count]; + for (int i = 0; i < ns.Length; ++i) + { + ns[i] = LE_To_UInt32(bs, off); + off += 4; + } + return ns; + } + + internal static byte[] UInt64_To_LE(ulong n) + { + byte[] bs = new byte[8]; + UInt64_To_LE(n, bs, 0); + return bs; + } + + internal static void UInt64_To_LE(ulong n, byte[] bs) + { + UInt32_To_LE((uint)(n), bs); + UInt32_To_LE((uint)(n >> 32), bs, 4); + } + + internal static void UInt64_To_LE(ulong n, byte[] bs, int off) + { + UInt32_To_LE((uint)(n), bs, off); + UInt32_To_LE((uint)(n >> 32), bs, off + 4); + } + + internal static byte[] UInt64_To_LE(ulong[] ns) + { + byte[] bs = new byte[8 * ns.Length]; + UInt64_To_LE(ns, bs, 0); + return bs; + } + + internal static void UInt64_To_LE(ulong[] ns, byte[] bs, int off) + { + for (int i = 0; i < ns.Length; ++i) + { + UInt64_To_LE(ns[i], bs, off); + off += 8; + } + } + + internal static void UInt64_To_LE(ulong[] ns, int nsOff, int nsLen, byte[] bs, int bsOff) + { + for (int i = 0; i < nsLen; ++i) + { + UInt64_To_LE(ns[nsOff + i], bs, bsOff); + bsOff += 8; + } + } + + internal static ulong LE_To_UInt64(byte[] bs) + { + uint lo = LE_To_UInt32(bs); + uint hi = LE_To_UInt32(bs, 4); + return ((ulong)hi << 32) | (ulong)lo; + } + + internal static ulong LE_To_UInt64(byte[] bs, int off) + { + uint lo = LE_To_UInt32(bs, off); + uint hi = LE_To_UInt32(bs, off + 4); + return ((ulong)hi << 32) | (ulong)lo; + } + + internal static void LE_To_UInt64(byte[] bs, int off, ulong[] ns) + { + for (int i = 0; i < ns.Length; ++i) + { + ns[i] = LE_To_UInt64(bs, off); + off += 8; + } + } + + internal static void LE_To_UInt64(byte[] bs, int bsOff, ulong[] ns, int nsOff, int nsLen) + { + for (int i = 0; i < nsLen; ++i) + { + ns[nsOff + i] = LE_To_UInt64(bs, bsOff); + bsOff += 8; + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/BigInteger.cs b/src/Renci.SshNet/Security/BouncyCastle/math/BigInteger.cs new file mode 100644 index 00000000..b618501a --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/BigInteger.cs @@ -0,0 +1,3601 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Text; + +using Renci.SshNet.Security.Org.BouncyCastle.Security; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math +{ +#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE) + [Serializable] +#endif + internal class BigInteger + { + // The first few odd primes + /* + 3 5 7 11 13 17 19 23 29 + 31 37 41 43 47 53 59 61 67 71 + 73 79 83 89 97 101 103 107 109 113 + 127 131 137 139 149 151 157 163 167 173 + 179 181 191 193 197 199 211 223 227 229 + 233 239 241 251 257 263 269 271 277 281 + 283 293 307 311 313 317 331 337 347 349 + 353 359 367 373 379 383 389 397 401 409 + 419 421 431 433 439 443 449 457 461 463 + 467 479 487 491 499 503 509 521 523 541 + 547 557 563 569 571 577 587 593 599 601 + 607 613 617 619 631 641 643 647 653 659 + 661 673 677 683 691 701 709 719 727 733 + 739 743 751 757 761 769 773 787 797 809 + 811 821 823 827 829 839 853 857 859 863 + 877 881 883 887 907 911 919 929 937 941 + 947 953 967 971 977 983 991 997 1009 + 1013 1019 1021 1031 1033 1039 1049 1051 + 1061 1063 1069 1087 1091 1093 1097 1103 + 1109 1117 1123 1129 1151 1153 1163 1171 + 1181 1187 1193 1201 1213 1217 1223 1229 + 1231 1237 1249 1259 1277 1279 1283 1289 + */ + + // Each list has a product < 2^31 + internal static readonly int[][] primeLists = new int[][] + { + new int[]{ 3, 5, 7, 11, 13, 17, 19, 23 }, + new int[]{ 29, 31, 37, 41, 43 }, + new int[]{ 47, 53, 59, 61, 67 }, + new int[]{ 71, 73, 79, 83 }, + new int[]{ 89, 97, 101, 103 }, + + new int[]{ 107, 109, 113, 127 }, + new int[]{ 131, 137, 139, 149 }, + new int[]{ 151, 157, 163, 167 }, + new int[]{ 173, 179, 181, 191 }, + new int[]{ 193, 197, 199, 211 }, + + new int[]{ 223, 227, 229 }, + new int[]{ 233, 239, 241 }, + new int[]{ 251, 257, 263 }, + new int[]{ 269, 271, 277 }, + new int[]{ 281, 283, 293 }, + + new int[]{ 307, 311, 313 }, + new int[]{ 317, 331, 337 }, + new int[]{ 347, 349, 353 }, + new int[]{ 359, 367, 373 }, + new int[]{ 379, 383, 389 }, + + new int[]{ 397, 401, 409 }, + new int[]{ 419, 421, 431 }, + new int[]{ 433, 439, 443 }, + new int[]{ 449, 457, 461 }, + new int[]{ 463, 467, 479 }, + + new int[]{ 487, 491, 499 }, + new int[]{ 503, 509, 521 }, + new int[]{ 523, 541, 547 }, + new int[]{ 557, 563, 569 }, + new int[]{ 571, 577, 587 }, + + new int[]{ 593, 599, 601 }, + new int[]{ 607, 613, 617 }, + new int[]{ 619, 631, 641 }, + new int[]{ 643, 647, 653 }, + new int[]{ 659, 661, 673 }, + + new int[]{ 677, 683, 691 }, + new int[]{ 701, 709, 719 }, + new int[]{ 727, 733, 739 }, + new int[]{ 743, 751, 757 }, + new int[]{ 761, 769, 773 }, + + new int[]{ 787, 797, 809 }, + new int[]{ 811, 821, 823 }, + new int[]{ 827, 829, 839 }, + new int[]{ 853, 857, 859 }, + new int[]{ 863, 877, 881 }, + + new int[]{ 883, 887, 907 }, + new int[]{ 911, 919, 929 }, + new int[]{ 937, 941, 947 }, + new int[]{ 953, 967, 971 }, + new int[]{ 977, 983, 991 }, + + new int[]{ 997, 1009, 1013 }, + new int[]{ 1019, 1021, 1031 }, + new int[]{ 1033, 1039, 1049 }, + new int[]{ 1051, 1061, 1063 }, + new int[]{ 1069, 1087, 1091 }, + + new int[]{ 1093, 1097, 1103 }, + new int[]{ 1109, 1117, 1123 }, + new int[]{ 1129, 1151, 1153 }, + new int[]{ 1163, 1171, 1181 }, + new int[]{ 1187, 1193, 1201 }, + + new int[]{ 1213, 1217, 1223 }, + new int[]{ 1229, 1231, 1237 }, + new int[]{ 1249, 1259, 1277 }, + new int[]{ 1279, 1283, 1289 }, + }; + + internal static readonly int[] primeProducts; + + private const long IMASK = 0xFFFFFFFFL; + private const ulong UIMASK = 0xFFFFFFFFUL; + + private static readonly int[] ZeroMagnitude = new int[0]; + private static readonly byte[] ZeroEncoding = new byte[0]; + + private static readonly BigInteger[] SMALL_CONSTANTS = new BigInteger[17]; + public static readonly BigInteger Zero; + public static readonly BigInteger One; + public static readonly BigInteger Two; + public static readonly BigInteger Three; + public static readonly BigInteger Ten; + + //private readonly static byte[] BitCountTable = + //{ + // 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + // 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + //}; + + private readonly static byte[] BitLengthTable = + { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + }; + + // TODO Parse radix-2 64 bits at a time and radix-8 63 bits at a time + private const int chunk2 = 1, chunk8 = 1, chunk10 = 19, chunk16 = 16; + private static readonly BigInteger radix2, radix2E, radix8, radix8E, radix10, radix10E, radix16, radix16E; + + private static readonly SecureRandom RandomSource = new SecureRandom(); + + /* + * These are the threshold bit-lengths (of an exponent) where we increase the window size. + * They are calculated according to the expected savings in multiplications. + * Some squares will also be saved on average, but we offset these against the extra storage costs. + */ + private static readonly int[] ExpWindowThresholds = { 7, 25, 81, 241, 673, 1793, 4609, Int32.MaxValue }; + + private const int BitsPerByte = 8; + private const int BitsPerInt = 32; + private const int BytesPerInt = 4; + + static BigInteger() + { + Zero = new BigInteger(0, ZeroMagnitude, false); + Zero.nBits = 0; Zero.nBitLength = 0; + + SMALL_CONSTANTS[0] = Zero; + for (uint i = 1; i < SMALL_CONSTANTS.Length; ++i) + { + SMALL_CONSTANTS[i] = CreateUValueOf(i); + } + + One = SMALL_CONSTANTS[1]; + Two = SMALL_CONSTANTS[2]; + Three = SMALL_CONSTANTS[3]; + Ten = SMALL_CONSTANTS[10]; + + radix2 = ValueOf(2); + radix2E = radix2.Pow(chunk2); + + radix8 = ValueOf(8); + radix8E = radix8.Pow(chunk8); + + radix10 = ValueOf(10); + radix10E = radix10.Pow(chunk10); + + radix16 = ValueOf(16); + radix16E = radix16.Pow(chunk16); + + primeProducts = new int[primeLists.Length]; + + for (int i = 0; i < primeLists.Length; ++i) + { + int[] primeList = primeLists[i]; + int product = primeList[0]; + for (int j = 1; j < primeList.Length; ++j) + { + product *= primeList[j]; + } + primeProducts[i] = product; + } + } + + private int[] magnitude; // array of ints with [0] being the most significant + private int sign; // -1 means -ve; +1 means +ve; 0 means 0; + private int nBits = -1; // cache BitCount() value + private int nBitLength = -1; // cache BitLength() value + private int mQuote = 0; // -m^(-1) mod b, b = 2^32 (see Montgomery mult.), 0 when uninitialised + + private static int GetByteLength( + int nBits) + { + return (nBits + BitsPerByte - 1) / BitsPerByte; + } + + internal static BigInteger Arbitrary(int sizeInBits) + { + return new BigInteger(sizeInBits, RandomSource); + } + + private BigInteger( + int signum, + int[] mag, + bool checkMag) + { + if (checkMag) + { + int i = 0; + while (i < mag.Length && mag[i] == 0) + { + ++i; + } + + if (i == mag.Length) + { + this.sign = 0; + this.magnitude = ZeroMagnitude; + } + else + { + this.sign = signum; + + if (i == 0) + { + this.magnitude = mag; + } + else + { + // strip leading 0 words + this.magnitude = new int[mag.Length - i]; + Array.Copy(mag, i, this.magnitude, 0, this.magnitude.Length); + } + } + } + else + { + this.sign = signum; + this.magnitude = mag; + } + } + + public BigInteger( + string value) + : this(value, 10) + { + } + + public BigInteger( + string str, + int radix) + { + if (str.Length == 0) + throw new FormatException("Zero length BigInteger"); + + NumberStyles style; + int chunk; + BigInteger r; + BigInteger rE; + + switch (radix) + { + case 2: + // Is there anyway to restrict to binary digits? + style = NumberStyles.Integer; + chunk = chunk2; + r = radix2; + rE = radix2E; + break; + case 8: + // Is there anyway to restrict to octal digits? + style = NumberStyles.Integer; + chunk = chunk8; + r = radix8; + rE = radix8E; + break; + case 10: + // This style seems to handle spaces and minus sign already (our processing redundant?) + style = NumberStyles.Integer; + chunk = chunk10; + r = radix10; + rE = radix10E; + break; + case 16: + // TODO Should this be HexNumber? + style = NumberStyles.AllowHexSpecifier; + chunk = chunk16; + r = radix16; + rE = radix16E; + break; + default: + throw new FormatException("Only bases 2, 8, 10, or 16 allowed"); + } + + + int index = 0; + sign = 1; + + if (str[0] == '-') + { + if (str.Length == 1) + throw new FormatException("Zero length BigInteger"); + + sign = -1; + index = 1; + } + + // strip leading zeros from the string str + while (index < str.Length && Int32.Parse(str[index].ToString(), style) == 0) + { + index++; + } + + if (index >= str.Length) + { + // zero value - we're done + sign = 0; + magnitude = ZeroMagnitude; + return; + } + + ////// + // could we work out the max number of ints required to store + // str.Length digits in the given base, then allocate that + // storage in one hit?, then Generate the magnitude in one hit too? + ////// + + BigInteger b = Zero; + + + int next = index + chunk; + + if (next <= str.Length) + { + do + { + string s = str.Substring(index, chunk); + ulong i = ulong.Parse(s, style); + BigInteger bi = CreateUValueOf(i); + + switch (radix) + { + case 2: + // TODO Need this because we are parsing in radix 10 above + if (i >= 2) + throw new FormatException("Bad character in radix 2 string: " + s); + + // TODO Parse 64 bits at a time + b = b.ShiftLeft(1); + break; + case 8: + // TODO Need this because we are parsing in radix 10 above + if (i >= 8) + throw new FormatException("Bad character in radix 8 string: " + s); + + // TODO Parse 63 bits at a time + b = b.ShiftLeft(3); + break; + case 16: + b = b.ShiftLeft(64); + break; + default: + b = b.Multiply(rE); + break; + } + + b = b.Add(bi); + + index = next; + next += chunk; + } + while (next <= str.Length); + } + + if (index < str.Length) + { + string s = str.Substring(index); + ulong i = ulong.Parse(s, style); + BigInteger bi = CreateUValueOf(i); + + if (b.sign > 0) + { + if (radix == 2) + { + // NB: Can't reach here since we are parsing one char at a time + Debug.Assert(false); + + // TODO Parse all bits at once +// b = b.ShiftLeft(s.Length); + } + else if (radix == 8) + { + // NB: Can't reach here since we are parsing one char at a time + Debug.Assert(false); + + // TODO Parse all bits at once +// b = b.ShiftLeft(s.Length * 3); + } + else if (radix == 16) + { + b = b.ShiftLeft(s.Length << 2); + } + else + { + b = b.Multiply(r.Pow(s.Length)); + } + + b = b.Add(bi); + } + else + { + b = bi; + } + } + + // Note: This is the previous (slower) algorithm +// while (index < value.Length) +// { +// char c = value[index]; +// string s = c.ToString(); +// int i = Int32.Parse(s, style); +// +// b = b.Multiply(r).Add(ValueOf(i)); +// index++; +// } + + magnitude = b.magnitude; + } + + public BigInteger( + byte[] bytes) + : this(bytes, 0, bytes.Length) + { + } + + public BigInteger( + byte[] bytes, + int offset, + int length) + { + if (length == 0) + throw new FormatException("Zero length BigInteger"); + + // TODO Move this processing into MakeMagnitude (provide sign argument) + if ((sbyte)bytes[offset] < 0) + { + this.sign = -1; + + int end = offset + length; + + int iBval; + // strip leading sign bytes + for (iBval = offset; iBval < end && ((sbyte)bytes[iBval] == -1); iBval++) + { + } + + if (iBval >= end) + { + this.magnitude = One.magnitude; + } + else + { + int numBytes = end - iBval; + byte[] inverse = new byte[numBytes]; + + int index = 0; + while (index < numBytes) + { + inverse[index++] = (byte)~bytes[iBval++]; + } + + Debug.Assert(iBval == end); + + while (inverse[--index] == byte.MaxValue) + { + inverse[index] = byte.MinValue; + } + + inverse[index]++; + + this.magnitude = MakeMagnitude(inverse, 0, inverse.Length); + } + } + else + { + // strip leading zero bytes and return magnitude bytes + this.magnitude = MakeMagnitude(bytes, offset, length); + this.sign = this.magnitude.Length > 0 ? 1 : 0; + } + } + + private static int[] MakeMagnitude( + byte[] bytes, + int offset, + int length) + { + int end = offset + length; + + // strip leading zeros + int firstSignificant; + for (firstSignificant = offset; firstSignificant < end + && bytes[firstSignificant] == 0; firstSignificant++) + { + } + + if (firstSignificant >= end) + { + return ZeroMagnitude; + } + + int nInts = (end - firstSignificant + 3) / BytesPerInt; + int bCount = (end - firstSignificant) % BytesPerInt; + if (bCount == 0) + { + bCount = BytesPerInt; + } + + if (nInts < 1) + { + return ZeroMagnitude; + } + + int[] mag = new int[nInts]; + + int v = 0; + int magnitudeIndex = 0; + for (int i = firstSignificant; i < end; ++i) + { + v <<= 8; + v |= bytes[i] & 0xff; + bCount--; + if (bCount <= 0) + { + mag[magnitudeIndex] = v; + magnitudeIndex++; + bCount = BytesPerInt; + v = 0; + } + } + + if (magnitudeIndex < mag.Length) + { + mag[magnitudeIndex] = v; + } + + return mag; + } + + public BigInteger( + int sign, + byte[] bytes) + : this(sign, bytes, 0, bytes.Length) + { + } + + public BigInteger( + int sign, + byte[] bytes, + int offset, + int length) + { + if (sign < -1 || sign > 1) + throw new FormatException("Invalid sign value"); + + if (sign == 0) + { + this.sign = 0; + this.magnitude = ZeroMagnitude; + } + else + { + // copy bytes + this.magnitude = MakeMagnitude(bytes, offset, length); + this.sign = this.magnitude.Length < 1 ? 0 : sign; + } + } + + public BigInteger( + int sizeInBits, + Random random) + { + if (sizeInBits < 0) + throw new ArgumentException("sizeInBits must be non-negative"); + + this.nBits = -1; + this.nBitLength = -1; + + if (sizeInBits == 0) + { + this.sign = 0; + this.magnitude = ZeroMagnitude; + return; + } + + int nBytes = GetByteLength(sizeInBits); + byte[] b = new byte[nBytes]; + random.NextBytes(b); + + // strip off any excess bits in the MSB + int xBits = BitsPerByte * nBytes - sizeInBits; + b[0] &= (byte)(255U >> xBits); + + this.magnitude = MakeMagnitude(b, 0, b.Length); + this.sign = this.magnitude.Length < 1 ? 0 : 1; + } + + public BigInteger( + int bitLength, + int certainty, + Random random) + { + if (bitLength < 2) + throw new ArithmeticException("bitLength < 2"); + + this.sign = 1; + this.nBitLength = bitLength; + + if (bitLength == 2) + { + this.magnitude = random.Next(2) == 0 + ? Two.magnitude + : Three.magnitude; + return; + } + + int nBytes = GetByteLength(bitLength); + byte[] b = new byte[nBytes]; + + int xBits = BitsPerByte * nBytes - bitLength; + byte mask = (byte)(255U >> xBits); + byte lead = (byte)(1 << (7 - xBits)); + + for (;;) + { + random.NextBytes(b); + + // strip off any excess bits in the MSB + b[0] &= mask; + + // ensure the leading bit is 1 (to meet the strength requirement) + b[0] |= lead; + + // ensure the trailing bit is 1 (i.e. must be odd) + b[nBytes - 1] |= 1; + + this.magnitude = MakeMagnitude(b, 0, b.Length); + this.nBits = -1; + this.mQuote = 0; + + if (certainty < 1) + break; + + if (CheckProbablePrime(certainty, random, true)) + break; + + for (int j = 1; j < (magnitude.Length - 1); ++j) + { + this.magnitude[j] ^= random.Next(); + + if (CheckProbablePrime(certainty, random, true)) + return; + } + } + } + + public BigInteger Abs() + { + return sign >= 0 ? this : Negate(); + } + + /** + * return a = a + b - b preserved. + */ + private static int[] AddMagnitudes( + int[] a, + int[] b) + { + int tI = a.Length - 1; + int vI = b.Length - 1; + long m = 0; + + while (vI >= 0) + { + m += ((long)(uint)a[tI] + (long)(uint)b[vI--]); + a[tI--] = (int)m; + m = (long)((ulong)m >> 32); + } + + if (m != 0) + { + while (tI >= 0 && ++a[tI--] == 0) + { + } + } + + return a; + } + + public BigInteger Add( + BigInteger value) + { + if (this.sign == 0) + return value; + + if (this.sign != value.sign) + { + if (value.sign == 0) + return this; + + if (value.sign < 0) + return Subtract(value.Negate()); + + return value.Subtract(Negate()); + } + + return AddToMagnitude(value.magnitude); + } + + private BigInteger AddToMagnitude( + int[] magToAdd) + { + int[] big, small; + if (this.magnitude.Length < magToAdd.Length) + { + big = magToAdd; + small = this.magnitude; + } + else + { + big = this.magnitude; + small = magToAdd; + } + + // Conservatively avoid over-allocation when no overflow possible + uint limit = uint.MaxValue; + if (big.Length == small.Length) + limit -= (uint) small[0]; + + bool possibleOverflow = (uint) big[0] >= limit; + + int[] bigCopy; + if (possibleOverflow) + { + bigCopy = new int[big.Length + 1]; + big.CopyTo(bigCopy, 1); + } + else + { + bigCopy = (int[]) big.Clone(); + } + + bigCopy = AddMagnitudes(bigCopy, small); + + return new BigInteger(this.sign, bigCopy, possibleOverflow); + } + + public BigInteger And( + BigInteger value) + { + if (this.sign == 0 || value.sign == 0) + { + return Zero; + } + + int[] aMag = this.sign > 0 + ? this.magnitude + : Add(One).magnitude; + + int[] bMag = value.sign > 0 + ? value.magnitude + : value.Add(One).magnitude; + + bool resultNeg = sign < 0 && value.sign < 0; + int resultLength = System.Math.Max(aMag.Length, bMag.Length); + int[] resultMag = new int[resultLength]; + + int aStart = resultMag.Length - aMag.Length; + int bStart = resultMag.Length - bMag.Length; + + for (int i = 0; i < resultMag.Length; ++i) + { + int aWord = i >= aStart ? aMag[i - aStart] : 0; + int bWord = i >= bStart ? bMag[i - bStart] : 0; + + if (this.sign < 0) + { + aWord = ~aWord; + } + + if (value.sign < 0) + { + bWord = ~bWord; + } + + resultMag[i] = aWord & bWord; + + if (resultNeg) + { + resultMag[i] = ~resultMag[i]; + } + } + + BigInteger result = new BigInteger(1, resultMag, true); + + // TODO Optimise this case + if (resultNeg) + { + result = result.Not(); + } + + return result; + } + + public BigInteger AndNot( + BigInteger val) + { + return And(val.Not()); + } + + public int BitCount + { + get + { + if (nBits == -1) + { + if (sign < 0) + { + // TODO Optimise this case + nBits = Not().BitCount; + } + else + { + int sum = 0; + for (int i = 0; i < magnitude.Length; ++i) + { + sum += BitCnt(magnitude[i]); + } + nBits = sum; + } + } + + return nBits; + } + } + + public static int BitCnt(int i) + { + uint u = (uint)i; + u = u - ((u >> 1) & 0x55555555); + u = (u & 0x33333333) + ((u >> 2) & 0x33333333); + u = (u + (u >> 4)) & 0x0f0f0f0f; + u += (u >> 8); + u += (u >> 16); + u &= 0x3f; + return (int)u; + } + + private static int CalcBitLength(int sign, int indx, int[] mag) + { + for (;;) + { + if (indx >= mag.Length) + return 0; + + if (mag[indx] != 0) + break; + + ++indx; + } + + // bit length for everything after the first int + int bitLength = 32 * ((mag.Length - indx) - 1); + + // and determine bitlength of first int + int firstMag = mag[indx]; + bitLength += BitLen(firstMag); + + // Check for negative powers of two + if (sign < 0 && ((firstMag & -firstMag) == firstMag)) + { + do + { + if (++indx >= mag.Length) + { + --bitLength; + break; + } + } + while (mag[indx] == 0); + } + + return bitLength; + } + + public int BitLength + { + get + { + if (nBitLength == -1) + { + nBitLength = sign == 0 + ? 0 + : CalcBitLength(sign, 0, magnitude); + } + + return nBitLength; + } + } + + // + // BitLen(value) is the number of bits in value. + // + internal static int BitLen(int w) + { + uint v = (uint)w; + uint t = v >> 24; + if (t != 0) + return 24 + BitLengthTable[t]; + t = v >> 16; + if (t != 0) + return 16 + BitLengthTable[t]; + t = v >> 8; + if (t != 0) + return 8 + BitLengthTable[t]; + return BitLengthTable[v]; + } + + private bool QuickPow2Check() + { + return sign > 0 && nBits == 1; + } + + public int CompareTo( + object obj) + { + return CompareTo((BigInteger)obj); + } + + /** + * unsigned comparison on two arrays - note the arrays may + * start with leading zeros. + */ + private static int CompareTo( + int xIndx, + int[] x, + int yIndx, + int[] y) + { + while (xIndx != x.Length && x[xIndx] == 0) + { + xIndx++; + } + + while (yIndx != y.Length && y[yIndx] == 0) + { + yIndx++; + } + + return CompareNoLeadingZeroes(xIndx, x, yIndx, y); + } + + private static int CompareNoLeadingZeroes( + int xIndx, + int[] x, + int yIndx, + int[] y) + { + int diff = (x.Length - y.Length) - (xIndx - yIndx); + + if (diff != 0) + { + return diff < 0 ? -1 : 1; + } + + // lengths of magnitudes the same, test the magnitude values + + while (xIndx < x.Length) + { + uint v1 = (uint)x[xIndx++]; + uint v2 = (uint)y[yIndx++]; + + if (v1 != v2) + return v1 < v2 ? -1 : 1; + } + + return 0; + } + + public int CompareTo( + BigInteger value) + { + return sign < value.sign ? -1 + : sign > value.sign ? 1 + : sign == 0 ? 0 + : sign * CompareNoLeadingZeroes(0, magnitude, 0, value.magnitude); + } + + /** + * return z = x / y - done in place (z value preserved, x contains the + * remainder) + */ + private int[] Divide( + int[] x, + int[] y) + { + int xStart = 0; + while (xStart < x.Length && x[xStart] == 0) + { + ++xStart; + } + + int yStart = 0; + while (yStart < y.Length && y[yStart] == 0) + { + ++yStart; + } + + Debug.Assert(yStart < y.Length); + + int xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y); + int[] count; + + if (xyCmp > 0) + { + int yBitLength = CalcBitLength(1, yStart, y); + int xBitLength = CalcBitLength(1, xStart, x); + int shift = xBitLength - yBitLength; + + int[] iCount; + int iCountStart = 0; + + int[] c; + int cStart = 0; + int cBitLength = yBitLength; + if (shift > 0) + { +// iCount = ShiftLeft(One.magnitude, shift); + iCount = new int[(shift >> 5) + 1]; + iCount[0] = 1 << (shift % 32); + + c = ShiftLeft(y, shift); + cBitLength += shift; + } + else + { + iCount = new int[] { 1 }; + + int len = y.Length - yStart; + c = new int[len]; + Array.Copy(y, yStart, c, 0, len); + } + + count = new int[iCount.Length]; + + for (;;) + { + if (cBitLength < xBitLength + || CompareNoLeadingZeroes(xStart, x, cStart, c) >= 0) + { + Subtract(xStart, x, cStart, c); + AddMagnitudes(count, iCount); + + while (x[xStart] == 0) + { + if (++xStart == x.Length) + return count; + } + + //xBitLength = CalcBitLength(xStart, x); + xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]); + + if (xBitLength <= yBitLength) + { + if (xBitLength < yBitLength) + return count; + + xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y); + + if (xyCmp <= 0) + break; + } + } + + shift = cBitLength - xBitLength; + + // NB: The case where c[cStart] is 1-bit is harmless + if (shift == 1) + { + uint firstC = (uint) c[cStart] >> 1; + uint firstX = (uint) x[xStart]; + if (firstC > firstX) + ++shift; + } + + if (shift < 2) + { + ShiftRightOneInPlace(cStart, c); + --cBitLength; + ShiftRightOneInPlace(iCountStart, iCount); + } + else + { + ShiftRightInPlace(cStart, c, shift); + cBitLength -= shift; + ShiftRightInPlace(iCountStart, iCount, shift); + } + + //cStart = c.Length - ((cBitLength + 31) / 32); + while (c[cStart] == 0) + { + ++cStart; + } + + while (iCount[iCountStart] == 0) + { + ++iCountStart; + } + } + } + else + { + count = new int[1]; + } + + if (xyCmp == 0) + { + AddMagnitudes(count, One.magnitude); + Array.Clear(x, xStart, x.Length - xStart); + } + + return count; + } + + public BigInteger Divide( + BigInteger val) + { + if (val.sign == 0) + throw new ArithmeticException("Division by zero error"); + + if (sign == 0) + return Zero; + + if (val.QuickPow2Check()) // val is power of two + { + BigInteger result = this.Abs().ShiftRight(val.Abs().BitLength - 1); + return val.sign == this.sign ? result : result.Negate(); + } + + int[] mag = (int[]) this.magnitude.Clone(); + + return new BigInteger(this.sign * val.sign, Divide(mag, val.magnitude), true); + } + + public BigInteger[] DivideAndRemainder( + BigInteger val) + { + if (val.sign == 0) + throw new ArithmeticException("Division by zero error"); + + BigInteger[] biggies = new BigInteger[2]; + + if (sign == 0) + { + biggies[0] = Zero; + biggies[1] = Zero; + } + else if (val.QuickPow2Check()) // val is power of two + { + int e = val.Abs().BitLength - 1; + BigInteger quotient = this.Abs().ShiftRight(e); + int[] remainder = this.LastNBits(e); + + biggies[0] = val.sign == this.sign ? quotient : quotient.Negate(); + biggies[1] = new BigInteger(this.sign, remainder, true); + } + else + { + int[] remainder = (int[]) this.magnitude.Clone(); + int[] quotient = Divide(remainder, val.magnitude); + + biggies[0] = new BigInteger(this.sign * val.sign, quotient, true); + biggies[1] = new BigInteger(this.sign, remainder, true); + } + + return biggies; + } + + public override bool Equals( + object obj) + { + if (obj == this) + return true; + + BigInteger biggie = obj as BigInteger; + if (biggie == null) + return false; + + return sign == biggie.sign && IsEqualMagnitude(biggie); + } + + private bool IsEqualMagnitude(BigInteger x) + { + int[] xMag = x.magnitude; + if (magnitude.Length != x.magnitude.Length) + return false; + for (int i = 0; i < magnitude.Length; i++) + { + if (magnitude[i] != x.magnitude[i]) + return false; + } + return true; + } + + public BigInteger Gcd( + BigInteger value) + { + if (value.sign == 0) + return Abs(); + + if (sign == 0) + return value.Abs(); + + BigInteger r; + BigInteger u = this; + BigInteger v = value; + + while (v.sign != 0) + { + r = u.Mod(v); + u = v; + v = r; + } + + return u; + } + + public override int GetHashCode() + { + int hc = magnitude.Length; + if (magnitude.Length > 0) + { + hc ^= magnitude[0]; + + if (magnitude.Length > 1) + { + hc ^= magnitude[magnitude.Length - 1]; + } + } + + return sign < 0 ? ~hc : hc; + } + + // TODO Make public? + private BigInteger Inc() + { + if (this.sign == 0) + return One; + + if (this.sign < 0) + return new BigInteger(-1, doSubBigLil(this.magnitude, One.magnitude), true); + + return AddToMagnitude(One.magnitude); + } + + public int IntValue + { + get + { + if (sign == 0) + return 0; + + int n = magnitude.Length; + + int v = magnitude[n - 1]; + + return sign < 0 ? -v : v; + } + } + + /** + * return whether or not a BigInteger is probably prime with a + * probability of 1 - (1/2)**certainty. + *

From Knuth Vol 2, pg 395.

+ */ + public bool IsProbablePrime(int certainty) + { + return IsProbablePrime(certainty, false); + } + + internal bool IsProbablePrime(int certainty, bool randomlySelected) + { + if (certainty <= 0) + return true; + + BigInteger n = Abs(); + + if (!n.TestBit(0)) + return n.Equals(Two); + + if (n.Equals(One)) + return false; + + return n.CheckProbablePrime(certainty, RandomSource, randomlySelected); + } + + private bool CheckProbablePrime(int certainty, Random random, bool randomlySelected) + { + Debug.Assert(certainty > 0); + Debug.Assert(CompareTo(Two) > 0); + Debug.Assert(TestBit(0)); + + + // Try to reduce the penalty for really small numbers + int numLists = System.Math.Min(BitLength - 1, primeLists.Length); + + for (int i = 0; i < numLists; ++i) + { + int test = Remainder(primeProducts[i]); + + int[] primeList = primeLists[i]; + for (int j = 0; j < primeList.Length; ++j) + { + int prime = primeList[j]; + int qRem = test % prime; + if (qRem == 0) + { + // We may find small numbers in the list + return BitLength < 16 && IntValue == prime; + } + } + } + + + // TODO Special case for < 10^16 (RabinMiller fixed list) +// if (BitLength < 30) +// { +// RabinMiller against 2, 3, 5, 7, 11, 13, 23 is sufficient +// } + + + // TODO Is it worth trying to create a hybrid of these two? + return RabinMillerTest(certainty, random, randomlySelected); +// return SolovayStrassenTest(certainty, random); + +// bool rbTest = RabinMillerTest(certainty, random); +// bool ssTest = SolovayStrassenTest(certainty, random); +// +// Debug.Assert(rbTest == ssTest); +// +// return rbTest; + } + + public bool RabinMillerTest(int certainty, Random random) + { + return RabinMillerTest(certainty, random, false); + } + + internal bool RabinMillerTest(int certainty, Random random, bool randomlySelected) + { + int bits = BitLength; + + Debug.Assert(certainty > 0); + Debug.Assert(bits > 2); + Debug.Assert(TestBit(0)); + + int iterations = ((certainty - 1) / 2) + 1; + if (randomlySelected) + { + int itersFor100Cert = bits >= 1024 ? 4 + : bits >= 512 ? 8 + : bits >= 256 ? 16 + : 50; + + if (certainty < 100) + { + iterations = System.Math.Min(itersFor100Cert, iterations); + } + else + { + iterations -= 50; + iterations += itersFor100Cert; + } + } + + // let n = 1 + d . 2^s + BigInteger n = this; + int s = n.GetLowestSetBitMaskFirst(-1 << 1); + Debug.Assert(s >= 1); + BigInteger r = n.ShiftRight(s); + + // NOTE: Avoid conversion to/from Montgomery form and check for R/-R as result instead + + BigInteger montRadix = One.ShiftLeft(32 * n.magnitude.Length).Remainder(n); + BigInteger minusMontRadix = n.Subtract(montRadix); + + do + { + BigInteger a; + do + { + a = new BigInteger(n.BitLength, random); + } + while (a.sign == 0 || a.CompareTo(n) >= 0 + || a.IsEqualMagnitude(montRadix) || a.IsEqualMagnitude(minusMontRadix)); + + BigInteger y = ModPowMonty(a, r, n, false); + + if (!y.Equals(montRadix)) + { + int j = 0; + while (!y.Equals(minusMontRadix)) + { + if (++j == s) + return false; + + y = ModPowMonty(y, Two, n, false); + + if (y.Equals(montRadix)) + return false; + } + } + } + while (--iterations > 0); + + return true; + } + +// private bool SolovayStrassenTest( +// int certainty, +// Random random) +// { +// Debug.Assert(certainty > 0); +// Debug.Assert(CompareTo(Two) > 0); +// Debug.Assert(TestBit(0)); +// +// BigInteger n = this; +// BigInteger nMinusOne = n.Subtract(One); +// BigInteger e = nMinusOne.ShiftRight(1); +// +// do +// { +// BigInteger a; +// do +// { +// a = new BigInteger(nBitLength, random); +// } +// // NB: Spec says 0 < x < n, but 1 is trivial +// while (a.CompareTo(One) <= 0 || a.CompareTo(n) >= 0); +// +// +// // TODO Check this is redundant given the way Jacobi() works? +//// if (!a.Gcd(n).Equals(One)) +//// return false; +// +// int x = Jacobi(a, n); +// +// if (x == 0) +// return false; +// +// BigInteger check = a.ModPow(e, n); +// +// if (x == 1 && !check.Equals(One)) +// return false; +// +// if (x == -1 && !check.Equals(nMinusOne)) +// return false; +// +// --certainty; +// } +// while (certainty > 0); +// +// return true; +// } +// +// private static int Jacobi( +// BigInteger a, +// BigInteger b) +// { +// Debug.Assert(a.sign >= 0); +// Debug.Assert(b.sign > 0); +// Debug.Assert(b.TestBit(0)); +// Debug.Assert(a.CompareTo(b) < 0); +// +// int totalS = 1; +// for (;;) +// { +// if (a.sign == 0) +// return 0; +// +// if (a.Equals(One)) +// break; +// +// int e = a.GetLowestSetBit(); +// +// int bLsw = b.magnitude[b.magnitude.Length - 1]; +// if ((e & 1) != 0 && ((bLsw & 7) == 3 || (bLsw & 7) == 5)) +// totalS = -totalS; +// +// // TODO Confirm this is faster than later a1.Equals(One) test +// if (a.BitLength == e + 1) +// break; +// BigInteger a1 = a.ShiftRight(e); +//// if (a1.Equals(One)) +//// break; +// +// int a1Lsw = a1.magnitude[a1.magnitude.Length - 1]; +// if ((bLsw & 3) == 3 && (a1Lsw & 3) == 3) +// totalS = -totalS; +// +//// a = b.Mod(a1); +// a = b.Remainder(a1); +// b = a1; +// } +// return totalS; +// } + + public long LongValue + { + get + { + if (sign == 0) + return 0; + + int n = magnitude.Length; + + long v = magnitude[n - 1] & IMASK; + if (n > 1) + { + v |= (magnitude[n - 2] & IMASK) << 32; + } + + return sign < 0 ? -v : v; + } + } + + public BigInteger Max( + BigInteger value) + { + return CompareTo(value) > 0 ? this : value; + } + + public BigInteger Min( + BigInteger value) + { + return CompareTo(value) < 0 ? this : value; + } + + public BigInteger Mod( + BigInteger m) + { + if (m.sign < 1) + throw new ArithmeticException("Modulus must be positive"); + + BigInteger biggie = Remainder(m); + + return (biggie.sign >= 0 ? biggie : biggie.Add(m)); + } + + public BigInteger ModInverse( + BigInteger m) + { + if (m.sign < 1) + throw new ArithmeticException("Modulus must be positive"); + + // TODO Too slow at the moment +// // "Fast Key Exchange with Elliptic Curve Systems" R.Schoeppel +// if (m.TestBit(0)) +// { +// //The Almost Inverse Algorithm +// int k = 0; +// BigInteger B = One, C = Zero, F = this, G = m, tmp; +// +// for (;;) +// { +// // While F is even, do F=F/u, C=C*u, k=k+1. +// int zeroes = F.GetLowestSetBit(); +// if (zeroes > 0) +// { +// F = F.ShiftRight(zeroes); +// C = C.ShiftLeft(zeroes); +// k += zeroes; +// } +// +// // If F = 1, then return B,k. +// if (F.Equals(One)) +// { +// BigInteger half = m.Add(One).ShiftRight(1); +// BigInteger halfK = half.ModPow(BigInteger.ValueOf(k), m); +// return B.Multiply(halfK).Mod(m); +// } +// +// if (F.CompareTo(G) < 0) +// { +// tmp = G; G = F; F = tmp; +// tmp = B; B = C; C = tmp; +// } +// +// F = F.Add(G); +// B = B.Add(C); +// } +// } + + if (m.QuickPow2Check()) + { + return ModInversePow2(m); + } + + BigInteger d = this.Remainder(m); + BigInteger x; + BigInteger gcd = ExtEuclid(d, m, out x); + + if (!gcd.Equals(One)) + throw new ArithmeticException("Numbers not relatively prime."); + + if (x.sign < 0) + { + x = x.Add(m); + } + + return x; + } + + private BigInteger ModInversePow2(BigInteger m) + { + Debug.Assert(m.SignValue > 0); + Debug.Assert(m.BitCount == 1); + + if (!TestBit(0)) + { + throw new ArithmeticException("Numbers not relatively prime."); + } + + int pow = m.BitLength - 1; + + long inv64 = ModInverse64(LongValue); + if (pow < 64) + { + inv64 &= ((1L << pow) - 1); + } + + BigInteger x = BigInteger.ValueOf(inv64); + + if (pow > 64) + { + BigInteger d = this.Remainder(m); + int bitsCorrect = 64; + + do + { + BigInteger t = x.Multiply(d).Remainder(m); + x = x.Multiply(Two.Subtract(t)).Remainder(m); + bitsCorrect <<= 1; + } + while (bitsCorrect < pow); + } + + if (x.sign < 0) + { + x = x.Add(m); + } + + return x; + } + + private static int ModInverse32(int d) + { + // Newton's method with initial estimate "correct to 4 bits" + Debug.Assert((d & 1) != 0); + int x = d + (((d + 1) & 4) << 1); // d.x == 1 mod 2**4 + Debug.Assert(((d * x) & 15) == 1); + x *= 2 - d * x; // d.x == 1 mod 2**8 + x *= 2 - d * x; // d.x == 1 mod 2**16 + x *= 2 - d * x; // d.x == 1 mod 2**32 + Debug.Assert(d * x == 1); + return x; + } + + private static long ModInverse64(long d) + { + // Newton's method with initial estimate "correct to 4 bits" + Debug.Assert((d & 1L) != 0); + long x = d + (((d + 1L) & 4L) << 1); // d.x == 1 mod 2**4 + Debug.Assert(((d * x) & 15L) == 1L); + x *= 2 - d * x; // d.x == 1 mod 2**8 + x *= 2 - d * x; // d.x == 1 mod 2**16 + x *= 2 - d * x; // d.x == 1 mod 2**32 + x *= 2 - d * x; // d.x == 1 mod 2**64 + Debug.Assert(d * x == 1L); + return x; + } + + /** + * Calculate the numbers u1, u2, and u3 such that: + * + * u1 * a + u2 * b = u3 + * + * where u3 is the greatest common divider of a and b. + * a and b using the extended Euclid algorithm (refer p. 323 + * of The Art of Computer Programming vol 2, 2nd ed). + * This also seems to have the side effect of calculating + * some form of multiplicative inverse. + * + * @param a First number to calculate gcd for + * @param b Second number to calculate gcd for + * @param u1Out the return object for the u1 value + * @return The greatest common divisor of a and b + */ + private static BigInteger ExtEuclid(BigInteger a, BigInteger b, out BigInteger u1Out) + { + BigInteger u1 = One, v1 = Zero; + BigInteger u3 = a, v3 = b; + + if (v3.sign > 0) + { + for (;;) + { + BigInteger[] q = u3.DivideAndRemainder(v3); + u3 = v3; + v3 = q[1]; + + BigInteger oldU1 = u1; + u1 = v1; + + if (v3.sign <= 0) + break; + + v1 = oldU1.Subtract(v1.Multiply(q[0])); + } + } + + u1Out = u1; + + return u3; + } + + private static void ZeroOut( + int[] x) + { + Array.Clear(x, 0, x.Length); + } + + public BigInteger ModPow(BigInteger e, BigInteger m) + { + if (m.sign < 1) + throw new ArithmeticException("Modulus must be positive"); + + if (m.Equals(One)) + return Zero; + + if (e.sign == 0) + return One; + + if (sign == 0) + return Zero; + + bool negExp = e.sign < 0; + if (negExp) + e = e.Negate(); + + BigInteger result = this.Mod(m); + if (!e.Equals(One)) + { + if ((m.magnitude[m.magnitude.Length - 1] & 1) == 0) + { + result = ModPowBarrett(result, e, m); + } + else + { + result = ModPowMonty(result, e, m, true); + } + } + + if (negExp) + result = result.ModInverse(m); + + return result; + } + + private static BigInteger ModPowBarrett(BigInteger b, BigInteger e, BigInteger m) + { + int k = m.magnitude.Length; + BigInteger mr = One.ShiftLeft((k + 1) << 5); + BigInteger yu = One.ShiftLeft(k << 6).Divide(m); + + // Sliding window from MSW to LSW + int extraBits = 0, expLength = e.BitLength; + while (expLength > ExpWindowThresholds[extraBits]) + { + ++extraBits; + } + + int numPowers = 1 << extraBits; + BigInteger[] oddPowers = new BigInteger[numPowers]; + oddPowers[0] = b; + + BigInteger b2 = ReduceBarrett(b.Square(), m, mr, yu); + + for (int i = 1; i < numPowers; ++i) + { + oddPowers[i] = ReduceBarrett(oddPowers[i - 1].Multiply(b2), m, mr, yu); + } + + int[] windowList = GetWindowList(e.magnitude, extraBits); + Debug.Assert(windowList.Length > 0); + + int window = windowList[0]; + int mult = window & 0xFF, lastZeroes = window >> 8; + + BigInteger y; + if (mult == 1) + { + y = b2; + --lastZeroes; + } + else + { + y = oddPowers[mult >> 1]; + } + + int windowPos = 1; + while ((window = windowList[windowPos++]) != -1) + { + mult = window & 0xFF; + + int bits = lastZeroes + BitLengthTable[mult]; + for (int j = 0; j < bits; ++j) + { + y = ReduceBarrett(y.Square(), m, mr, yu); + } + + y = ReduceBarrett(y.Multiply(oddPowers[mult >> 1]), m, mr, yu); + + lastZeroes = window >> 8; + } + + for (int i = 0; i < lastZeroes; ++i) + { + y = ReduceBarrett(y.Square(), m, mr, yu); + } + + return y; + } + + private static BigInteger ReduceBarrett(BigInteger x, BigInteger m, BigInteger mr, BigInteger yu) + { + int xLen = x.BitLength, mLen = m.BitLength; + if (xLen < mLen) + return x; + + if (xLen - mLen > 1) + { + int k = m.magnitude.Length; + + BigInteger q1 = x.DivideWords(k - 1); + BigInteger q2 = q1.Multiply(yu); // TODO Only need partial multiplication here + BigInteger q3 = q2.DivideWords(k + 1); + + BigInteger r1 = x.RemainderWords(k + 1); + BigInteger r2 = q3.Multiply(m); // TODO Only need partial multiplication here + BigInteger r3 = r2.RemainderWords(k + 1); + + x = r1.Subtract(r3); + if (x.sign < 0) + { + x = x.Add(mr); + } + } + + while (x.CompareTo(m) >= 0) + { + x = x.Subtract(m); + } + + return x; + } + + private static BigInteger ModPowMonty(BigInteger b, BigInteger e, BigInteger m, bool convert) + { + int n = m.magnitude.Length; + int powR = 32 * n; + bool smallMontyModulus = m.BitLength + 2 <= powR; + uint mDash = (uint)m.GetMQuote(); + + // tmp = this * R mod m + if (convert) + { + b = b.ShiftLeft(powR).Remainder(m); + } + + int[] yAccum = new int[n + 1]; + + int[] zVal = b.magnitude; + Debug.Assert(zVal.Length <= n); + if (zVal.Length < n) + { + int[] tmp = new int[n]; + zVal.CopyTo(tmp, n - zVal.Length); + zVal = tmp; + } + + // Sliding window from MSW to LSW + + int extraBits = 0; + + // Filter the common case of small RSA exponents with few bits set + if (e.magnitude.Length > 1 || e.BitCount > 2) + { + int expLength = e.BitLength; + while (expLength > ExpWindowThresholds[extraBits]) + { + ++extraBits; + } + } + + int numPowers = 1 << extraBits; + int[][] oddPowers = new int[numPowers][]; + oddPowers[0] = zVal; + + int[] zSquared = Arrays.Clone(zVal); + SquareMonty(yAccum, zSquared, m.magnitude, mDash, smallMontyModulus); + + for (int i = 1; i < numPowers; ++i) + { + oddPowers[i] = Arrays.Clone(oddPowers[i - 1]); + MultiplyMonty(yAccum, oddPowers[i], zSquared, m.magnitude, mDash, smallMontyModulus); + } + + int[] windowList = GetWindowList(e.magnitude, extraBits); + Debug.Assert(windowList.Length > 1); + + int window = windowList[0]; + int mult = window & 0xFF, lastZeroes = window >> 8; + + int[] yVal; + if (mult == 1) + { + yVal = zSquared; + --lastZeroes; + } + else + { + yVal = Arrays.Clone(oddPowers[mult >> 1]); + } + + int windowPos = 1; + while ((window = windowList[windowPos++]) != -1) + { + mult = window & 0xFF; + + int bits = lastZeroes + BitLengthTable[mult]; + for (int j = 0; j < bits; ++j) + { + SquareMonty(yAccum, yVal, m.magnitude, mDash, smallMontyModulus); + } + + MultiplyMonty(yAccum, yVal, oddPowers[mult >> 1], m.magnitude, mDash, smallMontyModulus); + + lastZeroes = window >> 8; + } + + for (int i = 0; i < lastZeroes; ++i) + { + SquareMonty(yAccum, yVal, m.magnitude, mDash, smallMontyModulus); + } + + if (convert) + { + // Return y * R^(-1) mod m + MontgomeryReduce(yVal, m.magnitude, mDash); + } + else if (smallMontyModulus && CompareTo(0, yVal, 0, m.magnitude) >= 0) + { + Subtract(0, yVal, 0, m.magnitude); + } + + return new BigInteger(1, yVal, true); + } + + private static int[] GetWindowList(int[] mag, int extraBits) + { + int v = mag[0]; + Debug.Assert(v != 0); + + int leadingBits = BitLen(v); + + int resultSize = (((mag.Length - 1) << 5) + leadingBits) / (1 + extraBits) + 2; + int[] result = new int[resultSize]; + int resultPos = 0; + + int bitPos = 33 - leadingBits; + v <<= bitPos; + + int mult = 1, multLimit = 1 << extraBits; + int zeroes = 0; + + int i = 0; + for (; ; ) + { + for (; bitPos < 32; ++bitPos) + { + if (mult < multLimit) + { + mult = (mult << 1) | (int)((uint)v >> 31); + } + else if (v < 0) + { + result[resultPos++] = CreateWindowEntry(mult, zeroes); + mult = 1; + zeroes = 0; + } + else + { + ++zeroes; + } + + v <<= 1; + } + + if (++i == mag.Length) + { + result[resultPos++] = CreateWindowEntry(mult, zeroes); + break; + } + + v = mag[i]; + bitPos = 0; + } + + result[resultPos] = -1; + return result; + } + + private static int CreateWindowEntry(int mult, int zeroes) + { + while ((mult & 1) == 0) + { + mult >>= 1; + ++zeroes; + } + + return mult | (zeroes << 8); + } + + /** + * return w with w = x * x - w is assumed to have enough space. + */ + private static int[] Square( + int[] w, + int[] x) + { + // Note: this method allows w to be only (2 * x.Length - 1) words if result will fit +// if (w.Length != 2 * x.Length) +// throw new ArgumentException("no I don't think so..."); + + ulong c; + + int wBase = w.Length - 1; + + for (int i = x.Length - 1; i > 0; --i) + { + ulong v = (uint)x[i]; + + c = v * v + (uint)w[wBase]; + w[wBase] = (int)c; + c >>= 32; + + for (int j = i - 1; j >= 0; --j) + { + ulong prod = v * (uint)x[j]; + + c += ((uint)w[--wBase] & UIMASK) + ((uint)prod << 1); + w[wBase] = (int)c; + c = (c >> 32) + (prod >> 31); + } + + c += (uint)w[--wBase]; + w[wBase] = (int)c; + + if (--wBase >= 0) + { + w[wBase] = (int)(c >> 32); + } + else + { + Debug.Assert((c >> 32) == 0); + } + + wBase += i; + } + + c = (uint)x[0]; + + c = c * c + (uint)w[wBase]; + w[wBase] = (int)c; + + if (--wBase >= 0) + { + w[wBase] += (int)(c >> 32); + } + else + { + Debug.Assert((c >> 32) == 0); + } + + return w; + } + + /** + * return x with x = y * z - x is assumed to have enough space. + */ + private static int[] Multiply(int[] x, int[] y, int[] z) + { + int i = z.Length; + + if (i < 1) + return x; + + int xBase = x.Length - y.Length; + + do + { + long a = z[--i] & IMASK; + long val = 0; + + if (a != 0) + { + for (int j = y.Length - 1; j >= 0; j--) + { + val += a * (y[j] & IMASK) + (x[xBase + j] & IMASK); + + x[xBase + j] = (int)val; + + val = (long)((ulong)val >> 32); + } + } + + --xBase; + + if (xBase >= 0) + { + x[xBase] = (int)val; + } + else + { + Debug.Assert(val == 0); + } + } + while (i > 0); + + return x; + } + + /** + * Calculate mQuote = -m^(-1) mod b with b = 2^32 (32 = word size) + */ + private int GetMQuote() + { + if (mQuote != 0) + { + return mQuote; // already calculated + } + + Debug.Assert(this.sign > 0); + + int d = -magnitude[magnitude.Length - 1]; + + Debug.Assert((d & 1) != 0); + + return mQuote = ModInverse32(d); + } + + private static void MontgomeryReduce(int[] x, int[] m, uint mDash) // mDash = -m^(-1) mod b + { + // NOTE: Not a general purpose reduction (which would allow x up to twice the bitlength of m) + Debug.Assert(x.Length == m.Length); + + int n = m.Length; + + for (int i = n - 1; i >= 0; --i) + { + uint x0 = (uint)x[n - 1]; + ulong t = x0 * mDash; + + ulong carry = t * (uint)m[n - 1] + x0; + Debug.Assert((uint)carry == 0); + carry >>= 32; + + for (int j = n - 2; j >= 0; --j) + { + carry += t * (uint)m[j] + (uint)x[j]; + x[j + 1] = (int)carry; + carry >>= 32; + } + + x[0] = (int)carry; + Debug.Assert(carry >> 32 == 0); + } + + if (CompareTo(0, x, 0, m) >= 0) + { + Subtract(0, x, 0, m); + } + } + + /** + * Montgomery multiplication: a = x * y * R^(-1) mod m + *
+ * Based algorithm 14.36 of Handbook of Applied Cryptography. + *
+ *
  • m, x, y should have length n
  • + *
  • a should have length (n + 1)
  • + *
  • b = 2^32, R = b^n
  • + *
    + * The result is put in x + *
    + * NOTE: the indices of x, y, m, a different in HAC and in Java + */ + private static void MultiplyMonty(int[] a, int[] x, int[] y, int[] m, uint mDash, bool smallMontyModulus) + // mDash = -m^(-1) mod b + { + int n = m.Length; + + if (n == 1) + { + x[0] = (int)MultiplyMontyNIsOne((uint)x[0], (uint)y[0], (uint)m[0], mDash); + return; + } + + uint y0 = (uint)y[n - 1]; + int aMax; + + { + ulong xi = (uint)x[n - 1]; + + ulong carry = xi * y0; + ulong t = (uint)carry * mDash; + + ulong prod2 = t * (uint)m[n - 1]; + carry += (uint)prod2; + Debug.Assert((uint)carry == 0); + carry = (carry >> 32) + (prod2 >> 32); + + for (int j = n - 2; j >= 0; --j) + { + ulong prod1 = xi * (uint)y[j]; + prod2 = t * (uint)m[j]; + + carry += (prod1 & UIMASK) + (uint)prod2; + a[j + 2] = (int)carry; + carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32); + } + + a[1] = (int)carry; + aMax = (int)(carry >> 32); + } + + for (int i = n - 2; i >= 0; --i) + { + uint a0 = (uint)a[n]; + ulong xi = (uint)x[i]; + + ulong prod1 = xi * y0; + ulong carry = (prod1 & UIMASK) + a0; + ulong t = (uint)carry * mDash; + + ulong prod2 = t * (uint)m[n - 1]; + carry += (uint)prod2; + Debug.Assert((uint)carry == 0); + carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32); + + for (int j = n - 2; j >= 0; --j) + { + prod1 = xi * (uint)y[j]; + prod2 = t * (uint)m[j]; + + carry += (prod1 & UIMASK) + (uint)prod2 + (uint)a[j + 1]; + a[j + 2] = (int)carry; + carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32); + } + + carry += (uint)aMax; + a[1] = (int)carry; + aMax = (int)(carry >> 32); + } + + a[0] = aMax; + + if (!smallMontyModulus && CompareTo(0, a, 0, m) >= 0) + { + Subtract(0, a, 0, m); + } + + Array.Copy(a, 1, x, 0, n); + } + + private static void SquareMonty(int[] a, int[] x, int[] m, uint mDash, bool smallMontyModulus) + // mDash = -m^(-1) mod b + { + int n = m.Length; + + if (n == 1) + { + uint xVal = (uint)x[0]; + x[0] = (int)MultiplyMontyNIsOne(xVal, xVal, (uint)m[0], mDash); + return; + } + + ulong x0 = (uint)x[n - 1]; + int aMax; + + { + ulong carry = x0 * x0; + ulong t = (uint)carry * mDash; + + ulong prod2 = t * (uint)m[n - 1]; + carry += (uint)prod2; + Debug.Assert((uint)carry == 0); + carry = (carry >> 32) + (prod2 >> 32); + + for (int j = n - 2; j >= 0; --j) + { + ulong prod1 = x0 * (uint)x[j]; + prod2 = t * (uint)m[j]; + + carry += (prod2 & UIMASK) + ((uint)prod1 << 1); + a[j + 2] = (int)carry; + carry = (carry >> 32) + (prod1 >> 31) + (prod2 >> 32); + } + + a[1] = (int)carry; + aMax = (int)(carry >> 32); + } + + for (int i = n - 2; i >= 0; --i) + { + uint a0 = (uint)a[n]; + ulong t = a0 * mDash; + + ulong carry = t * (uint)m[n - 1] + a0; + Debug.Assert((uint)carry == 0); + carry >>= 32; + + for (int j = n - 2; j > i; --j) + { + carry += t * (uint)m[j] + (uint)a[j + 1]; + a[j + 2] = (int)carry; + carry >>= 32; + } + + ulong xi = (uint)x[i]; + + { + ulong prod1 = xi * xi; + ulong prod2 = t * (uint)m[i]; + + carry += (prod1 & UIMASK) + (uint)prod2 + (uint)a[i + 1]; + a[i + 2] = (int)carry; + carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32); + } + + for (int j = i - 1; j >= 0; --j) + { + ulong prod1 = xi * (uint)x[j]; + ulong prod2 = t * (uint)m[j]; + + carry += (prod2 & UIMASK) + ((uint)prod1 << 1) + (uint)a[j + 1]; + a[j + 2] = (int)carry; + carry = (carry >> 32) + (prod1 >> 31) + (prod2 >> 32); + } + + carry += (uint)aMax; + a[1] = (int)carry; + aMax = (int)(carry >> 32); + } + + a[0] = aMax; + + if (!smallMontyModulus && CompareTo(0, a, 0, m) >= 0) + { + Subtract(0, a, 0, m); + } + + Array.Copy(a, 1, x, 0, n); + } + + private static uint MultiplyMontyNIsOne(uint x, uint y, uint m, uint mDash) + { + ulong carry = (ulong)x * y; + uint t = (uint)carry * mDash; + ulong um = m; + ulong prod2 = um * t; + carry += (uint)prod2; + Debug.Assert((uint)carry == 0); + carry = (carry >> 32) + (prod2 >> 32); + if (carry > um) + { + carry -= um; + } + Debug.Assert(carry < um); + return (uint)carry; + } + + public BigInteger Multiply( + BigInteger val) + { + if (val == this) + return Square(); + + if ((sign & val.sign) == 0) + return Zero; + + if (val.QuickPow2Check()) // val is power of two + { + BigInteger result = this.ShiftLeft(val.Abs().BitLength - 1); + return val.sign > 0 ? result : result.Negate(); + } + + if (this.QuickPow2Check()) // this is power of two + { + BigInteger result = val.ShiftLeft(this.Abs().BitLength - 1); + return this.sign > 0 ? result : result.Negate(); + } + + int resLength = magnitude.Length + val.magnitude.Length; + int[] res = new int[resLength]; + + Multiply(res, this.magnitude, val.magnitude); + + int resSign = sign ^ val.sign ^ 1; + return new BigInteger(resSign, res, true); + } + + public BigInteger Square() + { + if (sign == 0) + return Zero; + if (this.QuickPow2Check()) + return ShiftLeft(Abs().BitLength - 1); + int resLength = magnitude.Length << 1; + if ((uint)magnitude[0] >> 16 == 0) + --resLength; + int[] res = new int[resLength]; + Square(res, magnitude); + return new BigInteger(1, res, false); + } + + public BigInteger Negate() + { + if (sign == 0) + return this; + + return new BigInteger(-sign, magnitude, false); + } + + public BigInteger NextProbablePrime() + { + if (sign < 0) + throw new ArithmeticException("Cannot be called on value < 0"); + + if (CompareTo(Two) < 0) + return Two; + + BigInteger n = Inc().SetBit(0); + + while (!n.CheckProbablePrime(100, RandomSource, false)) + { + n = n.Add(Two); + } + + return n; + } + + public BigInteger Not() + { + return Inc().Negate(); + } + + public BigInteger Pow(int exp) + { + if (exp <= 0) + { + if (exp < 0) + throw new ArithmeticException("Negative exponent"); + + return One; + } + + if (sign == 0) + { + return this; + } + + if (QuickPow2Check()) + { + long powOf2 = (long)exp * (BitLength - 1); + if (powOf2 > Int32.MaxValue) + { + throw new ArithmeticException("Result too large"); + } + return One.ShiftLeft((int)powOf2); + } + + BigInteger y = One; + BigInteger z = this; + + for (;;) + { + if ((exp & 0x1) == 1) + { + y = y.Multiply(z); + } + exp >>= 1; + if (exp == 0) break; + z = z.Multiply(z); + } + + return y; + } + + public static BigInteger ProbablePrime( + int bitLength, + Random random) + { + return new BigInteger(bitLength, 100, random); + } + + private int Remainder( + int m) + { + Debug.Assert(m > 0); + + long acc = 0; + for (int pos = 0; pos < magnitude.Length; ++pos) + { + long posVal = (uint) magnitude[pos]; + acc = (acc << 32 | posVal) % m; + } + + return (int) acc; + } + + /** + * return x = x % y - done in place (y value preserved) + */ + private static int[] Remainder( + int[] x, + int[] y) + { + int xStart = 0; + while (xStart < x.Length && x[xStart] == 0) + { + ++xStart; + } + + int yStart = 0; + while (yStart < y.Length && y[yStart] == 0) + { + ++yStart; + } + + Debug.Assert(yStart < y.Length); + + int xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y); + + if (xyCmp > 0) + { + int yBitLength = CalcBitLength(1, yStart, y); + int xBitLength = CalcBitLength(1, xStart, x); + int shift = xBitLength - yBitLength; + + int[] c; + int cStart = 0; + int cBitLength = yBitLength; + if (shift > 0) + { + c = ShiftLeft(y, shift); + cBitLength += shift; + Debug.Assert(c[0] != 0); + } + else + { + int len = y.Length - yStart; + c = new int[len]; + Array.Copy(y, yStart, c, 0, len); + } + + for (;;) + { + if (cBitLength < xBitLength + || CompareNoLeadingZeroes(xStart, x, cStart, c) >= 0) + { + Subtract(xStart, x, cStart, c); + + while (x[xStart] == 0) + { + if (++xStart == x.Length) + return x; + } + + //xBitLength = CalcBitLength(xStart, x); + xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]); + + if (xBitLength <= yBitLength) + { + if (xBitLength < yBitLength) + return x; + + xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y); + + if (xyCmp <= 0) + break; + } + } + + shift = cBitLength - xBitLength; + + // NB: The case where c[cStart] is 1-bit is harmless + if (shift == 1) + { + uint firstC = (uint) c[cStart] >> 1; + uint firstX = (uint) x[xStart]; + if (firstC > firstX) + ++shift; + } + + if (shift < 2) + { + ShiftRightOneInPlace(cStart, c); + --cBitLength; + } + else + { + ShiftRightInPlace(cStart, c, shift); + cBitLength -= shift; + } + + //cStart = c.Length - ((cBitLength + 31) / 32); + while (c[cStart] == 0) + { + ++cStart; + } + } + } + + if (xyCmp == 0) + { + Array.Clear(x, xStart, x.Length - xStart); + } + + return x; + } + + public BigInteger Remainder( + BigInteger n) + { + if (n.sign == 0) + throw new ArithmeticException("Division by zero error"); + + if (this.sign == 0) + return Zero; + + // For small values, use fast remainder method + if (n.magnitude.Length == 1) + { + int val = n.magnitude[0]; + + if (val > 0) + { + if (val == 1) + return Zero; + + // TODO Make this func work on uint, and handle val == 1? + int rem = Remainder(val); + + return rem == 0 + ? Zero + : new BigInteger(sign, new int[]{ rem }, false); + } + } + + if (CompareNoLeadingZeroes(0, magnitude, 0, n.magnitude) < 0) + return this; + + int[] result; + if (n.QuickPow2Check()) // n is power of two + { + // TODO Move before small values branch above? + result = LastNBits(n.Abs().BitLength - 1); + } + else + { + result = (int[]) this.magnitude.Clone(); + result = Remainder(result, n.magnitude); + } + + return new BigInteger(sign, result, true); + } + + private int[] LastNBits( + int n) + { + if (n < 1) + return ZeroMagnitude; + + int numWords = (n + BitsPerInt - 1) / BitsPerInt; + numWords = System.Math.Min(numWords, this.magnitude.Length); + int[] result = new int[numWords]; + + Array.Copy(this.magnitude, this.magnitude.Length - numWords, result, 0, numWords); + + int excessBits = (numWords << 5) - n; + if (excessBits > 0) + { + result[0] &= (int)(UInt32.MaxValue >> excessBits); + } + + return result; + } + + private BigInteger DivideWords(int w) + { + Debug.Assert(w >= 0); + int n = magnitude.Length; + if (w >= n) + return Zero; + int[] mag = new int[n - w]; + Array.Copy(magnitude, 0, mag, 0, n - w); + return new BigInteger(sign, mag, false); + } + + private BigInteger RemainderWords(int w) + { + Debug.Assert(w >= 0); + int n = magnitude.Length; + if (w >= n) + return this; + int[] mag = new int[w]; + Array.Copy(magnitude, n - w, mag, 0, w); + return new BigInteger(sign, mag, false); + } + + /** + * do a left shift - this returns a new array. + */ + private static int[] ShiftLeft( + int[] mag, + int n) + { + int nInts = (int)((uint)n >> 5); + int nBits = n & 0x1f; + int magLen = mag.Length; + int[] newMag; + + if (nBits == 0) + { + newMag = new int[magLen + nInts]; + mag.CopyTo(newMag, 0); + } + else + { + int i = 0; + int nBits2 = 32 - nBits; + int highBits = (int)((uint)mag[0] >> nBits2); + + if (highBits != 0) + { + newMag = new int[magLen + nInts + 1]; + newMag[i++] = highBits; + } + else + { + newMag = new int[magLen + nInts]; + } + + int m = mag[0]; + for (int j = 0; j < magLen - 1; j++) + { + int next = mag[j + 1]; + + newMag[i++] = (m << nBits) | (int)((uint)next >> nBits2); + m = next; + } + + newMag[i] = mag[magLen - 1] << nBits; + } + + return newMag; + } + + private static int ShiftLeftOneInPlace(int[] x, int carry) + { + Debug.Assert(carry == 0 || carry == 1); + int pos = x.Length; + while (--pos >= 0) + { + uint val = (uint)x[pos]; + x[pos] = (int)(val << 1) | carry; + carry = (int)(val >> 31); + } + return carry; + } + + public BigInteger ShiftLeft( + int n) + { + if (sign == 0 || magnitude.Length == 0) + return Zero; + + if (n == 0) + return this; + + if (n < 0) + return ShiftRight(-n); + + BigInteger result = new BigInteger(sign, ShiftLeft(magnitude, n), true); + + if (this.nBits != -1) + { + result.nBits = sign > 0 + ? this.nBits + : this.nBits + n; + } + + if (this.nBitLength != -1) + { + result.nBitLength = this.nBitLength + n; + } + + return result; + } + + /** + * do a right shift - this does it in place. + */ + private static void ShiftRightInPlace( + int start, + int[] mag, + int n) + { + int nInts = (int)((uint)n >> 5) + start; + int nBits = n & 0x1f; + int magEnd = mag.Length - 1; + + if (nInts != start) + { + int delta = (nInts - start); + + for (int i = magEnd; i >= nInts; i--) + { + mag[i] = mag[i - delta]; + } + for (int i = nInts - 1; i >= start; i--) + { + mag[i] = 0; + } + } + + if (nBits != 0) + { + int nBits2 = 32 - nBits; + int m = mag[magEnd]; + + for (int i = magEnd; i > nInts; --i) + { + int next = mag[i - 1]; + + mag[i] = (int)((uint)m >> nBits) | (next << nBits2); + m = next; + } + + mag[nInts] = (int)((uint)mag[nInts] >> nBits); + } + } + + /** + * do a right shift by one - this does it in place. + */ + private static void ShiftRightOneInPlace( + int start, + int[] mag) + { + int i = mag.Length; + int m = mag[i - 1]; + + while (--i > start) + { + int next = mag[i - 1]; + mag[i] = ((int)((uint)m >> 1)) | (next << 31); + m = next; + } + + mag[start] = (int)((uint)mag[start] >> 1); + } + + public BigInteger ShiftRight( + int n) + { + if (n == 0) + return this; + + if (n < 0) + return ShiftLeft(-n); + + if (n >= BitLength) + return (this.sign < 0 ? One.Negate() : Zero); + +// int[] res = (int[]) this.magnitude.Clone(); +// +// ShiftRightInPlace(0, res, n); +// +// return new BigInteger(this.sign, res, true); + + int resultLength = (BitLength - n + 31) >> 5; + int[] res = new int[resultLength]; + + int numInts = n >> 5; + int numBits = n & 31; + + if (numBits == 0) + { + Array.Copy(this.magnitude, 0, res, 0, res.Length); + } + else + { + int numBits2 = 32 - numBits; + + int magPos = this.magnitude.Length - 1 - numInts; + for (int i = resultLength - 1; i >= 0; --i) + { + res[i] = (int)((uint) this.magnitude[magPos--] >> numBits); + + if (magPos >= 0) + { + res[i] |= this.magnitude[magPos] << numBits2; + } + } + } + + Debug.Assert(res[0] != 0); + + return new BigInteger(this.sign, res, false); + } + + public int SignValue + { + get { return sign; } + } + + /** + * returns x = x - y - we assume x is >= y + */ + private static int[] Subtract( + int xStart, + int[] x, + int yStart, + int[] y) + { + Debug.Assert(yStart < y.Length); + Debug.Assert(x.Length - xStart >= y.Length - yStart); + + int iT = x.Length; + int iV = y.Length; + long m; + int borrow = 0; + + do + { + m = (x[--iT] & IMASK) - (y[--iV] & IMASK) + borrow; + x[iT] = (int) m; + +// borrow = (m < 0) ? -1 : 0; + borrow = (int)(m >> 63); + } + while (iV > yStart); + + if (borrow != 0) + { + while (--x[--iT] == -1) + { + } + } + + return x; + } + + public BigInteger Subtract( + BigInteger n) + { + if (n.sign == 0) + return this; + + if (this.sign == 0) + return n.Negate(); + + if (this.sign != n.sign) + return Add(n.Negate()); + + int compare = CompareNoLeadingZeroes(0, magnitude, 0, n.magnitude); + if (compare == 0) + return Zero; + + BigInteger bigun, lilun; + if (compare < 0) + { + bigun = n; + lilun = this; + } + else + { + bigun = this; + lilun = n; + } + + return new BigInteger(this.sign * compare, doSubBigLil(bigun.magnitude, lilun.magnitude), true); + } + + private static int[] doSubBigLil( + int[] bigMag, + int[] lilMag) + { + int[] res = (int[]) bigMag.Clone(); + + return Subtract(0, res, 0, lilMag); + } + + public byte[] ToByteArray() + { + return ToByteArray(false); + } + + public byte[] ToByteArrayUnsigned() + { + return ToByteArray(true); + } + + private byte[] ToByteArray( + bool unsigned) + { + if (sign == 0) + return unsigned ? ZeroEncoding : new byte[1]; + + int nBits = (unsigned && sign > 0) + ? BitLength + : BitLength + 1; + + int nBytes = GetByteLength(nBits); + byte[] bytes = new byte[nBytes]; + + int magIndex = magnitude.Length; + int bytesIndex = bytes.Length; + + if (sign > 0) + { + while (magIndex > 1) + { + uint mag = (uint) magnitude[--magIndex]; + bytes[--bytesIndex] = (byte) mag; + bytes[--bytesIndex] = (byte)(mag >> 8); + bytes[--bytesIndex] = (byte)(mag >> 16); + bytes[--bytesIndex] = (byte)(mag >> 24); + } + + uint lastMag = (uint) magnitude[0]; + while (lastMag > byte.MaxValue) + { + bytes[--bytesIndex] = (byte) lastMag; + lastMag >>= 8; + } + + bytes[--bytesIndex] = (byte) lastMag; + } + else // sign < 0 + { + bool carry = true; + + while (magIndex > 1) + { + uint mag = ~((uint) magnitude[--magIndex]); + + if (carry) + { + carry = (++mag == uint.MinValue); + } + + bytes[--bytesIndex] = (byte) mag; + bytes[--bytesIndex] = (byte)(mag >> 8); + bytes[--bytesIndex] = (byte)(mag >> 16); + bytes[--bytesIndex] = (byte)(mag >> 24); + } + + uint lastMag = (uint) magnitude[0]; + + if (carry) + { + // Never wraps because magnitude[0] != 0 + --lastMag; + } + + while (lastMag > byte.MaxValue) + { + bytes[--bytesIndex] = (byte) ~lastMag; + lastMag >>= 8; + } + + bytes[--bytesIndex] = (byte) ~lastMag; + + if (bytesIndex > 0) + { + bytes[--bytesIndex] = byte.MaxValue; + } + } + + return bytes; + } + + public override string ToString() + { + return ToString(10); + } + + public string ToString(int radix) + { + // TODO Make this method work for other radices (ideally 2 <= radix <= 36 as in Java) + + switch (radix) + { + case 2: + case 8: + case 10: + case 16: + break; + default: + throw new FormatException("Only bases 2, 8, 10, 16 are allowed"); + } + + // NB: Can only happen to internally managed instances + if (magnitude == null) + return "null"; + + if (sign == 0) + return "0"; + + + // NOTE: This *should* be unnecessary, since the magnitude *should* never have leading zero digits + int firstNonZero = 0; + while (firstNonZero < magnitude.Length) + { + if (magnitude[firstNonZero] != 0) + { + break; + } + ++firstNonZero; + } + + if (firstNonZero == magnitude.Length) + { + return "0"; + } + + + StringBuilder sb = new StringBuilder(); + if (sign == -1) + { + sb.Append('-'); + } + + switch (radix) + { + case 2: + { + int pos = firstNonZero; + sb.Append(Convert.ToString(magnitude[pos], 2)); + while (++pos < magnitude.Length) + { + AppendZeroExtendedString(sb, Convert.ToString(magnitude[pos], 2), 32); + } + break; + } + case 8: + { + int mask = (1 << 30) - 1; + BigInteger u = this.Abs(); + int bits = u.BitLength; + IList S = new List(); + while (bits > 30) + { + S.Add(Convert.ToString(u.IntValue & mask, 8)); + u = u.ShiftRight(30); + bits -= 30; + } + sb.Append(Convert.ToString(u.IntValue, 8)); + for (int i = S.Count - 1; i >= 0; --i) + { + AppendZeroExtendedString(sb, (string)S[i], 10); + } + break; + } + case 16: + { + int pos = firstNonZero; + sb.Append(Convert.ToString(magnitude[pos], 16)); + while (++pos < magnitude.Length) + { + AppendZeroExtendedString(sb, Convert.ToString(magnitude[pos], 16), 8); + } + break; + } + // TODO This could work for other radices if there is an alternative to Convert.ToString method + //default: + case 10: + { + BigInteger q = this.Abs(); + if (q.BitLength < 64) + { + sb.Append(Convert.ToString(q.LongValue, radix)); + break; + } + + // TODO Could cache the moduli for each radix (soft reference?) + IList moduli = new List(); + BigInteger R = BigInteger.ValueOf(radix); + while (R.CompareTo(q) <= 0) + { + moduli.Add(R); + R = R.Square(); + } + + int scale = moduli.Count; + sb.EnsureCapacity(sb.Length + (1 << scale)); + + ToString(sb, radix, moduli, scale, q); + + break; + } + } + + return sb.ToString(); + } + + private static void ToString(StringBuilder sb, int radix, IList moduli, int scale, BigInteger pos) + { + if (pos.BitLength < 64) + { + string s = Convert.ToString(pos.LongValue, radix); + if (sb.Length > 1 || (sb.Length == 1 && sb[0] != '-')) + { + AppendZeroExtendedString(sb, s, 1 << scale); + } + else if (pos.SignValue != 0) + { + sb.Append(s); + } + return; + } + + BigInteger[] qr = pos.DivideAndRemainder((BigInteger)moduli[--scale]); + + ToString(sb, radix, moduli, scale, qr[0]); + ToString(sb, radix, moduli, scale, qr[1]); + } + + private static void AppendZeroExtendedString(StringBuilder sb, string s, int minLength) + { + for (int len = s.Length; len < minLength; ++len) + { + sb.Append('0'); + } + sb.Append(s); + } + + private static BigInteger CreateUValueOf( + ulong value) + { + int msw = (int)(value >> 32); + int lsw = (int)value; + + if (msw != 0) + return new BigInteger(1, new int[] { msw, lsw }, false); + + if (lsw != 0) + { + BigInteger n = new BigInteger(1, new int[] { lsw }, false); + // Check for a power of two + if ((lsw & -lsw) == lsw) + { + n.nBits = 1; + } + return n; + } + + return Zero; + } + + private static BigInteger CreateValueOf( + long value) + { + if (value < 0) + { + if (value == long.MinValue) + return CreateValueOf(~value).Not(); + + return CreateValueOf(-value).Negate(); + } + + return CreateUValueOf((ulong)value); + } + + public static BigInteger ValueOf( + long value) + { + if (value >= 0 && value < SMALL_CONSTANTS.Length) + { + return SMALL_CONSTANTS[value]; + } + + return CreateValueOf(value); + } + + public int GetLowestSetBit() + { + if (this.sign == 0) + return -1; + + return GetLowestSetBitMaskFirst(-1); + } + + private int GetLowestSetBitMaskFirst(int firstWordMask) + { + int w = magnitude.Length, offset = 0; + + uint word = (uint)(magnitude[--w] & firstWordMask); + Debug.Assert(magnitude[0] != 0); + + while (word == 0) + { + word = (uint)magnitude[--w]; + offset += 32; + } + + while ((word & 0xFF) == 0) + { + word >>= 8; + offset += 8; + } + + while ((word & 1) == 0) + { + word >>= 1; + ++offset; + } + + return offset; + } + + public bool TestBit( + int n) + { + if (n < 0) + throw new ArithmeticException("Bit position must not be negative"); + + if (sign < 0) + return !Not().TestBit(n); + + int wordNum = n / 32; + if (wordNum >= magnitude.Length) + return false; + + int word = magnitude[magnitude.Length - 1 - wordNum]; + return ((word >> (n % 32)) & 1) > 0; + } + + public BigInteger Or( + BigInteger value) + { + if (this.sign == 0) + return value; + + if (value.sign == 0) + return this; + + int[] aMag = this.sign > 0 + ? this.magnitude + : Add(One).magnitude; + + int[] bMag = value.sign > 0 + ? value.magnitude + : value.Add(One).magnitude; + + bool resultNeg = sign < 0 || value.sign < 0; + int resultLength = System.Math.Max(aMag.Length, bMag.Length); + int[] resultMag = new int[resultLength]; + + int aStart = resultMag.Length - aMag.Length; + int bStart = resultMag.Length - bMag.Length; + + for (int i = 0; i < resultMag.Length; ++i) + { + int aWord = i >= aStart ? aMag[i - aStart] : 0; + int bWord = i >= bStart ? bMag[i - bStart] : 0; + + if (this.sign < 0) + { + aWord = ~aWord; + } + + if (value.sign < 0) + { + bWord = ~bWord; + } + + resultMag[i] = aWord | bWord; + + if (resultNeg) + { + resultMag[i] = ~resultMag[i]; + } + } + + BigInteger result = new BigInteger(1, resultMag, true); + + // TODO Optimise this case + if (resultNeg) + { + result = result.Not(); + } + + return result; + } + + public BigInteger Xor( + BigInteger value) + { + if (this.sign == 0) + return value; + + if (value.sign == 0) + return this; + + int[] aMag = this.sign > 0 + ? this.magnitude + : Add(One).magnitude; + + int[] bMag = value.sign > 0 + ? value.magnitude + : value.Add(One).magnitude; + + // TODO Can just replace with sign != value.sign? + bool resultNeg = (sign < 0 && value.sign >= 0) || (sign >= 0 && value.sign < 0); + int resultLength = System.Math.Max(aMag.Length, bMag.Length); + int[] resultMag = new int[resultLength]; + + int aStart = resultMag.Length - aMag.Length; + int bStart = resultMag.Length - bMag.Length; + + for (int i = 0; i < resultMag.Length; ++i) + { + int aWord = i >= aStart ? aMag[i - aStart] : 0; + int bWord = i >= bStart ? bMag[i - bStart] : 0; + + if (this.sign < 0) + { + aWord = ~aWord; + } + + if (value.sign < 0) + { + bWord = ~bWord; + } + + resultMag[i] = aWord ^ bWord; + + if (resultNeg) + { + resultMag[i] = ~resultMag[i]; + } + } + + BigInteger result = new BigInteger(1, resultMag, true); + + // TODO Optimise this case + if (resultNeg) + { + result = result.Not(); + } + + return result; + } + + public BigInteger SetBit( + int n) + { + if (n < 0) + throw new ArithmeticException("Bit address less than zero"); + + if (TestBit(n)) + return this; + + // TODO Handle negative values and zero + if (sign > 0 && n < (BitLength - 1)) + return FlipExistingBit(n); + + return Or(One.ShiftLeft(n)); + } + + public BigInteger ClearBit( + int n) + { + if (n < 0) + throw new ArithmeticException("Bit address less than zero"); + + if (!TestBit(n)) + return this; + + // TODO Handle negative values + if (sign > 0 && n < (BitLength - 1)) + return FlipExistingBit(n); + + return AndNot(One.ShiftLeft(n)); + } + + public BigInteger FlipBit( + int n) + { + if (n < 0) + throw new ArithmeticException("Bit address less than zero"); + + // TODO Handle negative values and zero + if (sign > 0 && n < (BitLength - 1)) + return FlipExistingBit(n); + + return Xor(One.ShiftLeft(n)); + } + + private BigInteger FlipExistingBit( + int n) + { + Debug.Assert(sign > 0); + Debug.Assert(n >= 0); + Debug.Assert(n < BitLength - 1); + + int[] mag = (int[]) this.magnitude.Clone(); + mag[mag.Length - 1 - (n >> 5)] ^= (1 << (n & 31)); // Flip bit + //mag[mag.Length - 1 - (n / 32)] ^= (1 << (n % 32)); + return new BigInteger(this.sign, mag, false); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECAlgorithms.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECAlgorithms.cs new file mode 100644 index 00000000..1347a9af --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECAlgorithms.cs @@ -0,0 +1,496 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Endo; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier; +using Renci.SshNet.Security.Org.BouncyCastle.Math.Field; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC +{ + internal class ECAlgorithms + { + public static bool IsF2mCurve(ECCurve c) + { + return IsF2mField(c.Field); + } + + public static bool IsF2mField(IFiniteField field) + { + return field.Dimension > 1 && field.Characteristic.Equals(BigInteger.Two) + && field is IPolynomialExtensionField; + } + + public static bool IsFpCurve(ECCurve c) + { + return IsFpField(c.Field); + } + + public static bool IsFpField(IFiniteField field) + { + return field.Dimension == 1; + } + + public static ECPoint SumOfMultiplies(ECPoint[] ps, BigInteger[] ks) + { + if (ps == null || ks == null || ps.Length != ks.Length || ps.Length < 1) + throw new ArgumentException("point and scalar arrays should be non-null, and of equal, non-zero, length"); + + int count = ps.Length; + switch (count) + { + case 1: + return ps[0].Multiply(ks[0]); + case 2: + return SumOfTwoMultiplies(ps[0], ks[0], ps[1], ks[1]); + default: + break; + } + + ECPoint p = ps[0]; + ECCurve c = p.Curve; + + ECPoint[] imported = new ECPoint[count]; + imported[0] = p; + for (int i = 1; i < count; ++i) + { + imported[i] = ImportPoint(c, ps[i]); + } + + GlvEndomorphism glvEndomorphism = c.GetEndomorphism() as GlvEndomorphism; + if (glvEndomorphism != null) + { + return ImplCheckResult(ImplSumOfMultipliesGlv(imported, ks, glvEndomorphism)); + } + + return ImplCheckResult(ImplSumOfMultiplies(imported, ks)); + } + + public static ECPoint SumOfTwoMultiplies(ECPoint P, BigInteger a, ECPoint Q, BigInteger b) + { + ECCurve cp = P.Curve; + Q = ImportPoint(cp, Q); + + // Point multiplication for Koblitz curves (using WTNAF) beats Shamir's trick + { + AbstractF2mCurve f2mCurve = cp as AbstractF2mCurve; + if (f2mCurve != null && f2mCurve.IsKoblitz) + { + return ImplCheckResult(P.Multiply(a).Add(Q.Multiply(b))); + } + } + + GlvEndomorphism glvEndomorphism = cp.GetEndomorphism() as GlvEndomorphism; + if (glvEndomorphism != null) + { + return ImplCheckResult( + ImplSumOfMultipliesGlv(new ECPoint[] { P, Q }, new BigInteger[] { a, b }, glvEndomorphism)); + } + + return ImplCheckResult(ImplShamirsTrickWNaf(P, a, Q, b)); + } + + /* + * "Shamir's Trick", originally due to E. G. Straus + * (Addition chains of vectors. American Mathematical Monthly, + * 71(7):806-808, Aug./Sept. 1964) + * + * Input: The points P, Q, scalar k = (km?, ... , k1, k0) + * and scalar l = (lm?, ... , l1, l0). + * Output: R = k * P + l * Q. + * 1: Z <- P + Q + * 2: R <- O + * 3: for i from m-1 down to 0 do + * 4: R <- R + R {point doubling} + * 5: if (ki = 1) and (li = 0) then R <- R + P end if + * 6: if (ki = 0) and (li = 1) then R <- R + Q end if + * 7: if (ki = 1) and (li = 1) then R <- R + Z end if + * 8: end for + * 9: return R + */ + public static ECPoint ShamirsTrick(ECPoint P, BigInteger k, ECPoint Q, BigInteger l) + { + ECCurve cp = P.Curve; + Q = ImportPoint(cp, Q); + + return ImplCheckResult(ImplShamirsTrickJsf(P, k, Q, l)); + } + + public static ECPoint ImportPoint(ECCurve c, ECPoint p) + { + ECCurve cp = p.Curve; + if (!c.Equals(cp)) + throw new ArgumentException("Point must be on the same curve"); + + return c.ImportPoint(p); + } + + public static void MontgomeryTrick(ECFieldElement[] zs, int off, int len) + { + MontgomeryTrick(zs, off, len, null); + } + + public static void MontgomeryTrick(ECFieldElement[] zs, int off, int len, ECFieldElement scale) + { + /* + * Uses the "Montgomery Trick" to invert many field elements, with only a single actual + * field inversion. See e.g. the paper: + * "Fast Multi-scalar Multiplication Methods on Elliptic Curves with Precomputation Strategy Using Montgomery Trick" + * by Katsuyuki Okeya, Kouichi Sakurai. + */ + + ECFieldElement[] c = new ECFieldElement[len]; + c[0] = zs[off]; + + int i = 0; + while (++i < len) + { + c[i] = c[i - 1].Multiply(zs[off + i]); + } + + --i; + + if (scale != null) + { + c[i] = c[i].Multiply(scale); + } + + ECFieldElement u = c[i].Invert(); + + while (i > 0) + { + int j = off + i--; + ECFieldElement tmp = zs[j]; + zs[j] = c[i].Multiply(u); + u = u.Multiply(tmp); + } + + zs[off] = u; + } + + /** + * Simple shift-and-add multiplication. Serves as reference implementation + * to verify (possibly faster) implementations, and for very small scalars. + * + * @param p + * The point to multiply. + * @param k + * The multiplier. + * @return The result of the point multiplication kP. + */ + public static ECPoint ReferenceMultiply(ECPoint p, BigInteger k) + { + BigInteger x = k.Abs(); + ECPoint q = p.Curve.Infinity; + int t = x.BitLength; + if (t > 0) + { + if (x.TestBit(0)) + { + q = p; + } + for (int i = 1; i < t; i++) + { + p = p.Twice(); + if (x.TestBit(i)) + { + q = q.Add(p); + } + } + } + return k.SignValue < 0 ? q.Negate() : q; + } + + public static ECPoint ValidatePoint(ECPoint p) + { + if (!p.IsValid()) + throw new InvalidOperationException("Invalid point"); + + return p; + } + + public static ECPoint CleanPoint(ECCurve c, ECPoint p) + { + ECCurve cp = p.Curve; + if (!c.Equals(cp)) + throw new ArgumentException("Point must be on the same curve", "p"); + + return c.DecodePoint(p.GetEncoded(false)); + } + + internal static ECPoint ImplCheckResult(ECPoint p) + { + if (!p.IsValidPartial()) + throw new InvalidOperationException("Invalid result"); + + return p; + } + + internal static ECPoint ImplShamirsTrickJsf(ECPoint P, BigInteger k, ECPoint Q, BigInteger l) + { + ECCurve curve = P.Curve; + ECPoint infinity = curve.Infinity; + + // TODO conjugate co-Z addition (ZADDC) can return both of these + ECPoint PaddQ = P.Add(Q); + ECPoint PsubQ = P.Subtract(Q); + + ECPoint[] points = new ECPoint[] { Q, PsubQ, P, PaddQ }; + curve.NormalizeAll(points); + + ECPoint[] table = new ECPoint[] { + points[3].Negate(), points[2].Negate(), points[1].Negate(), + points[0].Negate(), infinity, points[0], + points[1], points[2], points[3] }; + + byte[] jsf = WNafUtilities.GenerateJsf(k, l); + + ECPoint R = infinity; + + int i = jsf.Length; + while (--i >= 0) + { + int jsfi = jsf[i]; + + // NOTE: The shifting ensures the sign is extended correctly + int kDigit = ((jsfi << 24) >> 28), lDigit = ((jsfi << 28) >> 28); + + int index = 4 + (kDigit * 3) + lDigit; + R = R.TwicePlus(table[index]); + } + + return R; + } + + internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k, + ECPoint Q, BigInteger l) + { + bool negK = k.SignValue < 0, negL = l.SignValue < 0; + + k = k.Abs(); + l = l.Abs(); + + int widthP = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(k.BitLength))); + int widthQ = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(l.BitLength))); + + WNafPreCompInfo infoP = WNafUtilities.Precompute(P, widthP, true); + WNafPreCompInfo infoQ = WNafUtilities.Precompute(Q, widthQ, true); + + ECPoint[] preCompP = negK ? infoP.PreCompNeg : infoP.PreComp; + ECPoint[] preCompQ = negL ? infoQ.PreCompNeg : infoQ.PreComp; + ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg; + ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg; + + byte[] wnafP = WNafUtilities.GenerateWindowNaf(widthP, k); + byte[] wnafQ = WNafUtilities.GenerateWindowNaf(widthQ, l); + + return ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ); + } + + internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k, ECPointMap pointMapQ, BigInteger l) + { + bool negK = k.SignValue < 0, negL = l.SignValue < 0; + + k = k.Abs(); + l = l.Abs(); + + int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(System.Math.Max(k.BitLength, l.BitLength)))); + + ECPoint Q = WNafUtilities.MapPointWithPrecomp(P, width, true, pointMapQ); + WNafPreCompInfo infoP = WNafUtilities.GetWNafPreCompInfo(P); + WNafPreCompInfo infoQ = WNafUtilities.GetWNafPreCompInfo(Q); + + ECPoint[] preCompP = negK ? infoP.PreCompNeg : infoP.PreComp; + ECPoint[] preCompQ = negL ? infoQ.PreCompNeg : infoQ.PreComp; + ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg; + ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg; + + byte[] wnafP = WNafUtilities.GenerateWindowNaf(width, k); + byte[] wnafQ = WNafUtilities.GenerateWindowNaf(width, l); + + return ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ); + } + + private static ECPoint ImplShamirsTrickWNaf(ECPoint[] preCompP, ECPoint[] preCompNegP, byte[] wnafP, + ECPoint[] preCompQ, ECPoint[] preCompNegQ, byte[] wnafQ) + { + int len = System.Math.Max(wnafP.Length, wnafQ.Length); + + ECCurve curve = preCompP[0].Curve; + ECPoint infinity = curve.Infinity; + + ECPoint R = infinity; + int zeroes = 0; + + for (int i = len - 1; i >= 0; --i) + { + int wiP = i < wnafP.Length ? (int)(sbyte)wnafP[i] : 0; + int wiQ = i < wnafQ.Length ? (int)(sbyte)wnafQ[i] : 0; + + if ((wiP | wiQ) == 0) + { + ++zeroes; + continue; + } + + ECPoint r = infinity; + if (wiP != 0) + { + int nP = System.Math.Abs(wiP); + ECPoint[] tableP = wiP < 0 ? preCompNegP : preCompP; + r = r.Add(tableP[nP >> 1]); + } + if (wiQ != 0) + { + int nQ = System.Math.Abs(wiQ); + ECPoint[] tableQ = wiQ < 0 ? preCompNegQ : preCompQ; + r = r.Add(tableQ[nQ >> 1]); + } + + if (zeroes > 0) + { + R = R.TimesPow2(zeroes); + zeroes = 0; + } + + R = R.TwicePlus(r); + } + + if (zeroes > 0) + { + R = R.TimesPow2(zeroes); + } + + return R; + } + + internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, BigInteger[] ks) + { + int count = ps.Length; + bool[] negs = new bool[count]; + WNafPreCompInfo[] infos = new WNafPreCompInfo[count]; + byte[][] wnafs = new byte[count][]; + + for (int i = 0; i < count; ++i) + { + BigInteger ki = ks[i]; negs[i] = ki.SignValue < 0; ki = ki.Abs(); + + int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(ki.BitLength))); + infos[i] = WNafUtilities.Precompute(ps[i], width, true); + wnafs[i] = WNafUtilities.GenerateWindowNaf(width, ki); + } + + return ImplSumOfMultiplies(negs, infos, wnafs); + } + + internal static ECPoint ImplSumOfMultipliesGlv(ECPoint[] ps, BigInteger[] ks, GlvEndomorphism glvEndomorphism) + { + BigInteger n = ps[0].Curve.Order; + + int len = ps.Length; + + BigInteger[] abs = new BigInteger[len << 1]; + for (int i = 0, j = 0; i < len; ++i) + { + BigInteger[] ab = glvEndomorphism.DecomposeScalar(ks[i].Mod(n)); + abs[j++] = ab[0]; + abs[j++] = ab[1]; + } + + ECPointMap pointMap = glvEndomorphism.PointMap; + if (glvEndomorphism.HasEfficientPointMap) + { + return ECAlgorithms.ImplSumOfMultiplies(ps, pointMap, abs); + } + + ECPoint[] pqs = new ECPoint[len << 1]; + for (int i = 0, j = 0; i < len; ++i) + { + ECPoint p = ps[i], q = pointMap.Map(p); + pqs[j++] = p; + pqs[j++] = q; + } + + return ECAlgorithms.ImplSumOfMultiplies(pqs, abs); + } + + internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, ECPointMap pointMap, BigInteger[] ks) + { + int halfCount = ps.Length, fullCount = halfCount << 1; + + bool[] negs = new bool[fullCount]; + WNafPreCompInfo[] infos = new WNafPreCompInfo[fullCount]; + byte[][] wnafs = new byte[fullCount][]; + + for (int i = 0; i < halfCount; ++i) + { + int j0 = i << 1, j1 = j0 + 1; + + BigInteger kj0 = ks[j0]; negs[j0] = kj0.SignValue < 0; kj0 = kj0.Abs(); + BigInteger kj1 = ks[j1]; negs[j1] = kj1.SignValue < 0; kj1 = kj1.Abs(); + + int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(System.Math.Max(kj0.BitLength, kj1.BitLength)))); + + ECPoint P = ps[i], Q = WNafUtilities.MapPointWithPrecomp(P, width, true, pointMap); + infos[j0] = WNafUtilities.GetWNafPreCompInfo(P); + infos[j1] = WNafUtilities.GetWNafPreCompInfo(Q); + wnafs[j0] = WNafUtilities.GenerateWindowNaf(width, kj0); + wnafs[j1] = WNafUtilities.GenerateWindowNaf(width, kj1); + } + + return ImplSumOfMultiplies(negs, infos, wnafs); + } + + private static ECPoint ImplSumOfMultiplies(bool[] negs, WNafPreCompInfo[] infos, byte[][] wnafs) + { + int len = 0, count = wnafs.Length; + for (int i = 0; i < count; ++i) + { + len = System.Math.Max(len, wnafs[i].Length); + } + + ECCurve curve = infos[0].PreComp[0].Curve; + ECPoint infinity = curve.Infinity; + + ECPoint R = infinity; + int zeroes = 0; + + for (int i = len - 1; i >= 0; --i) + { + ECPoint r = infinity; + + for (int j = 0; j < count; ++j) + { + byte[] wnaf = wnafs[j]; + int wi = i < wnaf.Length ? (int)(sbyte)wnaf[i] : 0; + if (wi != 0) + { + int n = System.Math.Abs(wi); + WNafPreCompInfo info = infos[j]; + ECPoint[] table = (wi < 0 == negs[j]) ? info.PreComp : info.PreCompNeg; + r = r.Add(table[n >> 1]); + } + } + + if (r == infinity) + { + ++zeroes; + continue; + } + + if (zeroes > 0) + { + R = R.TimesPow2(zeroes); + zeroes = 0; + } + + R = R.TwicePlus(r); + } + + if (zeroes > 0) + { + R = R.TimesPow2(zeroes); + } + + return R; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECCurve.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECCurve.cs new file mode 100644 index 00000000..46c69184 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECCurve.cs @@ -0,0 +1,1278 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Abc; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Endo; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier; +using Renci.SshNet.Security.Org.BouncyCastle.Math.Field; +using Renci.SshNet.Security.Org.BouncyCastle.Math.Raw; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC +{ + /// Base class for an elliptic curve. + internal abstract class ECCurve + { + public const int COORD_AFFINE = 0; + public const int COORD_HOMOGENEOUS = 1; + public const int COORD_JACOBIAN = 2; + public const int COORD_JACOBIAN_CHUDNOVSKY = 3; + public const int COORD_JACOBIAN_MODIFIED = 4; + public const int COORD_LAMBDA_AFFINE = 5; + public const int COORD_LAMBDA_PROJECTIVE = 6; + public const int COORD_SKEWED = 7; + + public static int[] GetAllCoordinateSystems() + { + return new int[]{ COORD_AFFINE, COORD_HOMOGENEOUS, COORD_JACOBIAN, COORD_JACOBIAN_CHUDNOVSKY, + COORD_JACOBIAN_MODIFIED, COORD_LAMBDA_AFFINE, COORD_LAMBDA_PROJECTIVE, COORD_SKEWED }; + } + + internal class Config + { + protected ECCurve outer; + protected int coord; + protected ECEndomorphism endomorphism; + protected ECMultiplier multiplier; + + internal Config(ECCurve outer, int coord, ECEndomorphism endomorphism, ECMultiplier multiplier) + { + this.outer = outer; + this.coord = coord; + this.endomorphism = endomorphism; + this.multiplier = multiplier; + } + + public Config SetCoordinateSystem(int coord) + { + this.coord = coord; + return this; + } + + public Config SetEndomorphism(ECEndomorphism endomorphism) + { + this.endomorphism = endomorphism; + return this; + } + + public Config SetMultiplier(ECMultiplier multiplier) + { + this.multiplier = multiplier; + return this; + } + + public ECCurve Create() + { + if (!outer.SupportsCoordinateSystem(coord)) + { + throw new InvalidOperationException("unsupported coordinate system"); + } + + ECCurve c = outer.CloneCurve(); + if (c == outer) + { + throw new InvalidOperationException("implementation returned current curve"); + } + + c.m_coord = coord; + c.m_endomorphism = endomorphism; + c.m_multiplier = multiplier; + + return c; + } + } + + protected readonly IFiniteField m_field; + protected ECFieldElement m_a, m_b; + protected BigInteger m_order, m_cofactor; + + protected int m_coord = COORD_AFFINE; + protected ECEndomorphism m_endomorphism = null; + protected ECMultiplier m_multiplier = null; + + protected ECCurve(IFiniteField field) + { + this.m_field = field; + } + + public abstract int FieldSize { get; } + public abstract ECFieldElement FromBigInteger(BigInteger x); + public abstract bool IsValidFieldElement(BigInteger x); + + public virtual Config Configure() + { + return new Config(this, this.m_coord, this.m_endomorphism, this.m_multiplier); + } + + public virtual ECPoint ValidatePoint(BigInteger x, BigInteger y) + { + ECPoint p = CreatePoint(x, y); + if (!p.IsValid()) + { + throw new ArgumentException("Invalid point coordinates"); + } + return p; + } + + public virtual ECPoint ValidatePoint(BigInteger x, BigInteger y, bool withCompression) + { + ECPoint p = CreatePoint(x, y, withCompression); + if (!p.IsValid()) + { + throw new ArgumentException("Invalid point coordinates"); + } + return p; + } + + public virtual ECPoint CreatePoint(BigInteger x, BigInteger y) + { + return CreatePoint(x, y, false); + } + + public virtual ECPoint CreatePoint(BigInteger x, BigInteger y, bool withCompression) + { + return CreateRawPoint(FromBigInteger(x), FromBigInteger(y), withCompression); + } + + protected abstract ECCurve CloneCurve(); + + protected internal abstract ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression); + + protected internal abstract ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression); + + protected virtual ECMultiplier CreateDefaultMultiplier() + { + GlvEndomorphism glvEndomorphism = m_endomorphism as GlvEndomorphism; + if (glvEndomorphism != null) + { + return new GlvMultiplier(this, glvEndomorphism); + } + + return new WNafL2RMultiplier(); + } + + public virtual bool SupportsCoordinateSystem(int coord) + { + return coord == COORD_AFFINE; + } + + public virtual PreCompInfo GetPreCompInfo(ECPoint point, string name) + { + CheckPoint(point); + + IDictionary table; + lock (point) + { + table = point.m_preCompTable; + } + + if (null == table) + return null; + + lock (table) + { + return (PreCompInfo)table[name]; + } + } + + /** + * Compute a PreCompInfo for a point on this curve, under a given name. Used by + * ECMultipliers to save the precomputation for this ECPoint for use + * by subsequent multiplication. + * + * @param point + * The ECPoint to store precomputations for. + * @param name + * A String used to index precomputations of different types. + * @param callback + * Called to calculate the PreCompInfo. + */ + public virtual PreCompInfo Precompute(ECPoint point, string name, IPreCompCallback callback) + { + CheckPoint(point); + + IDictionary table; + lock (point) + { + table = point.m_preCompTable; + if (null == table) + { + point.m_preCompTable = table = new Dictionary(4); + } + } + + lock (table) + { + PreCompInfo existing = (PreCompInfo)table[name]; + PreCompInfo result = callback.Precompute(existing); + + if (result != existing) + { + table[name] = result; + } + + return result; + } + } + + public virtual ECPoint ImportPoint(ECPoint p) + { + if (this == p.Curve) + { + return p; + } + if (p.IsInfinity) + { + return Infinity; + } + + // TODO Default behaviour could be improved if the two curves have the same coordinate system by copying any Z coordinates. + p = p.Normalize(); + + return CreatePoint(p.XCoord.ToBigInteger(), p.YCoord.ToBigInteger(), p.IsCompressed); + } + + /** + * Normalization ensures that any projective coordinate is 1, and therefore that the x, y + * coordinates reflect those of the equivalent point in an affine coordinate system. Where more + * than one point is to be normalized, this method will generally be more efficient than + * normalizing each point separately. + * + * @param points + * An array of points that will be updated in place with their normalized versions, + * where necessary + */ + public virtual void NormalizeAll(ECPoint[] points) + { + NormalizeAll(points, 0, points.Length, null); + } + + /** + * Normalization ensures that any projective coordinate is 1, and therefore that the x, y + * coordinates reflect those of the equivalent point in an affine coordinate system. Where more + * than one point is to be normalized, this method will generally be more efficient than + * normalizing each point separately. An (optional) z-scaling factor can be applied; effectively + * each z coordinate is scaled by this value prior to normalization (but only one + * actual multiplication is needed). + * + * @param points + * An array of points that will be updated in place with their normalized versions, + * where necessary + * @param off + * The start of the range of points to normalize + * @param len + * The length of the range of points to normalize + * @param iso + * The (optional) z-scaling factor - can be null + */ + public virtual void NormalizeAll(ECPoint[] points, int off, int len, ECFieldElement iso) + { + CheckPoints(points, off, len); + + switch (this.CoordinateSystem) + { + case ECCurve.COORD_AFFINE: + case ECCurve.COORD_LAMBDA_AFFINE: + { + if (iso != null) + throw new ArgumentException("not valid for affine coordinates", "iso"); + + return; + } + } + + /* + * Figure out which of the points actually need to be normalized + */ + ECFieldElement[] zs = new ECFieldElement[len]; + int[] indices = new int[len]; + int count = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + if (null != p && (iso != null || !p.IsNormalized())) + { + zs[count] = p.GetZCoord(0); + indices[count++] = off + i; + } + } + + if (count == 0) + { + return; + } + + ECAlgorithms.MontgomeryTrick(zs, 0, count, iso); + + for (int j = 0; j < count; ++j) + { + int index = indices[j]; + points[index] = points[index].Normalize(zs[j]); + } + } + + public abstract ECPoint Infinity { get; } + + public virtual IFiniteField Field + { + get { return m_field; } + } + + public virtual ECFieldElement A + { + get { return m_a; } + } + + public virtual ECFieldElement B + { + get { return m_b; } + } + + public virtual BigInteger Order + { + get { return m_order; } + } + + public virtual BigInteger Cofactor + { + get { return m_cofactor; } + } + + public virtual int CoordinateSystem + { + get { return m_coord; } + } + + /** + * Create a cache-safe lookup table for the specified sequence of points. All the points MUST + * belong to this ECCurve instance, and MUST already be normalized. + */ + public virtual ECLookupTable CreateCacheSafeLookupTable(ECPoint[] points, int off, int len) + { + int FE_BYTES = (FieldSize + 7) / 8; + byte[] table = new byte[len * FE_BYTES * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + byte[] px = p.RawXCoord.ToBigInteger().ToByteArray(); + byte[] py = p.RawYCoord.ToBigInteger().ToByteArray(); + + int pxStart = px.Length > FE_BYTES ? 1 : 0, pxLen = px.Length - pxStart; + int pyStart = py.Length > FE_BYTES ? 1 : 0, pyLen = py.Length - pyStart; + + Array.Copy(px, pxStart, table, pos + FE_BYTES - pxLen, pxLen); pos += FE_BYTES; + Array.Copy(py, pyStart, table, pos + FE_BYTES - pyLen, pyLen); pos += FE_BYTES; + } + } + + return new DefaultLookupTable(this, table, len); + } + + protected virtual void CheckPoint(ECPoint point) + { + if (null == point || (this != point.Curve)) + throw new ArgumentException("must be non-null and on this curve", "point"); + } + + protected virtual void CheckPoints(ECPoint[] points) + { + CheckPoints(points, 0, points.Length); + } + + protected virtual void CheckPoints(ECPoint[] points, int off, int len) + { + if (points == null) + throw new ArgumentNullException("points"); + if (off < 0 || len < 0 || (off > (points.Length - len))) + throw new ArgumentException("invalid range specified", "points"); + + for (int i = 0; i < len; ++i) + { + ECPoint point = points[off + i]; + if (null != point && this != point.Curve) + throw new ArgumentException("entries must be null or on this curve", "points"); + } + } + + public virtual bool Equals(ECCurve other) + { + if (this == other) + return true; + if (null == other) + return false; + return Field.Equals(other.Field) + && A.ToBigInteger().Equals(other.A.ToBigInteger()) + && B.ToBigInteger().Equals(other.B.ToBigInteger()); + } + + public override bool Equals(object obj) + { + return Equals(obj as ECCurve); + } + + public override int GetHashCode() + { + return Field.GetHashCode() + ^ Integers.RotateLeft(A.ToBigInteger().GetHashCode(), 8) + ^ Integers.RotateLeft(B.ToBigInteger().GetHashCode(), 16); + } + + protected abstract ECPoint DecompressPoint(int yTilde, BigInteger X1); + + public virtual ECEndomorphism GetEndomorphism() + { + return m_endomorphism; + } + + /** + * Sets the default ECMultiplier, unless already set. + */ + public virtual ECMultiplier GetMultiplier() + { + lock (this) + { + if (this.m_multiplier == null) + { + this.m_multiplier = CreateDefaultMultiplier(); + } + return this.m_multiplier; + } + } + + /** + * Decode a point on this curve from its ASN.1 encoding. The different + * encodings are taken account of, including point compression for + * Fp (X9.62 s 4.2.1 pg 17). + * @return The decoded point. + */ + public virtual ECPoint DecodePoint(byte[] encoded) + { + ECPoint p = null; + int expectedLength = (FieldSize + 7) / 8; + + byte type = encoded[0]; + switch (type) + { + case 0x00: // infinity + { + if (encoded.Length != 1) + throw new ArgumentException("Incorrect length for infinity encoding", "encoded"); + + p = Infinity; + break; + } + + case 0x02: // compressed + case 0x03: // compressed + { + if (encoded.Length != (expectedLength + 1)) + throw new ArgumentException("Incorrect length for compressed encoding", "encoded"); + + int yTilde = type & 1; + BigInteger X = new BigInteger(1, encoded, 1, expectedLength); + + p = DecompressPoint(yTilde, X); + if (!p.ImplIsValid(true, true)) + throw new ArgumentException("Invalid point"); + + break; + } + + case 0x04: // uncompressed + { + if (encoded.Length != (2 * expectedLength + 1)) + throw new ArgumentException("Incorrect length for uncompressed encoding", "encoded"); + + BigInteger X = new BigInteger(1, encoded, 1, expectedLength); + BigInteger Y = new BigInteger(1, encoded, 1 + expectedLength, expectedLength); + + p = ValidatePoint(X, Y); + break; + } + + case 0x06: // hybrid + case 0x07: // hybrid + { + if (encoded.Length != (2 * expectedLength + 1)) + throw new ArgumentException("Incorrect length for hybrid encoding", "encoded"); + + BigInteger X = new BigInteger(1, encoded, 1, expectedLength); + BigInteger Y = new BigInteger(1, encoded, 1 + expectedLength, expectedLength); + + if (Y.TestBit(0) != (type == 0x07)) + throw new ArgumentException("Inconsistent Y coordinate in hybrid encoding", "encoded"); + + p = ValidatePoint(X, Y); + break; + } + + default: + throw new FormatException("Invalid point encoding " + type); + } + + if (type != 0x00 && p.IsInfinity) + throw new ArgumentException("Invalid infinity encoding", "encoded"); + + return p; + } + + private class DefaultLookupTable + : ECLookupTable + { + private readonly ECCurve m_outer; + private readonly byte[] m_table; + private readonly int m_size; + + internal DefaultLookupTable(ECCurve outer, byte[] table, int size) + { + this.m_outer = outer; + this.m_table = table; + this.m_size = size; + } + + public virtual int Size + { + get { return m_size; } + } + + public virtual ECPoint Lookup(int index) + { + int FE_BYTES = (m_outer.FieldSize + 7) / 8; + byte[] x = new byte[FE_BYTES], y = new byte[FE_BYTES]; + int pos = 0; + + for (int i = 0; i < m_size; ++i) + { + byte MASK = (byte)(((i ^ index) - 1) >> 31); + + for (int j = 0; j < FE_BYTES; ++j) + { + x[j] ^= (byte)(m_table[pos + j] & MASK); + y[j] ^= (byte)(m_table[pos + FE_BYTES + j] & MASK); + } + + pos += (FE_BYTES * 2); + } + + ECFieldElement X = m_outer.FromBigInteger(new BigInteger(1, x)); + ECFieldElement Y = m_outer.FromBigInteger(new BigInteger(1, y)); + return m_outer.CreateRawPoint(X, Y, false); + } + } + } + + internal abstract class AbstractFpCurve + : ECCurve + { + protected AbstractFpCurve(BigInteger q) + : base(FiniteFields.GetPrimeField(q)) + { + } + + public override bool IsValidFieldElement(BigInteger x) + { + return x != null && x.SignValue >= 0 && x.CompareTo(Field.Characteristic) < 0; + } + + protected override ECPoint DecompressPoint(int yTilde, BigInteger X1) + { + ECFieldElement x = FromBigInteger(X1); + ECFieldElement rhs = x.Square().Add(A).Multiply(x).Add(B); + ECFieldElement y = rhs.Sqrt(); + + /* + * If y is not a square, then we haven't got a point on the curve + */ + if (y == null) + throw new ArgumentException("Invalid point compression"); + + if (y.TestBitZero() != (yTilde == 1)) + { + // Use the other root + y = y.Negate(); + } + + return CreateRawPoint(x, y, true); + } + } + + /** + * Elliptic curve over Fp + */ + internal class FpCurve + : AbstractFpCurve + { + private const int FP_DEFAULT_COORDS = COORD_JACOBIAN_MODIFIED; + + protected readonly BigInteger m_q, m_r; + protected readonly FpPoint m_infinity; + + public FpCurve(BigInteger q, BigInteger a, BigInteger b) + : this(q, a, b, null, null) + { + } + + public FpCurve(BigInteger q, BigInteger a, BigInteger b, BigInteger order, BigInteger cofactor) + : base(q) + { + this.m_q = q; + this.m_r = FpFieldElement.CalculateResidue(q); + this.m_infinity = new FpPoint(this, null, null, false); + + this.m_a = FromBigInteger(a); + this.m_b = FromBigInteger(b); + this.m_order = order; + this.m_cofactor = cofactor; + this.m_coord = FP_DEFAULT_COORDS; + } + + protected FpCurve(BigInteger q, BigInteger r, ECFieldElement a, ECFieldElement b) + : this(q, r, a, b, null, null) + { + } + + protected FpCurve(BigInteger q, BigInteger r, ECFieldElement a, ECFieldElement b, BigInteger order, BigInteger cofactor) + : base(q) + { + this.m_q = q; + this.m_r = r; + this.m_infinity = new FpPoint(this, null, null, false); + + this.m_a = a; + this.m_b = b; + this.m_order = order; + this.m_cofactor = cofactor; + this.m_coord = FP_DEFAULT_COORDS; + } + + protected override ECCurve CloneCurve() + { + return new FpCurve(m_q, m_r, m_a, m_b, m_order, m_cofactor); + } + + public override bool SupportsCoordinateSystem(int coord) + { + switch (coord) + { + case COORD_AFFINE: + case COORD_HOMOGENEOUS: + case COORD_JACOBIAN: + case COORD_JACOBIAN_MODIFIED: + return true; + default: + return false; + } + } + + public virtual BigInteger Q + { + get { return m_q; } + } + + public override ECPoint Infinity + { + get { return m_infinity; } + } + + public override int FieldSize + { + get { return m_q.BitLength; } + } + + public override ECFieldElement FromBigInteger(BigInteger x) + { + return new FpFieldElement(this.m_q, this.m_r, x); + } + + protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression) + { + return new FpPoint(this, x, y, withCompression); + } + + protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + { + return new FpPoint(this, x, y, zs, withCompression); + } + + public override ECPoint ImportPoint(ECPoint p) + { + if (this != p.Curve && this.CoordinateSystem == COORD_JACOBIAN && !p.IsInfinity) + { + switch (p.Curve.CoordinateSystem) + { + case COORD_JACOBIAN: + case COORD_JACOBIAN_CHUDNOVSKY: + case COORD_JACOBIAN_MODIFIED: + return new FpPoint(this, + FromBigInteger(p.RawXCoord.ToBigInteger()), + FromBigInteger(p.RawYCoord.ToBigInteger()), + new ECFieldElement[] { FromBigInteger(p.GetZCoord(0).ToBigInteger()) }, + p.IsCompressed); + default: + break; + } + } + + return base.ImportPoint(p); + } + } + + internal abstract class AbstractF2mCurve + : ECCurve + { + public static BigInteger Inverse(int m, int[] ks, BigInteger x) + { + return new LongArray(x).ModInverse(m, ks).ToBigInteger(); + } + + /** + * The auxiliary values s0 and + * s1 used for partial modular reduction for + * Koblitz curves. + */ + private BigInteger[] si = null; + + private static IFiniteField BuildField(int m, int k1, int k2, int k3) + { + if (k1 == 0) + { + throw new ArgumentException("k1 must be > 0"); + } + + if (k2 == 0) + { + if (k3 != 0) + { + throw new ArgumentException("k3 must be 0 if k2 == 0"); + } + + return FiniteFields.GetBinaryExtensionField(new int[]{ 0, k1, m }); + } + + if (k2 <= k1) + { + throw new ArgumentException("k2 must be > k1"); + } + + if (k3 <= k2) + { + throw new ArgumentException("k3 must be > k2"); + } + + return FiniteFields.GetBinaryExtensionField(new int[]{ 0, k1, k2, k3, m }); + } + + protected AbstractF2mCurve(int m, int k1, int k2, int k3) + : base(BuildField(m, k1, k2, k3)) + { + } + + public override bool IsValidFieldElement(BigInteger x) + { + return x != null && x.SignValue >= 0 && x.BitLength <= FieldSize; + } + + public override ECPoint CreatePoint(BigInteger x, BigInteger y, bool withCompression) + { + ECFieldElement X = FromBigInteger(x), Y = FromBigInteger(y); + + switch (this.CoordinateSystem) + { + case COORD_LAMBDA_AFFINE: + case COORD_LAMBDA_PROJECTIVE: + { + if (X.IsZero) + { + if (!Y.Square().Equals(B)) + throw new ArgumentException(); + } + else + { + // Y becomes Lambda (X + Y/X) here + Y = Y.Divide(X).Add(X); + } + break; + } + default: + { + break; + } + } + + return CreateRawPoint(X, Y, withCompression); + } + + protected override ECPoint DecompressPoint(int yTilde, BigInteger X1) + { + ECFieldElement xp = FromBigInteger(X1), yp = null; + if (xp.IsZero) + { + yp = B.Sqrt(); + } + else + { + ECFieldElement beta = xp.Square().Invert().Multiply(B).Add(A).Add(xp); + ECFieldElement z = SolveQuadraticEquation(beta); + + if (z != null) + { + if (z.TestBitZero() != (yTilde == 1)) + { + z = z.AddOne(); + } + + switch (this.CoordinateSystem) + { + case COORD_LAMBDA_AFFINE: + case COORD_LAMBDA_PROJECTIVE: + { + yp = z.Add(xp); + break; + } + default: + { + yp = z.Multiply(xp); + break; + } + } + } + } + + if (yp == null) + throw new ArgumentException("Invalid point compression"); + + return CreateRawPoint(xp, yp, true); + } + + /** + * Solves a quadratic equation z2 + z = beta(X9.62 + * D.1.6) The other solution is z + 1. + * + * @param beta + * The value to solve the quadratic equation for. + * @return the solution for z2 + z = beta or + * null if no solution exists. + */ + internal ECFieldElement SolveQuadraticEquation(ECFieldElement beta) + { + if (beta.IsZero) + return beta; + + ECFieldElement gamma, z, zeroElement = FromBigInteger(BigInteger.Zero); + + int m = FieldSize; + do + { + ECFieldElement t = FromBigInteger(BigInteger.Arbitrary(m)); + z = zeroElement; + ECFieldElement w = beta; + for (int i = 1; i < m; i++) + { + ECFieldElement w2 = w.Square(); + z = z.Square().Add(w2.Multiply(t)); + w = w2.Add(beta); + } + if (!w.IsZero) + { + return null; + } + gamma = z.Square().Add(z); + } + while (gamma.IsZero); + + return z; + } + + /** + * @return the auxiliary values s0 and + * s1 used for partial modular reduction for + * Koblitz curves. + */ + internal virtual BigInteger[] GetSi() + { + if (si == null) + { + lock (this) + { + if (si == null) + { + si = Tnaf.GetSi(this); + } + } + } + return si; + } + + /** + * Returns true if this is a Koblitz curve (ABC curve). + * @return true if this is a Koblitz curve (ABC curve), false otherwise + */ + public virtual bool IsKoblitz + { + get + { + return m_order != null && m_cofactor != null && m_b.IsOne && (m_a.IsZero || m_a.IsOne); + } + } + } + + /** + * Elliptic curves over F2m. The Weierstrass equation is given by + * y2 + xy = x3 + ax2 + b. + */ + internal class F2mCurve + : AbstractF2mCurve + { + private const int F2M_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE; + + /** + * The exponent m of F2m. + */ + private readonly int m; + + /** + * TPB: The integer k where xm + + * xk + 1 represents the reduction polynomial + * f(z).
    + * PPB: The integer k1 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z).
    + */ + private readonly int k1; + + /** + * TPB: Always set to 0
    + * PPB: The integer k2 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z).
    + */ + private readonly int k2; + + /** + * TPB: Always set to 0
    + * PPB: The integer k3 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z).
    + */ + private readonly int k3; + + /** + * The point at infinity on this curve. + */ + protected readonly F2mPoint m_infinity; + + /** + * Constructor for Trinomial Polynomial Basis (TPB). + * @param m The exponent m of + * F2m. + * @param k The integer k where xm + + * xk + 1 represents the reduction + * polynomial f(z). + * @param a The coefficient a in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + * @param b The coefficient b in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + */ + [Obsolete("Use constructor taking order/cofactor")] + public F2mCurve( + int m, + int k, + BigInteger a, + BigInteger b) + : this(m, k, 0, 0, a, b, null, null) + { + } + + /** + * Constructor for Trinomial Polynomial Basis (TPB). + * @param m The exponent m of + * F2m. + * @param k The integer k where xm + + * xk + 1 represents the reduction + * polynomial f(z). + * @param a The coefficient a in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + * @param b The coefficient b in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + * @param order The order of the main subgroup of the elliptic curve. + * @param cofactor The cofactor of the elliptic curve, i.e. + * #Ea(F2m) = h * n. + */ + public F2mCurve( + int m, + int k, + BigInteger a, + BigInteger b, + BigInteger order, + BigInteger cofactor) + : this(m, k, 0, 0, a, b, order, cofactor) + { + } + + /** + * Constructor for Pentanomial Polynomial Basis (PPB). + * @param m The exponent m of + * F2m. + * @param k1 The integer k1 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param k2 The integer k2 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param k3 The integer k3 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param a The coefficient a in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + * @param b The coefficient b in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + */ + [Obsolete("Use constructor taking order/cofactor")] + public F2mCurve( + int m, + int k1, + int k2, + int k3, + BigInteger a, + BigInteger b) + : this(m, k1, k2, k3, a, b, null, null) + { + } + + /** + * Constructor for Pentanomial Polynomial Basis (PPB). + * @param m The exponent m of + * F2m. + * @param k1 The integer k1 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param k2 The integer k2 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param k3 The integer k3 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param a The coefficient a in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + * @param b The coefficient b in the Weierstrass equation + * for non-supersingular elliptic curves over + * F2m. + * @param order The order of the main subgroup of the elliptic curve. + * @param cofactor The cofactor of the elliptic curve, i.e. + * #Ea(F2m) = h * n. + */ + public F2mCurve( + int m, + int k1, + int k2, + int k3, + BigInteger a, + BigInteger b, + BigInteger order, + BigInteger cofactor) + : base(m, k1, k2, k3) + { + this.m = m; + this.k1 = k1; + this.k2 = k2; + this.k3 = k3; + this.m_order = order; + this.m_cofactor = cofactor; + this.m_infinity = new F2mPoint(this, null, null, false); + + if (k1 == 0) + throw new ArgumentException("k1 must be > 0"); + + if (k2 == 0) + { + if (k3 != 0) + throw new ArgumentException("k3 must be 0 if k2 == 0"); + } + else + { + if (k2 <= k1) + throw new ArgumentException("k2 must be > k1"); + + if (k3 <= k2) + throw new ArgumentException("k3 must be > k2"); + } + + this.m_a = FromBigInteger(a); + this.m_b = FromBigInteger(b); + this.m_coord = F2M_DEFAULT_COORDS; + } + + protected F2mCurve(int m, int k1, int k2, int k3, ECFieldElement a, ECFieldElement b, BigInteger order, BigInteger cofactor) + : base(m, k1, k2, k3) + { + this.m = m; + this.k1 = k1; + this.k2 = k2; + this.k3 = k3; + this.m_order = order; + this.m_cofactor = cofactor; + + this.m_infinity = new F2mPoint(this, null, null, false); + this.m_a = a; + this.m_b = b; + this.m_coord = F2M_DEFAULT_COORDS; + } + + protected override ECCurve CloneCurve() + { + return new F2mCurve(m, k1, k2, k3, m_a, m_b, m_order, m_cofactor); + } + + public override bool SupportsCoordinateSystem(int coord) + { + switch (coord) + { + case COORD_AFFINE: + case COORD_HOMOGENEOUS: + case COORD_LAMBDA_PROJECTIVE: + return true; + default: + return false; + } + } + + protected override ECMultiplier CreateDefaultMultiplier() + { + if (IsKoblitz) + { + return new WTauNafMultiplier(); + } + + return base.CreateDefaultMultiplier(); + } + + public override int FieldSize + { + get { return m; } + } + + public override ECFieldElement FromBigInteger(BigInteger x) + { + return new F2mFieldElement(this.m, this.k1, this.k2, this.k3, x); + } + + protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression) + { + return new F2mPoint(this, x, y, withCompression); + } + + protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + { + return new F2mPoint(this, x, y, zs, withCompression); + } + + public override ECPoint Infinity + { + get { return m_infinity; } + } + + public int M + { + get { return m; } + } + + /** + * Return true if curve uses a Trinomial basis. + * + * @return true if curve Trinomial, false otherwise. + */ + public bool IsTrinomial() + { + return k2 == 0 && k3 == 0; + } + + public int K1 + { + get { return k1; } + } + + public int K2 + { + get { return k2; } + } + + public int K3 + { + get { return k3; } + } + + public override ECLookupTable CreateCacheSafeLookupTable(ECPoint[] points, int off, int len) + { + int FE_LONGS = (m + 63) / 64; + + long[] table = new long[len * FE_LONGS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + ((F2mFieldElement)p.RawXCoord).x.CopyTo(table, pos); pos += FE_LONGS; + ((F2mFieldElement)p.RawYCoord).x.CopyTo(table, pos); pos += FE_LONGS; + } + } + + return new DefaultF2mLookupTable(this, table, len); + } + + private class DefaultF2mLookupTable + : ECLookupTable + { + private readonly F2mCurve m_outer; + private readonly long[] m_table; + private readonly int m_size; + + internal DefaultF2mLookupTable(F2mCurve outer, long[] table, int size) + { + this.m_outer = outer; + this.m_table = table; + this.m_size = size; + } + + public virtual int Size + { + get { return m_size; } + } + + public virtual ECPoint Lookup(int index) + { + int m = m_outer.m; + int[] ks = m_outer.IsTrinomial() ? new int[]{ m_outer.k1 } : new int[]{ m_outer.k1, m_outer.k2, m_outer.k3 }; + + int FE_LONGS = (m_outer.m + 63) / 64; + long[] x = new long[FE_LONGS], y = new long[FE_LONGS]; + int pos = 0; + + for (int i = 0; i < m_size; ++i) + { + long MASK =((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_LONGS; ++j) + { + x[j] ^= m_table[pos + j] & MASK; + y[j] ^= m_table[pos + FE_LONGS + j] & MASK; + } + + pos += (FE_LONGS * 2); + } + + ECFieldElement X = new F2mFieldElement(m, ks, new LongArray(x)); + ECFieldElement Y = new F2mFieldElement(m, ks, new LongArray(y)); + return m_outer.CreateRawPoint(X, Y, false); + } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECFieldElement.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECFieldElement.cs new file mode 100644 index 00000000..3ebb3332 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECFieldElement.cs @@ -0,0 +1,972 @@ +using System; +using System.Diagnostics; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.Raw; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC +{ + internal abstract class ECFieldElement + { + public abstract BigInteger ToBigInteger(); + public abstract string FieldName { get; } + public abstract int FieldSize { get; } + public abstract ECFieldElement Add(ECFieldElement b); + public abstract ECFieldElement AddOne(); + public abstract ECFieldElement Subtract(ECFieldElement b); + public abstract ECFieldElement Multiply(ECFieldElement b); + public abstract ECFieldElement Divide(ECFieldElement b); + public abstract ECFieldElement Negate(); + public abstract ECFieldElement Square(); + public abstract ECFieldElement Invert(); + public abstract ECFieldElement Sqrt(); + + public virtual int BitLength + { + get { return ToBigInteger().BitLength; } + } + + public virtual bool IsOne + { + get { return BitLength == 1; } + } + + public virtual bool IsZero + { + get { return 0 == ToBigInteger().SignValue; } + } + + public virtual ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) + { + return Multiply(b).Subtract(x.Multiply(y)); + } + + public virtual ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) + { + return Multiply(b).Add(x.Multiply(y)); + } + + public virtual ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y) + { + return Square().Subtract(x.Multiply(y)); + } + + public virtual ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y) + { + return Square().Add(x.Multiply(y)); + } + + public virtual ECFieldElement SquarePow(int pow) + { + ECFieldElement r = this; + for (int i = 0; i < pow; ++i) + { + r = r.Square(); + } + return r; + } + + public virtual bool TestBitZero() + { + return ToBigInteger().TestBit(0); + } + + public override bool Equals(object obj) + { + return Equals(obj as ECFieldElement); + } + + public virtual bool Equals(ECFieldElement other) + { + if (this == other) + return true; + if (null == other) + return false; + return ToBigInteger().Equals(other.ToBigInteger()); + } + + public override int GetHashCode() + { + return ToBigInteger().GetHashCode(); + } + + public override string ToString() + { + return this.ToBigInteger().ToString(16); + } + + public virtual byte[] GetEncoded() + { + return BigIntegers.AsUnsignedByteArray((FieldSize + 7) / 8, ToBigInteger()); + } + } + + internal abstract class AbstractFpFieldElement + : ECFieldElement + { + } + + internal class FpFieldElement + : AbstractFpFieldElement + { + private readonly BigInteger q, r, x; + + internal static BigInteger CalculateResidue(BigInteger p) + { + int bitLength = p.BitLength; + if (bitLength >= 96) + { + BigInteger firstWord = p.ShiftRight(bitLength - 64); + if (firstWord.LongValue == -1L) + { + return BigInteger.One.ShiftLeft(bitLength).Subtract(p); + } + if ((bitLength & 7) == 0) + { + return BigInteger.One.ShiftLeft(bitLength << 1).Divide(p).Negate(); + } + } + return null; + } + + [Obsolete("Use ECCurve.FromBigInteger to construct field elements")] + public FpFieldElement(BigInteger q, BigInteger x) + : this(q, CalculateResidue(q), x) + { + } + + internal FpFieldElement(BigInteger q, BigInteger r, BigInteger x) + { + if (x == null || x.SignValue < 0 || x.CompareTo(q) >= 0) + throw new ArgumentException("value invalid in Fp field element", "x"); + + this.q = q; + this.r = r; + this.x = x; + } + + public override BigInteger ToBigInteger() + { + return x; + } + + /** + * return the field name for this field. + * + * @return the string "Fp". + */ + public override string FieldName + { + get { return "Fp"; } + } + + public override int FieldSize + { + get { return q.BitLength; } + } + + public BigInteger Q + { + get { return q; } + } + + public override ECFieldElement Add( + ECFieldElement b) + { + return new FpFieldElement(q, r, ModAdd(x, b.ToBigInteger())); + } + + public override ECFieldElement AddOne() + { + BigInteger x2 = x.Add(BigInteger.One); + if (x2.CompareTo(q) == 0) + { + x2 = BigInteger.Zero; + } + return new FpFieldElement(q, r, x2); + } + + public override ECFieldElement Subtract( + ECFieldElement b) + { + return new FpFieldElement(q, r, ModSubtract(x, b.ToBigInteger())); + } + + public override ECFieldElement Multiply( + ECFieldElement b) + { + return new FpFieldElement(q, r, ModMult(x, b.ToBigInteger())); + } + + public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) + { + BigInteger ax = this.x, bx = b.ToBigInteger(), xx = x.ToBigInteger(), yx = y.ToBigInteger(); + BigInteger ab = ax.Multiply(bx); + BigInteger xy = xx.Multiply(yx); + return new FpFieldElement(q, r, ModReduce(ab.Subtract(xy))); + } + + public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) + { + BigInteger ax = this.x, bx = b.ToBigInteger(), xx = x.ToBigInteger(), yx = y.ToBigInteger(); + BigInteger ab = ax.Multiply(bx); + BigInteger xy = xx.Multiply(yx); + BigInteger sum = ab.Add(xy); + if (r != null && r.SignValue < 0 && sum.BitLength > (q.BitLength << 1)) + { + sum = sum.Subtract(q.ShiftLeft(q.BitLength)); + } + return new FpFieldElement(q, r, ModReduce(sum)); + } + + public override ECFieldElement Divide( + ECFieldElement b) + { + return new FpFieldElement(q, r, ModMult(x, ModInverse(b.ToBigInteger()))); + } + + public override ECFieldElement Negate() + { + return x.SignValue == 0 ? this : new FpFieldElement(q, r, q.Subtract(x)); + } + + public override ECFieldElement Square() + { + return new FpFieldElement(q, r, ModMult(x, x)); + } + + public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y) + { + BigInteger ax = this.x, xx = x.ToBigInteger(), yx = y.ToBigInteger(); + BigInteger aa = ax.Multiply(ax); + BigInteger xy = xx.Multiply(yx); + return new FpFieldElement(q, r, ModReduce(aa.Subtract(xy))); + } + + public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y) + { + BigInteger ax = this.x, xx = x.ToBigInteger(), yx = y.ToBigInteger(); + BigInteger aa = ax.Multiply(ax); + BigInteger xy = xx.Multiply(yx); + BigInteger sum = aa.Add(xy); + if (r != null && r.SignValue < 0 && sum.BitLength > (q.BitLength << 1)) + { + sum = sum.Subtract(q.ShiftLeft(q.BitLength)); + } + return new FpFieldElement(q, r, ModReduce(sum)); + } + + public override ECFieldElement Invert() + { + // TODO Modular inversion can be faster for a (Generalized) Mersenne Prime. + return new FpFieldElement(q, r, ModInverse(x)); + } + + /** + * return a sqrt root - the routine verifies that the calculation + * returns the right value - if none exists it returns null. + */ + public override ECFieldElement Sqrt() + { + if (IsZero || IsOne) + return this; + + if (!q.TestBit(0)) + throw new NotImplementedException("even value of q"); + + if (q.TestBit(1)) // q == 4m + 3 + { + BigInteger e = q.ShiftRight(2).Add(BigInteger.One); + return CheckSqrt(new FpFieldElement(q, r, x.ModPow(e, q))); + } + + if (q.TestBit(2)) // q == 8m + 5 + { + BigInteger t1 = x.ModPow(q.ShiftRight(3), q); + BigInteger t2 = ModMult(t1, x); + BigInteger t3 = ModMult(t2, t1); + + if (t3.Equals(BigInteger.One)) + { + return CheckSqrt(new FpFieldElement(q, r, t2)); + } + + // TODO This is constant and could be precomputed + BigInteger t4 = BigInteger.Two.ModPow(q.ShiftRight(2), q); + + BigInteger y = ModMult(t2, t4); + + return CheckSqrt(new FpFieldElement(q, r, y)); + } + + // q == 8m + 1 + + BigInteger legendreExponent = q.ShiftRight(1); + if (!(x.ModPow(legendreExponent, q).Equals(BigInteger.One))) + return null; + + BigInteger X = this.x; + BigInteger fourX = ModDouble(ModDouble(X)); ; + + BigInteger k = legendreExponent.Add(BigInteger.One), qMinusOne = q.Subtract(BigInteger.One); + + BigInteger U, V; + do + { + BigInteger P; + do + { + P = BigInteger.Arbitrary(q.BitLength); + } + while (P.CompareTo(q) >= 0 + || !ModReduce(P.Multiply(P).Subtract(fourX)).ModPow(legendreExponent, q).Equals(qMinusOne)); + + BigInteger[] result = LucasSequence(P, X, k); + U = result[0]; + V = result[1]; + + if (ModMult(V, V).Equals(fourX)) + { + return new FpFieldElement(q, r, ModHalfAbs(V)); + } + } + while (U.Equals(BigInteger.One) || U.Equals(qMinusOne)); + + return null; + } + + private ECFieldElement CheckSqrt(ECFieldElement z) + { + return z.Square().Equals(this) ? z : null; + } + + private BigInteger[] LucasSequence( + BigInteger P, + BigInteger Q, + BigInteger k) + { + // TODO Research and apply "common-multiplicand multiplication here" + + int n = k.BitLength; + int s = k.GetLowestSetBit(); + + Debug.Assert(k.TestBit(s)); + + BigInteger Uh = BigInteger.One; + BigInteger Vl = BigInteger.Two; + BigInteger Vh = P; + BigInteger Ql = BigInteger.One; + BigInteger Qh = BigInteger.One; + + for (int j = n - 1; j >= s + 1; --j) + { + Ql = ModMult(Ql, Qh); + + if (k.TestBit(j)) + { + Qh = ModMult(Ql, Q); + Uh = ModMult(Uh, Vh); + Vl = ModReduce(Vh.Multiply(Vl).Subtract(P.Multiply(Ql))); + Vh = ModReduce(Vh.Multiply(Vh).Subtract(Qh.ShiftLeft(1))); + } + else + { + Qh = Ql; + Uh = ModReduce(Uh.Multiply(Vl).Subtract(Ql)); + Vh = ModReduce(Vh.Multiply(Vl).Subtract(P.Multiply(Ql))); + Vl = ModReduce(Vl.Multiply(Vl).Subtract(Ql.ShiftLeft(1))); + } + } + + Ql = ModMult(Ql, Qh); + Qh = ModMult(Ql, Q); + Uh = ModReduce(Uh.Multiply(Vl).Subtract(Ql)); + Vl = ModReduce(Vh.Multiply(Vl).Subtract(P.Multiply(Ql))); + Ql = ModMult(Ql, Qh); + + for (int j = 1; j <= s; ++j) + { + Uh = ModMult(Uh, Vl); + Vl = ModReduce(Vl.Multiply(Vl).Subtract(Ql.ShiftLeft(1))); + Ql = ModMult(Ql, Ql); + } + + return new BigInteger[] { Uh, Vl }; + } + + protected virtual BigInteger ModAdd(BigInteger x1, BigInteger x2) + { + BigInteger x3 = x1.Add(x2); + if (x3.CompareTo(q) >= 0) + { + x3 = x3.Subtract(q); + } + return x3; + } + + protected virtual BigInteger ModDouble(BigInteger x) + { + BigInteger _2x = x.ShiftLeft(1); + if (_2x.CompareTo(q) >= 0) + { + _2x = _2x.Subtract(q); + } + return _2x; + } + + protected virtual BigInteger ModHalf(BigInteger x) + { + if (x.TestBit(0)) + { + x = q.Add(x); + } + return x.ShiftRight(1); + } + + protected virtual BigInteger ModHalfAbs(BigInteger x) + { + if (x.TestBit(0)) + { + x = q.Subtract(x); + } + return x.ShiftRight(1); + } + + protected virtual BigInteger ModInverse(BigInteger x) + { + int bits = FieldSize; + int len = (bits + 31) >> 5; + uint[] p = Nat.FromBigInteger(bits, q); + uint[] n = Nat.FromBigInteger(bits, x); + uint[] z = Nat.Create(len); + Mod.Invert(p, n, z); + return Nat.ToBigInteger(len, z); + } + + protected virtual BigInteger ModMult(BigInteger x1, BigInteger x2) + { + return ModReduce(x1.Multiply(x2)); + } + + protected virtual BigInteger ModReduce(BigInteger x) + { + if (r == null) + { + x = x.Mod(q); + } + else + { + bool negative = x.SignValue < 0; + if (negative) + { + x = x.Abs(); + } + int qLen = q.BitLength; + if (r.SignValue > 0) + { + BigInteger qMod = BigInteger.One.ShiftLeft(qLen); + bool rIsOne = r.Equals(BigInteger.One); + while (x.BitLength > (qLen + 1)) + { + BigInteger u = x.ShiftRight(qLen); + BigInteger v = x.Remainder(qMod); + if (!rIsOne) + { + u = u.Multiply(r); + } + x = u.Add(v); + } + } + else + { + int d = ((qLen - 1) & 31) + 1; + BigInteger mu = r.Negate(); + BigInteger u = mu.Multiply(x.ShiftRight(qLen - d)); + BigInteger quot = u.ShiftRight(qLen + d); + BigInteger v = quot.Multiply(q); + BigInteger bk1 = BigInteger.One.ShiftLeft(qLen + d); + v = v.Remainder(bk1); + x = x.Remainder(bk1); + x = x.Subtract(v); + if (x.SignValue < 0) + { + x = x.Add(bk1); + } + } + while (x.CompareTo(q) >= 0) + { + x = x.Subtract(q); + } + if (negative && x.SignValue != 0) + { + x = q.Subtract(x); + } + } + return x; + } + + protected virtual BigInteger ModSubtract(BigInteger x1, BigInteger x2) + { + BigInteger x3 = x1.Subtract(x2); + if (x3.SignValue < 0) + { + x3 = x3.Add(q); + } + return x3; + } + + public override bool Equals( + object obj) + { + if (obj == this) + return true; + + FpFieldElement other = obj as FpFieldElement; + + if (other == null) + return false; + + return Equals(other); + } + + public virtual bool Equals( + FpFieldElement other) + { + return q.Equals(other.q) && base.Equals(other); + } + + public override int GetHashCode() + { + return q.GetHashCode() ^ base.GetHashCode(); + } + } + + internal abstract class AbstractF2mFieldElement + : ECFieldElement + { + public virtual ECFieldElement HalfTrace() + { + int m = FieldSize; + if ((m & 1) == 0) + throw new InvalidOperationException("Half-trace only defined for odd m"); + + ECFieldElement fe = this; + ECFieldElement ht = fe; + for (int i = 2; i < m; i += 2) + { + fe = fe.SquarePow(2); + ht = ht.Add(fe); + } + + return ht; + } + + public virtual int Trace() + { + int m = FieldSize; + ECFieldElement fe = this; + ECFieldElement tr = fe; + for (int i = 1; i < m; ++i) + { + fe = fe.Square(); + tr = tr.Add(fe); + } + if (tr.IsZero) + return 0; + if (tr.IsOne) + return 1; + + throw new InvalidOperationException("Internal error in trace calculation"); + } + } + + /** + * Class representing the Elements of the finite field + * F2m in polynomial basis (PB) + * representation. Both trinomial (Tpb) and pentanomial (Ppb) polynomial + * basis representations are supported. Gaussian normal basis (GNB) + * representation is not supported. + */ + internal class F2mFieldElement + : AbstractF2mFieldElement + { + /** + * Indicates gaussian normal basis representation (GNB). Number chosen + * according to X9.62. GNB is not implemented at present. + */ + public const int Gnb = 1; + + /** + * Indicates trinomial basis representation (Tpb). Number chosen + * according to X9.62. + */ + public const int Tpb = 2; + + /** + * Indicates pentanomial basis representation (Ppb). Number chosen + * according to X9.62. + */ + public const int Ppb = 3; + + /** + * Tpb or Ppb. + */ + private int representation; + + /** + * The exponent m of F2m. + */ + private int m; + + private int[] ks; + + /** + * The LongArray holding the bits. + */ + internal LongArray x; + + /** + * Constructor for Ppb. + * @param m The exponent m of + * F2m. + * @param k1 The integer k1 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param k2 The integer k2 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param k3 The integer k3 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z). + * @param x The BigInteger representing the value of the field element. + */ + public F2mFieldElement( + int m, + int k1, + int k2, + int k3, + BigInteger x) + { + if (x == null || x.SignValue < 0 || x.BitLength > m) + throw new ArgumentException("value invalid in F2m field element", "x"); + + if ((k2 == 0) && (k3 == 0)) + { + this.representation = Tpb; + this.ks = new int[] { k1 }; + } + else + { + if (k2 >= k3) + throw new ArgumentException("k2 must be smaller than k3"); + if (k2 <= 0) + throw new ArgumentException("k2 must be larger than 0"); + + this.representation = Ppb; + this.ks = new int[] { k1, k2, k3 }; + } + + this.m = m; + this.x = new LongArray(x); + } + + /** + * Constructor for Tpb. + * @param m The exponent m of + * F2m. + * @param k The integer k where xm + + * xk + 1 represents the reduction + * polynomial f(z). + * @param x The BigInteger representing the value of the field element. + */ + public F2mFieldElement( + int m, + int k, + BigInteger x) + : this(m, k, 0, 0, x) + { + // Set k1 to k, and set k2 and k3 to 0 + } + + internal F2mFieldElement(int m, int[] ks, LongArray x) + { + this.m = m; + this.representation = (ks.Length == 1) ? Tpb : Ppb; + this.ks = ks; + this.x = x; + } + + public override int BitLength + { + get { return x.Degree(); } + } + + public override bool IsOne + { + get { return x.IsOne(); } + } + + public override bool IsZero + { + get { return x.IsZero(); } + } + + public override bool TestBitZero() + { + return x.TestBitZero(); + } + + public override BigInteger ToBigInteger() + { + return x.ToBigInteger(); + } + + public override string FieldName + { + get { return "F2m"; } + } + + public override int FieldSize + { + get { return m; } + } + + /** + * Checks, if the ECFieldElements a and b + * are elements of the same field F2m + * (having the same representation). + * @param a field element. + * @param b field element to be compared. + * @throws ArgumentException if a and b + * are not elements of the same field + * F2m (having the same + * representation). + */ + public static void CheckFieldElements( + ECFieldElement a, + ECFieldElement b) + { + if (!(a is F2mFieldElement) || !(b is F2mFieldElement)) + { + throw new ArgumentException("Field elements are not " + + "both instances of F2mFieldElement"); + } + + F2mFieldElement aF2m = (F2mFieldElement)a; + F2mFieldElement bF2m = (F2mFieldElement)b; + + if (aF2m.representation != bF2m.representation) + { + // Should never occur + throw new ArgumentException("One of the F2m field elements has incorrect representation"); + } + + if ((aF2m.m != bF2m.m) || !Arrays.AreEqual(aF2m.ks, bF2m.ks)) + { + throw new ArgumentException("Field elements are not elements of the same field F2m"); + } + } + + public override ECFieldElement Add( + ECFieldElement b) + { + // No check performed here for performance reasons. Instead the + // elements involved are checked in ECPoint.F2m + // checkFieldElements(this, b); + LongArray iarrClone = this.x.Copy(); + F2mFieldElement bF2m = (F2mFieldElement)b; + iarrClone.AddShiftedByWords(bF2m.x, 0); + return new F2mFieldElement(m, ks, iarrClone); + } + + public override ECFieldElement AddOne() + { + return new F2mFieldElement(m, ks, x.AddOne()); + } + + public override ECFieldElement Subtract( + ECFieldElement b) + { + // Addition and subtraction are the same in F2m + return Add(b); + } + + public override ECFieldElement Multiply( + ECFieldElement b) + { + // Right-to-left comb multiplication in the LongArray + // Input: Binary polynomials a(z) and b(z) of degree at most m-1 + // Output: c(z) = a(z) * b(z) mod f(z) + + // No check performed here for performance reasons. Instead the + // elements involved are checked in ECPoint.F2m + // checkFieldElements(this, b); + return new F2mFieldElement(m, ks, x.ModMultiply(((F2mFieldElement)b).x, m, ks)); + } + + public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) + { + return MultiplyPlusProduct(b, x, y); + } + + public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) + { + LongArray ax = this.x, bx = ((F2mFieldElement)b).x, xx = ((F2mFieldElement)x).x, yx = ((F2mFieldElement)y).x; + + LongArray ab = ax.Multiply(bx, m, ks); + LongArray xy = xx.Multiply(yx, m, ks); + + if (ab == ax || ab == bx) + { + ab = (LongArray)ab.Copy(); + } + + ab.AddShiftedByWords(xy, 0); + ab.Reduce(m, ks); + + return new F2mFieldElement(m, ks, ab); + } + + public override ECFieldElement Divide( + ECFieldElement b) + { + // There may be more efficient implementations + ECFieldElement bInv = b.Invert(); + return Multiply(bInv); + } + + public override ECFieldElement Negate() + { + // -x == x holds for all x in F2m + return this; + } + + public override ECFieldElement Square() + { + return new F2mFieldElement(m, ks, x.ModSquare(m, ks)); + } + + public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y) + { + return SquarePlusProduct(x, y); + } + + public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y) + { + LongArray ax = this.x, xx = ((F2mFieldElement)x).x, yx = ((F2mFieldElement)y).x; + + LongArray aa = ax.Square(m, ks); + LongArray xy = xx.Multiply(yx, m, ks); + + if (aa == ax) + { + aa = (LongArray)aa.Copy(); + } + + aa.AddShiftedByWords(xy, 0); + aa.Reduce(m, ks); + + return new F2mFieldElement(m, ks, aa); + } + + public override ECFieldElement SquarePow(int pow) + { + return pow < 1 ? this : new F2mFieldElement(m, ks, x.ModSquareN(pow, m, ks)); + } + + public override ECFieldElement Invert() + { + return new F2mFieldElement(this.m, this.ks, this.x.ModInverse(m, ks)); + } + + public override ECFieldElement Sqrt() + { + return (x.IsZero() || x.IsOne()) ? this : SquarePow(m - 1); + } + + /** + * @return the representation of the field + * F2m, either of + * {@link F2mFieldElement.Tpb} (trinomial + * basis representation) or + * {@link F2mFieldElement.Ppb} (pentanomial + * basis representation). + */ + public int Representation + { + get { return this.representation; } + } + + /** + * @return the degree m of the reduction polynomial + * f(z). + */ + public int M + { + get { return this.m; } + } + + /** + * @return Tpb: The integer k where xm + + * xk + 1 represents the reduction polynomial + * f(z).
    + * Ppb: The integer k1 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z).
    + */ + public int K1 + { + get { return this.ks[0]; } + } + + /** + * @return Tpb: Always returns 0
    + * Ppb: The integer k2 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z).
    + */ + public int K2 + { + get { return this.ks.Length >= 2 ? this.ks[1] : 0; } + } + + /** + * @return Tpb: Always set to 0
    + * Ppb: The integer k3 where xm + + * xk3 + xk2 + xk1 + 1 + * represents the reduction polynomial f(z).
    + */ + public int K3 + { + get { return this.ks.Length >= 3 ? this.ks[2] : 0; } + } + + public override bool Equals( + object obj) + { + if (obj == this) + return true; + + F2mFieldElement other = obj as F2mFieldElement; + + if (other == null) + return false; + + return Equals(other); + } + + public virtual bool Equals( + F2mFieldElement other) + { + return ((this.m == other.m) + && (this.representation == other.representation) + && Arrays.AreEqual(this.ks, other.ks) + && (this.x.Equals(other.x))); + } + + public override int GetHashCode() + { + return x.GetHashCode() ^ m ^ Arrays.GetHashCode(ks); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECLookupTable.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECLookupTable.cs new file mode 100644 index 00000000..0b9a3999 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECLookupTable.cs @@ -0,0 +1,10 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC +{ + internal interface ECLookupTable + { + int Size { get; } + ECPoint Lookup(int index); + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECPoint.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECPoint.cs new file mode 100644 index 00000000..3a93c3e7 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECPoint.cs @@ -0,0 +1,2122 @@ +using System; +using System.Collections; +using System.Diagnostics; +using System.Text; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC +{ + /** + * base class for points on elliptic curves. + */ + internal abstract class ECPoint + { + protected static ECFieldElement[] EMPTY_ZS = new ECFieldElement[0]; + + protected static ECFieldElement[] GetInitialZCoords(ECCurve curve) + { + // Cope with null curve, most commonly used by implicitlyCa + int coord = null == curve ? ECCurve.COORD_AFFINE : curve.CoordinateSystem; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + case ECCurve.COORD_LAMBDA_AFFINE: + return EMPTY_ZS; + default: + break; + } + + ECFieldElement one = curve.FromBigInteger(BigInteger.One); + + switch (coord) + { + case ECCurve.COORD_HOMOGENEOUS: + case ECCurve.COORD_JACOBIAN: + case ECCurve.COORD_LAMBDA_PROJECTIVE: + return new ECFieldElement[] { one }; + case ECCurve.COORD_JACOBIAN_CHUDNOVSKY: + return new ECFieldElement[] { one, one, one }; + case ECCurve.COORD_JACOBIAN_MODIFIED: + return new ECFieldElement[] { one, curve.A }; + default: + throw new ArgumentException("unknown coordinate system"); + } + } + + protected internal readonly ECCurve m_curve; + protected internal readonly ECFieldElement m_x, m_y; + protected internal readonly ECFieldElement[] m_zs; + protected internal readonly bool m_withCompression; + + // Dictionary is (string -> PreCompInfo) + protected internal IDictionary m_preCompTable = null; + + protected ECPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression) + : this(curve, x, y, GetInitialZCoords(curve), withCompression) + { + } + + internal ECPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + { + this.m_curve = curve; + this.m_x = x; + this.m_y = y; + this.m_zs = zs; + this.m_withCompression = withCompression; + } + + protected abstract bool SatisfiesCurveEquation(); + + protected virtual bool SatisfiesOrder() + { + if (BigInteger.One.Equals(Curve.Cofactor)) + return true; + + BigInteger n = Curve.Order; + + // TODO Require order to be available for all curves + + return n == null || ECAlgorithms.ReferenceMultiply(this, n).IsInfinity; + } + + public ECPoint GetDetachedPoint() + { + return Normalize().Detach(); + } + + public virtual ECCurve Curve + { + get { return m_curve; } + } + + protected abstract ECPoint Detach(); + + protected virtual int CurveCoordinateSystem + { + get + { + // Cope with null curve, most commonly used by implicitlyCa + return null == m_curve ? ECCurve.COORD_AFFINE : m_curve.CoordinateSystem; + } + } + + /** + * Returns the affine x-coordinate after checking that this point is normalized. + * + * @return The affine x-coordinate of this point + * @throws IllegalStateException if the point is not normalized + */ + public virtual ECFieldElement AffineXCoord + { + get + { + CheckNormalized(); + return XCoord; + } + } + + /** + * Returns the affine y-coordinate after checking that this point is normalized + * + * @return The affine y-coordinate of this point + * @throws IllegalStateException if the point is not normalized + */ + public virtual ECFieldElement AffineYCoord + { + get + { + CheckNormalized(); + return YCoord; + } + } + + /** + * Returns the x-coordinate. + * + * Caution: depending on the curve's coordinate system, this may not be the same value as in an + * affine coordinate system; use Normalize() to get a point where the coordinates have their + * affine values, or use AffineXCoord if you expect the point to already have been normalized. + * + * @return the x-coordinate of this point + */ + public virtual ECFieldElement XCoord + { + get { return m_x; } + } + + /** + * Returns the y-coordinate. + * + * Caution: depending on the curve's coordinate system, this may not be the same value as in an + * affine coordinate system; use Normalize() to get a point where the coordinates have their + * affine values, or use AffineYCoord if you expect the point to already have been normalized. + * + * @return the y-coordinate of this point + */ + public virtual ECFieldElement YCoord + { + get { return m_y; } + } + + public virtual ECFieldElement GetZCoord(int index) + { + return (index < 0 || index >= m_zs.Length) ? null : m_zs[index]; + } + + public virtual ECFieldElement[] GetZCoords() + { + int zsLen = m_zs.Length; + if (zsLen == 0) + { + return m_zs; + } + ECFieldElement[] copy = new ECFieldElement[zsLen]; + Array.Copy(m_zs, 0, copy, 0, zsLen); + return copy; + } + + protected internal ECFieldElement RawXCoord + { + get { return m_x; } + } + + protected internal ECFieldElement RawYCoord + { + get { return m_y; } + } + + protected internal ECFieldElement[] RawZCoords + { + get { return m_zs; } + } + + protected virtual void CheckNormalized() + { + if (!IsNormalized()) + throw new InvalidOperationException("point not in normal form"); + } + + public virtual bool IsNormalized() + { + int coord = this.CurveCoordinateSystem; + + return coord == ECCurve.COORD_AFFINE + || coord == ECCurve.COORD_LAMBDA_AFFINE + || IsInfinity + || RawZCoords[0].IsOne; + } + + /** + * Normalization ensures that any projective coordinate is 1, and therefore that the x, y + * coordinates reflect those of the equivalent point in an affine coordinate system. + * + * @return a new ECPoint instance representing the same point, but with normalized coordinates + */ + public virtual ECPoint Normalize() + { + if (this.IsInfinity) + { + return this; + } + + switch (this.CurveCoordinateSystem) + { + case ECCurve.COORD_AFFINE: + case ECCurve.COORD_LAMBDA_AFFINE: + { + return this; + } + default: + { + ECFieldElement Z1 = RawZCoords[0]; + if (Z1.IsOne) + { + return this; + } + + return Normalize(Z1.Invert()); + } + } + } + + internal virtual ECPoint Normalize(ECFieldElement zInv) + { + switch (this.CurveCoordinateSystem) + { + case ECCurve.COORD_HOMOGENEOUS: + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + return CreateScaledPoint(zInv, zInv); + } + case ECCurve.COORD_JACOBIAN: + case ECCurve.COORD_JACOBIAN_CHUDNOVSKY: + case ECCurve.COORD_JACOBIAN_MODIFIED: + { + ECFieldElement zInv2 = zInv.Square(), zInv3 = zInv2.Multiply(zInv); + return CreateScaledPoint(zInv2, zInv3); + } + default: + { + throw new InvalidOperationException("not a projective coordinate system"); + } + } + } + + protected virtual ECPoint CreateScaledPoint(ECFieldElement sx, ECFieldElement sy) + { + return Curve.CreateRawPoint(RawXCoord.Multiply(sx), RawYCoord.Multiply(sy), IsCompressed); + } + + public bool IsInfinity + { + get { return m_x == null && m_y == null; } + } + + public bool IsCompressed + { + get { return m_withCompression; } + } + + public bool IsValid() + { + return ImplIsValid(false, true); + } + + internal bool IsValidPartial() + { + return ImplIsValid(false, false); + } + + internal bool ImplIsValid(bool decompressed, bool checkOrder) + { + if (IsInfinity) + return true; + + ValidityCallback callback = new ValidityCallback(this, decompressed, checkOrder); + ValidityPreCompInfo validity = (ValidityPreCompInfo)Curve.Precompute(this, ValidityPreCompInfo.PRECOMP_NAME, callback); + return !validity.HasFailed(); + } + + public virtual ECPoint ScaleX(ECFieldElement scale) + { + return IsInfinity + ? this + : Curve.CreateRawPoint(RawXCoord.Multiply(scale), RawYCoord, RawZCoords, IsCompressed); + } + + public virtual ECPoint ScaleY(ECFieldElement scale) + { + return IsInfinity + ? this + : Curve.CreateRawPoint(RawXCoord, RawYCoord.Multiply(scale), RawZCoords, IsCompressed); + } + + public override bool Equals(object obj) + { + return Equals(obj as ECPoint); + } + + public virtual bool Equals(ECPoint other) + { + if (this == other) + return true; + if (null == other) + return false; + + ECCurve c1 = this.Curve, c2 = other.Curve; + bool n1 = (null == c1), n2 = (null == c2); + bool i1 = IsInfinity, i2 = other.IsInfinity; + + if (i1 || i2) + { + return (i1 && i2) && (n1 || n2 || c1.Equals(c2)); + } + + ECPoint p1 = this, p2 = other; + if (n1 && n2) + { + // Points with null curve are in affine form, so already normalized + } + else if (n1) + { + p2 = p2.Normalize(); + } + else if (n2) + { + p1 = p1.Normalize(); + } + else if (!c1.Equals(c2)) + { + return false; + } + else + { + // TODO Consider just requiring already normalized, to avoid silent performance degradation + + ECPoint[] points = new ECPoint[] { this, c1.ImportPoint(p2) }; + + // TODO This is a little strong, really only requires coZNormalizeAll to get Zs equal + c1.NormalizeAll(points); + + p1 = points[0]; + p2 = points[1]; + } + + return p1.XCoord.Equals(p2.XCoord) && p1.YCoord.Equals(p2.YCoord); + } + + public override int GetHashCode() + { + ECCurve c = this.Curve; + int hc = (null == c) ? 0 : ~c.GetHashCode(); + + if (!this.IsInfinity) + { + // TODO Consider just requiring already normalized, to avoid silent performance degradation + + ECPoint p = Normalize(); + + hc ^= p.XCoord.GetHashCode() * 17; + hc ^= p.YCoord.GetHashCode() * 257; + } + + return hc; + } + + public override string ToString() + { + if (this.IsInfinity) + { + return "INF"; + } + + StringBuilder sb = new StringBuilder(); + sb.Append('('); + sb.Append(RawXCoord); + sb.Append(','); + sb.Append(RawYCoord); + for (int i = 0; i < m_zs.Length; ++i) + { + sb.Append(','); + sb.Append(m_zs[i]); + } + sb.Append(')'); + return sb.ToString(); + } + + public virtual byte[] GetEncoded() + { + return GetEncoded(m_withCompression); + } + + public abstract byte[] GetEncoded(bool compressed); + + protected internal abstract bool CompressionYTilde { get; } + + public abstract ECPoint Add(ECPoint b); + public abstract ECPoint Subtract(ECPoint b); + public abstract ECPoint Negate(); + + public virtual ECPoint TimesPow2(int e) + { + if (e < 0) + throw new ArgumentException("cannot be negative", "e"); + + ECPoint p = this; + while (--e >= 0) + { + p = p.Twice(); + } + return p; + } + + public abstract ECPoint Twice(); + public abstract ECPoint Multiply(BigInteger b); + + public virtual ECPoint TwicePlus(ECPoint b) + { + return Twice().Add(b); + } + + public virtual ECPoint ThreeTimes() + { + return TwicePlus(this); + } + + private class ValidityCallback + : IPreCompCallback + { + private readonly ECPoint m_outer; + private readonly bool m_decompressed, m_checkOrder; + + internal ValidityCallback(ECPoint outer, bool decompressed, bool checkOrder) + { + this.m_outer = outer; + this.m_decompressed = decompressed; + this.m_checkOrder = checkOrder; + } + + public PreCompInfo Precompute(PreCompInfo existing) + { + ValidityPreCompInfo info = existing as ValidityPreCompInfo; + if (info == null) + { + info = new ValidityPreCompInfo(); + } + + if (info.HasFailed()) + return info; + + if (!info.HasCurveEquationPassed()) + { + if (!m_decompressed && !m_outer.SatisfiesCurveEquation()) + { + info.ReportFailed(); + return info; + } + info.ReportCurveEquationPassed(); + } + if (m_checkOrder && !info.HasOrderPassed()) + { + if (!m_outer.SatisfiesOrder()) + { + info.ReportFailed(); + return info; + } + info.ReportOrderPassed(); + } + return info; + } + } + } + + internal abstract class ECPointBase + : ECPoint + { + protected internal ECPointBase( + ECCurve curve, + ECFieldElement x, + ECFieldElement y, + bool withCompression) + : base(curve, x, y, withCompression) + { + } + + protected internal ECPointBase(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + : base(curve, x, y, zs, withCompression) + { + } + + /** + * return the field element encoded with point compression. (S 4.3.6) + */ + public override byte[] GetEncoded(bool compressed) + { + if (this.IsInfinity) + { + return new byte[1]; + } + + ECPoint normed = Normalize(); + + byte[] X = normed.XCoord.GetEncoded(); + + if (compressed) + { + byte[] PO = new byte[X.Length + 1]; + PO[0] = (byte)(normed.CompressionYTilde ? 0x03 : 0x02); + Array.Copy(X, 0, PO, 1, X.Length); + return PO; + } + + byte[] Y = normed.YCoord.GetEncoded(); + + { + byte[] PO = new byte[X.Length + Y.Length + 1]; + PO[0] = 0x04; + Array.Copy(X, 0, PO, 1, X.Length); + Array.Copy(Y, 0, PO, X.Length + 1, Y.Length); + return PO; + } + } + + /** + * Multiplies this ECPoint by the given number. + * @param k The multiplicator. + * @return k * this. + */ + public override ECPoint Multiply(BigInteger k) + { + return this.Curve.GetMultiplier().Multiply(this, k); + } + } + + internal abstract class AbstractFpPoint + : ECPointBase + { + protected AbstractFpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression) + : base(curve, x, y, withCompression) + { + } + + protected AbstractFpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + : base(curve, x, y, zs, withCompression) + { + } + + protected internal override bool CompressionYTilde + { + get { return this.AffineYCoord.TestBitZero(); } + } + + protected override bool SatisfiesCurveEquation() + { + ECFieldElement X = this.RawXCoord, Y = this.RawYCoord, A = Curve.A, B = Curve.B; + ECFieldElement lhs = Y.Square(); + + switch (CurveCoordinateSystem) + { + case ECCurve.COORD_AFFINE: + break; + case ECCurve.COORD_HOMOGENEOUS: + { + ECFieldElement Z = this.RawZCoords[0]; + if (!Z.IsOne) + { + ECFieldElement Z2 = Z.Square(), Z3 = Z.Multiply(Z2); + lhs = lhs.Multiply(Z); + A = A.Multiply(Z2); + B = B.Multiply(Z3); + } + break; + } + case ECCurve.COORD_JACOBIAN: + case ECCurve.COORD_JACOBIAN_CHUDNOVSKY: + case ECCurve.COORD_JACOBIAN_MODIFIED: + { + ECFieldElement Z = this.RawZCoords[0]; + if (!Z.IsOne) + { + ECFieldElement Z2 = Z.Square(), Z4 = Z2.Square(), Z6 = Z2.Multiply(Z4); + A = A.Multiply(Z4); + B = B.Multiply(Z6); + } + break; + } + default: + throw new InvalidOperationException("unsupported coordinate system"); + } + + ECFieldElement rhs = X.Square().Add(A).Multiply(X).Add(B); + return lhs.Equals(rhs); + } + + public override ECPoint Subtract(ECPoint b) + { + if (b.IsInfinity) + return this; + + // Add -b + return Add(b.Negate()); + } + } + + /** + * Elliptic curve points over Fp + */ + internal class FpPoint + : AbstractFpPoint + { + /** + * Create a point which encodes without point compression. + * + * @param curve the curve to use + * @param x affine x co-ordinate + * @param y affine y co-ordinate + */ + public FpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y) + : this(curve, x, y, false) + { + } + + /** + * Create a point that encodes with or without point compression. + * + * @param curve the curve to use + * @param x affine x co-ordinate + * @param y affine y co-ordinate + * @param withCompression if true encode with point compression + */ + public FpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression) + : base(curve, x, y, withCompression) + { + if ((x == null) != (y == null)) + throw new ArgumentException("Exactly one of the field elements is null"); + } + + internal FpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + : base(curve, x, y, zs, withCompression) + { + } + + protected override ECPoint Detach() + { + return new FpPoint(null, AffineXCoord, AffineYCoord, false); + } + + public override ECFieldElement GetZCoord(int index) + { + if (index == 1 && ECCurve.COORD_JACOBIAN_MODIFIED == this.CurveCoordinateSystem) + { + return GetJacobianModifiedW(); + } + + return base.GetZCoord(index); + } + + // B.3 pg 62 + public override ECPoint Add(ECPoint b) + { + if (this.IsInfinity) + return b; + if (b.IsInfinity) + return this; + if (this == b) + return Twice(); + + ECCurve curve = this.Curve; + int coord = curve.CoordinateSystem; + + ECFieldElement X1 = this.RawXCoord, Y1 = this.RawYCoord; + ECFieldElement X2 = b.RawXCoord, Y2 = b.RawYCoord; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + { + ECFieldElement dx = X2.Subtract(X1), dy = Y2.Subtract(Y1); + + if (dx.IsZero) + { + if (dy.IsZero) + { + // this == b, i.e. this must be doubled + return Twice(); + } + + // this == -b, i.e. the result is the point at infinity + return Curve.Infinity; + } + + ECFieldElement gamma = dy.Divide(dx); + ECFieldElement X3 = gamma.Square().Subtract(X1).Subtract(X2); + ECFieldElement Y3 = gamma.Multiply(X1.Subtract(X3)).Subtract(Y1); + + return new FpPoint(Curve, X3, Y3, IsCompressed); + } + + case ECCurve.COORD_HOMOGENEOUS: + { + ECFieldElement Z1 = this.RawZCoords[0]; + ECFieldElement Z2 = b.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + bool Z2IsOne = Z2.IsOne; + + ECFieldElement u1 = Z1IsOne ? Y2 : Y2.Multiply(Z1); + ECFieldElement u2 = Z2IsOne ? Y1 : Y1.Multiply(Z2); + ECFieldElement u = u1.Subtract(u2); + ECFieldElement v1 = Z1IsOne ? X2 : X2.Multiply(Z1); + ECFieldElement v2 = Z2IsOne ? X1 : X1.Multiply(Z2); + ECFieldElement v = v1.Subtract(v2); + + // Check if b == this or b == -this + if (v.IsZero) + { + if (u.IsZero) + { + // this == b, i.e. this must be doubled + return this.Twice(); + } + + // this == -b, i.e. the result is the point at infinity + return curve.Infinity; + } + + // TODO Optimize for when w == 1 + ECFieldElement w = Z1IsOne ? Z2 : Z2IsOne ? Z1 : Z1.Multiply(Z2); + ECFieldElement vSquared = v.Square(); + ECFieldElement vCubed = vSquared.Multiply(v); + ECFieldElement vSquaredV2 = vSquared.Multiply(v2); + ECFieldElement A = u.Square().Multiply(w).Subtract(vCubed).Subtract(Two(vSquaredV2)); + + ECFieldElement X3 = v.Multiply(A); + ECFieldElement Y3 = vSquaredV2.Subtract(A).MultiplyMinusProduct(u, u2, vCubed); + ECFieldElement Z3 = vCubed.Multiply(w); + + return new FpPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); + } + + case ECCurve.COORD_JACOBIAN: + case ECCurve.COORD_JACOBIAN_MODIFIED: + { + ECFieldElement Z1 = this.RawZCoords[0]; + ECFieldElement Z2 = b.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + + ECFieldElement X3, Y3, Z3, Z3Squared = null; + + if (!Z1IsOne && Z1.Equals(Z2)) + { + // TODO Make this available as public method coZAdd? + + ECFieldElement dx = X1.Subtract(X2), dy = Y1.Subtract(Y2); + if (dx.IsZero) + { + if (dy.IsZero) + { + return Twice(); + } + return curve.Infinity; + } + + ECFieldElement C = dx.Square(); + ECFieldElement W1 = X1.Multiply(C), W2 = X2.Multiply(C); + ECFieldElement A1 = W1.Subtract(W2).Multiply(Y1); + + X3 = dy.Square().Subtract(W1).Subtract(W2); + Y3 = W1.Subtract(X3).Multiply(dy).Subtract(A1); + Z3 = dx; + + if (Z1IsOne) + { + Z3Squared = C; + } + else + { + Z3 = Z3.Multiply(Z1); + } + } + else + { + ECFieldElement Z1Squared, U2, S2; + if (Z1IsOne) + { + Z1Squared = Z1; U2 = X2; S2 = Y2; + } + else + { + Z1Squared = Z1.Square(); + U2 = Z1Squared.Multiply(X2); + ECFieldElement Z1Cubed = Z1Squared.Multiply(Z1); + S2 = Z1Cubed.Multiply(Y2); + } + + bool Z2IsOne = Z2.IsOne; + ECFieldElement Z2Squared, U1, S1; + if (Z2IsOne) + { + Z2Squared = Z2; U1 = X1; S1 = Y1; + } + else + { + Z2Squared = Z2.Square(); + U1 = Z2Squared.Multiply(X1); + ECFieldElement Z2Cubed = Z2Squared.Multiply(Z2); + S1 = Z2Cubed.Multiply(Y1); + } + + ECFieldElement H = U1.Subtract(U2); + ECFieldElement R = S1.Subtract(S2); + + // Check if b == this or b == -this + if (H.IsZero) + { + if (R.IsZero) + { + // this == b, i.e. this must be doubled + return this.Twice(); + } + + // this == -b, i.e. the result is the point at infinity + return curve.Infinity; + } + + ECFieldElement HSquared = H.Square(); + ECFieldElement G = HSquared.Multiply(H); + ECFieldElement V = HSquared.Multiply(U1); + + X3 = R.Square().Add(G).Subtract(Two(V)); + Y3 = V.Subtract(X3).MultiplyMinusProduct(R, G, S1); + + Z3 = H; + if (!Z1IsOne) + { + Z3 = Z3.Multiply(Z1); + } + if (!Z2IsOne) + { + Z3 = Z3.Multiply(Z2); + } + + // Alternative calculation of Z3 using fast square + //X3 = four(X3); + //Y3 = eight(Y3); + //Z3 = doubleProductFromSquares(Z1, Z2, Z1Squared, Z2Squared).Multiply(H); + + if (Z3 == H) + { + Z3Squared = HSquared; + } + } + + ECFieldElement[] zs; + if (coord == ECCurve.COORD_JACOBIAN_MODIFIED) + { + // TODO If the result will only be used in a subsequent addition, we don't need W3 + ECFieldElement W3 = CalculateJacobianModifiedW(Z3, Z3Squared); + + zs = new ECFieldElement[] { Z3, W3 }; + } + else + { + zs = new ECFieldElement[] { Z3 }; + } + + return new FpPoint(curve, X3, Y3, zs, IsCompressed); + } + + default: + { + throw new InvalidOperationException("unsupported coordinate system"); + } + } + } + + // B.3 pg 62 + public override ECPoint Twice() + { + if (this.IsInfinity) + return this; + + ECCurve curve = this.Curve; + + ECFieldElement Y1 = this.RawYCoord; + if (Y1.IsZero) + return curve.Infinity; + + int coord = curve.CoordinateSystem; + + ECFieldElement X1 = this.RawXCoord; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + { + ECFieldElement X1Squared = X1.Square(); + ECFieldElement gamma = Three(X1Squared).Add(this.Curve.A).Divide(Two(Y1)); + ECFieldElement X3 = gamma.Square().Subtract(Two(X1)); + ECFieldElement Y3 = gamma.Multiply(X1.Subtract(X3)).Subtract(Y1); + + return new FpPoint(Curve, X3, Y3, IsCompressed); + } + + case ECCurve.COORD_HOMOGENEOUS: + { + ECFieldElement Z1 = this.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + + // TODO Optimize for small negative a4 and -3 + ECFieldElement w = curve.A; + if (!w.IsZero && !Z1IsOne) + { + w = w.Multiply(Z1.Square()); + } + w = w.Add(Three(X1.Square())); + + ECFieldElement s = Z1IsOne ? Y1 : Y1.Multiply(Z1); + ECFieldElement t = Z1IsOne ? Y1.Square() : s.Multiply(Y1); + ECFieldElement B = X1.Multiply(t); + ECFieldElement _4B = Four(B); + ECFieldElement h = w.Square().Subtract(Two(_4B)); + + ECFieldElement _2s = Two(s); + ECFieldElement X3 = h.Multiply(_2s); + ECFieldElement _2t = Two(t); + ECFieldElement Y3 = _4B.Subtract(h).Multiply(w).Subtract(Two(_2t.Square())); + ECFieldElement _4sSquared = Z1IsOne ? Two(_2t) : _2s.Square(); + ECFieldElement Z3 = Two(_4sSquared).Multiply(s); + + return new FpPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); + } + + case ECCurve.COORD_JACOBIAN: + { + ECFieldElement Z1 = this.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + + ECFieldElement Y1Squared = Y1.Square(); + ECFieldElement T = Y1Squared.Square(); + + ECFieldElement a4 = curve.A; + ECFieldElement a4Neg = a4.Negate(); + + ECFieldElement M, S; + if (a4Neg.ToBigInteger().Equals(BigInteger.ValueOf(3))) + { + ECFieldElement Z1Squared = Z1IsOne ? Z1 : Z1.Square(); + M = Three(X1.Add(Z1Squared).Multiply(X1.Subtract(Z1Squared))); + S = Four(Y1Squared.Multiply(X1)); + } + else + { + ECFieldElement X1Squared = X1.Square(); + M = Three(X1Squared); + if (Z1IsOne) + { + M = M.Add(a4); + } + else if (!a4.IsZero) + { + ECFieldElement Z1Squared = Z1IsOne ? Z1 : Z1.Square(); + ECFieldElement Z1Pow4 = Z1Squared.Square(); + if (a4Neg.BitLength < a4.BitLength) + { + M = M.Subtract(Z1Pow4.Multiply(a4Neg)); + } + else + { + M = M.Add(Z1Pow4.Multiply(a4)); + } + } + //S = two(doubleProductFromSquares(X1, Y1Squared, X1Squared, T)); + S = Four(X1.Multiply(Y1Squared)); + } + + ECFieldElement X3 = M.Square().Subtract(Two(S)); + ECFieldElement Y3 = S.Subtract(X3).Multiply(M).Subtract(Eight(T)); + + ECFieldElement Z3 = Two(Y1); + if (!Z1IsOne) + { + Z3 = Z3.Multiply(Z1); + } + + // Alternative calculation of Z3 using fast square + //ECFieldElement Z3 = doubleProductFromSquares(Y1, Z1, Y1Squared, Z1Squared); + + return new FpPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); + } + + case ECCurve.COORD_JACOBIAN_MODIFIED: + { + return TwiceJacobianModified(true); + } + + default: + { + throw new InvalidOperationException("unsupported coordinate system"); + } + } + } + + public override ECPoint TwicePlus(ECPoint b) + { + if (this == b) + return ThreeTimes(); + if (this.IsInfinity) + return b; + if (b.IsInfinity) + return Twice(); + + ECFieldElement Y1 = this.RawYCoord; + if (Y1.IsZero) + return b; + + ECCurve curve = this.Curve; + int coord = curve.CoordinateSystem; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + { + ECFieldElement X1 = this.RawXCoord; + ECFieldElement X2 = b.RawXCoord, Y2 = b.RawYCoord; + + ECFieldElement dx = X2.Subtract(X1), dy = Y2.Subtract(Y1); + + if (dx.IsZero) + { + if (dy.IsZero) + { + // this == b i.e. the result is 3P + return ThreeTimes(); + } + + // this == -b, i.e. the result is P + return this; + } + + /* + * Optimized calculation of 2P + Q, as described in "Trading Inversions for + * Multiplications in Elliptic Curve Cryptography", by Ciet, Joye, Lauter, Montgomery. + */ + + ECFieldElement X = dx.Square(), Y = dy.Square(); + ECFieldElement d = X.Multiply(Two(X1).Add(X2)).Subtract(Y); + if (d.IsZero) + { + return Curve.Infinity; + } + + ECFieldElement D = d.Multiply(dx); + ECFieldElement I = D.Invert(); + ECFieldElement L1 = d.Multiply(I).Multiply(dy); + ECFieldElement L2 = Two(Y1).Multiply(X).Multiply(dx).Multiply(I).Subtract(L1); + ECFieldElement X4 = (L2.Subtract(L1)).Multiply(L1.Add(L2)).Add(X2); + ECFieldElement Y4 = (X1.Subtract(X4)).Multiply(L2).Subtract(Y1); + + return new FpPoint(Curve, X4, Y4, IsCompressed); + } + case ECCurve.COORD_JACOBIAN_MODIFIED: + { + return TwiceJacobianModified(false).Add(b); + } + default: + { + return Twice().Add(b); + } + } + } + + public override ECPoint ThreeTimes() + { + if (this.IsInfinity) + return this; + + ECFieldElement Y1 = this.RawYCoord; + if (Y1.IsZero) + return this; + + ECCurve curve = this.Curve; + int coord = curve.CoordinateSystem; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + { + ECFieldElement X1 = this.RawXCoord; + + ECFieldElement _2Y1 = Two(Y1); + ECFieldElement X = _2Y1.Square(); + ECFieldElement Z = Three(X1.Square()).Add(Curve.A); + ECFieldElement Y = Z.Square(); + + ECFieldElement d = Three(X1).Multiply(X).Subtract(Y); + if (d.IsZero) + { + return Curve.Infinity; + } + + ECFieldElement D = d.Multiply(_2Y1); + ECFieldElement I = D.Invert(); + ECFieldElement L1 = d.Multiply(I).Multiply(Z); + ECFieldElement L2 = X.Square().Multiply(I).Subtract(L1); + + ECFieldElement X4 = (L2.Subtract(L1)).Multiply(L1.Add(L2)).Add(X1); + ECFieldElement Y4 = (X1.Subtract(X4)).Multiply(L2).Subtract(Y1); + return new FpPoint(Curve, X4, Y4, IsCompressed); + } + case ECCurve.COORD_JACOBIAN_MODIFIED: + { + return TwiceJacobianModified(false).Add(this); + } + default: + { + // NOTE: Be careful about recursions between TwicePlus and ThreeTimes + return Twice().Add(this); + } + } + } + + public override ECPoint TimesPow2(int e) + { + if (e < 0) + throw new ArgumentException("cannot be negative", "e"); + if (e == 0 || this.IsInfinity) + return this; + if (e == 1) + return Twice(); + + ECCurve curve = this.Curve; + + ECFieldElement Y1 = this.RawYCoord; + if (Y1.IsZero) + return curve.Infinity; + + int coord = curve.CoordinateSystem; + + ECFieldElement W1 = curve.A; + ECFieldElement X1 = this.RawXCoord; + ECFieldElement Z1 = this.RawZCoords.Length < 1 ? curve.FromBigInteger(BigInteger.One) : this.RawZCoords[0]; + + if (!Z1.IsOne) + { + switch (coord) + { + case ECCurve.COORD_HOMOGENEOUS: + ECFieldElement Z1Sq = Z1.Square(); + X1 = X1.Multiply(Z1); + Y1 = Y1.Multiply(Z1Sq); + W1 = CalculateJacobianModifiedW(Z1, Z1Sq); + break; + case ECCurve.COORD_JACOBIAN: + W1 = CalculateJacobianModifiedW(Z1, null); + break; + case ECCurve.COORD_JACOBIAN_MODIFIED: + W1 = GetJacobianModifiedW(); + break; + } + } + + for (int i = 0; i < e; ++i) + { + if (Y1.IsZero) + return curve.Infinity; + + ECFieldElement X1Squared = X1.Square(); + ECFieldElement M = Three(X1Squared); + ECFieldElement _2Y1 = Two(Y1); + ECFieldElement _2Y1Squared = _2Y1.Multiply(Y1); + ECFieldElement S = Two(X1.Multiply(_2Y1Squared)); + ECFieldElement _4T = _2Y1Squared.Square(); + ECFieldElement _8T = Two(_4T); + + if (!W1.IsZero) + { + M = M.Add(W1); + W1 = Two(_8T.Multiply(W1)); + } + + X1 = M.Square().Subtract(Two(S)); + Y1 = M.Multiply(S.Subtract(X1)).Subtract(_8T); + Z1 = Z1.IsOne ? _2Y1 : _2Y1.Multiply(Z1); + } + + switch (coord) + { + case ECCurve.COORD_AFFINE: + ECFieldElement zInv = Z1.Invert(), zInv2 = zInv.Square(), zInv3 = zInv2.Multiply(zInv); + return new FpPoint(curve, X1.Multiply(zInv2), Y1.Multiply(zInv3), IsCompressed); + case ECCurve.COORD_HOMOGENEOUS: + X1 = X1.Multiply(Z1); + Z1 = Z1.Multiply(Z1.Square()); + return new FpPoint(curve, X1, Y1, new ECFieldElement[] { Z1 }, IsCompressed); + case ECCurve.COORD_JACOBIAN: + return new FpPoint(curve, X1, Y1, new ECFieldElement[] { Z1 }, IsCompressed); + case ECCurve.COORD_JACOBIAN_MODIFIED: + return new FpPoint(curve, X1, Y1, new ECFieldElement[] { Z1, W1 }, IsCompressed); + default: + throw new InvalidOperationException("unsupported coordinate system"); + } + } + + protected virtual ECFieldElement Two(ECFieldElement x) + { + return x.Add(x); + } + + protected virtual ECFieldElement Three(ECFieldElement x) + { + return Two(x).Add(x); + } + + protected virtual ECFieldElement Four(ECFieldElement x) + { + return Two(Two(x)); + } + + protected virtual ECFieldElement Eight(ECFieldElement x) + { + return Four(Two(x)); + } + + protected virtual ECFieldElement DoubleProductFromSquares(ECFieldElement a, ECFieldElement b, + ECFieldElement aSquared, ECFieldElement bSquared) + { + /* + * NOTE: If squaring in the field is faster than multiplication, then this is a quicker + * way to calculate 2.A.B, if A^2 and B^2 are already known. + */ + return a.Add(b).Square().Subtract(aSquared).Subtract(bSquared); + } + + public override ECPoint Negate() + { + if (IsInfinity) + return this; + + ECCurve curve = Curve; + int coord = curve.CoordinateSystem; + + if (ECCurve.COORD_AFFINE != coord) + { + return new FpPoint(curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed); + } + + return new FpPoint(curve, RawXCoord, RawYCoord.Negate(), IsCompressed); + } + + protected virtual ECFieldElement CalculateJacobianModifiedW(ECFieldElement Z, ECFieldElement ZSquared) + { + ECFieldElement a4 = this.Curve.A; + if (a4.IsZero || Z.IsOne) + return a4; + + if (ZSquared == null) + { + ZSquared = Z.Square(); + } + + ECFieldElement W = ZSquared.Square(); + ECFieldElement a4Neg = a4.Negate(); + if (a4Neg.BitLength < a4.BitLength) + { + W = W.Multiply(a4Neg).Negate(); + } + else + { + W = W.Multiply(a4); + } + return W; + } + + protected virtual ECFieldElement GetJacobianModifiedW() + { + ECFieldElement[] ZZ = this.RawZCoords; + ECFieldElement W = ZZ[1]; + if (W == null) + { + // NOTE: Rarely, TwicePlus will result in the need for a lazy W1 calculation here + ZZ[1] = W = CalculateJacobianModifiedW(ZZ[0], null); + } + return W; + } + + protected virtual FpPoint TwiceJacobianModified(bool calculateW) + { + ECFieldElement X1 = this.RawXCoord, Y1 = this.RawYCoord, Z1 = this.RawZCoords[0], W1 = GetJacobianModifiedW(); + + ECFieldElement X1Squared = X1.Square(); + ECFieldElement M = Three(X1Squared).Add(W1); + ECFieldElement _2Y1 = Two(Y1); + ECFieldElement _2Y1Squared = _2Y1.Multiply(Y1); + ECFieldElement S = Two(X1.Multiply(_2Y1Squared)); + ECFieldElement X3 = M.Square().Subtract(Two(S)); + ECFieldElement _4T = _2Y1Squared.Square(); + ECFieldElement _8T = Two(_4T); + ECFieldElement Y3 = M.Multiply(S.Subtract(X3)).Subtract(_8T); + ECFieldElement W3 = calculateW ? Two(_8T.Multiply(W1)) : null; + ECFieldElement Z3 = Z1.IsOne ? _2Y1 : _2Y1.Multiply(Z1); + + return new FpPoint(this.Curve, X3, Y3, new ECFieldElement[] { Z3, W3 }, IsCompressed); + } + } + + internal abstract class AbstractF2mPoint + : ECPointBase + { + protected AbstractF2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression) + : base(curve, x, y, withCompression) + { + } + + protected AbstractF2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + : base(curve, x, y, zs, withCompression) + { + } + + protected override bool SatisfiesCurveEquation() + { + ECCurve curve = Curve; + ECFieldElement X = this.RawXCoord, Y = this.RawYCoord, A = curve.A, B = curve.B; + ECFieldElement lhs, rhs; + + int coord = curve.CoordinateSystem; + if (coord == ECCurve.COORD_LAMBDA_PROJECTIVE) + { + ECFieldElement Z = this.RawZCoords[0]; + bool ZIsOne = Z.IsOne; + + if (X.IsZero) + { + // NOTE: For x == 0, we expect the affine-y instead of the lambda-y + lhs = Y.Square(); + rhs = B; + if (!ZIsOne) + { + ECFieldElement Z2 = Z.Square(); + rhs = rhs.Multiply(Z2); + } + } + else + { + ECFieldElement L = Y, X2 = X.Square(); + if (ZIsOne) + { + lhs = L.Square().Add(L).Add(A); + rhs = X2.Square().Add(B); + } + else + { + ECFieldElement Z2 = Z.Square(), Z4 = Z2.Square(); + lhs = L.Add(Z).MultiplyPlusProduct(L, A, Z2); + // TODO If sqrt(b) is precomputed this can be simplified to a single square + rhs = X2.SquarePlusProduct(B, Z4); + } + lhs = lhs.Multiply(X2); + } + } + else + { + lhs = Y.Add(X).Multiply(Y); + + switch (coord) + { + case ECCurve.COORD_AFFINE: + break; + case ECCurve.COORD_HOMOGENEOUS: + { + ECFieldElement Z = this.RawZCoords[0]; + if (!Z.IsOne) + { + ECFieldElement Z2 = Z.Square(), Z3 = Z.Multiply(Z2); + lhs = lhs.Multiply(Z); + A = A.Multiply(Z); + B = B.Multiply(Z3); + } + break; + } + default: + throw new InvalidOperationException("unsupported coordinate system"); + } + + rhs = X.Add(A).Multiply(X.Square()).Add(B); + } + + return lhs.Equals(rhs); + } + + protected override bool SatisfiesOrder() + { + ECCurve curve = Curve; + BigInteger cofactor = curve.Cofactor; + if (BigInteger.Two.Equals(cofactor)) + { + /* + * Check that the trace of (X + A) is 0, then there exists a solution to L^2 + L = X + A, + * and so a halving is possible, so this point is the double of another. + */ + ECPoint N = this.Normalize(); + ECFieldElement X = N.AffineXCoord; + ECFieldElement rhs = X.Add(curve.A); + return ((AbstractF2mFieldElement)rhs).Trace() == 0; + } + if (BigInteger.ValueOf(4).Equals(cofactor)) + { + /* + * Solve L^2 + L = X + A to find the half of this point, if it exists (fail if not). + * Generate both possibilities for the square of the half-point's x-coordinate (w), + * and check if Tr(w + A) == 0 for at least one; then a second halving is possible + * (see comments for cofactor 2 above), so this point is four times another. + * + * Note: Tr(x^2) == Tr(x). + */ + ECPoint N = this.Normalize(); + ECFieldElement X = N.AffineXCoord; + ECFieldElement lambda = ((AbstractF2mCurve)curve).SolveQuadraticEquation(X.Add(curve.A)); + if (lambda == null) + return false; + + ECFieldElement w = X.Multiply(lambda).Add(N.AffineYCoord); + ECFieldElement t = w.Add(curve.A); + return ((AbstractF2mFieldElement)t).Trace() == 0 + || ((AbstractF2mFieldElement)(t.Add(X))).Trace() == 0; + } + + return base.SatisfiesOrder(); + } + + public override ECPoint ScaleX(ECFieldElement scale) + { + if (this.IsInfinity) + return this; + + switch (CurveCoordinateSystem) + { + case ECCurve.COORD_LAMBDA_AFFINE: + { + // Y is actually Lambda (X + Y/X) here + ECFieldElement X = RawXCoord, L = RawYCoord; + + ECFieldElement X2 = X.Multiply(scale); + ECFieldElement L2 = L.Add(X).Divide(scale).Add(X2); + + return Curve.CreateRawPoint(X, L2, RawZCoords, IsCompressed); + } + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + // Y is actually Lambda (X + Y/X) here + ECFieldElement X = RawXCoord, L = RawYCoord, Z = RawZCoords[0]; + + // We scale the Z coordinate also, to avoid an inversion + ECFieldElement X2 = X.Multiply(scale.Square()); + ECFieldElement L2 = L.Add(X).Add(X2); + ECFieldElement Z2 = Z.Multiply(scale); + + return Curve.CreateRawPoint(X, L2, new ECFieldElement[] { Z2 }, IsCompressed); + } + default: + { + return base.ScaleX(scale); + } + } + } + + public override ECPoint ScaleY(ECFieldElement scale) + { + if (this.IsInfinity) + return this; + + switch (CurveCoordinateSystem) + { + case ECCurve.COORD_LAMBDA_AFFINE: + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + ECFieldElement X = RawXCoord, L = RawYCoord; + + // Y is actually Lambda (X + Y/X) here + ECFieldElement L2 = L.Add(X).Multiply(scale).Add(X); + + return Curve.CreateRawPoint(X, L2, RawZCoords, IsCompressed); + } + default: + { + return base.ScaleY(scale); + } + } + } + + public override ECPoint Subtract(ECPoint b) + { + if (b.IsInfinity) + return this; + + // Add -b + return Add(b.Negate()); + } + + public virtual AbstractF2mPoint Tau() + { + if (this.IsInfinity) + return this; + + ECCurve curve = this.Curve; + int coord = curve.CoordinateSystem; + + ECFieldElement X1 = this.RawXCoord; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + case ECCurve.COORD_LAMBDA_AFFINE: + { + ECFieldElement Y1 = this.RawYCoord; + return (AbstractF2mPoint)curve.CreateRawPoint(X1.Square(), Y1.Square(), IsCompressed); + } + case ECCurve.COORD_HOMOGENEOUS: + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0]; + return (AbstractF2mPoint)curve.CreateRawPoint(X1.Square(), Y1.Square(), + new ECFieldElement[] { Z1.Square() }, IsCompressed); + } + default: + { + throw new InvalidOperationException("unsupported coordinate system"); + } + } + } + + public virtual AbstractF2mPoint TauPow(int pow) + { + if (this.IsInfinity) + return this; + + ECCurve curve = this.Curve; + int coord = curve.CoordinateSystem; + + ECFieldElement X1 = this.RawXCoord; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + case ECCurve.COORD_LAMBDA_AFFINE: + { + ECFieldElement Y1 = this.RawYCoord; + return (AbstractF2mPoint)curve.CreateRawPoint(X1.SquarePow(pow), Y1.SquarePow(pow), IsCompressed); + } + case ECCurve.COORD_HOMOGENEOUS: + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0]; + return (AbstractF2mPoint)curve.CreateRawPoint(X1.SquarePow(pow), Y1.SquarePow(pow), + new ECFieldElement[] { Z1.SquarePow(pow) }, IsCompressed); + } + default: + { + throw new InvalidOperationException("unsupported coordinate system"); + } + } + } + } + + /** + * Elliptic curve points over F2m + */ + internal class F2mPoint + : AbstractF2mPoint + { + /** + * @param curve base curve + * @param x x point + * @param y y point + */ + public F2mPoint( + ECCurve curve, + ECFieldElement x, + ECFieldElement y) + : this(curve, x, y, false) + { + } + + /** + * @param curve base curve + * @param x x point + * @param y y point + * @param withCompression true if encode with point compression. + */ + public F2mPoint( + ECCurve curve, + ECFieldElement x, + ECFieldElement y, + bool withCompression) + : base(curve, x, y, withCompression) + { + if ((x == null) != (y == null)) + { + throw new ArgumentException("Exactly one of the field elements is null"); + } + + if (x != null) + { + // Check if x and y are elements of the same field + F2mFieldElement.CheckFieldElements(x, y); + + // Check if x and a are elements of the same field + if (curve != null) + { + F2mFieldElement.CheckFieldElements(x, curve.A); + } + } + } + + internal F2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) + : base(curve, x, y, zs, withCompression) + { + } + + protected override ECPoint Detach() + { + return new F2mPoint(null, AffineXCoord, AffineYCoord, false); + } + + public override ECFieldElement YCoord + { + get + { + int coord = this.CurveCoordinateSystem; + + switch (coord) + { + case ECCurve.COORD_LAMBDA_AFFINE: + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + ECFieldElement X = RawXCoord, L = RawYCoord; + + if (this.IsInfinity || X.IsZero) + return L; + + // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly + ECFieldElement Y = L.Add(X).Multiply(X); + if (ECCurve.COORD_LAMBDA_PROJECTIVE == coord) + { + ECFieldElement Z = RawZCoords[0]; + if (!Z.IsOne) + { + Y = Y.Divide(Z); + } + } + return Y; + } + default: + { + return RawYCoord; + } + } + } + } + + protected internal override bool CompressionYTilde + { + get + { + ECFieldElement X = this.RawXCoord; + if (X.IsZero) + { + return false; + } + + ECFieldElement Y = this.RawYCoord; + + switch (this.CurveCoordinateSystem) + { + case ECCurve.COORD_LAMBDA_AFFINE: + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + // Y is actually Lambda (X + Y/X) here + return Y.TestBitZero() != X.TestBitZero(); + } + default: + { + return Y.Divide(X).TestBitZero(); + } + } + } + } + + public override ECPoint Add(ECPoint b) + { + if (this.IsInfinity) + return b; + if (b.IsInfinity) + return this; + + ECCurve curve = this.Curve; + int coord = curve.CoordinateSystem; + + ECFieldElement X1 = this.RawXCoord; + ECFieldElement X2 = b.RawXCoord; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + { + ECFieldElement Y1 = this.RawYCoord; + ECFieldElement Y2 = b.RawYCoord; + + ECFieldElement dx = X1.Add(X2), dy = Y1.Add(Y2); + if (dx.IsZero) + { + if (dy.IsZero) + { + return Twice(); + } + + return curve.Infinity; + } + + ECFieldElement L = dy.Divide(dx); + + ECFieldElement X3 = L.Square().Add(L).Add(dx).Add(curve.A); + ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1); + + return new F2mPoint(curve, X3, Y3, IsCompressed); + } + case ECCurve.COORD_HOMOGENEOUS: + { + ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0]; + ECFieldElement Y2 = b.RawYCoord, Z2 = b.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + ECFieldElement U1 = Y2, V1 = X2; + if (!Z1IsOne) + { + U1 = U1.Multiply(Z1); + V1 = V1.Multiply(Z1); + } + + bool Z2IsOne = Z2.IsOne; + ECFieldElement U2 = Y1, V2 = X1; + if (!Z2IsOne) + { + U2 = U2.Multiply(Z2); + V2 = V2.Multiply(Z2); + } + + ECFieldElement U = U1.Add(U2); + ECFieldElement V = V1.Add(V2); + + if (V.IsZero) + { + if (U.IsZero) + { + return Twice(); + } + + return curve.Infinity; + } + + ECFieldElement VSq = V.Square(); + ECFieldElement VCu = VSq.Multiply(V); + ECFieldElement W = Z1IsOne ? Z2 : Z2IsOne ? Z1 : Z1.Multiply(Z2); + ECFieldElement uv = U.Add(V); + ECFieldElement A = uv.MultiplyPlusProduct(U, VSq, curve.A).Multiply(W).Add(VCu); + + ECFieldElement X3 = V.Multiply(A); + ECFieldElement VSqZ2 = Z2IsOne ? VSq : VSq.Multiply(Z2); + ECFieldElement Y3 = U.MultiplyPlusProduct(X1, V, Y1).MultiplyPlusProduct(VSqZ2, uv, A); + ECFieldElement Z3 = VCu.Multiply(W); + + return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); + } + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + if (X1.IsZero) + { + if (X2.IsZero) + return curve.Infinity; + + return b.Add(this); + } + + ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0]; + ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + ECFieldElement U2 = X2, S2 = L2; + if (!Z1IsOne) + { + U2 = U2.Multiply(Z1); + S2 = S2.Multiply(Z1); + } + + bool Z2IsOne = Z2.IsOne; + ECFieldElement U1 = X1, S1 = L1; + if (!Z2IsOne) + { + U1 = U1.Multiply(Z2); + S1 = S1.Multiply(Z2); + } + + ECFieldElement A = S1.Add(S2); + ECFieldElement B = U1.Add(U2); + + if (B.IsZero) + { + if (A.IsZero) + { + return Twice(); + } + + return curve.Infinity; + } + + ECFieldElement X3, L3, Z3; + if (X2.IsZero) + { + // TODO This can probably be optimized quite a bit + ECPoint p = this.Normalize(); + X1 = p.RawXCoord; + ECFieldElement Y1 = p.YCoord; + + ECFieldElement Y2 = L2; + ECFieldElement L = Y1.Add(Y2).Divide(X1); + + X3 = L.Square().Add(L).Add(X1).Add(curve.A); + if (X3.IsZero) + { + return new F2mPoint(curve, X3, curve.B.Sqrt(), IsCompressed); + } + + ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1); + L3 = Y3.Divide(X3).Add(X3); + Z3 = curve.FromBigInteger(BigInteger.One); + } + else + { + B = B.Square(); + + ECFieldElement AU1 = A.Multiply(U1); + ECFieldElement AU2 = A.Multiply(U2); + + X3 = AU1.Multiply(AU2); + if (X3.IsZero) + { + return new F2mPoint(curve, X3, curve.B.Sqrt(), IsCompressed); + } + + ECFieldElement ABZ2 = A.Multiply(B); + if (!Z2IsOne) + { + ABZ2 = ABZ2.Multiply(Z2); + } + + L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1)); + + Z3 = ABZ2; + if (!Z1IsOne) + { + Z3 = Z3.Multiply(Z1); + } + } + + return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed); + } + default: + { + throw new InvalidOperationException("unsupported coordinate system"); + } + } + } + + /* (non-Javadoc) + * @see Org.BouncyCastle.Math.EC.ECPoint#twice() + */ + public override ECPoint Twice() + { + if (this.IsInfinity) + return this; + + ECCurve curve = this.Curve; + + ECFieldElement X1 = this.RawXCoord; + if (X1.IsZero) + { + // A point with X == 0 is it's own additive inverse + return curve.Infinity; + } + + int coord = curve.CoordinateSystem; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + { + ECFieldElement Y1 = this.RawYCoord; + + ECFieldElement L1 = Y1.Divide(X1).Add(X1); + + ECFieldElement X3 = L1.Square().Add(L1).Add(curve.A); + ECFieldElement Y3 = X1.SquarePlusProduct(X3, L1.AddOne()); + + return new F2mPoint(curve, X3, Y3, IsCompressed); + } + case ECCurve.COORD_HOMOGENEOUS: + { + ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1); + ECFieldElement Y1Z1 = Z1IsOne ? Y1 : Y1.Multiply(Z1); + + ECFieldElement X1Sq = X1.Square(); + ECFieldElement S = X1Sq.Add(Y1Z1); + ECFieldElement V = X1Z1; + ECFieldElement vSquared = V.Square(); + ECFieldElement sv = S.Add(V); + ECFieldElement h = sv.MultiplyPlusProduct(S, vSquared, curve.A); + + ECFieldElement X3 = V.Multiply(h); + ECFieldElement Y3 = X1Sq.Square().MultiplyPlusProduct(V, h, sv); + ECFieldElement Z3 = V.Multiply(vSquared); + + return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed); + } + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0]; + + bool Z1IsOne = Z1.IsOne; + ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1); + ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square(); + ECFieldElement a = curve.A; + ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq); + ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq); + if (T.IsZero) + { + return new F2mPoint(curve, T, curve.B.Sqrt(), IsCompressed); + } + + ECFieldElement X3 = T.Square(); + ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq); + + ECFieldElement b = curve.B; + ECFieldElement L3; + if (b.BitLength < (curve.FieldSize >> 1)) + { + ECFieldElement t1 = L1.Add(X1).Square(); + ECFieldElement t2; + if (b.IsOne) + { + t2 = aZ1Sq.Add(Z1Sq).Square(); + } + else + { + // TODO Can be calculated with one square if we pre-compute sqrt(b) + t2 = aZ1Sq.SquarePlusProduct(b, Z1Sq.Square()); + } + L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3); + if (a.IsZero) + { + L3 = L3.Add(Z3); + } + else if (!a.IsOne) + { + L3 = L3.Add(a.AddOne().Multiply(Z3)); + } + } + else + { + ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1); + L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3); + } + + return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed); + } + default: + { + throw new InvalidOperationException("unsupported coordinate system"); + } + } + } + + public override ECPoint TwicePlus(ECPoint b) + { + if (this.IsInfinity) + return b; + if (b.IsInfinity) + return Twice(); + + ECCurve curve = this.Curve; + + ECFieldElement X1 = this.RawXCoord; + if (X1.IsZero) + { + // A point with X == 0 is it's own additive inverse + return b; + } + + int coord = curve.CoordinateSystem; + + switch (coord) + { + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + // NOTE: twicePlus() only optimized for lambda-affine argument + ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0]; + if (X2.IsZero || !Z2.IsOne) + { + return Twice().Add(b); + } + + ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0]; + ECFieldElement L2 = b.RawYCoord; + + ECFieldElement X1Sq = X1.Square(); + ECFieldElement L1Sq = L1.Square(); + ECFieldElement Z1Sq = Z1.Square(); + ECFieldElement L1Z1 = L1.Multiply(Z1); + + ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1); + ECFieldElement L2plus1 = L2.AddOne(); + ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq); + ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq); + ECFieldElement B = X2Z1Sq.Add(T).Square(); + + if (B.IsZero) + { + if (A.IsZero) + { + return b.Twice(); + } + + return curve.Infinity; + } + + if (A.IsZero) + { + return new F2mPoint(curve, A, curve.B.Sqrt(), IsCompressed); + } + + ECFieldElement X3 = A.Square().Multiply(X2Z1Sq); + ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq); + ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3); + + return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed); + } + default: + { + return Twice().Add(b); + } + } + } + + public override ECPoint Negate() + { + if (this.IsInfinity) + return this; + + ECFieldElement X = this.RawXCoord; + if (X.IsZero) + return this; + + ECCurve curve = this.Curve; + int coord = curve.CoordinateSystem; + + switch (coord) + { + case ECCurve.COORD_AFFINE: + { + ECFieldElement Y = this.RawYCoord; + return new F2mPoint(curve, X, Y.Add(X), IsCompressed); + } + case ECCurve.COORD_HOMOGENEOUS: + { + ECFieldElement Y = this.RawYCoord, Z = this.RawZCoords[0]; + return new F2mPoint(curve, X, Y.Add(X), new ECFieldElement[] { Z }, IsCompressed); + } + case ECCurve.COORD_LAMBDA_AFFINE: + { + ECFieldElement L = this.RawYCoord; + return new F2mPoint(curve, X, L.AddOne(), IsCompressed); + } + case ECCurve.COORD_LAMBDA_PROJECTIVE: + { + // L is actually Lambda (X + Y/X) here + ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0]; + return new F2mPoint(curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed); + } + default: + { + throw new InvalidOperationException("unsupported coordinate system"); + } + } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECPointMap.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECPointMap.cs new file mode 100644 index 00000000..9f281995 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/ECPointMap.cs @@ -0,0 +1,9 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC +{ + internal interface ECPointMap + { + ECPoint Map(ECPoint p); + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/LongArray.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/LongArray.cs new file mode 100644 index 00000000..6b51b5ff --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/LongArray.cs @@ -0,0 +1,2206 @@ +using System; +using System.Text; + +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC +{ + internal class LongArray + { + //private static long DEInterleave_MASK = 0x5555555555555555L; + + /* + * This expands 8 bit indices into 16 bit contents (high bit 14), by inserting 0s between bits. + * In a binary field, this operation is the same as squaring an 8 bit number. + */ + private static readonly ushort[] INTERLEAVE2_TABLE = new ushort[] + { + 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015, + 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055, + 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115, + 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155, + 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415, + 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455, + 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515, + 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555, + 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015, + 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055, + 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115, + 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155, + 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415, + 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455, + 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515, + 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555, + 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015, + 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055, + 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115, + 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155, + 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415, + 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455, + 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515, + 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555, + 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015, + 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055, + 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115, + 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155, + 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415, + 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455, + 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515, + 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555 + }; + + /* + * This expands 7 bit indices into 21 bit contents (high bit 18), by inserting 0s between bits. + */ + private static readonly int[] INTERLEAVE3_TABLE = new int[] + { + 0x00000, 0x00001, 0x00008, 0x00009, 0x00040, 0x00041, 0x00048, 0x00049, + 0x00200, 0x00201, 0x00208, 0x00209, 0x00240, 0x00241, 0x00248, 0x00249, + 0x01000, 0x01001, 0x01008, 0x01009, 0x01040, 0x01041, 0x01048, 0x01049, + 0x01200, 0x01201, 0x01208, 0x01209, 0x01240, 0x01241, 0x01248, 0x01249, + 0x08000, 0x08001, 0x08008, 0x08009, 0x08040, 0x08041, 0x08048, 0x08049, + 0x08200, 0x08201, 0x08208, 0x08209, 0x08240, 0x08241, 0x08248, 0x08249, + 0x09000, 0x09001, 0x09008, 0x09009, 0x09040, 0x09041, 0x09048, 0x09049, + 0x09200, 0x09201, 0x09208, 0x09209, 0x09240, 0x09241, 0x09248, 0x09249, + 0x40000, 0x40001, 0x40008, 0x40009, 0x40040, 0x40041, 0x40048, 0x40049, + 0x40200, 0x40201, 0x40208, 0x40209, 0x40240, 0x40241, 0x40248, 0x40249, + 0x41000, 0x41001, 0x41008, 0x41009, 0x41040, 0x41041, 0x41048, 0x41049, + 0x41200, 0x41201, 0x41208, 0x41209, 0x41240, 0x41241, 0x41248, 0x41249, + 0x48000, 0x48001, 0x48008, 0x48009, 0x48040, 0x48041, 0x48048, 0x48049, + 0x48200, 0x48201, 0x48208, 0x48209, 0x48240, 0x48241, 0x48248, 0x48249, + 0x49000, 0x49001, 0x49008, 0x49009, 0x49040, 0x49041, 0x49048, 0x49049, + 0x49200, 0x49201, 0x49208, 0x49209, 0x49240, 0x49241, 0x49248, 0x49249 + }; + + /* + * This expands 8 bit indices into 32 bit contents (high bit 28), by inserting 0s between bits. + */ + private static readonly int[] INTERLEAVE4_TABLE = new int[] + { + 0x00000000, 0x00000001, 0x00000010, 0x00000011, 0x00000100, 0x00000101, 0x00000110, 0x00000111, + 0x00001000, 0x00001001, 0x00001010, 0x00001011, 0x00001100, 0x00001101, 0x00001110, 0x00001111, + 0x00010000, 0x00010001, 0x00010010, 0x00010011, 0x00010100, 0x00010101, 0x00010110, 0x00010111, + 0x00011000, 0x00011001, 0x00011010, 0x00011011, 0x00011100, 0x00011101, 0x00011110, 0x00011111, + 0x00100000, 0x00100001, 0x00100010, 0x00100011, 0x00100100, 0x00100101, 0x00100110, 0x00100111, + 0x00101000, 0x00101001, 0x00101010, 0x00101011, 0x00101100, 0x00101101, 0x00101110, 0x00101111, + 0x00110000, 0x00110001, 0x00110010, 0x00110011, 0x00110100, 0x00110101, 0x00110110, 0x00110111, + 0x00111000, 0x00111001, 0x00111010, 0x00111011, 0x00111100, 0x00111101, 0x00111110, 0x00111111, + 0x01000000, 0x01000001, 0x01000010, 0x01000011, 0x01000100, 0x01000101, 0x01000110, 0x01000111, + 0x01001000, 0x01001001, 0x01001010, 0x01001011, 0x01001100, 0x01001101, 0x01001110, 0x01001111, + 0x01010000, 0x01010001, 0x01010010, 0x01010011, 0x01010100, 0x01010101, 0x01010110, 0x01010111, + 0x01011000, 0x01011001, 0x01011010, 0x01011011, 0x01011100, 0x01011101, 0x01011110, 0x01011111, + 0x01100000, 0x01100001, 0x01100010, 0x01100011, 0x01100100, 0x01100101, 0x01100110, 0x01100111, + 0x01101000, 0x01101001, 0x01101010, 0x01101011, 0x01101100, 0x01101101, 0x01101110, 0x01101111, + 0x01110000, 0x01110001, 0x01110010, 0x01110011, 0x01110100, 0x01110101, 0x01110110, 0x01110111, + 0x01111000, 0x01111001, 0x01111010, 0x01111011, 0x01111100, 0x01111101, 0x01111110, 0x01111111, + 0x10000000, 0x10000001, 0x10000010, 0x10000011, 0x10000100, 0x10000101, 0x10000110, 0x10000111, + 0x10001000, 0x10001001, 0x10001010, 0x10001011, 0x10001100, 0x10001101, 0x10001110, 0x10001111, + 0x10010000, 0x10010001, 0x10010010, 0x10010011, 0x10010100, 0x10010101, 0x10010110, 0x10010111, + 0x10011000, 0x10011001, 0x10011010, 0x10011011, 0x10011100, 0x10011101, 0x10011110, 0x10011111, + 0x10100000, 0x10100001, 0x10100010, 0x10100011, 0x10100100, 0x10100101, 0x10100110, 0x10100111, + 0x10101000, 0x10101001, 0x10101010, 0x10101011, 0x10101100, 0x10101101, 0x10101110, 0x10101111, + 0x10110000, 0x10110001, 0x10110010, 0x10110011, 0x10110100, 0x10110101, 0x10110110, 0x10110111, + 0x10111000, 0x10111001, 0x10111010, 0x10111011, 0x10111100, 0x10111101, 0x10111110, 0x10111111, + 0x11000000, 0x11000001, 0x11000010, 0x11000011, 0x11000100, 0x11000101, 0x11000110, 0x11000111, + 0x11001000, 0x11001001, 0x11001010, 0x11001011, 0x11001100, 0x11001101, 0x11001110, 0x11001111, + 0x11010000, 0x11010001, 0x11010010, 0x11010011, 0x11010100, 0x11010101, 0x11010110, 0x11010111, + 0x11011000, 0x11011001, 0x11011010, 0x11011011, 0x11011100, 0x11011101, 0x11011110, 0x11011111, + 0x11100000, 0x11100001, 0x11100010, 0x11100011, 0x11100100, 0x11100101, 0x11100110, 0x11100111, + 0x11101000, 0x11101001, 0x11101010, 0x11101011, 0x11101100, 0x11101101, 0x11101110, 0x11101111, + 0x11110000, 0x11110001, 0x11110010, 0x11110011, 0x11110100, 0x11110101, 0x11110110, 0x11110111, + 0x11111000, 0x11111001, 0x11111010, 0x11111011, 0x11111100, 0x11111101, 0x11111110, 0x11111111 + }; + + /* + * This expands 7 bit indices into 35 bit contents (high bit 30), by inserting 0s between bits. + */ + private static readonly int[] INTERLEAVE5_TABLE = new int[] { + 0x00000000, 0x00000001, 0x00000020, 0x00000021, 0x00000400, 0x00000401, 0x00000420, 0x00000421, + 0x00008000, 0x00008001, 0x00008020, 0x00008021, 0x00008400, 0x00008401, 0x00008420, 0x00008421, + 0x00100000, 0x00100001, 0x00100020, 0x00100021, 0x00100400, 0x00100401, 0x00100420, 0x00100421, + 0x00108000, 0x00108001, 0x00108020, 0x00108021, 0x00108400, 0x00108401, 0x00108420, 0x00108421, + 0x02000000, 0x02000001, 0x02000020, 0x02000021, 0x02000400, 0x02000401, 0x02000420, 0x02000421, + 0x02008000, 0x02008001, 0x02008020, 0x02008021, 0x02008400, 0x02008401, 0x02008420, 0x02008421, + 0x02100000, 0x02100001, 0x02100020, 0x02100021, 0x02100400, 0x02100401, 0x02100420, 0x02100421, + 0x02108000, 0x02108001, 0x02108020, 0x02108021, 0x02108400, 0x02108401, 0x02108420, 0x02108421, + 0x40000000, 0x40000001, 0x40000020, 0x40000021, 0x40000400, 0x40000401, 0x40000420, 0x40000421, + 0x40008000, 0x40008001, 0x40008020, 0x40008021, 0x40008400, 0x40008401, 0x40008420, 0x40008421, + 0x40100000, 0x40100001, 0x40100020, 0x40100021, 0x40100400, 0x40100401, 0x40100420, 0x40100421, + 0x40108000, 0x40108001, 0x40108020, 0x40108021, 0x40108400, 0x40108401, 0x40108420, 0x40108421, + 0x42000000, 0x42000001, 0x42000020, 0x42000021, 0x42000400, 0x42000401, 0x42000420, 0x42000421, + 0x42008000, 0x42008001, 0x42008020, 0x42008021, 0x42008400, 0x42008401, 0x42008420, 0x42008421, + 0x42100000, 0x42100001, 0x42100020, 0x42100021, 0x42100400, 0x42100401, 0x42100420, 0x42100421, + 0x42108000, 0x42108001, 0x42108020, 0x42108021, 0x42108400, 0x42108401, 0x42108420, 0x42108421 + }; + + /* + * This expands 9 bit indices into 63 bit (long) contents (high bit 56), by inserting 0s between bits. + */ + private static readonly long[] INTERLEAVE7_TABLE = new long[] + { + 0x0000000000000000L, 0x0000000000000001L, 0x0000000000000080L, 0x0000000000000081L, + 0x0000000000004000L, 0x0000000000004001L, 0x0000000000004080L, 0x0000000000004081L, + 0x0000000000200000L, 0x0000000000200001L, 0x0000000000200080L, 0x0000000000200081L, + 0x0000000000204000L, 0x0000000000204001L, 0x0000000000204080L, 0x0000000000204081L, + 0x0000000010000000L, 0x0000000010000001L, 0x0000000010000080L, 0x0000000010000081L, + 0x0000000010004000L, 0x0000000010004001L, 0x0000000010004080L, 0x0000000010004081L, + 0x0000000010200000L, 0x0000000010200001L, 0x0000000010200080L, 0x0000000010200081L, + 0x0000000010204000L, 0x0000000010204001L, 0x0000000010204080L, 0x0000000010204081L, + 0x0000000800000000L, 0x0000000800000001L, 0x0000000800000080L, 0x0000000800000081L, + 0x0000000800004000L, 0x0000000800004001L, 0x0000000800004080L, 0x0000000800004081L, + 0x0000000800200000L, 0x0000000800200001L, 0x0000000800200080L, 0x0000000800200081L, + 0x0000000800204000L, 0x0000000800204001L, 0x0000000800204080L, 0x0000000800204081L, + 0x0000000810000000L, 0x0000000810000001L, 0x0000000810000080L, 0x0000000810000081L, + 0x0000000810004000L, 0x0000000810004001L, 0x0000000810004080L, 0x0000000810004081L, + 0x0000000810200000L, 0x0000000810200001L, 0x0000000810200080L, 0x0000000810200081L, + 0x0000000810204000L, 0x0000000810204001L, 0x0000000810204080L, 0x0000000810204081L, + 0x0000040000000000L, 0x0000040000000001L, 0x0000040000000080L, 0x0000040000000081L, + 0x0000040000004000L, 0x0000040000004001L, 0x0000040000004080L, 0x0000040000004081L, + 0x0000040000200000L, 0x0000040000200001L, 0x0000040000200080L, 0x0000040000200081L, + 0x0000040000204000L, 0x0000040000204001L, 0x0000040000204080L, 0x0000040000204081L, + 0x0000040010000000L, 0x0000040010000001L, 0x0000040010000080L, 0x0000040010000081L, + 0x0000040010004000L, 0x0000040010004001L, 0x0000040010004080L, 0x0000040010004081L, + 0x0000040010200000L, 0x0000040010200001L, 0x0000040010200080L, 0x0000040010200081L, + 0x0000040010204000L, 0x0000040010204001L, 0x0000040010204080L, 0x0000040010204081L, + 0x0000040800000000L, 0x0000040800000001L, 0x0000040800000080L, 0x0000040800000081L, + 0x0000040800004000L, 0x0000040800004001L, 0x0000040800004080L, 0x0000040800004081L, + 0x0000040800200000L, 0x0000040800200001L, 0x0000040800200080L, 0x0000040800200081L, + 0x0000040800204000L, 0x0000040800204001L, 0x0000040800204080L, 0x0000040800204081L, + 0x0000040810000000L, 0x0000040810000001L, 0x0000040810000080L, 0x0000040810000081L, + 0x0000040810004000L, 0x0000040810004001L, 0x0000040810004080L, 0x0000040810004081L, + 0x0000040810200000L, 0x0000040810200001L, 0x0000040810200080L, 0x0000040810200081L, + 0x0000040810204000L, 0x0000040810204001L, 0x0000040810204080L, 0x0000040810204081L, + 0x0002000000000000L, 0x0002000000000001L, 0x0002000000000080L, 0x0002000000000081L, + 0x0002000000004000L, 0x0002000000004001L, 0x0002000000004080L, 0x0002000000004081L, + 0x0002000000200000L, 0x0002000000200001L, 0x0002000000200080L, 0x0002000000200081L, + 0x0002000000204000L, 0x0002000000204001L, 0x0002000000204080L, 0x0002000000204081L, + 0x0002000010000000L, 0x0002000010000001L, 0x0002000010000080L, 0x0002000010000081L, + 0x0002000010004000L, 0x0002000010004001L, 0x0002000010004080L, 0x0002000010004081L, + 0x0002000010200000L, 0x0002000010200001L, 0x0002000010200080L, 0x0002000010200081L, + 0x0002000010204000L, 0x0002000010204001L, 0x0002000010204080L, 0x0002000010204081L, + 0x0002000800000000L, 0x0002000800000001L, 0x0002000800000080L, 0x0002000800000081L, + 0x0002000800004000L, 0x0002000800004001L, 0x0002000800004080L, 0x0002000800004081L, + 0x0002000800200000L, 0x0002000800200001L, 0x0002000800200080L, 0x0002000800200081L, + 0x0002000800204000L, 0x0002000800204001L, 0x0002000800204080L, 0x0002000800204081L, + 0x0002000810000000L, 0x0002000810000001L, 0x0002000810000080L, 0x0002000810000081L, + 0x0002000810004000L, 0x0002000810004001L, 0x0002000810004080L, 0x0002000810004081L, + 0x0002000810200000L, 0x0002000810200001L, 0x0002000810200080L, 0x0002000810200081L, + 0x0002000810204000L, 0x0002000810204001L, 0x0002000810204080L, 0x0002000810204081L, + 0x0002040000000000L, 0x0002040000000001L, 0x0002040000000080L, 0x0002040000000081L, + 0x0002040000004000L, 0x0002040000004001L, 0x0002040000004080L, 0x0002040000004081L, + 0x0002040000200000L, 0x0002040000200001L, 0x0002040000200080L, 0x0002040000200081L, + 0x0002040000204000L, 0x0002040000204001L, 0x0002040000204080L, 0x0002040000204081L, + 0x0002040010000000L, 0x0002040010000001L, 0x0002040010000080L, 0x0002040010000081L, + 0x0002040010004000L, 0x0002040010004001L, 0x0002040010004080L, 0x0002040010004081L, + 0x0002040010200000L, 0x0002040010200001L, 0x0002040010200080L, 0x0002040010200081L, + 0x0002040010204000L, 0x0002040010204001L, 0x0002040010204080L, 0x0002040010204081L, + 0x0002040800000000L, 0x0002040800000001L, 0x0002040800000080L, 0x0002040800000081L, + 0x0002040800004000L, 0x0002040800004001L, 0x0002040800004080L, 0x0002040800004081L, + 0x0002040800200000L, 0x0002040800200001L, 0x0002040800200080L, 0x0002040800200081L, + 0x0002040800204000L, 0x0002040800204001L, 0x0002040800204080L, 0x0002040800204081L, + 0x0002040810000000L, 0x0002040810000001L, 0x0002040810000080L, 0x0002040810000081L, + 0x0002040810004000L, 0x0002040810004001L, 0x0002040810004080L, 0x0002040810004081L, + 0x0002040810200000L, 0x0002040810200001L, 0x0002040810200080L, 0x0002040810200081L, + 0x0002040810204000L, 0x0002040810204001L, 0x0002040810204080L, 0x0002040810204081L, + 0x0100000000000000L, 0x0100000000000001L, 0x0100000000000080L, 0x0100000000000081L, + 0x0100000000004000L, 0x0100000000004001L, 0x0100000000004080L, 0x0100000000004081L, + 0x0100000000200000L, 0x0100000000200001L, 0x0100000000200080L, 0x0100000000200081L, + 0x0100000000204000L, 0x0100000000204001L, 0x0100000000204080L, 0x0100000000204081L, + 0x0100000010000000L, 0x0100000010000001L, 0x0100000010000080L, 0x0100000010000081L, + 0x0100000010004000L, 0x0100000010004001L, 0x0100000010004080L, 0x0100000010004081L, + 0x0100000010200000L, 0x0100000010200001L, 0x0100000010200080L, 0x0100000010200081L, + 0x0100000010204000L, 0x0100000010204001L, 0x0100000010204080L, 0x0100000010204081L, + 0x0100000800000000L, 0x0100000800000001L, 0x0100000800000080L, 0x0100000800000081L, + 0x0100000800004000L, 0x0100000800004001L, 0x0100000800004080L, 0x0100000800004081L, + 0x0100000800200000L, 0x0100000800200001L, 0x0100000800200080L, 0x0100000800200081L, + 0x0100000800204000L, 0x0100000800204001L, 0x0100000800204080L, 0x0100000800204081L, + 0x0100000810000000L, 0x0100000810000001L, 0x0100000810000080L, 0x0100000810000081L, + 0x0100000810004000L, 0x0100000810004001L, 0x0100000810004080L, 0x0100000810004081L, + 0x0100000810200000L, 0x0100000810200001L, 0x0100000810200080L, 0x0100000810200081L, + 0x0100000810204000L, 0x0100000810204001L, 0x0100000810204080L, 0x0100000810204081L, + 0x0100040000000000L, 0x0100040000000001L, 0x0100040000000080L, 0x0100040000000081L, + 0x0100040000004000L, 0x0100040000004001L, 0x0100040000004080L, 0x0100040000004081L, + 0x0100040000200000L, 0x0100040000200001L, 0x0100040000200080L, 0x0100040000200081L, + 0x0100040000204000L, 0x0100040000204001L, 0x0100040000204080L, 0x0100040000204081L, + 0x0100040010000000L, 0x0100040010000001L, 0x0100040010000080L, 0x0100040010000081L, + 0x0100040010004000L, 0x0100040010004001L, 0x0100040010004080L, 0x0100040010004081L, + 0x0100040010200000L, 0x0100040010200001L, 0x0100040010200080L, 0x0100040010200081L, + 0x0100040010204000L, 0x0100040010204001L, 0x0100040010204080L, 0x0100040010204081L, + 0x0100040800000000L, 0x0100040800000001L, 0x0100040800000080L, 0x0100040800000081L, + 0x0100040800004000L, 0x0100040800004001L, 0x0100040800004080L, 0x0100040800004081L, + 0x0100040800200000L, 0x0100040800200001L, 0x0100040800200080L, 0x0100040800200081L, + 0x0100040800204000L, 0x0100040800204001L, 0x0100040800204080L, 0x0100040800204081L, + 0x0100040810000000L, 0x0100040810000001L, 0x0100040810000080L, 0x0100040810000081L, + 0x0100040810004000L, 0x0100040810004001L, 0x0100040810004080L, 0x0100040810004081L, + 0x0100040810200000L, 0x0100040810200001L, 0x0100040810200080L, 0x0100040810200081L, + 0x0100040810204000L, 0x0100040810204001L, 0x0100040810204080L, 0x0100040810204081L, + 0x0102000000000000L, 0x0102000000000001L, 0x0102000000000080L, 0x0102000000000081L, + 0x0102000000004000L, 0x0102000000004001L, 0x0102000000004080L, 0x0102000000004081L, + 0x0102000000200000L, 0x0102000000200001L, 0x0102000000200080L, 0x0102000000200081L, + 0x0102000000204000L, 0x0102000000204001L, 0x0102000000204080L, 0x0102000000204081L, + 0x0102000010000000L, 0x0102000010000001L, 0x0102000010000080L, 0x0102000010000081L, + 0x0102000010004000L, 0x0102000010004001L, 0x0102000010004080L, 0x0102000010004081L, + 0x0102000010200000L, 0x0102000010200001L, 0x0102000010200080L, 0x0102000010200081L, + 0x0102000010204000L, 0x0102000010204001L, 0x0102000010204080L, 0x0102000010204081L, + 0x0102000800000000L, 0x0102000800000001L, 0x0102000800000080L, 0x0102000800000081L, + 0x0102000800004000L, 0x0102000800004001L, 0x0102000800004080L, 0x0102000800004081L, + 0x0102000800200000L, 0x0102000800200001L, 0x0102000800200080L, 0x0102000800200081L, + 0x0102000800204000L, 0x0102000800204001L, 0x0102000800204080L, 0x0102000800204081L, + 0x0102000810000000L, 0x0102000810000001L, 0x0102000810000080L, 0x0102000810000081L, + 0x0102000810004000L, 0x0102000810004001L, 0x0102000810004080L, 0x0102000810004081L, + 0x0102000810200000L, 0x0102000810200001L, 0x0102000810200080L, 0x0102000810200081L, + 0x0102000810204000L, 0x0102000810204001L, 0x0102000810204080L, 0x0102000810204081L, + 0x0102040000000000L, 0x0102040000000001L, 0x0102040000000080L, 0x0102040000000081L, + 0x0102040000004000L, 0x0102040000004001L, 0x0102040000004080L, 0x0102040000004081L, + 0x0102040000200000L, 0x0102040000200001L, 0x0102040000200080L, 0x0102040000200081L, + 0x0102040000204000L, 0x0102040000204001L, 0x0102040000204080L, 0x0102040000204081L, + 0x0102040010000000L, 0x0102040010000001L, 0x0102040010000080L, 0x0102040010000081L, + 0x0102040010004000L, 0x0102040010004001L, 0x0102040010004080L, 0x0102040010004081L, + 0x0102040010200000L, 0x0102040010200001L, 0x0102040010200080L, 0x0102040010200081L, + 0x0102040010204000L, 0x0102040010204001L, 0x0102040010204080L, 0x0102040010204081L, + 0x0102040800000000L, 0x0102040800000001L, 0x0102040800000080L, 0x0102040800000081L, + 0x0102040800004000L, 0x0102040800004001L, 0x0102040800004080L, 0x0102040800004081L, + 0x0102040800200000L, 0x0102040800200001L, 0x0102040800200080L, 0x0102040800200081L, + 0x0102040800204000L, 0x0102040800204001L, 0x0102040800204080L, 0x0102040800204081L, + 0x0102040810000000L, 0x0102040810000001L, 0x0102040810000080L, 0x0102040810000081L, + 0x0102040810004000L, 0x0102040810004001L, 0x0102040810004080L, 0x0102040810004081L, + 0x0102040810200000L, 0x0102040810200001L, 0x0102040810200080L, 0x0102040810200081L, + 0x0102040810204000L, 0x0102040810204001L, 0x0102040810204080L, 0x0102040810204081L + }; + + // For toString(); must have length 64 + private const string ZEROES = "0000000000000000000000000000000000000000000000000000000000000000"; + + internal static readonly byte[] BitLengths = + { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + }; + + // TODO make m fixed for the LongArray, and hence compute T once and for all + + private long[] m_ints; + + public LongArray(int intLen) + { + m_ints = new long[intLen]; + } + + public LongArray(long[] ints) + { + m_ints = ints; + } + + public LongArray(long[] ints, int off, int len) + { + if (off == 0 && len == ints.Length) + { + m_ints = ints; + } + else + { + m_ints = new long[len]; + Array.Copy(ints, off, m_ints, 0, len); + } + } + + public LongArray(BigInteger bigInt) + { + if (bigInt == null || bigInt.SignValue < 0) + { + throw new ArgumentException("invalid F2m field value", "bigInt"); + } + + if (bigInt.SignValue == 0) + { + m_ints = new long[] { 0L }; + return; + } + + byte[] barr = bigInt.ToByteArray(); + int barrLen = barr.Length; + int barrStart = 0; + if (barr[0] == 0) + { + // First byte is 0 to enforce highest (=sign) bit is zero. + // In this case ignore barr[0]. + barrLen--; + barrStart = 1; + } + int intLen = (barrLen + 7) / 8; + m_ints = new long[intLen]; + + int iarrJ = intLen - 1; + int rem = barrLen % 8 + barrStart; + long temp = 0; + int barrI = barrStart; + if (barrStart < rem) + { + for (; barrI < rem; barrI++) + { + temp <<= 8; + uint barrBarrI = barr[barrI]; + temp |= barrBarrI; + } + m_ints[iarrJ--] = temp; + } + + for (; iarrJ >= 0; iarrJ--) + { + temp = 0; + for (int i = 0; i < 8; i++) + { + temp <<= 8; + uint barrBarrI = barr[barrI++]; + temp |= barrBarrI; + } + m_ints[iarrJ] = temp; + } + } + + internal void CopyTo(long[] z, int zOff) + { + Array.Copy(m_ints, 0, z, zOff, m_ints.Length); + } + + public bool IsOne() + { + long[] a = m_ints; + if (a[0] != 1L) + { + return false; + } + for (int i = 1; i < a.Length; ++i) + { + if (a[i] != 0L) + { + return false; + } + } + return true; + } + + public bool IsZero() + { + long[] a = m_ints; + for (int i = 0; i < a.Length; ++i) + { + if (a[i] != 0L) + { + return false; + } + } + return true; + } + + public int GetUsedLength() + { + return GetUsedLengthFrom(m_ints.Length); + } + + public int GetUsedLengthFrom(int from) + { + long[] a = m_ints; + from = System.Math.Min(from, a.Length); + + if (from < 1) + { + return 0; + } + + // Check if first element will act as sentinel + if (a[0] != 0) + { + while (a[--from] == 0) + { + } + return from + 1; + } + + do + { + if (a[--from] != 0) + { + return from + 1; + } + } + while (from > 0); + + return 0; + } + + public int Degree() + { + int i = m_ints.Length; + long w; + do + { + if (i == 0) + { + return 0; + } + w = m_ints[--i]; + } + while (w == 0); + + return (i << 6) + BitLength(w); + } + + private int DegreeFrom(int limit) + { + int i = (int)(((uint)limit + 62) >> 6); + long w; + do + { + if (i == 0) + { + return 0; + } + w = m_ints[--i]; + } + while (w == 0); + + return (i << 6) + BitLength(w); + } + + // private int lowestCoefficient() + // { + // for (int i = 0; i < m_ints.Length; ++i) + // { + // long mi = m_ints[i]; + // if (mi != 0) + // { + // int j = 0; + // while ((mi & 0xFFL) == 0) + // { + // j += 8; + // mi >>>= 8; + // } + // while ((mi & 1L) == 0) + // { + // ++j; + // mi >>>= 1; + // } + // return (i << 6) + j; + // } + // } + // return -1; + // } + + private static int BitLength(long w) + { + int u = (int)((ulong)w >> 32), b; + if (u == 0) + { + u = (int)w; + b = 0; + } + else + { + b = 32; + } + + int t = (int)((uint)u >> 16), k; + if (t == 0) + { + t = (int)((uint)u >> 8); + k = (t == 0) ? BitLengths[u] : 8 + BitLengths[t]; + } + else + { + int v = (int)((uint)t >> 8); + k = (v == 0) ? 16 + BitLengths[t] : 24 + BitLengths[v]; + } + + return b + k; + } + + private long[] ResizedInts(int newLen) + { + long[] newInts = new long[newLen]; + Array.Copy(m_ints, 0, newInts, 0, System.Math.Min(m_ints.Length, newLen)); + return newInts; + } + + public BigInteger ToBigInteger() + { + int usedLen = GetUsedLength(); + if (usedLen == 0) + { + return BigInteger.Zero; + } + + long highestInt = m_ints[usedLen - 1]; + byte[] temp = new byte[8]; + int barrI = 0; + bool trailingZeroBytesDone = false; + for (int j = 7; j >= 0; j--) + { + byte thisByte = (byte)((ulong)highestInt >> (8 * j)); + if (trailingZeroBytesDone || (thisByte != 0)) + { + trailingZeroBytesDone = true; + temp[barrI++] = thisByte; + } + } + + int barrLen = 8 * (usedLen - 1) + barrI; + byte[] barr = new byte[barrLen]; + for (int j = 0; j < barrI; j++) + { + barr[j] = temp[j]; + } + // Highest value int is done now + + for (int iarrJ = usedLen - 2; iarrJ >= 0; iarrJ--) + { + long mi = m_ints[iarrJ]; + for (int j = 7; j >= 0; j--) + { + barr[barrI++] = (byte)((ulong)mi >> (8 * j)); + } + } + return new BigInteger(1, barr); + } + + // private static long shiftUp(long[] x, int xOff, int count) + // { + // long prev = 0; + // for (int i = 0; i < count; ++i) + // { + // long next = x[xOff + i]; + // x[xOff + i] = (next << 1) | prev; + // prev = next >>> 63; + // } + // return prev; + // } + + private static long ShiftUp(long[] x, int xOff, int count, int shift) + { + int shiftInv = 64 - shift; + long prev = 0; + for (int i = 0; i < count; ++i) + { + long next = x[xOff + i]; + x[xOff + i] = (next << shift) | prev; + prev = (long)((ulong)next >> shiftInv); + } + return prev; + } + + private static long ShiftUp(long[] x, int xOff, long[] z, int zOff, int count, int shift) + { + int shiftInv = 64 - shift; + long prev = 0; + for (int i = 0; i < count; ++i) + { + long next = x[xOff + i]; + z[zOff + i] = (next << shift) | prev; + prev = (long)((ulong)next >> shiftInv); + } + return prev; + } + + public LongArray AddOne() + { + if (m_ints.Length == 0) + { + return new LongArray(new long[]{ 1L }); + } + + int resultLen = System.Math.Max(1, GetUsedLength()); + long[] ints = ResizedInts(resultLen); + ints[0] ^= 1L; + return new LongArray(ints); + } + + // private void addShiftedByBits(LongArray other, int bits) + // { + // int words = bits >>> 6; + // int shift = bits & 0x3F; + // + // if (shift == 0) + // { + // addShiftedByWords(other, words); + // return; + // } + // + // int otherUsedLen = other.GetUsedLength(); + // if (otherUsedLen == 0) + // { + // return; + // } + // + // int minLen = otherUsedLen + words + 1; + // if (minLen > m_ints.Length) + // { + // m_ints = resizedInts(minLen); + // } + // + // long carry = addShiftedByBits(m_ints, words, other.m_ints, 0, otherUsedLen, shift); + // m_ints[otherUsedLen + words] ^= carry; + // } + + private void AddShiftedByBitsSafe(LongArray other, int otherDegree, int bits) + { + int otherLen = (int)((uint)(otherDegree + 63) >> 6); + + int words = (int)((uint)bits >> 6); + int shift = bits & 0x3F; + + if (shift == 0) + { + Add(m_ints, words, other.m_ints, 0, otherLen); + return; + } + + long carry = AddShiftedUp(m_ints, words, other.m_ints, 0, otherLen, shift); + if (carry != 0L) + { + m_ints[otherLen + words] ^= carry; + } + } + + private static long AddShiftedUp(long[] x, int xOff, long[] y, int yOff, int count, int shift) + { + int shiftInv = 64 - shift; + long prev = 0; + for (int i = 0; i < count; ++i) + { + long next = y[yOff + i]; + x[xOff + i] ^= (next << shift) | prev; + prev = (long)((ulong)next >> shiftInv); + } + return prev; + } + + private static long AddShiftedDown(long[] x, int xOff, long[] y, int yOff, int count, int shift) + { + int shiftInv = 64 - shift; + long prev = 0; + int i = count; + while (--i >= 0) + { + long next = y[yOff + i]; + x[xOff + i] ^= (long)((ulong)next >> shift) | prev; + prev = next << shiftInv; + } + return prev; + } + + public void AddShiftedByWords(LongArray other, int words) + { + int otherUsedLen = other.GetUsedLength(); + if (otherUsedLen == 0) + { + return; + } + + int minLen = otherUsedLen + words; + if (minLen > m_ints.Length) + { + m_ints = ResizedInts(minLen); + } + + Add(m_ints, words, other.m_ints, 0, otherUsedLen); + } + + private static void Add(long[] x, int xOff, long[] y, int yOff, int count) + { + for (int i = 0; i < count; ++i) + { + x[xOff + i] ^= y[yOff + i]; + } + } + + private static void Add(long[] x, int xOff, long[] y, int yOff, long[] z, int zOff, int count) + { + for (int i = 0; i < count; ++i) + { + z[zOff + i] = x[xOff + i] ^ y[yOff + i]; + } + } + + private static void AddBoth(long[] x, int xOff, long[] y1, int y1Off, long[] y2, int y2Off, int count) + { + for (int i = 0; i < count; ++i) + { + x[xOff + i] ^= y1[y1Off + i] ^ y2[y2Off + i]; + } + } + + private static void Distribute(long[] x, int src, int dst1, int dst2, int count) + { + for (int i = 0; i < count; ++i) + { + long v = x[src + i]; + x[dst1 + i] ^= v; + x[dst2 + i] ^= v; + } + } + + public int Length + { + get { return m_ints.Length; } + } + + private static void FlipWord(long[] buf, int off, int bit, long word) + { + int n = off + (int)((uint)bit >> 6); + int shift = bit & 0x3F; + if (shift == 0) + { + buf[n] ^= word; + } + else + { + buf[n] ^= word << shift; + word = (long)((ulong)word >> (64 - shift)); + if (word != 0) + { + buf[++n] ^= word; + } + } + } + + // private static long getWord(long[] buf, int off, int len, int bit) + // { + // int n = off + (bit >>> 6); + // int shift = bit & 0x3F; + // if (shift == 0) + // { + // return buf[n]; + // } + // long result = buf[n] >>> shift; + // if (++n < len) + // { + // result |= buf[n] << (64 - shift); + // } + // return result; + // } + + public bool TestBitZero() + { + return m_ints.Length > 0 && (m_ints[0] & 1L) != 0; + } + + private static bool TestBit(long[] buf, int off, int n) + { + // theInt = n / 64 + int theInt = (int)((uint)n >> 6); + // theBit = n % 64 + int theBit = n & 0x3F; + long tester = 1L << theBit; + return (buf[off + theInt] & tester) != 0; + } + + private static void FlipBit(long[] buf, int off, int n) + { + // theInt = n / 64 + int theInt = (int)((uint)n >> 6); + // theBit = n % 64 + int theBit = n & 0x3F; + long flipper = 1L << theBit; + buf[off + theInt] ^= flipper; + } + + // private static void SetBit(long[] buf, int off, int n) + // { + // // theInt = n / 64 + // int theInt = n >>> 6; + // // theBit = n % 64 + // int theBit = n & 0x3F; + // long setter = 1L << theBit; + // buf[off + theInt] |= setter; + // } + // + // private static void ClearBit(long[] buf, int off, int n) + // { + // // theInt = n / 64 + // int theInt = n >>> 6; + // // theBit = n % 64 + // int theBit = n & 0x3F; + // long setter = 1L << theBit; + // buf[off + theInt] &= ~setter; + // } + + private static void MultiplyWord(long a, long[] b, int bLen, long[] c, int cOff) + { + if ((a & 1L) != 0L) + { + Add(c, cOff, b, 0, bLen); + } + int k = 1; + while ((a = (long)((ulong)a >> 1)) != 0L) + { + if ((a & 1L) != 0L) + { + long carry = AddShiftedUp(c, cOff, b, 0, bLen, k); + if (carry != 0L) + { + c[cOff + bLen] ^= carry; + } + } + ++k; + } + } + + public LongArray ModMultiplyLD(LongArray other, int m, int[] ks) + { + /* + * Find out the degree of each argument and handle the zero cases + */ + int aDeg = Degree(); + if (aDeg == 0) + { + return this; + } + int bDeg = other.Degree(); + if (bDeg == 0) + { + return other; + } + + /* + * Swap if necessary so that A is the smaller argument + */ + LongArray A = this, B = other; + if (aDeg > bDeg) + { + A = other; B = this; + int tmp = aDeg; aDeg = bDeg; bDeg = tmp; + } + + /* + * Establish the word lengths of the arguments and result + */ + int aLen = (int)((uint)(aDeg + 63) >> 6); + int bLen = (int)((uint)(bDeg + 63) >> 6); + int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6); + + if (aLen == 1) + { + long a0 = A.m_ints[0]; + if (a0 == 1L) + { + return B; + } + + /* + * Fast path for small A, with performance dependent only on the number of set bits + */ + long[] c0 = new long[cLen]; + MultiplyWord(a0, B.m_ints, bLen, c0, 0); + + /* + * Reduce the raw answer against the reduction coefficients + */ + return ReduceResult(c0, 0, cLen, m, ks); + } + + /* + * Determine if B will get bigger during shifting + */ + int bMax = (int)((uint)(bDeg + 7 + 63) >> 6); + + /* + * Lookup table for the offset of each B in the tables + */ + int[] ti = new int[16]; + + /* + * Precompute table of all 4-bit products of B + */ + long[] T0 = new long[bMax << 4]; + int tOff = bMax; + ti[1] = tOff; + Array.Copy(B.m_ints, 0, T0, tOff, bLen); + for (int i = 2; i < 16; ++i) + { + ti[i] = (tOff += bMax); + if ((i & 1) == 0) + { + ShiftUp(T0, (int)((uint)tOff >> 1), T0, tOff, bMax, 1); + } + else + { + Add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax); + } + } + + /* + * Second table with all 4-bit products of B shifted 4 bits + */ + long[] T1 = new long[T0.Length]; + ShiftUp(T0, 0, T1, 0, T0.Length, 4); + // shiftUp(T0, bMax, T1, bMax, tOff, 4); + + long[] a = A.m_ints; + long[] c = new long[cLen]; + + int MASK = 0xF; + + /* + * Lopez-Dahab algorithm + */ + + for (int k = 56; k >= 0; k -= 8) + { + for (int j = 1; j < aLen; j += 2) + { + int aVal = (int)((ulong)a[j] >> k); + int u = aVal & MASK; + int v = (int)((uint)aVal >> 4) & MASK; + AddBoth(c, j - 1, T0, ti[u], T1, ti[v], bMax); + } + ShiftUp(c, 0, cLen, 8); + } + + for (int k = 56; k >= 0; k -= 8) + { + for (int j = 0; j < aLen; j += 2) + { + int aVal = (int)((ulong)a[j] >> k); + int u = aVal & MASK; + int v = (int)((uint)aVal >> 4) & MASK; + AddBoth(c, j, T0, ti[u], T1, ti[v], bMax); + } + if (k > 0) + { + ShiftUp(c, 0, cLen, 8); + } + } + + /* + * Finally the raw answer is collected, reduce it against the reduction coefficients + */ + return ReduceResult(c, 0, cLen, m, ks); + } + + public LongArray ModMultiply(LongArray other, int m, int[] ks) + { + /* + * Find out the degree of each argument and handle the zero cases + */ + int aDeg = Degree(); + if (aDeg == 0) + { + return this; + } + int bDeg = other.Degree(); + if (bDeg == 0) + { + return other; + } + + /* + * Swap if necessary so that A is the smaller argument + */ + LongArray A = this, B = other; + if (aDeg > bDeg) + { + A = other; B = this; + int tmp = aDeg; aDeg = bDeg; bDeg = tmp; + } + + /* + * Establish the word lengths of the arguments and result + */ + int aLen = (int)((uint)(aDeg + 63) >> 6); + int bLen = (int)((uint)(bDeg + 63) >> 6); + int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6); + + if (aLen == 1) + { + long a0 = A.m_ints[0]; + if (a0 == 1L) + { + return B; + } + + /* + * Fast path for small A, with performance dependent only on the number of set bits + */ + long[] c0 = new long[cLen]; + MultiplyWord(a0, B.m_ints, bLen, c0, 0); + + /* + * Reduce the raw answer against the reduction coefficients + */ + return ReduceResult(c0, 0, cLen, m, ks); + } + + /* + * Determine if B will get bigger during shifting + */ + int bMax = (int)((uint)(bDeg + 7 + 63) >> 6); + + /* + * Lookup table for the offset of each B in the tables + */ + int[] ti = new int[16]; + + /* + * Precompute table of all 4-bit products of B + */ + long[] T0 = new long[bMax << 4]; + int tOff = bMax; + ti[1] = tOff; + Array.Copy(B.m_ints, 0, T0, tOff, bLen); + for (int i = 2; i < 16; ++i) + { + ti[i] = (tOff += bMax); + if ((i & 1) == 0) + { + ShiftUp(T0, (int)((uint)tOff >> 1), T0, tOff, bMax, 1); + } + else + { + Add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax); + } + } + + /* + * Second table with all 4-bit products of B shifted 4 bits + */ + long[] T1 = new long[T0.Length]; + ShiftUp(T0, 0, T1, 0, T0.Length, 4); + // ShiftUp(T0, bMax, T1, bMax, tOff, 4); + + long[] a = A.m_ints; + long[] c = new long[cLen << 3]; + + int MASK = 0xF; + + /* + * Lopez-Dahab (Modified) algorithm + */ + + for (int aPos = 0; aPos < aLen; ++aPos) + { + long aVal = a[aPos]; + int cOff = aPos; + for (;;) + { + int u = (int)aVal & MASK; + aVal = (long)((ulong)aVal >> 4); + int v = (int)aVal & MASK; + AddBoth(c, cOff, T0, ti[u], T1, ti[v], bMax); + aVal = (long)((ulong)aVal >> 4); + if (aVal == 0L) + { + break; + } + cOff += cLen; + } + } + + { + int cOff = c.Length; + while ((cOff -= cLen) != 0) + { + AddShiftedUp(c, cOff - cLen, c, cOff, cLen, 8); + } + } + + /* + * Finally the raw answer is collected, reduce it against the reduction coefficients + */ + return ReduceResult(c, 0, cLen, m, ks); + } + + public LongArray ModMultiplyAlt(LongArray other, int m, int[] ks) + { + /* + * Find out the degree of each argument and handle the zero cases + */ + int aDeg = Degree(); + if (aDeg == 0) + { + return this; + } + int bDeg = other.Degree(); + if (bDeg == 0) + { + return other; + } + + /* + * Swap if necessary so that A is the smaller argument + */ + LongArray A = this, B = other; + if (aDeg > bDeg) + { + A = other; B = this; + int tmp = aDeg; aDeg = bDeg; bDeg = tmp; + } + + /* + * Establish the word lengths of the arguments and result + */ + int aLen = (int)((uint)(aDeg + 63) >> 6); + int bLen = (int)((uint)(bDeg + 63) >> 6); + int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6); + + if (aLen == 1) + { + long a0 = A.m_ints[0]; + if (a0 == 1L) + { + return B; + } + + /* + * Fast path for small A, with performance dependent only on the number of set bits + */ + long[] c0 = new long[cLen]; + MultiplyWord(a0, B.m_ints, bLen, c0, 0); + + /* + * Reduce the raw answer against the reduction coefficients + */ + return ReduceResult(c0, 0, cLen, m, ks); + } + + // NOTE: This works, but is slower than width 4 processing + // if (aLen == 2) + // { + // /* + // * Use common-multiplicand optimization to save ~1/4 of the adds + // */ + // long a1 = A.m_ints[0], a2 = A.m_ints[1]; + // long aa = a1 & a2; a1 ^= aa; a2 ^= aa; + // + // long[] b = B.m_ints; + // long[] c = new long[cLen]; + // multiplyWord(aa, b, bLen, c, 1); + // add(c, 0, c, 1, cLen - 1); + // multiplyWord(a1, b, bLen, c, 0); + // multiplyWord(a2, b, bLen, c, 1); + // + // /* + // * Reduce the raw answer against the reduction coefficients + // */ + // return ReduceResult(c, 0, cLen, m, ks); + // } + + /* + * Determine the parameters of the Interleaved window algorithm: the 'width' in bits to + * process together, the number of evaluation 'positions' implied by that width, and the + * 'top' position at which the regular window algorithm stops. + */ + int width, positions, top, banks; + + // NOTE: width 4 is the fastest over the entire range of sizes used in current crypto + // width = 1; positions = 64; top = 64; banks = 4; + // width = 2; positions = 32; top = 64; banks = 4; + // width = 3; positions = 21; top = 63; banks = 3; + width = 4; positions = 16; top = 64; banks = 8; + // width = 5; positions = 13; top = 65; banks = 7; + // width = 7; positions = 9; top = 63; banks = 9; + // width = 8; positions = 8; top = 64; banks = 8; + + /* + * Determine if B will get bigger during shifting + */ + int shifts = top < 64 ? positions : positions - 1; + int bMax = (int)((uint)(bDeg + shifts + 63) >> 6); + + int bTotal = bMax * banks, stride = width * banks; + + /* + * Create a single temporary buffer, with an offset table to find the positions of things in it + */ + int[] ci = new int[1 << width]; + int cTotal = aLen; + { + ci[0] = cTotal; + cTotal += bTotal; + ci[1] = cTotal; + for (int i = 2; i < ci.Length; ++i) + { + cTotal += cLen; + ci[i] = cTotal; + } + cTotal += cLen; + } + // NOTE: Provide a safe dump for "high zeroes" since we are adding 'bMax' and not 'bLen' + ++cTotal; + + long[] c = new long[cTotal]; + + // Prepare A in Interleaved form, according to the chosen width + Interleave(A.m_ints, 0, c, 0, aLen, width); + + // Make a working copy of B, since we will be shifting it + { + int bOff = aLen; + Array.Copy(B.m_ints, 0, c, bOff, bLen); + for (int bank = 1; bank < banks; ++bank) + { + ShiftUp(c, aLen, c, bOff += bMax, bMax, bank); + } + } + + /* + * The main loop analyzes the Interleaved windows in A, and for each non-zero window + * a single word-array XOR is performed to a carefully selected slice of 'c'. The loop is + * breadth-first, checking the lowest window in each word, then looping again for the + * next higher window position. + */ + int MASK = (1 << width) - 1; + + int k = 0; + for (;;) + { + int aPos = 0; + do + { + long aVal = (long)((ulong)c[aPos] >> k); + int bank = 0, bOff = aLen; + for (;;) + { + int index = (int)(aVal) & MASK; + if (index != 0) + { + /* + * Add to a 'c' buffer based on the bit-pattern of 'index'. Since A is in + * Interleaved form, the bits represent the current B shifted by 0, 'positions', + * 'positions' * 2, ..., 'positions' * ('width' - 1) + */ + Add(c, aPos + ci[index], c, bOff, bMax); + } + if (++bank == banks) + { + break; + } + bOff += bMax; + aVal = (long)((ulong)aVal >> width); + } + } + while (++aPos < aLen); + + if ((k += stride) >= top) + { + if (k >= 64) + { + break; + } + + /* + * Adjustment for window setups with top == 63, the final bit (if any) is processed + * as the top-bit of a window + */ + k = 64 - width; + MASK &= MASK << (top - k); + } + + /* + * After each position has been checked for all words of A, B is shifted up 1 place + */ + ShiftUp(c, aLen, bTotal, banks); + } + + int ciPos = ci.Length; + while (--ciPos > 1) + { + if ((ciPos & 1L) == 0L) + { + /* + * For even numbers, shift contents and add to the half-position + */ + AddShiftedUp(c, ci[(uint)ciPos >> 1], c, ci[ciPos], cLen, positions); + } + else + { + /* + * For odd numbers, 'distribute' contents to the result and the next-lowest position + */ + Distribute(c, ci[ciPos], ci[ciPos - 1], ci[1], cLen); + } + } + + /* + * Finally the raw answer is collected, reduce it against the reduction coefficients + */ + return ReduceResult(c, ci[1], cLen, m, ks); + } + + public LongArray ModReduce(int m, int[] ks) + { + long[] buf = Arrays.Clone(m_ints); + int rLen = ReduceInPlace(buf, 0, buf.Length, m, ks); + return new LongArray(buf, 0, rLen); + } + + public LongArray Multiply(LongArray other, int m, int[] ks) + { + /* + * Find out the degree of each argument and handle the zero cases + */ + int aDeg = Degree(); + if (aDeg == 0) + { + return this; + } + int bDeg = other.Degree(); + if (bDeg == 0) + { + return other; + } + + /* + * Swap if necessary so that A is the smaller argument + */ + LongArray A = this, B = other; + if (aDeg > bDeg) + { + A = other; B = this; + int tmp = aDeg; aDeg = bDeg; bDeg = tmp; + } + + /* + * Establish the word lengths of the arguments and result + */ + int aLen = (int)((uint)(aDeg + 63) >> 6); + int bLen = (int)((uint)(bDeg + 63) >> 6); + int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6); + + if (aLen == 1) + { + long a0 = A.m_ints[0]; + if (a0 == 1L) + { + return B; + } + + /* + * Fast path for small A, with performance dependent only on the number of set bits + */ + long[] c0 = new long[cLen]; + MultiplyWord(a0, B.m_ints, bLen, c0, 0); + + /* + * Reduce the raw answer against the reduction coefficients + */ + //return ReduceResult(c0, 0, cLen, m, ks); + return new LongArray(c0, 0, cLen); + } + + /* + * Determine if B will get bigger during shifting + */ + int bMax = (int)((uint)(bDeg + 7 + 63) >> 6); + + /* + * Lookup table for the offset of each B in the tables + */ + int[] ti = new int[16]; + + /* + * Precompute table of all 4-bit products of B + */ + long[] T0 = new long[bMax << 4]; + int tOff = bMax; + ti[1] = tOff; + Array.Copy(B.m_ints, 0, T0, tOff, bLen); + for (int i = 2; i < 16; ++i) + { + ti[i] = (tOff += bMax); + if ((i & 1) == 0) + { + ShiftUp(T0, (int)((uint)tOff >> 1), T0, tOff, bMax, 1); + } + else + { + Add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax); + } + } + + /* + * Second table with all 4-bit products of B shifted 4 bits + */ + long[] T1 = new long[T0.Length]; + ShiftUp(T0, 0, T1, 0, T0.Length, 4); + // ShiftUp(T0, bMax, T1, bMax, tOff, 4); + + long[] a = A.m_ints; + long[] c = new long[cLen << 3]; + + int MASK = 0xF; + + /* + * Lopez-Dahab (Modified) algorithm + */ + + for (int aPos = 0; aPos < aLen; ++aPos) + { + long aVal = a[aPos]; + int cOff = aPos; + for (; ; ) + { + int u = (int)aVal & MASK; + aVal = (long)((ulong)aVal >> 4); + int v = (int)aVal & MASK; + AddBoth(c, cOff, T0, ti[u], T1, ti[v], bMax); + aVal = (long)((ulong)aVal >> 4); + if (aVal == 0L) + { + break; + } + cOff += cLen; + } + } + + { + int cOff = c.Length; + while ((cOff -= cLen) != 0) + { + AddShiftedUp(c, cOff - cLen, c, cOff, cLen, 8); + } + } + + /* + * Finally the raw answer is collected, reduce it against the reduction coefficients + */ + //return ReduceResult(c, 0, cLen, m, ks); + return new LongArray(c, 0, cLen); + } + + public void Reduce(int m, int[] ks) + { + long[] buf = m_ints; + int rLen = ReduceInPlace(buf, 0, buf.Length, m, ks); + if (rLen < buf.Length) + { + m_ints = new long[rLen]; + Array.Copy(buf, 0, m_ints, 0, rLen); + } + } + + private static LongArray ReduceResult(long[] buf, int off, int len, int m, int[] ks) + { + int rLen = ReduceInPlace(buf, off, len, m, ks); + return new LongArray(buf, off, rLen); + } + + // private static void deInterleave(long[] x, int xOff, long[] z, int zOff, int count, int rounds) + // { + // for (int i = 0; i < count; ++i) + // { + // z[zOff + i] = deInterleave(x[zOff + i], rounds); + // } + // } + // + // private static long deInterleave(long x, int rounds) + // { + // while (--rounds >= 0) + // { + // x = deInterleave32(x & DEInterleave_MASK) | (deInterleave32((x >>> 1) & DEInterleave_MASK) << 32); + // } + // return x; + // } + // + // private static long deInterleave32(long x) + // { + // x = (x | (x >>> 1)) & 0x3333333333333333L; + // x = (x | (x >>> 2)) & 0x0F0F0F0F0F0F0F0FL; + // x = (x | (x >>> 4)) & 0x00FF00FF00FF00FFL; + // x = (x | (x >>> 8)) & 0x0000FFFF0000FFFFL; + // x = (x | (x >>> 16)) & 0x00000000FFFFFFFFL; + // return x; + // } + + private static int ReduceInPlace(long[] buf, int off, int len, int m, int[] ks) + { + int mLen = (m + 63) >> 6; + if (len < mLen) + { + return len; + } + + int numBits = System.Math.Min(len << 6, (m << 1) - 1); // TODO use actual degree? + int excessBits = (len << 6) - numBits; + while (excessBits >= 64) + { + --len; + excessBits -= 64; + } + + int kLen = ks.Length, kMax = ks[kLen - 1], kNext = kLen > 1 ? ks[kLen - 2] : 0; + int wordWiseLimit = System.Math.Max(m, kMax + 64); + int vectorableWords = (excessBits + System.Math.Min(numBits - wordWiseLimit, m - kNext)) >> 6; + if (vectorableWords > 1) + { + int vectorWiseWords = len - vectorableWords; + ReduceVectorWise(buf, off, len, vectorWiseWords, m, ks); + while (len > vectorWiseWords) + { + buf[off + --len] = 0L; + } + numBits = vectorWiseWords << 6; + } + + if (numBits > wordWiseLimit) + { + ReduceWordWise(buf, off, len, wordWiseLimit, m, ks); + numBits = wordWiseLimit; + } + + if (numBits > m) + { + ReduceBitWise(buf, off, numBits, m, ks); + } + + return mLen; + } + + private static void ReduceBitWise(long[] buf, int off, int BitLength, int m, int[] ks) + { + while (--BitLength >= m) + { + if (TestBit(buf, off, BitLength)) + { + ReduceBit(buf, off, BitLength, m, ks); + } + } + } + + private static void ReduceBit(long[] buf, int off, int bit, int m, int[] ks) + { + FlipBit(buf, off, bit); + int n = bit - m; + int j = ks.Length; + while (--j >= 0) + { + FlipBit(buf, off, ks[j] + n); + } + FlipBit(buf, off, n); + } + + private static void ReduceWordWise(long[] buf, int off, int len, int toBit, int m, int[] ks) + { + int toPos = (int)((uint)toBit >> 6); + + while (--len > toPos) + { + long word = buf[off + len]; + if (word != 0) + { + buf[off + len] = 0; + ReduceWord(buf, off, (len << 6), word, m, ks); + } + } + + { + int partial = toBit & 0x3F; + long word = (long)((ulong)buf[off + toPos] >> partial); + if (word != 0) + { + buf[off + toPos] ^= word << partial; + ReduceWord(buf, off, toBit, word, m, ks); + } + } + } + + private static void ReduceWord(long[] buf, int off, int bit, long word, int m, int[] ks) + { + int offset = bit - m; + int j = ks.Length; + while (--j >= 0) + { + FlipWord(buf, off, offset + ks[j], word); + } + FlipWord(buf, off, offset, word); + } + + private static void ReduceVectorWise(long[] buf, int off, int len, int words, int m, int[] ks) + { + /* + * NOTE: It's important we go from highest coefficient to lowest, because for the highest + * one (only) we allow the ranges to partially overlap, and therefore any changes must take + * effect for the subsequent lower coefficients. + */ + int baseBit = (words << 6) - m; + int j = ks.Length; + while (--j >= 0) + { + FlipVector(buf, off, buf, off + words, len - words, baseBit + ks[j]); + } + FlipVector(buf, off, buf, off + words, len - words, baseBit); + } + + private static void FlipVector(long[] x, int xOff, long[] y, int yOff, int yLen, int bits) + { + xOff += (int)((uint)bits >> 6); + bits &= 0x3F; + + if (bits == 0) + { + Add(x, xOff, y, yOff, yLen); + } + else + { + long carry = AddShiftedDown(x, xOff + 1, y, yOff, yLen, 64 - bits); + x[xOff] ^= carry; + } + } + + public LongArray ModSquare(int m, int[] ks) + { + int len = GetUsedLength(); + if (len == 0) + { + return this; + } + + int _2len = len << 1; + long[] r = new long[_2len]; + + int pos = 0; + while (pos < _2len) + { + long mi = m_ints[(uint)pos >> 1]; + r[pos++] = Interleave2_32to64((int)mi); + r[pos++] = Interleave2_32to64((int)((ulong)mi >> 32)); + } + + return new LongArray(r, 0, ReduceInPlace(r, 0, r.Length, m, ks)); + } + + public LongArray ModSquareN(int n, int m, int[] ks) + { + int len = GetUsedLength(); + if (len == 0) + { + return this; + } + + int mLen = (m + 63) >> 6; + long[] r = new long[mLen << 1]; + Array.Copy(m_ints, 0, r, 0, len); + + while (--n >= 0) + { + SquareInPlace(r, len, m, ks); + len = ReduceInPlace(r, 0, r.Length, m, ks); + } + + return new LongArray(r, 0, len); + } + + public LongArray Square(int m, int[] ks) + { + int len = GetUsedLength(); + if (len == 0) + { + return this; + } + + int _2len = len << 1; + long[] r = new long[_2len]; + + int pos = 0; + while (pos < _2len) + { + long mi = m_ints[(uint)pos >> 1]; + r[pos++] = Interleave2_32to64((int)mi); + r[pos++] = Interleave2_32to64((int)((ulong)mi >> 32)); + } + + return new LongArray(r, 0, r.Length); + } + + private static void SquareInPlace(long[] x, int xLen, int m, int[] ks) + { + int pos = xLen << 1; + while (--xLen >= 0) + { + long xVal = x[xLen]; + x[--pos] = Interleave2_32to64((int)((ulong)xVal >> 32)); + x[--pos] = Interleave2_32to64((int)xVal); + } + } + + private static void Interleave(long[] x, int xOff, long[] z, int zOff, int count, int width) + { + switch (width) + { + case 3: + Interleave3(x, xOff, z, zOff, count); + break; + case 5: + Interleave5(x, xOff, z, zOff, count); + break; + case 7: + Interleave7(x, xOff, z, zOff, count); + break; + default: + Interleave2_n(x, xOff, z, zOff, count, BitLengths[width] - 1); + break; + } + } + + private static void Interleave3(long[] x, int xOff, long[] z, int zOff, int count) + { + for (int i = 0; i < count; ++i) + { + z[zOff + i] = Interleave3(x[xOff + i]); + } + } + + private static long Interleave3(long x) + { + long z = x & (1L << 63); + return z + | Interleave3_21to63((int)x & 0x1FFFFF) + | Interleave3_21to63((int)((ulong)x >> 21) & 0x1FFFFF) << 1 + | Interleave3_21to63((int)((ulong)x >> 42) & 0x1FFFFF) << 2; + + // int zPos = 0, wPos = 0, xPos = 0; + // for (;;) + // { + // z |= ((x >>> xPos) & 1L) << zPos; + // if (++zPos == 63) + // { + // String sz2 = Long.toBinaryString(z); + // return z; + // } + // if ((xPos += 21) >= 63) + // { + // xPos = ++wPos; + // } + // } + } + + private static long Interleave3_21to63(int x) + { + int r00 = INTERLEAVE3_TABLE[x & 0x7F]; + int r21 = INTERLEAVE3_TABLE[((uint)x >> 7) & 0x7F]; + int r42 = INTERLEAVE3_TABLE[(uint)x >> 14]; + return (r42 & 0xFFFFFFFFL) << 42 | (r21 & 0xFFFFFFFFL) << 21 | (r00 & 0xFFFFFFFFL); + } + + private static void Interleave5(long[] x, int xOff, long[] z, int zOff, int count) + { + for (int i = 0; i < count; ++i) + { + z[zOff + i] = Interleave5(x[xOff + i]); + } + } + + private static long Interleave5(long x) + { + return Interleave3_13to65((int)x & 0x1FFF) + | Interleave3_13to65((int)((ulong)x >> 13) & 0x1FFF) << 1 + | Interleave3_13to65((int)((ulong)x >> 26) & 0x1FFF) << 2 + | Interleave3_13to65((int)((ulong)x >> 39) & 0x1FFF) << 3 + | Interleave3_13to65((int)((ulong)x >> 52) & 0x1FFF) << 4; + + // long z = 0; + // int zPos = 0, wPos = 0, xPos = 0; + // for (;;) + // { + // z |= ((x >>> xPos) & 1L) << zPos; + // if (++zPos == 64) + // { + // return z; + // } + // if ((xPos += 13) >= 64) + // { + // xPos = ++wPos; + // } + // } + } + + private static long Interleave3_13to65(int x) + { + int r00 = INTERLEAVE5_TABLE[x & 0x7F]; + int r35 = INTERLEAVE5_TABLE[(uint)x >> 7]; + return (r35 & 0xFFFFFFFFL) << 35 | (r00 & 0xFFFFFFFFL); + } + + private static void Interleave7(long[] x, int xOff, long[] z, int zOff, int count) + { + for (int i = 0; i < count; ++i) + { + z[zOff + i] = Interleave7(x[xOff + i]); + } + } + + private static long Interleave7(long x) + { + long z = x & (1L << 63); + return z + | INTERLEAVE7_TABLE[(int)x & 0x1FF] + | INTERLEAVE7_TABLE[(int)((ulong)x >> 9) & 0x1FF] << 1 + | INTERLEAVE7_TABLE[(int)((ulong)x >> 18) & 0x1FF] << 2 + | INTERLEAVE7_TABLE[(int)((ulong)x >> 27) & 0x1FF] << 3 + | INTERLEAVE7_TABLE[(int)((ulong)x >> 36) & 0x1FF] << 4 + | INTERLEAVE7_TABLE[(int)((ulong)x >> 45) & 0x1FF] << 5 + | INTERLEAVE7_TABLE[(int)((ulong)x >> 54) & 0x1FF] << 6; + + // int zPos = 0, wPos = 0, xPos = 0; + // for (;;) + // { + // z |= ((x >>> xPos) & 1L) << zPos; + // if (++zPos == 63) + // { + // return z; + // } + // if ((xPos += 9) >= 63) + // { + // xPos = ++wPos; + // } + // } + } + + private static void Interleave2_n(long[] x, int xOff, long[] z, int zOff, int count, int rounds) + { + for (int i = 0; i < count; ++i) + { + z[zOff + i] = Interleave2_n(x[xOff + i], rounds); + } + } + + private static long Interleave2_n(long x, int rounds) + { + while (rounds > 1) + { + rounds -= 2; + x = Interleave4_16to64((int)x & 0xFFFF) + | Interleave4_16to64((int)((ulong)x >> 16) & 0xFFFF) << 1 + | Interleave4_16to64((int)((ulong)x >> 32) & 0xFFFF) << 2 + | Interleave4_16to64((int)((ulong)x >> 48) & 0xFFFF) << 3; + } + if (rounds > 0) + { + x = Interleave2_32to64((int)x) | Interleave2_32to64((int)((ulong)x >> 32)) << 1; + } + return x; + } + + private static long Interleave4_16to64(int x) + { + int r00 = INTERLEAVE4_TABLE[x & 0xFF]; + int r32 = INTERLEAVE4_TABLE[(uint)x >> 8]; + return (r32 & 0xFFFFFFFFL) << 32 | (r00 & 0xFFFFFFFFL); + } + + private static long Interleave2_32to64(int x) + { + int r00 = INTERLEAVE2_TABLE[x & 0xFF] | INTERLEAVE2_TABLE[((uint)x >> 8) & 0xFF] << 16; + int r32 = INTERLEAVE2_TABLE[((uint)x >> 16) & 0xFF] | INTERLEAVE2_TABLE[(uint)x >> 24] << 16; + return (r32 & 0xFFFFFFFFL) << 32 | (r00 & 0xFFFFFFFFL); + } + + // private static LongArray ExpItohTsujii2(LongArray B, int n, int m, int[] ks) + // { + // LongArray t1 = B, t3 = new LongArray(new long[]{ 1L }); + // int scale = 1; + // + // int numTerms = n; + // while (numTerms > 1) + // { + // if ((numTerms & 1) != 0) + // { + // t3 = t3.ModMultiply(t1, m, ks); + // t1 = t1.modSquareN(scale, m, ks); + // } + // + // LongArray t2 = t1.modSquareN(scale, m, ks); + // t1 = t1.ModMultiply(t2, m, ks); + // numTerms >>>= 1; scale <<= 1; + // } + // + // return t3.ModMultiply(t1, m, ks); + // } + // + // private static LongArray ExpItohTsujii23(LongArray B, int n, int m, int[] ks) + // { + // LongArray t1 = B, t3 = new LongArray(new long[]{ 1L }); + // int scale = 1; + // + // int numTerms = n; + // while (numTerms > 1) + // { + // bool m03 = numTerms % 3 == 0; + // bool m14 = !m03 && (numTerms & 1) != 0; + // + // if (m14) + // { + // t3 = t3.ModMultiply(t1, m, ks); + // t1 = t1.modSquareN(scale, m, ks); + // } + // + // LongArray t2 = t1.modSquareN(scale, m, ks); + // t1 = t1.ModMultiply(t2, m, ks); + // + // if (m03) + // { + // t2 = t2.modSquareN(scale, m, ks); + // t1 = t1.ModMultiply(t2, m, ks); + // numTerms /= 3; scale *= 3; + // } + // else + // { + // numTerms >>>= 1; scale <<= 1; + // } + // } + // + // return t3.ModMultiply(t1, m, ks); + // } + // + // private static LongArray ExpItohTsujii235(LongArray B, int n, int m, int[] ks) + // { + // LongArray t1 = B, t4 = new LongArray(new long[]{ 1L }); + // int scale = 1; + // + // int numTerms = n; + // while (numTerms > 1) + // { + // if (numTerms % 5 == 0) + // { + //// t1 = ExpItohTsujii23(t1, 5, m, ks); + // + // LongArray t3 = t1; + // t1 = t1.modSquareN(scale, m, ks); + // + // LongArray t2 = t1.modSquareN(scale, m, ks); + // t1 = t1.ModMultiply(t2, m, ks); + // t2 = t1.modSquareN(scale << 1, m, ks); + // t1 = t1.ModMultiply(t2, m, ks); + // + // t1 = t1.ModMultiply(t3, m, ks); + // + // numTerms /= 5; scale *= 5; + // continue; + // } + // + // bool m03 = numTerms % 3 == 0; + // bool m14 = !m03 && (numTerms & 1) != 0; + // + // if (m14) + // { + // t4 = t4.ModMultiply(t1, m, ks); + // t1 = t1.modSquareN(scale, m, ks); + // } + // + // LongArray t2 = t1.modSquareN(scale, m, ks); + // t1 = t1.ModMultiply(t2, m, ks); + // + // if (m03) + // { + // t2 = t2.modSquareN(scale, m, ks); + // t1 = t1.ModMultiply(t2, m, ks); + // numTerms /= 3; scale *= 3; + // } + // else + // { + // numTerms >>>= 1; scale <<= 1; + // } + // } + // + // return t4.ModMultiply(t1, m, ks); + // } + + public LongArray ModInverse(int m, int[] ks) + { + /* + * Fermat's Little Theorem + */ + // LongArray A = this; + // LongArray B = A.modSquare(m, ks); + // LongArray R0 = B, R1 = B; + // for (int i = 2; i < m; ++i) + // { + // R1 = R1.modSquare(m, ks); + // R0 = R0.ModMultiply(R1, m, ks); + // } + // + // return R0; + + /* + * Itoh-Tsujii + */ + // LongArray B = modSquare(m, ks); + // switch (m) + // { + // case 409: + // return ExpItohTsujii23(B, m - 1, m, ks); + // case 571: + // return ExpItohTsujii235(B, m - 1, m, ks); + // case 163: + // case 233: + // case 283: + // default: + // return ExpItohTsujii2(B, m - 1, m, ks); + // } + + /* + * Inversion in F2m using the extended Euclidean algorithm + * + * Input: A nonzero polynomial a(z) of degree at most m-1 + * Output: a(z)^(-1) mod f(z) + */ + int uzDegree = Degree(); + if (uzDegree == 0) + { + throw new InvalidOperationException(); + } + if (uzDegree == 1) + { + return this; + } + + // u(z) := a(z) + LongArray uz = (LongArray)Copy(); + + int t = (m + 63) >> 6; + + // v(z) := f(z) + LongArray vz = new LongArray(t); + ReduceBit(vz.m_ints, 0, m, m, ks); + + // g1(z) := 1, g2(z) := 0 + LongArray g1z = new LongArray(t); + g1z.m_ints[0] = 1L; + LongArray g2z = new LongArray(t); + + int[] uvDeg = new int[]{ uzDegree, m + 1 }; + LongArray[] uv = new LongArray[]{ uz, vz }; + + int[] ggDeg = new int[]{ 1, 0 }; + LongArray[] gg = new LongArray[]{ g1z, g2z }; + + int b = 1; + int duv1 = uvDeg[b]; + int dgg1 = ggDeg[b]; + int j = duv1 - uvDeg[1 - b]; + + for (;;) + { + if (j < 0) + { + j = -j; + uvDeg[b] = duv1; + ggDeg[b] = dgg1; + b = 1 - b; + duv1 = uvDeg[b]; + dgg1 = ggDeg[b]; + } + + uv[b].AddShiftedByBitsSafe(uv[1 - b], uvDeg[1 - b], j); + + int duv2 = uv[b].DegreeFrom(duv1); + if (duv2 == 0) + { + return gg[1 - b]; + } + + { + int dgg2 = ggDeg[1 - b]; + gg[b].AddShiftedByBitsSafe(gg[1 - b], dgg2, j); + dgg2 += j; + + if (dgg2 > dgg1) + { + dgg1 = dgg2; + } + else if (dgg2 == dgg1) + { + dgg1 = gg[b].DegreeFrom(dgg1); + } + } + + j += (duv2 - duv1); + duv1 = duv2; + } + } + + public override bool Equals(object obj) + { + return Equals(obj as LongArray); + } + + public virtual bool Equals(LongArray other) + { + if (this == other) + return true; + if (null == other) + return false; + int usedLen = GetUsedLength(); + if (other.GetUsedLength() != usedLen) + { + return false; + } + for (int i = 0; i < usedLen; i++) + { + if (m_ints[i] != other.m_ints[i]) + { + return false; + } + } + return true; + } + + public override int GetHashCode() + { + int usedLen = GetUsedLength(); + int hash = 1; + for (int i = 0; i < usedLen; i++) + { + long mi = m_ints[i]; + hash *= 31; + hash ^= (int)mi; + hash *= 31; + hash ^= (int)((ulong)mi >> 32); + } + return hash; + } + + public LongArray Copy() + { + return new LongArray(Arrays.Clone(m_ints)); + } + + public override string ToString() + { + int i = GetUsedLength(); + if (i == 0) + { + return "0"; + } + + StringBuilder sb = new StringBuilder(Convert.ToString(m_ints[--i], 2)); + while (--i >= 0) + { + string s = Convert.ToString(m_ints[i], 2); + + // Add leading zeroes, except for highest significant word + int len = s.Length; + if (len < 64) + { + sb.Append(ZEROES.Substring(len)); + } + + sb.Append(s); + } + return sb.ToString(); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/SimpleBigDecimal.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/SimpleBigDecimal.cs new file mode 100644 index 00000000..23604d1b --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/SimpleBigDecimal.cs @@ -0,0 +1,241 @@ +using System; +using System.Text; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Abc +{ + /** + * Class representing a simple version of a big decimal. A + * SimpleBigDecimal is basically a + * {@link java.math.BigInteger BigInteger} with a few digits on the right of + * the decimal point. The number of (binary) digits on the right of the decimal + * point is called the scale of the SimpleBigDecimal. + * Unlike in {@link java.math.BigDecimal BigDecimal}, the scale is not adjusted + * automatically, but must be set manually. All SimpleBigDecimals + * taking part in the same arithmetic operation must have equal scale. The + * result of a multiplication of two SimpleBigDecimals returns a + * SimpleBigDecimal with double scale. + */ + internal class SimpleBigDecimal + // : Number + { + // private static final long serialVersionUID = 1L; + + private readonly BigInteger bigInt; + private readonly int scale; + + /** + * Returns a SimpleBigDecimal representing the same numerical + * value as value. + * @param value The value of the SimpleBigDecimal to be + * created. + * @param scale The scale of the SimpleBigDecimal to be + * created. + * @return The such created SimpleBigDecimal. + */ + public static SimpleBigDecimal GetInstance(BigInteger val, int scale) + { + return new SimpleBigDecimal(val.ShiftLeft(scale), scale); + } + + /** + * Constructor for SimpleBigDecimal. The value of the + * constructed SimpleBigDecimal Equals bigInt / + * 2scale. + * @param bigInt The bigInt value parameter. + * @param scale The scale of the constructed SimpleBigDecimal. + */ + public SimpleBigDecimal(BigInteger bigInt, int scale) + { + if (scale < 0) + throw new ArgumentException("scale may not be negative"); + + this.bigInt = bigInt; + this.scale = scale; + } + + private SimpleBigDecimal(SimpleBigDecimal limBigDec) + { + bigInt = limBigDec.bigInt; + scale = limBigDec.scale; + } + + private void CheckScale(SimpleBigDecimal b) + { + if (scale != b.scale) + throw new ArgumentException("Only SimpleBigDecimal of same scale allowed in arithmetic operations"); + } + + public SimpleBigDecimal AdjustScale(int newScale) + { + if (newScale < 0) + throw new ArgumentException("scale may not be negative"); + + if (newScale == scale) + return this; + + return new SimpleBigDecimal(bigInt.ShiftLeft(newScale - scale), newScale); + } + + public SimpleBigDecimal Add(SimpleBigDecimal b) + { + CheckScale(b); + return new SimpleBigDecimal(bigInt.Add(b.bigInt), scale); + } + + public SimpleBigDecimal Add(BigInteger b) + { + return new SimpleBigDecimal(bigInt.Add(b.ShiftLeft(scale)), scale); + } + + public SimpleBigDecimal Negate() + { + return new SimpleBigDecimal(bigInt.Negate(), scale); + } + + public SimpleBigDecimal Subtract(SimpleBigDecimal b) + { + return Add(b.Negate()); + } + + public SimpleBigDecimal Subtract(BigInteger b) + { + return new SimpleBigDecimal(bigInt.Subtract(b.ShiftLeft(scale)), scale); + } + + public SimpleBigDecimal Multiply(SimpleBigDecimal b) + { + CheckScale(b); + return new SimpleBigDecimal(bigInt.Multiply(b.bigInt), scale + scale); + } + + public SimpleBigDecimal Multiply(BigInteger b) + { + return new SimpleBigDecimal(bigInt.Multiply(b), scale); + } + + public SimpleBigDecimal Divide(SimpleBigDecimal b) + { + CheckScale(b); + BigInteger dividend = bigInt.ShiftLeft(scale); + return new SimpleBigDecimal(dividend.Divide(b.bigInt), scale); + } + + public SimpleBigDecimal Divide(BigInteger b) + { + return new SimpleBigDecimal(bigInt.Divide(b), scale); + } + + public SimpleBigDecimal ShiftLeft(int n) + { + return new SimpleBigDecimal(bigInt.ShiftLeft(n), scale); + } + + public int CompareTo(SimpleBigDecimal val) + { + CheckScale(val); + return bigInt.CompareTo(val.bigInt); + } + + public int CompareTo(BigInteger val) + { + return bigInt.CompareTo(val.ShiftLeft(scale)); + } + + public BigInteger Floor() + { + return bigInt.ShiftRight(scale); + } + + public BigInteger Round() + { + SimpleBigDecimal oneHalf = new SimpleBigDecimal(BigInteger.One, 1); + return Add(oneHalf.AdjustScale(scale)).Floor(); + } + + public int IntValue + { + get { return Floor().IntValue; } + } + + public long LongValue + { + get { return Floor().LongValue; } + } + +// public double doubleValue() +// { +// return new Double(ToString()).doubleValue(); +// } +// +// public float floatValue() +// { +// return new Float(ToString()).floatValue(); +// } + + public int Scale + { + get { return scale; } + } + + public override string ToString() + { + if (scale == 0) + return bigInt.ToString(); + + BigInteger floorBigInt = Floor(); + + BigInteger fract = bigInt.Subtract(floorBigInt.ShiftLeft(scale)); + if (bigInt.SignValue < 0) + { + fract = BigInteger.One.ShiftLeft(scale).Subtract(fract); + } + + if ((floorBigInt.SignValue == -1) && (!(fract.Equals(BigInteger.Zero)))) + { + floorBigInt = floorBigInt.Add(BigInteger.One); + } + string leftOfPoint = floorBigInt.ToString(); + + char[] fractCharArr = new char[scale]; + string fractStr = fract.ToString(2); + int fractLen = fractStr.Length; + int zeroes = scale - fractLen; + for (int i = 0; i < zeroes; i++) + { + fractCharArr[i] = '0'; + } + for (int j = 0; j < fractLen; j++) + { + fractCharArr[zeroes + j] = fractStr[j]; + } + string rightOfPoint = new string(fractCharArr); + + StringBuilder sb = new StringBuilder(leftOfPoint); + sb.Append("."); + sb.Append(rightOfPoint); + + return sb.ToString(); + } + + public override bool Equals( + object obj) + { + if (this == obj) + return true; + + SimpleBigDecimal other = obj as SimpleBigDecimal; + + if (other == null) + return false; + + return bigInt.Equals(other.bigInt) + && scale == other.scale; + } + + public override int GetHashCode() + { + return bigInt.GetHashCode() ^ scale; + } + + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/Tnaf.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/Tnaf.cs new file mode 100644 index 00000000..86e582f2 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/Tnaf.cs @@ -0,0 +1,845 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Abc +{ + /** + * Class holding methods for point multiplication based on the window + * τ-adic nonadjacent form (WTNAF). The algorithms are based on the + * paper "Improved Algorithms for Arithmetic on Anomalous Binary Curves" + * by Jerome A. Solinas. The paper first appeared in the Proceedings of + * Crypto 1997. + */ + internal class Tnaf + { + private static readonly BigInteger MinusOne = BigInteger.One.Negate(); + private static readonly BigInteger MinusTwo = BigInteger.Two.Negate(); + private static readonly BigInteger MinusThree = BigInteger.Three.Negate(); + private static readonly BigInteger Four = BigInteger.ValueOf(4); + + /** + * The window width of WTNAF. The standard value of 4 is slightly less + * than optimal for running time, but keeps space requirements for + * precomputation low. For typical curves, a value of 5 or 6 results in + * a better running time. When changing this value, the + * αu's must be computed differently, see + * e.g. "Guide to Elliptic Curve Cryptography", Darrel Hankerson, + * Alfred Menezes, Scott Vanstone, Springer-Verlag New York Inc., 2004, + * p. 121-122 + */ + public const sbyte Width = 4; + + /** + * 24 + */ + public const sbyte Pow2Width = 16; + + /** + * The αu's for a=0 as an array + * of ZTauElements. + */ + public static readonly ZTauElement[] Alpha0 = + { + null, + new ZTauElement(BigInteger.One, BigInteger.Zero), null, + new ZTauElement(MinusThree, MinusOne), null, + new ZTauElement(MinusOne, MinusOne), null, + new ZTauElement(BigInteger.One, MinusOne), null + }; + + /** + * The αu's for a=0 as an array + * of TNAFs. + */ + public static readonly sbyte[][] Alpha0Tnaf = + { + null, new sbyte[]{1}, null, new sbyte[]{-1, 0, 1}, null, new sbyte[]{1, 0, 1}, null, new sbyte[]{-1, 0, 0, 1} + }; + + /** + * The αu's for a=1 as an array + * of ZTauElements. + */ + public static readonly ZTauElement[] Alpha1 = + { + null, + new ZTauElement(BigInteger.One, BigInteger.Zero), null, + new ZTauElement(MinusThree, BigInteger.One), null, + new ZTauElement(MinusOne, BigInteger.One), null, + new ZTauElement(BigInteger.One, BigInteger.One), null + }; + + /** + * The αu's for a=1 as an array + * of TNAFs. + */ + public static readonly sbyte[][] Alpha1Tnaf = + { + null, new sbyte[]{1}, null, new sbyte[]{-1, 0, 1}, null, new sbyte[]{1, 0, 1}, null, new sbyte[]{-1, 0, 0, -1} + }; + + /** + * Computes the norm of an element λ of + * Z[τ]. + * @param mu The parameter μ of the elliptic curve. + * @param lambda The element λ of + * Z[τ]. + * @return The norm of λ. + */ + public static BigInteger Norm(sbyte mu, ZTauElement lambda) + { + BigInteger norm; + + // s1 = u^2 + BigInteger s1 = lambda.u.Multiply(lambda.u); + + // s2 = u * v + BigInteger s2 = lambda.u.Multiply(lambda.v); + + // s3 = 2 * v^2 + BigInteger s3 = lambda.v.Multiply(lambda.v).ShiftLeft(1); + + if (mu == 1) + { + norm = s1.Add(s2).Add(s3); + } + else if (mu == -1) + { + norm = s1.Subtract(s2).Add(s3); + } + else + { + throw new ArgumentException("mu must be 1 or -1"); + } + + return norm; + } + + /** + * Computes the norm of an element λ of + * R[τ], where λ = u + vτ + * and u and u are real numbers (elements of + * R). + * @param mu The parameter μ of the elliptic curve. + * @param u The real part of the element λ of + * R[τ]. + * @param v The τ-adic part of the element + * λ of R[τ]. + * @return The norm of λ. + */ + public static SimpleBigDecimal Norm(sbyte mu, SimpleBigDecimal u, SimpleBigDecimal v) + { + SimpleBigDecimal norm; + + // s1 = u^2 + SimpleBigDecimal s1 = u.Multiply(u); + + // s2 = u * v + SimpleBigDecimal s2 = u.Multiply(v); + + // s3 = 2 * v^2 + SimpleBigDecimal s3 = v.Multiply(v).ShiftLeft(1); + + if (mu == 1) + { + norm = s1.Add(s2).Add(s3); + } + else if (mu == -1) + { + norm = s1.Subtract(s2).Add(s3); + } + else + { + throw new ArgumentException("mu must be 1 or -1"); + } + + return norm; + } + + /** + * Rounds an element λ of R[τ] + * to an element of Z[τ], such that their difference + * has minimal norm. λ is given as + * λ = λ0 + λ1τ. + * @param lambda0 The component λ0. + * @param lambda1 The component λ1. + * @param mu The parameter μ of the elliptic curve. Must + * equal 1 or -1. + * @return The rounded element of Z[τ]. + * @throws ArgumentException if lambda0 and + * lambda1 do not have same scale. + */ + public static ZTauElement Round(SimpleBigDecimal lambda0, + SimpleBigDecimal lambda1, sbyte mu) + { + int scale = lambda0.Scale; + if (lambda1.Scale != scale) + throw new ArgumentException("lambda0 and lambda1 do not have same scale"); + + if (!((mu == 1) || (mu == -1))) + throw new ArgumentException("mu must be 1 or -1"); + + BigInteger f0 = lambda0.Round(); + BigInteger f1 = lambda1.Round(); + + SimpleBigDecimal eta0 = lambda0.Subtract(f0); + SimpleBigDecimal eta1 = lambda1.Subtract(f1); + + // eta = 2*eta0 + mu*eta1 + SimpleBigDecimal eta = eta0.Add(eta0); + if (mu == 1) + { + eta = eta.Add(eta1); + } + else + { + // mu == -1 + eta = eta.Subtract(eta1); + } + + // check1 = eta0 - 3*mu*eta1 + // check2 = eta0 + 4*mu*eta1 + SimpleBigDecimal threeEta1 = eta1.Add(eta1).Add(eta1); + SimpleBigDecimal fourEta1 = threeEta1.Add(eta1); + SimpleBigDecimal check1; + SimpleBigDecimal check2; + if (mu == 1) + { + check1 = eta0.Subtract(threeEta1); + check2 = eta0.Add(fourEta1); + } + else + { + // mu == -1 + check1 = eta0.Add(threeEta1); + check2 = eta0.Subtract(fourEta1); + } + + sbyte h0 = 0; + sbyte h1 = 0; + + // if eta >= 1 + if (eta.CompareTo(BigInteger.One) >= 0) + { + if (check1.CompareTo(MinusOne) < 0) + { + h1 = mu; + } + else + { + h0 = 1; + } + } + else + { + // eta < 1 + if (check2.CompareTo(BigInteger.Two) >= 0) + { + h1 = mu; + } + } + + // if eta < -1 + if (eta.CompareTo(MinusOne) < 0) + { + if (check1.CompareTo(BigInteger.One) >= 0) + { + h1 = (sbyte)-mu; + } + else + { + h0 = -1; + } + } + else + { + // eta >= -1 + if (check2.CompareTo(MinusTwo) < 0) + { + h1 = (sbyte)-mu; + } + } + + BigInteger q0 = f0.Add(BigInteger.ValueOf(h0)); + BigInteger q1 = f1.Add(BigInteger.ValueOf(h1)); + return new ZTauElement(q0, q1); + } + + /** + * Approximate division by n. For an integer + * k, the value λ = s k / n is + * computed to c bits of accuracy. + * @param k The parameter k. + * @param s The curve parameter s0 or + * s1. + * @param vm The Lucas Sequence element Vm. + * @param a The parameter a of the elliptic curve. + * @param m The bit length of the finite field + * Fm. + * @param c The number of bits of accuracy, i.e. the scale of the returned + * SimpleBigDecimal. + * @return The value λ = s k / n computed to + * c bits of accuracy. + */ + public static SimpleBigDecimal ApproximateDivisionByN(BigInteger k, + BigInteger s, BigInteger vm, sbyte a, int m, int c) + { + int _k = (m + 5)/2 + c; + BigInteger ns = k.ShiftRight(m - _k - 2 + a); + + BigInteger gs = s.Multiply(ns); + + BigInteger hs = gs.ShiftRight(m); + + BigInteger js = vm.Multiply(hs); + + BigInteger gsPlusJs = gs.Add(js); + BigInteger ls = gsPlusJs.ShiftRight(_k-c); + if (gsPlusJs.TestBit(_k-c-1)) + { + // round up + ls = ls.Add(BigInteger.One); + } + + return new SimpleBigDecimal(ls, c); + } + + /** + * Computes the τ-adic NAF (non-adjacent form) of an + * element λ of Z[τ]. + * @param mu The parameter μ of the elliptic curve. + * @param lambda The element λ of + * Z[τ]. + * @return The τ-adic NAF of λ. + */ + public static sbyte[] TauAdicNaf(sbyte mu, ZTauElement lambda) + { + if (!((mu == 1) || (mu == -1))) + throw new ArgumentException("mu must be 1 or -1"); + + BigInteger norm = Norm(mu, lambda); + + // Ceiling of log2 of the norm + int log2Norm = norm.BitLength; + + // If length(TNAF) > 30, then length(TNAF) < log2Norm + 3.52 + int maxLength = log2Norm > 30 ? log2Norm + 4 : 34; + + // The array holding the TNAF + sbyte[] u = new sbyte[maxLength]; + int i = 0; + + // The actual length of the TNAF + int length = 0; + + BigInteger r0 = lambda.u; + BigInteger r1 = lambda.v; + + while(!((r0.Equals(BigInteger.Zero)) && (r1.Equals(BigInteger.Zero)))) + { + // If r0 is odd + if (r0.TestBit(0)) + { + u[i] = (sbyte) BigInteger.Two.Subtract((r0.Subtract(r1.ShiftLeft(1))).Mod(Four)).IntValue; + + // r0 = r0 - u[i] + if (u[i] == 1) + { + r0 = r0.ClearBit(0); + } + else + { + // u[i] == -1 + r0 = r0.Add(BigInteger.One); + } + length = i; + } + else + { + u[i] = 0; + } + + BigInteger t = r0; + BigInteger s = r0.ShiftRight(1); + if (mu == 1) + { + r0 = r1.Add(s); + } + else + { + // mu == -1 + r0 = r1.Subtract(s); + } + + r1 = t.ShiftRight(1).Negate(); + i++; + } + + length++; + + // Reduce the TNAF array to its actual length + sbyte[] tnaf = new sbyte[length]; + Array.Copy(u, 0, tnaf, 0, length); + return tnaf; + } + + /** + * Applies the operation τ() to an + * AbstractF2mPoint. + * @param p The AbstractF2mPoint to which τ() is applied. + * @return τ(p) + */ + public static AbstractF2mPoint Tau(AbstractF2mPoint p) + { + return p.Tau(); + } + + /** + * Returns the parameter μ of the elliptic curve. + * @param curve The elliptic curve from which to obtain μ. + * The curve must be a Koblitz curve, i.e. a Equals + * 0 or 1 and b Equals + * 1. + * @return μ of the elliptic curve. + * @throws ArgumentException if the given ECCurve is not a Koblitz + * curve. + */ + public static sbyte GetMu(AbstractF2mCurve curve) + { + BigInteger a = curve.A.ToBigInteger(); + + sbyte mu; + if (a.SignValue == 0) + { + mu = -1; + } + else if (a.Equals(BigInteger.One)) + { + mu = 1; + } + else + { + throw new ArgumentException("No Koblitz curve (ABC), TNAF multiplication not possible"); + } + return mu; + } + + public static sbyte GetMu(ECFieldElement curveA) + { + return (sbyte)(curveA.IsZero ? -1 : 1); + } + + public static sbyte GetMu(int curveA) + { + return (sbyte)(curveA == 0 ? -1 : 1); + } + + /** + * Calculates the Lucas Sequence elements Uk-1 and + * Uk or Vk-1 and + * Vk. + * @param mu The parameter μ of the elliptic curve. + * @param k The index of the second element of the Lucas Sequence to be + * returned. + * @param doV If set to true, computes Vk-1 and + * Vk, otherwise Uk-1 and + * Uk. + * @return An array with 2 elements, containing Uk-1 + * and Uk or Vk-1 + * and Vk. + */ + public static BigInteger[] GetLucas(sbyte mu, int k, bool doV) + { + if (!(mu == 1 || mu == -1)) + throw new ArgumentException("mu must be 1 or -1"); + + BigInteger u0; + BigInteger u1; + BigInteger u2; + + if (doV) + { + u0 = BigInteger.Two; + u1 = BigInteger.ValueOf(mu); + } + else + { + u0 = BigInteger.Zero; + u1 = BigInteger.One; + } + + for (int i = 1; i < k; i++) + { + // u2 = mu*u1 - 2*u0; + BigInteger s = null; + if (mu == 1) + { + s = u1; + } + else + { + // mu == -1 + s = u1.Negate(); + } + + u2 = s.Subtract(u0.ShiftLeft(1)); + u0 = u1; + u1 = u2; + // System.out.println(i + ": " + u2); + // System.out.println(); + } + + BigInteger[] retVal = {u0, u1}; + return retVal; + } + + /** + * Computes the auxiliary value tw. If the width is + * 4, then for mu = 1, tw = 6 and for + * mu = -1, tw = 10 + * @param mu The parameter μ of the elliptic curve. + * @param w The window width of the WTNAF. + * @return the auxiliary value tw + */ + public static BigInteger GetTw(sbyte mu, int w) + { + if (w == 4) + { + if (mu == 1) + { + return BigInteger.ValueOf(6); + } + else + { + // mu == -1 + return BigInteger.ValueOf(10); + } + } + else + { + // For w <> 4, the values must be computed + BigInteger[] us = GetLucas(mu, w, false); + BigInteger twoToW = BigInteger.Zero.SetBit(w); + BigInteger u1invert = us[1].ModInverse(twoToW); + BigInteger tw; + tw = BigInteger.Two.Multiply(us[0]).Multiply(u1invert).Mod(twoToW); + //System.out.println("mu = " + mu); + //System.out.println("tw = " + tw); + return tw; + } + } + + /** + * Computes the auxiliary values s0 and + * s1 used for partial modular reduction. + * @param curve The elliptic curve for which to compute + * s0 and s1. + * @throws ArgumentException if curve is not a + * Koblitz curve (Anomalous Binary Curve, ABC). + */ + public static BigInteger[] GetSi(AbstractF2mCurve curve) + { + if (!curve.IsKoblitz) + throw new ArgumentException("si is defined for Koblitz curves only"); + + int m = curve.FieldSize; + int a = curve.A.ToBigInteger().IntValue; + sbyte mu = GetMu(a); + int shifts = GetShiftsForCofactor(curve.Cofactor); + int index = m + 3 - a; + BigInteger[] ui = GetLucas(mu, index, false); + + if (mu == 1) + { + ui[0] = ui[0].Negate(); + ui[1] = ui[1].Negate(); + } + + BigInteger dividend0 = BigInteger.One.Add(ui[1]).ShiftRight(shifts); + BigInteger dividend1 = BigInteger.One.Add(ui[0]).ShiftRight(shifts).Negate(); + + return new BigInteger[] { dividend0, dividend1 }; + } + + public static BigInteger[] GetSi(int fieldSize, int curveA, BigInteger cofactor) + { + sbyte mu = GetMu(curveA); + int shifts = GetShiftsForCofactor(cofactor); + int index = fieldSize + 3 - curveA; + BigInteger[] ui = GetLucas(mu, index, false); + if (mu == 1) + { + ui[0] = ui[0].Negate(); + ui[1] = ui[1].Negate(); + } + + BigInteger dividend0 = BigInteger.One.Add(ui[1]).ShiftRight(shifts); + BigInteger dividend1 = BigInteger.One.Add(ui[0]).ShiftRight(shifts).Negate(); + + return new BigInteger[] { dividend0, dividend1 }; + } + + protected static int GetShiftsForCofactor(BigInteger h) + { + if (h != null && h.BitLength < 4) + { + int hi = h.IntValue; + if (hi == 2) + return 1; + if (hi == 4) + return 2; + } + + throw new ArgumentException("h (Cofactor) must be 2 or 4"); + } + + /** + * Partial modular reduction modulo + * m - 1)/(τ - 1). + * @param k The integer to be reduced. + * @param m The bitlength of the underlying finite field. + * @param a The parameter a of the elliptic curve. + * @param s The auxiliary values s0 and + * s1. + * @param mu The parameter μ of the elliptic curve. + * @param c The precision (number of bits of accuracy) of the partial + * modular reduction. + * @return ρ := k partmod (τm - 1)/(τ - 1) + */ + public static ZTauElement PartModReduction(BigInteger k, int m, sbyte a, + BigInteger[] s, sbyte mu, sbyte c) + { + // d0 = s[0] + mu*s[1]; mu is either 1 or -1 + BigInteger d0; + if (mu == 1) + { + d0 = s[0].Add(s[1]); + } + else + { + d0 = s[0].Subtract(s[1]); + } + + BigInteger[] v = GetLucas(mu, m, true); + BigInteger vm = v[1]; + + SimpleBigDecimal lambda0 = ApproximateDivisionByN( + k, s[0], vm, a, m, c); + + SimpleBigDecimal lambda1 = ApproximateDivisionByN( + k, s[1], vm, a, m, c); + + ZTauElement q = Round(lambda0, lambda1, mu); + + // r0 = n - d0*q0 - 2*s1*q1 + BigInteger r0 = k.Subtract(d0.Multiply(q.u)).Subtract( + BigInteger.ValueOf(2).Multiply(s[1]).Multiply(q.v)); + + // r1 = s1*q0 - s0*q1 + BigInteger r1 = s[1].Multiply(q.u).Subtract(s[0].Multiply(q.v)); + + return new ZTauElement(r0, r1); + } + + /** + * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint} + * by a BigInteger using the reduced τ-adic + * NAF (RTNAF) method. + * @param p The AbstractF2mPoint to Multiply. + * @param k The BigInteger by which to Multiply p. + * @return k * p + */ + public static AbstractF2mPoint MultiplyRTnaf(AbstractF2mPoint p, BigInteger k) + { + AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve; + int m = curve.FieldSize; + int a = curve.A.ToBigInteger().IntValue; + sbyte mu = GetMu(a); + BigInteger[] s = curve.GetSi(); + ZTauElement rho = PartModReduction(k, m, (sbyte)a, s, mu, (sbyte)10); + + return MultiplyTnaf(p, rho); + } + + /** + * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint} + * by an element λ of Z[τ] + * using the τ-adic NAF (TNAF) method. + * @param p The AbstractF2mPoint to Multiply. + * @param lambda The element λ of + * Z[τ]. + * @return λ * p + */ + public static AbstractF2mPoint MultiplyTnaf(AbstractF2mPoint p, ZTauElement lambda) + { + AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve; + sbyte mu = GetMu(curve.A); + sbyte[] u = TauAdicNaf(mu, lambda); + + AbstractF2mPoint q = MultiplyFromTnaf(p, u); + + return q; + } + + /** + * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint} + * by an element λ of Z[τ] + * using the τ-adic NAF (TNAF) method, given the TNAF + * of λ. + * @param p The AbstractF2mPoint to Multiply. + * @param u The the TNAF of λ.. + * @return λ * p + */ + public static AbstractF2mPoint MultiplyFromTnaf(AbstractF2mPoint p, sbyte[] u) + { + ECCurve curve = p.Curve; + AbstractF2mPoint q = (AbstractF2mPoint)curve.Infinity; + AbstractF2mPoint pNeg = (AbstractF2mPoint)p.Negate(); + int tauCount = 0; + for (int i = u.Length - 1; i >= 0; i--) + { + ++tauCount; + sbyte ui = u[i]; + if (ui != 0) + { + q = q.TauPow(tauCount); + tauCount = 0; + + ECPoint x = ui > 0 ? p : pNeg; + q = (AbstractF2mPoint)q.Add(x); + } + } + if (tauCount > 0) + { + q = q.TauPow(tauCount); + } + return q; + } + + /** + * Computes the [τ]-adic window NAF of an element + * λ of Z[τ]. + * @param mu The parameter μ of the elliptic curve. + * @param lambda The element λ of + * Z[τ] of which to compute the + * [τ]-adic NAF. + * @param width The window width of the resulting WNAF. + * @param pow2w 2width. + * @param tw The auxiliary value tw. + * @param alpha The αu's for the window width. + * @return The [τ]-adic window NAF of + * λ. + */ + public static sbyte[] TauAdicWNaf(sbyte mu, ZTauElement lambda, + sbyte width, BigInteger pow2w, BigInteger tw, ZTauElement[] alpha) + { + if (!((mu == 1) || (mu == -1))) + throw new ArgumentException("mu must be 1 or -1"); + + BigInteger norm = Norm(mu, lambda); + + // Ceiling of log2 of the norm + int log2Norm = norm.BitLength; + + // If length(TNAF) > 30, then length(TNAF) < log2Norm + 3.52 + int maxLength = log2Norm > 30 ? log2Norm + 4 + width : 34 + width; + + // The array holding the TNAF + sbyte[] u = new sbyte[maxLength]; + + // 2^(width - 1) + BigInteger pow2wMin1 = pow2w.ShiftRight(1); + + // Split lambda into two BigIntegers to simplify calculations + BigInteger r0 = lambda.u; + BigInteger r1 = lambda.v; + int i = 0; + + // while lambda <> (0, 0) + while (!((r0.Equals(BigInteger.Zero))&&(r1.Equals(BigInteger.Zero)))) + { + // if r0 is odd + if (r0.TestBit(0)) + { + // uUnMod = r0 + r1*tw Mod 2^width + BigInteger uUnMod + = r0.Add(r1.Multiply(tw)).Mod(pow2w); + + sbyte uLocal; + // if uUnMod >= 2^(width - 1) + if (uUnMod.CompareTo(pow2wMin1) >= 0) + { + uLocal = (sbyte) uUnMod.Subtract(pow2w).IntValue; + } + else + { + uLocal = (sbyte) uUnMod.IntValue; + } + // uLocal is now in [-2^(width-1), 2^(width-1)-1] + + u[i] = uLocal; + bool s = true; + if (uLocal < 0) + { + s = false; + uLocal = (sbyte)-uLocal; + } + // uLocal is now >= 0 + + if (s) + { + r0 = r0.Subtract(alpha[uLocal].u); + r1 = r1.Subtract(alpha[uLocal].v); + } + else + { + r0 = r0.Add(alpha[uLocal].u); + r1 = r1.Add(alpha[uLocal].v); + } + } + else + { + u[i] = 0; + } + + BigInteger t = r0; + + if (mu == 1) + { + r0 = r1.Add(r0.ShiftRight(1)); + } + else + { + // mu == -1 + r0 = r1.Subtract(r0.ShiftRight(1)); + } + r1 = t.ShiftRight(1).Negate(); + i++; + } + return u; + } + + /** + * Does the precomputation for WTNAF multiplication. + * @param p The ECPoint for which to do the precomputation. + * @param a The parameter a of the elliptic curve. + * @return The precomputation array for p. + */ + public static AbstractF2mPoint[] GetPreComp(AbstractF2mPoint p, sbyte a) + { + sbyte[][] alphaTnaf = (a == 0) ? Tnaf.Alpha0Tnaf : Tnaf.Alpha1Tnaf; + + AbstractF2mPoint[] pu = new AbstractF2mPoint[(uint)(alphaTnaf.Length + 1) >> 1]; + pu[0] = p; + + uint precompLen = (uint)alphaTnaf.Length; + for (uint i = 3; i < precompLen; i += 2) + { + pu[i >> 1] = Tnaf.MultiplyFromTnaf(p, alphaTnaf[i]); + } + + p.Curve.NormalizeAll(pu); + + return pu; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/ZTauElement.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/ZTauElement.cs new file mode 100644 index 00000000..0b74e48d --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/abc/ZTauElement.cs @@ -0,0 +1,36 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Abc +{ + /** + * Class representing an element of Z[τ]. Let + * λ be an element of Z[τ]. Then + * λ is given as λ = u + vτ. The + * components u and v may be used directly, there + * are no accessor methods. + * Immutable class. + */ + internal class ZTauElement + { + /** + * The "real" part of λ. + */ + public readonly BigInteger u; + + /** + * The "τ-adic" part of λ. + */ + public readonly BigInteger v; + + /** + * Constructor for an element λ of + * Z[τ]. + * @param u The "real" part of λ. + * @param v The "τ-adic" part of + * λ. + */ + public ZTauElement(BigInteger u, BigInteger v) + { + this.u = u; + this.v = v; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/endo/ECEndomorphism.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/endo/ECEndomorphism.cs new file mode 100644 index 00000000..8dbbace4 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/endo/ECEndomorphism.cs @@ -0,0 +1,11 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Endo +{ + internal interface ECEndomorphism + { + ECPointMap PointMap { get; } + + bool HasEfficientPointMap { get; } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/endo/GlvEndomorphism.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/endo/GlvEndomorphism.cs new file mode 100644 index 00000000..143a369b --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/endo/GlvEndomorphism.cs @@ -0,0 +1,10 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Endo +{ + internal interface GlvEndomorphism + : ECEndomorphism + { + BigInteger[] DecomposeScalar(BigInteger k); + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/AbstractECMultiplier.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/AbstractECMultiplier.cs new file mode 100644 index 00000000..9c9b4cb2 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/AbstractECMultiplier.cs @@ -0,0 +1,29 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + internal abstract class AbstractECMultiplier + : ECMultiplier + { + public virtual ECPoint Multiply(ECPoint p, BigInteger k) + { + int sign = k.SignValue; + if (sign == 0 || p.IsInfinity) + return p.Curve.Infinity; + + ECPoint positive = MultiplyPositive(p, k.Abs()); + ECPoint result = sign > 0 ? positive : positive.Negate(); + + /* + * Although the various multipliers ought not to produce invalid output under normal + * circumstances, a final check here is advised to guard against fault attacks. + */ + return CheckResult(result); + } + + protected abstract ECPoint MultiplyPositive(ECPoint p, BigInteger k); + + protected virtual ECPoint CheckResult(ECPoint p) + { + return ECAlgorithms.ImplCheckResult(p); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/ECMultiplier.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/ECMultiplier.cs new file mode 100644 index 00000000..97fe1d13 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/ECMultiplier.cs @@ -0,0 +1,18 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + /** + * Interface for classes encapsulating a point multiplication algorithm + * for ECPoints. + */ + internal interface ECMultiplier + { + /** + * Multiplies the ECPoint p by k, i.e. + * p is added k times to itself. + * @param p The ECPoint to be multiplied. + * @param k The factor by which p is multiplied. + * @return p multiplied by k. + */ + ECPoint Multiply(ECPoint p, BigInteger k); + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointCombMultiplier.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointCombMultiplier.cs new file mode 100644 index 00000000..a63e18e2 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointCombMultiplier.cs @@ -0,0 +1,58 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.Raw; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + internal class FixedPointCombMultiplier + : AbstractECMultiplier + { + protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k) + { + ECCurve c = p.Curve; + int size = FixedPointUtilities.GetCombSize(c); + + if (k.BitLength > size) + { + /* + * TODO The comb works best when the scalars are less than the (possibly unknown) order. + * Still, if we want to handle larger scalars, we could allow customization of the comb + * size, or alternatively we could deal with the 'extra' bits either by running the comb + * multiple times as necessary, or by using an alternative multiplier as prelude. + */ + throw new InvalidOperationException("fixed-point comb doesn't support scalars larger than the curve order"); + } + + FixedPointPreCompInfo info = FixedPointUtilities.Precompute(p); + ECLookupTable lookupTable = info.LookupTable; + int width = info.Width; + + int d = (size + width - 1) / width; + + ECPoint R = c.Infinity; + + int fullComb = d * width; + uint[] K = Nat.FromBigInteger(fullComb, k); + + int top = fullComb - 1; + for (int i = 0; i < d; ++i) + { + uint secretIndex = 0; + + for (int j = top - i; j >= 0; j -= d) + { + uint secretBit = K[j >> 5] >> (j & 0x1F); + secretIndex ^= secretBit >> 1; + secretIndex <<= 1; + secretIndex ^= secretBit; + } + + ECPoint add = lookupTable.Lookup((int)secretIndex); + + R = R.TwicePlus(add); + } + + return R.Add(info.Offset); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointPreCompInfo.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointPreCompInfo.cs new file mode 100644 index 00000000..d5411657 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointPreCompInfo.cs @@ -0,0 +1,43 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + /** + * Class holding precomputation data for fixed-point multiplications. + */ + internal class FixedPointPreCompInfo + : PreCompInfo + { + protected ECPoint m_offset = null; + + /** + * Lookup table for the precomputed ECPoints used for a fixed point multiplication. + */ + protected ECLookupTable m_lookupTable = null; + + /** + * The width used for the precomputation. If a larger width precomputation + * is already available this may be larger than was requested, so calling + * code should refer to the actual width. + */ + protected int m_width = -1; + + public virtual ECLookupTable LookupTable + { + get { return m_lookupTable; } + set { this.m_lookupTable = value; } + } + + public virtual ECPoint Offset + { + get { return m_offset; } + set { this.m_offset = value; } + } + + public virtual int Width + { + get { return m_width; } + set { this.m_width = value; } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointUtilities.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointUtilities.cs new file mode 100644 index 00000000..14dea10a --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/FixedPointUtilities.cs @@ -0,0 +1,95 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + internal class FixedPointUtilities + { + public static readonly string PRECOMP_NAME = "bc_fixed_point"; + + public static int GetCombSize(ECCurve c) + { + BigInteger order = c.Order; + return order == null ? c.FieldSize + 1 : order.BitLength; + } + + public static FixedPointPreCompInfo GetFixedPointPreCompInfo(PreCompInfo preCompInfo) + { + return preCompInfo as FixedPointPreCompInfo; + } + + public static FixedPointPreCompInfo Precompute(ECPoint p) + { + return (FixedPointPreCompInfo)p.Curve.Precompute(p, PRECOMP_NAME, new FixedPointCallback(p)); + } + + private class FixedPointCallback + : IPreCompCallback + { + private readonly ECPoint m_p; + + internal FixedPointCallback(ECPoint p) + { + this.m_p = p; + } + + public PreCompInfo Precompute(PreCompInfo existing) + { + FixedPointPreCompInfo existingFP = (existing is FixedPointPreCompInfo) ? (FixedPointPreCompInfo)existing : null; + + ECCurve c = m_p.Curve; + int bits = FixedPointUtilities.GetCombSize(c); + int minWidth = bits > 250 ? 6 : 5; + int n = 1 << minWidth; + + if (CheckExisting(existingFP, n)) + return existingFP; + + int d = (bits + minWidth - 1) / minWidth; + + ECPoint[] pow2Table = new ECPoint[minWidth + 1]; + pow2Table[0] = m_p; + for (int i = 1; i < minWidth; ++i) + { + pow2Table[i] = pow2Table[i - 1].TimesPow2(d); + } + + // This will be the 'offset' value + pow2Table[minWidth] = pow2Table[0].Subtract(pow2Table[1]); + + c.NormalizeAll(pow2Table); + + ECPoint[] lookupTable = new ECPoint[n]; + lookupTable[0] = pow2Table[0]; + + for (int bit = minWidth - 1; bit >= 0; --bit) + { + ECPoint pow2 = pow2Table[bit]; + + int step = 1 << bit; + for (int i = step; i < n; i += (step << 1)) + { + lookupTable[i] = lookupTable[i - step].Add(pow2); + } + } + + c.NormalizeAll(lookupTable); + + FixedPointPreCompInfo result = new FixedPointPreCompInfo(); + result.LookupTable = c.CreateCacheSafeLookupTable(lookupTable, 0, lookupTable.Length); + result.Offset = pow2Table[minWidth]; + result.Width = minWidth; + return result; + } + + private bool CheckExisting(FixedPointPreCompInfo existingFP, int n) + { + return existingFP != null && CheckTable(existingFP.LookupTable, n); + } + + private bool CheckTable(ECLookupTable table, int n) + { + return table != null && table.Size >= n; + } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/GlvMultiplier.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/GlvMultiplier.cs new file mode 100644 index 00000000..e255b3ee --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/GlvMultiplier.cs @@ -0,0 +1,40 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Endo; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + internal class GlvMultiplier + : AbstractECMultiplier + { + protected readonly ECCurve curve; + protected readonly GlvEndomorphism glvEndomorphism; + + public GlvMultiplier(ECCurve curve, GlvEndomorphism glvEndomorphism) + { + if (curve == null || curve.Order == null) + throw new ArgumentException("Need curve with known group order", "curve"); + + this.curve = curve; + this.glvEndomorphism = glvEndomorphism; + } + + protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k) + { + if (!curve.Equals(p.Curve)) + throw new InvalidOperationException(); + + BigInteger n = p.Curve.Order; + BigInteger[] ab = glvEndomorphism.DecomposeScalar(k.Mod(n)); + BigInteger a = ab[0], b = ab[1]; + + ECPointMap pointMap = glvEndomorphism.PointMap; + if (glvEndomorphism.HasEfficientPointMap) + { + return ECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap, b); + } + + return ECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap.Map(p), b); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/IPreCompCallback.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/IPreCompCallback.cs new file mode 100644 index 00000000..87199889 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/IPreCompCallback.cs @@ -0,0 +1,9 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + internal interface IPreCompCallback + { + PreCompInfo Precompute(PreCompInfo existing); + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/PreCompInfo.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/PreCompInfo.cs new file mode 100644 index 00000000..32c40216 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/PreCompInfo.cs @@ -0,0 +1,11 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + /** + * Interface for classes storing precomputation data for multiplication + * algorithms. Used as a Memento (see GOF patterns) for + * WNafMultiplier. + */ + internal interface PreCompInfo + { + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/ValidityPreCompInfo.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/ValidityPreCompInfo.cs new file mode 100644 index 00000000..78dabc26 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/ValidityPreCompInfo.cs @@ -0,0 +1,44 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + internal class ValidityPreCompInfo + : PreCompInfo + { + internal static readonly string PRECOMP_NAME = "bc_validity"; + + private bool failed = false; + private bool curveEquationPassed = false; + private bool orderPassed = false; + + internal bool HasFailed() + { + return failed; + } + + internal void ReportFailed() + { + failed = true; + } + + internal bool HasCurveEquationPassed() + { + return curveEquationPassed; + } + + internal void ReportCurveEquationPassed() + { + curveEquationPassed = true; + } + + internal bool HasOrderPassed() + { + return orderPassed; + } + + internal void ReportOrderPassed() + { + orderPassed = true; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafL2RMultiplier.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafL2RMultiplier.cs new file mode 100644 index 00000000..04341566 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafL2RMultiplier.cs @@ -0,0 +1,98 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + /** + * Class implementing the WNAF (Window Non-Adjacent Form) multiplication + * algorithm. + */ + internal class WNafL2RMultiplier + : AbstractECMultiplier + { + /** + * Multiplies this by an integer k using the + * Window NAF method. + * @param k The integer by which this is multiplied. + * @return A new ECPoint which equals this + * multiplied by k. + */ + protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k) + { + // Clamp the window width in the range [2, 16] + int width = System.Math.Max(2, System.Math.Min(16, GetWindowSize(k.BitLength))); + + WNafPreCompInfo wnafPreCompInfo = WNafUtilities.Precompute(p, width, true); + ECPoint[] preComp = wnafPreCompInfo.PreComp; + ECPoint[] preCompNeg = wnafPreCompInfo.PreCompNeg; + + int[] wnaf = WNafUtilities.GenerateCompactWindowNaf(width, k); + + ECPoint R = p.Curve.Infinity; + + int i = wnaf.Length; + + /* + * NOTE: We try to optimize the first window using the precomputed points to substitute an + * addition for 2 or more doublings. + */ + if (i > 1) + { + int wi = wnaf[--i]; + int digit = wi >> 16, zeroes = wi & 0xFFFF; + + int n = System.Math.Abs(digit); + ECPoint[] table = digit < 0 ? preCompNeg : preComp; + + // Optimization can only be used for values in the lower half of the table + if ((n << 2) < (1 << width)) + { + int highest = LongArray.BitLengths[n]; + + // TODO Get addition/doubling cost ratio from curve and compare to 'scale' to see if worth substituting? + int scale = width - highest; + int lowBits = n ^ (1 << (highest - 1)); + + int i1 = ((1 << (width - 1)) - 1); + int i2 = (lowBits << scale) + 1; + R = table[i1 >> 1].Add(table[i2 >> 1]); + + zeroes -= scale; + + //Console.WriteLine("Optimized: 2^" + scale + " * " + n + " = " + i1 + " + " + i2); + } + else + { + R = table[n >> 1]; + } + + R = R.TimesPow2(zeroes); + } + + while (i > 0) + { + int wi = wnaf[--i]; + int digit = wi >> 16, zeroes = wi & 0xFFFF; + + int n = System.Math.Abs(digit); + ECPoint[] table = digit < 0 ? preCompNeg : preComp; + ECPoint r = table[n >> 1]; + + R = R.TwicePlus(r); + R = R.TimesPow2(zeroes); + } + + return R; + } + + /** + * Determine window width to use for a scalar multiplication of the given size. + * + * @param bits the bit-length of the scalar to multiply by + * @return the window size to use + */ + protected virtual int GetWindowSize(int bits) + { + return WNafUtilities.GetWindowSize(bits); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafPreCompInfo.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafPreCompInfo.cs new file mode 100644 index 00000000..91d56512 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafPreCompInfo.cs @@ -0,0 +1,46 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + /** + * Class holding precomputation data for the WNAF (Window Non-Adjacent Form) + * algorithm. + */ + internal class WNafPreCompInfo + : PreCompInfo + { + /** + * Array holding the precomputed ECPoints used for a Window + * NAF multiplication. + */ + protected ECPoint[] m_preComp = null; + + /** + * Array holding the negations of the precomputed ECPoints used + * for a Window NAF multiplication. + */ + protected ECPoint[] m_preCompNeg = null; + + /** + * Holds an ECPoint representing Twice(this). Used for the + * Window NAF multiplication to create or extend the precomputed values. + */ + protected ECPoint m_twice = null; + + public virtual ECPoint[] PreComp + { + get { return m_preComp; } + set { this.m_preComp = value; } + } + + public virtual ECPoint[] PreCompNeg + { + get { return m_preCompNeg; } + set { this.m_preCompNeg = value; } + } + + public virtual ECPoint Twice + { + get { return m_twice; } + set { this.m_twice = value; } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafUtilities.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafUtilities.cs new file mode 100644 index 00000000..8dbe7ef7 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WNafUtilities.cs @@ -0,0 +1,579 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + internal abstract class WNafUtilities + { + public static readonly string PRECOMP_NAME = "bc_wnaf"; + + private static readonly int[] DEFAULT_WINDOW_SIZE_CUTOFFS = new int[]{ 13, 41, 121, 337, 897, 2305 }; + + private static readonly ECPoint[] EMPTY_POINTS = new ECPoint[0]; + + 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 Arrays.EmptyInts; + + BigInteger _3k = k.ShiftLeft(1).Add(k); + + int bits = _3k.BitLength; + int[] naf = new int[bits >> 1]; + + BigInteger diff = _3k.Xor(k); + + int highBit = bits - 1, length = 0, zeroes = 0; + for (int i = 1; i < highBit; ++i) + { + if (!diff.TestBit(i)) + { + ++zeroes; + continue; + } + + int digit = k.TestBit(i) ? -1 : 1; + naf[length++] = (digit << 16) | zeroes; + zeroes = 1; + ++i; + } + + naf[length++] = (1 << 16) | zeroes; + + if (naf.Length > length) + { + naf = Trim(naf, length); + } + + return naf; + } + + public static int[] GenerateCompactWindowNaf(int width, BigInteger k) + { + if (width == 2) + { + return 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 Arrays.EmptyInts; + + int[] wnaf = new int[k.BitLength / width + 1]; + + // 2^width and a mask and sign bit set accordingly + int pow2 = 1 << width; + int mask = pow2 - 1; + int sign = pow2 >> 1; + + bool carry = false; + int length = 0, pos = 0; + + while (pos <= k.BitLength) + { + if (k.TestBit(pos) == carry) + { + ++pos; + continue; + } + + k = k.ShiftRight(pos); + + int digit = k.IntValue & mask; + if (carry) + { + ++digit; + } + + carry = (digit & sign) != 0; + if (carry) + { + digit -= pow2; + } + + int zeroes = length > 0 ? pos - 1 : pos; + wnaf[length++] = (digit << 16) | zeroes; + pos = width; + } + + // Reduce the WNAF array to its actual length + if (wnaf.Length > length) + { + wnaf = Trim(wnaf, length); + } + + return wnaf; + } + + public static byte[] GenerateJsf(BigInteger g, BigInteger h) + { + int digits = System.Math.Max(g.BitLength, h.BitLength) + 1; + byte[] jsf = new byte[digits]; + + BigInteger k0 = g, k1 = h; + int j = 0, d0 = 0, d1 = 0; + + int offset = 0; + while ((d0 | d1) != 0 || k0.BitLength > offset || k1.BitLength > offset) + { + int n0 = ((int)((uint)k0.IntValue >> offset) + d0) & 7; + int n1 = ((int)((uint)k1.IntValue >> offset) + d1) & 7; + + int u0 = n0 & 1; + if (u0 != 0) + { + u0 -= (n0 & 2); + if ((n0 + u0) == 4 && (n1 & 3) == 2) + { + u0 = -u0; + } + } + + int u1 = n1 & 1; + if (u1 != 0) + { + u1 -= (n1 & 2); + if ((n1 + u1) == 4 && (n0 & 3) == 2) + { + u1 = -u1; + } + } + + if ((d0 << 1) == 1 + u0) + { + d0 ^= 1; + } + if ((d1 << 1) == 1 + u1) + { + d1 ^= 1; + } + + if (++offset == 30) + { + offset = 0; + k0 = k0.ShiftRight(30); + k1 = k1.ShiftRight(30); + } + + jsf[j++] = (byte)((u0 << 4) | (u1 & 0xF)); + } + + // Reduce the JSF array to its actual length + if (jsf.Length > j) + { + jsf = Trim(jsf, j); + } + + return jsf; + } + + public static byte[] GenerateNaf(BigInteger k) + { + if (k.SignValue == 0) + return Arrays.EmptyBytes; + + BigInteger _3k = k.ShiftLeft(1).Add(k); + + int digits = _3k.BitLength - 1; + byte[] naf = new byte[digits]; + + BigInteger diff = _3k.Xor(k); + + for (int i = 1; i < digits; ++i) + { + if (diff.TestBit(i)) + { + naf[i - 1] = (byte)(k.TestBit(i) ? -1 : 1); + ++i; + } + } + + naf[digits - 1] = 1; + + return naf; + } + + /** + * Computes the Window NAF (non-adjacent Form) of an integer. + * @param width The width w of the Window NAF. The width is + * defined as the minimal number w, such that for any + * w consecutive digits in the resulting representation, at + * most one is non-zero. + * @param k The integer of which the Window NAF is computed. + * @return The Window NAF of the given width, such that the following holds: + * k = &sum;i=0l-1 ki2i + * , where the ki denote the elements of the + * returned byte[]. + */ + public static byte[] GenerateWindowNaf(int width, BigInteger k) + { + if (width == 2) + { + return GenerateNaf(k); + } + + if (width < 2 || width > 8) + throw new ArgumentException("must be in the range [2, 8]", "width"); + if (k.SignValue == 0) + return Arrays.EmptyBytes; + + byte[] wnaf = new byte[k.BitLength + 1]; + + // 2^width and a mask and sign bit set accordingly + int pow2 = 1 << width; + int mask = pow2 - 1; + int sign = pow2 >> 1; + + bool carry = false; + int length = 0, pos = 0; + + while (pos <= k.BitLength) + { + if (k.TestBit(pos) == carry) + { + ++pos; + continue; + } + + k = k.ShiftRight(pos); + + int digit = k.IntValue & mask; + if (carry) + { + ++digit; + } + + carry = (digit & sign) != 0; + if (carry) + { + digit -= pow2; + } + + length += (length > 0) ? pos - 1 : pos; + wnaf[length++] = (byte)digit; + pos = width; + } + + // Reduce the WNAF array to its actual length + if (wnaf.Length > length) + { + wnaf = Trim(wnaf, length); + } + + return wnaf; + } + + public static int GetNafWeight(BigInteger k) + { + if (k.SignValue == 0) + return 0; + + BigInteger _3k = k.ShiftLeft(1).Add(k); + BigInteger diff = _3k.Xor(k); + + return diff.BitCount; + } + + public static WNafPreCompInfo GetWNafPreCompInfo(ECPoint p) + { + return GetWNafPreCompInfo(p.Curve.GetPreCompInfo(p, PRECOMP_NAME)); + } + + public static WNafPreCompInfo GetWNafPreCompInfo(PreCompInfo preCompInfo) + { + return preCompInfo as WNafPreCompInfo; + } + + /** + * Determine window width to use for a scalar multiplication of the given size. + * + * @param bits the bit-length of the scalar to multiply by + * @return the window size to use + */ + public static int GetWindowSize(int bits) + { + return GetWindowSize(bits, DEFAULT_WINDOW_SIZE_CUTOFFS); + } + + /** + * Determine window width to use for a scalar multiplication of the given size. + * + * @param bits the bit-length of the scalar to multiply by + * @param windowSizeCutoffs a monotonically increasing list of bit sizes at which to increment the window width + * @return the window size to use + */ + public static int GetWindowSize(int bits, int[] windowSizeCutoffs) + { + int w = 0; + for (; w < windowSizeCutoffs.Length; ++w) + { + if (bits < windowSizeCutoffs[w]) + { + break; + } + } + return w + 2; + } + + public static ECPoint MapPointWithPrecomp(ECPoint p, int width, bool includeNegated, + ECPointMap pointMap) + { + ECCurve c = p.Curve; + WNafPreCompInfo wnafPreCompP = Precompute(p, width, includeNegated); + + ECPoint q = pointMap.Map(p); + c.Precompute(q, PRECOMP_NAME, new MapPointCallback(wnafPreCompP, includeNegated, pointMap)); + return q; + } + + public static WNafPreCompInfo Precompute(ECPoint p, int width, bool includeNegated) + { + return (WNafPreCompInfo)p.Curve.Precompute(p, PRECOMP_NAME, new WNafCallback(p, width, includeNegated)); + } + + private static byte[] Trim(byte[] a, int length) + { + byte[] result = new byte[length]; + Array.Copy(a, 0, result, 0, result.Length); + return result; + } + + private static int[] Trim(int[] a, int length) + { + int[] result = new int[length]; + Array.Copy(a, 0, result, 0, result.Length); + return result; + } + + private static ECPoint[] ResizeTable(ECPoint[] a, int length) + { + ECPoint[] result = new ECPoint[length]; + Array.Copy(a, 0, result, 0, a.Length); + return result; + } + + private class MapPointCallback + : IPreCompCallback + { + private readonly WNafPreCompInfo m_wnafPreCompP; + private readonly bool m_includeNegated; + private readonly ECPointMap m_pointMap; + + internal MapPointCallback(WNafPreCompInfo wnafPreCompP, bool includeNegated, ECPointMap pointMap) + { + this.m_wnafPreCompP = wnafPreCompP; + this.m_includeNegated = includeNegated; + this.m_pointMap = pointMap; + } + + public PreCompInfo Precompute(PreCompInfo existing) + { + WNafPreCompInfo result = new WNafPreCompInfo(); + + ECPoint twiceP = m_wnafPreCompP.Twice; + if (twiceP != null) + { + ECPoint twiceQ = m_pointMap.Map(twiceP); + result.Twice = twiceQ; + } + + ECPoint[] preCompP = m_wnafPreCompP.PreComp; + ECPoint[] preCompQ = new ECPoint[preCompP.Length]; + for (int i = 0; i < preCompP.Length; ++i) + { + preCompQ[i] = m_pointMap.Map(preCompP[i]); + } + result.PreComp = preCompQ; + + if (m_includeNegated) + { + ECPoint[] preCompNegQ = new ECPoint[preCompQ.Length]; + for (int i = 0; i < preCompNegQ.Length; ++i) + { + preCompNegQ[i] = preCompQ[i].Negate(); + } + result.PreCompNeg = preCompNegQ; + } + + return result; + } + } + + private class WNafCallback + : IPreCompCallback + { + private readonly ECPoint m_p; + private readonly int m_width; + private readonly bool m_includeNegated; + + internal WNafCallback(ECPoint p, int width, bool includeNegated) + { + this.m_p = p; + this.m_width = width; + this.m_includeNegated = includeNegated; + } + + public PreCompInfo Precompute(PreCompInfo existing) + { + WNafPreCompInfo existingWNaf = existing as WNafPreCompInfo; + + int reqPreCompLen = 1 << System.Math.Max(0, m_width - 2); + + if (CheckExisting(existingWNaf, reqPreCompLen, m_includeNegated)) + return existingWNaf; + + ECCurve c = m_p.Curve; + ECPoint[] preComp = null, preCompNeg = null; + ECPoint twiceP = null; + + if (existingWNaf != null) + { + preComp = existingWNaf.PreComp; + preCompNeg = existingWNaf.PreCompNeg; + twiceP = existingWNaf.Twice; + } + + int iniPreCompLen = 0; + if (preComp == null) + { + preComp = EMPTY_POINTS; + } + else + { + iniPreCompLen = preComp.Length; + } + + if (iniPreCompLen < reqPreCompLen) + { + preComp = WNafUtilities.ResizeTable(preComp, reqPreCompLen); + + if (reqPreCompLen == 1) + { + preComp[0] = m_p.Normalize(); + } + else + { + int curPreCompLen = iniPreCompLen; + if (curPreCompLen == 0) + { + preComp[0] = m_p; + curPreCompLen = 1; + } + + ECFieldElement iso = null; + + if (reqPreCompLen == 2) + { + preComp[1] = m_p.ThreeTimes(); + } + else + { + ECPoint isoTwiceP = twiceP, last = preComp[curPreCompLen - 1]; + if (isoTwiceP == null) + { + isoTwiceP = preComp[0].Twice(); + twiceP = isoTwiceP; + + /* + * For Fp curves with Jacobian projective coordinates, use a (quasi-)isomorphism + * where 'twiceP' is "affine", so that the subsequent additions are cheaper. This + * also requires scaling the initial point's X, Y coordinates, and reversing the + * isomorphism as part of the subsequent normalization. + * + * NOTE: The correctness of this optimization depends on: + * 1) additions do not use the curve's A, B coefficients. + * 2) no special cases (i.e. Q +/- Q) when calculating 1P, 3P, 5P, ... + */ + if (!twiceP.IsInfinity && ECAlgorithms.IsFpCurve(c) && c.FieldSize >= 64) + { + switch (c.CoordinateSystem) + { + case ECCurve.COORD_JACOBIAN: + case ECCurve.COORD_JACOBIAN_CHUDNOVSKY: + case ECCurve.COORD_JACOBIAN_MODIFIED: + { + iso = twiceP.GetZCoord(0); + isoTwiceP = c.CreatePoint(twiceP.XCoord.ToBigInteger(), + twiceP.YCoord.ToBigInteger()); + + ECFieldElement iso2 = iso.Square(), iso3 = iso2.Multiply(iso); + last = last.ScaleX(iso2).ScaleY(iso3); + + if (iniPreCompLen == 0) + { + preComp[0] = last; + } + break; + } + } + } + } + + while (curPreCompLen < reqPreCompLen) + { + /* + * Compute the new ECPoints for the precomputation array. The values 1, 3, + * 5, ..., 2^(width-1)-1 times p are computed + */ + preComp[curPreCompLen++] = last = last.Add(isoTwiceP); + } + } + + /* + * Having oft-used operands in affine form makes operations faster. + */ + c.NormalizeAll(preComp, iniPreCompLen, reqPreCompLen - iniPreCompLen, iso); + } + } + + if (m_includeNegated) + { + int pos; + if (preCompNeg == null) + { + pos = 0; + preCompNeg = new ECPoint[reqPreCompLen]; + } + else + { + pos = preCompNeg.Length; + if (pos < reqPreCompLen) + { + preCompNeg = WNafUtilities.ResizeTable(preCompNeg, reqPreCompLen); + } + } + + while (pos < reqPreCompLen) + { + preCompNeg[pos] = preComp[pos].Negate(); + ++pos; + } + } + + WNafPreCompInfo result = new WNafPreCompInfo(); + result.PreComp = preComp; + result.PreCompNeg = preCompNeg; + result.Twice = twiceP; + return result; + } + + private bool CheckExisting(WNafPreCompInfo existingWNaf, int reqPreCompLen, bool includeNegated) + { + return existingWNaf != null + && CheckTable(existingWNaf.PreComp, reqPreCompLen) + && (!includeNegated || CheckTable(existingWNaf.PreCompNeg, reqPreCompLen)); + } + + private bool CheckTable(ECPoint[] table, int reqLen) + { + return table != null && table.Length >= reqLen; + } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WTauNafMultiplier.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WTauNafMultiplier.cs new file mode 100644 index 00000000..1d19bdb6 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WTauNafMultiplier.cs @@ -0,0 +1,138 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Abc; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + /** + * Class implementing the WTNAF (Window + * τ-adic Non-Adjacent Form) algorithm. + */ + internal class WTauNafMultiplier + : AbstractECMultiplier + { + // TODO Create WTauNafUtilities class and move various functionality into it + internal static readonly string PRECOMP_NAME = "bc_wtnaf"; + + /** + * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint} + * by k using the reduced τ-adic NAF (RTNAF) + * method. + * @param p The AbstractF2mPoint to multiply. + * @param k The integer by which to multiply k. + * @return p multiplied by k. + */ + protected override ECPoint MultiplyPositive(ECPoint point, BigInteger k) + { + if (!(point is AbstractF2mPoint)) + throw new ArgumentException("Only AbstractF2mPoint can be used in WTauNafMultiplier"); + + AbstractF2mPoint p = (AbstractF2mPoint)point; + AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve; + int m = curve.FieldSize; + sbyte a = (sbyte)curve.A.ToBigInteger().IntValue; + sbyte mu = Tnaf.GetMu(a); + BigInteger[] s = curve.GetSi(); + + ZTauElement rho = Tnaf.PartModReduction(k, m, a, s, mu, (sbyte)10); + + return MultiplyWTnaf(p, rho, a, mu); + } + + /** + * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint} + * by an element λ of Z[τ] using + * the τ-adic NAF (TNAF) method. + * @param p The AbstractF2mPoint to multiply. + * @param lambda The element λ of + * Z[τ] of which to compute the + * [τ]-adic NAF. + * @return p multiplied by λ. + */ + private AbstractF2mPoint MultiplyWTnaf(AbstractF2mPoint p, ZTauElement lambda, + sbyte a, sbyte mu) + { + ZTauElement[] alpha = (a == 0) ? Tnaf.Alpha0 : Tnaf.Alpha1; + + BigInteger tw = Tnaf.GetTw(mu, Tnaf.Width); + + sbyte[]u = Tnaf.TauAdicWNaf(mu, lambda, Tnaf.Width, + BigInteger.ValueOf(Tnaf.Pow2Width), tw, alpha); + + return MultiplyFromWTnaf(p, u); + } + + /** + * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint} + * by an element λ of Z[τ] + * using the window τ-adic NAF (TNAF) method, given the + * WTNAF of λ. + * @param p The AbstractF2mPoint to multiply. + * @param u The the WTNAF of λ.. + * @return λ * p + */ + private static AbstractF2mPoint MultiplyFromWTnaf(AbstractF2mPoint p, sbyte[] u) + { + AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve; + sbyte a = (sbyte)curve.A.ToBigInteger().IntValue; + + WTauNafCallback callback = new WTauNafCallback(p, a); + WTauNafPreCompInfo preCompInfo = (WTauNafPreCompInfo)curve.Precompute(p, PRECOMP_NAME, callback); + AbstractF2mPoint[] pu = preCompInfo.PreComp; + + // TODO Include negations in precomp (optionally) and use from here + AbstractF2mPoint[] puNeg = new AbstractF2mPoint[pu.Length]; + for (int i = 0; i < pu.Length; ++i) + { + puNeg[i] = (AbstractF2mPoint)pu[i].Negate(); + } + + + // q = infinity + AbstractF2mPoint q = (AbstractF2mPoint) p.Curve.Infinity; + + int tauCount = 0; + for (int i = u.Length - 1; i >= 0; i--) + { + ++tauCount; + int ui = u[i]; + if (ui != 0) + { + q = q.TauPow(tauCount); + tauCount = 0; + + ECPoint x = ui > 0 ? pu[ui >> 1] : puNeg[(-ui) >> 1]; + q = (AbstractF2mPoint)q.Add(x); + } + } + if (tauCount > 0) + { + q = q.TauPow(tauCount); + } + return q; + } + + private class WTauNafCallback + : IPreCompCallback + { + private readonly AbstractF2mPoint m_p; + private readonly sbyte m_a; + + internal WTauNafCallback(AbstractF2mPoint p, sbyte a) + { + this.m_p = p; + this.m_a = a; + } + + public PreCompInfo Precompute(PreCompInfo existing) + { + if (existing is WTauNafPreCompInfo) + return existing; + + WTauNafPreCompInfo result = new WTauNafPreCompInfo(); + result.PreComp = Tnaf.GetPreComp(m_p, m_a); + return result; + } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WTauNafPreCompInfo.cs b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WTauNafPreCompInfo.cs new file mode 100644 index 00000000..f0a6f489 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/ec/multiplier/WTauNafPreCompInfo.cs @@ -0,0 +1,24 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier +{ + /** + * Class holding precomputation data for the WTNAF (Window + * τ-adic Non-Adjacent Form) algorithm. + */ + internal class WTauNafPreCompInfo + : PreCompInfo + { + /** + * Array holding the precomputed AbstractF2mPoints used for the + * WTNAF multiplication in + * {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply() + * WTauNafMultiplier.multiply()}. + */ + protected AbstractF2mPoint[] m_preComp; + + public virtual AbstractF2mPoint[] PreComp + { + get { return m_preComp; } + set { this.m_preComp = value; } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/FiniteFields.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/FiniteFields.cs new file mode 100644 index 00000000..77533c76 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/FiniteFields.cs @@ -0,0 +1,54 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal abstract class FiniteFields + { + internal static readonly IFiniteField GF_2 = new PrimeField(BigInteger.ValueOf(2)); + internal static readonly IFiniteField GF_3 = new PrimeField(BigInteger.ValueOf(3)); + + public static IPolynomialExtensionField GetBinaryExtensionField(int[] exponents) + { + if (exponents[0] != 0) + { + throw new ArgumentException("Irreducible polynomials in GF(2) must have constant term", "exponents"); + } + for (int i = 1; i < exponents.Length; ++i) + { + if (exponents[i] <= exponents[i - 1]) + { + throw new ArgumentException("Polynomial exponents must be montonically increasing", "exponents"); + } + } + + return new GenericPolynomialExtensionField(GF_2, new GF2Polynomial(exponents)); + } + + // public static IPolynomialExtensionField GetTernaryExtensionField(Term[] terms) + // { + // return new GenericPolynomialExtensionField(GF_3, new GF3Polynomial(terms)); + // } + + public static IFiniteField GetPrimeField(BigInteger characteristic) + { + int bitLength = characteristic.BitLength; + if (characteristic.SignValue <= 0 || bitLength < 2) + { + throw new ArgumentException("Must be >= 2", "characteristic"); + } + + if (bitLength < 3) + { + switch (characteristic.IntValue) + { + case 2: + return GF_2; + case 3: + return GF_3; + } + } + + return new PrimeField(characteristic); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/GF2Polynomial.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/GF2Polynomial.cs new file mode 100644 index 00000000..a7c916db --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/GF2Polynomial.cs @@ -0,0 +1,46 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal class GF2Polynomial + : IPolynomial + { + protected readonly int[] exponents; + + internal GF2Polynomial(int[] exponents) + { + this.exponents = Arrays.Clone(exponents); + } + + public virtual int Degree + { + get { return exponents[exponents.Length - 1]; } + } + + public virtual int[] GetExponentsPresent() + { + return Arrays.Clone(exponents); + } + + public override bool Equals(object obj) + { + if (this == obj) + { + return true; + } + GF2Polynomial other = obj as GF2Polynomial; + if (null == other) + { + return false; + } + return Arrays.AreEqual(exponents, other.exponents); + } + + public override int GetHashCode() + { + return Arrays.GetHashCode(exponents); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/GenericPolynomialExtensionField.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/GenericPolynomialExtensionField.cs new file mode 100644 index 00000000..29b4f57d --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/GenericPolynomialExtensionField.cs @@ -0,0 +1,63 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal class GenericPolynomialExtensionField + : IPolynomialExtensionField + { + protected readonly IFiniteField subfield; + protected readonly IPolynomial minimalPolynomial; + + internal GenericPolynomialExtensionField(IFiniteField subfield, IPolynomial polynomial) + { + this.subfield = subfield; + this.minimalPolynomial = polynomial; + } + + public virtual BigInteger Characteristic + { + get { return subfield.Characteristic; } + } + + public virtual int Dimension + { + get { return subfield.Dimension * minimalPolynomial.Degree; } + } + + public virtual IFiniteField Subfield + { + get { return subfield; } + } + + public virtual int Degree + { + get { return minimalPolynomial.Degree; } + } + + public virtual IPolynomial MinimalPolynomial + { + get { return minimalPolynomial; } + } + + public override bool Equals(object obj) + { + if (this == obj) + { + return true; + } + GenericPolynomialExtensionField other = obj as GenericPolynomialExtensionField; + if (null == other) + { + return false; + } + return subfield.Equals(other.subfield) && minimalPolynomial.Equals(other.minimalPolynomial); + } + + public override int GetHashCode() + { + return subfield.GetHashCode() ^ Integers.RotateLeft(minimalPolynomial.GetHashCode(), 16); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/IExtensionField.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/IExtensionField.cs new file mode 100644 index 00000000..242bcd00 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/IExtensionField.cs @@ -0,0 +1,12 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal interface IExtensionField + : IFiniteField + { + IFiniteField Subfield { get; } + + int Degree { get; } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/IFiniteField.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/IFiniteField.cs new file mode 100644 index 00000000..fa6b6fca --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/IFiniteField.cs @@ -0,0 +1,11 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal interface IFiniteField + { + BigInteger Characteristic { get; } + + int Dimension { get; } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/IPolynomial.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/IPolynomial.cs new file mode 100644 index 00000000..06a61663 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/IPolynomial.cs @@ -0,0 +1,13 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal interface IPolynomial + { + int Degree { get; } + + //BigInteger[] GetCoefficients(); + + int[] GetExponentsPresent(); + + //Term[] GetNonZeroTerms(); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/IPolynomialExtensionField.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/IPolynomialExtensionField.cs new file mode 100644 index 00000000..a419bec8 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/IPolynomialExtensionField.cs @@ -0,0 +1,8 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal interface IPolynomialExtensionField + : IExtensionField + { + IPolynomial MinimalPolynomial { get; } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/field/PrimeField.cs b/src/Renci.SshNet/Security/BouncyCastle/math/field/PrimeField.cs new file mode 100644 index 00000000..c0651e14 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/field/PrimeField.cs @@ -0,0 +1,42 @@ +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Field +{ + internal class PrimeField + : IFiniteField + { + protected readonly BigInteger characteristic; + + internal PrimeField(BigInteger characteristic) + { + this.characteristic = characteristic; + } + + public virtual BigInteger Characteristic + { + get { return characteristic; } + } + + public virtual int Dimension + { + get { return 1; } + } + + public override bool Equals(object obj) + { + if (this == obj) + { + return true; + } + PrimeField other = obj as PrimeField; + if (null == other) + { + return false; + } + return characteristic.Equals(other.characteristic); + } + + public override int GetHashCode() + { + return characteristic.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/raw/Mod.cs b/src/Renci.SshNet/Security/BouncyCastle/math/raw/Mod.cs new file mode 100644 index 00000000..1fa6b6da --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/raw/Mod.cs @@ -0,0 +1,185 @@ +using System; +using System.Diagnostics; + +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Utilities; +using Renci.SshNet.Security.Org.BouncyCastle.Security; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Raw +{ + internal abstract class Mod + { + private static readonly SecureRandom RandomSource = new SecureRandom(); + + public static void Invert(uint[] p, uint[] x, uint[] z) + { + int len = p.Length; + if (Nat.IsZero(len, x)) + throw new ArgumentException("cannot be 0", "x"); + if (Nat.IsOne(len, x)) + { + Array.Copy(x, 0, z, 0, len); + return; + } + + uint[] u = Nat.Copy(len, x); + uint[] a = Nat.Create(len); + a[0] = 1; + int ac = 0; + + if ((u[0] & 1) == 0) + { + InversionStep(p, u, len, a, ref ac); + } + if (Nat.IsOne(len, u)) + { + InversionResult(p, ac, a, z); + return; + } + + uint[] v = Nat.Copy(len, p); + uint[] b = Nat.Create(len); + int bc = 0; + + int uvLen = len; + + for (;;) + { + while (u[uvLen - 1] == 0 && v[uvLen - 1] == 0) + { + --uvLen; + } + + if (Nat.Gte(len, u, v)) + { + Nat.SubFrom(len, v, u); + Debug.Assert((u[0] & 1) == 0); + ac += Nat.SubFrom(len, b, a) - bc; + InversionStep(p, u, uvLen, a, ref ac); + if (Nat.IsOne(len, u)) + { + InversionResult(p, ac, a, z); + return; + } + } + else + { + Nat.SubFrom(len, u, v); + Debug.Assert((v[0] & 1) == 0); + bc += Nat.SubFrom(len, a, b) - ac; + InversionStep(p, v, uvLen, b, ref bc); + if (Nat.IsOne(len, v)) + { + InversionResult(p, bc, b, z); + return; + } + } + } + } + + public static uint[] Random(uint[] p) + { + int len = p.Length; + uint[] s = Nat.Create(len); + + uint m = p[len - 1]; + m |= m >> 1; + m |= m >> 2; + m |= m >> 4; + m |= m >> 8; + m |= m >> 16; + + do + { + byte[] bytes = new byte[len << 2]; + RandomSource.NextBytes(bytes); + Pack.BE_To_UInt32(bytes, 0, s); + s[len - 1] &= m; + } + while (Nat.Gte(len, s, p)); + + return s; + } + + public static void Add(uint[] p, uint[] x, uint[] y, uint[] z) + { + int len = p.Length; + uint c = Nat.Add(len, x, y, z); + if (c != 0) + { + Nat.SubFrom(len, p, z); + } + } + + public static void Subtract(uint[] p, uint[] x, uint[] y, uint[] z) + { + int len = p.Length; + int c = Nat.Sub(len, x, y, z); + if (c != 0) + { + Nat.AddTo(len, p, z); + } + } + + private static void InversionResult(uint[] p, int ac, uint[] a, uint[] z) + { + if (ac < 0) + { + Nat.Add(p.Length, a, p, z); + } + else + { + Array.Copy(a, 0, z, 0, p.Length); + } + } + + private static void InversionStep(uint[] p, uint[] u, int uLen, uint[] x, ref int xc) + { + int len = p.Length; + int count = 0; + while (u[0] == 0) + { + Nat.ShiftDownWord(uLen, u, 0); + count += 32; + } + + { + int zeroes = GetTrailingZeroes(u[0]); + if (zeroes > 0) + { + Nat.ShiftDownBits(uLen, u, zeroes, 0); + count += zeroes; + } + } + + for (int i = 0; i < count; ++i) + { + if ((x[0] & 1) != 0) + { + if (xc < 0) + { + xc += (int)Nat.AddTo(len, p, x); + } + else + { + xc += Nat.SubFrom(len, p, x); + } + } + + Debug.Assert(xc == 0 || xc == -1); + Nat.ShiftDownBit(len, x, (uint)xc); + } + } + + private static int GetTrailingZeroes(uint x) + { + Debug.Assert(x != 0); + int count = 0; + while ((x & 1) == 0) + { + x >>= 1; + ++count; + } + return count; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/raw/Nat.cs b/src/Renci.SshNet/Security/BouncyCastle/math/raw/Nat.cs new file mode 100644 index 00000000..710c2497 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/math/raw/Nat.cs @@ -0,0 +1,1153 @@ +using System; +using System.Diagnostics; + +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Math.Raw +{ + internal abstract class Nat + { + private const ulong M = 0xFFFFFFFFUL; + + public static uint Add(int len, uint[] x, uint[] y, uint[] z) + { + ulong c = 0; + for (int i = 0; i < len; ++i) + { + c += (ulong)x[i] + y[i]; + z[i] = (uint)c; + c >>= 32; + } + return (uint)c; + } + + public static uint Add33At(int len, uint x, uint[] z, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + ulong c = (ulong)z[zPos + 0] + x; + z[zPos + 0] = (uint)c; + c >>= 32; + c += (ulong)z[zPos + 1] + 1; + z[zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zPos + 2); + } + + public static uint Add33At(int len, uint x, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + ulong c = (ulong)z[zOff + zPos] + x; + z[zOff + zPos] = (uint)c; + c >>= 32; + c += (ulong)z[zOff + zPos + 1] + 1; + z[zOff + zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zOff, zPos + 2); + } + + public static uint Add33To(int len, uint x, uint[] z) + { + ulong c = (ulong)z[0] + x; + z[0] = (uint)c; + c >>= 32; + c += (ulong)z[1] + 1; + z[1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, 2); + } + + public static uint Add33To(int len, uint x, uint[] z, int zOff) + { + ulong c = (ulong)z[zOff + 0] + x; + z[zOff + 0] = (uint)c; + c >>= 32; + c += (ulong)z[zOff + 1] + 1; + z[zOff + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zOff, 2); + } + + public static uint AddBothTo(int len, uint[] x, uint[] y, uint[] z) + { + ulong c = 0; + for (int i = 0; i < len; ++i) + { + c += (ulong)x[i] + y[i] + z[i]; + z[i] = (uint)c; + c >>= 32; + } + return (uint)c; + } + + public static uint AddBothTo(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff) + { + ulong c = 0; + for (int i = 0; i < len; ++i) + { + c += (ulong)x[xOff + i] + y[yOff + i] + z[zOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + return (uint)c; + } + + public static uint AddDWordAt(int len, ulong x, uint[] z, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + ulong c = (ulong)z[zPos + 0] + (x & M); + z[zPos + 0] = (uint)c; + c >>= 32; + c += (ulong)z[zPos + 1] + (x >> 32); + z[zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zPos + 2); + } + + public static uint AddDWordAt(int len, ulong x, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + ulong c = (ulong)z[zOff + zPos] + (x & M); + z[zOff + zPos] = (uint)c; + c >>= 32; + c += (ulong)z[zOff + zPos + 1] + (x >> 32); + z[zOff + zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zOff, zPos + 2); + } + + public static uint AddDWordTo(int len, ulong x, uint[] z) + { + ulong c = (ulong)z[0] + (x & M); + z[0] = (uint)c; + c >>= 32; + c += (ulong)z[1] + (x >> 32); + z[1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, 2); + } + + public static uint AddDWordTo(int len, ulong x, uint[] z, int zOff) + { + ulong c = (ulong)z[zOff + 0] + (x & M); + z[zOff + 0] = (uint)c; + c >>= 32; + c += (ulong)z[zOff + 1] + (x >> 32); + z[zOff + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zOff, 2); + } + + public static uint AddTo(int len, uint[] x, uint[] z) + { + ulong c = 0; + for (int i = 0; i < len; ++i) + { + c += (ulong)x[i] + z[i]; + z[i] = (uint)c; + c >>= 32; + } + return (uint)c; + } + + public static uint AddTo(int len, uint[] x, int xOff, uint[] z, int zOff) + { + ulong c = 0; + for (int i = 0; i < len; ++i) + { + c += (ulong)x[xOff + i] + z[zOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + return (uint)c; + } + + public static uint AddWordAt(int len, uint x, uint[] z, int zPos) + { + Debug.Assert(zPos <= (len - 1)); + ulong c = (ulong)x + z[zPos]; + z[zPos] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zPos + 1); + } + + public static uint AddWordAt(int len, uint x, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= (len - 1)); + ulong c = (ulong)x + z[zOff + zPos]; + z[zOff + zPos] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zOff, zPos + 1); + } + + public static uint AddWordTo(int len, uint x, uint[] z) + { + ulong c = (ulong)x + z[0]; + z[0] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, 1); + } + + public static uint AddWordTo(int len, uint x, uint[] z, int zOff) + { + ulong c = (ulong)x + z[zOff]; + z[zOff] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zOff, 1); + } + + public static uint CAdd(int len, int mask, uint[] x, uint[] y, uint[] z) + { + uint MASK = (uint)-(mask & 1); + + ulong c = 0; + for (int i = 0; i < len; ++i) + { + c += (ulong)x[i] + (y[i] & MASK); + z[i] = (uint)c; + c >>= 32; + } + return (uint)c; + } + + public static void CMov(int len, int mask, uint[] x, int xOff, uint[] z, int zOff) + { + uint MASK = (uint)-(mask & 1); + + for (int i = 0; i < len; ++i) + { + uint z_i = z[zOff + i], diff = z_i ^ x[xOff + i]; + z_i ^= (diff & MASK); + z[zOff + i] = z_i; + } + + //uint half = 0x55555555U, rest = half << (-(int)MASK); + + //for (int i = 0; i < len; ++i) + //{ + // uint z_i = z[zOff + i], diff = z_i ^ x[xOff + i]; + // z_i ^= (diff & half); + // z_i ^= (diff & rest); + // z[zOff + i] = z_i; + //} + } + + public static void CMov(int len, int mask, int[] x, int xOff, int[] z, int zOff) + { + mask = -(mask & 1); + + for (int i = 0; i < len; ++i) + { + int z_i = z[zOff + i], diff = z_i ^ x[xOff + i]; + z_i ^= (diff & mask); + z[zOff + i] = z_i; + } + + //int half = 0x55555555, rest = half << (-mask); + + //for (int i = 0; i < len; ++i) + //{ + // int z_i = z[zOff + i], diff = z_i ^ x[xOff + i]; + // z_i ^= (diff & half); + // z_i ^= (diff & rest); + // z[zOff + i] = z_i; + //} + } + + public static void Copy(int len, uint[] x, uint[] z) + { + Array.Copy(x, 0, z, 0, len); + } + + public static uint[] Copy(int len, uint[] x) + { + uint[] z = new uint[len]; + Array.Copy(x, 0, z, 0, len); + return z; + } + + public static void Copy(int len, uint[] x, int xOff, uint[] z, int zOff) + { + Array.Copy(x, xOff, z, zOff, len); + } + + public static uint[] Create(int len) + { + return new uint[len]; + } + + public static ulong[] Create64(int len) + { + return new ulong[len]; + } + + public static int Dec(int len, uint[] z) + { + for (int i = 0; i < len; ++i) + { + if (--z[i] != uint.MaxValue) + { + return 0; + } + } + return -1; + } + + public static int Dec(int len, uint[] x, uint[] z) + { + int i = 0; + while (i < len) + { + uint c = x[i] - 1; + z[i] = c; + ++i; + if (c != uint.MaxValue) + { + while (i < len) + { + z[i] = x[i]; + ++i; + } + return 0; + } + } + return -1; + } + + public static int DecAt(int len, uint[] z, int zPos) + { + Debug.Assert(zPos <= len); + for (int i = zPos; i < len; ++i) + { + if (--z[i] != uint.MaxValue) + { + return 0; + } + } + return -1; + } + + public static int DecAt(int len, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= len); + for (int i = zPos; i < len; ++i) + { + if (--z[zOff + i] != uint.MaxValue) + { + return 0; + } + } + return -1; + } + + public static bool Eq(int len, uint[] x, uint[] y) + { + for (int i = len - 1; i >= 0; --i) + { + if (x[i] != y[i]) + { + return false; + } + } + return true; + } + + public static uint[] FromBigInteger(int bits, BigInteger x) + { + if (x.SignValue < 0 || x.BitLength > bits) + throw new ArgumentException(); + + int len = (bits + 31) >> 5; + uint[] z = Create(len); + int i = 0; + while (x.SignValue != 0) + { + z[i++] = (uint)x.IntValue; + x = x.ShiftRight(32); + } + return z; + } + + public static uint GetBit(uint[] x, int bit) + { + if (bit == 0) + { + return x[0] & 1; + } + int w = bit >> 5; + if (w < 0 || w >= x.Length) + { + return 0; + } + int b = bit & 31; + return (x[w] >> b) & 1; + } + + public static bool Gte(int len, uint[] x, uint[] y) + { + for (int i = len - 1; i >= 0; --i) + { + uint x_i = x[i], y_i = y[i]; + if (x_i < y_i) + return false; + if (x_i > y_i) + return true; + } + return true; + } + + public static uint Inc(int len, uint[] z) + { + for (int i = 0; i < len; ++i) + { + if (++z[i] != uint.MinValue) + { + return 0; + } + } + return 1; + } + + public static uint Inc(int len, uint[] x, uint[] z) + { + int i = 0; + while (i < len) + { + uint c = x[i] + 1; + z[i] = c; + ++i; + if (c != 0) + { + while (i < len) + { + z[i] = x[i]; + ++i; + } + return 0; + } + } + return 1; + } + + public static uint IncAt(int len, uint[] z, int zPos) + { + Debug.Assert(zPos <= len); + for (int i = zPos; i < len; ++i) + { + if (++z[i] != uint.MinValue) + { + return 0; + } + } + return 1; + } + + public static uint IncAt(int len, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= len); + for (int i = zPos; i < len; ++i) + { + if (++z[zOff + i] != uint.MinValue) + { + return 0; + } + } + return 1; + } + + public static bool IsOne(int len, uint[] x) + { + if (x[0] != 1) + { + return false; + } + for (int i = 1; i < len; ++i) + { + if (x[i] != 0) + { + return false; + } + } + return true; + } + + public static bool IsZero(int len, uint[] x) + { + if (x[0] != 0) + { + return false; + } + for (int i = 1; i < len; ++i) + { + if (x[i] != 0) + { + return false; + } + } + return true; + } + + public static void Mul(int len, uint[] x, uint[] y, uint[] zz) + { + zz[len] = MulWord(len, x[0], y, zz); + + for (int i = 1; i < len; ++i) + { + zz[i + len] = MulWordAddTo(len, x[i], y, 0, zz, i); + } + } + + public static void Mul(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff) + { + zz[zzOff + len] = MulWord(len, x[xOff], y, yOff, zz, zzOff); + + for (int i = 1; i < len; ++i) + { + zz[zzOff + i + len] = MulWordAddTo(len, x[xOff + i], y, yOff, zz, zzOff + i); + } + } + + public static void Mul(uint[] x, int xOff, int xLen, uint[] y, int yOff, int yLen, uint[] zz, int zzOff) + { + zz[zzOff + yLen] = MulWord(yLen, x[xOff], y, yOff, zz, zzOff); + + for (int i = 1; i < xLen; ++i) + { + zz[zzOff + i + yLen] = MulWordAddTo(yLen, x[xOff + i], y, yOff, zz, zzOff + i); + } + } + + public static uint MulAddTo(int len, uint[] x, uint[] y, uint[] zz) + { + ulong zc = 0; + for (int i = 0; i < len; ++i) + { + ulong c = MulWordAddTo(len, x[i], y, 0, zz, i) & M; + c += zc + (zz[i + len] & M); + zz[i + len] = (uint)c; + zc = c >> 32; + } + return (uint)zc; + } + + public static uint MulAddTo(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff) + { + ulong zc = 0; + for (int i = 0; i < len; ++i) + { + ulong c = MulWordAddTo(len, x[xOff + i], y, yOff, zz, zzOff) & M; + c += zc + (zz[zzOff + len] & M); + zz[zzOff + len] = (uint)c; + zc = c >> 32; + ++zzOff; + } + return (uint)zc; + } + + public static uint Mul31BothAdd(int len, uint a, uint[] x, uint b, uint[] y, uint[] z, int zOff) + { + ulong c = 0, aVal = (ulong)a, bVal = (ulong)b; + int i = 0; + do + { + c += aVal * x[i] + bVal * y[i] + z[zOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + while (++i < len); + return (uint)c; + } + + public static uint MulWord(int len, uint x, uint[] y, uint[] z) + { + ulong c = 0, xVal = (ulong)x; + int i = 0; + do + { + c += xVal * y[i]; + z[i] = (uint)c; + c >>= 32; + } + while (++i < len); + return (uint)c; + } + + public static uint MulWord(int len, uint x, uint[] y, int yOff, uint[] z, int zOff) + { + ulong c = 0, xVal = (ulong)x; + int i = 0; + do + { + c += xVal * y[yOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + while (++i < len); + return (uint)c; + } + + public static uint MulWordAddTo(int len, uint x, uint[] y, int yOff, uint[] z, int zOff) + { + ulong c = 0, xVal = (ulong)x; + int i = 0; + do + { + c += xVal * y[yOff + i] + z[zOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + while (++i < len); + return (uint)c; + } + + public static uint MulWordDwordAddAt(int len, uint x, ulong y, uint[] z, int zPos) + { + Debug.Assert(zPos <= (len - 3)); + ulong c = 0, xVal = (ulong)x; + c += xVal * (uint)y + z[zPos + 0]; + z[zPos + 0] = (uint)c; + c >>= 32; + c += xVal * (y >> 32) + z[zPos + 1]; + z[zPos + 1] = (uint)c; + c >>= 32; + c += (ulong)z[zPos + 2]; + z[zPos + 2] = (uint)c; + c >>= 32; + return c == 0 ? 0 : IncAt(len, z, zPos + 3); + } + + public static uint ShiftDownBit(int len, uint[] z, uint c) + { + int i = len; + while (--i >= 0) + { + uint next = z[i]; + z[i] = (next >> 1) | (c << 31); + c = next; + } + return c << 31; + } + + public static uint ShiftDownBit(int len, uint[] z, int zOff, uint c) + { + int i = len; + while (--i >= 0) + { + uint next = z[zOff + i]; + z[zOff + i] = (next >> 1) | (c << 31); + c = next; + } + return c << 31; + } + + public static uint ShiftDownBit(int len, uint[] x, uint c, uint[] z) + { + int i = len; + while (--i >= 0) + { + uint next = x[i]; + z[i] = (next >> 1) | (c << 31); + c = next; + } + return c << 31; + } + + public static uint ShiftDownBit(int len, uint[] x, int xOff, uint c, uint[] z, int zOff) + { + int i = len; + while (--i >= 0) + { + uint next = x[xOff + i]; + z[zOff + i] = (next >> 1) | (c << 31); + c = next; + } + return c << 31; + } + + public static uint ShiftDownBits(int len, uint[] z, int bits, uint c) + { + Debug.Assert(bits > 0 && bits < 32); + int i = len; + while (--i >= 0) + { + uint next = z[i]; + z[i] = (next >> bits) | (c << -bits); + c = next; + } + return c << -bits; + } + + public static uint ShiftDownBits(int len, uint[] z, int zOff, int bits, uint c) + { + Debug.Assert(bits > 0 && bits < 32); + int i = len; + while (--i >= 0) + { + uint next = z[zOff + i]; + z[zOff + i] = (next >> bits) | (c << -bits); + c = next; + } + return c << -bits; + } + + public static uint ShiftDownBits(int len, uint[] x, int bits, uint c, uint[] z) + { + Debug.Assert(bits > 0 && bits < 32); + int i = len; + while (--i >= 0) + { + uint next = x[i]; + z[i] = (next >> bits) | (c << -bits); + c = next; + } + return c << -bits; + } + + public static uint ShiftDownBits(int len, uint[] x, int xOff, int bits, uint c, uint[] z, int zOff) + { + Debug.Assert(bits > 0 && bits < 32); + int i = len; + while (--i >= 0) + { + uint next = x[xOff + i]; + z[zOff + i] = (next >> bits) | (c << -bits); + c = next; + } + return c << -bits; + } + + public static uint ShiftDownWord(int len, uint[] z, uint c) + { + int i = len; + while (--i >= 0) + { + uint next = z[i]; + z[i] = c; + c = next; + } + return c; + } + + public static uint ShiftUpBit(int len, uint[] z, uint c) + { + for (int i = 0; i < len; ++i) + { + uint next = z[i]; + z[i] = (next << 1) | (c >> 31); + c = next; + } + return c >> 31; + } + + public static uint ShiftUpBit(int len, uint[] z, int zOff, uint c) + { + for (int i = 0; i < len; ++i) + { + uint next = z[zOff + i]; + z[zOff + i] = (next << 1) | (c >> 31); + c = next; + } + return c >> 31; + } + + public static uint ShiftUpBit(int len, uint[] x, uint c, uint[] z) + { + for (int i = 0; i < len; ++i) + { + uint next = x[i]; + z[i] = (next << 1) | (c >> 31); + c = next; + } + return c >> 31; + } + + public static uint ShiftUpBit(int len, uint[] x, int xOff, uint c, uint[] z, int zOff) + { + for (int i = 0; i < len; ++i) + { + uint next = x[xOff + i]; + z[zOff + i] = (next << 1) | (c >> 31); + c = next; + } + return c >> 31; + } + + public static ulong ShiftUpBit64(int len, ulong[] x, int xOff, ulong c, ulong[] z, int zOff) + { + for (int i = 0; i < len; ++i) + { + ulong next = x[xOff + i]; + z[zOff + i] = (next << 1) | (c >> 63); + c = next; + } + return c >> 63; + } + + public static uint ShiftUpBits(int len, uint[] z, int bits, uint c) + { + Debug.Assert(bits > 0 && bits < 32); + for (int i = 0; i < len; ++i) + { + uint next = z[i]; + z[i] = (next << bits) | (c >> -bits); + c = next; + } + return c >> -bits; + } + + public static uint ShiftUpBits(int len, uint[] z, int zOff, int bits, uint c) + { + Debug.Assert(bits > 0 && bits < 32); + for (int i = 0; i < len; ++i) + { + uint next = z[zOff + i]; + z[zOff + i] = (next << bits) | (c >> -bits); + c = next; + } + return c >> -bits; + } + + public static ulong ShiftUpBits64(int len, ulong[] z, int zOff, int bits, ulong c) + { + Debug.Assert(bits > 0 && bits < 64); + for (int i = 0; i < len; ++i) + { + ulong next = z[zOff + i]; + z[zOff + i] = (next << bits) | (c >> -bits); + c = next; + } + return c >> -bits; + } + + public static uint ShiftUpBits(int len, uint[] x, int bits, uint c, uint[] z) + { + Debug.Assert(bits > 0 && bits < 32); + for (int i = 0; i < len; ++i) + { + uint next = x[i]; + z[i] = (next << bits) | (c >> -bits); + c = next; + } + return c >> -bits; + } + + public static uint ShiftUpBits(int len, uint[] x, int xOff, int bits, uint c, uint[] z, int zOff) + { + Debug.Assert(bits > 0 && bits < 32); + for (int i = 0; i < len; ++i) + { + uint next = x[xOff + i]; + z[zOff + i] = (next << bits) | (c >> -bits); + c = next; + } + return c >> -bits; + } + + public static ulong ShiftUpBits64(int len, ulong[] x, int xOff, int bits, ulong c, ulong[] z, int zOff) + { + Debug.Assert(bits > 0 && bits < 64); + for (int i = 0; i < len; ++i) + { + ulong next = x[xOff + i]; + z[zOff + i] = (next << bits) | (c >> -bits); + c = next; + } + return c >> -bits; + } + + public static void Square(int len, uint[] x, uint[] zz) + { + int extLen = len << 1; + uint c = 0; + int j = len, k = extLen; + do + { + ulong xVal = (ulong)x[--j]; + ulong p = xVal * xVal; + zz[--k] = (c << 31) | (uint)(p >> 33); + zz[--k] = (uint)(p >> 1); + c = (uint)p; + } + while (j > 0); + + for (int i = 1; i < len; ++i) + { + c = SquareWordAdd(x, i, zz); + AddWordAt(extLen, c, zz, i << 1); + } + + ShiftUpBit(extLen, zz, x[0] << 31); + } + + public static void Square(int len, uint[] x, int xOff, uint[] zz, int zzOff) + { + int extLen = len << 1; + uint c = 0; + int j = len, k = extLen; + do + { + ulong xVal = (ulong)x[xOff + --j]; + ulong p = xVal * xVal; + zz[zzOff + --k] = (c << 31) | (uint)(p >> 33); + zz[zzOff + --k] = (uint)(p >> 1); + c = (uint)p; + } + while (j > 0); + + for (int i = 1; i < len; ++i) + { + c = SquareWordAdd(x, xOff, i, zz, zzOff); + AddWordAt(extLen, c, zz, zzOff, i << 1); + } + + ShiftUpBit(extLen, zz, zzOff, x[xOff] << 31); + } + + public static uint SquareWordAdd(uint[] x, int xPos, uint[] z) + { + ulong c = 0, xVal = (ulong)x[xPos]; + int i = 0; + do + { + c += xVal * x[i] + z[xPos + i]; + z[xPos + i] = (uint)c; + c >>= 32; + } + while (++i < xPos); + return (uint)c; + } + + public static uint SquareWordAdd(uint[] x, int xOff, int xPos, uint[] z, int zOff) + { + ulong c = 0, xVal = (ulong)x[xOff + xPos]; + int i = 0; + do + { + c += xVal * (x[xOff + i] & M) + (z[xPos + zOff] & M); + z[xPos + zOff] = (uint)c; + c >>= 32; + ++zOff; + } + while (++i < xPos); + return (uint)c; + } + + public static int Sub(int len, uint[] x, uint[] y, uint[] z) + { + long c = 0; + for (int i = 0; i < len; ++i) + { + c += (long)x[i] - y[i]; + z[i] = (uint)c; + c >>= 32; + } + return (int)c; + } + + public static int Sub(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff) + { + long c = 0; + for (int i = 0; i < len; ++i) + { + c += (long)x[xOff + i] - y[yOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + return (int)c; + } + public static int Sub33At(int len, uint x, uint[] z, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + long c = (long)z[zPos + 0] - x; + z[zPos + 0] = (uint)c; + c >>= 32; + c += (long)z[zPos + 1] - 1; + z[zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zPos + 2); + } + + public static int Sub33At(int len, uint x, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + long c = (long)z[zOff + zPos] - x; + z[zOff + zPos] = (uint)c; + c >>= 32; + c += (long)z[zOff + zPos + 1] - 1; + z[zOff + zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zOff, zPos + 2); + } + + public static int Sub33From(int len, uint x, uint[] z) + { + long c = (long)z[0] - x; + z[0] = (uint)c; + c >>= 32; + c += (long)z[1] - 1; + z[1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, 2); + } + + public static int Sub33From(int len, uint x, uint[] z, int zOff) + { + long c = (long)z[zOff + 0] - x; + z[zOff + 0] = (uint)c; + c >>= 32; + c += (long)z[zOff + 1] - 1; + z[zOff + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zOff, 2); + } + + public static int SubBothFrom(int len, uint[] x, uint[] y, uint[] z) + { + long c = 0; + for (int i = 0; i < len; ++i) + { + c += (long)z[i] - x[i] - y[i]; + z[i] = (uint)c; + c >>= 32; + } + return (int)c; + } + + public static int SubBothFrom(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff) + { + long c = 0; + for (int i = 0; i < len; ++i) + { + c += (long)z[zOff + i] - x[xOff + i] - y[yOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + return (int)c; + } + + public static int SubDWordAt(int len, ulong x, uint[] z, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + long c = (long)z[zPos + 0] - (long)(x & M); + z[zPos + 0] = (uint)c; + c >>= 32; + c += (long)z[zPos + 1] - (long)(x >> 32); + z[zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zPos + 2); + } + + public static int SubDWordAt(int len, ulong x, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= (len - 2)); + long c = (long)z[zOff + zPos] - (long)(x & M); + z[zOff + zPos] = (uint)c; + c >>= 32; + c += (long)z[zOff + zPos + 1] - (long)(x >> 32); + z[zOff + zPos + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zOff, zPos + 2); + } + + public static int SubDWordFrom(int len, ulong x, uint[] z) + { + long c = (long)z[0] - (long)(x & M); + z[0] = (uint)c; + c >>= 32; + c += (long)z[1] - (long)(x >> 32); + z[1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, 2); + } + + public static int SubDWordFrom(int len, ulong x, uint[] z, int zOff) + { + long c = (long)z[zOff + 0] - (long)(x & M); + z[zOff + 0] = (uint)c; + c >>= 32; + c += (long)z[zOff + 1] - (long)(x >> 32); + z[zOff + 1] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zOff, 2); + } + + public static int SubFrom(int len, uint[] x, uint[] z) + { + long c = 0; + for (int i = 0; i < len; ++i) + { + c += (long)z[i] - x[i]; + z[i] = (uint)c; + c >>= 32; + } + return (int)c; + } + + public static int SubFrom(int len, uint[] x, int xOff, uint[] z, int zOff) + { + long c = 0; + for (int i = 0; i < len; ++i) + { + c += (long)z[zOff + i] - x[xOff + i]; + z[zOff + i] = (uint)c; + c >>= 32; + } + return (int)c; + } + + public static int SubWordAt(int len, uint x, uint[] z, int zPos) + { + Debug.Assert(zPos <= (len - 1)); + long c = (long)z[zPos] - x; + z[zPos] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zPos + 1); + } + + public static int SubWordAt(int len, uint x, uint[] z, int zOff, int zPos) + { + Debug.Assert(zPos <= (len - 1)); + long c = (long)z[zOff + zPos] - x; + z[zOff + zPos] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zOff, zPos + 1); + } + + public static int SubWordFrom(int len, uint x, uint[] z) + { + long c = (long)z[0] - x; + z[0] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, 1); + } + + public static int SubWordFrom(int len, uint x, uint[] z, int zOff) + { + long c = (long)z[zOff + 0] - x; + z[zOff + 0] = (uint)c; + c >>= 32; + return c == 0 ? 0 : DecAt(len, z, zOff, 1); + } + + public static BigInteger ToBigInteger(int len, uint[] x) + { + byte[] bs = new byte[len << 2]; + for (int i = 0; i < len; ++i) + { + uint x_i = x[i]; + if (x_i != 0) + { + Pack.UInt32_To_BE(x_i, bs, (len - 1 - i) << 2); + } + } + return new BigInteger(1, bs); + } + + public static void Zero(int len, uint[] z) + { + for (int i = 0; i < len; ++i) + { + z[i] = 0; + } + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/security/DigestUtilities.cs b/src/Renci.SshNet/Security/BouncyCastle/security/DigestUtilities.cs new file mode 100644 index 00000000..a04ef5f4 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/security/DigestUtilities.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections; + +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Digests; +using Renci.SshNet.Security.Org.BouncyCastle.Crypto; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; +using System.Collections.Generic; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Security +{ + /// + /// Utility class for creating IDigest objects from their names/Oids + /// + internal sealed class DigestUtilities + { + private enum DigestAlgorithm { + SHA_256 + }; + + private DigestUtilities() + { + } + + private static readonly IDictionary algorithms = new Dictionary(); + private static readonly IDictionary oids = new Dictionary(); + + static DigestUtilities() + { + // Signal to obfuscation tools not to change enum constants + ((DigestAlgorithm)Enums.GetArbitraryValue(typeof(DigestAlgorithm))).ToString(); + + algorithms["SHA256"] = "SHA-256"; + algorithms["2.16.840.1.101.3.4.2.1"] = "SHA-256"; + } + + public static ICollection Algorithms + { + get { return oids.Keys; } + } + + public static IDigest GetDigest( + string algorithm) + { + string upper = algorithm.ToUpper(); + string mechanism = (string) algorithms[upper]; + + if (mechanism == null) + { + mechanism = upper; + } + + try + { + DigestAlgorithm digestAlgorithm = (DigestAlgorithm)Enums.GetEnumValue( + typeof(DigestAlgorithm), mechanism); + + switch (digestAlgorithm) + { + case DigestAlgorithm.SHA_256: return new Sha256Digest(); + } + } + catch (ArgumentException) + { + } + + throw new SecurityUtilityException("Digest " + mechanism + " not recognised."); + } + + public static byte[] CalculateDigest(string algorithm, byte[] input) + { + IDigest digest = GetDigest(algorithm); + digest.BlockUpdate(input, 0, input.Length); + return DoFinal(digest); + } + + public static byte[] DoFinal( + IDigest digest) + { + byte[] b = new byte[digest.GetDigestSize()]; + digest.DoFinal(b, 0); + return b; + } + + public static byte[] DoFinal( + IDigest digest, + byte[] input) + { + digest.BlockUpdate(input, 0, input.Length); + return DoFinal(digest); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/security/SecureRandom.cs b/src/Renci.SshNet/Security/BouncyCastle/security/SecureRandom.cs new file mode 100644 index 00000000..f63412a2 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/security/SecureRandom.cs @@ -0,0 +1,210 @@ +using System; +using System.Threading; + +using Renci.SshNet.Security.Org.BouncyCastle.Crypto; +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Prng; +using Renci.SshNet.Security.Org.BouncyCastle.Utilities; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Security +{ + internal class SecureRandom + : Random + { + private static long counter = Times.NanoTime(); + + private static long NextCounterValue() + { + return Interlocked.Increment(ref counter); + } + + private static readonly SecureRandom master = new SecureRandom(new CryptoApiRandomGenerator()); + private static SecureRandom Master + { + get { return master; } + } + + private static DigestRandomGenerator CreatePrng(string digestName, bool autoSeed) + { + IDigest digest = DigestUtilities.GetDigest(digestName); + if (digest == null) + return null; + DigestRandomGenerator prng = new DigestRandomGenerator(digest); + if (autoSeed) + { + prng.AddSeedMaterial(NextCounterValue()); + prng.AddSeedMaterial(GetNextBytes(Master, digest.GetDigestSize())); + } + return prng; + } + + public static byte[] GetNextBytes(SecureRandom secureRandom, int length) + { + byte[] result = new byte[length]; + secureRandom.NextBytes(result); + return result; + } + + /// + /// Create and auto-seed an instance based on the given algorithm. + /// + /// Equivalent to GetInstance(algorithm, true) + /// e.g. "SHA256PRNG" + public static SecureRandom GetInstance(string algorithm) + { + return GetInstance(algorithm, true); + } + + /// + /// Create an instance based on the given algorithm, with optional auto-seeding + /// + /// e.g. "SHA256PRNG" + /// If true, the instance will be auto-seeded. + public static SecureRandom GetInstance(string algorithm, bool autoSeed) + { + string upper = algorithm.ToUpper(); + if (upper.EndsWith("PRNG")) + { + string digestName = upper.Substring(0, upper.Length - "PRNG".Length); + DigestRandomGenerator prng = CreatePrng(digestName, autoSeed); + if (prng != null) + { + return new SecureRandom(prng); + } + } + + throw new ArgumentException("Unrecognised PRNG algorithm: " + algorithm, "algorithm"); + } + + protected readonly IRandomGenerator generator; + + public SecureRandom() + : this(CreatePrng("SHA256", true)) + { + } + + /// Use the specified instance of IRandomGenerator as random source. + /// + /// This constructor performs no seeding of either the IRandomGenerator or the + /// constructed SecureRandom. It is the responsibility of the client to provide + /// proper seed material as necessary/appropriate for the given IRandomGenerator + /// implementation. + /// + /// The source to generate all random bytes from. + public SecureRandom(IRandomGenerator generator) + : base(0) + { + this.generator = generator; + } + + public virtual byte[] GenerateSeed(int length) + { + return GetNextBytes(Master, length); + } + + public virtual void SetSeed(byte[] seed) + { + generator.AddSeedMaterial(seed); + } + + public virtual void SetSeed(long seed) + { + generator.AddSeedMaterial(seed); + } + + public override int Next() + { + return NextInt() & int.MaxValue; + } + + public override int Next(int maxValue) + { + + if (maxValue < 2) + { + if (maxValue < 0) + throw new ArgumentOutOfRangeException("maxValue", "cannot be negative"); + + return 0; + } + + int bits; + + // Test whether maxValue is a power of 2 + if ((maxValue & (maxValue - 1)) == 0) + { + bits = NextInt() & int.MaxValue; + return (int)(((long)bits * maxValue) >> 31); + } + + int result; + do + { + bits = NextInt() & int.MaxValue; + result = bits % maxValue; + } + while (bits - result + (maxValue - 1) < 0); // Ignore results near overflow + + return result; + } + + public override int Next(int minValue, int maxValue) + { + if (maxValue <= minValue) + { + if (maxValue == minValue) + return minValue; + + throw new ArgumentException("maxValue cannot be less than minValue"); + } + + int diff = maxValue - minValue; + if (diff > 0) + return minValue + Next(diff); + + for (;;) + { + int i = NextInt(); + + if (i >= minValue && i < maxValue) + return i; + } + } + + public override void NextBytes(byte[] buf) + { + generator.NextBytes(buf); + } + + public virtual void NextBytes(byte[] buf, int off, int len) + { + generator.NextBytes(buf, off, len); + } + + private static readonly double DoubleScale = System.Math.Pow(2.0, 64.0); + + public override double NextDouble() + { + return Convert.ToDouble((ulong) NextLong()) / DoubleScale; + } + + public virtual int NextInt() + { + byte[] bytes = new byte[4]; + NextBytes(bytes); + + uint result = bytes[0]; + result <<= 8; + result |= bytes[1]; + result <<= 8; + result |= bytes[2]; + result <<= 8; + result |= bytes[3]; + return (int)result; + } + + public virtual long NextLong() + { + return ((long)(uint) NextInt() << 32) | (long)(uint) NextInt(); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/security/SecurityUtilityException.cs b/src/Renci.SshNet/Security/BouncyCastle/security/SecurityUtilityException.cs new file mode 100644 index 00000000..d7189384 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/security/SecurityUtilityException.cs @@ -0,0 +1,36 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Security +{ +#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE) + [Serializable] +#endif + internal class SecurityUtilityException + : Exception + { + /** + * base constructor. + */ + public SecurityUtilityException() + { + } + + /** + * create a SecurityUtilityException with the given message. + * + * @param message the message to be carried with the exception. + */ + public SecurityUtilityException( + string message) + : base(message) + { + } + + public SecurityUtilityException( + string message, + Exception exception) + : base(message, exception) + { + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs b/src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs new file mode 100644 index 00000000..87ffa307 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs @@ -0,0 +1,725 @@ +using System; +using System.Text; + +using Renci.SshNet.Security.Org.BouncyCastle.Math; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities +{ + /// General array utilities. + internal abstract class Arrays + { + public static readonly byte[] EmptyBytes = new byte[0]; + public static readonly int[] EmptyInts = new int[0]; + + public static bool AreAllZeroes(byte[] buf, int off, int len) + { + uint bits = 0; + for (int i = 0; i < len; ++i) + { + bits |= buf[off + i]; + } + return bits == 0; + } + + public static bool AreEqual( + bool[] a, + bool[] b) + { + if (a == b) + return true; + + if (a == null || b == null) + return false; + + return HaveSameContents(a, b); + } + + public static bool AreEqual( + char[] a, + char[] b) + { + if (a == b) + return true; + + if (a == null || b == null) + return false; + + return HaveSameContents(a, b); + } + + /// + /// Are two arrays equal. + /// + /// Left side. + /// Right side. + /// True if equal. + public static bool AreEqual( + byte[] a, + byte[] b) + { + if (a == b) + return true; + + if (a == null || b == null) + return false; + + return HaveSameContents(a, b); + } + + [Obsolete("Use 'AreEqual' method instead")] + public static bool AreSame( + byte[] a, + byte[] b) + { + return AreEqual(a, b); + } + + /// + /// A constant time equals comparison - does not terminate early if + /// test will fail. + /// + /// first array + /// second array + /// true if arrays equal, false otherwise. + public static bool ConstantTimeAreEqual( + byte[] a, + byte[] b) + { + int i = a.Length; + if (i != b.Length) + return false; + int cmp = 0; + while (i != 0) + { + --i; + cmp |= (a[i] ^ b[i]); + } + return cmp == 0; + } + + public static bool AreEqual( + int[] a, + int[] b) + { + if (a == b) + return true; + + if (a == null || b == null) + return false; + + return HaveSameContents(a, b); + } + + [CLSCompliantAttribute(false)] + public static bool AreEqual(uint[] a, uint[] b) + { + if (a == b) + return true; + + if (a == null || b == null) + return false; + + return HaveSameContents(a, b); + } + + private static bool HaveSameContents( + bool[] a, + bool[] b) + { + int i = a.Length; + if (i != b.Length) + return false; + while (i != 0) + { + --i; + if (a[i] != b[i]) + return false; + } + return true; + } + + private static bool HaveSameContents( + char[] a, + char[] b) + { + int i = a.Length; + if (i != b.Length) + return false; + while (i != 0) + { + --i; + if (a[i] != b[i]) + return false; + } + return true; + } + + private static bool HaveSameContents( + byte[] a, + byte[] b) + { + int i = a.Length; + if (i != b.Length) + return false; + while (i != 0) + { + --i; + if (a[i] != b[i]) + return false; + } + return true; + } + + private static bool HaveSameContents( + int[] a, + int[] b) + { + int i = a.Length; + if (i != b.Length) + return false; + while (i != 0) + { + --i; + if (a[i] != b[i]) + return false; + } + return true; + } + + private static bool HaveSameContents(uint[] a, uint[] b) + { + int i = a.Length; + if (i != b.Length) + return false; + while (i != 0) + { + --i; + if (a[i] != b[i]) + return false; + } + return true; + } + + public static string ToString( + object[] a) + { + StringBuilder sb = new StringBuilder('['); + if (a.Length > 0) + { + sb.Append(a[0]); + for (int index = 1; index < a.Length; ++index) + { + sb.Append(", ").Append(a[index]); + } + } + sb.Append(']'); + return sb.ToString(); + } + + public static int GetHashCode(byte[] data) + { + if (data == null) + { + return 0; + } + + int i = data.Length; + int hc = i + 1; + + while (--i >= 0) + { + hc *= 257; + hc ^= data[i]; + } + + return hc; + } + + public static int GetHashCode(byte[] data, int off, int len) + { + if (data == null) + { + return 0; + } + + int i = len; + int hc = i + 1; + + while (--i >= 0) + { + hc *= 257; + hc ^= data[off + i]; + } + + return hc; + } + + public static int GetHashCode(int[] data) + { + if (data == null) + return 0; + + int i = data.Length; + int hc = i + 1; + + while (--i >= 0) + { + hc *= 257; + hc ^= data[i]; + } + + return hc; + } + + public static int GetHashCode(int[] data, int off, int len) + { + if (data == null) + return 0; + + int i = len; + int hc = i + 1; + + while (--i >= 0) + { + hc *= 257; + hc ^= data[off + i]; + } + + return hc; + } + + [CLSCompliantAttribute(false)] + public static int GetHashCode(uint[] data) + { + if (data == null) + return 0; + + int i = data.Length; + int hc = i + 1; + + while (--i >= 0) + { + hc *= 257; + hc ^= (int)data[i]; + } + + return hc; + } + + [CLSCompliantAttribute(false)] + public static int GetHashCode(uint[] data, int off, int len) + { + if (data == null) + return 0; + + int i = len; + int hc = i + 1; + + while (--i >= 0) + { + hc *= 257; + hc ^= (int)data[off + i]; + } + + return hc; + } + + [CLSCompliantAttribute(false)] + public static int GetHashCode(ulong[] data) + { + if (data == null) + return 0; + + int i = data.Length; + int hc = i + 1; + + while (--i >= 0) + { + ulong di = data[i]; + hc *= 257; + hc ^= (int)di; + hc *= 257; + hc ^= (int)(di >> 32); + } + + return hc; + } + + [CLSCompliantAttribute(false)] + public static int GetHashCode(ulong[] data, int off, int len) + { + if (data == null) + return 0; + + int i = len; + int hc = i + 1; + + while (--i >= 0) + { + ulong di = data[off + i]; + hc *= 257; + hc ^= (int)di; + hc *= 257; + hc ^= (int)(di >> 32); + } + + return hc; + } + + public static byte[] Clone( + byte[] data) + { + return data == null ? null : (byte[])data.Clone(); + } + + public static byte[] Clone( + byte[] data, + byte[] existing) + { + if (data == null) + { + return null; + } + if ((existing == null) || (existing.Length != data.Length)) + { + return Clone(data); + } + Array.Copy(data, 0, existing, 0, existing.Length); + return existing; + } + + public static int[] Clone( + int[] data) + { + return data == null ? null : (int[])data.Clone(); + } + + internal static uint[] Clone(uint[] data) + { + return data == null ? null : (uint[])data.Clone(); + } + + public static long[] Clone(long[] data) + { + return data == null ? null : (long[])data.Clone(); + } + + [CLSCompliantAttribute(false)] + public static ulong[] Clone( + ulong[] data) + { + return data == null ? null : (ulong[]) data.Clone(); + } + + [CLSCompliantAttribute(false)] + public static ulong[] Clone( + ulong[] data, + ulong[] existing) + { + if (data == null) + { + return null; + } + if ((existing == null) || (existing.Length != data.Length)) + { + return Clone(data); + } + Array.Copy(data, 0, existing, 0, existing.Length); + return existing; + } + + public static bool Contains(byte[] a, byte n) + { + for (int i = 0; i < a.Length; ++i) + { + if (a[i] == n) + return true; + } + return false; + } + + public static bool Contains(short[] a, short n) + { + for (int i = 0; i < a.Length; ++i) + { + if (a[i] == n) + return true; + } + return false; + } + + public static bool Contains(int[] a, int n) + { + for (int i = 0; i < a.Length; ++i) + { + if (a[i] == n) + return true; + } + return false; + } + + public static void Fill( + byte[] buf, + byte b) + { + int i = buf.Length; + while (i > 0) + { + buf[--i] = b; + } + } + + public static void Fill(byte[] buf, int from, int to, byte b) + { + for (int i = from; i < to; ++i) + { + buf[i] = b; + } + } + + public static byte[] CopyOf(byte[] data, int newLength) + { + byte[] tmp = new byte[newLength]; + Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length)); + return tmp; + } + + public static char[] CopyOf(char[] data, int newLength) + { + char[] tmp = new char[newLength]; + Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length)); + return tmp; + } + + public static int[] CopyOf(int[] data, int newLength) + { + int[] tmp = new int[newLength]; + Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length)); + return tmp; + } + + public static long[] CopyOf(long[] data, int newLength) + { + long[] tmp = new long[newLength]; + Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length)); + return tmp; + } + + public static BigInteger[] CopyOf(BigInteger[] data, int newLength) + { + BigInteger[] tmp = new BigInteger[newLength]; + Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length)); + return tmp; + } + + /** + * Make a copy of a range of bytes from the passed in data array. The range can + * extend beyond the end of the input array, in which case the return array will + * be padded with zeroes. + * + * @param data the array from which the data is to be copied. + * @param from the start index at which the copying should take place. + * @param to the final index of the range (exclusive). + * + * @return a new byte array containing the range given. + */ + public static byte[] CopyOfRange(byte[] data, int from, int to) + { + int newLength = GetLength(from, to); + byte[] tmp = new byte[newLength]; + Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from)); + return tmp; + } + + public static int[] CopyOfRange(int[] data, int from, int to) + { + int newLength = GetLength(from, to); + int[] tmp = new int[newLength]; + Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from)); + return tmp; + } + + public static long[] CopyOfRange(long[] data, int from, int to) + { + int newLength = GetLength(from, to); + long[] tmp = new long[newLength]; + Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from)); + return tmp; + } + + public static BigInteger[] CopyOfRange(BigInteger[] data, int from, int to) + { + int newLength = GetLength(from, to); + BigInteger[] tmp = new BigInteger[newLength]; + Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from)); + return tmp; + } + + private static int GetLength(int from, int to) + { + int newLength = to - from; + if (newLength < 0) + throw new ArgumentException(from + " > " + to); + return newLength; + } + + public static byte[] Append(byte[] a, byte b) + { + if (a == null) + return new byte[] { b }; + + int length = a.Length; + byte[] result = new byte[length + 1]; + Array.Copy(a, 0, result, 0, length); + result[length] = b; + return result; + } + + public static short[] Append(short[] a, short b) + { + if (a == null) + return new short[] { b }; + + int length = a.Length; + short[] result = new short[length + 1]; + Array.Copy(a, 0, result, 0, length); + result[length] = b; + return result; + } + + public static int[] Append(int[] a, int b) + { + if (a == null) + return new int[] { b }; + + int length = a.Length; + int[] result = new int[length + 1]; + Array.Copy(a, 0, result, 0, length); + result[length] = b; + return result; + } + + public static byte[] Concatenate(byte[] a, byte[] b) + { + if (a == null) + return Clone(b); + if (b == null) + return Clone(a); + + byte[] rv = new byte[a.Length + b.Length]; + Array.Copy(a, 0, rv, 0, a.Length); + Array.Copy(b, 0, rv, a.Length, b.Length); + return rv; + } + + public static byte[] ConcatenateAll(params byte[][] vs) + { + byte[][] nonNull = new byte[vs.Length][]; + int count = 0; + int totalLength = 0; + + for (int i = 0; i < vs.Length; ++i) + { + byte[] v = vs[i]; + if (v != null) + { + nonNull[count++] = v; + totalLength += v.Length; + } + } + + byte[] result = new byte[totalLength]; + int pos = 0; + + for (int j = 0; j < count; ++j) + { + byte[] v = nonNull[j]; + Array.Copy(v, 0, result, pos, v.Length); + pos += v.Length; + } + + return result; + } + + public static int[] Concatenate(int[] a, int[] b) + { + if (a == null) + return Clone(b); + if (b == null) + return Clone(a); + + int[] rv = new int[a.Length + b.Length]; + Array.Copy(a, 0, rv, 0, a.Length); + Array.Copy(b, 0, rv, a.Length, b.Length); + return rv; + } + + public static byte[] Prepend(byte[] a, byte b) + { + if (a == null) + return new byte[] { b }; + + int length = a.Length; + byte[] result = new byte[length + 1]; + Array.Copy(a, 0, result, 1, length); + result[0] = b; + return result; + } + + public static short[] Prepend(short[] a, short b) + { + if (a == null) + return new short[] { b }; + + int length = a.Length; + short[] result = new short[length + 1]; + Array.Copy(a, 0, result, 1, length); + result[0] = b; + return result; + } + + public static int[] Prepend(int[] a, int b) + { + if (a == null) + return new int[] { b }; + + int length = a.Length; + int[] result = new int[length + 1]; + Array.Copy(a, 0, result, 1, length); + result[0] = b; + return result; + } + + public static byte[] Reverse(byte[] a) + { + if (a == null) + return null; + + int p1 = 0, p2 = a.Length; + byte[] result = new byte[p2]; + + while (--p2 >= 0) + { + result[p2] = a[p1++]; + } + + return result; + } + + public static int[] Reverse(int[] a) + { + if (a == null) + return null; + + int p1 = 0, p2 = a.Length; + int[] result = new int[p2]; + + while (--p2 >= 0) + { + result[p2] = a[p1++]; + } + + return result; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/BigIntegers.cs b/src/Renci.SshNet/Security/BouncyCastle/util/BigIntegers.cs new file mode 100644 index 00000000..6e1b8c85 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/BigIntegers.cs @@ -0,0 +1,95 @@ +using System; + +using Renci.SshNet.Security.Org.BouncyCastle.Math; +using Renci.SshNet.Security.Org.BouncyCastle.Security; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities +{ + /** + * BigInteger utilities. + */ + internal abstract class BigIntegers + { + private const int MaxIterations = 1000; + + /** + * Return the passed in value as an unsigned byte array. + * + * @param value value to be converted. + * @return a byte array without a leading zero byte if present in the signed encoding. + */ + public static byte[] AsUnsignedByteArray( + BigInteger n) + { + return n.ToByteArrayUnsigned(); + } + + /** + * Return the passed in value as an unsigned byte array of specified length, zero-extended as necessary. + * + * @param length desired length of result array. + * @param n value to be converted. + * @return a byte array of specified length, with leading zeroes as necessary given the size of n. + */ + public static byte[] AsUnsignedByteArray(int length, BigInteger n) + { + byte[] bytes = n.ToByteArrayUnsigned(); + + if (bytes.Length > length) + throw new ArgumentException("standard length exceeded", "n"); + + if (bytes.Length == length) + return bytes; + + byte[] tmp = new byte[length]; + Array.Copy(bytes, 0, tmp, tmp.Length - bytes.Length, bytes.Length); + return tmp; + } + + /** + * Return a random BigInteger not less than 'min' and not greater than 'max' + * + * @param min the least value that may be generated + * @param max the greatest value that may be generated + * @param random the source of randomness + * @return a random BigInteger value in the range [min,max] + */ + public static BigInteger CreateRandomInRange( + BigInteger min, + BigInteger max, + // TODO Should have been just Random class + SecureRandom random) + { + int cmp = min.CompareTo(max); + if (cmp >= 0) + { + if (cmp > 0) + throw new ArgumentException("'min' may not be greater than 'max'"); + + return min; + } + + if (min.BitLength > max.BitLength / 2) + { + return CreateRandomInRange(BigInteger.Zero, max.Subtract(min), random).Add(min); + } + + for (int i = 0; i < MaxIterations; ++i) + { + BigInteger x = new BigInteger(max.BitLength, random); + if (x.CompareTo(min) >= 0 && x.CompareTo(max) <= 0) + { + return x; + } + } + + // fall back to a faster (restricted) method + return new BigInteger(max.Subtract(min).BitLength - 1, random).Add(min); + } + + public static int GetUnsignedByteLength(BigInteger n) + { + return (n.BitLength + 7) / 8; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/Enums.cs b/src/Renci.SshNet/Security/BouncyCastle/util/Enums.cs new file mode 100644 index 00000000..117abef0 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/Enums.cs @@ -0,0 +1,32 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities +{ + internal abstract class Enums + { + internal static Enum GetEnumValue(System.Type enumType, string s) + { + // We only want to parse single named constants + if (s.Length > 0 && char.IsLetter(s[0]) && s.IndexOf(',') < 0) + { + s = s.Replace('-', '_'); + s = s.Replace('/', '_'); + return (Enum)Enum.Parse(enumType, s, false); + } + + throw new ArgumentException(); + } + + internal static Array GetEnumValues(System.Type enumType) + { + return Enum.GetValues(enumType); + } + + internal static Enum GetArbitraryValue(System.Type enumType) + { + Array values = GetEnumValues(enumType); + int pos = (int)(int.MaxValue) % values.Length; + return (Enum)values.GetValue(pos); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/IMemoable.cs b/src/Renci.SshNet/Security/BouncyCastle/util/IMemoable.cs new file mode 100644 index 00000000..9f94275f --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/IMemoable.cs @@ -0,0 +1,29 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities +{ + internal interface IMemoable + { + /// + /// Produce a copy of this object with its configuration and in its current state. + /// + /// + /// The returned object may be used simply to store the state, or may be used as a similar object + /// starting from the copied state. + /// + IMemoable Copy(); + + /// + /// Restore a copied object state into this object. + /// + /// + /// Implementations of this method should try to avoid or minimise memory allocation to perform the reset. + /// + /// an object originally {@link #copy() copied} from an object of the same type as this instance. + /// if the provided object is not of the correct type. + /// if the other parameter is in some other way invalid. + void Reset(IMemoable other); + } + +} + diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs b/src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs new file mode 100644 index 00000000..a5c53ac8 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs @@ -0,0 +1,29 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities +{ + internal abstract class Integers + { + public static int RotateLeft(int i, int distance) + { + return (i << distance) ^ (int)((uint)i >> -distance); + } + + [CLSCompliantAttribute(false)] + public static uint RotateLeft(uint i, int distance) + { + return (i << distance) ^ (i >> -distance); + } + + public static int RotateRight(int i, int distance) + { + return (int)((uint)i >> distance) ^ (i << -distance); + } + + [CLSCompliantAttribute(false)] + public static uint RotateRight(uint i, int distance) + { + return (i >> distance) ^ (i << -distance); + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/MemoableResetException.cs b/src/Renci.SshNet/Security/BouncyCastle/util/MemoableResetException.cs new file mode 100644 index 00000000..3b5ac38c --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/MemoableResetException.cs @@ -0,0 +1,27 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities +{ + /** + * Exception to be thrown on a failure to reset an object implementing Memoable. + *

    + * The exception extends InvalidCastException to enable users to have a single handling case, + * only introducing specific handling of this one if required. + *

    + */ + internal class MemoableResetException + : InvalidCastException + { + /** + * Basic Constructor. + * + * @param msg message to be associated with this exception. + */ + public MemoableResetException(string msg) + : base(msg) + { + } + } + +} + diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/Times.cs b/src/Renci.SshNet/Security/BouncyCastle/util/Times.cs new file mode 100644 index 00000000..6ef1f65f --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/Times.cs @@ -0,0 +1,14 @@ +using System; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities +{ + internal sealed class Times + { + private static long NanosecondsPerTick = 100L; + + public static long NanoTime() + { + return DateTime.UtcNow.Ticks * NanosecondsPerTick; + } + } +} diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/encoders/Hex.cs b/src/Renci.SshNet/Security/BouncyCastle/util/encoders/Hex.cs new file mode 100644 index 00000000..658eb6fe --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/encoders/Hex.cs @@ -0,0 +1,129 @@ +using System.IO; +using System.Text; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities.Encoders +{ + /// + /// Class to decode and encode Hex. + /// + internal sealed class Hex + { + private static readonly HexEncoder encoder = new HexEncoder(); + + private Hex() + { + } + + public static string ToHexString( + byte[] data) + { + return ToHexString(data, 0, data.Length); + } + + public static string ToHexString( + byte[] data, + int off, + int length) + { + byte[] hex = Encode(data, off, length); + return Encoding.UTF8.GetString(hex, 0, hex.Length); + } + + /** + * encode the input data producing a Hex encoded byte array. + * + * @return a byte array containing the Hex encoded data. + */ + public static byte[] Encode( + byte[] data) + { + return Encode(data, 0, data.Length); + } + + /** + * encode the input data producing a Hex encoded byte array. + * + * @return a byte array containing the Hex encoded data. + */ + public static byte[] Encode( + byte[] data, + int off, + int length) + { + MemoryStream bOut = new MemoryStream(length * 2); + + encoder.Encode(data, off, length, bOut); + + return bOut.ToArray(); + } + + /** + * Hex encode the byte data writing it to the given output stream. + * + * @return the number of bytes produced. + */ + public static int Encode( + byte[] data, + Stream outStream) + { + return encoder.Encode(data, 0, data.Length, outStream); + } + + /** + * Hex encode the byte data writing it to the given output stream. + * + * @return the number of bytes produced. + */ + public static int Encode( + byte[] data, + int off, + int length, + Stream outStream) + { + return encoder.Encode(data, off, length, outStream); + } + + /** + * decode the Hex encoded input data. It is assumed the input data is valid. + * + * @return a byte array representing the decoded data. + */ + public static byte[] Decode( + byte[] data) + { + MemoryStream bOut = new MemoryStream((data.Length + 1) / 2); + + encoder.Decode(data, 0, data.Length, bOut); + + return bOut.ToArray(); + } + + /** + * decode the Hex encoded string data - whitespace will be ignored. + * + * @return a byte array representing the decoded data. + */ + public static byte[] Decode( + string data) + { + MemoryStream bOut = new MemoryStream((data.Length + 1) / 2); + + encoder.DecodeString(data, bOut); + + return bOut.ToArray(); + } + + /** + * decode the Hex encoded string data writing it to the given output stream, + * whitespace characters will be ignored. + * + * @return the number of bytes produced. + */ + public static int Decode( + string data, + Stream outStream) + { + return encoder.DecodeString(data, outStream); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/encoders/HexEncoder.cs b/src/Renci.SshNet/Security/BouncyCastle/util/encoders/HexEncoder.cs new file mode 100644 index 00000000..dd4e1ec2 --- /dev/null +++ b/src/Renci.SshNet/Security/BouncyCastle/util/encoders/HexEncoder.cs @@ -0,0 +1,174 @@ +using System.IO; + +namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities.Encoders +{ + internal class HexEncoder + { + protected readonly byte[] encodingTable = + { + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', + (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f' + }; + + /* + * set up the decoding table. + */ + protected readonly byte[] decodingTable = new byte[128]; + + protected void InitialiseDecodingTable() + { + Arrays.Fill(decodingTable, (byte)0xff); + + for (int i = 0; i < encodingTable.Length; i++) + { + decodingTable[encodingTable[i]] = (byte)i; + } + + decodingTable['A'] = decodingTable['a']; + decodingTable['B'] = decodingTable['b']; + decodingTable['C'] = decodingTable['c']; + decodingTable['D'] = decodingTable['d']; + decodingTable['E'] = decodingTable['e']; + decodingTable['F'] = decodingTable['f']; + } + + public HexEncoder() + { + InitialiseDecodingTable(); + } + + /** + * encode the input data producing a Hex output stream. + * + * @return the number of bytes produced. + */ + public int Encode( + byte[] data, + int off, + int length, + Stream outStream) + { + for (int i = off; i < (off + length); i++) + { + int v = data[i]; + + outStream.WriteByte(encodingTable[v >> 4]); + outStream.WriteByte(encodingTable[v & 0xf]); + } + + return length * 2; + } + + private static bool Ignore(char c) + { + return c == '\n' || c =='\r' || c == '\t' || c == ' '; + } + + /** + * decode the Hex encoded byte data writing it to the given output stream, + * whitespace characters will be ignored. + * + * @return the number of bytes produced. + */ + public int Decode( + byte[] data, + int off, + int length, + Stream outStream) + { + byte b1, b2; + int outLen = 0; + int end = off + length; + + while (end > off) + { + if (!Ignore((char)data[end - 1])) + { + break; + } + + end--; + } + + int i = off; + while (i < end) + { + while (i < end && Ignore((char)data[i])) + { + i++; + } + + b1 = decodingTable[data[i++]]; + + while (i < end && Ignore((char)data[i])) + { + i++; + } + + b2 = decodingTable[data[i++]]; + + if ((b1 | b2) >= 0x80) + throw new IOException("invalid characters encountered in Hex data"); + + outStream.WriteByte((byte)((b1 << 4) | b2)); + + outLen++; + } + + return outLen; + } + + /** + * decode the Hex encoded string data writing it to the given output stream, + * whitespace characters will be ignored. + * + * @return the number of bytes produced. + */ + public int DecodeString( + string data, + Stream outStream) + { + byte b1, b2; + int length = 0; + + int end = data.Length; + + while (end > 0) + { + if (!Ignore(data[end - 1])) + { + break; + } + + end--; + } + + int i = 0; + while (i < end) + { + while (i < end && Ignore(data[i])) + { + i++; + } + + b1 = decodingTable[data[i++]]; + + while (i < end && Ignore(data[i])) + { + i++; + } + + b2 = decodingTable[data[i++]]; + + if ((b1 | b2) >= 0x80) + throw new IOException("invalid characters encountered in Hex data"); + + outStream.WriteByte((byte)((b1 << 4) | b2)); + + length++; + } + + return length; + } + } +} \ No newline at end of file From 2fe968ba7c664fa39a4507d1410ee499c6fa7377 Mon Sep 17 00:00:00 2001 From: Stefan Rinkes Date: Tue, 4 Dec 2018 21:21:12 +0100 Subject: [PATCH 34/67] Import Chaos.NaCl for ED25519 and Curve25519 --- THIRD-PARTY-NOTICES.TXT | 29 + src/Renci.SshNet/Renci.SshNet.csproj | 65 +- .../Security/Chaos.NaCl/CryptoBytes.cs | 190 +++ .../Security/Chaos.NaCl/Ed25519.cs | 147 ++ .../Security/Chaos.NaCl/Internal/Array16.cs | 27 + .../Security/Chaos.NaCl/Internal/Array8.cs | 18 + .../Internal/ByteIntegerConverter.cs | 416 +++++ .../Internal/Ed25519Ref10/FieldElement.cs | 36 + .../Internal/Ed25519Ref10/GroupElement.cs | 63 + .../Chaos.NaCl/Internal/Ed25519Ref10/base.cs | 1357 +++++++++++++++++ .../Chaos.NaCl/Internal/Ed25519Ref10/base2.cs | 50 + .../Chaos.NaCl/Internal/Ed25519Ref10/d.cs | 9 + .../Chaos.NaCl/Internal/Ed25519Ref10/d2.cs | 9 + .../Chaos.NaCl/Internal/Ed25519Ref10/fe_0.cs | 12 + .../Chaos.NaCl/Internal/Ed25519Ref10/fe_1.cs | 13 + .../Internal/Ed25519Ref10/fe_add.cs | 63 + .../Internal/Ed25519Ref10/fe_cmov.cs | 70 + .../Internal/Ed25519Ref10/fe_cswap.cs | 78 + .../Internal/Ed25519Ref10/fe_frombytes.cs | 122 ++ .../Internal/Ed25519Ref10/fe_invert.cs | 179 +++ .../Internal/Ed25519Ref10/fe_isnegative.cs | 22 + .../Internal/Ed25519Ref10/fe_isnonzero.cs | 37 + .../Internal/Ed25519Ref10/fe_mul.cs | 258 ++++ .../Internal/Ed25519Ref10/fe_mul121666.cs | 76 + .../Internal/Ed25519Ref10/fe_neg.cs | 50 + .../Internal/Ed25519Ref10/fe_pow22523.cs | 175 +++ .../Chaos.NaCl/Internal/Ed25519Ref10/fe_sq.cs | 153 ++ .../Internal/Ed25519Ref10/fe_sq2.cs | 164 ++ .../Internal/Ed25519Ref10/fe_sub.cs | 63 + .../Internal/Ed25519Ref10/fe_tobytes.cs | 154 ++ .../Internal/Ed25519Ref10/ge_add.cs | 113 ++ .../Ed25519Ref10/ge_double_scalarmult.cs | 118 ++ .../Internal/Ed25519Ref10/ge_frombytes.cs | 54 + .../Internal/Ed25519Ref10/ge_madd.cs | 105 ++ .../Internal/Ed25519Ref10/ge_msub.cs | 104 ++ .../Internal/Ed25519Ref10/ge_p1p1_to_p2.cs | 18 + .../Internal/Ed25519Ref10/ge_p1p1_to_p3.cs | 18 + .../Internal/Ed25519Ref10/ge_p2_0.cs | 14 + .../Internal/Ed25519Ref10/ge_p2_dbl.cs | 90 ++ .../Internal/Ed25519Ref10/ge_p3_0.cs | 15 + .../Internal/Ed25519Ref10/ge_p3_dbl.cs | 17 + .../Internal/Ed25519Ref10/ge_p3_to_cached.cs | 18 + .../Internal/Ed25519Ref10/ge_p3_to_p2.cs | 17 + .../Internal/Ed25519Ref10/ge_p3_tobytes.cs | 20 + .../Internal/Ed25519Ref10/ge_precomp_0.cs | 14 + .../Ed25519Ref10/ge_scalarmult_base.cs | 113 ++ .../Internal/Ed25519Ref10/ge_sub.cs | 114 ++ .../Internal/Ed25519Ref10/ge_tobytes.cs | 20 + .../Internal/Ed25519Ref10/keypair.cs | 23 + .../Chaos.NaCl/Internal/Ed25519Ref10/open.cs | 80 + .../Internal/Ed25519Ref10/sc_clamp.cs | 14 + .../Internal/Ed25519Ref10/sc_mul_add.cs | 374 +++++ .../Internal/Ed25519Ref10/sc_reduce.cs | 263 ++++ .../Internal/Ed25519Ref10/scalarmult.cs | 205 +++ .../Chaos.NaCl/Internal/Ed25519Ref10/sign.cs | 81 + .../Internal/Ed25519Ref10/sqrtm1.cs | 9 + .../Chaos.NaCl/Internal/InternalAssert.cs | 13 + .../Chaos.NaCl/Internal/Poly1305Donna.cs | 154 ++ .../Chaos.NaCl/Internal/Salsa/Salsa20.cs | 45 + .../Chaos.NaCl/Internal/Salsa/SalsaCore.cs | 263 ++++ .../Internal/Salsa/replace regex.txt | 2 + .../Chaos.NaCl/Internal/Sha512Internal.cs | 447 ++++++ .../Security/Chaos.NaCl/License.txt | 23 + .../Chaos.NaCl/MontgomeryCurve25519.cs | 142 ++ .../Security/Chaos.NaCl/Sha512.cs | 132 ++ 65 files changed, 7356 insertions(+), 1 deletion(-) create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/CryptoBytes.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Ed25519.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array16.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array8.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/ByteIntegerConverter.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/FieldElement.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/GroupElement.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base2.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d2.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_0.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_1.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_add.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cmov.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cswap.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_frombytes.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_invert.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_isnegative.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_isnonzero.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul121666.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_neg.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_pow22523.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sq.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sq2.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sub.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_tobytes.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_add.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_double_scalarmult.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_frombytes.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_madd.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_msub.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p1p1_to_p2.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p1p1_to_p3.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p2_0.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p2_dbl.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p3_0.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p3_dbl.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p3_to_cached.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p3_to_p2.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_p3_tobytes.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_precomp_0.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_scalarmult_base.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_sub.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_tobytes.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/keypair.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/open.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sc_clamp.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sc_mul_add.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sc_reduce.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/scalarmult.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sign.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sqrtm1.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/InternalAssert.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Poly1305Donna.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/Salsa20.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/SalsaCore.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/replace regex.txt create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Internal/Sha512Internal.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/License.txt create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/MontgomeryCurve25519.cs create mode 100644 src/Renci.SshNet/Security/Chaos.NaCl/Sha512.cs diff --git a/THIRD-PARTY-NOTICES.TXT b/THIRD-PARTY-NOTICES.TXT index dd1b8a21..55630a8e 100644 --- a/THIRD-PARTY-NOTICES.TXT +++ b/THIRD-PARTY-NOTICES.TXT @@ -24,3 +24,32 @@ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +License notice for Chaos.NaCl +------------------------------- + +https://github.com/CodesInChaos/Chaos.NaCl + +Public domain + +C# port + code by Christian Winnerlein (CodesInChaos) + +Poly1305 in c + written by Andrew M. (floodyberry) + original license: MIT or PUBLIC DOMAIN + https://github.com/floodyberry/poly1305-donna/blob/master/poly1305-donna-unrolled.c + +Curve25519 and Ed25519 in c + written by Dan Bernstein (djb) + public domain + from Ref10 in SUPERCOP http://bench.cr.yp.to/supercop.html + +(H)Salsa20 in c + written by Dan Bernstein (djb) + public domain + from SUPERCOP http://bench.cr.yp.to/supercop.html + +SHA512 + written by Christian Winnerlein (CodesInChaos) + public domain + directly from the specification diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index 2084f956..b0b4b899 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -240,6 +240,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -540,6 +601,8 @@ + + - \ No newline at end of file + diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/CryptoBytes.cs b/src/Renci.SshNet/Security/Chaos.NaCl/CryptoBytes.cs new file mode 100644 index 00000000..03229182 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/CryptoBytes.cs @@ -0,0 +1,190 @@ +using System; +using System.Runtime.CompilerServices; + +namespace Renci.SshNet.Security.Chaos.NaCl +{ + internal static class CryptoBytes + { + internal static bool ConstantTimeEquals(byte[] x, byte[] y) + { + if (x == null) + throw new ArgumentNullException("x"); + if (y == null) + throw new ArgumentNullException("y"); + if (x.Length != y.Length) + throw new ArgumentException("x.Length must equal y.Length"); + return InternalConstantTimeEquals(x, 0, y, 0, x.Length) != 0; + } + + internal static bool ConstantTimeEquals(ArraySegment x, ArraySegment y) + { + if (x.Array == null) + throw new ArgumentNullException("x.Array"); + if (y.Array == null) + throw new ArgumentNullException("y.Array"); + if (x.Count != y.Count) + throw new ArgumentException("x.Count must equal y.Count"); + + return InternalConstantTimeEquals(x.Array, x.Offset, y.Array, y.Offset, x.Count) != 0; + } + + internal static bool ConstantTimeEquals(byte[] x, int xOffset, byte[] y, int yOffset, int length) + { + if (x == null) + throw new ArgumentNullException("x"); + if (xOffset < 0) + throw new ArgumentOutOfRangeException("xOffset", "xOffset < 0"); + if (y == null) + throw new ArgumentNullException("y"); + if (yOffset < 0) + throw new ArgumentOutOfRangeException("yOffset", "yOffset < 0"); + if (length < 0) + throw new ArgumentOutOfRangeException("length", "length < 0"); + if (x.Length - xOffset < length) + throw new ArgumentException("xOffset + length > x.Length"); + if (y.Length - yOffset < length) + throw new ArgumentException("yOffset + length > y.Length"); + + return InternalConstantTimeEquals(x, xOffset, y, yOffset, length) != 0; + } + + private static uint InternalConstantTimeEquals(byte[] x, int xOffset, byte[] y, int yOffset, int length) + { + int differentbits = 0; + for (int i = 0; i < length; i++) + differentbits |= x[xOffset + i] ^ y[yOffset + i]; + return (1 & (unchecked((uint)differentbits - 1) >> 8)); + } + + internal static void Wipe(byte[] data) + { + if (data == null) + throw new ArgumentNullException("data"); + InternalWipe(data, 0, data.Length); + } + + internal static void Wipe(byte[] data, int offset, int count) + { + if (data == null) + throw new ArgumentNullException("data"); + if (offset < 0) + throw new ArgumentOutOfRangeException("offset"); + if (count < 0) + throw new ArgumentOutOfRangeException("count", "Requires count >= 0"); + if ((uint)offset + (uint)count > (uint)data.Length) + throw new ArgumentException("Requires offset + count <= data.Length"); + InternalWipe(data, offset, count); + } + + internal static void Wipe(ArraySegment data) + { + if (data.Array == null) + throw new ArgumentNullException("data.Array"); + InternalWipe(data.Array, data.Offset, data.Count); + } + + // Secure wiping is hard + // * the GC can move around and copy memory + // Perhaps this can be avoided by using unmanaged memory or by fixing the position of the array in memory + // * Swap files and error dumps can contain secret information + // It seems possible to lock memory in RAM, no idea about error dumps + // * Compiler could optimize out the wiping if it knows that data won't be read back + // I hope this is enough, suppressing inlining + // but perhaps `RtlSecureZeroMemory` is needed + [MethodImpl(MethodImplOptions.NoInlining)] + internal static void InternalWipe(byte[] data, int offset, int count) + { + Array.Clear(data, offset, count); + } + + // shallow wipe of structs + [MethodImpl(MethodImplOptions.NoInlining)] + internal static void InternalWipe(ref T data) + where T : struct + { + data = default(T); + } + + // constant time hex conversion + // see http://stackoverflow.com/a/14333437/445517 + // + // An explanation of the weird bit fiddling: + // + // 1. `bytes[i] >> 4` extracts the high nibble of a byte + // `bytes[i] & 0xF` extracts the low nibble of a byte + // 2. `b - 10` + // is `< 0` for values `b < 10`, which will become a decimal digit + // is `>= 0` for values `b > 10`, which will become a letter from `A` to `F`. + // 3. Using `i >> 31` on a signed 32 bit integer extracts the sign, thanks to sign extension. + // It will be `-1` for `i < 0` and `0` for `i >= 0`. + // 4. Combining 2) and 3), shows that `(b-10)>>31` will be `0` for letters and `-1` for digits. + // 5. Looking at the case for letters, the last summand becomes `0`, and `b` is in the range 10 to 15. We want to map it to `A`(65) to `F`(70), which implies adding 55 (`'A'-10`). + // 6. Looking at the case for digits, we want to adapt the last summand so it maps `b` from the range 0 to 9 to the range `0`(48) to `9`(57). This means it needs to become -7 (`'0' - 55`). + // Now we could just multiply with 7. But since -1 is represented by all bits being 1, we can instead use `& -7` since `(0 & -7) == 0` and `(-1 & -7) == -7`. + // + // Some further considerations: + // + // * I didn't use a second loop variable to index into `c`, since measurement shows that calculating it from `i` is cheaper. + // * Using exactly `i < bytes.Length` as upper bound of the loop allows the JITter to eliminate bounds checks on `bytes[i]`, so I chose that variant. + // * Making `b` an int avoids unnecessary conversions from and to byte. + internal static string ToHexStringUpper(byte[] data) + { + if (data == null) + return null; + char[] c = new char[data.Length * 2]; + int b; + for (int i = 0; i < data.Length; i++) + { + b = data[i] >> 4; + c[i * 2] = (char)(55 + b + (((b - 10) >> 31) & -7)); + b = data[i] & 0xF; + c[i * 2 + 1] = (char)(55 + b + (((b - 10) >> 31) & -7)); + } + return new string(c); + } + + // Explanation is similar to ToHexStringUpper + // constant 55 -> 87 and -7 -> -39 to compensate for the offset 32 between lowercase and uppercase letters + internal static string ToHexStringLower(byte[] data) + { + if (data == null) + return null; + char[] c = new char[data.Length * 2]; + int b; + for (int i = 0; i < data.Length; i++) + { + b = data[i] >> 4; + c[i * 2] = (char)(87 + b + (((b - 10) >> 31) & -39)); + b = data[i] & 0xF; + c[i * 2 + 1] = (char)(87 + b + (((b - 10) >> 31) & -39)); + } + return new string(c); + } + + internal static byte[] FromHexString(string hexString) + { + if (hexString == null) + return null; + if (hexString.Length % 2 != 0) + throw new FormatException("The hex string is invalid because it has an odd length"); + var result = new byte[hexString.Length / 2]; + for (int i = 0; i < result.Length; i++) + result[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); + return result; + } + + internal static string ToBase64String(byte[] data) + { + if (data == null) + return null; + return Convert.ToBase64String(data); + } + + internal static byte[] FromBase64String(string s) + { + if (s == null) + return null; + return Convert.FromBase64String(s); + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Ed25519.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Ed25519.cs new file mode 100644 index 00000000..5a085225 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Ed25519.cs @@ -0,0 +1,147 @@ +using System; +using Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10; + +namespace Renci.SshNet.Security.Chaos.NaCl +{ + internal static class Ed25519 + { + public static readonly int PublicKeySizeInBytes = 32; + public static readonly int SignatureSizeInBytes = 64; + public static readonly int ExpandedPrivateKeySizeInBytes = 32 * 2; + public static readonly int PrivateKeySeedSizeInBytes = 32; + public static readonly int SharedKeySizeInBytes = 32; + + public static bool Verify(ArraySegment signature, ArraySegment message, ArraySegment publicKey) + { + if (signature.Count != SignatureSizeInBytes) + throw new ArgumentException(string.Format("Signature size must be {0}", SignatureSizeInBytes), "signature.Count"); + if (publicKey.Count != PublicKeySizeInBytes) + throw new ArgumentException(string.Format("Public key size must be {0}", PublicKeySizeInBytes), "publicKey.Count"); + return Ed25519Operations.crypto_sign_verify(signature.Array, signature.Offset, message.Array, message.Offset, message.Count, publicKey.Array, publicKey.Offset); + } + + public static bool Verify(byte[] signature, byte[] message, byte[] publicKey) + { + if (signature == null) + throw new ArgumentNullException("signature"); + if (message == null) + throw new ArgumentNullException("message"); + if (publicKey == null) + throw new ArgumentNullException("publicKey"); + if (signature.Length != SignatureSizeInBytes) + throw new ArgumentException(string.Format("Signature size must be {0}", SignatureSizeInBytes), "signature.Length"); + if (publicKey.Length != PublicKeySizeInBytes) + throw new ArgumentException(string.Format("Public key size must be {0}", PublicKeySizeInBytes), "publicKey.Length"); + return Ed25519Operations.crypto_sign_verify(signature, 0, message, 0, message.Length, publicKey, 0); + } + + public static void Sign(ArraySegment signature, ArraySegment message, ArraySegment expandedPrivateKey) + { + if (signature.Array == null) + throw new ArgumentNullException("signature.Array"); + if (signature.Count != SignatureSizeInBytes) + throw new ArgumentException("signature.Count"); + if (expandedPrivateKey.Array == null) + throw new ArgumentNullException("expandedPrivateKey.Array"); + if (expandedPrivateKey.Count != ExpandedPrivateKeySizeInBytes) + throw new ArgumentException("expandedPrivateKey.Count"); + if (message.Array == null) + throw new ArgumentNullException("message.Array"); + Ed25519Operations.crypto_sign2(signature.Array, signature.Offset, message.Array, message.Offset, message.Count, expandedPrivateKey.Array, expandedPrivateKey.Offset); + } + + public static byte[] Sign(byte[] message, byte[] expandedPrivateKey) + { + var signature = new byte[SignatureSizeInBytes]; + Sign(new ArraySegment(signature), new ArraySegment(message), new ArraySegment(expandedPrivateKey)); + return signature; + } + + public static byte[] PublicKeyFromSeed(byte[] privateKeySeed) + { + byte[] privateKey; + byte[] publicKey; + KeyPairFromSeed(out publicKey, out privateKey, privateKeySeed); + CryptoBytes.Wipe(privateKey); + return publicKey; + } + + public static byte[] ExpandedPrivateKeyFromSeed(byte[] privateKeySeed) + { + byte[] privateKey; + byte[] publicKey; + KeyPairFromSeed(out publicKey, out privateKey, privateKeySeed); + CryptoBytes.Wipe(publicKey); + return privateKey; + } + + public static void KeyPairFromSeed(out byte[] publicKey, out byte[] expandedPrivateKey, byte[] privateKeySeed) + { + if (privateKeySeed == null) + throw new ArgumentNullException("privateKeySeed"); + if (privateKeySeed.Length != PrivateKeySeedSizeInBytes) + throw new ArgumentException("privateKeySeed"); + var pk = new byte[PublicKeySizeInBytes]; + var sk = new byte[ExpandedPrivateKeySizeInBytes]; + Ed25519Operations.crypto_sign_keypair(pk, 0, sk, 0, privateKeySeed, 0); + publicKey = pk; + expandedPrivateKey = sk; + } + + public static void KeyPairFromSeed(ArraySegment publicKey, ArraySegment expandedPrivateKey, ArraySegment privateKeySeed) + { + if (publicKey.Array == null) + throw new ArgumentNullException("publicKey.Array"); + if (expandedPrivateKey.Array == null) + throw new ArgumentNullException("expandedPrivateKey.Array"); + if (privateKeySeed.Array == null) + throw new ArgumentNullException("privateKeySeed.Array"); + if (publicKey.Count != PublicKeySizeInBytes) + throw new ArgumentException("publicKey.Count"); + if (expandedPrivateKey.Count != ExpandedPrivateKeySizeInBytes) + throw new ArgumentException("expandedPrivateKey.Count"); + if (privateKeySeed.Count != PrivateKeySeedSizeInBytes) + throw new ArgumentException("privateKeySeed.Count"); + Ed25519Operations.crypto_sign_keypair( + publicKey.Array, publicKey.Offset, + expandedPrivateKey.Array, expandedPrivateKey.Offset, + privateKeySeed.Array, privateKeySeed.Offset); + } + + [Obsolete("Needs more testing")] + public static byte[] KeyExchange(byte[] publicKey, byte[] privateKey) + { + var sharedKey = new byte[SharedKeySizeInBytes]; + KeyExchange(new ArraySegment(sharedKey), new ArraySegment(publicKey), new ArraySegment(privateKey)); + return sharedKey; + } + + [Obsolete("Needs more testing")] + public static void KeyExchange(ArraySegment sharedKey, ArraySegment publicKey, ArraySegment privateKey) + { + if (sharedKey.Array == null) + throw new ArgumentNullException("sharedKey.Array"); + if (publicKey.Array == null) + throw new ArgumentNullException("publicKey.Array"); + if (privateKey.Array == null) + throw new ArgumentNullException("privateKey"); + if (sharedKey.Count != 32) + throw new ArgumentException("sharedKey.Count != 32"); + if (publicKey.Count != 32) + throw new ArgumentException("publicKey.Count != 32"); + if (privateKey.Count != 64) + throw new ArgumentException("privateKey.Count != 64"); + + FieldElement montgomeryX, edwardsY, edwardsZ, sharedMontgomeryX; + FieldOperations.fe_frombytes(out edwardsY, publicKey.Array, publicKey.Offset); + FieldOperations.fe_1(out edwardsZ); + MontgomeryCurve25519.EdwardsToMontgomeryX(out montgomeryX, ref edwardsY, ref edwardsZ); + byte[] h = Sha512.Hash(privateKey.Array, privateKey.Offset, 32);//ToDo: Remove alloc + ScalarOperations.sc_clamp(h, 0); + MontgomeryOperations.scalarmult(out sharedMontgomeryX, h, 0, ref montgomeryX); + CryptoBytes.Wipe(h); + FieldOperations.fe_tobytes(sharedKey.Array, sharedKey.Offset, ref sharedMontgomeryX); + MontgomeryCurve25519.KeyExchangeOutputHashNaCl(sharedKey.Array, sharedKey.Offset); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array16.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array16.cs new file mode 100644 index 00000000..dc2b08f5 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array16.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal +{ + // Array16 Salsa20 state + // Array16 SHA-512 block + internal struct Array16 + { + public T x0; + public T x1; + public T x2; + public T x3; + public T x4; + public T x5; + public T x6; + public T x7; + public T x8; + public T x9; + public T x10; + public T x11; + public T x12; + public T x13; + public T x14; + public T x15; + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array8.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array8.cs new file mode 100644 index 00000000..1aeeb09c --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Array8.cs @@ -0,0 +1,18 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal +{ + // Array8 Poly1305 key + // Array8 SHA-512 state/output + internal struct Array8 + { + public T x0; + public T x1; + public T x2; + public T x3; + public T x4; + public T x5; + public T x6; + public T x7; + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/ByteIntegerConverter.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/ByteIntegerConverter.cs new file mode 100644 index 00000000..72f4e8af --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/ByteIntegerConverter.cs @@ -0,0 +1,416 @@ +using System; +using System.Collections.Generic; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal +{ + // Loops? Arrays? Never heard of that stuff + // Library avoids unnecessary heap allocations and unsafe code + // so this ugly code becomes necessary :( + internal static class ByteIntegerConverter + { + #region Individual + + internal static UInt32 LoadLittleEndian32(byte[] buf, int offset) + { + return + (UInt32)(buf[offset + 0]) + | (((UInt32)(buf[offset + 1])) << 8) + | (((UInt32)(buf[offset + 2])) << 16) + | (((UInt32)(buf[offset + 3])) << 24); + } + + internal static void StoreLittleEndian32(byte[] buf, int offset, UInt32 value) + { + buf[offset + 0] = unchecked((byte)value); + buf[offset + 1] = unchecked((byte)(value >> 8)); + buf[offset + 2] = unchecked((byte)(value >> 16)); + buf[offset + 3] = unchecked((byte)(value >> 24)); + } + + internal static UInt64 LoadBigEndian64(byte[] buf, int offset) + { + return + (UInt64)(buf[offset + 7]) + | (((UInt64)(buf[offset + 6])) << 8) + | (((UInt64)(buf[offset + 5])) << 16) + | (((UInt64)(buf[offset + 4])) << 24) + | (((UInt64)(buf[offset + 3])) << 32) + | (((UInt64)(buf[offset + 2])) << 40) + | (((UInt64)(buf[offset + 1])) << 48) + | (((UInt64)(buf[offset + 0])) << 56); + } + + internal static void StoreBigEndian64(byte[] buf, int offset, UInt64 value) + { + buf[offset + 7] = unchecked((byte)value); + buf[offset + 6] = unchecked((byte)(value >> 8)); + buf[offset + 5] = unchecked((byte)(value >> 16)); + buf[offset + 4] = unchecked((byte)(value >> 24)); + buf[offset + 3] = unchecked((byte)(value >> 32)); + buf[offset + 2] = unchecked((byte)(value >> 40)); + buf[offset + 1] = unchecked((byte)(value >> 48)); + buf[offset + 0] = unchecked((byte)(value >> 56)); + } + + /*internal static void XorLittleEndian32(byte[] buf, int offset, UInt32 value) + { + buf[offset + 0] ^= (byte)value; + buf[offset + 1] ^= (byte)(value >> 8); + buf[offset + 2] ^= (byte)(value >> 16); + buf[offset + 3] ^= (byte)(value >> 24); + }*/ + + /*internal static void XorLittleEndian32(byte[] output, int outputOffset, byte[] input, int inputOffset, UInt32 value) + { + output[outputOffset + 0] = (byte)(input[inputOffset + 0] ^ value); + output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8)); + output[outputOffset + 2] = (byte)(input[inputOffset + 2] ^ (value >> 16)); + output[outputOffset + 3] = (byte)(input[inputOffset + 3] ^ (value >> 24)); + }*/ + + #endregion + + #region Array8 + + internal static void Array8LoadLittleEndian32(out Array8 output, byte[] input, int inputOffset) + { + output.x0 = LoadLittleEndian32(input, inputOffset + 0); + output.x1 = LoadLittleEndian32(input, inputOffset + 4); + output.x2 = LoadLittleEndian32(input, inputOffset + 8); + output.x3 = LoadLittleEndian32(input, inputOffset + 12); + output.x4 = LoadLittleEndian32(input, inputOffset + 16); + output.x5 = LoadLittleEndian32(input, inputOffset + 20); + output.x6 = LoadLittleEndian32(input, inputOffset + 24); + output.x7 = LoadLittleEndian32(input, inputOffset + 28); + } + + /* internal static void Array8LoadLittleEndian32(out Array8 output, byte[] input, int inputOffset, int inputLength) + { + #if DEBUG + if (inputLength <= 0) + throw new ArgumentException(); + #endif + int inputEnd = inputOffset + inputLength; + UInt32 highestInt; + switch (inputLength & 3) + { + case 1: + highestInt = input[inputEnd - 1]; + break; + case 2: + highestInt = (uint)( + (input[inputEnd - 1] << 8) | + (input[inputEnd - 2])); + break; + case 3: + highestInt = (uint)( + (input[inputEnd - 1] << 16) | + (input[inputEnd - 2] << 8) | + (input[inputEnd - 3])); + break; + case 0: + highestInt = (uint)( + (input[inputEnd - 1] << 24) | + (input[inputEnd - 2] << 16) | + (input[inputEnd - 3] << 8) | + (input[inputEnd - 4])); + break; + default: + throw new InvalidOperationException(); + } + switch ((inputLength - 1) >> 2) + { + case 7: + output.x7 = highestInt; + output.x6 = LoadLittleEndian32(input, inputOffset + 6 * 4); + output.x5 = LoadLittleEndian32(input, inputOffset + 5 * 4); + output.x4 = LoadLittleEndian32(input, inputOffset + 4 * 4); + output.x3 = LoadLittleEndian32(input, inputOffset + 3 * 4); + output.x2 = LoadLittleEndian32(input, inputOffset + 2 * 4); + output.x1 = LoadLittleEndian32(input, inputOffset + 1 * 4); + output.x0 = LoadLittleEndian32(input, inputOffset + 0 * 4); + return; + case 6: + output.x7 = 0; + output.x6 = highestInt; + output.x5 = LoadLittleEndian32(input, inputOffset + 5 * 4); + output.x4 = LoadLittleEndian32(input, inputOffset + 4 * 4); + output.x3 = LoadLittleEndian32(input, inputOffset + 3 * 4); + output.x2 = LoadLittleEndian32(input, inputOffset + 2 * 4); + output.x1 = LoadLittleEndian32(input, inputOffset + 1 * 4); + output.x0 = LoadLittleEndian32(input, inputOffset + 0 * 4); + return; + case 5: + output.x7 = 0; + output.x6 = 0; + output.x5 = highestInt; + output.x4 = LoadLittleEndian32(input, inputOffset + 4 * 4); + output.x3 = LoadLittleEndian32(input, inputOffset + 3 * 4); + output.x2 = LoadLittleEndian32(input, inputOffset + 2 * 4); + output.x1 = LoadLittleEndian32(input, inputOffset + 1 * 4); + output.x0 = LoadLittleEndian32(input, inputOffset + 0 * 4); + return; + case 4: + output.x7 = 0; + output.x6 = 0; + output.x5 = 0; + output.x4 = highestInt; + output.x3 = LoadLittleEndian32(input, inputOffset + 3 * 4); + output.x2 = LoadLittleEndian32(input, inputOffset + 2 * 4); + output.x1 = LoadLittleEndian32(input, inputOffset + 1 * 4); + output.x0 = LoadLittleEndian32(input, inputOffset + 0 * 4); + return; + case 3: + output.x7 = 0; + output.x6 = 0; + output.x5 = 0; + output.x4 = 0; + output.x3 = highestInt; + output.x2 = LoadLittleEndian32(input, inputOffset + 2 * 4); + output.x1 = LoadLittleEndian32(input, inputOffset + 1 * 4); + output.x0 = LoadLittleEndian32(input, inputOffset + 0 * 4); + return; + case 2: + output.x7 = 0; + output.x6 = 0; + output.x5 = 0; + output.x4 = 0; + output.x3 = 0; + output.x2 = highestInt; + output.x1 = LoadLittleEndian32(input, inputOffset + 1 * 4); + output.x0 = LoadLittleEndian32(input, inputOffset + 0 * 4); + return; + case 1: + output.x7 = 0; + output.x6 = 0; + output.x5 = 0; + output.x4 = 0; + output.x3 = 0; + output.x2 = 0; + output.x1 = highestInt; + output.x0 = LoadLittleEndian32(input, inputOffset + 0 * 4); + return; + case 0: + output.x7 = 0; + output.x6 = 0; + output.x5 = 0; + output.x4 = 0; + output.x3 = 0; + output.x2 = 0; + output.x1 = 0; + output.x0 = highestInt; + return; + default: + throw new InvalidOperationException(); + } + }*/ + + /*internal static void Array8XorLittleEndian(byte[] output, int outputOffset, byte[] input, int inputOffset, ref Array8 keyStream, int length) + { +#if DEBUG + InternalAssert(length > 0); +#endif + int outputEnd = outputOffset + length; + UInt32 highestInt; + switch ((length - 1) >> 2) + { + case 7: + highestInt = keyStream.x7; + XorLittleEndian32(output, outputOffset + 6 * 4, input, inputOffset + 6 * 4, keyStream.x6); + XorLittleEndian32(output, outputOffset + 5 * 4, input, inputOffset + 6 * 4, keyStream.x5); + XorLittleEndian32(output, outputOffset + 4 * 4, input, inputOffset + 6 * 4, keyStream.x4); + XorLittleEndian32(output, outputOffset + 3 * 4, input, inputOffset + 6 * 4, keyStream.x3); + XorLittleEndian32(output, outputOffset + 2 * 4, input, inputOffset + 6 * 4, keyStream.x2); + XorLittleEndian32(output, outputOffset + 1 * 4, input, inputOffset + 6 * 4, keyStream.x1); + XorLittleEndian32(output, outputOffset + 0 * 4, input, inputOffset + 6 * 4, keyStream.x0); + break; + case 6: + highestInt = keyStream.x6; + XorLittleEndian32(output, outputOffset + 5 * 4, input, inputOffset + 6 * 4, keyStream.x5); + XorLittleEndian32(output, outputOffset + 4 * 4, input, inputOffset + 6 * 4, keyStream.x4); + XorLittleEndian32(output, outputOffset + 3 * 4, input, inputOffset + 6 * 4, keyStream.x3); + XorLittleEndian32(output, outputOffset + 2 * 4, input, inputOffset + 6 * 4, keyStream.x2); + XorLittleEndian32(output, outputOffset + 1 * 4, input, inputOffset + 6 * 4, keyStream.x1); + XorLittleEndian32(output, outputOffset + 0 * 4, input, inputOffset + 6 * 4, keyStream.x0); + break; + case 5: + highestInt = keyStream.x5; + XorLittleEndian32(output, outputOffset + 4 * 4, input, inputOffset + 6 * 4, keyStream.x4); + XorLittleEndian32(output, outputOffset + 3 * 4, input, inputOffset + 6 * 4, keyStream.x3); + XorLittleEndian32(output, outputOffset + 2 * 4, input, inputOffset + 6 * 4, keyStream.x2); + XorLittleEndian32(output, outputOffset + 1 * 4, input, inputOffset + 6 * 4, keyStream.x1); + XorLittleEndian32(output, outputOffset + 0 * 4, input, inputOffset + 6 * 4, keyStream.x0); + break; + case 4: + highestInt = keyStream.x4; + XorLittleEndian32(output, outputOffset + 3 * 4, input, inputOffset + 6 * 4, keyStream.x3); + XorLittleEndian32(output, outputOffset + 2 * 4, input, inputOffset + 6 * 4, keyStream.x2); + XorLittleEndian32(output, outputOffset + 1 * 4, input, inputOffset + 6 * 4, keyStream.x1); + XorLittleEndian32(output, outputOffset + 0 * 4, input, inputOffset + 6 * 4, keyStream.x0); + break; + case 3: + highestInt = keyStream.x3; + XorLittleEndian32(output, outputOffset + 2 * 4, input, inputOffset + 6 * 4, keyStream.x2); + XorLittleEndian32(output, outputOffset + 1 * 4, input, inputOffset + 6 * 4, keyStream.x1); + XorLittleEndian32(output, outputOffset + 0 * 4, input, inputOffset + 6 * 4, keyStream.x0); + break; + case 2: + highestInt = keyStream.x2; + XorLittleEndian32(output, outputOffset + 1 * 4, input, inputOffset + 6 * 4, keyStream.x1); + XorLittleEndian32(output, outputOffset + 0 * 4, input, inputOffset + 6 * 4, keyStream.x0); + break; + case 1: + highestInt = keyStream.x1; + XorLittleEndian32(output, outputOffset + 0 * 4, input, inputOffset + 6 * 4, keyStream.x0); + break; + case 0: + highestInt = keyStream.x0; + break; + default: + throw new InvalidOperationException(); + } + switch (length & 3) + { + case 1: + output[outputEnd - 1] ^= (byte)highestInt; + break; + case 2: + output[outputEnd - 1] ^= (byte)(highestInt >> 8); + output[outputEnd - 2] ^= (byte)highestInt; + break; + case 3: + output[outputEnd - 1] ^= (byte)(highestInt >> 16); + output[outputEnd - 2] ^= (byte)(highestInt >> 8); + output[outputEnd - 3] ^= (byte)highestInt; + break; + case 0: + output[outputEnd - 1] ^= (byte)(highestInt >> 24); + output[outputEnd - 2] ^= (byte)(highestInt >> 16); + output[outputEnd - 3] ^= (byte)(highestInt >> 8); + output[outputEnd - 4] ^= (byte)highestInt; + break; + default: + throw new InvalidOperationException(); + } + }*/ + + /*internal static void Array8StoreLittleEndian32(byte[] output, int outputOffset, ref Array8 input) + { + StoreLittleEndian32(output, outputOffset + 0, input.x0); + StoreLittleEndian32(output, outputOffset + 4, input.x1); + StoreLittleEndian32(output, outputOffset + 8, input.x2); + StoreLittleEndian32(output, outputOffset + 12, input.x3); + StoreLittleEndian32(output, outputOffset + 16, input.x4); + StoreLittleEndian32(output, outputOffset + 20, input.x5); + StoreLittleEndian32(output, outputOffset + 24, input.x6); + StoreLittleEndian32(output, outputOffset + 28, input.x7); + }*/ + #endregion + + internal static void Array16LoadBigEndian64(out Array16 output, byte[] input, int inputOffset) + { + output.x0 = LoadBigEndian64(input, inputOffset + 0); + output.x1 = LoadBigEndian64(input, inputOffset + 8); + output.x2 = LoadBigEndian64(input, inputOffset + 16); + output.x3 = LoadBigEndian64(input, inputOffset + 24); + output.x4 = LoadBigEndian64(input, inputOffset + 32); + output.x5 = LoadBigEndian64(input, inputOffset + 40); + output.x6 = LoadBigEndian64(input, inputOffset + 48); + output.x7 = LoadBigEndian64(input, inputOffset + 56); + output.x8 = LoadBigEndian64(input, inputOffset + 64); + output.x9 = LoadBigEndian64(input, inputOffset + 72); + output.x10 = LoadBigEndian64(input, inputOffset + 80); + output.x11 = LoadBigEndian64(input, inputOffset + 88); + output.x12 = LoadBigEndian64(input, inputOffset + 96); + output.x13 = LoadBigEndian64(input, inputOffset + 104); + output.x14 = LoadBigEndian64(input, inputOffset + 112); + output.x15 = LoadBigEndian64(input, inputOffset + 120); + } + + // ToDo: Only used in tests. Remove? + internal static void Array16LoadLittleEndian32(out Array16 output, byte[] input, int inputOffset) + { + output.x0 = LoadLittleEndian32(input, inputOffset + 0); + output.x1 = LoadLittleEndian32(input, inputOffset + 4); + output.x2 = LoadLittleEndian32(input, inputOffset + 8); + output.x3 = LoadLittleEndian32(input, inputOffset + 12); + output.x4 = LoadLittleEndian32(input, inputOffset + 16); + output.x5 = LoadLittleEndian32(input, inputOffset + 20); + output.x6 = LoadLittleEndian32(input, inputOffset + 24); + output.x7 = LoadLittleEndian32(input, inputOffset + 28); + output.x8 = LoadLittleEndian32(input, inputOffset + 32); + output.x9 = LoadLittleEndian32(input, inputOffset + 36); + output.x10 = LoadLittleEndian32(input, inputOffset + 40); + output.x11 = LoadLittleEndian32(input, inputOffset + 44); + output.x12 = LoadLittleEndian32(input, inputOffset + 48); + output.x13 = LoadLittleEndian32(input, inputOffset + 52); + output.x14 = LoadLittleEndian32(input, inputOffset + 56); + output.x15 = LoadLittleEndian32(input, inputOffset + 60); + } + + /*internal static void Array16LoadLittleEndian32(out Array16 output, byte[] input, int inputOffset, int inputLength) + { + Array8 temp; + if (inputLength > 32) + { + output.x0 = LoadLittleEndian32(input, inputOffset + 0); + output.x1 = LoadLittleEndian32(input, inputOffset + 4); + output.x2 = LoadLittleEndian32(input, inputOffset + 8); + output.x3 = LoadLittleEndian32(input, inputOffset + 12); + output.x4 = LoadLittleEndian32(input, inputOffset + 16); + output.x5 = LoadLittleEndian32(input, inputOffset + 20); + output.x6 = LoadLittleEndian32(input, inputOffset + 24); + output.x7 = LoadLittleEndian32(input, inputOffset + 28); + Array8LoadLittleEndian32(out temp, input, inputOffset + 32, inputLength - 32); + output.x8 = temp.x0; + output.x9 = temp.x1; + output.x10 = temp.x2; + output.x11 = temp.x3; + output.x12 = temp.x4; + output.x13 = temp.x5; + output.x14 = temp.x6; + output.x15 = temp.x7; + } + else + { + Array8LoadLittleEndian32(out temp, input, inputOffset, inputLength); + output.x0 = temp.x0; + output.x1 = temp.x1; + output.x2 = temp.x2; + output.x3 = temp.x3; + output.x4 = temp.x4; + output.x5 = temp.x5; + output.x6 = temp.x6; + output.x7 = temp.x7; + output.x8 = 0; + output.x9 = 0; + output.x10 = 0; + output.x11 = 0; + output.x12 = 0; + output.x13 = 0; + output.x14 = 0; + output.x15 = 0; + } + }*/ + + internal static void Array16StoreLittleEndian32(byte[] output, int outputOffset, ref Array16 input) + { + StoreLittleEndian32(output, outputOffset + 0, input.x0); + StoreLittleEndian32(output, outputOffset + 4, input.x1); + StoreLittleEndian32(output, outputOffset + 8, input.x2); + StoreLittleEndian32(output, outputOffset + 12, input.x3); + StoreLittleEndian32(output, outputOffset + 16, input.x4); + StoreLittleEndian32(output, outputOffset + 20, input.x5); + StoreLittleEndian32(output, outputOffset + 24, input.x6); + StoreLittleEndian32(output, outputOffset + 28, input.x7); + StoreLittleEndian32(output, outputOffset + 32, input.x8); + StoreLittleEndian32(output, outputOffset + 36, input.x9); + StoreLittleEndian32(output, outputOffset + 40, input.x10); + StoreLittleEndian32(output, outputOffset + 44, input.x11); + StoreLittleEndian32(output, outputOffset + 48, input.x12); + StoreLittleEndian32(output, outputOffset + 52, input.x13); + StoreLittleEndian32(output, outputOffset + 56, input.x14); + StoreLittleEndian32(output, outputOffset + 60, input.x15); + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/FieldElement.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/FieldElement.cs new file mode 100644 index 00000000..c8b32488 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/FieldElement.cs @@ -0,0 +1,36 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal struct FieldElement + { + internal int x0; + internal int x1; + internal int x2; + internal int x3; + internal int x4; + internal int x5; + internal int x6; + internal int x7; + internal int x8; + internal int x9; + + //internal static readonly FieldElement Zero = new FieldElement(); + //internal static readonly FieldElement One = new FieldElement() { x0 = 1 }; + + internal FieldElement(params int[] elements) + { + InternalAssert.Assert(elements.Length == 10, "elements.Length != 10"); + x0 = elements[0]; + x1 = elements[1]; + x2 = elements[2]; + x3 = elements[3]; + x4 = elements[4]; + x5 = elements[5]; + x6 = elements[6]; + x7 = elements[7]; + x8 = elements[8]; + x9 = elements[9]; + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/GroupElement.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/GroupElement.cs new file mode 100644 index 00000000..8203281c --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/GroupElement.cs @@ -0,0 +1,63 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + /* + ge means group element. + + Here the group is the set of pairs (x,y) of field elements (see fe.h) + satisfying -x^2 + y^2 = 1 + d x^2y^2 + where d = -121665/121666. + + Representations: + ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z + ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT + ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T + ge_precomp (Duif): (y+x,y-x,2dxy) + */ + + internal struct GroupElementP2 + { + public FieldElement X; + public FieldElement Y; + public FieldElement Z; + } ; + + internal struct GroupElementP3 + { + public FieldElement X; + public FieldElement Y; + public FieldElement Z; + public FieldElement T; + } ; + + internal struct GroupElementP1P1 + { + public FieldElement X; + public FieldElement Y; + public FieldElement Z; + public FieldElement T; + } ; + + internal struct GroupElementPreComp + { + public FieldElement yplusx; + public FieldElement yminusx; + public FieldElement xy2d; + + public GroupElementPreComp(FieldElement yplusx, FieldElement yminusx, FieldElement xy2d) + { + this.yplusx = yplusx; + this.yminusx = yminusx; + this.xy2d = xy2d; + } + } ; + + internal struct GroupElementCached + { + public FieldElement YplusX; + public FieldElement YminusX; + public FieldElement Z; + public FieldElement T2d; + } ; +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base.cs new file mode 100644 index 00000000..0e3359a3 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base.cs @@ -0,0 +1,1357 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class LookupTables + { + /* base[i][j] = (j+1)*256^i*B */ + //32*8 + internal static GroupElementPreComp[][] Base = new GroupElementPreComp[][] + { + new[]{ + new GroupElementPreComp( + new FieldElement( 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 ), + new FieldElement( -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 ), + new FieldElement( -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 ) + ), + new GroupElementPreComp( + new FieldElement( -12815894,-12976347,-21581243,11784320,-25355658,-2750717,-11717903,-3814571,-358445,-10211303 ), + new FieldElement( -21703237,6903825,27185491,6451973,-29577724,-9554005,-15616551,11189268,-26829678,-5319081 ), + new FieldElement( 26966642,11152617,32442495,15396054,14353839,-12752335,-3128826,-9541118,-15472047,-4166697 ) + ), + new GroupElementPreComp( + new FieldElement( 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 ), + new FieldElement( 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 ), + new FieldElement( 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 ) + ), + new GroupElementPreComp( + new FieldElement( -17036878,13921892,10945806,-6033431,27105052,-16084379,-28926210,15006023,3284568,-6276540 ), + new FieldElement( 23599295,-8306047,-11193664,-7687416,13236774,10506355,7464579,9656445,13059162,10374397 ), + new FieldElement( 7798556,16710257,3033922,2874086,28997861,2835604,32406664,-3839045,-641708,-101325 ) + ), + new GroupElementPreComp( + new FieldElement( 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 ), + new FieldElement( 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 ), + new FieldElement( 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 ) + ), + new GroupElementPreComp( + new FieldElement( -15371964,-12862754,32573250,4720197,-26436522,5875511,-19188627,-15224819,-9818940,-12085777 ), + new FieldElement( -8549212,109983,15149363,2178705,22900618,4543417,3044240,-15689887,1762328,14866737 ), + new FieldElement( -18199695,-15951423,-10473290,1707278,-17185920,3916101,-28236412,3959421,27914454,4383652 ) + ), + new GroupElementPreComp( + new FieldElement( 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 ), + new FieldElement( -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 ), + new FieldElement( 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 ) + ), + new GroupElementPreComp( + new FieldElement( 14499471,-2729599,-33191113,-4254652,28494862,14271267,30290735,10876454,-33154098,2381726 ), + new FieldElement( -7195431,-2655363,-14730155,462251,-27724326,3941372,-6236617,3696005,-32300832,15351955 ), + new FieldElement( 27431194,8222322,16448760,-3907995,-18707002,11938355,-32961401,-2970515,29551813,10109425 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -13657040,-13155431,-31283750,11777098,21447386,6519384,-2378284,-1627556,10092783,-4764171 ), + new FieldElement( 27939166,14210322,4677035,16277044,-22964462,-12398139,-32508754,12005538,-17810127,12803510 ), + new FieldElement( 17228999,-15661624,-1233527,300140,-1224870,-11714777,30364213,-9038194,18016357,4397660 ) + ), + new GroupElementPreComp( + new FieldElement( -10958843,-7690207,4776341,-14954238,27850028,-15602212,-26619106,14544525,-17477504,982639 ), + new FieldElement( 29253598,15796703,-2863982,-9908884,10057023,3163536,7332899,-4120128,-21047696,9934963 ), + new FieldElement( 5793303,16271923,-24131614,-10116404,29188560,1206517,-14747930,4559895,-30123922,-10897950 ) + ), + new GroupElementPreComp( + new FieldElement( -27643952,-11493006,16282657,-11036493,28414021,-15012264,24191034,4541697,-13338309,5500568 ), + new FieldElement( 12650548,-1497113,9052871,11355358,-17680037,-8400164,-17430592,12264343,10874051,13524335 ), + new FieldElement( 25556948,-3045990,714651,2510400,23394682,-10415330,33119038,5080568,-22528059,5376628 ) + ), + new GroupElementPreComp( + new FieldElement( -26088264,-4011052,-17013699,-3537628,-6726793,1920897,-22321305,-9447443,4535768,1569007 ), + new FieldElement( -2255422,14606630,-21692440,-8039818,28430649,8775819,-30494562,3044290,31848280,12543772 ), + new FieldElement( -22028579,2943893,-31857513,6777306,13784462,-4292203,-27377195,-2062731,7718482,14474653 ) + ), + new GroupElementPreComp( + new FieldElement( 2385315,2454213,-22631320,46603,-4437935,-15680415,656965,-7236665,24316168,-5253567 ), + new FieldElement( 13741529,10911568,-33233417,-8603737,-20177830,-1033297,33040651,-13424532,-20729456,8321686 ), + new FieldElement( 21060490,-2212744,15712757,-4336099,1639040,10656336,23845965,-11874838,-9984458,608372 ) + ), + new GroupElementPreComp( + new FieldElement( -13672732,-15087586,-10889693,-7557059,-6036909,11305547,1123968,-6780577,27229399,23887 ), + new FieldElement( -23244140,-294205,-11744728,14712571,-29465699,-2029617,12797024,-6440308,-1633405,16678954 ), + new FieldElement( -29500620,4770662,-16054387,14001338,7830047,9564805,-1508144,-4795045,-17169265,4904953 ) + ), + new GroupElementPreComp( + new FieldElement( 24059557,14617003,19037157,-15039908,19766093,-14906429,5169211,16191880,2128236,-4326833 ), + new FieldElement( -16981152,4124966,-8540610,-10653797,30336522,-14105247,-29806336,916033,-6882542,-2986532 ), + new FieldElement( -22630907,12419372,-7134229,-7473371,-16478904,16739175,285431,2763829,15736322,4143876 ) + ), + new GroupElementPreComp( + new FieldElement( 2379352,11839345,-4110402,-5988665,11274298,794957,212801,-14594663,23527084,-16458268 ), + new FieldElement( 33431127,-11130478,-17838966,-15626900,8909499,8376530,-32625340,4087881,-15188911,-14416214 ), + new FieldElement( 1767683,7197987,-13205226,-2022635,-13091350,448826,5799055,4357868,-4774191,-16323038 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 6721966,13833823,-23523388,-1551314,26354293,-11863321,23365147,-3949732,7390890,2759800 ), + new FieldElement( 4409041,2052381,23373853,10530217,7676779,-12885954,21302353,-4264057,1244380,-12919645 ), + new FieldElement( -4421239,7169619,4982368,-2957590,30256825,-2777540,14086413,9208236,15886429,16489664 ) + ), + new GroupElementPreComp( + new FieldElement( 1996075,10375649,14346367,13311202,-6874135,-16438411,-13693198,398369,-30606455,-712933 ), + new FieldElement( -25307465,9795880,-2777414,14878809,-33531835,14780363,13348553,12076947,-30836462,5113182 ), + new FieldElement( -17770784,11797796,31950843,13929123,-25888302,12288344,-30341101,-7336386,13847711,5387222 ) + ), + new GroupElementPreComp( + new FieldElement( -18582163,-3416217,17824843,-2340966,22744343,-10442611,8763061,3617786,-19600662,10370991 ), + new FieldElement( 20246567,-14369378,22358229,-543712,18507283,-10413996,14554437,-8746092,32232924,16763880 ), + new FieldElement( 9648505,10094563,26416693,14745928,-30374318,-6472621,11094161,15689506,3140038,-16510092 ) + ), + new GroupElementPreComp( + new FieldElement( -16160072,5472695,31895588,4744994,8823515,10365685,-27224800,9448613,-28774454,366295 ), + new FieldElement( 19153450,11523972,-11096490,-6503142,-24647631,5420647,28344573,8041113,719605,11671788 ), + new FieldElement( 8678025,2694440,-6808014,2517372,4964326,11152271,-15432916,-15266516,27000813,-10195553 ) + ), + new GroupElementPreComp( + new FieldElement( -15157904,7134312,8639287,-2814877,-7235688,10421742,564065,5336097,6750977,-14521026 ), + new FieldElement( 11836410,-3979488,26297894,16080799,23455045,15735944,1695823,-8819122,8169720,16220347 ), + new FieldElement( -18115838,8653647,17578566,-6092619,-8025777,-16012763,-11144307,-2627664,-5990708,-14166033 ) + ), + new GroupElementPreComp( + new FieldElement( -23308498,-10968312,15213228,-10081214,-30853605,-11050004,27884329,2847284,2655861,1738395 ), + new FieldElement( -27537433,-14253021,-25336301,-8002780,-9370762,8129821,21651608,-3239336,-19087449,-11005278 ), + new FieldElement( 1533110,3437855,23735889,459276,29970501,11335377,26030092,5821408,10478196,8544890 ) + ), + new GroupElementPreComp( + new FieldElement( 32173121,-16129311,24896207,3921497,22579056,-3410854,19270449,12217473,17789017,-3395995 ), + new FieldElement( -30552961,-2228401,-15578829,-10147201,13243889,517024,15479401,-3853233,30460520,1052596 ), + new FieldElement( -11614875,13323618,32618793,8175907,-15230173,12596687,27491595,-4612359,3179268,-9478891 ) + ), + new GroupElementPreComp( + new FieldElement( 31947069,-14366651,-4640583,-15339921,-15125977,-6039709,-14756777,-16411740,19072640,-9511060 ), + new FieldElement( 11685058,11822410,3158003,-13952594,33402194,-4165066,5977896,-5215017,473099,5040608 ), + new FieldElement( -20290863,8198642,-27410132,11602123,1290375,-2799760,28326862,1721092,-19558642,-3131606 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 7881532,10687937,7578723,7738378,-18951012,-2553952,21820786,8076149,-27868496,11538389 ), + new FieldElement( -19935666,3899861,18283497,-6801568,-15728660,-11249211,8754525,7446702,-5676054,5797016 ), + new FieldElement( -11295600,-3793569,-15782110,-7964573,12708869,-8456199,2014099,-9050574,-2369172,-5877341 ) + ), + new GroupElementPreComp( + new FieldElement( -22472376,-11568741,-27682020,1146375,18956691,16640559,1192730,-3714199,15123619,10811505 ), + new FieldElement( 14352098,-3419715,-18942044,10822655,32750596,4699007,-70363,15776356,-28886779,-11974553 ), + new FieldElement( -28241164,-8072475,-4978962,-5315317,29416931,1847569,-20654173,-16484855,4714547,-9600655 ) + ), + new GroupElementPreComp( + new FieldElement( 15200332,8368572,19679101,15970074,-31872674,1959451,24611599,-4543832,-11745876,12340220 ), + new FieldElement( 12876937,-10480056,33134381,6590940,-6307776,14872440,9613953,8241152,15370987,9608631 ), + new FieldElement( -4143277,-12014408,8446281,-391603,4407738,13629032,-7724868,15866074,-28210621,-8814099 ) + ), + new GroupElementPreComp( + new FieldElement( 26660628,-15677655,8393734,358047,-7401291,992988,-23904233,858697,20571223,8420556 ), + new FieldElement( 14620715,13067227,-15447274,8264467,14106269,15080814,33531827,12516406,-21574435,-12476749 ), + new FieldElement( 236881,10476226,57258,-14677024,6472998,2466984,17258519,7256740,8791136,15069930 ) + ), + new GroupElementPreComp( + new FieldElement( 1276410,-9371918,22949635,-16322807,-23493039,-5702186,14711875,4874229,-30663140,-2331391 ), + new FieldElement( 5855666,4990204,-13711848,7294284,-7804282,1924647,-1423175,-7912378,-33069337,9234253 ), + new FieldElement( 20590503,-9018988,31529744,-7352666,-2706834,10650548,31559055,-11609587,18979186,13396066 ) + ), + new GroupElementPreComp( + new FieldElement( 24474287,4968103,22267082,4407354,24063882,-8325180,-18816887,13594782,33514650,7021958 ), + new FieldElement( -11566906,-6565505,-21365085,15928892,-26158305,4315421,-25948728,-3916677,-21480480,12868082 ), + new FieldElement( -28635013,13504661,19988037,-2132761,21078225,6443208,-21446107,2244500,-12455797,-8089383 ) + ), + new GroupElementPreComp( + new FieldElement( -30595528,13793479,-5852820,319136,-25723172,-6263899,33086546,8957937,-15233648,5540521 ), + new FieldElement( -11630176,-11503902,-8119500,-7643073,2620056,1022908,-23710744,-1568984,-16128528,-14962807 ), + new FieldElement( 23152971,775386,27395463,14006635,-9701118,4649512,1689819,892185,-11513277,-15205948 ) + ), + new GroupElementPreComp( + new FieldElement( 9770129,9586738,26496094,4324120,1556511,-3550024,27453819,4763127,-19179614,5867134 ), + new FieldElement( -32765025,1927590,31726409,-4753295,23962434,-16019500,27846559,5931263,-29749703,-16108455 ), + new FieldElement( 27461885,-2977536,22380810,1815854,-23033753,-3031938,7283490,-15148073,-19526700,7734629 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -8010264,-9590817,-11120403,6196038,29344158,-13430885,7585295,-3176626,18549497,15302069 ), + new FieldElement( -32658337,-6171222,-7672793,-11051681,6258878,13504381,10458790,-6418461,-8872242,8424746 ), + new FieldElement( 24687205,8613276,-30667046,-3233545,1863892,-1830544,19206234,7134917,-11284482,-828919 ) + ), + new GroupElementPreComp( + new FieldElement( 11334899,-9218022,8025293,12707519,17523892,-10476071,10243738,-14685461,-5066034,16498837 ), + new FieldElement( 8911542,6887158,-9584260,-6958590,11145641,-9543680,17303925,-14124238,6536641,10543906 ), + new FieldElement( -28946384,15479763,-17466835,568876,-1497683,11223454,-2669190,-16625574,-27235709,8876771 ) + ), + new GroupElementPreComp( + new FieldElement( -25742899,-12566864,-15649966,-846607,-33026686,-796288,-33481822,15824474,-604426,-9039817 ), + new FieldElement( 10330056,70051,7957388,-9002667,9764902,15609756,27698697,-4890037,1657394,3084098 ), + new FieldElement( 10477963,-7470260,12119566,-13250805,29016247,-5365589,31280319,14396151,-30233575,15272409 ) + ), + new GroupElementPreComp( + new FieldElement( -12288309,3169463,28813183,16658753,25116432,-5630466,-25173957,-12636138,-25014757,1950504 ), + new FieldElement( -26180358,9489187,11053416,-14746161,-31053720,5825630,-8384306,-8767532,15341279,8373727 ), + new FieldElement( 28685821,7759505,-14378516,-12002860,-31971820,4079242,298136,-10232602,-2878207,15190420 ) + ), + new GroupElementPreComp( + new FieldElement( -32932876,13806336,-14337485,-15794431,-24004620,10940928,8669718,2742393,-26033313,-6875003 ), + new FieldElement( -1580388,-11729417,-25979658,-11445023,-17411874,-10912854,9291594,-16247779,-12154742,6048605 ), + new FieldElement( -30305315,14843444,1539301,11864366,20201677,1900163,13934231,5128323,11213262,9168384 ) + ), + new GroupElementPreComp( + new FieldElement( -26280513,11007847,19408960,-940758,-18592965,-4328580,-5088060,-11105150,20470157,-16398701 ), + new FieldElement( -23136053,9282192,14855179,-15390078,-7362815,-14408560,-22783952,14461608,14042978,5230683 ), + new FieldElement( 29969567,-2741594,-16711867,-8552442,9175486,-2468974,21556951,3506042,-5933891,-12449708 ) + ), + new GroupElementPreComp( + new FieldElement( -3144746,8744661,19704003,4581278,-20430686,6830683,-21284170,8971513,-28539189,15326563 ), + new FieldElement( -19464629,10110288,-17262528,-3503892,-23500387,1355669,-15523050,15300988,-20514118,9168260 ), + new FieldElement( -5353335,4488613,-23803248,16314347,7780487,-15638939,-28948358,9601605,33087103,-9011387 ) + ), + new GroupElementPreComp( + new FieldElement( -19443170,-15512900,-20797467,-12445323,-29824447,10229461,-27444329,-15000531,-5996870,15664672 ), + new FieldElement( 23294591,-16632613,-22650781,-8470978,27844204,11461195,13099750,-2460356,18151676,13417686 ), + new FieldElement( -24722913,-4176517,-31150679,5988919,-26858785,6685065,1661597,-12551441,15271676,-15452665 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 11433042,-13228665,8239631,-5279517,-1985436,-725718,-18698764,2167544,-6921301,-13440182 ), + new FieldElement( -31436171,15575146,30436815,12192228,-22463353,9395379,-9917708,-8638997,12215110,12028277 ), + new FieldElement( 14098400,6555944,23007258,5757252,-15427832,-12950502,30123440,4617780,-16900089,-655628 ) + ), + new GroupElementPreComp( + new FieldElement( -4026201,-15240835,11893168,13718664,-14809462,1847385,-15819999,10154009,23973261,-12684474 ), + new FieldElement( -26531820,-3695990,-1908898,2534301,-31870557,-16550355,18341390,-11419951,32013174,-10103539 ), + new FieldElement( -25479301,10876443,-11771086,-14625140,-12369567,1838104,21911214,6354752,4425632,-837822 ) + ), + new GroupElementPreComp( + new FieldElement( -10433389,-14612966,22229858,-3091047,-13191166,776729,-17415375,-12020462,4725005,14044970 ), + new FieldElement( 19268650,-7304421,1555349,8692754,-21474059,-9910664,6347390,-1411784,-19522291,-16109756 ), + new FieldElement( -24864089,12986008,-10898878,-5558584,-11312371,-148526,19541418,8180106,9282262,10282508 ) + ), + new GroupElementPreComp( + new FieldElement( -26205082,4428547,-8661196,-13194263,4098402,-14165257,15522535,8372215,5542595,-10702683 ), + new FieldElement( -10562541,14895633,26814552,-16673850,-17480754,-2489360,-2781891,6993761,-18093885,10114655 ), + new FieldElement( -20107055,-929418,31422704,10427861,-7110749,6150669,-29091755,-11529146,25953725,-106158 ) + ), + new GroupElementPreComp( + new FieldElement( -4234397,-8039292,-9119125,3046000,2101609,-12607294,19390020,6094296,-3315279,12831125 ), + new FieldElement( -15998678,7578152,5310217,14408357,-33548620,-224739,31575954,6326196,7381791,-2421839 ), + new FieldElement( -20902779,3296811,24736065,-16328389,18374254,7318640,6295303,8082724,-15362489,12339664 ) + ), + new GroupElementPreComp( + new FieldElement( 27724736,2291157,6088201,-14184798,1792727,5857634,13848414,15768922,25091167,14856294 ), + new FieldElement( -18866652,8331043,24373479,8541013,-701998,-9269457,12927300,-12695493,-22182473,-9012899 ), + new FieldElement( -11423429,-5421590,11632845,3405020,30536730,-11674039,-27260765,13866390,30146206,9142070 ) + ), + new GroupElementPreComp( + new FieldElement( 3924129,-15307516,-13817122,-10054960,12291820,-668366,-27702774,9326384,-8237858,4171294 ), + new FieldElement( -15921940,16037937,6713787,16606682,-21612135,2790944,26396185,3731949,345228,-5462949 ), + new FieldElement( -21327538,13448259,25284571,1143661,20614966,-8849387,2031539,-12391231,-16253183,-13582083 ) + ), + new GroupElementPreComp( + new FieldElement( 31016211,-16722429,26371392,-14451233,-5027349,14854137,17477601,3842657,28012650,-16405420 ), + new FieldElement( -5075835,9368966,-8562079,-4600902,-15249953,6970560,-9189873,16292057,-8867157,3507940 ), + new FieldElement( 29439664,3537914,23333589,6997794,-17555561,-11018068,-15209202,-15051267,-9164929,6580396 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -12185861,-7679788,16438269,10826160,-8696817,-6235611,17860444,-9273846,-2095802,9304567 ), + new FieldElement( 20714564,-4336911,29088195,7406487,11426967,-5095705,14792667,-14608617,5289421,-477127 ), + new FieldElement( -16665533,-10650790,-6160345,-13305760,9192020,-1802462,17271490,12349094,26939669,-3752294 ) + ), + new GroupElementPreComp( + new FieldElement( -12889898,9373458,31595848,16374215,21471720,13221525,-27283495,-12348559,-3698806,117887 ), + new FieldElement( 22263325,-6560050,3984570,-11174646,-15114008,-566785,28311253,5358056,-23319780,541964 ), + new FieldElement( 16259219,3261970,2309254,-15534474,-16885711,-4581916,24134070,-16705829,-13337066,-13552195 ) + ), + new GroupElementPreComp( + new FieldElement( 9378160,-13140186,-22845982,-12745264,28198281,-7244098,-2399684,-717351,690426,14876244 ), + new FieldElement( 24977353,-314384,-8223969,-13465086,28432343,-1176353,-13068804,-12297348,-22380984,6618999 ), + new FieldElement( -1538174,11685646,12944378,13682314,-24389511,-14413193,8044829,-13817328,32239829,-5652762 ) + ), + new GroupElementPreComp( + new FieldElement( -18603066,4762990,-926250,8885304,-28412480,-3187315,9781647,-10350059,32779359,5095274 ), + new FieldElement( -33008130,-5214506,-32264887,-3685216,9460461,-9327423,-24601656,14506724,21639561,-2630236 ), + new FieldElement( -16400943,-13112215,25239338,15531969,3987758,-4499318,-1289502,-6863535,17874574,558605 ) + ), + new GroupElementPreComp( + new FieldElement( -13600129,10240081,9171883,16131053,-20869254,9599700,33499487,5080151,2085892,5119761 ), + new FieldElement( -22205145,-2519528,-16381601,414691,-25019550,2170430,30634760,-8363614,-31999993,-5759884 ), + new FieldElement( -6845704,15791202,8550074,-1312654,29928809,-12092256,27534430,-7192145,-22351378,12961482 ) + ), + new GroupElementPreComp( + new FieldElement( -24492060,-9570771,10368194,11582341,-23397293,-2245287,16533930,8206996,-30194652,-5159638 ), + new FieldElement( -11121496,-3382234,2307366,6362031,-135455,8868177,-16835630,7031275,7589640,8945490 ), + new FieldElement( -32152748,8917967,6661220,-11677616,-1192060,-15793393,7251489,-11182180,24099109,-14456170 ) + ), + new GroupElementPreComp( + new FieldElement( 5019558,-7907470,4244127,-14714356,-26933272,6453165,-19118182,-13289025,-6231896,-10280736 ), + new FieldElement( 10853594,10721687,26480089,5861829,-22995819,1972175,-1866647,-10557898,-3363451,-6441124 ), + new FieldElement( -17002408,5906790,221599,-6563147,7828208,-13248918,24362661,-2008168,-13866408,7421392 ) + ), + new GroupElementPreComp( + new FieldElement( 8139927,-6546497,32257646,-5890546,30375719,1886181,-21175108,15441252,28826358,-4123029 ), + new FieldElement( 6267086,9695052,7709135,-16603597,-32869068,-1886135,14795160,-7840124,13746021,-1742048 ), + new FieldElement( 28584902,7787108,-6732942,-15050729,22846041,-7571236,-3181936,-363524,4771362,-8419958 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 24949256,6376279,-27466481,-8174608,-18646154,-9930606,33543569,-12141695,3569627,11342593 ), + new FieldElement( 26514989,4740088,27912651,3697550,19331575,-11472339,6809886,4608608,7325975,-14801071 ), + new FieldElement( -11618399,-14554430,-24321212,7655128,-1369274,5214312,-27400540,10258390,-17646694,-8186692 ) + ), + new GroupElementPreComp( + new FieldElement( 11431204,15823007,26570245,14329124,18029990,4796082,-31446179,15580664,9280358,-3973687 ), + new FieldElement( -160783,-10326257,-22855316,-4304997,-20861367,-13621002,-32810901,-11181622,-15545091,4387441 ), + new FieldElement( -20799378,12194512,3937617,-5805892,-27154820,9340370,-24513992,8548137,20617071,-7482001 ) + ), + new GroupElementPreComp( + new FieldElement( -938825,-3930586,-8714311,16124718,24603125,-6225393,-13775352,-11875822,24345683,10325460 ), + new FieldElement( -19855277,-1568885,-22202708,8714034,14007766,6928528,16318175,-1010689,4766743,3552007 ), + new FieldElement( -21751364,-16730916,1351763,-803421,-4009670,3950935,3217514,14481909,10988822,-3994762 ) + ), + new GroupElementPreComp( + new FieldElement( 15564307,-14311570,3101243,5684148,30446780,-8051356,12677127,-6505343,-8295852,13296005 ), + new FieldElement( -9442290,6624296,-30298964,-11913677,-4670981,-2057379,31521204,9614054,-30000824,12074674 ), + new FieldElement( 4771191,-135239,14290749,-13089852,27992298,14998318,-1413936,-1556716,29832613,-16391035 ) + ), + new GroupElementPreComp( + new FieldElement( 7064884,-7541174,-19161962,-5067537,-18891269,-2912736,25825242,5293297,-27122660,13101590 ), + new FieldElement( -2298563,2439670,-7466610,1719965,-27267541,-16328445,32512469,-5317593,-30356070,-4190957 ), + new FieldElement( -30006540,10162316,-33180176,3981723,-16482138,-13070044,14413974,9515896,19568978,9628812 ) + ), + new GroupElementPreComp( + new FieldElement( 33053803,199357,15894591,1583059,27380243,-4580435,-17838894,-6106839,-6291786,3437740 ), + new FieldElement( -18978877,3884493,19469877,12726490,15913552,13614290,-22961733,70104,7463304,4176122 ), + new FieldElement( -27124001,10659917,11482427,-16070381,12771467,-6635117,-32719404,-5322751,24216882,5944158 ) + ), + new GroupElementPreComp( + new FieldElement( 8894125,7450974,-2664149,-9765752,-28080517,-12389115,19345746,14680796,11632993,5847885 ), + new FieldElement( 26942781,-2315317,9129564,-4906607,26024105,11769399,-11518837,6367194,-9727230,4782140 ), + new FieldElement( 19916461,-4828410,-22910704,-11414391,25606324,-5972441,33253853,8220911,6358847,-1873857 ) + ), + new GroupElementPreComp( + new FieldElement( 801428,-2081702,16569428,11065167,29875704,96627,7908388,-4480480,-13538503,1387155 ), + new FieldElement( 19646058,5720633,-11416706,12814209,11607948,12749789,14147075,15156355,-21866831,11835260 ), + new FieldElement( 19299512,1155910,28703737,14890794,2925026,7269399,26121523,15467869,-26560550,5052483 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -3017432,10058206,1980837,3964243,22160966,12322533,-6431123,-12618185,12228557,-7003677 ), + new FieldElement( 32944382,14922211,-22844894,5188528,21913450,-8719943,4001465,13238564,-6114803,8653815 ), + new FieldElement( 22865569,-4652735,27603668,-12545395,14348958,8234005,24808405,5719875,28483275,2841751 ) + ), + new GroupElementPreComp( + new FieldElement( -16420968,-1113305,-327719,-12107856,21886282,-15552774,-1887966,-315658,19932058,-12739203 ), + new FieldElement( -11656086,10087521,-8864888,-5536143,-19278573,-3055912,3999228,13239134,-4777469,-13910208 ), + new FieldElement( 1382174,-11694719,17266790,9194690,-13324356,9720081,20403944,11284705,-14013818,3093230 ) + ), + new GroupElementPreComp( + new FieldElement( 16650921,-11037932,-1064178,1570629,-8329746,7352753,-302424,16271225,-24049421,-6691850 ), + new FieldElement( -21911077,-5927941,-4611316,-5560156,-31744103,-10785293,24123614,15193618,-21652117,-16739389 ), + new FieldElement( -9935934,-4289447,-25279823,4372842,2087473,10399484,31870908,14690798,17361620,11864968 ) + ), + new GroupElementPreComp( + new FieldElement( -11307610,6210372,13206574,5806320,-29017692,-13967200,-12331205,-7486601,-25578460,-16240689 ), + new FieldElement( 14668462,-12270235,26039039,15305210,25515617,4542480,10453892,6577524,9145645,-6443880 ), + new FieldElement( 5974874,3053895,-9433049,-10385191,-31865124,3225009,-7972642,3936128,-5652273,-3050304 ) + ), + new GroupElementPreComp( + new FieldElement( 30625386,-4729400,-25555961,-12792866,-20484575,7695099,17097188,-16303496,-27999779,1803632 ), + new FieldElement( -3553091,9865099,-5228566,4272701,-5673832,-16689700,14911344,12196514,-21405489,7047412 ), + new FieldElement( 20093277,9920966,-11138194,-5343857,13161587,12044805,-32856851,4124601,-32343828,-10257566 ) + ), + new GroupElementPreComp( + new FieldElement( -20788824,14084654,-13531713,7842147,19119038,-13822605,4752377,-8714640,-21679658,2288038 ), + new FieldElement( -26819236,-3283715,29965059,3039786,-14473765,2540457,29457502,14625692,-24819617,12570232 ), + new FieldElement( -1063558,-11551823,16920318,12494842,1278292,-5869109,-21159943,-3498680,-11974704,4724943 ) + ), + new GroupElementPreComp( + new FieldElement( 17960970,-11775534,-4140968,-9702530,-8876562,-1410617,-12907383,-8659932,-29576300,1903856 ), + new FieldElement( 23134274,-14279132,-10681997,-1611936,20684485,15770816,-12989750,3190296,26955097,14109738 ), + new FieldElement( 15308788,5320727,-30113809,-14318877,22902008,7767164,29425325,-11277562,31960942,11934971 ) + ), + new GroupElementPreComp( + new FieldElement( -27395711,8435796,4109644,12222639,-24627868,14818669,20638173,4875028,10491392,1379718 ), + new FieldElement( -13159415,9197841,3875503,-8936108,-1383712,-5879801,33518459,16176658,21432314,12180697 ), + new FieldElement( -11787308,11500838,13787581,-13832590,-22430679,10140205,1465425,12689540,-10301319,-13872883 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 5414091,-15386041,-21007664,9643570,12834970,1186149,-2622916,-1342231,26128231,6032912 ), + new FieldElement( -26337395,-13766162,32496025,-13653919,17847801,-12669156,3604025,8316894,-25875034,-10437358 ), + new FieldElement( 3296484,6223048,24680646,-12246460,-23052020,5903205,-8862297,-4639164,12376617,3188849 ) + ), + new GroupElementPreComp( + new FieldElement( 29190488,-14659046,27549113,-1183516,3520066,-10697301,32049515,-7309113,-16109234,-9852307 ), + new FieldElement( -14744486,-9309156,735818,-598978,-20407687,-5057904,25246078,-15795669,18640741,-960977 ), + new FieldElement( -6928835,-16430795,10361374,5642961,4910474,12345252,-31638386,-494430,10530747,1053335 ) + ), + new GroupElementPreComp( + new FieldElement( -29265967,-14186805,-13538216,-12117373,-19457059,-10655384,-31462369,-2948985,24018831,15026644 ), + new FieldElement( -22592535,-3145277,-2289276,5953843,-13440189,9425631,25310643,13003497,-2314791,-15145616 ), + new FieldElement( -27419985,-603321,-8043984,-1669117,-26092265,13987819,-27297622,187899,-23166419,-2531735 ) + ), + new GroupElementPreComp( + new FieldElement( -21744398,-13810475,1844840,5021428,-10434399,-15911473,9716667,16266922,-5070217,726099 ), + new FieldElement( 29370922,-6053998,7334071,-15342259,9385287,2247707,-13661962,-4839461,30007388,-15823341 ), + new FieldElement( -936379,16086691,23751945,-543318,-1167538,-5189036,9137109,730663,9835848,4555336 ) + ), + new GroupElementPreComp( + new FieldElement( -23376435,1410446,-22253753,-12899614,30867635,15826977,17693930,544696,-11985298,12422646 ), + new FieldElement( 31117226,-12215734,-13502838,6561947,-9876867,-12757670,-5118685,-4096706,29120153,13924425 ), + new FieldElement( -17400879,-14233209,19675799,-2734756,-11006962,-5858820,-9383939,-11317700,7240931,-237388 ) + ), + new GroupElementPreComp( + new FieldElement( -31361739,-11346780,-15007447,-5856218,-22453340,-12152771,1222336,4389483,3293637,-15551743 ), + new FieldElement( -16684801,-14444245,11038544,11054958,-13801175,-3338533,-24319580,7733547,12796905,-6335822 ), + new FieldElement( -8759414,-10817836,-25418864,10783769,-30615557,-9746811,-28253339,3647836,3222231,-11160462 ) + ), + new GroupElementPreComp( + new FieldElement( 18606113,1693100,-25448386,-15170272,4112353,10045021,23603893,-2048234,-7550776,2484985 ), + new FieldElement( 9255317,-3131197,-12156162,-1004256,13098013,-9214866,16377220,-2102812,-19802075,-3034702 ), + new FieldElement( -22729289,7496160,-5742199,11329249,19991973,-3347502,-31718148,9936966,-30097688,-10618797 ) + ), + new GroupElementPreComp( + new FieldElement( 21878590,-5001297,4338336,13643897,-3036865,13160960,19708896,5415497,-7360503,-4109293 ), + new FieldElement( 27736861,10103576,12500508,8502413,-3413016,-9633558,10436918,-1550276,-23659143,-8132100 ), + new FieldElement( 19492550,-12104365,-29681976,-852630,-3208171,12403437,30066266,8367329,13243957,8709688 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 12015105,2801261,28198131,10151021,24818120,-4743133,-11194191,-5645734,5150968,7274186 ), + new FieldElement( 2831366,-12492146,1478975,6122054,23825128,-12733586,31097299,6083058,31021603,-9793610 ), + new FieldElement( -2529932,-2229646,445613,10720828,-13849527,-11505937,-23507731,16354465,15067285,-14147707 ) + ), + new GroupElementPreComp( + new FieldElement( 7840942,14037873,-33364863,15934016,-728213,-3642706,21403988,1057586,-19379462,-12403220 ), + new FieldElement( 915865,-16469274,15608285,-8789130,-24357026,6060030,-17371319,8410997,-7220461,16527025 ), + new FieldElement( 32922597,-556987,20336074,-16184568,10903705,-5384487,16957574,52992,23834301,6588044 ) + ), + new GroupElementPreComp( + new FieldElement( 32752030,11232950,3381995,-8714866,22652988,-10744103,17159699,16689107,-20314580,-1305992 ), + new FieldElement( -4689649,9166776,-25710296,-10847306,11576752,12733943,7924251,-2752281,1976123,-7249027 ), + new FieldElement( 21251222,16309901,-2983015,-6783122,30810597,12967303,156041,-3371252,12331345,-8237197 ) + ), + new GroupElementPreComp( + new FieldElement( 8651614,-4477032,-16085636,-4996994,13002507,2950805,29054427,-5106970,10008136,-4667901 ), + new FieldElement( 31486080,15114593,-14261250,12951354,14369431,-7387845,16347321,-13662089,8684155,-10532952 ), + new FieldElement( 19443825,11385320,24468943,-9659068,-23919258,2187569,-26263207,-6086921,31316348,14219878 ) + ), + new GroupElementPreComp( + new FieldElement( -28594490,1193785,32245219,11392485,31092169,15722801,27146014,6992409,29126555,9207390 ), + new FieldElement( 32382935,1110093,18477781,11028262,-27411763,-7548111,-4980517,10843782,-7957600,-14435730 ), + new FieldElement( 2814918,7836403,27519878,-7868156,-20894015,-11553689,-21494559,8550130,28346258,1994730 ) + ), + new GroupElementPreComp( + new FieldElement( -19578299,8085545,-14000519,-3948622,2785838,-16231307,-19516951,7174894,22628102,8115180 ), + new FieldElement( -30405132,955511,-11133838,-15078069,-32447087,-13278079,-25651578,3317160,-9943017,930272 ), + new FieldElement( -15303681,-6833769,28856490,1357446,23421993,1057177,24091212,-1388970,-22765376,-10650715 ) + ), + new GroupElementPreComp( + new FieldElement( -22751231,-5303997,-12907607,-12768866,-15811511,-7797053,-14839018,-16554220,-1867018,8398970 ), + new FieldElement( -31969310,2106403,-4736360,1362501,12813763,16200670,22981545,-6291273,18009408,-15772772 ), + new FieldElement( -17220923,-9545221,-27784654,14166835,29815394,7444469,29551787,-3727419,19288549,1325865 ) + ), + new GroupElementPreComp( + new FieldElement( 15100157,-15835752,-23923978,-1005098,-26450192,15509408,12376730,-3479146,33166107,-8042750 ), + new FieldElement( 20909231,13023121,-9209752,16251778,-5778415,-8094914,12412151,10018715,2213263,-13878373 ), + new FieldElement( 32529814,-11074689,30361439,-16689753,-9135940,1513226,22922121,6382134,-5766928,8371348 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 9923462,11271500,12616794,3544722,-29998368,-1721626,12891687,-8193132,-26442943,10486144 ), + new FieldElement( -22597207,-7012665,8587003,-8257861,4084309,-12970062,361726,2610596,-23921530,-11455195 ), + new FieldElement( 5408411,-1136691,-4969122,10561668,24145918,14240566,31319731,-4235541,19985175,-3436086 ) + ), + new GroupElementPreComp( + new FieldElement( -13994457,16616821,14549246,3341099,32155958,13648976,-17577068,8849297,65030,8370684 ), + new FieldElement( -8320926,-12049626,31204563,5839400,-20627288,-1057277,-19442942,6922164,12743482,-9800518 ), + new FieldElement( -2361371,12678785,28815050,4759974,-23893047,4884717,23783145,11038569,18800704,255233 ) + ), + new GroupElementPreComp( + new FieldElement( -5269658,-1773886,13957886,7990715,23132995,728773,13393847,9066957,19258688,-14753793 ), + new FieldElement( -2936654,-10827535,-10432089,14516793,-3640786,4372541,-31934921,2209390,-1524053,2055794 ), + new FieldElement( 580882,16705327,5468415,-2683018,-30926419,-14696000,-7203346,-8994389,-30021019,7394435 ) + ), + new GroupElementPreComp( + new FieldElement( 23838809,1822728,-15738443,15242727,8318092,-3733104,-21672180,-3492205,-4821741,14799921 ), + new FieldElement( 13345610,9759151,3371034,-16137791,16353039,8577942,31129804,13496856,-9056018,7402518 ), + new FieldElement( 2286874,-4435931,-20042458,-2008336,-13696227,5038122,11006906,-15760352,8205061,1607563 ) + ), + new GroupElementPreComp( + new FieldElement( 14414086,-8002132,3331830,-3208217,22249151,-5594188,18364661,-2906958,30019587,-9029278 ), + new FieldElement( -27688051,1585953,-10775053,931069,-29120221,-11002319,-14410829,12029093,9944378,8024 ), + new FieldElement( 4368715,-3709630,29874200,-15022983,-20230386,-11410704,-16114594,-999085,-8142388,5640030 ) + ), + new GroupElementPreComp( + new FieldElement( 10299610,13746483,11661824,16234854,7630238,5998374,9809887,-16694564,15219798,-14327783 ), + new FieldElement( 27425505,-5719081,3055006,10660664,23458024,595578,-15398605,-1173195,-18342183,9742717 ), + new FieldElement( 6744077,2427284,26042789,2720740,-847906,1118974,32324614,7406442,12420155,1994844 ) + ), + new GroupElementPreComp( + new FieldElement( 14012521,-5024720,-18384453,-9578469,-26485342,-3936439,-13033478,-10909803,24319929,-6446333 ), + new FieldElement( 16412690,-4507367,10772641,15929391,-17068788,-4658621,10555945,-10484049,-30102368,-4739048 ), + new FieldElement( 22397382,-7767684,-9293161,-12792868,17166287,-9755136,-27333065,6199366,21880021,-12250760 ) + ), + new GroupElementPreComp( + new FieldElement( -4283307,5368523,-31117018,8163389,-30323063,3209128,16557151,8890729,8840445,4957760 ), + new FieldElement( -15447727,709327,-6919446,-10870178,-29777922,6522332,-21720181,12130072,-14796503,5005757 ), + new FieldElement( -2114751,-14308128,23019042,15765735,-25269683,6002752,10183197,-13239326,-16395286,-2176112 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -19025756,1632005,13466291,-7995100,-23640451,16573537,-32013908,-3057104,22208662,2000468 ), + new FieldElement( 3065073,-1412761,-25598674,-361432,-17683065,-5703415,-8164212,11248527,-3691214,-7414184 ), + new FieldElement( 10379208,-6045554,8877319,1473647,-29291284,-12507580,16690915,2553332,-3132688,16400289 ) + ), + new GroupElementPreComp( + new FieldElement( 15716668,1254266,-18472690,7446274,-8448918,6344164,-22097271,-7285580,26894937,9132066 ), + new FieldElement( 24158887,12938817,11085297,-8177598,-28063478,-4457083,-30576463,64452,-6817084,-2692882 ), + new FieldElement( 13488534,7794716,22236231,5989356,25426474,-12578208,2350710,-3418511,-4688006,2364226 ) + ), + new GroupElementPreComp( + new FieldElement( 16335052,9132434,25640582,6678888,1725628,8517937,-11807024,-11697457,15445875,-7798101 ), + new FieldElement( 29004207,-7867081,28661402,-640412,-12794003,-7943086,31863255,-4135540,-278050,-15759279 ), + new FieldElement( -6122061,-14866665,-28614905,14569919,-10857999,-3591829,10343412,-6976290,-29828287,-10815811 ) + ), + new GroupElementPreComp( + new FieldElement( 27081650,3463984,14099042,-4517604,1616303,-6205604,29542636,15372179,17293797,960709 ), + new FieldElement( 20263915,11434237,-5765435,11236810,13505955,-10857102,-16111345,6493122,-19384511,7639714 ), + new FieldElement( -2830798,-14839232,25403038,-8215196,-8317012,-16173699,18006287,-16043750,29994677,-15808121 ) + ), + new GroupElementPreComp( + new FieldElement( 9769828,5202651,-24157398,-13631392,-28051003,-11561624,-24613141,-13860782,-31184575,709464 ), + new FieldElement( 12286395,13076066,-21775189,-1176622,-25003198,4057652,-32018128,-8890874,16102007,13205847 ), + new FieldElement( 13733362,5599946,10557076,3195751,-5557991,8536970,-25540170,8525972,10151379,10394400 ) + ), + new GroupElementPreComp( + new FieldElement( 4024660,-16137551,22436262,12276534,-9099015,-2686099,19698229,11743039,-33302334,8934414 ), + new FieldElement( -15879800,-4525240,-8580747,-2934061,14634845,-698278,-9449077,3137094,-11536886,11721158 ), + new FieldElement( 17555939,-5013938,8268606,2331751,-22738815,9761013,9319229,8835153,-9205489,-1280045 ) + ), + new GroupElementPreComp( + new FieldElement( -461409,-7830014,20614118,16688288,-7514766,-4807119,22300304,505429,6108462,-6183415 ), + new FieldElement( -5070281,12367917,-30663534,3234473,32617080,-8422642,29880583,-13483331,-26898490,-7867459 ), + new FieldElement( -31975283,5726539,26934134,10237677,-3173717,-605053,24199304,3795095,7592688,-14992079 ) + ), + new GroupElementPreComp( + new FieldElement( 21594432,-14964228,17466408,-4077222,32537084,2739898,6407723,12018833,-28256052,4298412 ), + new FieldElement( -20650503,-11961496,-27236275,570498,3767144,-1717540,13891942,-1569194,13717174,10805743 ), + new FieldElement( -14676630,-15644296,15287174,11927123,24177847,-8175568,-796431,14860609,-26938930,-5863836 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 12962541,5311799,-10060768,11658280,18855286,-7954201,13286263,-12808704,-4381056,9882022 ), + new FieldElement( 18512079,11319350,-20123124,15090309,18818594,5271736,-22727904,3666879,-23967430,-3299429 ), + new FieldElement( -6789020,-3146043,16192429,13241070,15898607,-14206114,-10084880,-6661110,-2403099,5276065 ) + ), + new GroupElementPreComp( + new FieldElement( 30169808,-5317648,26306206,-11750859,27814964,7069267,7152851,3684982,1449224,13082861 ), + new FieldElement( 10342826,3098505,2119311,193222,25702612,12233820,23697382,15056736,-21016438,-8202000 ), + new FieldElement( -33150110,3261608,22745853,7948688,19370557,-15177665,-26171976,6482814,-10300080,-11060101 ) + ), + new GroupElementPreComp( + new FieldElement( 32869458,-5408545,25609743,15678670,-10687769,-15471071,26112421,2521008,-22664288,6904815 ), + new FieldElement( 29506923,4457497,3377935,-9796444,-30510046,12935080,1561737,3841096,-29003639,-6657642 ), + new FieldElement( 10340844,-6630377,-18656632,-2278430,12621151,-13339055,30878497,-11824370,-25584551,5181966 ) + ), + new GroupElementPreComp( + new FieldElement( 25940115,-12658025,17324188,-10307374,-8671468,15029094,24396252,-16450922,-2322852,-12388574 ), + new FieldElement( -21765684,9916823,-1300409,4079498,-1028346,11909559,1782390,12641087,20603771,-6561742 ), + new FieldElement( -18882287,-11673380,24849422,11501709,13161720,-4768874,1925523,11914390,4662781,7820689 ) + ), + new GroupElementPreComp( + new FieldElement( 12241050,-425982,8132691,9393934,32846760,-1599620,29749456,12172924,16136752,15264020 ), + new FieldElement( -10349955,-14680563,-8211979,2330220,-17662549,-14545780,10658213,6671822,19012087,3772772 ), + new FieldElement( 3753511,-3421066,10617074,2028709,14841030,-6721664,28718732,-15762884,20527771,12988982 ) + ), + new GroupElementPreComp( + new FieldElement( -14822485,-5797269,-3707987,12689773,-898983,-10914866,-24183046,-10564943,3299665,-12424953 ), + new FieldElement( -16777703,-15253301,-9642417,4978983,3308785,8755439,6943197,6461331,-25583147,8991218 ), + new FieldElement( -17226263,1816362,-1673288,-6086439,31783888,-8175991,-32948145,7417950,-30242287,1507265 ) + ), + new GroupElementPreComp( + new FieldElement( 29692663,6829891,-10498800,4334896,20945975,-11906496,-28887608,8209391,14606362,-10647073 ), + new FieldElement( -3481570,8707081,32188102,5672294,22096700,1711240,-33020695,9761487,4170404,-2085325 ), + new FieldElement( -11587470,14855945,-4127778,-1531857,-26649089,15084046,22186522,16002000,-14276837,-8400798 ) + ), + new GroupElementPreComp( + new FieldElement( -4811456,13761029,-31703877,-2483919,-3312471,7869047,-7113572,-9620092,13240845,10965870 ), + new FieldElement( -7742563,-8256762,-14768334,-13656260,-23232383,12387166,4498947,14147411,29514390,4302863 ), + new FieldElement( -13413405,-12407859,20757302,-13801832,14785143,8976368,-5061276,-2144373,17846988,-13971927 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -2244452,-754728,-4597030,-1066309,-6247172,1455299,-21647728,-9214789,-5222701,12650267 ), + new FieldElement( -9906797,-16070310,21134160,12198166,-27064575,708126,387813,13770293,-19134326,10958663 ), + new FieldElement( 22470984,12369526,23446014,-5441109,-21520802,-9698723,-11772496,-11574455,-25083830,4271862 ) + ), + new GroupElementPreComp( + new FieldElement( -25169565,-10053642,-19909332,15361595,-5984358,2159192,75375,-4278529,-32526221,8469673 ), + new FieldElement( 15854970,4148314,-8893890,7259002,11666551,13824734,-30531198,2697372,24154791,-9460943 ), + new FieldElement( 15446137,-15806644,29759747,14019369,30811221,-9610191,-31582008,12840104,24913809,9815020 ) + ), + new GroupElementPreComp( + new FieldElement( -4709286,-5614269,-31841498,-12288893,-14443537,10799414,-9103676,13438769,18735128,9466238 ), + new FieldElement( 11933045,9281483,5081055,-5183824,-2628162,-4905629,-7727821,-10896103,-22728655,16199064 ), + new FieldElement( 14576810,379472,-26786533,-8317236,-29426508,-10812974,-102766,1876699,30801119,2164795 ) + ), + new GroupElementPreComp( + new FieldElement( 15995086,3199873,13672555,13712240,-19378835,-4647646,-13081610,-15496269,-13492807,1268052 ), + new FieldElement( -10290614,-3659039,-3286592,10948818,23037027,3794475,-3470338,-12600221,-17055369,3565904 ), + new FieldElement( 29210088,-9419337,-5919792,-4952785,10834811,-13327726,-16512102,-10820713,-27162222,-14030531 ) + ), + new GroupElementPreComp( + new FieldElement( -13161890,15508588,16663704,-8156150,-28349942,9019123,-29183421,-3769423,2244111,-14001979 ), + new FieldElement( -5152875,-3800936,-9306475,-6071583,16243069,14684434,-25673088,-16180800,13491506,4641841 ), + new FieldElement( 10813417,643330,-19188515,-728916,30292062,-16600078,27548447,-7721242,14476989,-12767431 ) + ), + new GroupElementPreComp( + new FieldElement( 10292079,9984945,6481436,8279905,-7251514,7032743,27282937,-1644259,-27912810,12651324 ), + new FieldElement( -31185513,-813383,22271204,11835308,10201545,15351028,17099662,3988035,21721536,-3148940 ), + new FieldElement( 10202177,-6545839,-31373232,-9574638,-32150642,-8119683,-12906320,3852694,13216206,14842320 ) + ), + new GroupElementPreComp( + new FieldElement( -15815640,-10601066,-6538952,-7258995,-6984659,-6581778,-31500847,13765824,-27434397,9900184 ), + new FieldElement( 14465505,-13833331,-32133984,-14738873,-27443187,12990492,33046193,15796406,-7051866,-8040114 ), + new FieldElement( 30924417,-8279620,6359016,-12816335,16508377,9071735,-25488601,15413635,9524356,-7018878 ) + ), + new GroupElementPreComp( + new FieldElement( 12274201,-13175547,32627641,-1785326,6736625,13267305,5237659,-5109483,15663516,4035784 ), + new FieldElement( -2951309,8903985,17349946,601635,-16432815,-4612556,-13732739,-15889334,-22258478,4659091 ), + new FieldElement( -16916263,-4952973,-30393711,-15158821,20774812,15897498,5736189,15026997,-2178256,-13455585 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -8858980,-2219056,28571666,-10155518,-474467,-10105698,-3801496,278095,23440562,-290208 ), + new FieldElement( 10226241,-5928702,15139956,120818,-14867693,5218603,32937275,11551483,-16571960,-7442864 ), + new FieldElement( 17932739,-12437276,-24039557,10749060,11316803,7535897,22503767,5561594,-3646624,3898661 ) + ), + new GroupElementPreComp( + new FieldElement( 7749907,-969567,-16339731,-16464,-25018111,15122143,-1573531,7152530,21831162,1245233 ), + new FieldElement( 26958459,-14658026,4314586,8346991,-5677764,11960072,-32589295,-620035,-30402091,-16716212 ), + new FieldElement( -12165896,9166947,33491384,13673479,29787085,13096535,6280834,14587357,-22338025,13987525 ) + ), + new GroupElementPreComp( + new FieldElement( -24349909,7778775,21116000,15572597,-4833266,-5357778,-4300898,-5124639,-7469781,-2858068 ), + new FieldElement( 9681908,-6737123,-31951644,13591838,-6883821,386950,31622781,6439245,-14581012,4091397 ), + new FieldElement( -8426427,1470727,-28109679,-1596990,3978627,-5123623,-19622683,12092163,29077877,-14741988 ) + ), + new GroupElementPreComp( + new FieldElement( 5269168,-6859726,-13230211,-8020715,25932563,1763552,-5606110,-5505881,-20017847,2357889 ), + new FieldElement( 32264008,-15407652,-5387735,-1160093,-2091322,-3946900,23104804,-12869908,5727338,189038 ), + new FieldElement( 14609123,-8954470,-6000566,-16622781,-14577387,-7743898,-26745169,10942115,-25888931,-14884697 ) + ), + new GroupElementPreComp( + new FieldElement( 20513500,5557931,-15604613,7829531,26413943,-2019404,-21378968,7471781,13913677,-5137875 ), + new FieldElement( -25574376,11967826,29233242,12948236,-6754465,4713227,-8940970,14059180,12878652,8511905 ), + new FieldElement( -25656801,3393631,-2955415,-7075526,-2250709,9366908,-30223418,6812974,5568676,-3127656 ) + ), + new GroupElementPreComp( + new FieldElement( 11630004,12144454,2116339,13606037,27378885,15676917,-17408753,-13504373,-14395196,8070818 ), + new FieldElement( 27117696,-10007378,-31282771,-5570088,1127282,12772488,-29845906,10483306,-11552749,-1028714 ), + new FieldElement( 10637467,-5688064,5674781,1072708,-26343588,-6982302,-1683975,9177853,-27493162,15431203 ) + ), + new GroupElementPreComp( + new FieldElement( 20525145,10892566,-12742472,12779443,-29493034,16150075,-28240519,14943142,-15056790,-7935931 ), + new FieldElement( -30024462,5626926,-551567,-9981087,753598,11981191,25244767,-3239766,-3356550,9594024 ), + new FieldElement( -23752644,2636870,-5163910,-10103818,585134,7877383,11345683,-6492290,13352335,-10977084 ) + ), + new GroupElementPreComp( + new FieldElement( -1931799,-5407458,3304649,-12884869,17015806,-4877091,-29783850,-7752482,-13215537,-319204 ), + new FieldElement( 20239939,6607058,6203985,3483793,-18386976,-779229,-20723742,15077870,-22750759,14523817 ), + new FieldElement( 27406042,-6041657,27423596,-4497394,4996214,10002360,-28842031,-4545494,-30172742,-4805667 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 11374242,12660715,17861383,-12540833,10935568,1099227,-13886076,-9091740,-27727044,11358504 ), + new FieldElement( -12730809,10311867,1510375,10778093,-2119455,-9145702,32676003,11149336,-26123651,4985768 ), + new FieldElement( -19096303,341147,-6197485,-239033,15756973,-8796662,-983043,13794114,-19414307,-15621255 ) + ), + new GroupElementPreComp( + new FieldElement( 6490081,11940286,25495923,-7726360,8668373,-8751316,3367603,6970005,-1691065,-9004790 ), + new FieldElement( 1656497,13457317,15370807,6364910,13605745,8362338,-19174622,-5475723,-16796596,-5031438 ), + new FieldElement( -22273315,-13524424,-64685,-4334223,-18605636,-10921968,-20571065,-7007978,-99853,-10237333 ) + ), + new GroupElementPreComp( + new FieldElement( 17747465,10039260,19368299,-4050591,-20630635,-16041286,31992683,-15857976,-29260363,-5511971 ), + new FieldElement( 31932027,-4986141,-19612382,16366580,22023614,88450,11371999,-3744247,4882242,-10626905 ), + new FieldElement( 29796507,37186,19818052,10115756,-11829032,3352736,18551198,3272828,-5190932,-4162409 ) + ), + new GroupElementPreComp( + new FieldElement( 12501286,4044383,-8612957,-13392385,-32430052,5136599,-19230378,-3529697,330070,-3659409 ), + new FieldElement( 6384877,2899513,17807477,7663917,-2358888,12363165,25366522,-8573892,-271295,12071499 ), + new FieldElement( -8365515,-4042521,25133448,-4517355,-6211027,2265927,-32769618,1936675,-5159697,3829363 ) + ), + new GroupElementPreComp( + new FieldElement( 28425966,-5835433,-577090,-4697198,-14217555,6870930,7921550,-6567787,26333140,14267664 ), + new FieldElement( -11067219,11871231,27385719,-10559544,-4585914,-11189312,10004786,-8709488,-21761224,8930324 ), + new FieldElement( -21197785,-16396035,25654216,-1725397,12282012,11008919,1541940,4757911,-26491501,-16408940 ) + ), + new GroupElementPreComp( + new FieldElement( 13537262,-7759490,-20604840,10961927,-5922820,-13218065,-13156584,6217254,-15943699,13814990 ), + new FieldElement( -17422573,15157790,18705543,29619,24409717,-260476,27361681,9257833,-1956526,-1776914 ), + new FieldElement( -25045300,-10191966,15366585,15166509,-13105086,8423556,-29171540,12361135,-18685978,4578290 ) + ), + new GroupElementPreComp( + new FieldElement( 24579768,3711570,1342322,-11180126,-27005135,14124956,-22544529,14074919,21964432,8235257 ), + new FieldElement( -6528613,-2411497,9442966,-5925588,12025640,-1487420,-2981514,-1669206,13006806,2355433 ), + new FieldElement( -16304899,-13605259,-6632427,-5142349,16974359,-10911083,27202044,1719366,1141648,-12796236 ) + ), + new GroupElementPreComp( + new FieldElement( -12863944,-13219986,-8318266,-11018091,-6810145,-4843894,13475066,-3133972,32674895,13715045 ), + new FieldElement( 11423335,-5468059,32344216,8962751,24989809,9241752,-13265253,16086212,-28740881,-15642093 ), + new FieldElement( -1409668,12530728,-6368726,10847387,19531186,-14132160,-11709148,7791794,-27245943,4383347 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -28970898,5271447,-1266009,-9736989,-12455236,16732599,-4862407,-4906449,27193557,6245191 ), + new FieldElement( -15193956,5362278,-1783893,2695834,4960227,12840725,23061898,3260492,22510453,8577507 ), + new FieldElement( -12632451,11257346,-32692994,13548177,-721004,10879011,31168030,13952092,-29571492,-3635906 ) + ), + new GroupElementPreComp( + new FieldElement( 3877321,-9572739,32416692,5405324,-11004407,-13656635,3759769,11935320,5611860,8164018 ), + new FieldElement( -16275802,14667797,15906460,12155291,-22111149,-9039718,32003002,-8832289,5773085,-8422109 ), + new FieldElement( -23788118,-8254300,1950875,8937633,18686727,16459170,-905725,12376320,31632953,190926 ) + ), + new GroupElementPreComp( + new FieldElement( -24593607,-16138885,-8423991,13378746,14162407,6901328,-8288749,4508564,-25341555,-3627528 ), + new FieldElement( 8884438,-5884009,6023974,10104341,-6881569,-4941533,18722941,-14786005,-1672488,827625 ), + new FieldElement( -32720583,-16289296,-32503547,7101210,13354605,2659080,-1800575,-14108036,-24878478,1541286 ) + ), + new GroupElementPreComp( + new FieldElement( 2901347,-1117687,3880376,-10059388,-17620940,-3612781,-21802117,-3567481,20456845,-1885033 ), + new FieldElement( 27019610,12299467,-13658288,-1603234,-12861660,-4861471,-19540150,-5016058,29439641,15138866 ), + new FieldElement( 21536104,-6626420,-32447818,-10690208,-22408077,5175814,-5420040,-16361163,7779328,109896 ) + ), + new GroupElementPreComp( + new FieldElement( 30279744,14648750,-8044871,6425558,13639621,-743509,28698390,12180118,23177719,-554075 ), + new FieldElement( 26572847,3405927,-31701700,12890905,-19265668,5335866,-6493768,2378492,4439158,-13279347 ), + new FieldElement( -22716706,3489070,-9225266,-332753,18875722,-1140095,14819434,-12731527,-17717757,-5461437 ) + ), + new GroupElementPreComp( + new FieldElement( -5056483,16566551,15953661,3767752,-10436499,15627060,-820954,2177225,8550082,-15114165 ), + new FieldElement( -18473302,16596775,-381660,15663611,22860960,15585581,-27844109,-3582739,-23260460,-8428588 ), + new FieldElement( -32480551,15707275,-8205912,-5652081,29464558,2713815,-22725137,15860482,-21902570,1494193 ) + ), + new GroupElementPreComp( + new FieldElement( -19562091,-14087393,-25583872,-9299552,13127842,759709,21923482,16529112,8742704,12967017 ), + new FieldElement( -28464899,1553205,32536856,-10473729,-24691605,-406174,-8914625,-2933896,-29903758,15553883 ), + new FieldElement( 21877909,3230008,9881174,10539357,-4797115,2841332,11543572,14513274,19375923,-12647961 ) + ), + new GroupElementPreComp( + new FieldElement( 8832269,-14495485,13253511,5137575,5037871,4078777,24880818,-6222716,2862653,9455043 ), + new FieldElement( 29306751,5123106,20245049,-14149889,9592566,8447059,-2077124,-2990080,15511449,4789663 ), + new FieldElement( -20679756,7004547,8824831,-9434977,-4045704,-3750736,-5754762,108893,23513200,16652362 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -33256173,4144782,-4476029,-6579123,10770039,-7155542,-6650416,-12936300,-18319198,10212860 ), + new FieldElement( 2756081,8598110,7383731,-6859892,22312759,-1105012,21179801,2600940,-9988298,-12506466 ), + new FieldElement( -24645692,13317462,-30449259,-15653928,21365574,-10869657,11344424,864440,-2499677,-16710063 ) + ), + new GroupElementPreComp( + new FieldElement( -26432803,6148329,-17184412,-14474154,18782929,-275997,-22561534,211300,2719757,4940997 ), + new FieldElement( -1323882,3911313,-6948744,14759765,-30027150,7851207,21690126,8518463,26699843,5276295 ), + new FieldElement( -13149873,-6429067,9396249,365013,24703301,-10488939,1321586,149635,-15452774,7159369 ) + ), + new GroupElementPreComp( + new FieldElement( 9987780,-3404759,17507962,9505530,9731535,-2165514,22356009,8312176,22477218,-8403385 ), + new FieldElement( 18155857,-16504990,19744716,9006923,15154154,-10538976,24256460,-4864995,-22548173,9334109 ), + new FieldElement( 2986088,-4911893,10776628,-3473844,10620590,-7083203,-21413845,14253545,-22587149,536906 ) + ), + new GroupElementPreComp( + new FieldElement( 4377756,8115836,24567078,15495314,11625074,13064599,7390551,10589625,10838060,-15420424 ), + new FieldElement( -19342404,867880,9277171,-3218459,-14431572,-1986443,19295826,-15796950,6378260,699185 ), + new FieldElement( 7895026,4057113,-7081772,-13077756,-17886831,-323126,-716039,15693155,-5045064,-13373962 ) + ), + new GroupElementPreComp( + new FieldElement( -7737563,-5869402,-14566319,-7406919,11385654,13201616,31730678,-10962840,-3918636,-9669325 ), + new FieldElement( 10188286,-15770834,-7336361,13427543,22223443,14896287,30743455,7116568,-21786507,5427593 ), + new FieldElement( 696102,13206899,27047647,-10632082,15285305,-9853179,10798490,-4578720,19236243,12477404 ) + ), + new GroupElementPreComp( + new FieldElement( -11229439,11243796,-17054270,-8040865,-788228,-8167967,-3897669,11180504,-23169516,7733644 ), + new FieldElement( 17800790,-14036179,-27000429,-11766671,23887827,3149671,23466177,-10538171,10322027,15313801 ), + new FieldElement( 26246234,11968874,32263343,-5468728,6830755,-13323031,-15794704,-101982,-24449242,10890804 ) + ), + new GroupElementPreComp( + new FieldElement( -31365647,10271363,-12660625,-6267268,16690207,-13062544,-14982212,16484931,25180797,-5334884 ), + new FieldElement( -586574,10376444,-32586414,-11286356,19801893,10997610,2276632,9482883,316878,13820577 ), + new FieldElement( -9882808,-4510367,-2115506,16457136,-11100081,11674996,30756178,-7515054,30696930,-3712849 ) + ), + new GroupElementPreComp( + new FieldElement( 32988917,-9603412,12499366,7910787,-10617257,-11931514,-7342816,-9985397,-32349517,7392473 ), + new FieldElement( -8855661,15927861,9866406,-3649411,-2396914,-16655781,-30409476,-9134995,25112947,-2926644 ), + new FieldElement( -2504044,-436966,25621774,-5678772,15085042,-5479877,-24884878,-13526194,5537438,-13914319 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -11225584,2320285,-9584280,10149187,-33444663,5808648,-14876251,-1729667,31234590,6090599 ), + new FieldElement( -9633316,116426,26083934,2897444,-6364437,-2688086,609721,15878753,-6970405,-9034768 ), + new FieldElement( -27757857,247744,-15194774,-9002551,23288161,-10011936,-23869595,6503646,20650474,1804084 ) + ), + new GroupElementPreComp( + new FieldElement( -27589786,15456424,8972517,8469608,15640622,4439847,3121995,-10329713,27842616,-202328 ), + new FieldElement( -15306973,2839644,22530074,10026331,4602058,5048462,28248656,5031932,-11375082,12714369 ), + new FieldElement( 20807691,-7270825,29286141,11421711,-27876523,-13868230,-21227475,1035546,-19733229,12796920 ) + ), + new GroupElementPreComp( + new FieldElement( 12076899,-14301286,-8785001,-11848922,-25012791,16400684,-17591495,-12899438,3480665,-15182815 ), + new FieldElement( -32361549,5457597,28548107,7833186,7303070,-11953545,-24363064,-15921875,-33374054,2771025 ), + new FieldElement( -21389266,421932,26597266,6860826,22486084,-6737172,-17137485,-4210226,-24552282,15673397 ) + ), + new GroupElementPreComp( + new FieldElement( -20184622,2338216,19788685,-9620956,-4001265,-8740893,-20271184,4733254,3727144,-12934448 ), + new FieldElement( 6120119,814863,-11794402,-622716,6812205,-15747771,2019594,7975683,31123697,-10958981 ), + new FieldElement( 30069250,-11435332,30434654,2958439,18399564,-976289,12296869,9204260,-16432438,9648165 ) + ), + new GroupElementPreComp( + new FieldElement( 32705432,-1550977,30705658,7451065,-11805606,9631813,3305266,5248604,-26008332,-11377501 ), + new FieldElement( 17219865,2375039,-31570947,-5575615,-19459679,9219903,294711,15298639,2662509,-16297073 ), + new FieldElement( -1172927,-7558695,-4366770,-4287744,-21346413,-8434326,32087529,-1222777,32247248,-14389861 ) + ), + new GroupElementPreComp( + new FieldElement( 14312628,1221556,17395390,-8700143,-4945741,-8684635,-28197744,-9637817,-16027623,-13378845 ), + new FieldElement( -1428825,-9678990,-9235681,6549687,-7383069,-468664,23046502,9803137,17597934,2346211 ), + new FieldElement( 18510800,15337574,26171504,981392,-22241552,7827556,-23491134,-11323352,3059833,-11782870 ) + ), + new GroupElementPreComp( + new FieldElement( 10141598,6082907,17829293,-1947643,9830092,13613136,-25556636,-5544586,-33502212,3592096 ), + new FieldElement( 33114168,-15889352,-26525686,-13343397,33076705,8716171,1151462,1521897,-982665,-6837803 ), + new FieldElement( -32939165,-4255815,23947181,-324178,-33072974,-12305637,-16637686,3891704,26353178,693168 ) + ), + new GroupElementPreComp( + new FieldElement( 30374239,1595580,-16884039,13186931,4600344,406904,9585294,-400668,31375464,14369965 ), + new FieldElement( -14370654,-7772529,1510301,6434173,-18784789,-6262728,32732230,-13108839,17901441,16011505 ), + new FieldElement( 18171223,-11934626,-12500402,15197122,-11038147,-15230035,-19172240,-16046376,8764035,12309598 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 5975908,-5243188,-19459362,-9681747,-11541277,14015782,-23665757,1228319,17544096,-10593782 ), + new FieldElement( 5811932,-1715293,3442887,-2269310,-18367348,-8359541,-18044043,-15410127,-5565381,12348900 ), + new FieldElement( -31399660,11407555,25755363,6891399,-3256938,14872274,-24849353,8141295,-10632534,-585479 ) + ), + new GroupElementPreComp( + new FieldElement( -12675304,694026,-5076145,13300344,14015258,-14451394,-9698672,-11329050,30944593,1130208 ), + new FieldElement( 8247766,-6710942,-26562381,-7709309,-14401939,-14648910,4652152,2488540,23550156,-271232 ), + new FieldElement( 17294316,-3788438,7026748,15626851,22990044,113481,2267737,-5908146,-408818,-137719 ) + ), + new GroupElementPreComp( + new FieldElement( 16091085,-16253926,18599252,7340678,2137637,-1221657,-3364161,14550936,3260525,-7166271 ), + new FieldElement( -4910104,-13332887,18550887,10864893,-16459325,-7291596,-23028869,-13204905,-12748722,2701326 ), + new FieldElement( -8574695,16099415,4629974,-16340524,-20786213,-6005432,-10018363,9276971,11329923,1862132 ) + ), + new GroupElementPreComp( + new FieldElement( 14763076,-15903608,-30918270,3689867,3511892,10313526,-21951088,12219231,-9037963,-940300 ), + new FieldElement( 8894987,-3446094,6150753,3013931,301220,15693451,-31981216,-2909717,-15438168,11595570 ), + new FieldElement( 15214962,3537601,-26238722,-14058872,4418657,-15230761,13947276,10730794,-13489462,-4363670 ) + ), + new GroupElementPreComp( + new FieldElement( -2538306,7682793,32759013,263109,-29984731,-7955452,-22332124,-10188635,977108,699994 ), + new FieldElement( -12466472,4195084,-9211532,550904,-15565337,12917920,19118110,-439841,-30534533,-14337913 ), + new FieldElement( 31788461,-14507657,4799989,7372237,8808585,-14747943,9408237,-10051775,12493932,-5409317 ) + ), + new GroupElementPreComp( + new FieldElement( -25680606,5260744,-19235809,-6284470,-3695942,16566087,27218280,2607121,29375955,6024730 ), + new FieldElement( 842132,-2794693,-4763381,-8722815,26332018,-12405641,11831880,6985184,-9940361,2854096 ), + new FieldElement( -4847262,-7969331,2516242,-5847713,9695691,-7221186,16512645,960770,12121869,16648078 ) + ), + new GroupElementPreComp( + new FieldElement( -15218652,14667096,-13336229,2013717,30598287,-464137,-31504922,-7882064,20237806,2838411 ), + new FieldElement( -19288047,4453152,15298546,-16178388,22115043,-15972604,12544294,-13470457,1068881,-12499905 ), + new FieldElement( -9558883,-16518835,33238498,13506958,30505848,-1114596,-8486907,-2630053,12521378,4845654 ) + ), + new GroupElementPreComp( + new FieldElement( -28198521,10744108,-2958380,10199664,7759311,-13088600,3409348,-873400,-6482306,-12885870 ), + new FieldElement( -23561822,6230156,-20382013,10655314,-24040585,-11621172,10477734,-1240216,-3113227,13974498 ), + new FieldElement( 12966261,15550616,-32038948,-1615346,21025980,-629444,5642325,7188737,18895762,12629579 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 14741879,-14946887,22177208,-11721237,1279741,8058600,11758140,789443,32195181,3895677 ), + new FieldElement( 10758205,15755439,-4509950,9243698,-4879422,6879879,-2204575,-3566119,-8982069,4429647 ), + new FieldElement( -2453894,15725973,-20436342,-10410672,-5803908,-11040220,-7135870,-11642895,18047436,-15281743 ) + ), + new GroupElementPreComp( + new FieldElement( -25173001,-11307165,29759956,11776784,-22262383,-15820455,10993114,-12850837,-17620701,-9408468 ), + new FieldElement( 21987233,700364,-24505048,14972008,-7774265,-5718395,32155026,2581431,-29958985,8773375 ), + new FieldElement( -25568350,454463,-13211935,16126715,25240068,8594567,20656846,12017935,-7874389,-13920155 ) + ), + new GroupElementPreComp( + new FieldElement( 6028182,6263078,-31011806,-11301710,-818919,2461772,-31841174,-5468042,-1721788,-2776725 ), + new FieldElement( -12278994,16624277,987579,-5922598,32908203,1248608,7719845,-4166698,28408820,6816612 ), + new FieldElement( -10358094,-8237829,19549651,-12169222,22082623,16147817,20613181,13982702,-10339570,5067943 ) + ), + new GroupElementPreComp( + new FieldElement( -30505967,-3821767,12074681,13582412,-19877972,2443951,-19719286,12746132,5331210,-10105944 ), + new FieldElement( 30528811,3601899,-1957090,4619785,-27361822,-15436388,24180793,-12570394,27679908,-1648928 ), + new FieldElement( 9402404,-13957065,32834043,10838634,-26580150,-13237195,26653274,-8685565,22611444,-12715406 ) + ), + new GroupElementPreComp( + new FieldElement( 22190590,1118029,22736441,15130463,-30460692,-5991321,19189625,-4648942,4854859,6622139 ), + new FieldElement( -8310738,-2953450,-8262579,-3388049,-10401731,-271929,13424426,-3567227,26404409,13001963 ), + new FieldElement( -31241838,-15415700,-2994250,8939346,11562230,-12840670,-26064365,-11621720,-15405155,11020693 ) + ), + new GroupElementPreComp( + new FieldElement( 1866042,-7949489,-7898649,-10301010,12483315,13477547,3175636,-12424163,28761762,1406734 ), + new FieldElement( -448555,-1777666,13018551,3194501,-9580420,-11161737,24760585,-4347088,25577411,-13378680 ), + new FieldElement( -24290378,4759345,-690653,-1852816,2066747,10693769,-29595790,9884936,-9368926,4745410 ) + ), + new GroupElementPreComp( + new FieldElement( -9141284,6049714,-19531061,-4341411,-31260798,9944276,-15462008,-11311852,10931924,-11931931 ), + new FieldElement( -16561513,14112680,-8012645,4817318,-8040464,-11414606,-22853429,10856641,-20470770,13434654 ), + new FieldElement( 22759489,-10073434,-16766264,-1871422,13637442,-10168091,1765144,-12654326,28445307,-5364710 ) + ), + new GroupElementPreComp( + new FieldElement( 29875063,12493613,2795536,-3786330,1710620,15181182,-10195717,-8788675,9074234,1167180 ), + new FieldElement( -26205683,11014233,-9842651,-2635485,-26908120,7532294,-18716888,-9535498,3843903,9367684 ), + new FieldElement( -10969595,-6403711,9591134,9582310,11349256,108879,16235123,8601684,-139197,4242895 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 22092954,-13191123,-2042793,-11968512,32186753,-11517388,-6574341,2470660,-27417366,16625501 ), + new FieldElement( -11057722,3042016,13770083,-9257922,584236,-544855,-7770857,2602725,-27351616,14247413 ), + new FieldElement( 6314175,-10264892,-32772502,15957557,-10157730,168750,-8618807,14290061,27108877,-1180880 ) + ), + new GroupElementPreComp( + new FieldElement( -8586597,-7170966,13241782,10960156,-32991015,-13794596,33547976,-11058889,-27148451,981874 ), + new FieldElement( 22833440,9293594,-32649448,-13618667,-9136966,14756819,-22928859,-13970780,-10479804,-16197962 ), + new FieldElement( -7768587,3326786,-28111797,10783824,19178761,14905060,22680049,13906969,-15933690,3797899 ) + ), + new GroupElementPreComp( + new FieldElement( 21721356,-4212746,-12206123,9310182,-3882239,-13653110,23740224,-2709232,20491983,-8042152 ), + new FieldElement( 9209270,-15135055,-13256557,-6167798,-731016,15289673,25947805,15286587,30997318,-6703063 ), + new FieldElement( 7392032,16618386,23946583,-8039892,-13265164,-1533858,-14197445,-2321576,17649998,-250080 ) + ), + new GroupElementPreComp( + new FieldElement( -9301088,-14193827,30609526,-3049543,-25175069,-1283752,-15241566,-9525724,-2233253,7662146 ), + new FieldElement( -17558673,1763594,-33114336,15908610,-30040870,-12174295,7335080,-8472199,-3174674,3440183 ), + new FieldElement( -19889700,-5977008,-24111293,-9688870,10799743,-16571957,40450,-4431835,4862400,1133 ) + ), + new GroupElementPreComp( + new FieldElement( -32856209,-7873957,-5422389,14860950,-16319031,7956142,7258061,311861,-30594991,-7379421 ), + new FieldElement( -3773428,-1565936,28985340,7499440,24445838,9325937,29727763,16527196,18278453,15405622 ), + new FieldElement( -4381906,8508652,-19898366,-3674424,-5984453,15149970,-13313598,843523,-21875062,13626197 ) + ), + new GroupElementPreComp( + new FieldElement( 2281448,-13487055,-10915418,-2609910,1879358,16164207,-10783882,3953792,13340839,15928663 ), + new FieldElement( 31727126,-7179855,-18437503,-8283652,2875793,-16390330,-25269894,-7014826,-23452306,5964753 ), + new FieldElement( 4100420,-5959452,-17179337,6017714,-18705837,12227141,-26684835,11344144,2538215,-7570755 ) + ), + new GroupElementPreComp( + new FieldElement( -9433605,6123113,11159803,-2156608,30016280,14966241,-20474983,1485421,-629256,-15958862 ), + new FieldElement( -26804558,4260919,11851389,9658551,-32017107,16367492,-20205425,-13191288,11659922,-11115118 ), + new FieldElement( 26180396,10015009,-30844224,-8581293,5418197,9480663,2231568,-10170080,33100372,-1306171 ) + ), + new GroupElementPreComp( + new FieldElement( 15121113,-5201871,-10389905,15427821,-27509937,-15992507,21670947,4486675,-5931810,-14466380 ), + new FieldElement( 16166486,-9483733,-11104130,6023908,-31926798,-1364923,2340060,-16254968,-10735770,-10039824 ), + new FieldElement( 28042865,-3557089,-12126526,12259706,-3717498,-6945899,6766453,-8689599,18036436,5803270 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -817581,6763912,11803561,1585585,10958447,-2671165,23855391,4598332,-6159431,-14117438 ), + new FieldElement( -31031306,-14256194,17332029,-2383520,31312682,-5967183,696309,50292,-20095739,11763584 ), + new FieldElement( -594563,-2514283,-32234153,12643980,12650761,14811489,665117,-12613632,-19773211,-10713562 ) + ), + new GroupElementPreComp( + new FieldElement( 30464590,-11262872,-4127476,-12734478,19835327,-7105613,-24396175,2075773,-17020157,992471 ), + new FieldElement( 18357185,-6994433,7766382,16342475,-29324918,411174,14578841,8080033,-11574335,-10601610 ), + new FieldElement( 19598397,10334610,12555054,2555664,18821899,-10339780,21873263,16014234,26224780,16452269 ) + ), + new GroupElementPreComp( + new FieldElement( -30223925,5145196,5944548,16385966,3976735,2009897,-11377804,-7618186,-20533829,3698650 ), + new FieldElement( 14187449,3448569,-10636236,-10810935,-22663880,-3433596,7268410,-10890444,27394301,12015369 ), + new FieldElement( 19695761,16087646,28032085,12999827,6817792,11427614,20244189,-1312777,-13259127,-3402461 ) + ), + new GroupElementPreComp( + new FieldElement( 30860103,12735208,-1888245,-4699734,-16974906,2256940,-8166013,12298312,-8550524,-10393462 ), + new FieldElement( -5719826,-11245325,-1910649,15569035,26642876,-7587760,-5789354,-15118654,-4976164,12651793 ), + new FieldElement( -2848395,9953421,11531313,-5282879,26895123,-12697089,-13118820,-16517902,9768698,-2533218 ) + ), + new GroupElementPreComp( + new FieldElement( -24719459,1894651,-287698,-4704085,15348719,-8156530,32767513,12765450,4940095,10678226 ), + new FieldElement( 18860224,15980149,-18987240,-1562570,-26233012,-11071856,-7843882,13944024,-24372348,16582019 ), + new FieldElement( -15504260,4970268,-29893044,4175593,-20993212,-2199756,-11704054,15444560,-11003761,7989037 ) + ), + new GroupElementPreComp( + new FieldElement( 31490452,5568061,-2412803,2182383,-32336847,4531686,-32078269,6200206,-19686113,-14800171 ), + new FieldElement( -17308668,-15879940,-31522777,-2831,-32887382,16375549,8680158,-16371713,28550068,-6857132 ), + new FieldElement( -28126887,-5688091,16837845,-1820458,-6850681,12700016,-30039981,4364038,1155602,5988841 ) + ), + new GroupElementPreComp( + new FieldElement( 21890435,-13272907,-12624011,12154349,-7831873,15300496,23148983,-4470481,24618407,8283181 ), + new FieldElement( -33136107,-10512751,9975416,6841041,-31559793,16356536,3070187,-7025928,1466169,10740210 ), + new FieldElement( -1509399,-15488185,-13503385,-10655916,32799044,909394,-13938903,-5779719,-32164649,-15327040 ) + ), + new GroupElementPreComp( + new FieldElement( 3960823,-14267803,-28026090,-15918051,-19404858,13146868,15567327,951507,-3260321,-573935 ), + new FieldElement( 24740841,5052253,-30094131,8961361,25877428,6165135,-24368180,14397372,-7380369,-6144105 ), + new FieldElement( -28888365,3510803,-28103278,-1158478,-11238128,-10631454,-15441463,-14453128,-1625486,-6494814 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 793299,-9230478,8836302,-6235707,-27360908,-2369593,33152843,-4885251,-9906200,-621852 ), + new FieldElement( 5666233,525582,20782575,-8038419,-24538499,14657740,16099374,1468826,-6171428,-15186581 ), + new FieldElement( -4859255,-3779343,-2917758,-6748019,7778750,11688288,-30404353,-9871238,-1558923,-9863646 ) + ), + new GroupElementPreComp( + new FieldElement( 10896332,-7719704,824275,472601,-19460308,3009587,25248958,14783338,-30581476,-15757844 ), + new FieldElement( 10566929,12612572,-31944212,11118703,-12633376,12362879,21752402,8822496,24003793,14264025 ), + new FieldElement( 27713862,-7355973,-11008240,9227530,27050101,2504721,23886875,-13117525,13958495,-5732453 ) + ), + new GroupElementPreComp( + new FieldElement( -23481610,4867226,-27247128,3900521,29838369,-8212291,-31889399,-10041781,7340521,-15410068 ), + new FieldElement( 4646514,-8011124,-22766023,-11532654,23184553,8566613,31366726,-1381061,-15066784,-10375192 ), + new FieldElement( -17270517,12723032,-16993061,14878794,21619651,-6197576,27584817,3093888,-8843694,3849921 ) + ), + new GroupElementPreComp( + new FieldElement( -9064912,2103172,25561640,-15125738,-5239824,9582958,32477045,-9017955,5002294,-15550259 ), + new FieldElement( -12057553,-11177906,21115585,-13365155,8808712,-12030708,16489530,13378448,-25845716,12741426 ), + new FieldElement( -5946367,10645103,-30911586,15390284,-3286982,-7118677,24306472,15852464,28834118,-7646072 ) + ), + new GroupElementPreComp( + new FieldElement( -17335748,-9107057,-24531279,9434953,-8472084,-583362,-13090771,455841,20461858,5491305 ), + new FieldElement( 13669248,-16095482,-12481974,-10203039,-14569770,-11893198,-24995986,11293807,-28588204,-9421832 ), + new FieldElement( 28497928,6272777,-33022994,14470570,8906179,-1225630,18504674,-14165166,29867745,-8795943 ) + ), + new GroupElementPreComp( + new FieldElement( -16207023,13517196,-27799630,-13697798,24009064,-6373891,-6367600,-13175392,22853429,-4012011 ), + new FieldElement( 24191378,16712145,-13931797,15217831,14542237,1646131,18603514,-11037887,12876623,-2112447 ), + new FieldElement( 17902668,4518229,-411702,-2829247,26878217,5258055,-12860753,608397,16031844,3723494 ) + ), + new GroupElementPreComp( + new FieldElement( -28632773,12763728,-20446446,7577504,33001348,-13017745,17558842,-7872890,23896954,-4314245 ), + new FieldElement( -20005381,-12011952,31520464,605201,2543521,5991821,-2945064,7229064,-9919646,-8826859 ), + new FieldElement( 28816045,298879,-28165016,-15920938,19000928,-1665890,-12680833,-2949325,-18051778,-2082915 ) + ), + new GroupElementPreComp( + new FieldElement( 16000882,-344896,3493092,-11447198,-29504595,-13159789,12577740,16041268,-19715240,7847707 ), + new FieldElement( 10151868,10572098,27312476,7922682,14825339,4723128,-32855931,-6519018,-10020567,3852848 ), + new FieldElement( -11430470,15697596,-21121557,-4420647,5386314,15063598,16514493,-15932110,29330899,-15076224 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -25499735,-4378794,-15222908,-6901211,16615731,2051784,3303702,15490,-27548796,12314391 ), + new FieldElement( 15683520,-6003043,18109120,-9980648,15337968,-5997823,-16717435,15921866,16103996,-3731215 ), + new FieldElement( -23169824,-10781249,13588192,-1628807,-3798557,-1074929,-19273607,5402699,-29815713,-9841101 ) + ), + new GroupElementPreComp( + new FieldElement( 23190676,2384583,-32714340,3462154,-29903655,-1529132,-11266856,8911517,-25205859,2739713 ), + new FieldElement( 21374101,-3554250,-33524649,9874411,15377179,11831242,-33529904,6134907,4931255,11987849 ), + new FieldElement( -7732,-2978858,-16223486,7277597,105524,-322051,-31480539,13861388,-30076310,10117930 ) + ), + new GroupElementPreComp( + new FieldElement( -29501170,-10744872,-26163768,13051539,-25625564,5089643,-6325503,6704079,12890019,15728940 ), + new FieldElement( -21972360,-11771379,-951059,-4418840,14704840,2695116,903376,-10428139,12885167,8311031 ), + new FieldElement( -17516482,5352194,10384213,-13811658,7506451,13453191,26423267,4384730,1888765,-5435404 ) + ), + new GroupElementPreComp( + new FieldElement( -25817338,-3107312,-13494599,-3182506,30896459,-13921729,-32251644,-12707869,-19464434,-3340243 ), + new FieldElement( -23607977,-2665774,-526091,4651136,5765089,4618330,6092245,14845197,17151279,-9854116 ), + new FieldElement( -24830458,-12733720,-15165978,10367250,-29530908,-265356,22825805,-7087279,-16866484,16176525 ) + ), + new GroupElementPreComp( + new FieldElement( -23583256,6564961,20063689,3798228,-4740178,7359225,2006182,-10363426,-28746253,-10197509 ), + new FieldElement( -10626600,-4486402,-13320562,-5125317,3432136,-6393229,23632037,-1940610,32808310,1099883 ), + new FieldElement( 15030977,5768825,-27451236,-2887299,-6427378,-15361371,-15277896,-6809350,2051441,-15225865 ) + ), + new GroupElementPreComp( + new FieldElement( -3362323,-7239372,7517890,9824992,23555850,295369,5148398,-14154188,-22686354,16633660 ), + new FieldElement( 4577086,-16752288,13249841,-15304328,19958763,-14537274,18559670,-10759549,8402478,-9864273 ), + new FieldElement( -28406330,-1051581,-26790155,-907698,-17212414,-11030789,9453451,-14980072,17983010,9967138 ) + ), + new GroupElementPreComp( + new FieldElement( -25762494,6524722,26585488,9969270,24709298,1220360,-1677990,7806337,17507396,3651560 ), + new FieldElement( -10420457,-4118111,14584639,15971087,-15768321,8861010,26556809,-5574557,-18553322,-11357135 ), + new FieldElement( 2839101,14284142,4029895,3472686,14402957,12689363,-26642121,8459447,-5605463,-7621941 ) + ), + new GroupElementPreComp( + new FieldElement( -4839289,-3535444,9744961,2871048,25113978,3187018,-25110813,-849066,17258084,-7977739 ), + new FieldElement( 18164541,-10595176,-17154882,-1542417,19237078,-9745295,23357533,-15217008,26908270,12150756 ), + new FieldElement( -30264870,-7647865,5112249,-7036672,-1499807,-6974257,43168,-5537701,-32302074,16215819 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -6898905,9824394,-12304779,-4401089,-31397141,-6276835,32574489,12532905,-7503072,-8675347 ), + new FieldElement( -27343522,-16515468,-27151524,-10722951,946346,16291093,254968,7168080,21676107,-1943028 ), + new FieldElement( 21260961,-8424752,-16831886,-11920822,-23677961,3968121,-3651949,-6215466,-3556191,-7913075 ) + ), + new GroupElementPreComp( + new FieldElement( 16544754,13250366,-16804428,15546242,-4583003,12757258,-2462308,-8680336,-18907032,-9662799 ), + new FieldElement( -2415239,-15577728,18312303,4964443,-15272530,-12653564,26820651,16690659,25459437,-4564609 ), + new FieldElement( -25144690,11425020,28423002,-11020557,-6144921,-15826224,9142795,-2391602,-6432418,-1644817 ) + ), + new GroupElementPreComp( + new FieldElement( -23104652,6253476,16964147,-3768872,-25113972,-12296437,-27457225,-16344658,6335692,7249989 ), + new FieldElement( -30333227,13979675,7503222,-12368314,-11956721,-4621693,-30272269,2682242,25993170,-12478523 ), + new FieldElement( 4364628,5930691,32304656,-10044554,-8054781,15091131,22857016,-10598955,31820368,15075278 ) + ), + new GroupElementPreComp( + new FieldElement( 31879134,-8918693,17258761,90626,-8041836,-4917709,24162788,-9650886,-17970238,12833045 ), + new FieldElement( 19073683,14851414,-24403169,-11860168,7625278,11091125,-19619190,2074449,-9413939,14905377 ), + new FieldElement( 24483667,-11935567,-2518866,-11547418,-1553130,15355506,-25282080,9253129,27628530,-7555480 ) + ), + new GroupElementPreComp( + new FieldElement( 17597607,8340603,19355617,552187,26198470,-3176583,4593324,-9157582,-14110875,15297016 ), + new FieldElement( 510886,14337390,-31785257,16638632,6328095,2713355,-20217417,-11864220,8683221,2921426 ), + new FieldElement( 18606791,11874196,27155355,-5281482,-24031742,6265446,-25178240,-1278924,4674690,13890525 ) + ), + new GroupElementPreComp( + new FieldElement( 13609624,13069022,-27372361,-13055908,24360586,9592974,14977157,9835105,4389687,288396 ), + new FieldElement( 9922506,-519394,13613107,5883594,-18758345,-434263,-12304062,8317628,23388070,16052080 ), + new FieldElement( 12720016,11937594,-31970060,-5028689,26900120,8561328,-20155687,-11632979,-14754271,-10812892 ) + ), + new GroupElementPreComp( + new FieldElement( 15961858,14150409,26716931,-665832,-22794328,13603569,11829573,7467844,-28822128,929275 ), + new FieldElement( 11038231,-11582396,-27310482,-7316562,-10498527,-16307831,-23479533,-9371869,-21393143,2465074 ), + new FieldElement( 20017163,-4323226,27915242,1529148,12396362,15675764,13817261,-9658066,2463391,-4622140 ) + ), + new GroupElementPreComp( + new FieldElement( -16358878,-12663911,-12065183,4996454,-1256422,1073572,9583558,12851107,4003896,12673717 ), + new FieldElement( -1731589,-15155870,-3262930,16143082,19294135,13385325,14741514,-9103726,7903886,2348101 ), + new FieldElement( 24536016,-16515207,12715592,-3862155,1511293,10047386,-3842346,-7129159,-28377538,10048127 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -12622226,-6204820,30718825,2591312,-10617028,12192840,18873298,-7297090,-32297756,15221632 ), + new FieldElement( -26478122,-11103864,11546244,-1852483,9180880,7656409,-21343950,2095755,29769758,6593415 ), + new FieldElement( -31994208,-2907461,4176912,3264766,12538965,-868111,26312345,-6118678,30958054,8292160 ) + ), + new GroupElementPreComp( + new FieldElement( 31429822,-13959116,29173532,15632448,12174511,-2760094,32808831,3977186,26143136,-3148876 ), + new FieldElement( 22648901,1402143,-22799984,13746059,7936347,365344,-8668633,-1674433,-3758243,-2304625 ), + new FieldElement( -15491917,8012313,-2514730,-12702462,-23965846,-10254029,-1612713,-1535569,-16664475,8194478 ) + ), + new GroupElementPreComp( + new FieldElement( 27338066,-7507420,-7414224,10140405,-19026427,-6589889,27277191,8855376,28572286,3005164 ), + new FieldElement( 26287124,4821776,25476601,-4145903,-3764513,-15788984,-18008582,1182479,-26094821,-13079595 ), + new FieldElement( -7171154,3178080,23970071,6201893,-17195577,-4489192,-21876275,-13982627,32208683,-1198248 ) + ), + new GroupElementPreComp( + new FieldElement( -16657702,2817643,-10286362,14811298,6024667,13349505,-27315504,-10497842,-27672585,-11539858 ), + new FieldElement( 15941029,-9405932,-21367050,8062055,31876073,-238629,-15278393,-1444429,15397331,-4130193 ), + new FieldElement( 8934485,-13485467,-23286397,-13423241,-32446090,14047986,31170398,-1441021,-27505566,15087184 ) + ), + new GroupElementPreComp( + new FieldElement( -18357243,-2156491,24524913,-16677868,15520427,-6360776,-15502406,11461896,16788528,-5868942 ), + new FieldElement( -1947386,16013773,21750665,3714552,-17401782,-16055433,-3770287,-10323320,31322514,-11615635 ), + new FieldElement( 21426655,-5650218,-13648287,-5347537,-28812189,-4920970,-18275391,-14621414,13040862,-12112948 ) + ), + new GroupElementPreComp( + new FieldElement( 11293895,12478086,-27136401,15083750,-29307421,14748872,14555558,-13417103,1613711,4896935 ), + new FieldElement( -25894883,15323294,-8489791,-8057900,25967126,-13425460,2825960,-4897045,-23971776,-11267415 ), + new FieldElement( -15924766,-5229880,-17443532,6410664,3622847,10243618,20615400,12405433,-23753030,-8436416 ) + ), + new GroupElementPreComp( + new FieldElement( -7091295,12556208,-20191352,9025187,-17072479,4333801,4378436,2432030,23097949,-566018 ), + new FieldElement( 4565804,-16025654,20084412,-7842817,1724999,189254,24767264,10103221,-18512313,2424778 ), + new FieldElement( 366633,-11976806,8173090,-6890119,30788634,5745705,-7168678,1344109,-3642553,12412659 ) + ), + new GroupElementPreComp( + new FieldElement( -24001791,7690286,14929416,-168257,-32210835,-13412986,24162697,-15326504,-3141501,11179385 ), + new FieldElement( 18289522,-14724954,8056945,16430056,-21729724,7842514,-6001441,-1486897,-18684645,-11443503 ), + new FieldElement( 476239,6601091,-6152790,-9723375,17503545,-4863900,27672959,13403813,11052904,5219329 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 20678546,-8375738,-32671898,8849123,-5009758,14574752,31186971,-3973730,9014762,-8579056 ), + new FieldElement( -13644050,-10350239,-15962508,5075808,-1514661,-11534600,-33102500,9160280,8473550,-3256838 ), + new FieldElement( 24900749,14435722,17209120,-15292541,-22592275,9878983,-7689309,-16335821,-24568481,11788948 ) + ), + new GroupElementPreComp( + new FieldElement( -3118155,-11395194,-13802089,14797441,9652448,-6845904,-20037437,10410733,-24568470,-1458691 ), + new FieldElement( -15659161,16736706,-22467150,10215878,-9097177,7563911,11871841,-12505194,-18513325,8464118 ), + new FieldElement( -23400612,8348507,-14585951,-861714,-3950205,-6373419,14325289,8628612,33313881,-8370517 ) + ), + new GroupElementPreComp( + new FieldElement( -20186973,-4967935,22367356,5271547,-1097117,-4788838,-24805667,-10236854,-8940735,-5818269 ), + new FieldElement( -6948785,-1795212,-32625683,-16021179,32635414,-7374245,15989197,-12838188,28358192,-4253904 ), + new FieldElement( -23561781,-2799059,-32351682,-1661963,-9147719,10429267,-16637684,4072016,-5351664,5596589 ) + ), + new GroupElementPreComp( + new FieldElement( -28236598,-3390048,12312896,6213178,3117142,16078565,29266239,2557221,1768301,15373193 ), + new FieldElement( -7243358,-3246960,-4593467,-7553353,-127927,-912245,-1090902,-4504991,-24660491,3442910 ), + new FieldElement( -30210571,5124043,14181784,8197961,18964734,-11939093,22597931,7176455,-18585478,13365930 ) + ), + new GroupElementPreComp( + new FieldElement( -7877390,-1499958,8324673,4690079,6261860,890446,24538107,-8570186,-9689599,-3031667 ), + new FieldElement( 25008904,-10771599,-4305031,-9638010,16265036,15721635,683793,-11823784,15723479,-15163481 ), + new FieldElement( -9660625,12374379,-27006999,-7026148,-7724114,-12314514,11879682,5400171,519526,-1235876 ) + ), + new GroupElementPreComp( + new FieldElement( 22258397,-16332233,-7869817,14613016,-22520255,-2950923,-20353881,7315967,16648397,7605640 ), + new FieldElement( -8081308,-8464597,-8223311,9719710,19259459,-15348212,23994942,-5281555,-9468848,4763278 ), + new FieldElement( -21699244,9220969,-15730624,1084137,-25476107,-2852390,31088447,-7764523,-11356529,728112 ) + ), + new GroupElementPreComp( + new FieldElement( 26047220,-11751471,-6900323,-16521798,24092068,9158119,-4273545,-12555558,-29365436,-5498272 ), + new FieldElement( 17510331,-322857,5854289,8403524,17133918,-3112612,-28111007,12327945,10750447,10014012 ), + new FieldElement( -10312768,3936952,9156313,-8897683,16498692,-994647,-27481051,-666732,3424691,7540221 ) + ), + new GroupElementPreComp( + new FieldElement( 30322361,-6964110,11361005,-4143317,7433304,4989748,-7071422,-16317219,-9244265,15258046 ), + new FieldElement( 13054562,-2779497,19155474,469045,-12482797,4566042,5631406,2711395,1062915,-5136345 ), + new FieldElement( -19240248,-11254599,-29509029,-7499965,-5835763,13005411,-6066489,12194497,32960380,1459310 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 19852034,7027924,23669353,10020366,8586503,-6657907,394197,-6101885,18638003,-11174937 ), + new FieldElement( 31395534,15098109,26581030,8030562,-16527914,-5007134,9012486,-7584354,-6643087,-5442636 ), + new FieldElement( -9192165,-2347377,-1997099,4529534,25766844,607986,-13222,9677543,-32294889,-6456008 ) + ), + new GroupElementPreComp( + new FieldElement( -2444496,-149937,29348902,8186665,1873760,12489863,-30934579,-7839692,-7852844,-8138429 ), + new FieldElement( -15236356,-15433509,7766470,746860,26346930,-10221762,-27333451,10754588,-9431476,5203576 ), + new FieldElement( 31834314,14135496,-770007,5159118,20917671,-16768096,-7467973,-7337524,31809243,7347066 ) + ), + new GroupElementPreComp( + new FieldElement( -9606723,-11874240,20414459,13033986,13716524,-11691881,19797970,-12211255,15192876,-2087490 ), + new FieldElement( -12663563,-2181719,1168162,-3804809,26747877,-14138091,10609330,12694420,33473243,-13382104 ), + new FieldElement( 33184999,11180355,15832085,-11385430,-1633671,225884,15089336,-11023903,-6135662,14480053 ) + ), + new GroupElementPreComp( + new FieldElement( 31308717,-5619998,31030840,-1897099,15674547,-6582883,5496208,13685227,27595050,8737275 ), + new FieldElement( -20318852,-15150239,10933843,-16178022,8335352,-7546022,-31008351,-12610604,26498114,66511 ), + new FieldElement( 22644454,-8761729,-16671776,4884562,-3105614,-13559366,30540766,-4286747,-13327787,-7515095 ) + ), + new GroupElementPreComp( + new FieldElement( -28017847,9834845,18617207,-2681312,-3401956,-13307506,8205540,13585437,-17127465,15115439 ), + new FieldElement( 23711543,-672915,31206561,-8362711,6164647,-9709987,-33535882,-1426096,8236921,16492939 ), + new FieldElement( -23910559,-13515526,-26299483,-4503841,25005590,-7687270,19574902,10071562,6708380,-6222424 ) + ), + new GroupElementPreComp( + new FieldElement( 2101391,-4930054,19702731,2367575,-15427167,1047675,5301017,9328700,29955601,-11678310 ), + new FieldElement( 3096359,9271816,-21620864,-15521844,-14847996,-7592937,-25892142,-12635595,-9917575,6216608 ), + new FieldElement( -32615849,338663,-25195611,2510422,-29213566,-13820213,24822830,-6146567,-26767480,7525079 ) + ), + new GroupElementPreComp( + new FieldElement( -23066649,-13985623,16133487,-7896178,-3389565,778788,-910336,-2782495,-19386633,11994101 ), + new FieldElement( 21691500,-13624626,-641331,-14367021,3285881,-3483596,-25064666,9718258,-7477437,13381418 ), + new FieldElement( 18445390,-4202236,14979846,11622458,-1727110,-3582980,23111648,-6375247,28535282,15779576 ) + ), + new GroupElementPreComp( + new FieldElement( 30098053,3089662,-9234387,16662135,-21306940,11308411,-14068454,12021730,9955285,-16303356 ), + new FieldElement( 9734894,-14576830,-7473633,-9138735,2060392,11313496,-18426029,9924399,20194861,13380996 ), + new FieldElement( -26378102,-7965207,-22167821,15789297,-18055342,-6168792,-1984914,15707771,26342023,10146099 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( -26016874,-219943,21339191,-41388,19745256,-2878700,-29637280,2227040,21612326,-545728 ), + new FieldElement( -13077387,1184228,23562814,-5970442,-20351244,-6348714,25764461,12243797,-20856566,11649658 ), + new FieldElement( -10031494,11262626,27384172,2271902,26947504,-15997771,39944,6114064,33514190,2333242 ) + ), + new GroupElementPreComp( + new FieldElement( -21433588,-12421821,8119782,7219913,-21830522,-9016134,-6679750,-12670638,24350578,-13450001 ), + new FieldElement( -4116307,-11271533,-23886186,4843615,-30088339,690623,-31536088,-10406836,8317860,12352766 ), + new FieldElement( 18200138,-14475911,-33087759,-2696619,-23702521,-9102511,-23552096,-2287550,20712163,6719373 ) + ), + new GroupElementPreComp( + new FieldElement( 26656208,6075253,-7858556,1886072,-28344043,4262326,11117530,-3763210,26224235,-3297458 ), + new FieldElement( -17168938,-14854097,-3395676,-16369877,-19954045,14050420,21728352,9493610,18620611,-16428628 ), + new FieldElement( -13323321,13325349,11432106,5964811,18609221,6062965,-5269471,-9725556,-30701573,-16479657 ) + ), + new GroupElementPreComp( + new FieldElement( -23860538,-11233159,26961357,1640861,-32413112,-16737940,12248509,-5240639,13735342,1934062 ), + new FieldElement( 25089769,6742589,17081145,-13406266,21909293,-16067981,-15136294,-3765346,-21277997,5473616 ), + new FieldElement( 31883677,-7961101,1083432,-11572403,22828471,13290673,-7125085,12469656,29111212,-5451014 ) + ), + new GroupElementPreComp( + new FieldElement( 24244947,-15050407,-26262976,2791540,-14997599,16666678,24367466,6388839,-10295587,452383 ), + new FieldElement( -25640782,-3417841,5217916,16224624,19987036,-4082269,-24236251,-5915248,15766062,8407814 ), + new FieldElement( -20406999,13990231,15495425,16395525,5377168,15166495,-8917023,-4388953,-8067909,2276718 ) + ), + new GroupElementPreComp( + new FieldElement( 30157918,12924066,-17712050,9245753,19895028,3368142,-23827587,5096219,22740376,-7303417 ), + new FieldElement( 2041139,-14256350,7783687,13876377,-25946985,-13352459,24051124,13742383,-15637599,13295222 ), + new FieldElement( 33338237,-8505733,12532113,7977527,9106186,-1715251,-17720195,-4612972,-4451357,-14669444 ) + ), + new GroupElementPreComp( + new FieldElement( -20045281,5454097,-14346548,6447146,28862071,1883651,-2469266,-4141880,7770569,9620597 ), + new FieldElement( 23208068,7979712,33071466,8149229,1758231,-10834995,30945528,-1694323,-33502340,-14767970 ), + new FieldElement( 1439958,-16270480,-1079989,-793782,4625402,10647766,-5043801,1220118,30494170,-11440799 ) + ), + new GroupElementPreComp( + new FieldElement( -5037580,-13028295,-2970559,-3061767,15640974,-6701666,-26739026,926050,-1684339,-13333647 ), + new FieldElement( 13908495,-3549272,30919928,-6273825,-21521863,7989039,9021034,9078865,3353509,4033511 ), + new FieldElement( -29663431,-15113610,32259991,-344482,24295849,-12912123,23161163,8839127,27485041,7356032 ) + ), + }, + new[]{ + new GroupElementPreComp( + new FieldElement( 9661027,705443,11980065,-5370154,-1628543,14661173,-6346142,2625015,28431036,-16771834 ), + new FieldElement( -23839233,-8311415,-25945511,7480958,-17681669,-8354183,-22545972,14150565,15970762,4099461 ), + new FieldElement( 29262576,16756590,26350592,-8793563,8529671,-11208050,13617293,-9937143,11465739,8317062 ) + ), + new GroupElementPreComp( + new FieldElement( -25493081,-6962928,32500200,-9419051,-23038724,-2302222,14898637,3848455,20969334,-5157516 ), + new FieldElement( -20384450,-14347713,-18336405,13884722,-33039454,2842114,-21610826,-3649888,11177095,14989547 ), + new FieldElement( -24496721,-11716016,16959896,2278463,12066309,10137771,13515641,2581286,-28487508,9930240 ) + ), + new GroupElementPreComp( + new FieldElement( -17751622,-2097826,16544300,-13009300,-15914807,-14949081,18345767,-13403753,16291481,-5314038 ), + new FieldElement( -33229194,2553288,32678213,9875984,8534129,6889387,-9676774,6957617,4368891,9788741 ), + new FieldElement( 16660756,7281060,-10830758,12911820,20108584,-8101676,-21722536,-8613148,16250552,-11111103 ) + ), + new GroupElementPreComp( + new FieldElement( -19765507,2390526,-16551031,14161980,1905286,6414907,4689584,10604807,-30190403,4782747 ), + new FieldElement( -1354539,14736941,-7367442,-13292886,7710542,-14155590,-9981571,4383045,22546403,437323 ), + new FieldElement( 31665577,-12180464,-16186830,1491339,-18368625,3294682,27343084,2786261,-30633590,-14097016 ) + ), + new GroupElementPreComp( + new FieldElement( -14467279,-683715,-33374107,7448552,19294360,14334329,-19690631,2355319,-19284671,-6114373 ), + new FieldElement( 15121312,-15796162,6377020,-6031361,-10798111,-12957845,18952177,15496498,-29380133,11754228 ), + new FieldElement( -2637277,-13483075,8488727,-14303896,12728761,-1622493,7141596,11724556,22761615,-10134141 ) + ), + new GroupElementPreComp( + new FieldElement( 16918416,11729663,-18083579,3022987,-31015732,-13339659,-28741185,-12227393,32851222,11717399 ), + new FieldElement( 11166634,7338049,-6722523,4531520,-29468672,-7302055,31474879,3483633,-1193175,-4030831 ), + new FieldElement( -185635,9921305,31456609,-13536438,-12013818,13348923,33142652,6546660,-19985279,-3948376 ) + ), + new GroupElementPreComp( + new FieldElement( -32460596,11266712,-11197107,-7899103,31703694,3855903,-8537131,-12833048,-30772034,-15486313 ), + new FieldElement( -18006477,12709068,3991746,-6479188,-21491523,-10550425,-31135347,-16049879,10928917,3011958 ), + new FieldElement( -6957757,-15594337,31696059,334240,29576716,14796075,-30831056,-12805180,18008031,10258577 ) + ), + new GroupElementPreComp( + new FieldElement( -22448644,15655569,7018479,-4410003,-30314266,-1201591,-1853465,1367120,25127874,6671743 ), + new FieldElement( 29701166,-14373934,-10878120,9279288,-17568,13127210,21382910,11042292,25838796,4642684 ), + new FieldElement( -20430234,14955537,-24126347,8124619,-5369288,-5990470,30468147,-13900640,18423289,4177476 ) + ) + } + }; + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base2.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base2.cs new file mode 100644 index 00000000..cbd022b3 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/base2.cs @@ -0,0 +1,50 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class LookupTables + { + internal static readonly GroupElementPreComp[] Base2 = new GroupElementPreComp[]{ + new GroupElementPreComp( + new FieldElement( 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 ), + new FieldElement( -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 ), + new FieldElement( -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 ) + ), + new GroupElementPreComp( + new FieldElement( 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 ), + new FieldElement( 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 ), + new FieldElement( 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 ) + ), + new GroupElementPreComp( + new FieldElement( 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 ), + new FieldElement( 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 ), + new FieldElement( 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 ) + ), + new GroupElementPreComp( + new FieldElement( 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 ), + new FieldElement( -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 ), + new FieldElement( 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 ) + ), + new GroupElementPreComp( + new FieldElement( -22518993,-6692182,14201702,-8745502,-23510406,8844726,18474211,-1361450,-13062696,13821877 ), + new FieldElement( -6455177,-7839871,3374702,-4740862,-27098617,-10571707,31655028,-7212327,18853322,-14220951 ), + new FieldElement( 4566830,-12963868,-28974889,-12240689,-7602672,-2830569,-8514358,-10431137,2207753,-3209784 ) + ), + new GroupElementPreComp( + new FieldElement( -25154831,-4185821,29681144,7868801,-6854661,-9423865,-12437364,-663000,-31111463,-16132436 ), + new FieldElement( 25576264,-2703214,7349804,-11814844,16472782,9300885,3844789,15725684,171356,6466918 ), + new FieldElement( 23103977,13316479,9739013,-16149481,817875,-15038942,8965339,-14088058,-30714912,16193877 ) + ), + new GroupElementPreComp( + new FieldElement( -33521811,3180713,-2394130,14003687,-16903474,-16270840,17238398,4729455,-18074513,9256800 ), + new FieldElement( -25182317,-4174131,32336398,5036987,-21236817,11360617,22616405,9761698,-19827198,630305 ), + new FieldElement( -13720693,2639453,-24237460,-7406481,9494427,-5774029,-6554551,-15960994,-2449256,-14291300 ) + ), + new GroupElementPreComp( + new FieldElement( -3151181,-5046075,9282714,6866145,-31907062,-863023,-18940575,15033784,25105118,-7894876 ), + new FieldElement( -24326370,15950226,-31801215,-14592823,-11662737,-5090925,1573892,-2625887,2198790,-15804619 ), + new FieldElement( -3099351,10324967,-2241613,7453183,-5446979,-2735503,-13812022,-16236442,-32461234,-12290683 ) + ) + }; + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d.cs new file mode 100644 index 00000000..e341aeea --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d.cs @@ -0,0 +1,9 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class LookupTables + { + internal static FieldElement d = new FieldElement(-10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d2.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d2.cs new file mode 100644 index 00000000..bf94d24d --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/d2.cs @@ -0,0 +1,9 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class LookupTables + { + internal static FieldElement d2 = new FieldElement(-21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199); + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_0.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_0.cs new file mode 100644 index 00000000..cf27c4da --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_0.cs @@ -0,0 +1,12 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + internal static void fe_0(out FieldElement h) + { + h = default(FieldElement); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_1.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_1.cs new file mode 100644 index 00000000..348f919a --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_1.cs @@ -0,0 +1,13 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + internal static void fe_1(out FieldElement h) + { + h = default(FieldElement); + h.x0 = 1; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_add.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_add.cs new file mode 100644 index 00000000..a3d2faaa --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_add.cs @@ -0,0 +1,63 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* + h = f + g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + + Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + */ + //void fe_add(fe h,const fe f,const fe g) + internal static void fe_add(out FieldElement h, ref FieldElement f, ref FieldElement g) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int32 g0 = g.x0; + Int32 g1 = g.x1; + Int32 g2 = g.x2; + Int32 g3 = g.x3; + Int32 g4 = g.x4; + Int32 g5 = g.x5; + Int32 g6 = g.x6; + Int32 g7 = g.x7; + Int32 g8 = g.x8; + Int32 g9 = g.x9; + Int32 h0 = f0 + g0; + Int32 h1 = f1 + g1; + Int32 h2 = f2 + g2; + Int32 h3 = f3 + g3; + Int32 h4 = f4 + g4; + Int32 h5 = f5 + g5; + Int32 h6 = f6 + g6; + Int32 h7 = f7 + g7; + Int32 h8 = f8 + g8; + Int32 h9 = f9 + g9; + h.x0 = h0; + h.x1 = h1; + h.x2 = h2; + h.x3 = h3; + h.x4 = h4; + h.x5 = h5; + h.x6 = h6; + h.x7 = h7; + h.x8 = h8; + h.x9 = h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cmov.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cmov.cs new file mode 100644 index 00000000..a24a8efb --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cmov.cs @@ -0,0 +1,70 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* + Replace (f,g) with (g,g) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. + */ + + //void fe_cmov(fe f,const fe g,unsigned int b) + internal static void fe_cmov(ref FieldElement f, ref FieldElement g, int b) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int32 g0 = g.x0; + Int32 g1 = g.x1; + Int32 g2 = g.x2; + Int32 g3 = g.x3; + Int32 g4 = g.x4; + Int32 g5 = g.x5; + Int32 g6 = g.x6; + Int32 g7 = g.x7; + Int32 g8 = g.x8; + Int32 g9 = g.x9; + Int32 x0 = f0 ^ g0; + Int32 x1 = f1 ^ g1; + Int32 x2 = f2 ^ g2; + Int32 x3 = f3 ^ g3; + Int32 x4 = f4 ^ g4; + Int32 x5 = f5 ^ g5; + Int32 x6 = f6 ^ g6; + Int32 x7 = f7 ^ g7; + Int32 x8 = f8 ^ g8; + Int32 x9 = f9 ^ g9; + b = -b; + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f.x0 = f0 ^ x0; + f.x1 = f1 ^ x1; + f.x2 = f2 ^ x2; + f.x3 = f3 ^ x3; + f.x4 = f4 ^ x4; + f.x5 = f5 ^ x5; + f.x6 = f6 ^ x6; + f.x7 = f7 ^ x7; + f.x8 = f8 ^ x8; + f.x9 = f9 ^ x9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cswap.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cswap.cs new file mode 100644 index 00000000..f251eebc --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_cswap.cs @@ -0,0 +1,78 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* + Replace (f,g) with (g,f) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. + */ + internal static void fe_cswap(ref FieldElement f, ref FieldElement g, uint b) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int32 g0 = g.x0; + Int32 g1 = g.x1; + Int32 g2 = g.x2; + Int32 g3 = g.x3; + Int32 g4 = g.x4; + Int32 g5 = g.x5; + Int32 g6 = g.x6; + Int32 g7 = g.x7; + Int32 g8 = g.x8; + Int32 g9 = g.x9; + Int32 x0 = f0 ^ g0; + Int32 x1 = f1 ^ g1; + Int32 x2 = f2 ^ g2; + Int32 x3 = f3 ^ g3; + Int32 x4 = f4 ^ g4; + Int32 x5 = f5 ^ g5; + Int32 x6 = f6 ^ g6; + Int32 x7 = f7 ^ g7; + Int32 x8 = f8 ^ g8; + Int32 x9 = f9 ^ g9; + int negb = unchecked((int)-b); + x0 &= negb; + x1 &= negb; + x2 &= negb; + x3 &= negb; + x4 &= negb; + x5 &= negb; + x6 &= negb; + x7 &= negb; + x8 &= negb; + x9 &= negb; + f.x0 = f0 ^ x0; + f.x1 = f1 ^ x1; + f.x2 = f2 ^ x2; + f.x3 = f3 ^ x3; + f.x4 = f4 ^ x4; + f.x5 = f5 ^ x5; + f.x6 = f6 ^ x6; + f.x7 = f7 ^ x7; + f.x8 = f8 ^ x8; + f.x9 = f9 ^ x9; + g.x0 = g0 ^ x0; + g.x1 = g1 ^ x1; + g.x2 = g2 ^ x2; + g.x3 = g3 ^ x3; + g.x4 = g4 ^ x4; + g.x5 = g5 ^ x5; + g.x6 = g6 ^ x6; + g.x7 = g7 ^ x7; + g.x8 = g8 ^ x8; + g.x9 = g9 ^ x9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_frombytes.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_frombytes.cs new file mode 100644 index 00000000..37abf8d5 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_frombytes.cs @@ -0,0 +1,122 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + private static Int64 load_3(byte[] data, int offset) + { + uint result; + result = (uint)data[offset + 0]; + result |= (uint)data[offset + 1] << 8; + result |= (uint)data[offset + 2] << 16; + return (Int64)(UInt64)result; + } + + private static Int64 load_4(byte[] data, int offset) + { + uint result; + result = (uint)data[offset + 0]; + result |= (uint)data[offset + 1] << 8; + result |= (uint)data[offset + 2] << 16; + result |= (uint)data[offset + 3] << 24; + return (Int64)(UInt64)result; + } + + // Ignores top bit of h. + internal static void fe_frombytes(out FieldElement h, byte[] data, int offset) + { + Int64 h0 = load_4(data, offset); + Int64 h1 = load_3(data, offset + 4) << 6; + Int64 h2 = load_3(data, offset + 7) << 5; + Int64 h3 = load_3(data, offset + 10) << 3; + Int64 h4 = load_3(data, offset + 13) << 2; + Int64 h5 = load_4(data, offset + 16); + Int64 h6 = load_3(data, offset + 20) << 7; + Int64 h7 = load_3(data, offset + 23) << 5; + Int64 h8 = load_3(data, offset + 26) << 4; + Int64 h9 = (load_3(data, offset + 29) & 8388607) << 2; + Int64 carry0; + Int64 carry1; + Int64 carry2; + Int64 carry3; + Int64 carry4; + Int64 carry5; + Int64 carry6; + Int64 carry7; + Int64 carry8; + Int64 carry9; + + carry9 = (h9 + (Int64)(1 << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (Int64)(1 << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (Int64)(1 << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (Int64)(1 << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (Int64)(1 << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (Int64)(1 << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (Int64)(1 << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (Int64)(1 << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h.x0 = (int)h0; + h.x1 = (int)h1; + h.x2 = (int)h2; + h.x3 = (int)h3; + h.x4 = (int)h4; + h.x5 = (int)h5; + h.x6 = (int)h6; + h.x7 = (int)h7; + h.x8 = (int)h8; + h.x9 = (int)h9; + } + + // does NOT ignore top bit + internal static void fe_frombytes2(out FieldElement h, byte[] data, int offset) + { + Int64 h0 = load_4(data, offset); + Int64 h1 = load_3(data, offset + 4) << 6; + Int64 h2 = load_3(data, offset + 7) << 5; + Int64 h3 = load_3(data, offset + 10) << 3; + Int64 h4 = load_3(data, offset + 13) << 2; + Int64 h5 = load_4(data, offset + 16); + Int64 h6 = load_3(data, offset + 20) << 7; + Int64 h7 = load_3(data, offset + 23) << 5; + Int64 h8 = load_3(data, offset + 26) << 4; + Int64 h9 = load_3(data, offset + 29) << 2; + Int64 carry0; + Int64 carry1; + Int64 carry2; + Int64 carry3; + Int64 carry4; + Int64 carry5; + Int64 carry6; + Int64 carry7; + Int64 carry8; + Int64 carry9; + + carry9 = (h9 + (Int64)(1 << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (Int64)(1 << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (Int64)(1 << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (Int64)(1 << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (Int64)(1 << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (Int64)(1 << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (Int64)(1 << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (Int64)(1 << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h.x0 = (int)h0; + h.x1 = (int)h1; + h.x2 = (int)h2; + h.x3 = (int)h3; + h.x4 = (int)h4; + h.x5 = (int)h5; + h.x6 = (int)h6; + h.x7 = (int)h7; + h.x8 = (int)h8; + h.x9 = (int)h9; + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_invert.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_invert.cs new file mode 100644 index 00000000..8ff9a3a6 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_invert.cs @@ -0,0 +1,179 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + internal static void fe_invert(out FieldElement result, ref FieldElement z) + { + FieldElement t0; + FieldElement t1; + FieldElement t2; + FieldElement t3; + int i; + + /* qhasm: fe z1 */ + + /* qhasm: fe z2 */ + + /* qhasm: fe z8 */ + + /* qhasm: fe z9 */ + + /* qhasm: fe z11 */ + + /* qhasm: fe z22 */ + + /* qhasm: fe z_5_0 */ + + /* qhasm: fe z_10_5 */ + + /* qhasm: fe z_10_0 */ + + /* qhasm: fe z_20_10 */ + + /* qhasm: fe z_20_0 */ + + /* qhasm: fe z_40_20 */ + + /* qhasm: fe z_40_0 */ + + /* qhasm: fe z_50_10 */ + + /* qhasm: fe z_50_0 */ + + /* qhasm: fe z_100_50 */ + + /* qhasm: fe z_100_0 */ + + /* qhasm: fe z_200_100 */ + + /* qhasm: fe z_200_0 */ + + /* qhasm: fe z_250_50 */ + + /* qhasm: fe z_250_0 */ + + /* qhasm: fe z_255_5 */ + + /* qhasm: fe z_255_21 */ + + /* qhasm: enter pow225521 */ + + /* qhasm: z2 = z1^2^1 */ + /* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ + /* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ + fe_sq(out t0, ref z); //for (i = 1; i < 1; ++i) fe_sq(out t0, ref t0); + + /* qhasm: z8 = z2^2^2 */ + /* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ + /* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ + fe_sq(out t1, ref t0); for (i = 1; i < 2; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z9 = z1*z8 */ + /* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#3,z22=fe#3,>z22=fe#3); */ + /* asm 2: fe_sq(>z22=t2,z22=t2,>z22=t2); */ + fe_sq(out t2, ref t0); //for (i = 1; i < 1; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_5_0 = z9*z22 */ + /* asm 1: fe_mul(>z_5_0=fe#2,z_5_0=t1,z_10_5=fe#3,z_10_5=fe#3,>z_10_5=fe#3); */ + /* asm 2: fe_sq(>z_10_5=t2,z_10_5=t2,>z_10_5=t2); */ + fe_sq(out t2, ref t1); for (i = 1; i < 5; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_10_0 = z_10_5*z_5_0 */ + /* asm 1: fe_mul(>z_10_0=fe#2,z_10_0=t1,z_20_10=fe#3,z_20_10=fe#3,>z_20_10=fe#3); */ + /* asm 2: fe_sq(>z_20_10=t2,z_20_10=t2,>z_20_10=t2); */ + fe_sq(out t2, ref t1); for (i = 1; i < 10; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_20_0 = z_20_10*z_10_0 */ + /* asm 1: fe_mul(>z_20_0=fe#3,z_20_0=t2,z_40_20=fe#4,z_40_20=fe#4,>z_40_20=fe#4); */ + /* asm 2: fe_sq(>z_40_20=t3,z_40_20=t3,>z_40_20=t3); */ + fe_sq(out t3, ref t2); for (i = 1; i < 20; ++i) fe_sq(out t3, ref t3); + + /* qhasm: z_40_0 = z_40_20*z_20_0 */ + /* asm 1: fe_mul(>z_40_0=fe#3,z_40_0=t2,z_50_10=fe#3,z_50_10=fe#3,>z_50_10=fe#3); */ + /* asm 2: fe_sq(>z_50_10=t2,z_50_10=t2,>z_50_10=t2); */ + fe_sq(out t2, ref t2); for (i = 1; i < 10; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_50_0 = z_50_10*z_10_0 */ + /* asm 1: fe_mul(>z_50_0=fe#2,z_50_0=t1,z_100_50=fe#3,z_100_50=fe#3,>z_100_50=fe#3); */ + /* asm 2: fe_sq(>z_100_50=t2,z_100_50=t2,>z_100_50=t2); */ + fe_sq(out t2, ref t1); for (i = 1; i < 50; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_100_0 = z_100_50*z_50_0 */ + /* asm 1: fe_mul(>z_100_0=fe#3,z_100_0=t2,z_200_100=fe#4,z_200_100=fe#4,>z_200_100=fe#4); */ + /* asm 2: fe_sq(>z_200_100=t3,z_200_100=t3,>z_200_100=t3); */ + fe_sq(out t3, ref t2); for (i = 1; i < 100; ++i) fe_sq(out t3, ref t3); + + /* qhasm: z_200_0 = z_200_100*z_100_0 */ + /* asm 1: fe_mul(>z_200_0=fe#3,z_200_0=t2,z_250_50=fe#3,z_250_50=fe#3,>z_250_50=fe#3); */ + /* asm 2: fe_sq(>z_250_50=t2,z_250_50=t2,>z_250_50=t2); */ + fe_sq(out t2, ref t2); for (i = 1; i < 50; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_250_0 = z_250_50*z_50_0 */ + /* asm 1: fe_mul(>z_250_0=fe#2,z_250_0=t1,z_255_5=fe#2,z_255_5=fe#2,>z_255_5=fe#2); */ + /* asm 2: fe_sq(>z_255_5=t1,z_255_5=t1,>z_255_5=t1); */ + fe_sq(out t1, ref t1); for (i = 1; i < 5; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z_255_21 = z_255_5*z11 */ + /* asm 1: fe_mul(>z_255_21=fe#12,z_255_21=out,> 31) ^ 1); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul.cs new file mode 100644 index 00000000..a060dba8 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul.cs @@ -0,0 +1,258 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* + h = f * g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + + Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + */ + + /* + Notes on implementation strategy: + + Using schoolbook multiplication. + Karatsuba would save a little in some cost models. + + Most multiplications by 2 and 19 are 32-bit precomputations; + cheaper than 64-bit postcomputations. + + There is one remaining multiplication by 19 in the carry chain; + one *19 precomputation can be merged into this, + but the resulting data flow is considerably less clean. + + There are 12 carries below. + 10 of them are 2-way parallelizable and vectorizable. + Can get away with 11 carries, but then data flow is much deeper. + + With tighter constraints on inputs can squeeze carries into int32. + */ + + internal static void fe_mul(out FieldElement h, ref FieldElement f, ref FieldElement g) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int32 g0 = g.x0; + Int32 g1 = g.x1; + Int32 g2 = g.x2; + Int32 g3 = g.x3; + Int32 g4 = g.x4; + Int32 g5 = g.x5; + Int32 g6 = g.x6; + Int32 g7 = g.x7; + Int32 g8 = g.x8; + Int32 g9 = g.x9; + Int32 g1_19 = 19 * g1; /* 1.959375*2^29 */ + Int32 g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + Int32 g3_19 = 19 * g3; + Int32 g4_19 = 19 * g4; + Int32 g5_19 = 19 * g5; + Int32 g6_19 = 19 * g6; + Int32 g7_19 = 19 * g7; + Int32 g8_19 = 19 * g8; + Int32 g9_19 = 19 * g9; + Int32 f1_2 = 2 * f1; + Int32 f3_2 = 2 * f3; + Int32 f5_2 = 2 * f5; + Int32 f7_2 = 2 * f7; + Int32 f9_2 = 2 * f9; + Int64 f0g0 = f0 * (Int64)g0; + Int64 f0g1 = f0 * (Int64)g1; + Int64 f0g2 = f0 * (Int64)g2; + Int64 f0g3 = f0 * (Int64)g3; + Int64 f0g4 = f0 * (Int64)g4; + Int64 f0g5 = f0 * (Int64)g5; + Int64 f0g6 = f0 * (Int64)g6; + Int64 f0g7 = f0 * (Int64)g7; + Int64 f0g8 = f0 * (Int64)g8; + Int64 f0g9 = f0 * (Int64)g9; + Int64 f1g0 = f1 * (Int64)g0; + Int64 f1g1_2 = f1_2 * (Int64)g1; + Int64 f1g2 = f1 * (Int64)g2; + Int64 f1g3_2 = f1_2 * (Int64)g3; + Int64 f1g4 = f1 * (Int64)g4; + Int64 f1g5_2 = f1_2 * (Int64)g5; + Int64 f1g6 = f1 * (Int64)g6; + Int64 f1g7_2 = f1_2 * (Int64)g7; + Int64 f1g8 = f1 * (Int64)g8; + Int64 f1g9_38 = f1_2 * (Int64)g9_19; + Int64 f2g0 = f2 * (Int64)g0; + Int64 f2g1 = f2 * (Int64)g1; + Int64 f2g2 = f2 * (Int64)g2; + Int64 f2g3 = f2 * (Int64)g3; + Int64 f2g4 = f2 * (Int64)g4; + Int64 f2g5 = f2 * (Int64)g5; + Int64 f2g6 = f2 * (Int64)g6; + Int64 f2g7 = f2 * (Int64)g7; + Int64 f2g8_19 = f2 * (Int64)g8_19; + Int64 f2g9_19 = f2 * (Int64)g9_19; + Int64 f3g0 = f3 * (Int64)g0; + Int64 f3g1_2 = f3_2 * (Int64)g1; + Int64 f3g2 = f3 * (Int64)g2; + Int64 f3g3_2 = f3_2 * (Int64)g3; + Int64 f3g4 = f3 * (Int64)g4; + Int64 f3g5_2 = f3_2 * (Int64)g5; + Int64 f3g6 = f3 * (Int64)g6; + Int64 f3g7_38 = f3_2 * (Int64)g7_19; + Int64 f3g8_19 = f3 * (Int64)g8_19; + Int64 f3g9_38 = f3_2 * (Int64)g9_19; + Int64 f4g0 = f4 * (Int64)g0; + Int64 f4g1 = f4 * (Int64)g1; + Int64 f4g2 = f4 * (Int64)g2; + Int64 f4g3 = f4 * (Int64)g3; + Int64 f4g4 = f4 * (Int64)g4; + Int64 f4g5 = f4 * (Int64)g5; + Int64 f4g6_19 = f4 * (Int64)g6_19; + Int64 f4g7_19 = f4 * (Int64)g7_19; + Int64 f4g8_19 = f4 * (Int64)g8_19; + Int64 f4g9_19 = f4 * (Int64)g9_19; + Int64 f5g0 = f5 * (Int64)g0; + Int64 f5g1_2 = f5_2 * (Int64)g1; + Int64 f5g2 = f5 * (Int64)g2; + Int64 f5g3_2 = f5_2 * (Int64)g3; + Int64 f5g4 = f5 * (Int64)g4; + Int64 f5g5_38 = f5_2 * (Int64)g5_19; + Int64 f5g6_19 = f5 * (Int64)g6_19; + Int64 f5g7_38 = f5_2 * (Int64)g7_19; + Int64 f5g8_19 = f5 * (Int64)g8_19; + Int64 f5g9_38 = f5_2 * (Int64)g9_19; + Int64 f6g0 = f6 * (Int64)g0; + Int64 f6g1 = f6 * (Int64)g1; + Int64 f6g2 = f6 * (Int64)g2; + Int64 f6g3 = f6 * (Int64)g3; + Int64 f6g4_19 = f6 * (Int64)g4_19; + Int64 f6g5_19 = f6 * (Int64)g5_19; + Int64 f6g6_19 = f6 * (Int64)g6_19; + Int64 f6g7_19 = f6 * (Int64)g7_19; + Int64 f6g8_19 = f6 * (Int64)g8_19; + Int64 f6g9_19 = f6 * (Int64)g9_19; + Int64 f7g0 = f7 * (Int64)g0; + Int64 f7g1_2 = f7_2 * (Int64)g1; + Int64 f7g2 = f7 * (Int64)g2; + Int64 f7g3_38 = f7_2 * (Int64)g3_19; + Int64 f7g4_19 = f7 * (Int64)g4_19; + Int64 f7g5_38 = f7_2 * (Int64)g5_19; + Int64 f7g6_19 = f7 * (Int64)g6_19; + Int64 f7g7_38 = f7_2 * (Int64)g7_19; + Int64 f7g8_19 = f7 * (Int64)g8_19; + Int64 f7g9_38 = f7_2 * (Int64)g9_19; + Int64 f8g0 = f8 * (Int64)g0; + Int64 f8g1 = f8 * (Int64)g1; + Int64 f8g2_19 = f8 * (Int64)g2_19; + Int64 f8g3_19 = f8 * (Int64)g3_19; + Int64 f8g4_19 = f8 * (Int64)g4_19; + Int64 f8g5_19 = f8 * (Int64)g5_19; + Int64 f8g6_19 = f8 * (Int64)g6_19; + Int64 f8g7_19 = f8 * (Int64)g7_19; + Int64 f8g8_19 = f8 * (Int64)g8_19; + Int64 f8g9_19 = f8 * (Int64)g9_19; + Int64 f9g0 = f9 * (Int64)g0; + Int64 f9g1_38 = f9_2 * (Int64)g1_19; + Int64 f9g2_19 = f9 * (Int64)g2_19; + Int64 f9g3_38 = f9_2 * (Int64)g3_19; + Int64 f9g4_19 = f9 * (Int64)g4_19; + Int64 f9g5_38 = f9_2 * (Int64)g5_19; + Int64 f9g6_19 = f9 * (Int64)g6_19; + Int64 f9g7_38 = f9_2 * (Int64)g7_19; + Int64 f9g8_19 = f9 * (Int64)g8_19; + Int64 f9g9_38 = f9_2 * (Int64)g9_19; + Int64 h0 = f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38; + Int64 h1 = f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19; + Int64 h2 = f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38; + Int64 h3 = f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19; + Int64 h4 = f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38; + Int64 h5 = f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19; + Int64 h6 = f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38; + Int64 h7 = f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19; + Int64 h8 = f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38; + Int64 h9 = f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0; + Int64 carry0; + Int64 carry1; + Int64 carry2; + Int64 carry3; + Int64 carry4; + Int64 carry5; + Int64 carry6; + Int64 carry7; + Int64 carry8; + Int64 carry9; + + /* + |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) + i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 + |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) + i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 + */ + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + /* |h0| <= 2^25 */ + /* |h4| <= 2^25 */ + /* |h1| <= 1.71*2^59 */ + /* |h5| <= 1.71*2^59 */ + + carry1 = (h1 + (Int64)(1 << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (Int64)(1 << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + /* |h1| <= 2^24; from now on fits into int32 */ + /* |h5| <= 2^24; from now on fits into int32 */ + /* |h2| <= 1.41*2^60 */ + /* |h6| <= 1.41*2^60 */ + + carry2 = (h2 + (Int64)(1 << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (Int64)(1 << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + /* |h2| <= 2^25; from now on fits into int32 unchanged */ + /* |h6| <= 2^25; from now on fits into int32 unchanged */ + /* |h3| <= 1.71*2^59 */ + /* |h7| <= 1.71*2^59 */ + + carry3 = (h3 + (Int64)(1 << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (Int64)(1 << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + /* |h3| <= 2^24; from now on fits into int32 unchanged */ + /* |h7| <= 2^24; from now on fits into int32 unchanged */ + /* |h4| <= 1.72*2^34 */ + /* |h8| <= 1.41*2^60 */ + + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (Int64)(1 << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + /* |h4| <= 2^25; from now on fits into int32 unchanged */ + /* |h8| <= 2^25; from now on fits into int32 unchanged */ + /* |h5| <= 1.01*2^24 */ + /* |h9| <= 1.71*2^59 */ + + carry9 = (h9 + (Int64)(1 << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + /* |h9| <= 2^24; from now on fits into int32 unchanged */ + /* |h0| <= 1.1*2^39 */ + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + /* |h0| <= 2^25; from now on fits into int32 unchanged */ + /* |h1| <= 1.01*2^24 */ + + h.x0 = (Int32)h0; + h.x1 = (Int32)h1; + h.x2 = (Int32)h2; + h.x3 = (Int32)h3; + h.x4 = (Int32)h4; + h.x5 = (Int32)h5; + h.x6 = (Int32)h6; + h.x7 = (Int32)h7; + h.x8 = (Int32)h8; + h.x9 = (Int32)h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul121666.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul121666.cs new file mode 100644 index 00000000..5112f527 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_mul121666.cs @@ -0,0 +1,76 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + + /* + h = f * 121666 + Can overlap h with f. + + Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + + Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + */ + + internal static void fe_mul121666(out FieldElement h, ref FieldElement f) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int64 h0 = f0 * (Int64)121666; + Int64 h1 = f1 * (Int64)121666; + Int64 h2 = f2 * (Int64)121666; + Int64 h3 = f3 * (Int64)121666; + Int64 h4 = f4 * (Int64)121666; + Int64 h5 = f5 * (Int64)121666; + Int64 h6 = f6 * (Int64)121666; + Int64 h7 = f7 * (Int64)121666; + Int64 h8 = f8 * (Int64)121666; + Int64 h9 = f9 * (Int64)121666; + Int64 carry0; + Int64 carry1; + Int64 carry2; + Int64 carry3; + Int64 carry4; + Int64 carry5; + Int64 carry6; + Int64 carry7; + Int64 carry8; + Int64 carry9; + + carry9 = (h9 + (Int64)(1 << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (Int64)(1 << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (Int64)(1 << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (Int64)(1 << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (Int64)(1 << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (Int64)(1 << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (Int64)(1 << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (Int64)(1 << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h.x0 = (int)h0; + h.x1 = (int)h1; + h.x2 = (int)h2; + h.x3 = (int)h3; + h.x4 = (int)h4; + h.x5 = (int)h5; + h.x6 = (int)h6; + h.x7 = (int)h7; + h.x8 = (int)h8; + h.x9 = (int)h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_neg.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_neg.cs new file mode 100644 index 00000000..f73bd4a5 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_neg.cs @@ -0,0 +1,50 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* + h = -f + + Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + + Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + */ + internal static void fe_neg(out FieldElement h, ref FieldElement f) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int32 h0 = -f0; + Int32 h1 = -f1; + Int32 h2 = -f2; + Int32 h3 = -f3; + Int32 h4 = -f4; + Int32 h5 = -f5; + Int32 h6 = -f6; + Int32 h7 = -f7; + Int32 h8 = -f8; + Int32 h9 = -f9; + h.x0 = h0; + h.x1 = h1; + h.x2 = h2; + h.x3 = h3; + h.x4 = h4; + h.x5 = h5; + h.x6 = h6; + h.x7 = h7; + h.x8 = h8; + h.x9 = h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_pow22523.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_pow22523.cs new file mode 100644 index 00000000..0686e2d5 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_pow22523.cs @@ -0,0 +1,175 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + internal static void fe_pow22523(out FieldElement result, ref FieldElement z) + { + FieldElement t0; + FieldElement t1; + FieldElement t2; + int i; + + /* qhasm: fe z1 */ + + /* qhasm: fe z2 */ + + /* qhasm: fe z8 */ + + /* qhasm: fe z9 */ + + /* qhasm: fe z11 */ + + /* qhasm: fe z22 */ + + /* qhasm: fe z_5_0 */ + + /* qhasm: fe z_10_5 */ + + /* qhasm: fe z_10_0 */ + + /* qhasm: fe z_20_10 */ + + /* qhasm: fe z_20_0 */ + + /* qhasm: fe z_40_20 */ + + /* qhasm: fe z_40_0 */ + + /* qhasm: fe z_50_10 */ + + /* qhasm: fe z_50_0 */ + + /* qhasm: fe z_100_50 */ + + /* qhasm: fe z_100_0 */ + + /* qhasm: fe z_200_100 */ + + /* qhasm: fe z_200_0 */ + + /* qhasm: fe z_250_50 */ + + /* qhasm: fe z_250_0 */ + + /* qhasm: fe z_252_2 */ + + /* qhasm: fe z_252_3 */ + + /* qhasm: enter pow22523 */ + + /* qhasm: z2 = z1^2^1 */ + /* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ + /* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ + fe_sq(out t0, ref z); //for (i = 1; i < 1; ++i) fe_sq(out t0, ref t0); + + /* qhasm: z8 = z2^2^2 */ + /* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ + /* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ + fe_sq(out t1, ref t0); for (i = 1; i < 2; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z9 = z1*z8 */ + /* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#1,z22=fe#1,>z22=fe#1); */ + /* asm 2: fe_sq(>z22=t0,z22=t0,>z22=t0); */ + fe_sq(out t0, ref t0); //for (i = 1; i < 1; ++i) fe_sq(out t0, ref t0); + + /* qhasm: z_5_0 = z9*z22 */ + /* asm 1: fe_mul(>z_5_0=fe#1,z_5_0=t0,z_10_5=fe#2,z_10_5=fe#2,>z_10_5=fe#2); */ + /* asm 2: fe_sq(>z_10_5=t1,z_10_5=t1,>z_10_5=t1); */ + fe_sq(out t1, ref t0); for (i = 1; i < 5; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z_10_0 = z_10_5*z_5_0 */ + /* asm 1: fe_mul(>z_10_0=fe#1,z_10_0=t0,z_20_10=fe#2,z_20_10=fe#2,>z_20_10=fe#2); */ + /* asm 2: fe_sq(>z_20_10=t1,z_20_10=t1,>z_20_10=t1); */ + fe_sq(out t1, ref t0); for (i = 1; i < 10; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z_20_0 = z_20_10*z_10_0 */ + /* asm 1: fe_mul(>z_20_0=fe#2,z_20_0=t1,z_40_20=fe#3,z_40_20=fe#3,>z_40_20=fe#3); */ + /* asm 2: fe_sq(>z_40_20=t2,z_40_20=t2,>z_40_20=t2); */ + fe_sq(out t2, ref t1); for (i = 1; i < 20; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_40_0 = z_40_20*z_20_0 */ + /* asm 1: fe_mul(>z_40_0=fe#2,z_40_0=t1,z_50_10=fe#2,z_50_10=fe#2,>z_50_10=fe#2); */ + /* asm 2: fe_sq(>z_50_10=t1,z_50_10=t1,>z_50_10=t1); */ + fe_sq(out t1, ref t1); for (i = 1; i < 10; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z_50_0 = z_50_10*z_10_0 */ + /* asm 1: fe_mul(>z_50_0=fe#1,z_50_0=t0,z_100_50=fe#2,z_100_50=fe#2,>z_100_50=fe#2); */ + /* asm 2: fe_sq(>z_100_50=t1,z_100_50=t1,>z_100_50=t1); */ + fe_sq(out t1, ref t0); for (i = 1; i < 50; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z_100_0 = z_100_50*z_50_0 */ + /* asm 1: fe_mul(>z_100_0=fe#2,z_100_0=t1,z_200_100=fe#3,z_200_100=fe#3,>z_200_100=fe#3); */ + /* asm 2: fe_sq(>z_200_100=t2,z_200_100=t2,>z_200_100=t2); */ + fe_sq(out t2, ref t1); for (i = 1; i < 100; ++i) fe_sq(out t2, ref t2); + + /* qhasm: z_200_0 = z_200_100*z_100_0 */ + /* asm 1: fe_mul(>z_200_0=fe#2,z_200_0=t1,z_250_50=fe#2,z_250_50=fe#2,>z_250_50=fe#2); */ + /* asm 2: fe_sq(>z_250_50=t1,z_250_50=t1,>z_250_50=t1); */ + fe_sq(out t1, ref t1); for (i = 1; i < 50; ++i) fe_sq(out t1, ref t1); + + /* qhasm: z_250_0 = z_250_50*z_50_0 */ + /* asm 1: fe_mul(>z_250_0=fe#1,z_250_0=t0,z_252_2=fe#1,z_252_2=fe#1,>z_252_2=fe#1); */ + /* asm 2: fe_sq(>z_252_2=t0,z_252_2=t0,>z_252_2=t0); */ + fe_sq(out t0, ref t0); for (i = 1; i < 2; ++i) fe_sq(out t0, ref t0); + + /* qhasm: z_252_3 = z_252_2*z1 */ + /* asm 1: fe_mul(>z_252_3=fe#12,z_252_3=out,> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + + carry1 = (h1 + (Int64)(1 << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (Int64)(1 << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + + carry2 = (h2 + (Int64)(1 << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (Int64)(1 << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + + carry3 = (h3 + (Int64)(1 << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (Int64)(1 << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (Int64)(1 << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + carry9 = (h9 + (Int64)(1 << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + + h.x0 = (Int32)h0; + h.x1 = (Int32)h1; + h.x2 = (Int32)h2; + h.x3 = (Int32)h3; + h.x4 = (Int32)h4; + h.x5 = (Int32)h5; + h.x6 = (Int32)h6; + h.x7 = (Int32)h7; + h.x8 = (Int32)h8; + h.x9 = (Int32)h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sq2.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sq2.cs new file mode 100644 index 00000000..a869311b --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sq2.cs @@ -0,0 +1,164 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* +h = 2 * f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + + /* + See fe_mul.c for discussion of implementation strategy. + */ + internal static void fe_sq2(out FieldElement h, ref FieldElement f) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int32 f0_2 = 2 * f0; + Int32 f1_2 = 2 * f1; + Int32 f2_2 = 2 * f2; + Int32 f3_2 = 2 * f3; + Int32 f4_2 = 2 * f4; + Int32 f5_2 = 2 * f5; + Int32 f6_2 = 2 * f6; + Int32 f7_2 = 2 * f7; + Int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ + Int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ + Int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ + Int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ + Int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ + Int64 f0f0 = f0 * (Int64)f0; + Int64 f0f1_2 = f0_2 * (Int64)f1; + Int64 f0f2_2 = f0_2 * (Int64)f2; + Int64 f0f3_2 = f0_2 * (Int64)f3; + Int64 f0f4_2 = f0_2 * (Int64)f4; + Int64 f0f5_2 = f0_2 * (Int64)f5; + Int64 f0f6_2 = f0_2 * (Int64)f6; + Int64 f0f7_2 = f0_2 * (Int64)f7; + Int64 f0f8_2 = f0_2 * (Int64)f8; + Int64 f0f9_2 = f0_2 * (Int64)f9; + Int64 f1f1_2 = f1_2 * (Int64)f1; + Int64 f1f2_2 = f1_2 * (Int64)f2; + Int64 f1f3_4 = f1_2 * (Int64)f3_2; + Int64 f1f4_2 = f1_2 * (Int64)f4; + Int64 f1f5_4 = f1_2 * (Int64)f5_2; + Int64 f1f6_2 = f1_2 * (Int64)f6; + Int64 f1f7_4 = f1_2 * (Int64)f7_2; + Int64 f1f8_2 = f1_2 * (Int64)f8; + Int64 f1f9_76 = f1_2 * (Int64)f9_38; + Int64 f2f2 = f2 * (Int64)f2; + Int64 f2f3_2 = f2_2 * (Int64)f3; + Int64 f2f4_2 = f2_2 * (Int64)f4; + Int64 f2f5_2 = f2_2 * (Int64)f5; + Int64 f2f6_2 = f2_2 * (Int64)f6; + Int64 f2f7_2 = f2_2 * (Int64)f7; + Int64 f2f8_38 = f2_2 * (Int64)f8_19; + Int64 f2f9_38 = f2 * (Int64)f9_38; + Int64 f3f3_2 = f3_2 * (Int64)f3; + Int64 f3f4_2 = f3_2 * (Int64)f4; + Int64 f3f5_4 = f3_2 * (Int64)f5_2; + Int64 f3f6_2 = f3_2 * (Int64)f6; + Int64 f3f7_76 = f3_2 * (Int64)f7_38; + Int64 f3f8_38 = f3_2 * (Int64)f8_19; + Int64 f3f9_76 = f3_2 * (Int64)f9_38; + Int64 f4f4 = f4 * (Int64)f4; + Int64 f4f5_2 = f4_2 * (Int64)f5; + Int64 f4f6_38 = f4_2 * (Int64)f6_19; + Int64 f4f7_38 = f4 * (Int64)f7_38; + Int64 f4f8_38 = f4_2 * (Int64)f8_19; + Int64 f4f9_38 = f4 * (Int64)f9_38; + Int64 f5f5_38 = f5 * (Int64)f5_38; + Int64 f5f6_38 = f5_2 * (Int64)f6_19; + Int64 f5f7_76 = f5_2 * (Int64)f7_38; + Int64 f5f8_38 = f5_2 * (Int64)f8_19; + Int64 f5f9_76 = f5_2 * (Int64)f9_38; + Int64 f6f6_19 = f6 * (Int64)f6_19; + Int64 f6f7_38 = f6 * (Int64)f7_38; + Int64 f6f8_38 = f6_2 * (Int64)f8_19; + Int64 f6f9_38 = f6 * (Int64)f9_38; + Int64 f7f7_38 = f7 * (Int64)f7_38; + Int64 f7f8_38 = f7_2 * (Int64)f8_19; + Int64 f7f9_76 = f7_2 * (Int64)f9_38; + Int64 f8f8_19 = f8 * (Int64)f8_19; + Int64 f8f9_38 = f8 * (Int64)f9_38; + Int64 f9f9_38 = f9 * (Int64)f9_38; + Int64 h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + Int64 h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + Int64 h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + Int64 h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + Int64 h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + Int64 h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + Int64 h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + Int64 h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + Int64 h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + Int64 h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + Int64 carry0; + Int64 carry1; + Int64 carry2; + Int64 carry3; + Int64 carry4; + Int64 carry5; + Int64 carry6; + Int64 carry7; + Int64 carry8; + Int64 carry9; + + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + + carry1 = (h1 + (Int64)(1 << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (Int64)(1 << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + + carry2 = (h2 + (Int64)(1 << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (Int64)(1 << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + + carry3 = (h3 + (Int64)(1 << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (Int64)(1 << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry4 = (h4 + (Int64)(1 << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (Int64)(1 << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + carry9 = (h9 + (Int64)(1 << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + + carry0 = (h0 + (Int64)(1 << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + + h.x0 = (Int32)h0; + h.x1 = (Int32)h1; + h.x2 = (Int32)h2; + h.x3 = (Int32)h3; + h.x4 = (Int32)h4; + h.x5 = (Int32)h5; + h.x6 = (Int32)h6; + h.x7 = (Int32)h7; + h.x8 = (Int32)h8; + h.x9 = (Int32)h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sub.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sub.cs new file mode 100644 index 00000000..7eec1c60 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_sub.cs @@ -0,0 +1,63 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* + h = f - g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + + Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + */ + + internal static void fe_sub(out FieldElement h, ref FieldElement f, ref FieldElement g) + { + Int32 f0 = f.x0; + Int32 f1 = f.x1; + Int32 f2 = f.x2; + Int32 f3 = f.x3; + Int32 f4 = f.x4; + Int32 f5 = f.x5; + Int32 f6 = f.x6; + Int32 f7 = f.x7; + Int32 f8 = f.x8; + Int32 f9 = f.x9; + Int32 g0 = g.x0; + Int32 g1 = g.x1; + Int32 g2 = g.x2; + Int32 g3 = g.x3; + Int32 g4 = g.x4; + Int32 g5 = g.x5; + Int32 g6 = g.x6; + Int32 g7 = g.x7; + Int32 g8 = g.x8; + Int32 g9 = g.x9; + Int32 h0 = f0 - g0; + Int32 h1 = f1 - g1; + Int32 h2 = f2 - g2; + Int32 h3 = f3 - g3; + Int32 h4 = f4 - g4; + Int32 h5 = f5 - g5; + Int32 h6 = f6 - g6; + Int32 h7 = f7 - g7; + Int32 h8 = f8 - g8; + Int32 h9 = f9 - g9; + h.x0 = h0; + h.x1 = h1; + h.x2 = h2; + h.x3 = h3; + h.x4 = h4; + h.x5 = h5; + h.x6 = h6; + h.x7 = h7; + h.x8 = h8; + h.x9 = h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_tobytes.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_tobytes.cs new file mode 100644 index 00000000..27167e41 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/fe_tobytes.cs @@ -0,0 +1,154 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class FieldOperations + { + /* + Preconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + + Write p=2^255-19; q=floor(h/p). + Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + + Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0> 0); + s[offset + 1] = (byte) (h0 >> 8); + s[offset + 2] = (byte) (h0 >> 16); + s[offset + 3] = (byte) ((h0 >> 24) | (h1 << 2)); + s[offset + 4] = (byte) (h1 >> 6); + s[offset + 5] = (byte) (h1 >> 14); + s[offset + 6] = (byte) ((h1 >> 22) | (h2 << 3)); + s[offset + 7] = (byte) (h2 >> 5); + s[offset + 8] = (byte) (h2 >> 13); + s[offset + 9] = (byte) ((h2 >> 21) | (h3 << 5)); + s[offset + 10] = (byte) (h3 >> 3); + s[offset + 11] = (byte) (h3 >> 11); + s[offset + 12] = (byte) ((h3 >> 19) | (h4 << 6)); + s[offset + 13] = (byte) (h4 >> 2); + s[offset + 14] = (byte) (h4 >> 10); + s[offset + 15] = (byte) (h4 >> 18); + s[offset + 16] = (byte) (h5 >> 0); + s[offset + 17] = (byte) (h5 >> 8); + s[offset + 18] = (byte) (h5 >> 16); + s[offset + 19] = (byte) ((h5 >> 24) | (h6 << 1)); + s[offset + 20] = (byte) (h6 >> 7); + s[offset + 21] = (byte) (h6 >> 15); + s[offset + 22] = (byte) ((h6 >> 23) | (h7 << 3)); + s[offset + 23] = (byte) (h7 >> 5); + s[offset + 24] = (byte) (h7 >> 13); + s[offset + 25] = (byte) ((h7 >> 21) | (h8 << 4)); + s[offset + 26] = (byte) (h8 >> 4); + s[offset + 27] = (byte) (h8 >> 12); + s[offset + 28] = (byte) ((h8 >> 20) | (h9 << 6)); + s[offset + 29] = (byte) (h9 >> 2); + s[offset + 30] = (byte) (h9 >> 10); + s[offset + 31] = (byte) (h9 >> 18); + } + } + + internal static void fe_reduce(out FieldElement hr, ref FieldElement h) + { + Int32 h0 = h.x0; + Int32 h1 = h.x1; + Int32 h2 = h.x2; + Int32 h3 = h.x3; + Int32 h4 = h.x4; + Int32 h5 = h.x5; + Int32 h6 = h.x6; + Int32 h7 = h.x7; + Int32 h8 = h.x8; + Int32 h9 = h.x9; + Int32 q; + Int32 carry0; + Int32 carry1; + Int32 carry2; + Int32 carry3; + Int32 carry4; + Int32 carry5; + Int32 carry6; + Int32 carry7; + Int32 carry8; + Int32 carry9; + + q = (19 * h9 + (((Int32)1) << 24)) >> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + + carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26; + carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25; + carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26; + carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25; + carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26; + carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25; + carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26; + carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25; + carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26; + carry9 = h9 >> 25; h9 -= carry9 << 25; + /* h10 = carry9 */ + + hr.x0 = h0; + hr.x1 = h1; + hr.x2 = h2; + hr.x3 = h3; + hr.x4 = h4; + hr.x5 = h5; + hr.x6 = h6; + hr.x7 = h7; + hr.x8 = h8; + hr.x9 = h9; + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_add.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_add.cs new file mode 100644 index 00000000..9b1129c1 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_add.cs @@ -0,0 +1,113 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class GroupOperations + { + /* + r = p + q + */ + + internal static void ge_add(out GroupElementP1P1 r, ref GroupElementP3 p, ref GroupElementCached q) + { + FieldElement t0; + + /* qhasm: enter GroupElementadd */ + + /* qhasm: fe X1 */ + + /* qhasm: fe Y1 */ + + /* qhasm: fe Z1 */ + + /* qhasm: fe Z2 */ + + /* qhasm: fe T1 */ + + /* qhasm: fe ZZ */ + + /* qhasm: fe YpX2 */ + + /* qhasm: fe YmX2 */ + + /* qhasm: fe T2d2 */ + + /* qhasm: fe X3 */ + + /* qhasm: fe Y3 */ + + /* qhasm: fe Z3 */ + + /* qhasm: fe T3 */ + + /* qhasm: fe YpX1 */ + + /* qhasm: fe YmX1 */ + + /* qhasm: fe A */ + + /* qhasm: fe B */ + + /* qhasm: fe C */ + + /* qhasm: fe D */ + + /* qhasm: YpX1 = Y1+X1 */ + /* asm 1: fe_add(>YpX1=fe#1,YpX1=r.X,YmX1=fe#2,YmX1=r.Y,A=fe#3,A=r.Z,B=fe#2,B=r.Y,C=fe#4,C=r.T,ZZ=fe#1,ZZ=r.X,D=fe#5,D=t0,X3=fe#1,X3=r.X,Y3=fe#2,Y3=r.Y,Z3=fe#3,Z3=r.Z,T3=fe#4,T3=r.T,> 3] >> (i & 7))); + + for (i = 0; i < 256; ++i) + if (r[i] != 0) + { + for (b = 1; b <= 6 && i + b < 256; ++b) + { + if (r[i + b] != 0) + { + if (r[i] + (r[i + b] << b) <= 15) + { + r[i] += (sbyte)(r[i + b] << b); r[i + b] = 0; + } + else if (r[i] - (r[i + b] << b) >= -15) + { + r[i] -= (sbyte)(r[i + b] << b); + for (k = i + b; k < 256; ++k) + { + if (r[k] == 0) + { + r[k] = 1; + break; + } + r[k] = 0; + } + } + else + break; + } + } + } + + } + + /* + r = a * A + b * B + where a = a[0]+256*a[1]+...+256^31 a[31]. + and b = b[0]+256*b[1]+...+256^31 b[31]. + B is the Ed25519 base point (x,4/5) with x positive. + */ + + internal static void ge_double_scalarmult_vartime(out GroupElementP2 r, byte[] a, ref GroupElementP3 A, byte[] b) + { + GroupElementPreComp[] Bi = LookupTables.Base2; + // todo: Perhaps remove these allocations? + sbyte[] aslide = new sbyte[256]; + sbyte[] bslide = new sbyte[256]; + GroupElementCached[] Ai = new GroupElementCached[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ + GroupElementP1P1 t; + GroupElementP3 u; + GroupElementP3 A2; + int i; + + slide(aslide, a); + slide(bslide, b); + + ge_p3_to_cached(out Ai[0], ref A); + ge_p3_dbl(out t, ref A); ge_p1p1_to_p3(out A2, ref t); + ge_add(out t, ref A2, ref Ai[0]); ge_p1p1_to_p3(out u, ref t); ge_p3_to_cached(out Ai[1], ref u); + ge_add(out t, ref A2, ref Ai[1]); ge_p1p1_to_p3(out u, ref t); ge_p3_to_cached(out Ai[2], ref u); + ge_add(out t, ref A2, ref Ai[2]); ge_p1p1_to_p3(out u, ref t); ge_p3_to_cached(out Ai[3], ref u); + ge_add(out t, ref A2, ref Ai[3]); ge_p1p1_to_p3(out u, ref t); ge_p3_to_cached(out Ai[4], ref u); + ge_add(out t, ref A2, ref Ai[4]); ge_p1p1_to_p3(out u, ref t); ge_p3_to_cached(out Ai[5], ref u); + ge_add(out t, ref A2, ref Ai[5]); ge_p1p1_to_p3(out u, ref t); ge_p3_to_cached(out Ai[6], ref u); + ge_add(out t, ref A2, ref Ai[6]); ge_p1p1_to_p3(out u, ref t); ge_p3_to_cached(out Ai[7], ref u); + + ge_p2_0(out r); + + for (i = 255; i >= 0; --i) + { + if ((aslide[i] != 0) || (bslide[i] != 0)) break; + } + + for (; i >= 0; --i) + { + ge_p2_dbl(out t, ref r); + + if (aslide[i] > 0) + { + ge_p1p1_to_p3(out u, ref t); + ge_add(out t, ref u, ref Ai[aslide[i] / 2]); + } + else if (aslide[i] < 0) + { + ge_p1p1_to_p3(out u, ref t); + ge_sub(out t, ref u, ref Ai[(-aslide[i]) / 2]); + } + + if (bslide[i] > 0) + { + ge_p1p1_to_p3(out u, ref t); + ge_madd(out t, ref u, ref Bi[bslide[i] / 2]); + } + else if (bslide[i] < 0) + { + ge_p1p1_to_p3(out u, ref t); + ge_msub(out t, ref u, ref Bi[(-bslide[i]) / 2]); + } + + ge_p1p1_to_p2(out r, ref t); + } + } + + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_frombytes.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_frombytes.cs new file mode 100644 index 00000000..38bfcfeb --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_frombytes.cs @@ -0,0 +1,54 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class GroupOperations + { + internal static int ge_frombytes_negate_vartime(out GroupElementP3 h, byte[] data, int offset) + { + FieldElement u; + FieldElement v; + FieldElement v3; + FieldElement vxx; + FieldElement check; + + FieldOperations.fe_frombytes(out h.Y, data, offset); + FieldOperations.fe_1(out h.Z); + FieldOperations.fe_sq(out u, ref h.Y); + FieldOperations.fe_mul(out v, ref u, ref LookupTables.d); + FieldOperations.fe_sub(out u, ref u, ref h.Z); /* u = y^2-1 */ + FieldOperations.fe_add(out v, ref v, ref h.Z); /* v = dy^2+1 */ + + FieldOperations.fe_sq(out v3, ref v); + FieldOperations.fe_mul(out v3, ref v3, ref v); /* v3 = v^3 */ + FieldOperations.fe_sq(out h.X, ref v3); + FieldOperations.fe_mul(out h.X, ref h.X, ref v); + FieldOperations.fe_mul(out h.X, ref h.X, ref u); /* x = uv^7 */ + + FieldOperations.fe_pow22523(out h.X, ref h.X); /* x = (uv^7)^((q-5)/8) */ + FieldOperations.fe_mul(out h.X, ref h.X, ref v3); + FieldOperations.fe_mul(out h.X, ref h.X, ref u); /* x = uv^3(uv^7)^((q-5)/8) */ + + FieldOperations.fe_sq(out vxx, ref h.X); + FieldOperations.fe_mul(out vxx, ref vxx, ref v); + FieldOperations.fe_sub(out check, ref vxx, ref u); /* vx^2-u */ + if (FieldOperations.fe_isnonzero(ref check) != 0) + { + FieldOperations.fe_add(out check, ref vxx, ref u); /* vx^2+u */ + if (FieldOperations.fe_isnonzero(ref check) != 0) + { + h = default(GroupElementP3); + return -1; + } + FieldOperations.fe_mul(out h.X, ref h.X, ref LookupTables.sqrtm1); + } + + if (FieldOperations.fe_isnegative(ref h.X) == (data[offset + 31] >> 7)) + FieldOperations.fe_neg(out h.X, ref h.X); + + FieldOperations.fe_mul(out h.T, ref h.X, ref h.Y); + return 0; + } + + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_madd.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_madd.cs new file mode 100644 index 00000000..8832d3e9 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_madd.cs @@ -0,0 +1,105 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class GroupOperations + { + /* + r = p + q + */ + internal static void ge_madd(out GroupElementP1P1 r, ref GroupElementP3 p, ref GroupElementPreComp q) + { + FieldElement t0; + + /* qhasm: enter ge_madd */ + + /* qhasm: fe X1 */ + + /* qhasm: fe Y1 */ + + /* qhasm: fe Z1 */ + + /* qhasm: fe T1 */ + + /* qhasm: fe ypx2 */ + + /* qhasm: fe ymx2 */ + + /* qhasm: fe xy2d2 */ + + /* qhasm: fe X3 */ + + /* qhasm: fe Y3 */ + + /* qhasm: fe Z3 */ + + /* qhasm: fe T3 */ + + /* qhasm: fe YpX1 */ + + /* qhasm: fe YmX1 */ + + /* qhasm: fe A */ + + /* qhasm: fe B */ + + /* qhasm: fe C */ + + /* qhasm: fe D */ + + /* qhasm: YpX1 = Y1+X1 */ + /* asm 1: fe_add(>YpX1=fe#1,YpX1=r.X,YmX1=fe#2,YmX1=r.Y,A=fe#3,A=r.Z,B=fe#2,B=r.Y,C=fe#4,C=r.T,D=fe#5,D=t0,X3=fe#1,X3=r.X,Y3=fe#2,Y3=r.Y,Z3=fe#3,Z3=r.Z,T3=fe#4,T3=r.T,YpX1=fe#1,YpX1=r.X,YmX1=fe#2,YmX1=r.Y,A=fe#3,A=r.Z,B=fe#2,B=r.Y,C=fe#4,C=r.T,D=fe#5,D=t0,X3=fe#1,X3=r.X,Y3=fe#2,Y3=r.Y,Z3=fe#3,Z3=r.Z,T3=fe#4,T3=r.T,XX=fe#1,XX=r.X,YY=fe#3,YY=r.Z,B=fe#4,B=r.T,A=fe#2,A=r.Y,AA=fe#5,AA=t0,Y3=fe#2,Y3=r.Y,Z3=fe#3,Z3=r.Z,X3=fe#1,X3=r.X,T3=fe#4,T3=r.T,>= 31; /* 1: yes; 0: no */ + return (byte)y; + } + + static byte negative(sbyte b) + { + ulong x = unchecked((ulong)(long)b); /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ + x >>= 63; /* 1: yes; 0: no */ + return (byte)x; + } + + static void cmov(ref GroupElementPreComp t, ref GroupElementPreComp u, byte b) + { + FieldOperations.fe_cmov(ref t.yplusx, ref u.yplusx, b); + FieldOperations.fe_cmov(ref t.yminusx, ref u.yminusx, b); + FieldOperations.fe_cmov(ref t.xy2d, ref u.xy2d, b); + } + + static void select(out GroupElementPreComp t, int pos, sbyte b) + { + GroupElementPreComp minust; + byte bnegative = negative(b); + byte babs = (byte)(b - (((-bnegative) & b) << 1)); + + ge_precomp_0(out t); + var table = LookupTables.Base[pos]; + cmov(ref t, ref table[0], equal(babs, 1)); + cmov(ref t, ref table[1], equal(babs, 2)); + cmov(ref t, ref table[2], equal(babs, 3)); + cmov(ref t, ref table[3], equal(babs, 4)); + cmov(ref t, ref table[4], equal(babs, 5)); + cmov(ref t, ref table[5], equal(babs, 6)); + cmov(ref t, ref table[6], equal(babs, 7)); + cmov(ref t, ref table[7], equal(babs, 8)); + minust.yplusx = t.yminusx; + minust.yminusx = t.yplusx; + FieldOperations.fe_neg(out minust.xy2d, ref t.xy2d); + cmov(ref t, ref minust, bnegative); + } + + /* + h = a * B + where a = a[0]+256*a[1]+...+256^31 a[31] + B is the Ed25519 base point (x,4/5) with x positive. + + Preconditions: + a[31] <= 127 + */ + + internal static void ge_scalarmult_base(out GroupElementP3 h, byte[] a, int offset) + { + // todo: Perhaps remove this allocation + sbyte[] e = new sbyte[64]; + sbyte carry; + GroupElementP1P1 r; + GroupElementP2 s; + GroupElementPreComp t; + int i; + + for (i = 0; i < 32; ++i) + { + e[2 * i + 0] = (sbyte)((a[offset + i] >> 0) & 15); + e[2 * i + 1] = (sbyte)((a[offset + i] >> 4) & 15); + } + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + + carry = 0; + for (i = 0; i < 63; ++i) + { + e[i] += carry; + carry = (sbyte)(e[i] + 8); + carry >>= 4; + e[i] -= (sbyte)(carry << 4); + } + e[63] += carry; + /* each e[i] is between -8 and 8 */ + + ge_p3_0(out h); + for (i = 1; i < 64; i += 2) + { + select(out t, i / 2, e[i]); + ge_madd(out r, ref h, ref t); ge_p1p1_to_p3(out h, ref r); + } + + ge_p3_dbl(out r, ref h); ge_p1p1_to_p2(out s, ref r); + ge_p2_dbl(out r, ref s); ge_p1p1_to_p2(out s, ref r); + ge_p2_dbl(out r, ref s); ge_p1p1_to_p2(out s, ref r); + ge_p2_dbl(out r, ref s); ge_p1p1_to_p3(out h, ref r); + + for (i = 0; i < 64; i += 2) + { + select(out t, i / 2, e[i]); + ge_madd(out r, ref h, ref t); ge_p1p1_to_p3(out h, ref r); + } + } + + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_sub.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_sub.cs new file mode 100644 index 00000000..83cc5b27 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/ge_sub.cs @@ -0,0 +1,114 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class GroupOperations + { + /* + r = p - q + */ + + internal static void ge_sub(out GroupElementP1P1 r, ref GroupElementP3 p, ref GroupElementCached q) + { + FieldElement t0; + + /* qhasm: enter ge_sub */ + + /* qhasm: fe X1 */ + + /* qhasm: fe Y1 */ + + /* qhasm: fe Z1 */ + + /* qhasm: fe Z2 */ + + /* qhasm: fe T1 */ + + /* qhasm: fe ZZ */ + + /* qhasm: fe YpX2 */ + + /* qhasm: fe YmX2 */ + + /* qhasm: fe T2d2 */ + + /* qhasm: fe X3 */ + + /* qhasm: fe Y3 */ + + /* qhasm: fe Z3 */ + + /* qhasm: fe T3 */ + + /* qhasm: fe YpX1 */ + + /* qhasm: fe YmX1 */ + + /* qhasm: fe A */ + + /* qhasm: fe B */ + + /* qhasm: fe C */ + + /* qhasm: fe D */ + + /* qhasm: YpX1 = Y1+X1 */ + /* asm 1: fe_add(>YpX1=fe#1,YpX1=r.X,YmX1=fe#2,YmX1=r.Y,A=fe#3,A=r.Z,B=fe#2,B=r.Y,C=fe#4,C=r.T,ZZ=fe#1,ZZ=r.X,D=fe#5,D=t0,X3=fe#1,X3=r.X,Y3=fe#2,Y3=r.Y,Z3=fe#3,Z3=r.Z,T3=fe#4,T3=r.T,> 5); + Int64 a2 = 2097151 & (load_3(a, 5) >> 2); + Int64 a3 = 2097151 & (load_4(a, 7) >> 7); + Int64 a4 = 2097151 & (load_4(a, 10) >> 4); + Int64 a5 = 2097151 & (load_3(a, 13) >> 1); + Int64 a6 = 2097151 & (load_4(a, 15) >> 6); + Int64 a7 = 2097151 & (load_3(a, 18) >> 3); + Int64 a8 = 2097151 & load_3(a, 21); + Int64 a9 = 2097151 & (load_4(a, 23) >> 5); + Int64 a10 = 2097151 & (load_3(a, 26) >> 2); + Int64 a11 = (load_4(a, 28) >> 7); + Int64 b0 = 2097151 & load_3(b, 0); + Int64 b1 = 2097151 & (load_4(b, 2) >> 5); + Int64 b2 = 2097151 & (load_3(b, 5) >> 2); + Int64 b3 = 2097151 & (load_4(b, 7) >> 7); + Int64 b4 = 2097151 & (load_4(b, 10) >> 4); + Int64 b5 = 2097151 & (load_3(b, 13) >> 1); + Int64 b6 = 2097151 & (load_4(b, 15) >> 6); + Int64 b7 = 2097151 & (load_3(b, 18) >> 3); + Int64 b8 = 2097151 & load_3(b, 21); + Int64 b9 = 2097151 & (load_4(b, 23) >> 5); + Int64 b10 = 2097151 & (load_3(b, 26) >> 2); + Int64 b11 = (load_4(b, 28) >> 7); + Int64 c0 = 2097151 & load_3(c, 0); + Int64 c1 = 2097151 & (load_4(c, 2) >> 5); + Int64 c2 = 2097151 & (load_3(c, 5) >> 2); + Int64 c3 = 2097151 & (load_4(c, 7) >> 7); + Int64 c4 = 2097151 & (load_4(c, 10) >> 4); + Int64 c5 = 2097151 & (load_3(c, 13) >> 1); + Int64 c6 = 2097151 & (load_4(c, 15) >> 6); + Int64 c7 = 2097151 & (load_3(c, 18) >> 3); + Int64 c8 = 2097151 & load_3(c, 21); + Int64 c9 = 2097151 & (load_4(c, 23) >> 5); + Int64 c10 = 2097151 & (load_3(c, 26) >> 2); + Int64 c11 = (load_4(c, 28) >> 7); + Int64 s0; + Int64 s1; + Int64 s2; + Int64 s3; + Int64 s4; + Int64 s5; + Int64 s6; + Int64 s7; + Int64 s8; + Int64 s9; + Int64 s10; + Int64 s11; + Int64 s12; + Int64 s13; + Int64 s14; + Int64 s15; + Int64 s16; + Int64 s17; + Int64 s18; + Int64 s19; + Int64 s20; + Int64 s21; + Int64 s22; + Int64 s23; + Int64 carry0; + Int64 carry1; + Int64 carry2; + Int64 carry3; + Int64 carry4; + Int64 carry5; + Int64 carry6; + Int64 carry7; + Int64 carry8; + Int64 carry9; + Int64 carry10; + Int64 carry11; + Int64 carry12; + Int64 carry13; + Int64 carry14; + Int64 carry15; + Int64 carry16; + Int64 carry17; + Int64 carry18; + Int64 carry19; + Int64 carry20; + Int64 carry21; + Int64 carry22; + + s0 = c0 + a0 * b0; + s1 = c1 + a0 * b1 + a1 * b0; + s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; + s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; + s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; + s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; + s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; + s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; + s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0; + s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; + s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; + s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; + s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; + s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; + s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; + s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; + s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; + s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; + s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; + s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; + s20 = a9 * b11 + a10 * b10 + a11 * b9; + s21 = a10 * b11 + a11 * b10; + s22 = a11 * b11; + s23 = 0; + + carry0 = (s0 + (1 << 20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + carry18 = (s18 + (1 << 20)) >> 21; s19 += carry18; s18 -= carry18 << 21; + carry20 = (s20 + (1 << 20)) >> 21; s21 += carry20; s20 -= carry20 << 21; + carry22 = (s22 + (1 << 20)) >> 21; s23 += carry22; s22 -= carry22 << 21; + + carry1 = (s1 + (1 << 20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + carry17 = (s17 + (1 << 20)) >> 21; s18 += carry17; s17 -= carry17 << 21; + carry19 = (s19 + (1 << 20)) >> 21; s20 += carry19; s19 -= carry19 << 21; + carry21 = (s21 + (1 << 20)) >> 21; s22 += carry21; s21 -= carry21 << 21; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + + carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + + carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1 << 20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1 << 20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + unchecked + { + s[0] = (byte)(s0 >> 0); + s[1] = (byte)(s0 >> 8); + s[2] = (byte)((s0 >> 16) | (s1 << 5)); + s[3] = (byte)(s1 >> 3); + s[4] = (byte)(s1 >> 11); + s[5] = (byte)((s1 >> 19) | (s2 << 2)); + s[6] = (byte)(s2 >> 6); + s[7] = (byte)((s2 >> 14) | (s3 << 7)); + s[8] = (byte)(s3 >> 1); + s[9] = (byte)(s3 >> 9); + s[10] = (byte)((s3 >> 17) | (s4 << 4)); + s[11] = (byte)(s4 >> 4); + s[12] = (byte)(s4 >> 12); + s[13] = (byte)((s4 >> 20) | (s5 << 1)); + s[14] = (byte)(s5 >> 7); + s[15] = (byte)((s5 >> 15) | (s6 << 6)); + s[16] = (byte)(s6 >> 2); + s[17] = (byte)(s6 >> 10); + s[18] = (byte)((s6 >> 18) | (s7 << 3)); + s[19] = (byte)(s7 >> 5); + s[20] = (byte)(s7 >> 13); + s[21] = (byte)(s8 >> 0); + s[22] = (byte)(s8 >> 8); + s[23] = (byte)((s8 >> 16) | (s9 << 5)); + s[24] = (byte)(s9 >> 3); + s[25] = (byte)(s9 >> 11); + s[26] = (byte)((s9 >> 19) | (s10 << 2)); + s[27] = (byte)(s10 >> 6); + s[28] = (byte)((s10 >> 14) | (s11 << 7)); + s[29] = (byte)(s11 >> 1); + s[30] = (byte)(s11 >> 9); + s[31] = (byte)(s11 >> 17); + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sc_reduce.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sc_reduce.cs new file mode 100644 index 00000000..e310331f --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/sc_reduce.cs @@ -0,0 +1,263 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static partial class ScalarOperations + { + /* + Input: + s[0]+256*s[1]+...+256^63*s[63] = s + + Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + Overwrites s in place. + */ + + internal static void sc_reduce(byte[] s) + { + Int64 s0 = 2097151 & load_3(s, 0); + Int64 s1 = 2097151 & (load_4(s, 2) >> 5); + Int64 s2 = 2097151 & (load_3(s, 5) >> 2); + Int64 s3 = 2097151 & (load_4(s, 7) >> 7); + Int64 s4 = 2097151 & (load_4(s, 10) >> 4); + Int64 s5 = 2097151 & (load_3(s, 13) >> 1); + Int64 s6 = 2097151 & (load_4(s, 15) >> 6); + Int64 s7 = 2097151 & (load_3(s, 18) >> 3); + Int64 s8 = 2097151 & load_3(s, 21); + Int64 s9 = 2097151 & (load_4(s, 23) >> 5); + Int64 s10 = 2097151 & (load_3(s, 26) >> 2); + Int64 s11 = 2097151 & (load_4(s, 28) >> 7); + Int64 s12 = 2097151 & (load_4(s, 31) >> 4); + Int64 s13 = 2097151 & (load_3(s, 34) >> 1); + Int64 s14 = 2097151 & (load_4(s, 36) >> 6); + Int64 s15 = 2097151 & (load_3(s, 39) >> 3); + Int64 s16 = 2097151 & load_3(s, 42); + Int64 s17 = 2097151 & (load_4(s, 44) >> 5); + Int64 s18 = 2097151 & (load_3(s, 47) >> 2); + Int64 s19 = 2097151 & (load_4(s, 49) >> 7); + Int64 s20 = 2097151 & (load_4(s, 52) >> 4); + Int64 s21 = 2097151 & (load_3(s, 55) >> 1); + Int64 s22 = 2097151 & (load_4(s, 57) >> 6); + Int64 s23 = (load_4(s, 60) >> 3); + Int64 carry0; + Int64 carry1; + Int64 carry2; + Int64 carry3; + Int64 carry4; + Int64 carry5; + Int64 carry6; + Int64 carry7; + Int64 carry8; + Int64 carry9; + Int64 carry10; + Int64 carry11; + Int64 carry12; + Int64 carry13; + Int64 carry14; + Int64 carry15; + Int64 carry16; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + + carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + + carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1 << 20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1 << 20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + unchecked + { + s[0] = (byte)(s0 >> 0); + s[1] = (byte)(s0 >> 8); + s[2] = (byte)((s0 >> 16) | (s1 << 5)); + s[3] = (byte)(s1 >> 3); + s[4] = (byte)(s1 >> 11); + s[5] = (byte)((s1 >> 19) | (s2 << 2)); + s[6] = (byte)(s2 >> 6); + s[7] = (byte)((s2 >> 14) | (s3 << 7)); + s[8] = (byte)(s3 >> 1); + s[9] = (byte)(s3 >> 9); + s[10] = (byte)((s3 >> 17) | (s4 << 4)); + s[11] = (byte)(s4 >> 4); + s[12] = (byte)(s4 >> 12); + s[13] = (byte)((s4 >> 20) | (s5 << 1)); + s[14] = (byte)(s5 >> 7); + s[15] = (byte)((s5 >> 15) | (s6 << 6)); + s[16] = (byte)(s6 >> 2); + s[17] = (byte)(s6 >> 10); + s[18] = (byte)((s6 >> 18) | (s7 << 3)); + s[19] = (byte)(s7 >> 5); + s[20] = (byte)(s7 >> 13); + s[21] = (byte)(s8 >> 0); + s[22] = (byte)(s8 >> 8); + s[23] = (byte)((s8 >> 16) | (s9 << 5)); + s[24] = (byte)(s9 >> 3); + s[25] = (byte)(s9 >> 11); + s[26] = (byte)((s9 >> 19) | (s10 << 2)); + s[27] = (byte)(s10 >> 6); + s[28] = (byte)((s10 >> 14) | (s11 << 7)); + s[29] = (byte)(s11 >> 1); + s[30] = (byte)(s11 >> 9); + s[31] = (byte)(s11 >> 17); + } + } + + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/scalarmult.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/scalarmult.cs new file mode 100644 index 00000000..5c439da7 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Ed25519Ref10/scalarmult.cs @@ -0,0 +1,205 @@ +using System; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10 +{ + internal static class MontgomeryOperations + { + internal static void scalarmult( + byte[] q, int qoffset, + byte[] n, int noffset, + byte[] p, int poffset) + { + FieldElement p0; + FieldElement q0; + FieldOperations.fe_frombytes2(out p0, p, poffset); + scalarmult(out q0, n, noffset, ref p0); + FieldOperations.fe_tobytes(q, qoffset, ref q0); + } + + internal static void scalarmult( + out FieldElement q, + byte[] n, int noffset, + ref FieldElement p) + { + byte[] e = new byte[32];//ToDo: remove allocation + UInt32 i; + FieldElement x1; + FieldElement x2; + FieldElement z2; + FieldElement x3; + FieldElement z3; + FieldElement tmp0; + FieldElement tmp1; + int pos; + UInt32 swap; + UInt32 b; + + for (i = 0; i < 32; ++i) + e[i] = n[noffset + i]; + ScalarOperations.sc_clamp(e, 0); + x1 = p; + FieldOperations.fe_1(out x2); + FieldOperations.fe_0(out z2); + x3 = x1; + FieldOperations.fe_1(out z3); + + swap = 0; + for (pos = 254; pos >= 0; --pos) + { + b = (uint)(e[pos / 8] >> (pos & 7)); + b &= 1; + swap ^= b; + FieldOperations.fe_cswap(ref x2, ref x3, swap); + FieldOperations.fe_cswap(ref z2, ref z3, swap); + swap = b; + /* qhasm: fe X2 */ + + /* qhasm: fe Z2 */ + + /* qhasm: fe X3 */ + + /* qhasm: fe Z3 */ + + /* qhasm: fe X4 */ + + /* qhasm: fe Z4 */ + + /* qhasm: fe X5 */ + + /* qhasm: fe Z5 */ + + /* qhasm: fe A */ + + /* qhasm: fe B */ + + /* qhasm: fe C */ + + /* qhasm: fe D */ + + /* qhasm: fe E */ + + /* qhasm: fe AA */ + + /* qhasm: fe BB */ + + /* qhasm: fe DA */ + + /* qhasm: fe CB */ + + /* qhasm: fe t0 */ + + /* qhasm: fe t1 */ + + /* qhasm: fe t2 */ + + /* qhasm: fe t3 */ + + /* qhasm: fe t4 */ + + /* qhasm: enter ladder */ + + /* qhasm: D = X3-Z3 */ + /* asm 1: fe_sub(>D=fe#5,D=tmp0,B=fe#6,B=tmp1,A=fe#1,A=x2,C=fe#2,C=z2,DA=fe#4,DA=z3,CB=fe#2,CB=z2,BB=fe#5,BB=tmp0,AA=fe#6,AA=tmp1,t0=fe#3,t0=x3,t1=fe#2,t1=z2,X4=fe#1,X4=x2,E=fe#6,E=tmp1,t2=fe#2,t2=z2,t3=fe#4,t3=z3,X5=fe#3,X5=x3,t4=fe#5,t4=tmp0,Z5=fe#4,x1,Z5=z3,x1,Z4=fe#2,Z4=z2, key) + { + UInt32 t0, t1, t2, t3; + UInt32 h0, h1, h2, h3, h4; + UInt32 r0, r1, r2, r3, r4; + UInt32 s1, s2, s3, s4; + UInt32 b, nb; + int j; + UInt64 tt0, tt1, tt2, tt3, tt4; + UInt64 f0, f1, f2, f3; + UInt32 g0, g1, g2, g3, g4; + UInt64 c; + + /* clamp key */ + t0 = key.x0; + t1 = key.x1; + t2 = key.x2; + t3 = key.x3; + + /* precompute multipliers */ + r0 = t0 & 0x3ffffff; t0 >>= 26; t0 |= t1 << 6; + r1 = t0 & 0x3ffff03; t1 >>= 20; t1 |= t2 << 12; + r2 = t1 & 0x3ffc0ff; t2 >>= 14; t2 |= t3 << 18; + r3 = t2 & 0x3f03fff; t3 >>= 8; + r4 = t3 & 0x00fffff; + + s1 = r1 * 5; + s2 = r2 * 5; + s3 = r3 * 5; + s4 = r4 * 5; + + /* init state */ + h0 = 0; + h1 = 0; + h2 = 0; + h3 = 0; + h4 = 0; + + /* full blocks */ + if (mLength < 16) + goto poly1305_donna_atmost15bytes; + + poly1305_donna_16bytes: + mStart += 16; + mLength -= 16; + + t0 = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 16); + t1 = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 12); + t2 = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 8); + t3 = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 4); + + //todo: looks like these can be simplified a bit + h0 += t0 & 0x3ffffff; + h1 += (uint)(((((UInt64)t1 << 32) | t0) >> 26) & 0x3ffffff); + h2 += (uint)(((((UInt64)t2 << 32) | t1) >> 20) & 0x3ffffff); + h3 += (uint)(((((UInt64)t3 << 32) | t2) >> 14) & 0x3ffffff); + h4 += (t3 >> 8) | (1 << 24); + + + poly1305_donna_mul: + tt0 = (ulong)h0 * r0 + (ulong)h1 * s4 + (ulong)h2 * s3 + (ulong)h3 * s2 + (ulong)h4 * s1; + tt1 = (ulong)h0 * r1 + (ulong)h1 * r0 + (ulong)h2 * s4 + (ulong)h3 * s3 + (ulong)h4 * s2; + tt2 = (ulong)h0 * r2 + (ulong)h1 * r1 + (ulong)h2 * r0 + (ulong)h3 * s4 + (ulong)h4 * s3; + tt3 = (ulong)h0 * r3 + (ulong)h1 * r2 + (ulong)h2 * r1 + (ulong)h3 * r0 + (ulong)h4 * s4; + tt4 = (ulong)h0 * r4 + (ulong)h1 * r3 + (ulong)h2 * r2 + (ulong)h3 * r1 + (ulong)h4 * r0; + + unchecked + { + h0 = (UInt32)tt0 & 0x3ffffff; c = (tt0 >> 26); + tt1 += c; h1 = (UInt32)tt1 & 0x3ffffff; b = (UInt32)(tt1 >> 26); + tt2 += b; h2 = (UInt32)tt2 & 0x3ffffff; b = (UInt32)(tt2 >> 26); + tt3 += b; h3 = (UInt32)tt3 & 0x3ffffff; b = (UInt32)(tt3 >> 26); + tt4 += b; h4 = (UInt32)tt4 & 0x3ffffff; b = (UInt32)(tt4 >> 26); + } + h0 += b * 5; + + if (mLength >= 16) + goto poly1305_donna_16bytes; + + /* final bytes */ + poly1305_donna_atmost15bytes: + if (mLength == 0) + goto poly1305_donna_finish; + + byte[] mp = new byte[16];//todo remove allocation + + for (j = 0; j < mLength; j++) + mp[j] = m[mStart + j]; + mp[j++] = 1; + for (; j < 16; j++) + mp[j] = 0; + mLength = 0; + + t0 = ByteIntegerConverter.LoadLittleEndian32(mp, 0); + t1 = ByteIntegerConverter.LoadLittleEndian32(mp, 4); + t2 = ByteIntegerConverter.LoadLittleEndian32(mp, 8); + t3 = ByteIntegerConverter.LoadLittleEndian32(mp, 12); + CryptoBytes.Wipe(mp); + + h0 += t0 & 0x3ffffff; + h1 += (uint)(((((UInt64)t1 << 32) | t0) >> 26) & 0x3ffffff); + h2 += (uint)(((((UInt64)t2 << 32) | t1) >> 20) & 0x3ffffff); + h3 += (uint)(((((UInt64)t3 << 32) | t2) >> 14) & 0x3ffffff); + h4 += t3 >> 8; + + goto poly1305_donna_mul; + + poly1305_donna_finish: + b = h0 >> 26; h0 = h0 & 0x3ffffff; + h1 += b; b = h1 >> 26; h1 = h1 & 0x3ffffff; + h2 += b; b = h2 >> 26; h2 = h2 & 0x3ffffff; + h3 += b; b = h3 >> 26; h3 = h3 & 0x3ffffff; + h4 += b; b = h4 >> 26; h4 = h4 & 0x3ffffff; + h0 += b * 5; + + g0 = h0 + 5; b = g0 >> 26; g0 &= 0x3ffffff; + g1 = h1 + b; b = g1 >> 26; g1 &= 0x3ffffff; + g2 = h2 + b; b = g2 >> 26; g2 &= 0x3ffffff; + g3 = h3 + b; b = g3 >> 26; g3 &= 0x3ffffff; + g4 = unchecked(h4 + b - (1 << 26)); + + b = (g4 >> 31) - 1; + nb = ~b; + h0 = (h0 & nb) | (g0 & b); + h1 = (h1 & nb) | (g1 & b); + h2 = (h2 & nb) | (g2 & b); + h3 = (h3 & nb) | (g3 & b); + h4 = (h4 & nb) | (g4 & b); + + f0 = ((h0) | (h1 << 26)) + (UInt64)key.x4; + f1 = ((h1 >> 6) | (h2 << 20)) + (UInt64)key.x5; + f2 = ((h2 >> 12) | (h3 << 14)) + (UInt64)key.x6; + f3 = ((h3 >> 18) | (h4 << 8)) + (UInt64)key.x7; + + unchecked + { + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 0, (uint)f0); f1 += (f0 >> 32); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 4, (uint)f1); f2 += (f1 >> 32); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 8, (uint)f2); f3 += (f2 >> 32); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 12, (uint)f3); + } + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/Salsa20.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/Salsa20.cs new file mode 100644 index 00000000..4b74ad0c --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/Salsa20.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Salsa +{ + internal class Salsa20 + { + public const uint SalsaConst0 = 0x61707865; + public const uint SalsaConst1 = 0x3320646e; + public const uint SalsaConst2 = 0x79622d32; + public const uint SalsaConst3 = 0x6b206574; + + internal static void HSalsa20(byte[] output, int outputOffset, byte[] key, int keyOffset, byte[] nonce, int nonceOffset) + { + Array16 state; + state.x0 = SalsaConst0; + state.x1 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 0); + state.x2 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 4); + state.x3 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 8); + state.x4 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 12); + state.x5 = SalsaConst1; + state.x6 = ByteIntegerConverter.LoadLittleEndian32(nonce, nonceOffset + 0); + state.x7 = ByteIntegerConverter.LoadLittleEndian32(nonce, nonceOffset + 4); + state.x8 = ByteIntegerConverter.LoadLittleEndian32(nonce, nonceOffset + 8); + state.x9 = ByteIntegerConverter.LoadLittleEndian32(nonce, nonceOffset + 12); + state.x10 = SalsaConst2; + state.x11 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 16); + state.x12 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 20); + state.x13 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 24); + state.x14 = ByteIntegerConverter.LoadLittleEndian32(key, keyOffset + 28); + state.x15 = SalsaConst3; + + SalsaCore.HSalsa(out state, ref state, 20); + + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 0, state.x0); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 4, state.x5); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 8, state.x10); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 12, state.x15); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 16, state.x6); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 20, state.x7); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 24, state.x8); + ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 28, state.x9); + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/SalsaCore.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/SalsaCore.cs new file mode 100644 index 00000000..e539d668 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/SalsaCore.cs @@ -0,0 +1,263 @@ +using System; +using System.Collections.Generic; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Salsa +{ + internal static class SalsaCore + { + internal static void HSalsa(out Array16 output, ref Array16 input, int rounds) + { + InternalAssert.Assert(rounds % 2 == 0, "Number of salsa rounds must be even"); + + int doubleRounds = rounds / 2; + + UInt32 x0 = input.x0; + UInt32 x1 = input.x1; + UInt32 x2 = input.x2; + UInt32 x3 = input.x3; + UInt32 x4 = input.x4; + UInt32 x5 = input.x5; + UInt32 x6 = input.x6; + UInt32 x7 = input.x7; + UInt32 x8 = input.x8; + UInt32 x9 = input.x9; + UInt32 x10 = input.x10; + UInt32 x11 = input.x11; + UInt32 x12 = input.x12; + UInt32 x13 = input.x13; + UInt32 x14 = input.x14; + UInt32 x15 = input.x15; + + unchecked + { + for (int i = 0; i < doubleRounds; i++) + { + UInt32 y; + + // row 0 + y = x0 + x12; + x4 ^= (y << 7) | (y >> (32 - 7)); + y = x4 + x0; + x8 ^= (y << 9) | (y >> (32 - 9)); + y = x8 + x4; + x12 ^= (y << 13) | (y >> (32 - 13)); + y = x12 + x8; + x0 ^= (y << 18) | (y >> (32 - 18)); + + // row 1 + y = x5 + x1; + x9 ^= (y << 7) | (y >> (32 - 7)); + y = x9 + x5; + x13 ^= (y << 9) | (y >> (32 - 9)); + y = x13 + x9; + x1 ^= (y << 13) | (y >> (32 - 13)); + y = x1 + x13; + x5 ^= (y << 18) | (y >> (32 - 18)); + + // row 2 + y = x10 + x6; + x14 ^= (y << 7) | (y >> (32 - 7)); + y = x14 + x10; + x2 ^= (y << 9) | (y >> (32 - 9)); + y = x2 + x14; + x6 ^= (y << 13) | (y >> (32 - 13)); + y = x6 + x2; + x10 ^= (y << 18) | (y >> (32 - 18)); + + // row 3 + y = x15 + x11; + x3 ^= (y << 7) | (y >> (32 - 7)); + y = x3 + x15; + x7 ^= (y << 9) | (y >> (32 - 9)); + y = x7 + x3; + x11 ^= (y << 13) | (y >> (32 - 13)); + y = x11 + x7; + x15 ^= (y << 18) | (y >> (32 - 18)); + + // column 0 + y = x0 + x3; + x1 ^= (y << 7) | (y >> (32 - 7)); + y = x1 + x0; + x2 ^= (y << 9) | (y >> (32 - 9)); + y = x2 + x1; + x3 ^= (y << 13) | (y >> (32 - 13)); + y = x3 + x2; + x0 ^= (y << 18) | (y >> (32 - 18)); + + // column 1 + y = x5 + x4; + x6 ^= (y << 7) | (y >> (32 - 7)); + y = x6 + x5; + x7 ^= (y << 9) | (y >> (32 - 9)); + y = x7 + x6; + x4 ^= (y << 13) | (y >> (32 - 13)); + y = x4 + x7; + x5 ^= (y << 18) | (y >> (32 - 18)); + + // column 2 + y = x10 + x9; + x11 ^= (y << 7) | (y >> (32 - 7)); + y = x11 + x10; + x8 ^= (y << 9) | (y >> (32 - 9)); + y = x8 + x11; + x9 ^= (y << 13) | (y >> (32 - 13)); + y = x9 + x8; + x10 ^= (y << 18) | (y >> (32 - 18)); + + // column 3 + y = x15 + x14; + x12 ^= (y << 7) | (y >> (32 - 7)); + y = x12 + x15; + x13 ^= (y << 9) | (y >> (32 - 9)); + y = x13 + x12; + x14 ^= (y << 13) | (y >> (32 - 13)); + y = x14 + x13; + x15 ^= (y << 18) | (y >> (32 - 18)); + } + } + + output.x0 = x0; + output.x1 = x1; + output.x2 = x2; + output.x3 = x3; + output.x4 = x4; + output.x5 = x5; + output.x6 = x6; + output.x7 = x7; + output.x8 = x8; + output.x9 = x9; + output.x10 = x10; + output.x11 = x11; + output.x12 = x12; + output.x13 = x13; + output.x14 = x14; + output.x15 = x15; + } + + internal static void Salsa(out Array16 output, ref Array16 input, int rounds) + { + Array16 temp; + HSalsa(out temp, ref input, rounds); + unchecked + { + output.x0 = temp.x0 + input.x0; + output.x1 = temp.x1 + input.x1; + output.x2 = temp.x2 + input.x2; + output.x3 = temp.x3 + input.x3; + output.x4 = temp.x4 + input.x4; + output.x5 = temp.x5 + input.x5; + output.x6 = temp.x6 + input.x6; + output.x7 = temp.x7 + input.x7; + output.x8 = temp.x8 + input.x8; + output.x9 = temp.x9 + input.x9; + output.x10 = temp.x10 + input.x10; + output.x11 = temp.x11 + input.x11; + output.x12 = temp.x12 + input.x12; + output.x13 = temp.x13 + input.x13; + output.x14 = temp.x14 + input.x14; + output.x15 = temp.x15 + input.x15; + } + } + + /*internal static void SalsaCore(int[] output, int outputOffset, int[] input, int inputOffset, int rounds) + { + if (rounds % 2 != 0) + throw new ArgumentException("rounds must be even"); + } + + +static void store_littleendian(unsigned char *x,uint32 u) +{ + x[0] = u; u >>= 8; + x[1] = u; u >>= 8; + x[2] = u; u >>= 8; + x[3] = u; +} + + internal static void HSalsaCore(int[] output, int outputOffset, int[] input, int inputOffset, int rounds) + { + if (rounds % 2 != 0) + throw new ArgumentException("rounds must be even"); + static uint32 rotate(uint32 u,int c) +{ + return (u << c) | (u >> (32 - c)); +} + + + +int crypto_core( + unsigned char *out, + const unsigned char *in, + const unsigned char *k, + const unsigned char *c +) +{ + uint32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + int i; + + x0 = load_littleendian(c + 0); + x1 = load_littleendian(k + 0); + x2 = load_littleendian(k + 4); + x3 = load_littleendian(k + 8); + x4 = load_littleendian(k + 12); + x5 = load_littleendian(c + 4); + x6 = load_littleendian(in + 0); + x7 = load_littleendian(in + 4); + x8 = load_littleendian(in + 8); + x9 = load_littleendian(in + 12); + x10 = load_littleendian(c + 8); + x11 = load_littleendian(k + 16); + x12 = load_littleendian(k + 20); + x13 = load_littleendian(k + 24); + x14 = load_littleendian(k + 28); + x15 = load_littleendian(c + 12); + + for (i = ROUNDS;i > 0;i -= 2) { + x4 ^= rotate( x0+x12, 7); + x8 ^= rotate( x4+ x0, 9); + x12 ^= rotate( x8+ x4,13); + x0 ^= rotate(x12+ x8,18); + x9 ^= rotate( x5+ x1, 7); + x13 ^= rotate( x9+ x5, 9); + x1 ^= rotate(x13+ x9,13); + x5 ^= rotate( x1+x13,18); + x14 ^= rotate(x10+ x6, 7); + x2 ^= rotate(x14+x10, 9); + x6 ^= rotate( x2+x14,13); + x10 ^= rotate( x6+ x2,18); + x3 ^= rotate(x15+x11, 7); + x7 ^= rotate( x3+x15, 9); + x11 ^= rotate( x7+ x3,13); + x15 ^= rotate(x11+ x7,18); + x1 ^= rotate( x0+ x3, 7); + x2 ^= rotate( x1+ x0, 9); + x3 ^= rotate( x2+ x1,13); + x0 ^= rotate( x3+ x2,18); + x6 ^= rotate( x5+ x4, 7); + x7 ^= rotate( x6+ x5, 9); + x4 ^= rotate( x7+ x6,13); + x5 ^= rotate( x4+ x7,18); + x11 ^= rotate(x10+ x9, 7); + x8 ^= rotate(x11+x10, 9); + x9 ^= rotate( x8+x11,13); + x10 ^= rotate( x9+ x8,18); + x12 ^= rotate(x15+x14, 7); + x13 ^= rotate(x12+x15, 9); + x14 ^= rotate(x13+x12,13); + x15 ^= rotate(x14+x13,18); + } + + store_littleendian(out + 0,x0); + store_littleendian(out + 4,x5); + store_littleendian(out + 8,x10); + store_littleendian(out + 12,x15); + store_littleendian(out + 16,x6); + store_littleendian(out + 20,x7); + store_littleendian(out + 24,x8); + store_littleendian(out + 28,x9); + + return 0; +}*/ + + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/replace regex.txt b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/replace regex.txt new file mode 100644 index 00000000..f4856899 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Salsa/replace regex.txt @@ -0,0 +1,2 @@ +x(\d+) ^= rotate\((.+), (\d+)\); +y = \2;\r\nx\1 ^= (y << \3) | (y >> (32 - \3)); \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Sha512Internal.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Sha512Internal.cs new file mode 100644 index 00000000..0f05d5ed --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Internal/Sha512Internal.cs @@ -0,0 +1,447 @@ +using System; +using System.Collections.Generic; + +namespace Renci.SshNet.Security.Chaos.NaCl.Internal +{ + internal static class Sha512Internal + { + private static readonly UInt64[] K = new UInt64[] + { + 0x428a2f98d728ae22,0x7137449123ef65cd,0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc, + 0x3956c25bf348b538,0x59f111f1b605d019,0x923f82a4af194f9b,0xab1c5ed5da6d8118, + 0xd807aa98a3030242,0x12835b0145706fbe,0x243185be4ee4b28c,0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f,0x80deb1fe3b1696b1,0x9bdc06a725c71235,0xc19bf174cf692694, + 0xe49b69c19ef14ad2,0xefbe4786384f25e3,0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65, + 0x2de92c6f592b0275,0x4a7484aa6ea6e483,0x5cb0a9dcbd41fbd4,0x76f988da831153b5, + 0x983e5152ee66dfab,0xa831c66d2db43210,0xb00327c898fb213f,0xbf597fc7beef0ee4, + 0xc6e00bf33da88fc2,0xd5a79147930aa725,0x06ca6351e003826f,0x142929670a0e6e70, + 0x27b70a8546d22ffc,0x2e1b21385c26c926,0x4d2c6dfc5ac42aed,0x53380d139d95b3df, + 0x650a73548baf63de,0x766a0abb3c77b2a8,0x81c2c92e47edaee6,0x92722c851482353b, + 0xa2bfe8a14cf10364,0xa81a664bbc423001,0xc24b8b70d0f89791,0xc76c51a30654be30, + 0xd192e819d6ef5218,0xd69906245565a910,0xf40e35855771202a,0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8,0x1e376c085141ab53,0x2748774cdf8eeb99,0x34b0bcb5e19b48a8, + 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb,0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3, + 0x748f82ee5defb2fc,0x78a5636f43172f60,0x84c87814a1f0ab72,0x8cc702081a6439ec, + 0x90befffa23631e28,0xa4506cebde82bde9,0xbef9a3f7b2c67915,0xc67178f2e372532b, + 0xca273eceea26619c,0xd186b8c721c0c207,0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178, + 0x06f067aa72176fba,0x0a637dc5a2c898a6,0x113f9804bef90dae,0x1b710b35131c471b, + 0x28db77f523047d84,0x32caab7b40c72493,0x3c9ebe0a15c9bebc,0x431d67c49c100d4c, + 0x4cc5d4becb3e42b6,0x597f299cfc657e2a,0x5fcb6fab3ad6faec,0x6c44198c4a475817 + }; + + internal static void Sha512Init(out Array8 state) + { + state.x0 = 0x6a09e667f3bcc908; + state.x1 = 0xbb67ae8584caa73b; + state.x2 = 0x3c6ef372fe94f82b; + state.x3 = 0xa54ff53a5f1d36f1; + state.x4 = 0x510e527fade682d1; + state.x5 = 0x9b05688c2b3e6c1f; + state.x6 = 0x1f83d9abfb41bd6b; + state.x7 = 0x5be0cd19137e2179; + } + + internal static void Core(out Array8 outputState, ref Array8 inputState, ref Array16 input) + { + unchecked + { + UInt64 a = inputState.x0; + UInt64 b = inputState.x1; + UInt64 c = inputState.x2; + UInt64 d = inputState.x3; + UInt64 e = inputState.x4; + UInt64 f = inputState.x5; + UInt64 g = inputState.x6; + UInt64 h = inputState.x7; + + UInt64 w0 = input.x0; + UInt64 w1 = input.x1; + UInt64 w2 = input.x2; + UInt64 w3 = input.x3; + UInt64 w4 = input.x4; + UInt64 w5 = input.x5; + UInt64 w6 = input.x6; + UInt64 w7 = input.x7; + UInt64 w8 = input.x8; + UInt64 w9 = input.x9; + UInt64 w10 = input.x10; + UInt64 w11 = input.x11; + UInt64 w12 = input.x12; + UInt64 w13 = input.x13; + UInt64 w14 = input.x14; + UInt64 w15 = input.x15; + + int t = 0; + while (true) + { + ulong t1, t2; + + {//0 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w0; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//1 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w1; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//2 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w2; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//3 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w3; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//4 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w4; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//5 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w5; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//6 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w6; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//7 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w7; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//8 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w8; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//9 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w9; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//10 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w10; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//11 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w11; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//12 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w12; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//13 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w13; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//14 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w14; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + {//15 + t1 = h + + ((e >> 14) ^ (e << (64 - 14)) ^ (e >> 18) ^ (e << (64 - 18)) ^ (e >> 41) ^ (e << (64 - 41))) + + //Sigma1(e) + ((e & f) ^ (~e & g)) + //Ch(e,f,g) + K[t] + w15; + t2 = ((a >> 28) ^ (a << (64 - 28)) ^ (a >> 34) ^ (a << (64 - 34)) ^ (a >> 39) ^ (a << (64 - 39))) + + //Sigma0(a) + ((a & b) ^ (a & c) ^ (b & c)); //Maj(a,b,c) + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + t++; + } + if (t == 80) + break; + + w0 += ((w14 >> 19) ^ (w14 << (64 - 19)) ^ (w14 >> 61) ^ (w14 << (64 - 61)) ^ (w14 >> 6)) + + w9 + + ((w1 >> 1) ^ (w1 << (64 - 1)) ^ (w1 >> 8) ^ (w1 << (64 - 8)) ^ (w1 >> 7)); + w1 += ((w15 >> 19) ^ (w15 << (64 - 19)) ^ (w15 >> 61) ^ (w15 << (64 - 61)) ^ (w15 >> 6)) + + w10 + + ((w2 >> 1) ^ (w2 << (64 - 1)) ^ (w2 >> 8) ^ (w2 << (64 - 8)) ^ (w2 >> 7)); + w2 += ((w0 >> 19) ^ (w0 << (64 - 19)) ^ (w0 >> 61) ^ (w0 << (64 - 61)) ^ (w0 >> 6)) + + w11 + + ((w3 >> 1) ^ (w3 << (64 - 1)) ^ (w3 >> 8) ^ (w3 << (64 - 8)) ^ (w3 >> 7)); + w3 += ((w1 >> 19) ^ (w1 << (64 - 19)) ^ (w1 >> 61) ^ (w1 << (64 - 61)) ^ (w1 >> 6)) + + w12 + + ((w4 >> 1) ^ (w4 << (64 - 1)) ^ (w4 >> 8) ^ (w4 << (64 - 8)) ^ (w4 >> 7)); + w4 += ((w2 >> 19) ^ (w2 << (64 - 19)) ^ (w2 >> 61) ^ (w2 << (64 - 61)) ^ (w2 >> 6)) + + w13 + + ((w5 >> 1) ^ (w5 << (64 - 1)) ^ (w5 >> 8) ^ (w5 << (64 - 8)) ^ (w5 >> 7)); + w5 += ((w3 >> 19) ^ (w3 << (64 - 19)) ^ (w3 >> 61) ^ (w3 << (64 - 61)) ^ (w3 >> 6)) + + w14 + + ((w6 >> 1) ^ (w6 << (64 - 1)) ^ (w6 >> 8) ^ (w6 << (64 - 8)) ^ (w6 >> 7)); + w6 += ((w4 >> 19) ^ (w4 << (64 - 19)) ^ (w4 >> 61) ^ (w4 << (64 - 61)) ^ (w4 >> 6)) + + w15 + + ((w7 >> 1) ^ (w7 << (64 - 1)) ^ (w7 >> 8) ^ (w7 << (64 - 8)) ^ (w7 >> 7)); + w7 += ((w5 >> 19) ^ (w5 << (64 - 19)) ^ (w5 >> 61) ^ (w5 << (64 - 61)) ^ (w5 >> 6)) + + w0 + + ((w8 >> 1) ^ (w8 << (64 - 1)) ^ (w8 >> 8) ^ (w8 << (64 - 8)) ^ (w8 >> 7)); + w8 += ((w6 >> 19) ^ (w6 << (64 - 19)) ^ (w6 >> 61) ^ (w6 << (64 - 61)) ^ (w6 >> 6)) + + w1 + + ((w9 >> 1) ^ (w9 << (64 - 1)) ^ (w9 >> 8) ^ (w9 << (64 - 8)) ^ (w9 >> 7)); + w9 += ((w7 >> 19) ^ (w7 << (64 - 19)) ^ (w7 >> 61) ^ (w7 << (64 - 61)) ^ (w7 >> 6)) + + w2 + + ((w10 >> 1) ^ (w10 << (64 - 1)) ^ (w10 >> 8) ^ (w10 << (64 - 8)) ^ (w10 >> 7)); + w10 += ((w8 >> 19) ^ (w8 << (64 - 19)) ^ (w8 >> 61) ^ (w8 << (64 - 61)) ^ (w8 >> 6)) + + w3 + + ((w11 >> 1) ^ (w11 << (64 - 1)) ^ (w11 >> 8) ^ (w11 << (64 - 8)) ^ (w11 >> 7)); + w11 += ((w9 >> 19) ^ (w9 << (64 - 19)) ^ (w9 >> 61) ^ (w9 << (64 - 61)) ^ (w9 >> 6)) + + w4 + + ((w12 >> 1) ^ (w12 << (64 - 1)) ^ (w12 >> 8) ^ (w12 << (64 - 8)) ^ (w12 >> 7)); + w12 += ((w10 >> 19) ^ (w10 << (64 - 19)) ^ (w10 >> 61) ^ (w10 << (64 - 61)) ^ (w10 >> 6)) + + w5 + + ((w13 >> 1) ^ (w13 << (64 - 1)) ^ (w13 >> 8) ^ (w13 << (64 - 8)) ^ (w13 >> 7)); + w13 += ((w11 >> 19) ^ (w11 << (64 - 19)) ^ (w11 >> 61) ^ (w11 << (64 - 61)) ^ (w11 >> 6)) + + w6 + + ((w14 >> 1) ^ (w14 << (64 - 1)) ^ (w14 >> 8) ^ (w14 << (64 - 8)) ^ (w14 >> 7)); + w14 += ((w12 >> 19) ^ (w12 << (64 - 19)) ^ (w12 >> 61) ^ (w12 << (64 - 61)) ^ (w12 >> 6)) + + w7 + + ((w15 >> 1) ^ (w15 << (64 - 1)) ^ (w15 >> 8) ^ (w15 << (64 - 8)) ^ (w15 >> 7)); + w15 += ((w13 >> 19) ^ (w13 << (64 - 19)) ^ (w13 >> 61) ^ (w13 << (64 - 61)) ^ (w13 >> 6)) + + w8 + + ((w0 >> 1) ^ (w0 << (64 - 1)) ^ (w0 >> 8) ^ (w0 << (64 - 8)) ^ (w0 >> 7)); + } + + outputState.x0 = inputState.x0 + a; + outputState.x1 = inputState.x1 + b; + outputState.x2 = inputState.x2 + c; + outputState.x3 = inputState.x3 + d; + outputState.x4 = inputState.x4 + e; + outputState.x5 = inputState.x5 + f; + outputState.x6 = inputState.x6 + g; + outputState.x7 = inputState.x7 + h; + } + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/License.txt b/src/Renci.SshNet/Security/Chaos.NaCl/License.txt new file mode 100644 index 00000000..fa608d14 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/License.txt @@ -0,0 +1,23 @@ +Public domain + +C# port + code by Christian Winnerlein (CodesInChaos) + +Poly1305 in c + written by Andrew M. (floodyberry) + original license: MIT or PUBLIC DOMAIN + https://github.com/floodyberry/poly1305-donna/blob/master/poly1305-donna-unrolled.c + +Curve25519 and Ed25519 in c + written by Dan Bernstein (djb) + public domain + from Ref10 in SUPERCOP http://bench.cr.yp.to/supercop.html + +(H)Salsa20 in c + written by Dan Bernstein (djb) + public domain + from SUPERCOP http://bench.cr.yp.to/supercop.html + +SHA512 + written by Christian Winnerlein (CodesInChaos) + public domain + directly from the specification \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/MontgomeryCurve25519.cs b/src/Renci.SshNet/Security/Chaos.NaCl/MontgomeryCurve25519.cs new file mode 100644 index 00000000..2b99ce55 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/MontgomeryCurve25519.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using Renci.SshNet.Security.Chaos.NaCl.Internal; +using Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10; +using Renci.SshNet.Security.Chaos.NaCl.Internal.Salsa; + +namespace Renci.SshNet.Security.Chaos.NaCl +{ + // This class is mainly for compatibility with NaCl's Curve25519 implementation + // If you don't need that compatibility, use Ed25519.KeyExchange + internal static class MontgomeryCurve25519 + { + internal static readonly int PublicKeySizeInBytes = 32; + internal static readonly int PrivateKeySizeInBytes = 32; + internal static readonly int SharedKeySizeInBytes = 32; + + internal static byte[] GetPublicKey(byte[] privateKey) + { + if (privateKey == null) + throw new ArgumentNullException("privateKey"); + if (privateKey.Length != PrivateKeySizeInBytes) + throw new ArgumentException("privateKey.Length must be 32"); + var publicKey = new byte[32]; + GetPublicKey(new ArraySegment(publicKey), new ArraySegment(privateKey)); + return publicKey; + } + + static readonly byte[] _basePoint = new byte[32] + { + 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 ,0, 0, 0, 0, 0, + 0, 0, 0 ,0, 0, 0, 0, 0, + 0, 0, 0 ,0, 0, 0, 0, 0 + }; + + internal static void GetPublicKey(ArraySegment publicKey, ArraySegment privateKey) + { + if (publicKey.Array == null) + throw new ArgumentNullException("publicKey.Array"); + if (privateKey.Array == null) + throw new ArgumentNullException("privateKey.Array"); + if (publicKey.Count != PublicKeySizeInBytes) + throw new ArgumentException("privateKey.Count must be 32"); + if (privateKey.Count != PrivateKeySizeInBytes) + throw new ArgumentException("privateKey.Count must be 32"); + + // hack: abusing publicKey as temporary storage + // todo: remove hack + for (int i = 0; i < 32; i++) + { + publicKey.Array[publicKey.Offset + i] = privateKey.Array[privateKey.Offset + i]; + } + ScalarOperations.sc_clamp(publicKey.Array, publicKey.Offset); + + GroupElementP3 A; + GroupOperations.ge_scalarmult_base(out A, publicKey.Array, publicKey.Offset); + FieldElement publicKeyFE; + EdwardsToMontgomeryX(out publicKeyFE, ref A.Y, ref A.Z); + FieldOperations.fe_tobytes(publicKey.Array, publicKey.Offset, ref publicKeyFE); + } + + // hashes like the Curve25519 paper says + internal static void KeyExchangeOutputHashCurve25519Paper(byte[] sharedKey, int offset) + { + //c = Curve25519output + const UInt32 c0 = 'C' | 'u' << 8 | 'r' << 16 | (UInt32)'v' << 24; + const UInt32 c1 = 'e' | '2' << 8 | '5' << 16 | (UInt32)'5' << 24; + const UInt32 c2 = '1' | '9' << 8 | 'o' << 16 | (UInt32)'u' << 24; + const UInt32 c3 = 't' | 'p' << 8 | 'u' << 16 | (UInt32)'t' << 24; + + Array16 salsaState; + salsaState.x0 = c0; + salsaState.x1 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 0); + salsaState.x2 = 0; + salsaState.x3 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 4); + salsaState.x4 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 8); + salsaState.x5 = c1; + salsaState.x6 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 12); + salsaState.x7 = 0; + salsaState.x8 = 0; + salsaState.x9 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 16); + salsaState.x10 = c2; + salsaState.x11 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 20); + salsaState.x12 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 24); + salsaState.x13 = 0; + salsaState.x14 = ByteIntegerConverter.LoadLittleEndian32(sharedKey, offset + 28); + salsaState.x15 = c3; + SalsaCore.Salsa(out salsaState, ref salsaState, 20); + + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 0, salsaState.x0); + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 4, salsaState.x1); + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 8, salsaState.x2); + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 12, salsaState.x3); + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 16, salsaState.x4); + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 20, salsaState.x5); + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 24, salsaState.x6); + ByteIntegerConverter.StoreLittleEndian32(sharedKey, offset + 28, salsaState.x7); + } + + private static readonly byte[] _zero16 = new byte[16]; + + // hashes like the NaCl paper says instead i.e. HSalsa(x,0) + internal static void KeyExchangeOutputHashNaCl(byte[] sharedKey, int offset) + { + Salsa20.HSalsa20(sharedKey, offset, sharedKey, offset, _zero16, 0); + } + + internal static byte[] KeyExchange(byte[] publicKey, byte[] privateKey) + { + var sharedKey = new byte[SharedKeySizeInBytes]; + KeyExchange(new ArraySegment(sharedKey), new ArraySegment(publicKey), new ArraySegment(privateKey)); + return sharedKey; + } + + internal static void KeyExchange(ArraySegment sharedKey, ArraySegment publicKey, ArraySegment privateKey) + { + if (sharedKey.Array == null) + throw new ArgumentNullException("sharedKey.Array"); + if (publicKey.Array == null) + throw new ArgumentNullException("publicKey.Array"); + if (privateKey.Array == null) + throw new ArgumentNullException("privateKey"); + if (sharedKey.Count != 32) + throw new ArgumentException("sharedKey.Count != 32"); + if (publicKey.Count != 32) + throw new ArgumentException("publicKey.Count != 32"); + if (privateKey.Count != 32) + throw new ArgumentException("privateKey.Count != 32"); + MontgomeryOperations.scalarmult(sharedKey.Array, sharedKey.Offset, privateKey.Array, privateKey.Offset, publicKey.Array, publicKey.Offset); + KeyExchangeOutputHashNaCl(sharedKey.Array, sharedKey.Offset); + } + + internal static void EdwardsToMontgomeryX(out FieldElement montgomeryX, ref FieldElement edwardsY, ref FieldElement edwardsZ) + { + FieldElement tempX, tempZ; + FieldOperations.fe_add(out tempX, ref edwardsZ, ref edwardsY); + FieldOperations.fe_sub(out tempZ, ref edwardsZ, ref edwardsY); + FieldOperations.fe_invert(out tempZ, ref tempZ); + FieldOperations.fe_mul(out montgomeryX, ref tempX, ref tempZ); + } + } +} diff --git a/src/Renci.SshNet/Security/Chaos.NaCl/Sha512.cs b/src/Renci.SshNet/Security/Chaos.NaCl/Sha512.cs new file mode 100644 index 00000000..f68d6ab8 --- /dev/null +++ b/src/Renci.SshNet/Security/Chaos.NaCl/Sha512.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using Renci.SshNet.Security.Chaos.NaCl.Internal; + +namespace Renci.SshNet.Security.Chaos.NaCl +{ + internal class Sha512 + { + private Array8 _state; + private readonly byte[] _buffer; + private ulong _totalBytes; + public const int BlockSize = 128; + private static readonly byte[] _padding = new byte[] { 0x80 }; + + public Sha512() + { + _buffer = new byte[BlockSize];//todo: remove allocation + Init(); + } + + public void Init() + { + Sha512Internal.Sha512Init(out _state); + _totalBytes = 0; + } + + public void Update(ArraySegment data) + { + if (data.Array == null) + throw new ArgumentNullException("data.Array"); + Update(data.Array, data.Offset, data.Count); + } + + public void Update(byte[] data, int offset, int count) + { + if (data == null) + throw new ArgumentNullException("data"); + if (offset < 0) + throw new ArgumentOutOfRangeException("offset"); + if (count < 0) + throw new ArgumentOutOfRangeException("count"); + if (data.Length - offset < count) + throw new ArgumentException("Requires offset + count <= data.Length"); + + Array16 block; + int bytesInBuffer = (int)_totalBytes & (BlockSize - 1); + _totalBytes += (uint)count; + + if (_totalBytes >= ulong.MaxValue / 8) + throw new InvalidOperationException("Too much data"); + // Fill existing buffer + if (bytesInBuffer != 0) + { + var toCopy = Math.Min(BlockSize - bytesInBuffer, count); + Buffer.BlockCopy(data, offset, _buffer, bytesInBuffer, toCopy); + offset += toCopy; + count -= toCopy; + bytesInBuffer += toCopy; + if (bytesInBuffer == BlockSize) + { + ByteIntegerConverter.Array16LoadBigEndian64(out block, _buffer, 0); + Sha512Internal.Core(out _state, ref _state, ref block); + CryptoBytes.InternalWipe(_buffer, 0, _buffer.Length); + bytesInBuffer = 0; + } + } + // Hash complete blocks without copying + while (count >= BlockSize) + { + ByteIntegerConverter.Array16LoadBigEndian64(out block, data, offset); + Sha512Internal.Core(out _state, ref _state, ref block); + offset += BlockSize; + count -= BlockSize; + } + // Copy remainder into buffer + if (count > 0) + { + Buffer.BlockCopy(data, offset, _buffer, bytesInBuffer, count); + } + } + + public void Finish(ArraySegment output) + { + if (output.Array == null) + throw new ArgumentNullException("output.Array"); + if (output.Count != 64) + throw new ArgumentException("output.Count must be 64"); + + Update(_padding, 0, _padding.Length); + Array16 block; + ByteIntegerConverter.Array16LoadBigEndian64(out block, _buffer, 0); + CryptoBytes.InternalWipe(_buffer, 0, _buffer.Length); + int bytesInBuffer = (int)_totalBytes & (BlockSize - 1); + if (bytesInBuffer > BlockSize - 16) + { + Sha512Internal.Core(out _state, ref _state, ref block); + block = default(Array16); + } + block.x15 = (_totalBytes - 1) * 8; + Sha512Internal.Core(out _state, ref _state, ref block); + + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 0, _state.x0); + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 8, _state.x1); + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 16, _state.x2); + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 24, _state.x3); + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 32, _state.x4); + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 40, _state.x5); + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 48, _state.x6); + ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 56, _state.x7); + _state = default(Array8); + } + + public byte[] Finish() + { + var result = new byte[64]; + Finish(new ArraySegment(result)); + return result; + } + + internal static byte[] Hash(byte[] data) + { + return Hash(data, 0, data.Length); + } + + internal static byte[] Hash(byte[] data, int offset, int count) + { + var hasher = new Sha512(); + hasher.Update(data, offset, count); + return hasher.Finish(); + } + } +} From 465451985ae1f1b43a1009ee7427c6b3e0d7c785 Mon Sep 17 00:00:00 2001 From: Stefan Rinkes Date: Sat, 1 Dec 2018 08:04:00 +0100 Subject: [PATCH 35/67] KEX with Elliptic Curves ecdh-sha2-nistp{256,384,521} Add Kex Algos ecdh-sha2-nistp{256,384,521} We have to use a minimalistic BouncyCastle Import for ECDH, since Microsoft's System.Security.Cryptography is not usable in this case. ECDiffieHellmanCng.DeriveKeyMaterial() already does the hashing and it's not possible to get the unhased key material for further processing. https://blogs.msdn.microsoft.com/shawnfa/2007/01/22/elliptic-curve-diffie-hellman/ --- .../Renci.SshNet.Tests.NET35.csproj | 5 +- .../Common/ExtensionsTest_ToBigInteger2.cs | 40 ++++ .../Renci.SshNet.Tests.csproj | 3 +- src/Renci.SshNet/Common/Extensions.cs | 14 ++ src/Renci.SshNet/ConnectionInfo.cs | 7 +- .../Transport/KeyExchangeEcdhInitMessage.cs | 23 +- .../Transport/KeyExchangeEcdhReplyMessage.cs | 15 +- src/Renci.SshNet/Renci.SshNet.csproj | 5 + src/Renci.SshNet/Security/KeyExchangeEC.cs | 215 ++++++++++++++++++ src/Renci.SshNet/Security/KeyExchangeECDH.cs | 107 +++++++++ .../Security/KeyExchangeECDH256.cs | 38 ++++ .../Security/KeyExchangeECDH384.cs | 54 +++++ .../Security/KeyExchangeECDH521.cs | 54 +++++ src/Renci.SshNet/Session.cs | 12 + src/Renci.SshNet/SshMessageFactory.cs | 5 +- 15 files changed, 575 insertions(+), 22 deletions(-) create mode 100644 src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_ToBigInteger2.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeEC.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeECDH.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeECDH256.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeECDH384.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeECDH521.cs diff --git a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj index a42cf8ec..058ec2ae 100644 --- a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj +++ b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj @@ -351,6 +351,9 @@ Classes\Common\ExtensionsTest_Take_OffsetAndCount.cs + + Classes\Common\ExtensionsTest_ToBigInteger2.cs + Classes\Common\ExtensionsTest_TrimLeadingZeros.cs @@ -1750,4 +1753,4 @@ --> - \ No newline at end of file + diff --git a/src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_ToBigInteger2.cs b/src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_ToBigInteger2.cs new file mode 100644 index 00000000..1299f17a --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_ToBigInteger2.cs @@ -0,0 +1,40 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Renci.SshNet.Common; + +namespace Renci.SshNet.Tests.Classes.Common +{ + [TestClass] + [SuppressMessage("ReSharper", "InvokeAsExtensionMethod")] + public class ExtensionsTest_ToBigInteger2 + { + [TestMethod] + public void ShouldNotAppendZero() + { + byte[] value = { 0x0a, 0x0d }; + + var actual = value.ToBigInteger2().ToByteArray().Reverse(); + + Assert.IsNotNull(actual); + Assert.AreEqual(2, actual.Length); + Assert.AreEqual(0x0a, actual[0]); + Assert.AreEqual(0x0d, actual[1]); + } + + [TestMethod] + public void ShouldAppendZero() + { + byte[] value = { 0xff, 0x0a, 0x0d }; + + var actual = value.ToBigInteger2().ToByteArray().Reverse(); + + Assert.IsNotNull(actual); + Assert.AreEqual(4, actual.Length); + Assert.AreEqual(0x00, actual[0]); + Assert.AreEqual(0xff, actual[1]); + Assert.AreEqual(0x0a, actual[2]); + Assert.AreEqual(0x0d, actual[3]); + } + } +} diff --git a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj index 0575dbd8..bb99b0c5 100644 --- a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj +++ b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj @@ -169,6 +169,7 @@ + @@ -717,4 +718,4 @@ --> - + \ No newline at end of file diff --git a/src/Renci.SshNet/Common/Extensions.cs b/src/Renci.SshNet/Common/Extensions.cs index 9d163bc9..784139ab 100644 --- a/src/Renci.SshNet/Common/Extensions.cs +++ b/src/Renci.SshNet/Common/Extensions.cs @@ -72,6 +72,20 @@ namespace Renci.SshNet.Common return new BigInteger(reversed.Reverse()); } + /// + /// Initializes a new instance of the structure using the SSH BigNum2 Format + /// + public static BigInteger ToBigInteger2(this byte[] data) + { + if ((data[0] & (1 << 7)) != 0) + { + var buf = new byte[data.Length + 1]; + Buffer.BlockCopy(data, 0, buf, 1, data.Length); + data = buf; + } + return data.ToBigInteger(); + } + /// /// Reverses the sequence of the elements in the entire one-dimensional . /// diff --git a/src/Renci.SshNet/ConnectionInfo.cs b/src/Renci.SshNet/ConnectionInfo.cs index f9b872d3..780b7918 100644 --- a/src/Renci.SshNet/ConnectionInfo.cs +++ b/src/Renci.SshNet/ConnectionInfo.cs @@ -322,14 +322,13 @@ namespace Renci.SshNet KeyExchangeAlgorithms = new Dictionary { + {"ecdh-sha2-nistp256", typeof(KeyExchangeECDH256)}, + {"ecdh-sha2-nistp384", typeof(KeyExchangeECDH384)}, + {"ecdh-sha2-nistp521", typeof(KeyExchangeECDH521)}, {"diffie-hellman-group-exchange-sha256", typeof (KeyExchangeDiffieHellmanGroupExchangeSha256)}, {"diffie-hellman-group-exchange-sha1", typeof (KeyExchangeDiffieHellmanGroupExchangeSha1)}, {"diffie-hellman-group14-sha1", typeof (KeyExchangeDiffieHellmanGroup14Sha1)}, {"diffie-hellman-group1-sha1", typeof (KeyExchangeDiffieHellmanGroup1Sha1)}, - //{"ecdh-sha2-nistp256", typeof(KeyExchangeEllipticCurveDiffieHellman)}, - //{"ecdh-sha2-nistp256", typeof(...)}, - //{"ecdh-sha2-nistp384", typeof(...)}, - //{"ecdh-sha2-nistp521", typeof(...)}, //"gss-group1-sha1-toWM5Slw5Ew8Mqkay+al2g==" - WinSSHD //"gss-gex-sha1-toWM5Slw5Ew8Mqkay+al2g==" - WinSSHD }; diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs index 2620d982..ddcf03f1 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs @@ -1,6 +1,4 @@ -#if false - -using System; +using System; using Renci.SshNet.Common; namespace Renci.SshNet.Messages.Transport @@ -8,7 +6,7 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_KEXECDH_INIT message. /// - [Message("SSH_MSG_KEXECDH_INIT", 30)] + [Message("SSH_MSG_KEX_ECDH_INIT", 30)] internal class KeyExchangeEcdhInitMessage : Message, IKeyExchangedAllowed { /// @@ -33,6 +31,14 @@ namespace Renci.SshNet.Messages.Transport } } + /// + /// Initializes a new instance of the class. + /// + public KeyExchangeEcdhInitMessage(byte[] q) + { + QC = q; + } + /// /// Initializes a new instance of the class. /// @@ -63,7 +69,10 @@ namespace Renci.SshNet.Messages.Transport { WriteBinaryString(QC); } - } -} -#endif // false \ No newline at end of file + internal override void Process(Session session) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs index 42c36315..a194caf1 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs @@ -1,11 +1,9 @@ -#if false - -namespace Renci.SshNet.Messages.Transport +namespace Renci.SshNet.Messages.Transport { /// /// Represents SSH_MSG_KEXECDH_REPLY message. /// - [Message("SSH_MSG_KEXECDH_REPLY", 31)] + [Message("SSH_MSG_KEX_ECDH_REPLY", 31)] public class KeyExchangeEcdhReplyMessage : Message { /// @@ -65,7 +63,10 @@ namespace Renci.SshNet.Messages.Transport WriteBinaryString(QS); WriteBinaryString(Signature); } - } -} -#endif // false \ No newline at end of file + internal override void Process(Session session) + { + session.OnKeyExchangeEcdhReplyMessageReceived(this); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index b0b4b899..e1bb56ba 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -309,6 +309,11 @@ + + + + + diff --git a/src/Renci.SshNet/Security/KeyExchangeEC.cs b/src/Renci.SshNet/Security/KeyExchangeEC.cs new file mode 100644 index 00000000..44856909 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeEC.cs @@ -0,0 +1,215 @@ +using System; +using System.Text; +using Renci.SshNet.Messages.Transport; +using Renci.SshNet.Common; +using Renci.SshNet.Abstractions; + +namespace Renci.SshNet.Security +{ + internal abstract class KeyExchangeEC : KeyExchange + { + /// + /// Specifies client payload + /// + protected byte[] _clientPayload; + + /// + /// Specifies server payload + /// + protected byte[] _serverPayload; + + /// + /// Specifies client exchange. + /// + protected byte[] _clientExchangeValue; + + /// + /// Specifies server exchange. + /// + protected byte[] _serverExchangeValue; + + /// + /// Specifies host key data. + /// + protected byte[] _hostKey; + + /// + /// Specifies signature data. + /// + protected byte[] _signature; + + /// + /// Gets the size, in bits, of the computed hash code. + /// + /// + /// The size, in bits, of the computed hash code. + /// + protected abstract int HashSize { get; } + + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha256 = CryptoAbstraction.CreateSHA256()) + { + return sha256.ComputeHash(hashData, 0, hashData.Length); + } + } + + /// + /// Calculates key exchange hash value. + /// + /// + /// Key exchange hash. + /// + protected override byte[] CalculateHash() + { + var hashData = new _ExchangeHashData + { + ClientVersion = Session.ClientVersion, + ServerVersion = Session.ServerVersion, + ClientPayload = _clientPayload, + ServerPayload = _serverPayload, + HostKey = _hostKey, + ClientExchangeValue = _clientExchangeValue, + ServerExchangeValue = _serverExchangeValue, + SharedKey = SharedKey, + }.GetBytes(); + + return Hash(hashData); + } + + /// + /// Validates the exchange hash. + /// + /// + /// true if exchange hash is valid; otherwise false. + /// + protected override bool ValidateExchangeHash() + { + var exchangeHash = CalculateHash(); + + var length = Pack.BigEndianToUInt32(_hostKey); + var algorithmName = Encoding.UTF8.GetString(_hostKey, 4, (int)length); + var key = Session.ConnectionInfo.HostKeyAlgorithms[algorithmName](_hostKey); + + Session.ConnectionInfo.CurrentHostKeyAlgorithm = algorithmName; + + if (CanTrustHostKey(key)) + { + return key.VerifySignature(exchangeHash, _signature); + } + return false; + } + + /// + /// Starts key exchange algorithm + /// + /// The session. + /// Key exchange init message. + public override void Start(Session session, KeyExchangeInitMessage message) + { + base.Start(session, message); + + _serverPayload = message.GetBytes(); + _clientPayload = Session.ClientInitMessage.GetBytes(); + } + + /// + /// Handles the server DH reply message. + /// + /// The host key. + /// The server exchange value. + /// The signature. + protected virtual void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) + { + } + + internal class _ExchangeHashData : SshData + { + private byte[] _serverVersion; + private byte[] _clientVersion; + private byte[] _sharedKey; + + public string ServerVersion + { + private get { return Utf8.GetString(_serverVersion, 0, _serverVersion.Length); } + set { _serverVersion = Utf8.GetBytes(value); } + } + + public string ClientVersion + { + private get { return Utf8.GetString(_clientVersion, 0, _clientVersion.Length); } + set { _clientVersion = Utf8.GetBytes(value); } + } + + public byte[] ClientPayload { get; set; } + + public byte[] ServerPayload { get; set; } + + public byte[] HostKey { get; set; } + + public byte[] ClientExchangeValue { get; set; } + + public byte[] ServerExchangeValue { get; set; } + + public BigInteger SharedKey + { + private get { return _sharedKey.ToBigInteger(); } + set { _sharedKey = value.ToByteArray().Reverse(); } + } + /// + /// Gets the size of the message in bytes. + /// + /// + /// The size of the messages in bytes. + /// + protected override int BufferCapacity + { + get + { + var capacity = base.BufferCapacity; + capacity += 4; // ClientVersion length + capacity += _clientVersion.Length; // ClientVersion + capacity += 4; // ServerVersion length + capacity += _serverVersion.Length; // ServerVersion + capacity += 4; // ClientPayload length + capacity += ClientPayload.Length; // ClientPayload + capacity += 4; // ServerPayload length + capacity += ServerPayload.Length; // ServerPayload + capacity += 4; // HostKey length + capacity += HostKey.Length; // HostKey + capacity += 4; // ClientExchangeValue length + capacity += ClientExchangeValue.Length; // ClientExchangeValue + capacity += 4; // ServerExchangeValue length + capacity += ServerExchangeValue.Length; // ServerExchangeValue + capacity += 4; // SharedKey length + capacity += _sharedKey.Length; // SharedKey + return capacity; + } + } + + protected override void LoadData() + { + throw new NotImplementedException(); + } + + protected override void SaveData() + { + WriteBinaryString(_clientVersion); + WriteBinaryString(_serverVersion); + WriteBinaryString(ClientPayload); + WriteBinaryString(ServerPayload); + WriteBinaryString(HostKey); + WriteBinaryString(ClientExchangeValue); + WriteBinaryString(ServerExchangeValue); + WriteBinaryString(_sharedKey); + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeECDH.cs b/src/Renci.SshNet/Security/KeyExchangeECDH.cs new file mode 100644 index 00000000..9c5d4bfd --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeECDH.cs @@ -0,0 +1,107 @@ +using System; +using Renci.SshNet.Common; +using Renci.SshNet.Messages.Transport; + +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Generators; +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters; +using Renci.SshNet.Security.Org.BouncyCastle.Security; +using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9; +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Agreement; + +namespace Renci.SshNet.Security +{ + internal abstract class KeyExchangeECDH : KeyExchangeEC + { + /// + /// Gets the parameter of the curve. + /// + /// + /// The parameter of the curve. + /// + protected abstract X9ECParameters CurveParameter { get; } + + protected ECDHCBasicAgreement KeyAgreement; + protected ECDomainParameters DomainParameters; + + /// + /// Starts key exchange algorithm + /// + /// The session. + /// Key exchange init message. + public override void Start(Session session, KeyExchangeInitMessage message) + { + base.Start(session, message); + + Session.RegisterMessage("SSH_MSG_KEX_ECDH_REPLY"); + + Session.KeyExchangeEcdhReplyMessageReceived += Session_KeyExchangeEcdhReplyMessageReceived; + + DomainParameters = new ECDomainParameters(CurveParameter.Curve, + CurveParameter.G, + CurveParameter.N, + CurveParameter.H, + CurveParameter.GetSeed()); + + var g = new ECKeyPairGenerator(); + g.Init(new ECKeyGenerationParameters(DomainParameters, new SecureRandom())); + + var aKeyPair = g.GenerateKeyPair(); + KeyAgreement = new ECDHCBasicAgreement(); + KeyAgreement.Init(aKeyPair.Private); + _clientExchangeValue = ((ECPublicKeyParameters)aKeyPair.Public).Q.GetEncoded(); + + SendMessage(new KeyExchangeEcdhInitMessage(_clientExchangeValue)); + } + + /// + /// Finishes key exchange algorithm. + /// + public override void Finish() + { + base.Finish(); + + Session.KeyExchangeEcdhReplyMessageReceived -= Session_KeyExchangeEcdhReplyMessageReceived; + } + + private void Session_KeyExchangeEcdhReplyMessageReceived(object sender, MessageEventArgs e) + { + var message = e.Message; + + // Unregister message once received + Session.UnRegisterMessage("SSH_MSG_KEX_ECDH_REPLY"); + + HandleServerEcdhReply(message.KS, message.QS, message.Signature); + + // When SSH_MSG_KEXDH_REPLY received key exchange is completed + Finish(); + } + + /// + /// Handles the server DH reply message. + /// + /// The host key. + /// The server exchange value. + /// The signature. + protected override void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) + { + _serverExchangeValue = serverExchangeValue; + _hostKey = hostKey; + _serverExchangeValue = serverExchangeValue; + _signature = signature; + + var cordSize = (serverExchangeValue.Length - 1) / 2; + var x = new byte[cordSize]; + Buffer.BlockCopy(serverExchangeValue, 1, x, 0, x.Length); // first byte is format. should be checked and passed to bouncy castle? + var y = new byte[cordSize]; + Buffer.BlockCopy(serverExchangeValue, cordSize + 1, y, 0, y.Length); + + var c = (FpCurve)DomainParameters.Curve; + var q = c.CreatePoint(new Org.BouncyCastle.Math.BigInteger(1, x), new Org.BouncyCastle.Math.BigInteger(1, y)); + var publicKey = new ECPublicKeyParameters("ECDH", q, DomainParameters); + + var k1 = KeyAgreement.CalculateAgreement(publicKey); + SharedKey = k1.ToByteArray().ToBigInteger2(); + } + } +} diff --git a/src/Renci.SshNet/Security/KeyExchangeECDH256.cs b/src/Renci.SshNet/Security/KeyExchangeECDH256.cs new file mode 100644 index 00000000..84a8d12b --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeECDH256.cs @@ -0,0 +1,38 @@ +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.Sec; +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9; + +namespace Renci.SshNet.Security +{ + internal class KeyExchangeECDH256 : KeyExchangeECDH + { + /// + /// Gets algorithm name. + /// + public override string Name + { + get { return "ecdh-sha2-nistp256"; } + } + + /// + /// Gets Curve Parameter. + /// + protected override X9ECParameters CurveParameter + { + get + { + return SecNamedCurves.GetByName("P-256"); + } + } + + /// + /// Gets the size, in bits, of the computed hash code. + /// + /// + /// The size, in bits, of the computed hash code. + /// + protected override int HashSize + { + get { return 256; } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeECDH384.cs b/src/Renci.SshNet/Security/KeyExchangeECDH384.cs new file mode 100644 index 00000000..bbd7ced5 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeECDH384.cs @@ -0,0 +1,54 @@ +using Renci.SshNet.Abstractions; +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.Sec; +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9; + +namespace Renci.SshNet.Security +{ + internal class KeyExchangeECDH384 : KeyExchangeECDH + { + /// + /// Gets algorithm name. + /// + public override string Name + { + get { return "ecdh-sha2-nistp384"; } + } + + /// + /// Gets Curve Parameter. + /// + protected override X9ECParameters CurveParameter + { + get + { + return SecNamedCurves.GetByName("P-384"); + } + } + + /// + /// Gets the size, in bits, of the computed hash code. + /// + /// + /// The size, in bits, of the computed hash code. + /// + protected override int HashSize + { + get { return 384; } + } + + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha384 = CryptoAbstraction.CreateSHA384()) + { + return sha384.ComputeHash(hashData, 0, hashData.Length); + } + } + } +} diff --git a/src/Renci.SshNet/Security/KeyExchangeECDH521.cs b/src/Renci.SshNet/Security/KeyExchangeECDH521.cs new file mode 100644 index 00000000..920089c0 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeECDH521.cs @@ -0,0 +1,54 @@ +using Renci.SshNet.Abstractions; +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.Sec; +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9; + +namespace Renci.SshNet.Security +{ + internal class KeyExchangeECDH521 : KeyExchangeECDH + { + /// + /// Gets algorithm name. + /// + public override string Name + { + get { return "ecdh-sha2-nistp521"; } + } + + /// + /// Gets Curve Parameter. + /// + protected override X9ECParameters CurveParameter + { + get + { + return SecNamedCurves.GetByName("P-521"); + } + } + + /// + /// Gets the size, in bits, of the computed hash code. + /// + /// + /// The size, in bits, of the computed hash code. + /// + protected override int HashSize + { + get { return 512; } + } + + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha512 = CryptoAbstraction.CreateSHA512()) + { + return sha512.ComputeHash(hashData, 0, hashData.Length); + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Session.cs b/src/Renci.SshNet/Session.cs index 811b06da..fd771095 100644 --- a/src/Renci.SshNet/Session.cs +++ b/src/Renci.SshNet/Session.cs @@ -439,6 +439,11 @@ namespace Renci.SshNet /// internal event EventHandler> KeyExchangeDhReplyMessageReceived; + /// + /// Occurs when a message is received from the SSH server. + /// + internal event EventHandler> KeyExchangeEcdhReplyMessageReceived; + /// /// Occurs when message received /// @@ -1322,6 +1327,13 @@ namespace Renci.SshNet handlers(this, new MessageEventArgs(message)); } + internal void OnKeyExchangeEcdhReplyMessageReceived(KeyExchangeEcdhReplyMessage message) + { + var handlers = KeyExchangeEcdhReplyMessageReceived; + if (handlers != null) + handlers(this, new MessageEventArgs(message)); + } + /// /// Called when message received. /// diff --git a/src/Renci.SshNet/SshMessageFactory.cs b/src/Renci.SshNet/SshMessageFactory.cs index 9041ea34..153024db 100644 --- a/src/Renci.SshNet/SshMessageFactory.cs +++ b/src/Renci.SshNet/SshMessageFactory.cs @@ -25,7 +25,7 @@ namespace Renci.SshNet /// /// Defines the total number of supported messages. /// - internal const int TotalMessageCount = 31; + internal const int TotalMessageCount = 32; static SshMessageFactory() { @@ -61,7 +61,8 @@ namespace Renci.SshNet new MessageMetadata (27, "SSH_MSG_SERVICE_ACCEPT", 6), new MessageMetadata (28, "SSH_MSG_KEX_DH_GEX_GROUP", 31), new MessageMetadata (29, "SSH_MSG_KEXDH_REPLY", 31), - new MessageMetadata (30, "SSH_MSG_KEX_DH_GEX_REPLY", 33) + new MessageMetadata (30, "SSH_MSG_KEX_DH_GEX_REPLY", 33), + new MessageMetadata (31, "SSH_MSG_KEX_ECDH_REPLY", 31) }; MessagesByName = new Dictionary(AllMessages.Length); From b58a11c0da55da1f5bad46faad2e9b71b7cb35b3 Mon Sep 17 00:00:00 2001 From: Stefan Rinkes Date: Sat, 1 Dec 2018 08:04:00 +0100 Subject: [PATCH 36/67] KEX with Elliptic Curve curve25519 Add Kex Algos curve25519-sha256(@libssh.org) --- src/Renci.SshNet/ConnectionInfo.cs | 2 + src/Renci.SshNet/Renci.SshNet.csproj | 1 + .../Security/KeyExchangeECCurve25519.cs | 99 +++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs diff --git a/src/Renci.SshNet/ConnectionInfo.cs b/src/Renci.SshNet/ConnectionInfo.cs index 780b7918..a8317909 100644 --- a/src/Renci.SshNet/ConnectionInfo.cs +++ b/src/Renci.SshNet/ConnectionInfo.cs @@ -322,6 +322,8 @@ namespace Renci.SshNet KeyExchangeAlgorithms = new Dictionary { + {"curve25519-sha256", typeof(KeyExchangeECCurve25519)}, + {"curve25519-sha256@libssh.org", typeof(KeyExchangeECCurve25519)}, {"ecdh-sha2-nistp256", typeof(KeyExchangeECDH256)}, {"ecdh-sha2-nistp384", typeof(KeyExchangeECDH384)}, {"ecdh-sha2-nistp521", typeof(KeyExchangeECDH521)}, diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index e1bb56ba..62508016 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -310,6 +310,7 @@ + diff --git a/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs b/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs new file mode 100644 index 00000000..39658de0 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs @@ -0,0 +1,99 @@ +using System; +using Renci.SshNet.Common; +using Renci.SshNet.Messages.Transport; +using Renci.SshNet.Security.Chaos.NaCl; +using Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10; + +namespace Renci.SshNet.Security +{ + internal class KeyExchangeECCurve25519 : KeyExchangeEC + { + private byte[] _privateKey; + + /// + /// Gets algorithm name. + /// + public override string Name + { + get { return "curve25519-sha256"; } + } + + /// + /// Gets the size, in bits, of the computed hash code. + /// + /// + /// The size, in bits, of the computed hash code. + /// + protected override int HashSize + { + get { return 256; } + } + + /// + /// Starts key exchange algorithm + /// + /// The session. + /// Key exchange init message. + public override void Start(Session session, KeyExchangeInitMessage message) + { + base.Start(session, message); + + Session.RegisterMessage("SSH_MSG_KEX_ECDH_REPLY"); + + Session.KeyExchangeEcdhReplyMessageReceived += Session_KeyExchangeEcdhReplyMessageReceived; + + var basepoint = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; + basepoint[0] = 9; + + var rnd = new Random(); + _privateKey = new byte[MontgomeryCurve25519.PrivateKeySizeInBytes]; + rnd.NextBytes(_privateKey); + + _clientExchangeValue = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; + MontgomeryOperations.scalarmult(_clientExchangeValue, 0, _privateKey, 0, basepoint, 0); + + SendMessage(new KeyExchangeEcdhInitMessage(_clientExchangeValue)); + } + + /// + /// Finishes key exchange algorithm. + /// + public override void Finish() + { + base.Finish(); + + Session.KeyExchangeEcdhReplyMessageReceived -= Session_KeyExchangeEcdhReplyMessageReceived; + } + + private void Session_KeyExchangeEcdhReplyMessageReceived(object sender, MessageEventArgs e) + { + var message = e.Message; + + // Unregister message once received + Session.UnRegisterMessage("SSH_MSG_KEX_ECDH_REPLY"); + + HandleServerEcdhReply(message.KS, message.QS, message.Signature); + + // When SSH_MSG_KEXDH_REPLY received key exchange is completed + Finish(); + } + + /// + /// Handles the server DH reply message. + /// + /// The host key. + /// The server exchange value. + /// The signature. + protected override void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) + { + _serverExchangeValue = serverExchangeValue; + _hostKey = hostKey; + _serverExchangeValue = serverExchangeValue; + _signature = signature; + + var sharedKey = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; + MontgomeryOperations.scalarmult(sharedKey, 0, _privateKey, 0, serverExchangeValue, 0); + SharedKey = sharedKey.ToBigInteger2(); + } + } +} From 90fb62b7cccc5f8688a86452be8930e63504cdca Mon Sep 17 00:00:00 2001 From: Stefan Rinkes Date: Mon, 26 Nov 2018 20:15:25 +0100 Subject: [PATCH 37/67] Add Support for ECDSA Host- and Private-Keys Also known as: - ecdsa-sha2-nistp256 - ecdsa-sha2-nistp384 - ecdsa-sha2-nistp521 Basically it translate between SSH-Data and Microsoft Crypto API. --- .../Renci.SshNet.NET35.csproj | 10 +- .../Renci.SshNet.NETCore.csproj | 3 +- .../Renci.SshNet.Tests.NET35.csproj | 23 + .../Classes/Common/ExtensionsTest_Pad.cs | 32 ++ .../Classes/PrivateKeyFileTest.cs | 66 +++ .../Data/Key.ECDSA.Encrypted.txt | 8 + src/Renci.SshNet.Tests/Data/Key.ECDSA.txt | 5 + .../Data/Key.ECDSA384.Encrypted.txt | 9 + src/Renci.SshNet.Tests/Data/Key.ECDSA384.txt | 6 + .../Data/Key.ECDSA521.Encrypted.txt | 10 + src/Renci.SshNet.Tests/Data/Key.ECDSA521.txt | 7 + .../Renci.SshNet.Tests.csproj | 11 +- src/Renci.SshNet/Common/DerData.cs | 120 ++++- src/Renci.SshNet/Common/Extensions.cs | 14 + src/Renci.SshNet/ConnectionInfo.cs | 6 +- src/Renci.SshNet/PrivateKeyFile.cs | 19 +- src/Renci.SshNet/Renci.SshNet.csproj | 6 +- .../Cryptography/EcdsaDigitalSignature.cs | 189 ++++++++ .../Security/Cryptography/EcdsaKey.cs | 459 ++++++++++++++++++ 19 files changed, 981 insertions(+), 22 deletions(-) create mode 100644 src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_Pad.cs create mode 100644 src/Renci.SshNet.Tests/Data/Key.ECDSA.Encrypted.txt create mode 100644 src/Renci.SshNet.Tests/Data/Key.ECDSA.txt create mode 100644 src/Renci.SshNet.Tests/Data/Key.ECDSA384.Encrypted.txt create mode 100644 src/Renci.SshNet.Tests/Data/Key.ECDSA384.txt create mode 100644 src/Renci.SshNet.Tests/Data/Key.ECDSA521.Encrypted.txt create mode 100644 src/Renci.SshNet.Tests/Data/Key.ECDSA521.txt create mode 100644 src/Renci.SshNet/Security/Cryptography/EcdsaDigitalSignature.cs create mode 100644 src/Renci.SshNet/Security/Cryptography/EcdsaKey.cs diff --git a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj b/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj index a41e7bcb..0df2f4f5 100644 --- a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj +++ b/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj @@ -18,7 +18,7 @@ full false bin\Debug\ - TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII + TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA prompt 4 true @@ -29,7 +29,7 @@ none true bin\Release\ - TRACE;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII + TRACE;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA prompt 4 bin\Release\Renci.SshNet.xml @@ -911,6 +911,12 @@ Security\Cryptography\Key.cs + + Security\Cryptography\EcdsaDigitalSignature.cs + + + Security\Cryptography\EcdsaKey.cs + Security\Cryptography\RsaDigitalSignature.cs diff --git a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj b/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj index bf001750..b288064e 100644 --- a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj +++ b/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj @@ -27,11 +27,12 @@ + FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_TAP;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 - FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 + FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_ECDSA diff --git a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj index 058ec2ae..ec5feb95 100644 --- a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj +++ b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj @@ -354,6 +354,9 @@ Classes\Common\ExtensionsTest_ToBigInteger2.cs + + Classes\Common\ExtensionsTest_Pad.cs + Classes\Common\ExtensionsTest_TrimLeadingZeros.cs @@ -1740,6 +1743,26 @@ Data\Key.SSH2.RSA.txt + + + Data\Key.ECDSA.txt + + + Data\Key.ECDSA384.txt + + + Data\Key.ECDSA521.txt + + + Data\Key.ECDSA.Encrypted.txt + + + Data\Key.ECDSA384.Encrypted.txt + + + Data\Key.ECDSA521.Encrypted.txt + + diff --git a/src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_Pad.cs b/src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_Pad.cs new file mode 100644 index 00000000..f39c45de --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/Common/ExtensionsTest_Pad.cs @@ -0,0 +1,32 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Renci.SshNet.Common; + +namespace Renci.SshNet.Tests.Classes.Common +{ + [TestClass] + [SuppressMessage("ReSharper", "InvokeAsExtensionMethod")] + public class ExtensionsTest_Pad + { + [TestMethod] + public void ShouldReturnNotPadded() + { + byte[] value = {0x0a, 0x0d}; + byte[] padded = value.Pad(2); + Assert.AreEqual(value, padded); + Assert.AreEqual(value.Length, padded.Length); + } + + [TestMethod] + public void ShouldReturnPadded() + { + byte[] value = { 0x0a, 0x0d }; + byte[] padded = value.Pad(3); + Assert.AreEqual(value.Length + 1, padded.Length); + Assert.AreEqual(0x00, padded[0]); + Assert.AreEqual(0x0a, padded[1]); + Assert.AreEqual(0x0d, padded[2]); + } + } +} diff --git a/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs b/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs index 21bd9785..3c944c8d 100644 --- a/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs +++ b/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs @@ -319,6 +319,72 @@ namespace Renci.SshNet.Tests.Classes } } + [TestMethod] + [Owner("darinkes")] + [TestCategory("PrivateKey")] + public void Test_PrivateKey_ECDSA() + { + using (var stream = GetData("Key.ECDSA.txt")) + { + new PrivateKeyFile(stream); + } + } + + [TestMethod] + [Owner("darinkes")] + [TestCategory("PrivateKey")] + public void Test_PrivateKey_ECDSA384() + { + using (var stream = GetData("Key.ECDSA384.txt")) + { + new PrivateKeyFile(stream); + } + } + + [TestMethod] + [Owner("darinkes")] + [TestCategory("PrivateKey")] + public void Test_PrivateKey_ECDSA521() + { + using (var stream = GetData("Key.ECDSA521.txt")) + { + new PrivateKeyFile(stream); + } + } + + [TestMethod] + [Owner("darinkes")] + [TestCategory("PrivateKey")] + public void Test_PrivateKey_ECDSA_Encrypted() + { + using (var stream = GetData("Key.ECDSA.Encrypted.txt")) + { + new PrivateKeyFile(stream, "12345"); + } + } + + [TestMethod] + [Owner("darinkes")] + [TestCategory("PrivateKey")] + public void Test_PrivateKey_ECDSA384_Encrypted() + { + using (var stream = GetData("Key.ECDSA384.Encrypted.txt")) + { + new PrivateKeyFile(stream, "12345"); + } + } + + [TestMethod] + [Owner("darinkes")] + [TestCategory("PrivateKey")] + public void Test_PrivateKey_ECDSA521_Encrypted() + { + using (var stream = GetData("Key.ECDSA521.Encrypted.txt")) + { + new PrivateKeyFile(stream, "12345"); + } + } + /// ///A test for Dispose /// diff --git a/src/Renci.SshNet.Tests/Data/Key.ECDSA.Encrypted.txt b/src/Renci.SshNet.Tests/Data/Key.ECDSA.Encrypted.txt new file mode 100644 index 00000000..f0af5ba7 --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.ECDSA.Encrypted.txt @@ -0,0 +1,8 @@ +-----BEGIN EC PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,54D46F498C989115AAE14FEA21E3AF11 + +IQdFnndcbzz10d7YQIgEE1TzuzJrm7uYJr4Hvdfz/FshVxMRqxqaqtEgo2vAHHik +BOcPkm+84ERlTNPslcJqLSkKzCdxb7Rz5hfwHuN3Y6Lf01qGakDlzAUEjEyDor+4 +zQtAne+f+gRUJnBvLLoVhH4xdeQFC55GECNUFQpEmos= +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Data/Key.ECDSA.txt b/src/Renci.SshNet.Tests/Data/Key.ECDSA.txt new file mode 100644 index 00000000..13ac9fb4 --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.ECDSA.txt @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIEdqaFKgJBIibVjyUh1v7Y35LwIQJrocdTaYFLwl7iB0oAoGCCqGSM49 +AwEHoUQDQgAEQD5MO/n9yqSDTszwzVpApLx5SQFecE5ZfDkgxqVdHQecm1BAPozZ +4eKGNhKn72hT79mLlp9HXX+oNEcuVT83Hw== +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Data/Key.ECDSA384.Encrypted.txt b/src/Renci.SshNet.Tests/Data/Key.ECDSA384.Encrypted.txt new file mode 100644 index 00000000..00072ce2 --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.ECDSA384.Encrypted.txt @@ -0,0 +1,9 @@ +-----BEGIN EC PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,1D64653C5E18C2AACB0B17E3FE43C219 + +lCtRmcvKSeIACwqTtsf/ei1brtCZ386rsk/j7bSXdkZBpvzcmzbeo6w6CYm206Km +hV9TMl2dIO/I1/ov5/2VIR3ZkaElyDOJD/+Be0e3aus4EZj1H1YM/Dv+4QJId+is +Cw4ycWjfudYPPejGdiyjzt5qjaIJwrrEvGtMg7sWVAqDpjcAjS9KuaCu5nOgdItL +s7oHuz+DTGdJQNfUHAlUnz1JaMRWzpP0MwtxdcaRY+w= +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Data/Key.ECDSA384.txt b/src/Renci.SshNet.Tests/Data/Key.ECDSA384.txt new file mode 100644 index 00000000..f2d658ea --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.ECDSA384.txt @@ -0,0 +1,6 @@ +-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDCQawHdHLR7NvKa2vPV0sVkbzOE8c0enp95iEysGcGV66RXE1EH//nh +gu5UzeTR4KigBwYFK4EEACKhZANiAAQUk4rVvoOPI1hQzWpNx09Uo6qG+srGcbvB +q15eFK0GnK/T0UBKxdbZ2+//KAYI6SeDHM9t3ORF1aX5EpjTEBI4d7ZY/lV9jX6M +nJ4XuGteJselM2iMmy+p9ZYw83BYB1Y= +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Data/Key.ECDSA521.Encrypted.txt b/src/Renci.SshNet.Tests/Data/Key.ECDSA521.Encrypted.txt new file mode 100644 index 00000000..381b30be --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.ECDSA521.Encrypted.txt @@ -0,0 +1,10 @@ +-----BEGIN EC PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,F995028237EBD79C928530CC6C3E957F + +wT+iajbte4MnpCipVy/7W9t2I8OgwbMjNBw9PB5xmXR1NQX+yWa81DXMTgjHi8++ +6tp+Vlftkr7mY1yvZCVo1Sy4VgcvZeMhtpVKtvYdMCmHJC6gaDOTYX3yee8DJ4FL +fG+IQz0wFyZZ26NFrHiwbufW9z6pXhGNCQZK0KLbFxI9iKwVA0llc7uzTEcmBBpn +0/Snp0CVvX+i6AP9Xj0bBdrFCsvcoT+ZHzS8YWJUfu3m6cpAJksCAy0PXR3ifvus +edTfDpkMxd4/b+DtPB6SMekIAjnQyzbyaTwJCujm8iU= +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Data/Key.ECDSA521.txt b/src/Renci.SshNet.Tests/Data/Key.ECDSA521.txt new file mode 100644 index 00000000..31abe917 --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.ECDSA521.txt @@ -0,0 +1,7 @@ +-----BEGIN EC PRIVATE KEY----- +MIHcAgEBBEIBn2DAme7AU8sCA+/sd6s3c2FNW26IiPvulGd3FC8k5q+fjBZ5LUWR +iJMGrsf2rJLO8hXMGJYoF9tjZEGaabQ8KVagBwYFK4EEACOhgYkDgYYABABrpVjs +ANqcvqMUo1wo0I1uVCXQ6xrauy4iU86FiOwFmkYRrle4w3oYdRJwniC3TwGMuBuM +PMIoCTXr0UtUzn1vkQESNR/J/jAxVseLlVe+KDfZHKvsvk2+O4XaSa1qMfLwN3sp +wlj08+ylKjlO6V3g0hbz4ZaSVwuiRS7Xsv8W2MV6rg== +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj index bb99b0c5..f32beeed 100644 --- a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj +++ b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj @@ -170,6 +170,7 @@ + @@ -710,6 +711,14 @@ Renci.SshNet + + + + + + + + - \ No newline at end of file + diff --git a/src/Renci.SshNet/Common/DerData.cs b/src/Renci.SshNet/Common/DerData.cs index c84c0b17..35178798 100644 --- a/src/Renci.SshNet/Common/DerData.cs +++ b/src/Renci.SshNet/Common/DerData.cs @@ -12,7 +12,7 @@ namespace Renci.SshNet.Common private const byte Boolean = 0x01; private const byte Integer = 0x02; - //private const byte BITSTRING = 0x03; + private const byte BITSTRING = 0x03; private const byte Octetstring = 0x04; private const byte Null = 0x05; private const byte Objectidentifier = 0x06; @@ -70,12 +70,20 @@ namespace Renci.SshNet.Common /// Initializes a new instance of the class. /// /// DER encoded data. - public DerData(byte[] data) + /// its a construct + public DerData(byte[] data, bool construct = false) { _data = new List(data); - ReadByte(); // skip dataType - var length = ReadLength(); - _lastIndex = _readerIndex + length; + if (construct) + { + _lastIndex = _readerIndex + data.Length; + } + else + { + ReadByte(); // skip dataType + var length = ReadLength(); + _lastIndex = _readerIndex + length; + } } /// @@ -101,7 +109,7 @@ namespace Renci.SshNet.Common { var type = ReadByte(); if (type != Integer) - throw new InvalidOperationException("Invalid data type, INTEGER(02) is expected."); + throw new InvalidOperationException(string.Format("Invalid data type, INTEGER(02) is expected, but was {0}", type.ToString("X2"))); var length = ReadLength(); @@ -118,7 +126,7 @@ namespace Renci.SshNet.Common { var type = ReadByte(); if (type != Integer) - throw new InvalidOperationException("Invalid data type, INTEGER(02) is expected."); + throw new InvalidOperationException(string.Format("Invalid data type, INTEGER(02) is expected, but was {0}", type.ToString("X2"))); var length = ReadLength(); @@ -140,6 +148,51 @@ namespace Renci.SshNet.Common return result; } + /// + /// Reads next octetstring data type from internal buffer. + /// + /// data read. + public byte[] ReadOctetString() + { + var type = ReadByte(); + if (type != Octetstring) + throw new InvalidOperationException(string.Format("Invalid data type, OCTETSTRING(04) is expected, but was {0}", type.ToString("X2"))); + + var length = ReadLength(); + var data = ReadBytes(length); + return data; + } + + /// + /// Reads next bitstring data type from internal buffer. + /// + /// data read. + public byte[] ReadBitString() + { + var type = ReadByte(); + if (type != BITSTRING) + throw new InvalidOperationException(string.Format("Invalid data type, BITSTRING(03) is expected, but was {0}", type.ToString("X2"))); + + var length = ReadLength(); + var data = ReadBytes(length); + return data; + } + + /// + /// Reads next object data type from internal buffer. + /// + /// data read. + public byte[] ReadObject() + { + var type = ReadByte(); + if (type != Objectidentifier) + throw new InvalidOperationException(string.Format("Invalid data type, OBJECT(06) is expected, but was {0}", type.ToString("X2"))); + + var length = ReadLength(); + var data = ReadBytes(length); + return data; + } + /// /// Writes BOOLEAN data into internal buffer. /// @@ -189,6 +242,18 @@ namespace Renci.SshNet.Common WriteBytes(data); } + /// + /// Writes BITSTRING data into internal buffer. + /// + /// The data. + public void WriteBitstring(byte[] data) + { + _data.Add(BITSTRING); + var length = GetLength(data.Length); + WriteBytes(length); + WriteBytes(data); + } + /// /// Writes OBJECTIDENTIFIER data into internal buffer. /// @@ -229,6 +294,18 @@ namespace Renci.SshNet.Common WriteBytes(bytes); } + /// + /// Writes OBJECTIDENTIFIER data into internal buffer. + /// + /// The bytes. + public void WriteObjectIdentifier(byte[] bytes) + { + _data.Add(Objectidentifier); + var length = GetLength(bytes.Length); + WriteBytes(length); + WriteBytes(bytes); + } + /// /// Writes NULL data into internal buffer. /// @@ -268,10 +345,13 @@ namespace Renci.SshNet.Common return data; } - return new[] {(byte) length}; + return new[] { (byte)length }; } - - private int ReadLength() + /// + /// Gets Data Length + /// + /// length + public int ReadLength() { int length = ReadByte(); @@ -306,12 +386,19 @@ namespace Renci.SshNet.Common return length; } - private void WriteBytes(IEnumerable data) + /// + /// Write Byte data into internal buffer. + /// + public void WriteBytes(IEnumerable data) { _data.AddRange(data); } - private byte ReadByte() + /// + /// Reads Byte data into internal buffer. + /// + /// data read + public byte ReadByte() { if (_readerIndex > _data.Count) throw new InvalidOperationException("Read out of boundaries."); @@ -319,7 +406,12 @@ namespace Renci.SshNet.Common return _data[_readerIndex++]; } - private byte[] ReadBytes(int length) + /// + /// Reads lengths Bytes data into internal buffer. + /// + /// data read + /// amount of data to read. + public byte[] ReadBytes(int length) { if (_readerIndex + length > _data.Count) throw new InvalidOperationException("Read out of boundaries."); @@ -330,4 +422,4 @@ namespace Renci.SshNet.Common return result; } } -} +} \ No newline at end of file diff --git a/src/Renci.SshNet/Common/Extensions.cs b/src/Renci.SshNet/Common/Extensions.cs index 784139ab..b2c2e7d7 100644 --- a/src/Renci.SshNet/Common/Extensions.cs +++ b/src/Renci.SshNet/Common/Extensions.cs @@ -261,6 +261,20 @@ namespace Renci.SshNet.Common return value; } + /// + /// Pads with leading zeros if needd + /// + /// The data. + /// The length to pad to. + public static byte[] Pad(this byte[] data, int length) + { + if (length <= data.Length) + return data; + var newData = new byte[length]; + Buffer.BlockCopy(data, 0, newData, newData.Length - data.Length, data.Length); + return newData; + } + public static byte[] Concat(this byte[] first, byte[] second) { if (first == null || first.Length == 0) diff --git a/src/Renci.SshNet/ConnectionInfo.cs b/src/Renci.SshNet/ConnectionInfo.cs index a8317909..26ca884d 100644 --- a/src/Renci.SshNet/ConnectionInfo.cs +++ b/src/Renci.SshNet/ConnectionInfo.cs @@ -378,9 +378,13 @@ namespace Renci.SshNet HostKeyAlgorithms = new Dictionary> { +#if FEATURE_ECDSA + {"ecdsa-sha2-nistp256", data => new KeyHostAlgorithm("ecdsa-sha2-nistp256", new EcdsaKey(), data)}, + {"ecdsa-sha2-nistp384", data => new KeyHostAlgorithm("ecdsa-sha2-nistp384", new EcdsaKey(), data)}, + {"ecdsa-sha2-nistp521", data => new KeyHostAlgorithm("ecdsa-sha2-nistp521", new EcdsaKey(), data)}, +#endif {"ssh-rsa", data => new KeyHostAlgorithm("ssh-rsa", new RsaKey(), data)}, {"ssh-dss", data => new KeyHostAlgorithm("ssh-dss", new DsaKey(), data)}, - //{"ecdsa-sha2-nistp256 "} //{"x509v3-sign-rsa", () => { ... }, //{"x509v3-sign-dss", () => { ... }, //{"spki-sign-rsa", () => { ... }, diff --git a/src/Renci.SshNet/PrivateKeyFile.cs b/src/Renci.SshNet/PrivateKeyFile.cs index f4467234..83834d80 100644 --- a/src/Renci.SshNet/PrivateKeyFile.cs +++ b/src/Renci.SshNet/PrivateKeyFile.cs @@ -22,7 +22,18 @@ namespace Renci.SshNet /// /// /// - /// Supports RSA and DSA private key in both OpenSSH and ssh.com format. + /// The following private keys are supported: + /// + /// + /// RSA in OpenSSH and ssh.com format + /// + /// + /// DSA in OpenSSH and ssh.com format + /// + /// + /// ECDSA 256/384/521 in OpenSSH format + /// + /// /// /// /// The following encryption algorithms are supported: @@ -197,6 +208,12 @@ namespace Renci.SshNet _key = new DsaKey(decryptedData); HostKey = new KeyHostAlgorithm("ssh-dss", _key); break; +#if FEATURE_ECDSA + case "EC": + _key = new EcdsaKey(decryptedData); + HostKey = new KeyHostAlgorithm(_key.ToString(), _key); + break; +#endif case "SSH2 ENCRYPTED": var reader = new SshDataReader(decryptedData); var magicNumber = reader.ReadUInt32(); diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index 62508016..25d882f6 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -18,7 +18,7 @@ full false bin\Debug\ - TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII + TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA prompt 4 bin\Debug\Renci.SshNet.xml @@ -29,7 +29,7 @@ none true bin\Release\ - FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII + FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA prompt 4 bin\Release\Renci.SshNet.xml @@ -301,6 +301,8 @@ + + diff --git a/src/Renci.SshNet/Security/Cryptography/EcdsaDigitalSignature.cs b/src/Renci.SshNet/Security/Cryptography/EcdsaDigitalSignature.cs new file mode 100644 index 00000000..38d60966 --- /dev/null +++ b/src/Renci.SshNet/Security/Cryptography/EcdsaDigitalSignature.cs @@ -0,0 +1,189 @@ +#if FEATURE_ECDSA +using System; +using Renci.SshNet.Common; +using System.Globalization; +using System.Security.Cryptography; + +namespace Renci.SshNet.Security.Cryptography +{ + /// + /// Implements ECDSA digital signature algorithm. + /// + public class EcdsaDigitalSignature : DigitalSignature, IDisposable + { + private readonly EcdsaKey _key; + + /// + /// Initializes a new instance of the class. + /// + /// The ECDSA key. + /// is null. + public EcdsaDigitalSignature(EcdsaKey key) + { + if (key == null) + throw new ArgumentNullException("key"); + + _key = key; + } + + /// + /// Verifies the signature. + /// + /// The input. + /// The signature. + /// + /// true if signature was successfully verified; otherwise false. + /// + public override bool Verify(byte[] input, byte[] signature) + { + // for 521 sig_size is 132 + var sig_size = _key.KeyLength == 521 ? 132 : _key.KeyLength / 4; + var ssh_data = new SshDataSignature(signature, sig_size); +#if NETSTANDARD2_0 + return _key.Ecdsa.VerifyData(input, ssh_data.Signature, _key.HashAlgorithm); +#else + var ecdsa = (ECDsaCng)_key.Ecdsa; + ecdsa.HashAlgorithm = _key.HashAlgorithm; + return ecdsa.VerifyData(input, ssh_data.Signature); +#endif + } + + /// + /// Creates the signature. + /// + /// The input. + /// + /// Signed input data. + /// + public override byte[] Sign(byte[] input) + { +#if NETSTANDARD2_0 + var signed = _key.Ecdsa.SignData(input, _key.HashAlgorithm); +#else + var ecdsa = (ECDsaCng)_key.Ecdsa; + ecdsa.HashAlgorithm = _key.HashAlgorithm; + var signed = ecdsa.SignData(input); +#endif + var ssh_data = new SshDataSignature(signed.Length); + ssh_data.Signature = signed; + return ssh_data.GetBytes(); + } + + #region IDisposable Members + + private bool _isDisposed; + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_isDisposed) + return; + + if (disposing) + { + _isDisposed = true; + } + } + + /// + /// Releases unmanaged resources and performs other cleanup operations before the + /// is reclaimed by garbage collection. + /// + ~EcdsaDigitalSignature() + { + Dispose(false); + } + + #endregion + } + + class SshDataSignature : SshData + { + private int _signature_size; + + private byte[] _signature_r; + private byte[] _signature_s; + + public byte[] Signature + { + get + { + var signature = new byte[_signature_size]; + Buffer.BlockCopy(_signature_r, 0, signature, 0, _signature_r.Length); + Buffer.BlockCopy(_signature_s, 0, signature, _signature_r.Length, _signature_s.Length); + return signature; + } + set + { + var signed_r = new byte[_signature_size / 2]; + Buffer.BlockCopy(value, 0, signed_r, 0, signed_r.Length); + _signature_r = signed_r.ToBigInteger2().ToByteArray().Reverse(); + + var signed_s = new byte[_signature_size / 2]; + Buffer.BlockCopy(value, signed_r.Length, signed_s, 0, signed_s.Length); + _signature_s = signed_s.ToBigInteger2().ToByteArray().Reverse(); + } + } + + public SshDataSignature(int sig_size) + { + _signature_size = sig_size; + } + + public SshDataSignature(byte[] data, int sig_size) + { + _signature_size = sig_size; + Load(data); + } + + protected override void LoadData() + { + _signature_r = ReadBinary().TrimLeadingZeros().Pad(_signature_size / 2); + _signature_s = ReadBinary().TrimLeadingZeros().Pad(_signature_size / 2); + } + + protected override void SaveData() + { + WriteBinaryString(_signature_r.ToBigInteger2().ToByteArray().Reverse()); + WriteBinaryString(_signature_s.ToBigInteger2().ToByteArray().Reverse()); + } + + public new byte[] ReadBinary() + { + var length = ReadUInt32(); + + if (length > int.MaxValue) + { + throw new NotSupportedException(string.Format(CultureInfo.CurrentCulture, "Strings longer than {0} is not supported.", int.MaxValue)); + } + + return ReadBytes((int)length); + } + + protected override int BufferCapacity + { + get + { + var capacity = base.BufferCapacity; + capacity += 4; // r length + capacity += _signature_r.Length; // signature r + capacity += 4; // s length + capacity += _signature_s.Length; // signature s + return capacity; + } + } + } +} +#endif \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Cryptography/EcdsaKey.cs b/src/Renci.SshNet/Security/Cryptography/EcdsaKey.cs new file mode 100644 index 00000000..58861f02 --- /dev/null +++ b/src/Renci.SshNet/Security/Cryptography/EcdsaKey.cs @@ -0,0 +1,459 @@ +#if FEATURE_ECDSA +using System; +using System.IO; +using System.Text; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using Renci.SshNet.Common; +using Renci.SshNet.Security.Cryptography; + +namespace Renci.SshNet.Security +{ + /// + /// Contains ECDSA (ecdsa-sha2-nistp{256,384,521}) private and public key + /// + public class EcdsaKey : Key, IDisposable + { + internal const string ECDSA_P256_OID_VALUE = "1.2.840.10045.3.1.7"; // Also called nistP256 or secP256r1 + internal const string ECDSA_P384_OID_VALUE = "1.3.132.0.34"; // Also called nistP384 or secP384r1 + internal const string ECDSA_P521_OID_VALUE = "1.3.132.0.35"; // Also called nistP521or secP521r1 + +#if !NETSTANDARD2_0 + internal enum KeyBlobMagicNumber : int + { + BCRYPT_ECDSA_PUBLIC_P256_MAGIC = 0x31534345, + BCRYPT_ECDSA_PRIVATE_P256_MAGIC = 0x32534345, + BCRYPT_ECDSA_PUBLIC_P384_MAGIC = 0x33534345, + BCRYPT_ECDSA_PRIVATE_P384_MAGIC = 0x34534345, + BCRYPT_ECDSA_PUBLIC_P521_MAGIC = 0x35534345, + BCRYPT_ECDSA_PRIVATE_P521_MAGIC = 0x36534345, + + BCRYPT_ECDH_PUBLIC_P256_MAGIC = 0x314B4345, + BCRYPT_ECDH_PRIVATE_P256_MAGIC = 0x324B4345, + BCRYPT_ECDH_PUBLIC_P384_MAGIC = 0x334B4345, + BCRYPT_ECDH_PRIVATE_P384_MAGIC = 0x344B4345, + BCRYPT_ECDH_PUBLIC_P521_MAGIC = 0x354B4345, + BCRYPT_ECDH_PRIVATE_P521_MAGIC = 0x364B4345, + + BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC = 0x504B4345, + BCRYPT_ECDH_PRIVATE_GENERIC_MAGIC = 0x564B4345, + } + + [StructLayout(LayoutKind.Sequential)] + internal struct BCRYPT_ECCKEY_BLOB + { + internal KeyBlobMagicNumber Magic; + internal int cbKey; + } + + private CngKey key; +#endif + + /// + /// Gets the SSH name of the ECDSA Key + /// + public override string ToString() + { + return string.Format("ecdsa-sha2-nistp{0}", KeyLength); + } + +#if NETSTANDARD2_0 + /// + /// Gets the HashAlgorithm to use + /// + public HashAlgorithmName HashAlgorithm + { + get + { + switch (KeyLength) + { + case 256: + return HashAlgorithmName.SHA256; + case 384: + return HashAlgorithmName.SHA384; + case 521: + return HashAlgorithmName.SHA512; + } + return HashAlgorithmName.SHA256; + } + } +#else + /// + /// Gets the HashAlgorithm to use + /// + public CngAlgorithm HashAlgorithm + { + get + { + switch (Ecdsa.KeySize) + { + case 256: + return CngAlgorithm.Sha256; + case 384: + return CngAlgorithm.Sha384; + case 521: + return CngAlgorithm.Sha512; + default: + throw new SshException("Unknown KeySize: " + Ecdsa.KeySize); + } + } + } +#endif + + /// + /// Gets the length of the key. + /// + /// + /// The length of the key. + /// + public override int KeyLength + { + get + { + return Ecdsa.KeySize; + } + } + + private EcdsaDigitalSignature _digitalSignature; + + /// + /// Gets the digital signature. + /// + protected override DigitalSignature DigitalSignature + { + get + { + if (_digitalSignature == null) + { + _digitalSignature = new EcdsaDigitalSignature(this); + } + return _digitalSignature; + } + } + + /// + /// Gets or sets the public. + /// + /// + /// The public. + /// + public override BigInteger[] Public + { + get + { + byte[] curve; + byte[] qx; + byte[] qy; +#if NETSTANDARD2_0 + var parameter = Ecdsa.ExportParameters(false); + qx = parameter.Q.X; + qy = parameter.Q.Y; + switch (parameter.Curve.Oid.FriendlyName) + { + case "ECDSA_P256": + case "nistP256": + curve = Encoding.ASCII.GetBytes("nistp256"); + break; + case "ECDSA_P384": + case "nistP384": + curve = Encoding.ASCII.GetBytes("nistp384"); + break; + case "ECDSA_P521": + case "nistP521": + curve = Encoding.ASCII.GetBytes("nistp521"); + break; + default: + throw new SshException("Unexpected Curve Name: " + parameter.Curve.Oid.FriendlyName); + } +#else + var blob = key.Export(CngKeyBlobFormat.EccPublicBlob); + + KeyBlobMagicNumber magic; + using (var br = new BinaryReader(new MemoryStream(blob))) + { + magic = (KeyBlobMagicNumber)br.ReadInt32(); + int cbKey = br.ReadInt32(); + qx = br.ReadBytes(cbKey); + qy = br.ReadBytes(cbKey); + } + + switch (magic) + { + case KeyBlobMagicNumber.BCRYPT_ECDSA_PUBLIC_P256_MAGIC: + curve = Encoding.ASCII.GetBytes("nistp256"); + break; + case KeyBlobMagicNumber.BCRYPT_ECDSA_PUBLIC_P384_MAGIC: + curve = Encoding.ASCII.GetBytes("nistp384"); + break; + case KeyBlobMagicNumber.BCRYPT_ECDSA_PUBLIC_P521_MAGIC: + curve = Encoding.ASCII.GetBytes("nistp521"); + break; + default: + throw new SshException("Unexpected Curve Magic: " + magic); + } +#endif + // Make ECPoint from x and y + // Prepend 04 (uncompressed format) + qx-bytes + qy-bytes + var q = new byte[1 + qx.Length + qy.Length]; + Buffer.SetByte(q, 0, 4); + Buffer.BlockCopy(qx, 0, q, 1, qx.Length); + Buffer.BlockCopy(qy, 0, q, qx.Length + 1, qy.Length); + + // returns Curve-Name and x/y as ECPoint + return new[] { new BigInteger(curve.Reverse()), new BigInteger(q.Reverse()) }; + } + set + { + var curve_s = Encoding.ASCII.GetString(value[0].ToByteArray().Reverse()); + string curve_oid = GetCurveOid(curve_s); + + var publickey = value[1].ToByteArray().Reverse(); + Import(curve_oid, publickey, null); + } + } + + /// + /// Gets ECDsa Object + /// + public ECDsa Ecdsa { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public EcdsaKey() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The curve name + /// Value of publickey + /// Value of privatekey + public EcdsaKey(string curve, byte[] publickey, byte[] privatekey) + { + Import(GetCurveOid(curve), publickey, privatekey); + } + + /// + /// Initializes a new instance of the class. + /// + /// DER encoded private key data. + public EcdsaKey(byte[] data) + { + var der = new DerData(data); + var version = der.ReadBigInteger(); // skip version + + // PrivateKey + var privatekey = der.ReadOctetString().TrimLeadingZeros(); + + // Construct + var s0 = der.ReadByte(); + if ((s0 & 0xe0) != 0xa0) + throw new SshException(string.Format("UnexpectedDER: wanted constructed tag (0xa0-0xbf), got: {0:X}", s0)); + var tag = s0 & 0x1f; + if (tag != 0) + throw new SshException(string.Format("expected tag 0 in DER privkey, got: {0}", tag)); + var construct = der.ReadBytes(der.ReadLength()); // object length + + // curve OID + var curve_der = new DerData(construct, true); + var curve = curve_der.ReadObject(); + + // Construct + s0 = der.ReadByte(); + if ((s0 & 0xe0) != 0xa0) + throw new SshException(string.Format("UnexpectedDER: wanted constructed tag (0xa0-0xbf), got: {0:X}", s0)); + tag = s0 & 0x1f; + if (tag != 1) + throw new SshException(string.Format("expected tag 1 in DER privkey, got: {0}", tag)); + construct = der.ReadBytes(der.ReadLength()); // object length + + // PublicKey + var pubkey_der = new DerData(construct, true); + var pubkey = pubkey_der.ReadBitString().TrimLeadingZeros(); + + Import(OidByteArrayToString(curve), pubkey, privatekey); + } + + private void Import(string curve_oid, byte[] publickey, byte[] privatekey) + { +#if NETSTANDARD2_0 + var curve = ECCurve.CreateFromValue(curve_oid); + var parameter = new ECParameters + { + Curve = curve + }; + + // ECPoint as BigInteger(2) + var cord_size = (publickey.Length - 1) / 2; + var qx = new byte[cord_size]; + Buffer.BlockCopy(publickey, 1, qx, 0, qx.Length); + + var qy = new byte[cord_size]; + Buffer.BlockCopy(publickey, cord_size + 1, qy, 0, qy.Length); + + parameter.Q.X = qx; + parameter.Q.Y = qy; + + if (privatekey != null) + parameter.D = privatekey.TrimLeadingZeros().Pad(cord_size); + + Ecdsa = ECDsa.Create(parameter); +#else + var curve_magic = KeyBlobMagicNumber.BCRYPT_ECDH_PRIVATE_GENERIC_MAGIC; + switch (GetCurveName(curve_oid)) + { + case "nistp256": + if (privatekey != null) + curve_magic = KeyBlobMagicNumber.BCRYPT_ECDSA_PRIVATE_P256_MAGIC; + else + curve_magic = KeyBlobMagicNumber.BCRYPT_ECDSA_PUBLIC_P256_MAGIC; + break; + case "nistp384": + if (privatekey != null) + curve_magic = KeyBlobMagicNumber.BCRYPT_ECDSA_PRIVATE_P384_MAGIC; + else + curve_magic = KeyBlobMagicNumber.BCRYPT_ECDSA_PUBLIC_P384_MAGIC; + break; + case "nistp521": + if (privatekey != null) + curve_magic = KeyBlobMagicNumber.BCRYPT_ECDSA_PRIVATE_P521_MAGIC; + else + curve_magic = KeyBlobMagicNumber.BCRYPT_ECDSA_PUBLIC_P521_MAGIC; + break; + default: + throw new SshException("Unknown: " + curve_oid); + } + + // ECPoint as BigInteger(2) + var cord_size = (publickey.Length - 1) / 2; + var qx = new byte[cord_size]; + Buffer.BlockCopy(publickey, 1, qx, 0, qx.Length); + + var qy = new byte[cord_size]; + Buffer.BlockCopy(publickey, cord_size + 1, qy, 0, qy.Length); + + if (privatekey != null) + privatekey = privatekey.Pad(cord_size); + + int headerSize = Marshal.SizeOf(typeof(BCRYPT_ECCKEY_BLOB)); + int blobSize = headerSize + qx.Length + qy.Length; + if (privatekey != null) + blobSize += privatekey.Length; + + byte[] blob = new byte[blobSize]; + using (var bw = new BinaryWriter(new MemoryStream(blob))) + { + bw.Write((int)curve_magic); + bw.Write(cord_size); + bw.Write(qx); // q.x + bw.Write(qy); // q.y + if (privatekey != null) + bw.Write(privatekey); // d + } + key = CngKey.Import(blob, privatekey == null ? CngKeyBlobFormat.EccPublicBlob : CngKeyBlobFormat.EccPrivateBlob); + + Ecdsa = new ECDsaCng(key); +#endif + } + + private string GetCurveOid(string curve_s) + { + switch (curve_s.ToLower()) + { + case "nistp256": + return ECDSA_P256_OID_VALUE; + case "nistp384": + return ECDSA_P384_OID_VALUE; + case "nistp521": + return ECDSA_P521_OID_VALUE; + default: + throw new SshException("Unexpected Curve Name: " + curve_s); + } + } + + private string GetCurveName(string oid) + { + switch (oid) + { + case ECDSA_P256_OID_VALUE: + return "nistp256"; + case ECDSA_P384_OID_VALUE: + return "nistp384"; + case ECDSA_P521_OID_VALUE: + return "nistp521"; + default: + throw new SshException("Unexpected OID: " + oid); + } + } + + private string OidByteArrayToString(byte[] oid) + { + StringBuilder retVal = new StringBuilder(); + + for (int i = 0; i < oid.Length; i++) + { + if (i == 0) + { + int b = oid[0] % 40; + int a = (oid[0] - b) / 40; + retVal.AppendFormat("{0}.{1}", a, b); + } + else + { + if (oid[i] < 128) + retVal.AppendFormat(".{0}", oid[i]); + else + { + retVal.AppendFormat(".{0}", + ((oid[i] - 128) * 128) + oid[i + 1]); + i++; + } + } + } + + return retVal.ToString(); + } + + #region IDisposable Members + + private bool _isDisposed; + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_isDisposed) + return; + + if (disposing) + { + _isDisposed = true; + } + } + + /// + /// Releases unmanaged resources and performs other cleanup operations before the + /// is reclaimed by garbage collection. + /// + ~EcdsaKey() + { + Dispose(false); + } + + #endregion + } +} +#endif \ No newline at end of file From c9f9e3ca35cb2ec47a6e38bdc246b23e8fe19359 Mon Sep 17 00:00:00 2001 From: Stefan Rinkes Date: Tue, 27 Nov 2018 15:46:59 +0100 Subject: [PATCH 38/67] Support for Ed25519 Host- and Private-Keys --- THIRD-PARTY-NOTICES.TXT | 18 + .../Renci.SshNet.NET35.csproj | 3 + .../Classes/PrivateKeyFileTest.cs | 30 +- .../Data/Key.OPENSSH.ED25519.Encrypted.txt | 9 + .../Data/Key.OPENSSH.ED25519.txt | 8 + .../Renci.SshNet.Tests.csproj | 4 + src/Renci.SshNet/ConnectionInfo.cs | 1 + src/Renci.SshNet/PrivateKeyFile.cs | 157 ++- src/Renci.SshNet/Renci.SshNet.csproj | 5 +- .../Security/Cryptography/Bcrypt.cs | 956 ++++++++++++++++++ .../Cryptography/ED25519DigitalSignature.cs | 93 ++ .../Security/Cryptography/ED25519Key.cs | 154 +++ src/Renci.SshNet/Security/KeyHostAlgorithm.cs | 2 +- 13 files changed, 1434 insertions(+), 6 deletions(-) create mode 100644 src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.Encrypted.txt create mode 100644 src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.txt create mode 100644 src/Renci.SshNet/Security/Cryptography/Bcrypt.cs create mode 100644 src/Renci.SshNet/Security/Cryptography/ED25519DigitalSignature.cs create mode 100644 src/Renci.SshNet/Security/Cryptography/ED25519Key.cs diff --git a/THIRD-PARTY-NOTICES.TXT b/THIRD-PARTY-NOTICES.TXT index 55630a8e..1cacf79e 100644 --- a/THIRD-PARTY-NOTICES.TXT +++ b/THIRD-PARTY-NOTICES.TXT @@ -53,3 +53,21 @@ SHA512 written by Christian Winnerlein (CodesInChaos) public domain directly from the specification + +License notice for BCrypt +------------------------- + +Copyright (c) 2006 Damien Miller +Copyright (c) 2010 Ryan D. Emerle + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj b/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj index 0df2f4f5..0d83005e 100644 --- a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj +++ b/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj @@ -824,6 +824,9 @@ Security\Cryptography\AsymmetricCipher.cs + + Security\Cryptography\Bcrypt.cs + Security\Cryptography\BlockCipher.cs diff --git a/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs b/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs index 3c944c8d..99434d71 100644 --- a/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs +++ b/src/Renci.SshNet.Tests/Classes/PrivateKeyFileTest.cs @@ -545,6 +545,34 @@ namespace Renci.SshNet.Tests.Classes } } + /// + /// A test for opening an openssh v1 keyfile where there is no passphrase. + /// + [TestMethod()] + [Owner("bhalbright")] + [TestCategory("PrivateKey")] + public void TestOpenSshV1KeyFileNoPassphrase() + { + using (var stream = GetData("Key.OPENSSH.ED25519.txt")) + { + new PrivateKeyFile(stream); + } + } + + /// + /// A test for opening an openssh v1 keyfile where there is a passphrase. + /// + [TestMethod()] + [Owner("bhalbright")] + [TestCategory("PrivateKey")] + public void TestOpenSshV1KeyFileWithPassphrase() + { + using (var stream = GetData("Key.OPENSSH.ED25519.Encrypted.txt")) + { + new PrivateKeyFile(stream, "password"); + } + } + private void SaveStreamToFile(Stream stream, string fileName) { var buffer = new byte[4000]; @@ -567,4 +595,4 @@ namespace Renci.SshNet.Tests.Classes return tempFile; } } -} \ No newline at end of file +} diff --git a/src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.Encrypted.txt b/src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.Encrypted.txt new file mode 100644 index 00000000..50b4d968 --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.Encrypted.txt @@ -0,0 +1,9 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABBg +HWh+J0IG6OfYxD74SoT9AAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIGFd +yflleGqSPOhgSYZf7ZQFlG0zEL9VDGC69UbtaaByAAAAoDLm8u8wFwlqjzZRfVxj +wzGTYFJFtfkHRqfFBE4xKgknHNRbCT1OQb7rgE7nZbUXIlb1NCTZLbXti9AYNZpz +ycvPD4Dc6lB03b8pNHoFVSkrCwxrWB5bKtIM4OZNcDK1lZDBEWE2aZXf9puRHbu3 +ccrK/F5GjRi2pUa8qnfqThN1mNPZwFTx4oSKeRaUMdeHBrNwDtaxq32A6Q4KHoYO +KPM= +-----END OPENSSH PRIVATE KEY----- diff --git a/src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.txt b/src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.txt new file mode 100644 index 00000000..84811f65 --- /dev/null +++ b/src/Renci.SshNet.Tests/Data/Key.OPENSSH.ED25519.txt @@ -0,0 +1,8 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtz +c2gtZWQyNTUxOQAAACANCWZw0K8UGXDQC32WBuyzwFtTGBBr1VuZ43uzpTBjIgAA +AKBATgCiQE4AogAAAAtzc2gtZWQyNTUxOQAAACANCWZw0K8UGXDQC32WBuyzwFtT +GBBr1VuZ43uzpTBjIgAAAEAAzBF1MPUxrs+ycpJh28zzo/F3m6WcKO+orsSbR5Lw +KQ0JZnDQrxQZcNALfZYG7LPAW1MYEGvVW5nje7OlMGMiAAAAFGVkMjU1MTkta2V5 +LTIwMTgxMTI3AQIDBAUGBwgJ +-----END OPENSSH PRIVATE KEY----- diff --git a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj index f32beeed..5b9ccafc 100644 --- a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj +++ b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj @@ -719,6 +719,10 @@ + + + + - + \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Cryptography/Bcrypt.cs b/src/Renci.SshNet/Security/Cryptography/Bcrypt.cs new file mode 100644 index 00000000..837d0031 --- /dev/null +++ b/src/Renci.SshNet/Security/Cryptography/Bcrypt.cs @@ -0,0 +1,956 @@ +// +// Copyright (c) 2006 Damien Miller +// Copyright (c) 2010 Ryan D. Emerle +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +using Renci.SshNet.Abstractions; +using System; +using System.Diagnostics; +using System.Security.Cryptography; +using System.Text; + +namespace Renci.SshNet.Security.Cryptography +{ + /// BCrypt implementation. + /// + /// + /// BCrypt implements OpenBSD-style Blowfish password hashing using the scheme described in + /// "A Future- + /// Adaptable Password Scheme" by Niels Provos and David Mazieres. + /// + /// + /// This password hashing system tries to thwart off-line password cracking using a + /// computationally-intensive hashing algorithm, based on Bruce Schneier's Blowfish cipher. + /// The work factor of the algorithm is parameterised, so it can be increased as computers + /// get faster. + /// + /// + /// Usage is really simple. To hash a password for the first time, call the method with a random salt, like this: + /// + /// string pw_hash = BCrypt.HashPassword(plain_password); + /// + /// To check whether a plaintext password matches one that has been hashed previously, + /// use the method: + /// + /// + /// if (BCrypt.Verify(candidate_password, stored_hash)) + /// Console.WriteLine("It matches"); + /// else + /// Console.WriteLine("It does not match"); + /// + /// + /// The method takes an optional parameter (workFactor) that + /// determines the computational complexity of the hashing: + /// + /// + /// string strong_salt = BCrypt.GenerateSalt(10); + /// string stronger_salt = BCrypt.GenerateSalt(12); + /// + /// + /// The amount of work increases exponentially (2^workFactor), so each increment is twice + /// as much work. The default workFactor is 10, and the valid range is 4 to 31. + /// + /// + internal sealed class BCrypt + { + // BCrypt parameters + private const int GENSALT_DEFAULT_LOG2_ROUNDS = 10; + private const int BCRYPT_SALT_LEN = 16; + + // Blowfish parameters + private const int BLOWFISH_NUM_ROUNDS = 16; + + // Initial contents of key schedule + private static readonly uint[] _POrig = { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + }; + + private static readonly uint[] _SOrig = { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + }; + + // OpenBSD IV: "OxychromaticBlowfishSwatDynamite" in big endian + private static readonly uint[] _OpenBsdIv = new uint[] { + 0x4f787963, 0x68726f6d, 0x61746963, 0x426c6f77, + 0x66697368, 0x53776174, 0x44796e61, 0x6d697465, + }; + + // bcrypt IV: "OrpheanBeholderScryDoubt" + private static readonly uint[] _BfCryptCiphertext = { + 0x4f727068, 0x65616e42, 0x65686f6c, + 0x64657253, 0x63727944, 0x6f756274 + }; + + // Table for Base64 encoding + private static readonly char[] _Base64Code = { + '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9' + }; + + // Table for Base64 decoding + private static readonly int[] _Index64 = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, + -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + -1, -1, -1, -1, -1, -1, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, -1, -1, -1, -1, -1 + }; + + // Expanded Blowfish key + private uint[] _P; + private uint[] _S; + + /// + /// Hash a string using the OpenBSD bcrypt scheme and a salt generated by . + /// + /// Just an alias for HashPassword. + /// The string to hash. + /// The hashed string. + public static string HashString(string source) + { + return HashPassword(source); + } + + /// + /// Hash a string using the OpenBSD bcrypt scheme and a salt generated by . + /// + /// Just an alias for HashPassword. + /// The string to hash. + /// The log2 of the number of rounds of hashing to apply - the work + /// factor therefore increases as 2^workFactor. + /// The hashed string. + public static string HashString(string source, int workFactor) + { + return HashPassword(source, GenerateSalt(workFactor)); + } + + /// + /// Hash a password using the OpenBSD bcrypt scheme and a salt generated by . + /// + /// The password to hash. + /// The hashed password. + public static string HashPassword(string input) + { + return HashPassword(input, GenerateSalt()); + } + + /// + /// Hash a password using the OpenBSD bcrypt scheme and a salt generated by using the given . + /// + /// The password to hash. + /// The log2 of the number of rounds of hashing to apply - the work + /// factor therefore increases as 2^workFactor. + /// The hashed password. + public static string HashPassword(string input, int workFactor) + { + return HashPassword(input, GenerateSalt(workFactor)); + } + + /// Hash a password using the OpenBSD bcrypt scheme. + /// Thrown when one or more arguments have unsupported or + /// illegal values. + /// The password to hash. + /// the salt to hash with (perhaps generated using BCrypt.gensalt). + /// The hashed password + public static string HashPassword(string input, string salt) + { + if (input == null) + throw new ArgumentNullException("input"); + + if (string.IsNullOrEmpty(salt)) + throw new ArgumentException("Invalid salt", "salt"); + + // Determinthe starting offset and validate the salt + int startingOffset; + char minor = (char)0; + if (salt[0] != '$' || salt[1] != '2') + throw new SaltParseException("Invalid salt version"); + if (salt[2] == '$') + startingOffset = 3; + else + { + minor = salt[2]; + if (minor != 'a' || salt[3] != '$') + throw new SaltParseException("Invalid salt revision"); + startingOffset = 4; + } + + // Extract number of rounds + if (salt[startingOffset + 2] > '$') + throw new SaltParseException("Missing salt rounds"); + + // Extract details from salt + int logRounds = Convert.ToInt32(salt.Substring(startingOffset, 2)); + string extractedSalt = salt.Substring(startingOffset + 3, 22); + + byte[] inputBytes = Encoding.UTF8.GetBytes((input + (minor >= 'a' ? "\0" : ""))); + byte[] saltBytes = DecodeBase64(extractedSalt, BCRYPT_SALT_LEN); + + BCrypt bCrypt = new BCrypt(); + byte[] hashed = bCrypt.CryptRaw(inputBytes, saltBytes, logRounds); + + // Generate result string + StringBuilder result = new StringBuilder(); + result.Append("$2"); + if (minor >= 'a') + result.Append(minor); + result.AppendFormat("${0:00}$", logRounds); + result.Append(EncodeBase64(saltBytes, saltBytes.Length)); + result.Append(EncodeBase64(hashed, (_BfCryptCiphertext.Length * 4) - 1)); + return result.ToString(); + } + + /// + /// Generate a salt for use with the method. + /// + /// The log2 of the number of rounds of hashing to apply - the work + /// factor therefore increases as 2**workFactor. + /// A base64 encoded salt value. + public static string GenerateSalt(int workFactor) + { + if (workFactor < 4 || workFactor > 31) + throw new ArgumentOutOfRangeException("workFactor", "The work factor must be between 4 and 31 (inclusive)"); + + byte[] rnd = new byte[BCRYPT_SALT_LEN]; +#if FEATURE_RNG_CREATE + RandomNumberGenerator rng = RandomNumberGenerator.Create(); +#elif FEATURE_RNG_CSP + RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); +#endif +#if FEATURE_RNG_CREATE || FEATURE_RNG_CSP + rng.GetBytes(rnd); +#endif + + StringBuilder rs = new StringBuilder(); + rs.AppendFormat("$2a${0:00}$", workFactor); + rs.Append(EncodeBase64(rnd, rnd.Length)); + return rs.ToString(); + } + + /// + /// Generate a salt for use with the method + /// selecting a reasonable default for the number of hashing rounds to apply. + /// + /// A base64 encoded salt value. + public static string GenerateSalt() + { + return GenerateSalt(GENSALT_DEFAULT_LOG2_ROUNDS); + } + + /// + /// Verifies that the hash of the given matches the provided + /// + /// + /// The text to verify. + /// The previously-hashed password. + /// true if the passwords match, false otherwise. + public static bool Verify(string text, string hash) + { + return hash == HashPassword(text, hash); + } + + /// + /// Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note that this + /// is *not* compatible with the standard MIME-base64 encoding. + /// + /// Thrown when one or more arguments have unsupported or + /// illegal values. + /// The byte array to encode. + /// The number of bytes to encode. + /// Base64-encoded string. + private static string EncodeBase64(byte[] byteArray, int length) + { + if (length <= 0 || length > byteArray.Length) + throw new ArgumentException("Invalid length", "length"); + + int off = 0; + StringBuilder rs = new StringBuilder(); + while (off < length) + { + int c1 = byteArray[off++] & 0xff; + rs.Append(_Base64Code[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= length) + { + rs.Append(_Base64Code[c1 & 0x3f]); + break; + } + int c2 = byteArray[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.Append(_Base64Code[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= length) + { + rs.Append(_Base64Code[c1 & 0x3f]); + break; + } + c2 = byteArray[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.Append(_Base64Code[c1 & 0x3f]); + rs.Append(_Base64Code[c2 & 0x3f]); + } + return rs.ToString(); + } + + /// + /// Decode a string encoded using bcrypt's base64 scheme to a byte array. Note that this is *not* + /// compatible with the standard MIME-base64 encoding. + /// + /// Thrown when one or more arguments have unsupported or + /// illegal values. + /// The string to decode. + /// The maximum bytes to decode. + /// The decoded byte array. + private static byte[] DecodeBase64(string encodedstring, int maximumBytes) + { + int position = 0, + sourceLength = encodedstring.Length, + outputLength = 0; + + if (maximumBytes <= 0) + throw new ArgumentException("Invalid maximum bytes value", "maximumBytes"); + + // TODO: update to use a List - it's only ever 16 bytes, so it's not a big deal + StringBuilder rs = new StringBuilder(); + while (position < sourceLength - 1 && outputLength < maximumBytes) + { + int c1 = Char64(encodedstring[position++]); + int c2 = Char64(encodedstring[position++]); + if (c1 == -1 || c2 == -1) + break; + + rs.Append((char)((c1 << 2) | ((c2 & 0x30) >> 4))); + if (++outputLength >= maximumBytes || position >= sourceLength) + break; + + int c3 = Char64(encodedstring[position++]); + if (c3 == -1) + break; + + rs.Append((char)(((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2))); + if (++outputLength >= maximumBytes || position >= sourceLength) + break; + + int c4 = Char64(encodedstring[position++]); + rs.Append((char)(((c3 & 0x03) << 6) | c4)); + + ++outputLength; + } + + byte[] ret = new byte[outputLength]; + for (position = 0; position < outputLength; position++) + ret[position] = (byte)rs[position]; + return ret; + } + + /// + /// Look up the 3 bits base64-encoded by the specified character, range-checking against + /// conversion table. + /// + /// The base64-encoded value. + /// The decoded value of x. + private static int Char64(char character) + { + if (character < 0 || character > _Index64.Length) + return -1; + return _Index64[character]; + } + + /// Blowfish encipher a single 64-bit block encoded as two 32-bit halves. + /// An array containing the two 32-bit half blocks. + /// The position in the array of the blocks. + private void Encipher(uint[] blockArray, int offset) + { + uint round, + n, + block = blockArray[offset], + r = blockArray[offset + 1]; + + block ^= _P[0]; + for (round = 0; round <= BLOWFISH_NUM_ROUNDS - 2;) + { + // Feistel substitution on left word + n = _S[(block >> 24) & 0xff]; + n += _S[0x100 | ((block >> 16) & 0xff)]; + n ^= _S[0x200 | ((block >> 8) & 0xff)]; + n += _S[0x300 | (block & 0xff)]; + r ^= n ^ _P[++round]; + + // Feistel substitution on right word + n = _S[(r >> 24) & 0xff]; + n += _S[0x100 | ((r >> 16) & 0xff)]; + n ^= _S[0x200 | ((r >> 8) & 0xff)]; + n += _S[0x300 | (r & 0xff)]; + block ^= n ^ _P[++round]; + } + blockArray[offset] = r ^ _P[BLOWFISH_NUM_ROUNDS + 1]; + blockArray[offset + 1] = block; + } + + /// Cycically extract a word of key material. + /// The string to extract the data from. + /// [in,out] The current offset. + /// The next word of material from data. + private static uint StreamToWord(byte[] data, ref int offset) + { + int i; + uint word = 0; + + for (i = 0; i < 4; i++) + { + word = (word << 8) | (uint)(data[offset] & 0xff); + offset = (offset + 1) % data.Length; + } + return word; + } + + /// Initializes the Blowfish key schedule. + private void InitializeKey() + { + _P = new uint[_POrig.Length]; + _S = new uint[_SOrig.Length]; + Array.Copy(_POrig, _P, _POrig.Length); + Array.Copy(_SOrig, _S, _SOrig.Length); + } + + /// Key the Blowfish cipher. + /// The key byte array. + private void Key(byte[] keyBytes) + { + int i; + int koffp = 0; + uint[] lr = { 0, 0 }; + int plen = _P.Length, slen = _S.Length; + + for (i = 0; i < plen; i++) + _P[i] = _P[i] ^ StreamToWord(keyBytes, ref koffp); + + for (i = 0; i < plen; i += 2) + { + Encipher(lr, 0); + _P[i] = lr[0]; + _P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) + { + Encipher(lr, 0); + _S[i] = lr[0]; + _S[i + 1] = lr[1]; + } + } + + /// + /// Perform the "enhanced key schedule" step described by Provos and Mazieres in "A Future- + /// Adaptable Password Scheme" http://www.openbsd.org/papers/bcrypt-paper.ps. + /// + /// Salt byte array. + /// Input byte array. + private void EKSKey(byte[] saltBytes, byte[] inputBytes) + { + int i; + int passwordOffset = 0, + saltOffset = 0; + uint[] lr = { 0, 0 }; + int plen = _P.Length, slen = _S.Length; + + for (i = 0; i < plen; i++) + _P[i] = _P[i] ^ StreamToWord(inputBytes, ref passwordOffset); + + for (i = 0; i < plen; i += 2) + { + lr[0] ^= StreamToWord(saltBytes, ref saltOffset); + lr[1] ^= StreamToWord(saltBytes, ref saltOffset); + Encipher(lr, 0); + _P[i] = lr[0]; + _P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) + { + lr[0] ^= StreamToWord(saltBytes, ref saltOffset); + lr[1] ^= StreamToWord(saltBytes, ref saltOffset); + Encipher(lr, 0); + _S[i] = lr[0]; + _S[i + 1] = lr[1]; + } + } + + /// Perform the central hashing step in the bcrypt scheme. + /// Thrown when one or more arguments have unsupported or + /// illegal values. + /// The input byte array to hash. + /// The salt byte array to hash with. + /// The binary logarithm of the number of rounds of hashing to apply. + /// A byte array containing the hashed result. + private byte[] CryptRaw(byte[] inputBytes, byte[] saltBytes, int logRounds) + { + uint[] cdata = new uint[_BfCryptCiphertext.Length]; + Array.Copy(_BfCryptCiphertext, cdata, _BfCryptCiphertext.Length); + int clen = cdata.Length; + + if (logRounds < 4 || logRounds > 31) + throw new ArgumentException("Bad number of rounds", "logRounds"); + + if (saltBytes.Length != BCRYPT_SALT_LEN) + throw new ArgumentException("Bad salt Length", "saltBytes"); + + uint rounds = 1u << logRounds; + Debug.Assert(rounds > 0, "Rounds must be > 0"); // We overflowed rounds at 31 - added safety check + + InitializeKey(); + EKSKey(saltBytes, inputBytes); + + for (int i = 0; i < rounds; i++) + { + Key(inputBytes); + Key(saltBytes); + } + + for (int i = 0; i < 64; i++) + { + for (int j = 0; j < (clen >> 1); j++) + Encipher(cdata, j << 1); + } + + byte[] ret = new byte[clen * 4]; + for (int i = 0, j = 0; i < clen; i++) + { + ret[j++] = (byte)((cdata[i] >> 24) & 0xff); + ret[j++] = (byte)((cdata[i] >> 16) & 0xff); + ret[j++] = (byte)((cdata[i] >> 8) & 0xff); + ret[j++] = (byte)(cdata[i] & 0xff); + } + return ret; + } + + /** + * Compatibility with new OpenBSD function. + * Ported from SSHJ library (https://github.com/hierynomus/sshj) + */ + public void Hash(byte[] hpass, byte[] hsalt, byte[] output) + { + InitializeKey(); + EKSKey(hsalt, hpass); + for (int i = 0; i < 64; i++) + { + Key(hsalt); + Key(hpass); + } + + uint[] buf = new uint[_OpenBsdIv.Length]; + Array.Copy(_OpenBsdIv, 0, buf, 0, _OpenBsdIv.Length); + for (int i = 0; i < 8; i += 2) + { + for (int j = 0; j < 64; j++) + { + Encipher(buf, i); + } + } + + for (int i = 0, j = 0; i < buf.Length; i++) + { + // Output of this is little endian + output[j++] = (byte)(buf[i] & 0xff); + output[j++] = (byte)((buf[i] >> 8) & 0xff); + output[j++] = (byte)((buf[i] >> 16) & 0xff); + output[j++] = (byte)((buf[i] >> 24) & 0xff); + } + } + + /// + /// Applies the Bcrypt kdf to derive a key and iv from the passphrase, + /// the key/iv are returned in the output variable. + /// Ported from the SSHJ library. https://github.com/hierynomus/sshj + /// + /// + /// + /// + /// + public void Pbkdf(byte[] password, byte[] salt, int rounds, byte[] output) + { + using (var sha512 = CryptoAbstraction.CreateSHA512()) + { + int nblocks = (output.Length + 31) / 32; + byte[] hpass = sha512.ComputeHash(password); + + byte[] hsalt = new byte[64]; + byte[] block_b = new byte[4]; + byte[] outBytes = new byte[32]; + byte[] tmp = new byte[32]; + for (int block = 1; block <= nblocks; block++) + { + // Block count is in big endian + block_b[0] = (byte)((block >> 24) & 0xFF); + block_b[1] = (byte)((block >> 16) & 0xFF); + block_b[2] = (byte)((block >> 8) & 0xFF); + block_b[3] = (byte)(block & 0xFF); + + hsalt = sha512.ComputeHash(AppendArrays(salt, block_b)); + Hash(hpass, hsalt, outBytes); + Array.Copy(outBytes, 0, tmp, 0, outBytes.Length); + + for (int round = 1; round < rounds; round++) + { + hsalt = sha512.ComputeHash(tmp); + Hash(hpass, hsalt, tmp); + + for (int i = 0; i < tmp.Length; i++) + { + outBytes[i] ^= tmp[i]; + } + } + + for (int i = 0; i < outBytes.Length; i++) + { + int idx = i * nblocks + (block - 1); + if (idx < output.Length) + { + output[idx] = outBytes[i]; + } + } + } + } + } + + /// + /// Appends multiple byte arrays into one array. + /// + /// + /// + /// + private byte[] AppendArrays(byte[] b1, params byte[][] others) + { + //from https://stackoverflow.com/questions/46534429/how-to-convert-java-messagedigest-with-two-update-statements-to-c-sharp + int n = b1.Length; + foreach (var other in others) + { + n += other.Length; + } + + var result = new byte[n]; + + n = 0; + Array.Copy(b1, 0, result, n, b1.Length); + n += b1.Length; + foreach (var other in others) + { + Array.Copy(other, 0, result, n, other.Length); + n += other.Length; + } + + return result; + } + + /// Exception for signalling parse errors. + public class SaltParseException : Exception + { + /// Default constructor. + public SaltParseException() + { + } + + /// Initializes a new instance of . + /// The message. + public SaltParseException(string message) + : base(message) + { + } + + /// Initializes a new instance of . + /// The message. + /// The inner exception. + public SaltParseException(string message, Exception innerException) + : base(message, innerException) + { + } + } + } +} diff --git a/src/Renci.SshNet/Security/Cryptography/ED25519DigitalSignature.cs b/src/Renci.SshNet/Security/Cryptography/ED25519DigitalSignature.cs new file mode 100644 index 00000000..be68fd48 --- /dev/null +++ b/src/Renci.SshNet/Security/Cryptography/ED25519DigitalSignature.cs @@ -0,0 +1,93 @@ +using System; +using Renci.SshNet.Common; +using Renci.SshNet.Security.Chaos.NaCl; + +namespace Renci.SshNet.Security.Cryptography +{ + /// + /// Implements ECDSA digital signature algorithm. + /// + public class ED25519DigitalSignature : DigitalSignature, IDisposable + { + private readonly ED25519Key _key; + + /// + /// Initializes a new instance of the class. + /// + /// The ED25519Key key. + /// is null. + public ED25519DigitalSignature(ED25519Key key) + { + if (key == null) + throw new ArgumentNullException("key"); + + _key = key; + } + + /// + /// Verifies the signature. + /// + /// The input. + /// The signature. + /// + /// true if signature was successfully verified; otherwise false. + /// + /// Invalid signature. + public override bool Verify(byte[] input, byte[] signature) + { + return Ed25519.Verify(signature, input, _key.PublicKey); + } + + /// + /// Creates the signature. + /// + /// The input. + /// + /// Signed input data. + /// + /// Invalid ED25519Key key. + public override byte[] Sign(byte[] input) + { + return Ed25519.Sign(input, _key.PrivateKey); + } + + #region IDisposable Members + + private bool _isDisposed; + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_isDisposed) + return; + + if (disposing) + { + _isDisposed = true; + } + } + + /// + /// Releases unmanaged resources and performs other cleanup operations before the + /// is reclaimed by garbage collection. + /// + ~ED25519DigitalSignature() + { + Dispose(false); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/Cryptography/ED25519Key.cs b/src/Renci.SshNet/Security/Cryptography/ED25519Key.cs new file mode 100644 index 00000000..83ac1c8c --- /dev/null +++ b/src/Renci.SshNet/Security/Cryptography/ED25519Key.cs @@ -0,0 +1,154 @@ +using System; +using Renci.SshNet.Common; +using Renci.SshNet.Security.Cryptography; +using Renci.SshNet.Security.Chaos.NaCl; + +namespace Renci.SshNet.Security +{ + /// + /// Contains ED25519 private and public key + /// + public class ED25519Key : Key, IDisposable + { + private ED25519DigitalSignature _digitalSignature; + + private byte[] publicKey = new byte[Ed25519.PublicKeySizeInBytes]; + private byte[] privateKey = new byte[Ed25519.ExpandedPrivateKeySizeInBytes]; + + /// + /// Gets the Key String. + /// + public override string ToString() + { + return "ssh-ed25519"; + } + + /// + /// Gets or sets the public. + /// + /// + /// The public. + /// + public override BigInteger[] Public + { + get + { + return new BigInteger[] { publicKey.ToBigInteger() }; + } + set + { + publicKey = value[0].ToByteArray().Reverse().TrimLeadingZeros().Pad(Ed25519.PublicKeySizeInBytes); + } + } + + /// + /// Gets the length of the key. + /// + /// + /// The length of the key. + /// + public override int KeyLength + { + get + { + return PublicKey.Length; + } + } + + /// + /// Gets the digital signature. + /// + protected override DigitalSignature DigitalSignature + { + get + { + if (_digitalSignature == null) + { + _digitalSignature = new ED25519DigitalSignature(this); + } + return _digitalSignature; + } + } + + /// + /// Gets the PublicKey Bytes + /// + public byte[] PublicKey + { + get + { + return publicKey; + } + } + + /// + /// Gets the PrivateKey Bytes + /// + public byte[] PrivateKey + { + get + { + return privateKey; + } + } + + /// + /// Initializes a new instance of the class. + /// + public ED25519Key() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// pk data. + /// sk data. + public ED25519Key(byte[] pk, byte[] sk) + { + publicKey = pk.TrimLeadingZeros().Pad(Ed25519.PublicKeySizeInBytes); + var seed = new byte[Ed25519.PrivateKeySeedSizeInBytes]; + Buffer.BlockCopy(sk, 0, seed, 0, seed.Length); + Ed25519.KeyPairFromSeed(out publicKey, out privateKey, seed); + } + + #region IDisposable Members + + private bool _isDisposed; + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_isDisposed) + return; + + if (disposing) + { + _isDisposed = true; + } + } + + /// + /// Releases unmanaged resources and performs other cleanup operations before the + /// is reclaimed by garbage collection. + /// + ~ED25519Key() + { + Dispose(false); + } + + #endregion + } +} diff --git a/src/Renci.SshNet/Security/KeyHostAlgorithm.cs b/src/Renci.SshNet/Security/KeyHostAlgorithm.cs index 619bfc92..e9899214 100644 --- a/src/Renci.SshNet/Security/KeyHostAlgorithm.cs +++ b/src/Renci.SshNet/Security/KeyHostAlgorithm.cs @@ -92,7 +92,7 @@ namespace Renci.SshNet.Security for (var i = 0; i < _keys.Count; i++) { var key = _keys[i]; - keys[i] = key.ToBigInteger(); + keys[i] = key.ToBigInteger2(); } return keys; } From 7d7365156eeb4c7d22ca6906a683a701f0bdca6f Mon Sep 17 00:00:00 2001 From: Stefan Rinkes Date: Mon, 3 Dec 2018 09:13:24 +0100 Subject: [PATCH 39/67] Enable Build of Elliptic-Curves for other Projects --- .../Renci.SshNet.NET35.csproj | 207 +++++++++++++++++ .../Renci.SshNet.Silverlight5.csproj | 210 +++++++++++++++++ .../Renci.SshNet.Tests.NET35.csproj | 6 + .../Renci.SshNet.UAP10.csproj | 216 ++++++++++++++++++ .../Renci.SshNet.WindowsPhone8.csproj | 216 ++++++++++++++++++ .../crypto/prng/CryptoApiRandomGenerator.cs | 4 - .../Security/BouncyCastle/math/BigInteger.cs | 2 +- .../security/SecurityUtilityException.cs | 2 +- 8 files changed, 857 insertions(+), 6 deletions(-) diff --git a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj b/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj index 0d83005e..ffd2bce5 100644 --- a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj +++ b/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj @@ -821,6 +821,189 @@ Security\CertificateHostAlgorithm.cs + + Security\Cryptography\Chaos.NaCl\CryptoBytes.cs + + + Security\Cryptography\Chaos.NaCl\Ed25519.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array16.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array8.cs + + + Security\Cryptography\Chaos.NaCl\Internal\ByteIntegerConverter.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cmov.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cswap.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_invert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnegative.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnonzero.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul121666.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_neg.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_pow22523.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\FieldElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_double_scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_madd.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_msub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p3.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_cached.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_precomp_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_scalarmult_base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\GroupElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\keypair.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\open.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_clamp.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_mul_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_reduce.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sign.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sqrtm1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\InternalAssert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Poly1305Donna.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\Salsa20.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\SalsaCore.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Sha512Internal.cs + + + Security\Cryptography\Chaos.NaCl\MontgomeryCurve25519.cs + + + Security\Cryptography\Chaos.NaCl\Sha512.cs + Security\Cryptography\AsymmetricCipher.cs @@ -896,6 +1079,12 @@ Security\Cryptography\DsaKey.cs + + Security\Cryptography\ED25519DigitalSignature.cs + + + Security\Cryptography\ED25519Key.cs + Security\Cryptography\HMACMD5.cs @@ -965,6 +1154,24 @@ Security\KeyExchangeDiffieHellmanGroupSha1.cs + + Security\KeyExchangeEC.cs + + + Security\KeyExchangeECCurve25519.cs + + + Security\KeyExchangeECDH.cs + + + Security\KeyExchangeECDH256.cs + + + Security\KeyExchangeECDH384.cs + + + Security\KeyExchangeECDH521.cs + Security\KeyHostAlgorithm.cs diff --git a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj index e6627600..2523a02f 100644 --- a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj +++ b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj @@ -821,9 +821,195 @@ Security\CertificateHostAlgorithm.cs + + Security\Cryptography\Chaos.NaCl\CryptoBytes.cs + + + Security\Cryptography\Chaos.NaCl\Ed25519.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array16.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array8.cs + + + Security\Cryptography\Chaos.NaCl\Internal\ByteIntegerConverter.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cmov.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cswap.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_invert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnegative.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnonzero.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul121666.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_neg.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_pow22523.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\FieldElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_double_scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_madd.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_msub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p3.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_cached.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_precomp_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_scalarmult_base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\GroupElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\keypair.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\open.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_clamp.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_mul_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_reduce.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sign.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sqrtm1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\InternalAssert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Poly1305Donna.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\Salsa20.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\SalsaCore.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Sha512Internal.cs + + + Security\Cryptography\Chaos.NaCl\MontgomeryCurve25519.cs + + + Security\Cryptography\Chaos.NaCl\Sha512.cs + Security\Cryptography\AsymmetricCipher.cs + + Security\Cryptography\Bcrypt.cs + Security\Cryptography\BlockCipher.cs @@ -893,6 +1079,12 @@ Security\Cryptography\DsaKey.cs + + Security\Cryptography\ED25519DigitalSignature.cs + + + Security\Cryptography\ED25519Key.cs + Security\Cryptography\HMACMD5.cs @@ -956,6 +1148,24 @@ Security\KeyExchangeDiffieHellmanGroupSha1.cs + + Security\KeyExchangeEC.cs + + + Security\KeyExchangeECCurve25519.cs + + + Security\KeyExchangeECDH.cs + + + Security\KeyExchangeECDH256.cs + + + Security\KeyExchangeECDH384.cs + + + Security\KeyExchangeECDH521.cs + Security\KeyHostAlgorithm.cs diff --git a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj index ec5feb95..abeeb691 100644 --- a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj +++ b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj @@ -1762,6 +1762,12 @@ Data\Key.ECDSA521.Encrypted.txt + + Data\Key.OPENSSH.ED25519.Encrypted.txt + + + Data\Key.OPENSSH.ED25519.txt + diff --git a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj index 369c3da7..d1b874f4 100644 --- a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj +++ b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj @@ -885,9 +885,195 @@ Security\CertificateHostAlgorithm.cs + + Security\Cryptography\Chaos.NaCl\CryptoBytes.cs + + + Security\Cryptography\Chaos.NaCl\Ed25519.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array16.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array8.cs + + + Security\Cryptography\Chaos.NaCl\Internal\ByteIntegerConverter.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cmov.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cswap.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_invert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnegative.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnonzero.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul121666.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_neg.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_pow22523.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\FieldElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_double_scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_madd.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_msub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p3.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_cached.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_precomp_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_scalarmult_base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\GroupElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\keypair.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\open.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_clamp.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_mul_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_reduce.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sign.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sqrtm1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\InternalAssert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Poly1305Donna.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\Salsa20.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\SalsaCore.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Sha512Internal.cs + + + Security\Cryptography\Chaos.NaCl\MontgomeryCurve25519.cs + + + Security\Cryptography\Chaos.NaCl\Sha512.cs + Security\Cryptography\AsymmetricCipher.cs + + Security\Cryptography\Bcrypt.cs + Security\Cryptography\BlockCipher.cs @@ -957,6 +1143,12 @@ Security\Cryptography\DsaKey.cs + + Security\Cryptography\ED25519DigitalSignature.cs + + + Security\Cryptography\ED25519Key.cs + Security\Cryptography\HMACMD5.cs @@ -975,6 +1167,12 @@ Security\Cryptography\Key.cs + + Security\Cryptography\EcdsaDigitalSignature.cs + + + Security\Cryptography\EcdsaKey.cs + Security\Cryptography\RsaDigitalSignature.cs @@ -1020,6 +1218,24 @@ Security\KeyExchangeDiffieHellmanGroupSha1.cs + + Security\KeyExchangeEC.cs + + + Security\KeyExchangeECCurve25519.cs + + + Security\KeyExchangeECDH.cs + + + Security\KeyExchangeECDH256.cs + + + Security\KeyExchangeECDH384.cs + + + Security\KeyExchangeECDH521.cs + Security\KeyHostAlgorithm.cs diff --git a/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj b/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj index 9300a9b4..7a915c18 100644 --- a/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj +++ b/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj @@ -850,9 +850,195 @@ Security\CertificateHostAlgorithm.cs + + Security\Cryptography\Chaos.NaCl\CryptoBytes.cs + + + Security\Cryptography\Chaos.NaCl\Ed25519.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array16.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array8.cs + + + Security\Cryptography\Chaos.NaCl\Internal\ByteIntegerConverter.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cmov.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cswap.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_invert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnegative.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnonzero.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul121666.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_neg.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_pow22523.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\FieldElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_double_scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_madd.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_msub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p3.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_cached.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_precomp_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_scalarmult_base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\GroupElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\keypair.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\open.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_clamp.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_mul_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_reduce.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sign.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sqrtm1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\InternalAssert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Poly1305Donna.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\Salsa20.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\SalsaCore.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Sha512Internal.cs + + + Security\Cryptography\Chaos.NaCl\MontgomeryCurve25519.cs + + + Security\Cryptography\Chaos.NaCl\Sha512.cs + Security\Cryptography\AsymmetricCipher.cs + + Security\Cryptography\Bcrypt.cs + Security\Cryptography\BlockCipher.cs @@ -919,6 +1105,12 @@ Security\Cryptography\DsaKey.cs + + Security\Cryptography\ED25519DigitalSignature.cs + + + Security\Cryptography\ED25519Key.cs + Security\Cryptography\HMACMD5.cs @@ -937,6 +1129,12 @@ Security\Cryptography\Key.cs + + Security\Cryptography\EcdsaDigitalSignature.cs + + + Security\Cryptography\EcdsaKey.cs + Security\Cryptography\RsaDigitalSignature.cs @@ -982,6 +1180,24 @@ Security\KeyExchangeDiffieHellmanGroupSha1.cs + + Security\KeyExchangeEC.cs + + + Security\KeyExchangeECCurve25519.cs + + + Security\KeyExchangeECDH.cs + + + Security\KeyExchangeECDH256.cs + + + Security\KeyExchangeECDH384.cs + + + Security\KeyExchangeECDH521.cs + Security\KeyHostAlgorithm.cs diff --git a/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/CryptoApiRandomGenerator.cs b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/CryptoApiRandomGenerator.cs index b0c40cb4..5dd468b0 100644 --- a/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/CryptoApiRandomGenerator.cs +++ b/src/Renci.SshNet/Security/BouncyCastle/crypto/prng/CryptoApiRandomGenerator.cs @@ -1,5 +1,3 @@ -#if !(NETCF_1_0 || PORTABLE) - using System; using System.Security.Cryptography; @@ -69,5 +67,3 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Prng #endregion } } - -#endif diff --git a/src/Renci.SshNet/Security/BouncyCastle/math/BigInteger.cs b/src/Renci.SshNet/Security/BouncyCastle/math/BigInteger.cs index b618501a..635a2540 100644 --- a/src/Renci.SshNet/Security/BouncyCastle/math/BigInteger.cs +++ b/src/Renci.SshNet/Security/BouncyCastle/math/BigInteger.cs @@ -10,7 +10,7 @@ using Renci.SshNet.Security.Org.BouncyCastle.Utilities; namespace Renci.SshNet.Security.Org.BouncyCastle.Math { -#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE) +#if FEATURE_BINARY_SERIALIZATION [Serializable] #endif internal class BigInteger diff --git a/src/Renci.SshNet/Security/BouncyCastle/security/SecurityUtilityException.cs b/src/Renci.SshNet/Security/BouncyCastle/security/SecurityUtilityException.cs index d7189384..25a442e4 100644 --- a/src/Renci.SshNet/Security/BouncyCastle/security/SecurityUtilityException.cs +++ b/src/Renci.SshNet/Security/BouncyCastle/security/SecurityUtilityException.cs @@ -2,7 +2,7 @@ using System; namespace Renci.SshNet.Security.Org.BouncyCastle.Security { -#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE) +#if FEATURE_BINARY_SERIALIZATION [Serializable] #endif internal class SecurityUtilityException From 982ef10ae74220ecc42a94b24d02628c16b3ee61 Mon Sep 17 00:00:00 2001 From: drieseng Date: Sat, 11 Jan 2020 17:05:32 +0100 Subject: [PATCH 40/67] Update readme for the new key exchange methods, host key algorithms and private key formats. --- README.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0cc04fb9..eaf0b3e5 100644 --- a/README.md +++ b/README.md @@ -18,22 +18,70 @@ This project was inspired by **Sharp.SSH** library which was ported from java an * Remote, dynamic and local port forwarding * Shell/Terminal implementation * Specify key file pass phrase -* Use multiple key files to authenticate -* Supports 3des-cbc, aes128-cbc, aes192-cbc, aes256-cbc, aes128-ctr, aes192-ctr, aes256-ctr, blowfish-cbc, cast128-cbc, arcfour and twofish encryptions +* Use multiple key files to authenticate * Supports publickey, password and keyboard-interactive authentication methods -* Supports RSA and DSA private key -* Supports DES-EDE3-CBC, DES-EDE3-CFB, DES-CBC, AES-128-CBC, AES-192-CBC and AES-256-CBC algorithms for private key encryption * Supports two-factor or higher authentication * Supports SOCKS4, SOCKS5 and HTTP Proxy +## Encryption Method + +**SSH.NET** supports the following encryption methods: +* aes256-ctr +* 3des-cbc +* aes128-cbc +* aes192-cbc +* aes256-cbc +* blowfish-cbc +* twofish-cbc +* twofish192-cbc +* twofish128-cbc +* twofish256-cbc +* arcfour +* arcfour128 +* arcfour256 +* cast128-cbc +* aes128-ctr +* aes192-ctr + ## Key Exchange Method **SSH.NET** supports the following key exchange methods: +* curve25519-sha256 +* curve25519-sha256@libssh.org +* ecdh-sha2-nistp256 +* ecdh-sha2-nistp384 +* ecdh-sha2-nistp521 * diffie-hellman-group-exchange-sha256 * diffie-hellman-group-exchange-sha1 * diffie-hellman-group14-sha1 * diffie-hellman-group1-sha1 +## Public Key Authenntication + +**SSH.NET** supports the following private key formats: +* RSA in OpenSSL PEM and ssh.com format +* DSA in OpenSSL PEM and ssh.com format +* ECDSA 256/384/521 in OpenSSL PEM format +* ED25519 in OpenSSH key format + +Private keys can be encrypted using one of the following cipher methods: +* DES-EDE3-CBC +* DES-EDE3-CFB +* DES-CBC +* AES-128-CBC +* AES-192-CBC +* AES-256-CBC + +## Host Key Algorithms + +**SSH.NET** supports the following host key algorithms: +* ssh-ed25519 +* ecdsa-sha2-nistp256 +* ecdsa-sha2-nistp384 +* ecdsa-sha2-nistp521 +* ssh-rsa +* ssh-dss + ## Message Authentication Code **SSH.NET** supports the following MAC algorithms: From e9e9b4e4637129cebc52dcefe01da54711943ae8 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sat, 15 Feb 2020 21:06:10 +0100 Subject: [PATCH 41/67] Update ScpClient to work with revent versions of OpenSSH (#625) Update ScpClient to work with versions of OpenSSH that include fix for CVE-2018-20685. --- src/References/How the SCP protocol works.pdf | Bin 0 -> 2022101 bytes ...thTest_CreateAbsoluteOrRelativeFilePath.cs | 177 ++++++++++++++++++ .../Common/PosixPathTest_GetDirectoryName.cs | 159 ++++++++++++++++ .../Common/PosixPathTest_GetFileName.cs | 4 +- ...InfoAndPath_SendExecRequestReturnsFalse.cs | 7 +- ...InfoAndPath_SendExecRequestReturnsFalse.cs | 16 +- ...ientTest_Upload_FileInfoAndPath_Success.cs | 26 +-- ...reamAndPath_SendExecRequestReturnsFalse.cs | 17 +- .../Renci.SshNet.Tests.csproj | 4 +- src/Renci.SshNet/Common/PosixPath.cs | 72 ++++++- src/Renci.SshNet/ScpClient.NET.cs | 71 +++++-- src/Renci.SshNet/ScpClient.cs | 16 +- 12 files changed, 517 insertions(+), 52 deletions(-) create mode 100644 src/References/How the SCP protocol works.pdf create mode 100644 src/Renci.SshNet.Tests/Classes/Common/PosixPathTest_CreateAbsoluteOrRelativeFilePath.cs create mode 100644 src/Renci.SshNet.Tests/Classes/Common/PosixPathTest_GetDirectoryName.cs diff --git a/src/References/How the SCP protocol works.pdf b/src/References/How the SCP protocol works.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74728daa2dc4a9c94e7f2f818b0c673fd44ce741 GIT binary patch literal 2022101 zcmV)7K*zr&P((&8F)lX>3N#=vAa7!73OqatFGgu>bY*fNFGg%(bY(Vma%Ev{3V59Dy-Bj`I;<_&-=k3bMbJS}ETmy%>kr^YSSVa=+q*c|r{#mKk|IH10a%E;R^s|^h`Si&k6`~c=W(~B7;_%}`SbCA zKgRwC`{V!n-yd-|C3*gzkG4#^R%0ANx<~0arnD>T@3O3api4;czaRha$N#h5-@C(^ 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%0AszPuA-ZH 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�cFq8|kf88|@%WiR2g3DZeeu5Pl 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

    yuXO11ih66D-R;wvCzaXQFvNR-!>tNlr&d>J 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

    Ea^{P`q0sp_$<`Y58BXyKFA_ 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

    Y~R5Kt{tfCv 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

    (8U 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

    &6zQZDhp4Utr+Ct)xF{~| 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Ν~wv+_Y=E{!NK@x#ksK`e?2vDJy=)91hKE> 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%0A-2l64{Sgnl$=XxHjzhpOgE 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

    Wf%h~XWlF(^Kg}$#4q2xljs>O4CIONeo5&B_ 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�{;N%}k->umo6!s?jFL^T$@bEyCL*$^Il;!g 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%0AXW8%d}bR}g5 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

    K`;}Wv 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

    UpVT2DD}%vBZSn?T!5 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ÜJnpY^k8i8C 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

    Tezk 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%0Dt+Prwj5U16WeS*i_T2gJ+U}w5*50#QV&QSZ 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

    A{zVurV`ed zmYWX!lGO5F-UTV%HYr`@-PckxRkGWUC)+e#*(fbf+FOrAL%HqzDyCR$n9i9;CxlM3 zuZjl@?z8J&?wC@aPOsVie_wR{f1Duhb%>gjU8qOKZ!3Q&qJAai1-rSti`U? zO?a;u%cx}^CH^fmmbvzUG+wuA02*9`k!d+Bi=S#hTN{jf{Fx6L%&xOxX0o$grw37x zOv2fPI@tS;uXw$yvo5ovt${n{uii}jRHt5Ivsx?kNj(U05I3Gcj8h#-21ZiFQ9S}s zWiiP>h!K}p^cD(a%82@Wx99^Vi!^HC%}JWzk$6Z(pOI4ak5)m?n6Al%mCODmieFY$ zCrx+Fo5k4&0o600Ior@3Sk6)G{;>1gK}sAM`z2hsBiJ?!$sv;wgEvt9u4|#v5BeEu_mKRUZO~z7T3aVHdW@2|KAdiRc8|Qetn1B@km>9P ztw5O!mgu*A=^8gyTcuGb#i~P11c8WGi`1RI*CVz8;7=u%=o;;H!?taustc1Fcousv zk}37;mETw0k$L&J0h@mZMzldWqUUV%hWid<{?@$OA6|lRkRwWfaxkeP4!?Cz;M|{` zC2HJ=gCNHo+s#xV$<3!7slHSOzdlj}R0ra~?aC~!NyvO}2AO6uupN0O%{lAYTv}H6Fl`u-NY{_%{bBJ5x=)<{x$g;t%p&Ns7+`Y zqeh;PsQLZN^TE|MDz8pRoocL*rrA3%YW%NbuvG;4{!f3$9^OSj3xx71Bkp5QLNbzK zxLa+N`yGnHIM1z}<3wGxS@~$_x}ZK`uK(3af)G&_wjwgiDafTxQ5!v^a@JK17G&p7=)Jf|!`A#?@lF7Iaf`~H5 zdS8L4*4Z0gXysIh!6?vbC?z32=~KtZ-bq%KF@ngK-g8J760QBmK!L?9*je=XH?=;e zE!SZ5>UX@!Oqm%|bmX-j#vw%G2R{@3-*lPU8B@YAq;;eKr9({e9V2QR!EY877Sw_2 zp+0&W@~HQnufATyQ)`zx1HZTxH&NWiK6Sm4e?_&{`fh?US-IiLvDcm02235-OWUcf z&}G!|>MzsFyZ&!CU3$?J;PqX(httDEJ%8YdFogF^$wX%oTx%l3fcoQ}4yER^!faBVG55$ARt zv_y%Dq|Vij*d1iNU6%mfHZ;HAz&xNg<(pMWIxJ+d&8hdkmjBvlk}wM!cWXT3@0RO$ z2Ph>c6Mm=cct?<8>7(g8kKaEXBXnRI#F+^z4#b(#{&;vTJtVwm`xgZ!9fbByQj)Yb zjI*fROc6o^zhz|NA1Vax4W;y?+qNMeQc?z;j)b;{oJbi`BiV$Etg|cGh5>rTLWXyf z1s`4Y>fPw9!3%Z?+&%VT+xb<}liH}6{n5$fvlp^|{Jh9WMZQLhXeqOQ6`y5ZvPLtL z4NR~Jf1(;4>fh|OrbfFcDAQV5Pr~!F{i;RtSjFahni=rbp{1BbV={?-XXT9T^vW#X zCTP58O@5V>TZWeknz`aQ8^Ie+y2fxdga*sN>pS`^!Pg!FTwd5Z`+)egMfL#mEJO0S z6(%~oYdpc?$>2o7BrxUB{*JW@;Vr4cuZKM92Mr=bZvdchrO>;a?u* zD8K8dCuG-m&o0rAnFVq5=_$k5N4mnuE-i()*xIfTBpJ|>C$DsQ=_oO$&NIihj02rW zusgqYp0Q!VN&~vvDJud9$&%IY^(Z!e!&LyUL!GQHc~p#Amqsj~SiTloZ8+>lxcbZyiXpRzRtL-N zcqw97rb5?w`E}9i%>%q4#w3pZWWgWKjpY^n&rQYJEE#*Ew%@)o1U%e@xn+}(0BMO} z+UJQhQ*MnErA9eM?Ew1*^AJ0ab@?rZl%CT7O2?Qp*@BvM@tYyZaiPkXt*rNGM_{hs zq(9#i8txrP@bjYx6uFeGCB;h~)Pq{N z;=oNV9Awqh<7wg&iVpH?J)U9sFS=*Zv^>sKRWlYHMfjBnKL2|n;*X7jmeWh?&)(rU z?ALQDl;)#_uEI01xF5f>boZ{(qpe@YcIp?uH8Y+!HcuEAk18P@quSRwF|ZBZ{X8J) z`)MzaLI%yA)pK|CHT~1S#3stqd5ttZ#sYPH&RD(CVsf24SA4*`?OVap6~u5T0F(6$E+2&;u{RCC+h}*j^`o-vQKfRP@pF^F&5Ec+GN2m zBp8_+4qJVChGWDKGNXHH<@Ul`w^P(7icw8SmMM|nXigw_TccO2!Y^yi53AbMB2o9y zvMHnGlxBxrb5)OrWbo63?4A1YZBh5CHjnUE!HvSP>+qc!El4>iZP12OgPEnn!wisHAEK55-WBWox0N>)nxB z+VGGlNjDxtRtJb?S(@d_&=W1zO$xeXn{;g%+nHhlQzP9gqFZXHyiB-sh2_XnTj6TB zh15CP8L{LB6yn*85vYjEBT$j(##{75ma8`8Pq4`Qs#%UGL0rU(E~6))vs|2GTV{5? znFlfAxDlpw)#1c;Y1@>zxXWxcU}8c&8A2yYgXNwMQT_MuhxA4+A0@V{TEHE@a4JXG z!!|iGxZ#ew7%98L%UQrC@vc$buwbe^mT_ zt6_sy_WT*UeAS0IerUNKRDO-23~QLwAFsJ&VEaiUb$8{byAvABh-w3_fbIGQk>s%BHDo$(BD0vISs?X3!T zEZd*zLmkg-1H1{c_a(ZfK$HYFOv4DT8@rL62BQG;^#87=fa^Fn&0Ye-AB(j06pAl` z>qak}vu`CDe*FpWu1|-W_9pz@!Xi&^8FP^-B@ilw@)}u_4Ja!@mUO35J@pcnPeF=>8?*4-6n2JBoz(B90xy7=gyh zl2siQ;>;SFkw973i2Bcjk`zI^jxoj8=7kpB9qirVI@L((DNP;7b8aS~WQYqhHJDD( zI3ZBq3Vh6E&E(Sy?j(02*f8Ar3Al!POe0hHJQh1uC(kHz#wH{7hYmWt`;69 zKz2=sAc*cFA^M188}v)KFi(0ZrAd|cu>Qekw?lF4OU2{MMigt@RJxuq*{ti~SS?x2 zKkfxVEba#7c?l0AL28*koab>5;468ZVg4x^Wk*)Zq|J!?|A(=2jM1fu*7n%mW81cE z+qP}n++*9eZQ~i+d-RUYZ_eNE{5eT?S5irJDydYb*6MZN7iFASy;}Z9s(=~9qkU60 zpXvQH>cqT1aUtTM2q}twl++gtQzHz&GJV)?2r=3#pJYyPD_(Op3+F?+66fbI#DQhT z-u>ODa-@~2u&9ecjqVzK(>)msT=TY*N`*Krn*5`9gX{GUhhzRIC)fdh#eZqq7P4Us z^#sfZ##;Ikw6X#j%&znA315W}JdIz9d%qD*d7QOZ;v4V41Fu{@P~GdSHK=Y>Qkcas zmn9jGS|$l*T>GWBWioXiSv!i3$@Eg$f;73(vm7VP+Z4mU>jO$_YCYccWkU%NhiJiu zJ81hbbvW8)#9G&Hb4R-_0&VDzp2`E_?DQU)Q1!I*YfHrGE5Ra7r?+4*w!<<)UD1p{ zkM=o%Ky~#R&3>;IYd594-lIX&!qkGYY?6&E1 zyXWE1(Gv}rxmF5t5E^Thy4K$^KH}zszS{n$o1?d;odehBh#74T{%z#cNW7iIclJMt zs8%}*$gQ2ALg3!LXphE3gmuR*M4C-R*1$tCBSt$M%VjM(y=(wvHboU6>*|ujO%G8$ zd4j;Q<4vQ{{cjI(cJa(5`1&iW&{;X#69HJHxZ`Gg0_Km4#2u2xQH@E()RoTfsCWUI7BYKSw*#jDNj+`EGWuB za2Y%?ae93m_Pmi-o~A`Ku;O!!*pbhCTN!EOP^Mjq?b2Fe5RbNUew}Nj5;wy@ z%>79*tRty%HeQ9?qIPkDG5SEFYcmf254Cx}0)+<5&@qg#HZz}QWD(1mHJKFb!{7R| zQ<2Li0&ZGFt#JHR+vek#4Rya)B#byKkm_&Rb_8{$se1l8LDO=~(Emu?3pZBWBt@48 z{V%##aHAr**DIT=FB2mxLiU=+8jf#?p&?pIu=`q3FTG@u7XYxMlzQl=ESk?K5O7Ad zp=b+cVK=l^jL_#?#6%#DNR9x<*(gO_Jrf_pp7~W%W4Y$Ir|W-$lyjV(eh#%zAZOgH zToV(c&)h;{8k&ApbFJWABhPMTaY9nV`}#N;&hh`W1EwMfyibm0u)SZXfkXz#dZk(% zWUxu2*Y2o9$K(e=E~Px_D}Z4O+?oXDjzyLLwaJ;@5TLN!r&78!R)#PLRtoCWI{9}s*bxQ7Q#)Mn6rPWETx!!8Gd&;G| zeBs>8Ccn)i9FnOK0sE4<*n@KO7g)%B!)>|T^PEfPj#O?EFB9IyX(*SAnR^qpFLI@? z_42uvC(+J9GuP|#IVc%%0sW1g@Wc^oq7Ac37UM^&CZ-7kV|5N^mO$BNgjM9q^o07(>p&X)|rm>(oJ z@jj?949?#sijeu4`eMe|c^Qjn8P5L|-YvWY+Xxc&^Wbth^Td9F-y@fs#OBfPR5 zBbS_WnWHfy8s-2jNi$p*LOg@NdH* zdq!PZH+##~CW=XB_~K^6(g1`ryB~?=%7Z9^7Bp=;a#rX;cQ;U~PZhnw`Y{&zmRD3q zGDT;g4AZVi@Po52^Gv69;zKjt9`0df6@Jc~fItfL2-7b0K<#%UH=LIU8y*@1GUy73 zbp2RGU2zf>x@zxF4KqneU+}R!wXQz|kXS@Qh>VwwBmm6aIU*;u@AegwmK0vqeIiF& zT!6#%8g)N0AM$47SQ|(VJ-cVw@aMzYcTCV%&0W*HwUXU`)n%hjc<3~yic@NU!;bia zfyO=d%uD$@h!CkXgnHQ18cXFvS&c)^5Hx3%Z1M;HLGBYrLMArndC3tZmE1O2^O^>b zqzv&FuMF@FO5nJ`9EZ$_(hX~Pl1s>D+_9G=Z8jsLhyyzpA& zgY}OXehH|nF|$Nlp<}A|+)@gsO1&Vg8UuN$wea-RxHSx++62BN!=L_TIyrCXUysW; zL3;???t0*LbxUR9IGz&Dudjo1&# zUJ}x_fLW_j9-IxS8qa1m2c2=qB!xnhfIlzF7af~bZ3!(U{`s*UI$qUkU%#Rm648k? zW}4EqbuS$j2~zv-+0o@0KwA3Un*&+o6V`v!KSHAC5{Drg{OBt3leAH61HDn+<+6M= z1~>*;()X!D^>NWFbGx}EHHD(yl6@b>kr340t|md!zahMhB1!im+!{5!gjvr-_fTOE= zXd4zt6YYR|SyX}reJDoel^+}P481jX?K{lQBvZz|OS(Uv86%5HRWoM6p~0>4q22U$ z?<(VeRP-aTtY+cTGsxKOL0Ns=a9f?g+?XUiCD9&F4RQvXKQRUWOPu0&GS=Y6 zWiP+v94EQujF?AwfrxK+RmlpHY8y0la*H=liD+}&AaCl*J8u`bh++&W^(pA>h_63N zyVMT{#xYNsCJ6yr?Z`5(0!e|P|C<=Os<}t9yHFdNAhFRg$XP0OiTdF_2yX6s!7r0c zF0Gve%l|_0%q$d>zbWx*;64T5+WpEPqERzS%uRpwKQ=~9ggkP{tf>efk=QOp+U%3> zaaOx41tmdhshkXqvJg(a^Vj2juuKRy04>6b-0kZoZv6h;F_i^xsrjI{$W!mm|LXE) z-$^X>@d}`tM6}yduAABr9^TSVzmEo|<^(bv4*GvCZw1=RaHplu-h~+N%}#!w{z$RY zg#u7x0H`rvXZpE*HTlbFs}t`!QcuJ|LMb^`yL}8+fIp8vQ-sLmKU5t0Y>#vkCUSJ> zNN$(uJKd{SL{|!9)b@R-a+RYV`BRdH_DW<048&mUyR^V>xi~sVl1lS&MNK7)&0?#y zO37?$FucjGc~fCl_xIM4-k&Oz6<1Fr4k|BSf_a96zm(iR_UC!^!-zl!|5gt)EaX}U zyac!DZ}=xj8irsRxZJi@wpAx~#!^S9l~Ac6>@;QcNj#J5wi$;V&Wcq?cCpNbGSS4` zBd@dGY`$#S-~AjH;a2N7B`Y-zAgCnp-h5eLsW<`Rz&y{3bEauo{~1m#qBAex6PfXh z$Ip%omK_^0@xOnitAO!Iir&*Ya)0B#p_ttS}_tp$Ui%Ed` zNYRhO<^DF;_v*Lj0l;(Ti{Ez?YN2P)zNwCXaZYJl)*-BJn2^vfF0i?_;}`h0Q$z_EyIGTrfHW7ROrbE_?wEuOcTQw+(OOYJ&(~@>pOrQsE9LK6a6- z04OpV0emdKBZI11h1XNox~cIaSvNqYck(`Un4?wkky@d(@RVg|t(C#CFQ1MtJeBWg z(uH(Z*!Rz^S6LMvc7{--f2+d~A4Z7gWV4mi3d5O^T^a69WuiE&Vuv70dgf_kG(xI? z95nx308d8o@CN&P=FfR}$ZO|Jjy>?UmGcD;gdSe7y$V@9rTpN^jKq`OYVMP5d_PrV zPzV7Y5L9&%ou$ksYINn9=YLb%EB53sTv8DBG)F1u<41! z6gsM`xwS!DK$=^}T_`9XZ%kOt$g-3G|8Za<`0sfS+CTJTqYKEW%nWL};UU3oR@IZ5 z@;xJ(0lOP#VbWl-k3qK;3N^FY=ebrlqemgiJYWzs>JCbrG;QL18LE7*RS;pvM@P8K z0=PhupJ!8jksDU>>j(0qUlh0K7|Ac-GtlsP;vr&HSflg9e11)ul@3){aCM(KBgS&j zo5rmG?(0K0?Jv+iLdwBou*5tSCpOO#*sVt&lV3sX2`d`9*9oYpB!v)}qYm_heBZ<;vtEs;c}CvGca@dLR)(l{`oX7W0Kwj_%@TUVm;@UvhuuWruz zq+Qw&Y-ga$D}F7RAwy7I2r*qUf+c5g=F6L0VgxXJ-!Gc;PxFlIh~=OBiI`-sP9Xf5 zbd!$UQ;(-iw0V_+K$o6rQwhCOijY*JYgc9AWbcN)$}aX*Jowe5NdL?}2+!%|@(bMy zMlKhFubLeX#ZQ&ybPi*S;>J0Y1J}O0w+Wf=>lKL~9b5P~lQv<4oWhN^$uQOv5Iw^X ztrjz}&jU%Zg}0&C2&0lcyX^0XZj|RsLYEQoTA`QiTT-{PP9sv4YZ@hT^JM#_8}k>r zF~%nH8yZHY&i3}JG;XY*702K%2${Bu(8f{aUJ+di4U2-Wpf0fpFVei%Ek-Y3fcE`3 z)!pzyu!L_Aj{2<4@wdKQ`#L<406RaUmqUuZB*u~#`p0<^ZL>-Xjvsy(CrJxyhtB;O zMP;3_(C}Wq%cOYf`1jHb`xqRq!t+*G+e_?f4w9!9$%1Q68QotT;W;^Ogf2IEcHt(0 z)^+8JuzaOt+$yB05y@1Kz%ZE)5#GO{N{GBOU94(Q0l8;Ce3dT9-9->}Q%A0}#k5qc zyvX`dgOin3?#hL}I0}P>Jv8TXj_35kicH#<>z%c|L*h?#hwmqQ4Ui5iNfnmTB$NyL z#IScF{F>4={W|n&rabk^z`*-;^(6$sFSM82fB7m|Ta}#{v=F}ciHrjRX zEBWXA5Lc4u3cjqHq@KtoDlW9GuShfd+|;8uYFxj6mf54I8oxOMo784AhwYMFR;l#Q z03>=f`zqr8bESB4Lo`>LvG_~c^lGogv;uUYe`}Q(9FH${{ z$g{V^7YI$rzT#r99q}n}BdTo?n&VJ5Z1SYcsY_Ceq;{Bq9gUCGy8gshD42dYZ8Wi_}I^X&dwfVaVKqUpL z)Y5sG&SeH=l9^>5`+WtV{CW};iCZ|h`ZDPZ$0fTm49)W2E6%=P3n7H7Ci(F0X&T3* z_R9%#Lw(xo__@F7+%;@~VOy6aotvB>y8@{ZR_WG~7Ep07F;ldl99q7IIp%o;2b!ik zrbUGUf$AU?fyO~aU?*`uNbm{{9HWCzESI{+H1IZ0_emHMB)F;Y1w(nnCXGPcGkNg~ z^9c5!Bx4AG?Jz_V2SJLtA%UEeGj4C?mvgTrnzn@9EPW_;q32qLf~h+v z3A(llChN9A+a^;^r1geY?5x^MLaKnzBp`7c_do3Hd6N7>+4U4=&YKNz*j~U8S%EC( z3hG1^;x6(A5zH%BK^PpH%?#(8+(6W%<5eNtlaAm(b-MlkvxFPy_RzVynl;~A+5H8q z>|?HXJwoawqfh@+?7h>fskrP;b@!w9;P=r&OeaAwdg8}6d3XRjYB@}!Jn|?Ep-@2T z!{2RlS7_%866TrNLAi!tA-#B*qPD6sAk7WI{)|}+kDpdpD%Sdj;8oj!C&) z$h6hR>wZV-?F;Q{ujwwBw2DCP^x#TPBMa~y;OR(`q@)G`u2&#`?>Q3fLxS?;V_DC$ z2hk6@A>2=OX1??aonrATz<}ss*^3J>7{Ezu%@2H`*#D9N*oz;A<*}_$ZbLv#1Iluhz1?jOVm(r96(vTq$iaM^0+ z){Ag+*kjxyc`5ki&)!9@Jnt%1r=eF?&u-rUzd*4y_Zw?ZG978QQ8k>SEPC@0E)qLI zcM$&jtD8K#?wtm$j%w5ALMqk6y&g6E^dr&4keKKu$b;Kfd&+a1FIYE7iES80jAHF ze1p?E8&880sy(W$sWajz%>k|9kuy+moZej<0}xK}w#dIRrb5;mz}|`KZiG;m$fum) z(SC8=zX9>i)U}{EJF(Yq(uPGufyY$vhDH~YmcY2Kok;$v`w*$@Ccl7&#ek&Tdk_sk zui?=N1>ZX6GcGL&SOap51+XpLzA~b3kn0$@9p8!|n}ECjk^UOEN1@XPgjex~%c+v^k-%DxacM|~hSzE1UgU3Jac3U7=;K!e9L!*9+FJRaQx5(Se0pTzx5jhR#5jO}pd9KYoFj&y`kLH1)zL}d4 za#;R9v?E`+F2E4^gVLIzrp%8-tQAIDi)3p#uwiC}uJGdeG?B7;OOhkc?mCyGDo=&x zG}etEcH7!k>P!{}t(ZTkdv-~ej;$JnlL{nS1duwo&9}XInAd(%e@&vk_2q2^=6+lE z=c{0^_4SuW{#{Pn0&9M)8kV)-iuryFlr3UYPCa$jEUsrJ|OHf)N%RIAs)km~$ z0^(g$Jp$t2elJx9x5H03PS=R#w1 zNmaR!`;B08lz-5UBm#4k>(PWZ{R3hzu189zIwIwvnpQPN z#67dE!mIe0R8z)UB~%Z1-tDDUK2hRzazk4^AIkFdN;X|$Y$JzTE{QNKw>qCo7U4#< zcU6C8Oe8@+1-ZhrrmMRwx6vR8S{hpKCj-Th7HwxUia}h`pO0o)$6~~RnkC+g%db(W zq@^+C*#p2+_`v&Fz0R5zx=rwx%M>pYAWQ7+T zc~(rT@E^W*$-1j2cmE7@S^G+a>Rv2s0^H4JueA~z0JQmsE7M&6a%o2{n4Fv2uKTse z!;ajfkJF$Z@uhAMn)r<-!N-SD!2srPmp}cK+-SjqrNiR}?SRfv&KL~+xy+h_kj-XW zal|FQ@HTKZO+1j5yI-a(ytUcvE9TmOWS>k8!S3(^lD&U+@sJMVe&k@$_9}cGn5L7! z_kO@IowghZe$I8s2r1N&)X~QX)J#1D4U^Xw%P-lzol7K@;!1d6TM{wZyx$+q?@ZWs z=Wx^L;!5@r_ay_O+ECG%@sez20vKoipXD@`yo0k(F76c2Ktt+=Dl@rouyV6hd~Bpc ziz6jQgtoNm*ePQ)A>TsF8X+Q{z=mm0u3aiPo5h<>1CrETs%WS zUAxs8Mk&q!PE)*lSmbL7BV&CsH;lSX&TbHea=8g1+pc6h<=rdd?~OXvBolXj2g-1~nwsh6($*x7%qoC4gl505_zTw%x(A)~kn*%UD2)K787#}u z07BbHE)A6C*!+2$U}Xf`5Xu@-Z9l+A+xQLzBm*}{8uK@dtcTURo{AKT?$lFnDHwEf z6POk`|0Qp>X)s|FTYbEhPIxYog6c4!1d z5UsYU5s}e`{x1FHMhWk)-QV`9E9v+cm5`-z3eE@NbYU9xc5!|g@;}gkEb(=vFDvW= zTLC!|UEB`<>k!#+CNVIDGRwP%N(uu6MDzp`-ibNRXRd)M@B zk_PAAd~xcAA#4MJT_Mk5JBeqcy#$CwEdSg%eie5ybW`Bm);)O@ylC299TP%j5`~JL zoX0cd)NV*;B9#sRSS7U!9R3|M**N#oB!l&zG2Y+~8ZxA{D%jFlm#vmkPAx!93Yb};&LZr$=0d^L_ht5`-dHacw5Z%? znru)i!{WWDhYvW&JKcEB9s>+V1$3Rt7 z;g#(p(5wVRP`06SozoTckRtKO5Fn!W1O2qshr_OZ{#AcXmllf>hr64A+$)Oo%WY{7 z(T~OT%af$8ccZmEp^vT+iGr{6P3d!bM5dW?m9b6(8()r}!TqeCFN27mPB)B9h9pxD z&e@X}{(uQYe)L({pyL2A6Y3r89Bgl_c5|fqKwk_F9lVpit!4yj^R!6EvPO66}oC*p*G)De-?6ANIi9WHWb+bpAPR%n6jMO6g@w05`t z2oty1J4m?LzXojg4V53Yq1yKhVT|`jVP48g&EhVD!da zC6Ff=tz`jcJGD?a%f3C$=2B)*&FI%t<4GiqrzVChzWJ9lxl&!`hdbd7pM>iB#4Egs znG7z(KF!d?(FqG|>UUAugqh-`8i{Iy0sv9!C4a3uyf|3a7e*=HvLzop{!`I{f132g zLg_IxMC@oKDxkeYa6O&gA!xcbSY?5sO#c>gU^ zOAnyxJc*Rz^k~(tR|tQ>uli!TnfXy^`%jS~rW9B&r>2jGwA9ICw#a>R{sA5?#4ata zHFI{WA)V5GGx!2!qb$No@{p&VGL+#u?}Unj7B?LmX(T4- zIF)nmVmHy;`;1K%UE9uFz_+MiUqhV=RUW`bKxgnm%A^ukJby@yrPUi&nQ2`=cFo^$P3S?rfx80D{l4kGa7XHIaHOCUw7hyPBJmC)Y z7YyMB73dN1*9X-Y4y33cAC@8Di*J2Plv+b?S&4(oE@7+o#zYI6-k_ktBt?@3WRl43 zxTCRnd=>Jkj~fvjTces9sy?z*63W9rnRSiqxQL$@H_Nc5$R0ZjHRxu?r@jP8l&t(hV=_P}QtjDh7OeR*OMWx-2{BsLTCXNv z098#c5qE8}CPB#*1IrY3{{r6A5BNANVAQpXYC9-b1Eg(m-s6@cdsa5ww~k1E^!_#I z4}W8rPCTfaFAE!{O5mu?h_Z64DoiQkNR!Pm_3@Rhd&02DKS%Dg@I@?bBj)jJj`Mt& z@@g%=wNr`7b#FM%>hbMAH1)*7tL#dl{NAMcg^44fm(rA2Tdy()@xaKeVVrDVn18Ob zgS&&0NHx@kK4}c!Cm^jXy(YX&vexzUna+jt97CXmq>g7;e0(YtpT=SFX$E zidV#_&p5H5O*_V8^wn}n6ZIIslO?(ggS}e53mBL-gv@&XYm_eOF*-!-+B2AK$LK~yyvv72j>WD3c9}&@+o3!7OMt3rA)?@AmU-k4g%uQ-Gf!sUwL$;RPl12!I z+mTRCHOuKRG~PZc9v;X&~w$R^x%+1vqqx~*I zJx6tbL@f`SwX$c{7M2`$fqDpiK^o&LR5`D^h@d{=7WR6ARqyT|kuX9LK4vg|SvY@f z;m?ZDtQLx}c1(#`b~K86o`1vZhmbvJsW|fnBDFqW^nYqad{xCq3*}SJM(h*)}lmzk*uj4+O*hYX;yk z4_5hi8Y&z55L%Nk^J9{G(CC=n%BKNJu_bKe6cg$hsvlQdfTTz9pr|Q~vbgX9uT+

    =lh19`8dgm!;{3caE2# zOXWb;qiJ^u1cto^2unC%enBBJ)6p40UU8OM*1({=Lk zX+Gx*?BO>3e7S%@h>IT#7UOGKghnFpO3g+k(QA%EGVs>Et<1gkV?>o~G!ZECo0G0n zQ^FNIRs;I|6wj z21!!ATBHW4%yGAV8h3AHNsd$tIghGh#I6`fcEwDD8LhqC4w^YkekqW4T~a%^i^$KWPN6;!>}d~ z1isxA3#l`Tu*__EOURx$u#1B+IGRTh7h)I+8zb2aY<9Iu=ZQ@`QPW8VqaX|W=?}*? zfxTNSp;LBRJM6AV9N9(?@^MVU5572(N{33g)S0HepQLg3Bux+^Htx0Ub;y+y=MR4&%P%%07O~&9cLu;};nMJ_ODAdJ83%@(ghnnNH8sXd> z-Oln{?qCVK<*u0YpGB88A|4^>xHziBu|~NP^uD!C1abjt6$}jqYuVh%Z3yFsB>{p|Nic|PgYUBQ_ZTJ%0X!;r3kkK)=z2-9n80K? zF&_y*@=g4twHl9%X!_!h&YR5W`2VJ`SqmYt)+aa6kJ&ljG+h@z)9(*eAK$Izs5im$ zIwBM3GN_^L&X?+#V6^_5bw{kU^h!H)ATKH6v(9S>C;kAUvSU9|m7t^^TzxHMs61=% zy?WX9vZLm1q284gqiM5MUQ`)~9beZu{wOUP?DFqqMWeG%mJ)-Ea{n6*;q@Y+yqL>I zXYcI-xr&)6M4*@)jiA3)>nC`#sj&IVpGWXPLGn!UlH8xVJ%2MBX*cop>4w$l)VDqG z+FcpP@s^ykDfu}W0Nr{g9&qnc5ts0h98>PGlb?cWQ&I2sUD6i5`$DnuJo`222K?r0 zeN_8>yeDSYvy%U5zC3n?;5(KdnsRdaIeE@%n#)+T`9>8U@ioas-V9=$Cb~$*#Vd0@ zCp5OvaNH79iu`BsJ4;U8>OYeTVw24Vq)5oJf3l85G>^g>I9FDnm7GiY%MMA5RJQ(t zJ~>C~6_r|YEyC!fke$kYT~Eb%QVF;sqJ}<1o}!trT-Lmp2Y!E7a$9|h^u_DrUzU0G z>EjudDY-it|5}&CBczKlhI3|9W+owh1Y&=gSb9}_w_l5{=Zfh4RjP(k)sk7Zar@7P zv8F3ao<>aAi#ORsjubF15VE{>tl>NnnT+;xxVOUS!ILqXs9}^3n$>Dr5Y8~u60XQF z?;4TVD%^N5C(xBKV;c%O+zBO6J%D;|JX)!G<$YU^osJX|%cCelFwdG1P6Z)#H(`16 z=@B%fzMiCQETr7%;3J~?>#uMYIe>x}s@PXdb#GZ!F<-6`&?SHVW7@KB1Gv5smPWnb05h<@@HPH&>*jE1#sr_2cCQxAjorJzJKFu!WZX#|4^2|X+LwMf|sIvOoczlnLSi? z;$S@jC|{_>ii5VS@3@dS3TZfZ%sTsrwTw5m#P1Am=IiJ>g&nw`9I5oLyLl)%{F7zV zkc&DP)rbMNq6ouQ2UJeym96fSTEk!mI7Lv|`#W$3y>sVIm`upP%viRL-SKM&p5+4XEG~|)Wj$tO0x8c;bWLLT1=?Gw z)^Y+2d3pcN`6I7!!z8I%0oWQZ$;+losT)xPQd@3V&Ho;+S4N)1qwnSWQOlhGNM3{B zleX}#bsGj-Elnk*wERj|exuEMKuNI=#Mtox2GJZu964@|K6<)ytaVm`>JZsIiOjBT zg+4kF&90X~nS0D*s!<#Sq-?<1CGMeTC5^#VE6z=hB22!HlAzouGv0d9dxwxxV%@eb zy>UDCx%JZAV`pN7HG_*-XyXWqWIw&^l@RDW_7Yf3IUGY^0R8X7d-`FJ&;TbF(>mi1 zO52290E*j}w{Lw(g%4l(NR@d?>ZwhL)Fi#g%e1xx0V-Kd50)RH31CDM40((HvVi~b8eHdC-$19L$^j=>y6v-ZT z()q*ydyi}mv?rzpW3yp$Z`y*ln>V;OHB`7Te>h1+y0uavB)v%w6i;6Noor%vlheakCQERPNUU^GKI?#B5rvY<||tePKZSS;)oX2fJUGeA-J$ z6j1k&Gn%ruZ(r%1DsR`h>aED8b>#YzcOc#zA(eEBv10Keq;<8>|3oz;b#c2Mr8#eT z?O2orZ-6Lc{?`9Tp1pBa38uZ!!IaHRnoW^UR5UQK=1}v{6P?B%H-7C<)Wrt#ZR;)+ zR5k1`CH=Eau9=&fi1%j*w+vkA6J=3IzaR1MOtUf%h2QEgy>Hk=!!er7DkXTtTrW0hEe>(P?|f|tYbUQNU=Cx$$ChN;QQ zSIiz4<8zeZg#V0wjOR1Y{NzWeF|3-TjufDqL?o@Vo`NV@qbdqxbfVV6#9?|PTp5$s z-ipY(#Z8e!qnn$AmV0_urZ39CVYJjK=@cWyV98GcrD>*wr}-ysm>b!KlS8WX^aJ{# z&%L2W)Eem=%{W^Emv)fEjauIRx@nB5$4qU&UmKYygHC~PI-3l+nlE63+M^{&^KhC6 z7G-8#udz8{PGXu^_fKIe1f>^L7cT;;3R*QjuVmTgGGj}dfE#acfjhlVOQJe+T3H>uZf_~4zl9UUfILmXt17r9x;S&n@xQ%*IulTdg zUayrZc}SZ%gXQm|o$x2%?<1dQ7{wXls~DhSjHl-U8lui$SV0otSe0j?s^Q}Rv7`Z6 zL_*}>;xJqi;}=`T{tr6Z?OA2PGnh14*(4slf?9}W!6!JGr$OcPoK3;ei>>4zM^t1n zg{O=Jn~`h0m*!fg0Y&%Y1H}J?TL`4Cs({~gSNmlJd2V1{S)e%Lr=C?Z(msv(@qk&C&8O99c* zYUP7Ag0;8EqX0NQ&mNC69AG8Ufx`ni^(bzsZ>%6NT zK5&6rzUTOo9$(!t2^FUuf3*pEGTh}ja2;^Ol7Ic!gzt;>-m)7kmajh1_F%((PC8ur z2=~4Wp8TSpw&U{T3goAKgSAjjwac$zi8O_6v`}s< z2U#+O`8b)c^B6?;uDSys96@j&?(xI|^hj0D9>X8jL(Kg<#0$|$D1T@u(m0_;BT_71 z7y*(81?c^FeDs)^_8m1R9hfzj_Wd|nIdPW#3~-D;JTp1MO^Ee4Nue!^GG3%`xC8V~ zDqz1zk^gVwwJ@=im7qy1KiEZ7J7wLqKq$Y<67XWYSbpk&+P}6|q%b&m`o|`h1m6!P zB&LQ_Fu$sq?o0&(QEdTgpr>hW`P15e%9A!7W>6>ENV-Uf>*2GpGPZvhL`0ZEv}vu+U((Eu$%JJ+b(6%w^J{> z^c|w+O?oG*u@yRHq@K2zx^|;UA&50=o1V({MR(+U=oUS4i{`z*i|$stWir8Q?nDvP zD`s#$d28;O+bn~GMQt(#e7fvYhV1M>U_8wC-NNpV41k!pDx6k9W1-?q4m$5q=xn95 zTZGx2Vy$u@NlcG#GS+IeGWpmp&g6U&L3(Bfdr}5}(jxvpk?#XNNqN4f3zGyexgN7C z77P5^4*n2ABpblY6<@{$$yf#c+Wg`E z1;8c5aetzrXXo6#v@Ur_>xb702NhT<-) zO<9w$z1;N(;>eZ%>FaGSi(Y(rq!jvZ!;D1|NOSB*5Q<26JDANdf|s0Q(n3hA?|uVzcvn@bzGv%mTS4;MFycPL2%LTq<)9L$NS%| z{4(==4dbuo4Ihj<{5a&Mm&-{Qbtxpv(kFEr$5pv!|J+t~pMLpm0Uhm|`I%jXRZ~Nv zF;Vib8E zl%F0{T_;J4deD4vfl**Fh)9`02^k?$70Tpd6eF%~V&)3X)|;xsC1<4TebPt-dcXAM zFMYX1Inh$JzFr!zyIrNhbkkG;jl8^pQG4@AeTnVl#QfiP;_*==7r_>^n4ua*(}P(> zF%B{)@XgM_?U8Q^H(oYHKm>b|F+H2VoyaN+vDFA=I5GFWJj5>pmz}A87f`q?4Wx1< zcCbSqy6ht$4k$y^ORQ2KJzMGs?s&IgwuOIKgu2KPiH2UOm3SJ4pv@w_h;58FUsUG21WGvw&a7KefuH`z6dntNK7VJL4(ZVPql zXB}OKGq=|`@!xj}?N18rUZ~zz3hj~Vt412_-sWNNuXpy#;2fRVeIe*&wmd&>&-MJvyM>a*M5`{h?uRrY;UHg%iLLVZZ~ zWvXhM@tDp*<4s=NB#$sr;R)qDS@Al-our=4UR>lbYN~qwt^p>CKU;D9ltxq>eDk!o zT~qO%&x(b%ZFd-VnD%v!mFksJ)W96DKeuxP_fPXVPqKCn8QN&#c-;qC_klHO=w@UT zQ#|}4lfSw!9PKieVnkPUSGck{`DJ*(d>e-i=ez9s$gA}{PtQqA>+2)aGGI>96kj9T z$pLIde#B*lm=~!;ih{d+%G|7`jHMk0yWKM6 z3368YFlYFy7#WHZAo7k+9OWw{HNXbiQXV)P{IYu4qj<;43| z>4!P(%^+bjLrAcI0%WF3jSUcqq-1?QB3NdqjS$aaG{QXFA|8Wa1|@81O=B@MGX>%T zXa|9HYECoXt7QsArZR{_uq<@CM~JL^em~!Yt<5W@brI8qZumA>rZYwfoQmAQ44csD zp_)-*XOCfT9j7<_L{5(*scXXmp^AX^A5(WDvI9C=c2N)O#DpU}C*a*7XeS$qZN=(u z_~4ndRw7e@rty(=a@SR+PN6@hX-Emoi+D{xnvhr865E+hv3Us0ANHN2Z_}1O0B=}C zN*gFch#15bH^1<<7mJH7a~o!v_kLL|ll${}*ZiijxRzc4(X}V~O?-fxSxYa4n;w-Q|AcD;f9HTuw(* zxbPc}T*J4vSzMn^)l`H=gLUL_-q~f+c;{Hv9qrwt?(}4#OR+@}<#3e|0T~cuC{;IRGT`|FltH`ueD_X#;D`++ObM&U+3L#eb zosIDW(RdZKX?C@2wnEv;qu6I?`V~%+M;QmS0O+W<90GD&5x@aG~bjP;|0^B z^&D=`DaPm>Md05GT%Lsfk8+vIgMFObt}SD()bi~RdoBk{E}DDql&iTtJY#M(0pea6 zAS9HW55bO`!r5)kHE-A&JxnNV-J;bW8=xi0xt1}v^0SR+$89k0dVTrHk4OM}XF*Yb zyP{NcQ6^4T(OuGwItf-~qHkB9a=p|_;!Vboa;@y)AkqcPSaF($V(nA|UYkv_Ckft18|Ajx!@X;NmqVv0y8z?k z@0q!T{!?>twv~TAgXHO2V3rO_WmN<<>>f*j`72l9f7zGO=Gehm`nXbZzg6UX96+q= zw@0=9(pv3jVFl)&QjZ+)67i4wgK)*zEEkjtN>NsC+P8ClaGEoU48TTjyXU_N0>bwwe>cvBpB8%fFT z!{$#<9EPyV8))(!($NQ3k*6=(RiAb6|SBPEy?u9kyvcX)4eqXbnr9JUdeTp7$ zdI44I?hk+J)Gimuzu%>MInuo(j;j)-fxm!}9|B7a_}u?ZLg8fmzmiaxxmf;x5{gXI z5%1i|r;gbF1A9P(zm6+H4w51%Y8gGM1ysb}J#bb;_x=Yh+ahrAkl*&bH`6(C;_69} zAaDR23~85gSpNMQ@@^bYzv3>FEX32Vu$$}Y*SH%`zkdDapG7>TlQ`{KJN^p05c+lI zq(ouYLO+?L^ke_e|M_P*E46-pJe~hrN~fxyliz~wxyYtO&&dajyO7lZi!258ax6QX zo_A4;7g;rzEW0@Nix(cHva3-)XxUAZej$`aet2g@4kPtH|NO6i{_j80j3WJ@KjoBn zsm^noe@(F-zjK^^{pYvy3FycF``^xAj~`-vTKH;*c@p{ywz*4de_1?q+SS=PpU1Kl zbLjGmrF9pYl`iMeoNcj7O;j8y3_N z^OF`BiB2;pCUqc9Dil@c+_cL|$`hU+g%=Jz)Zt|QEUZ8>D2N)gOe`E0*S=Vfv!!3k zmrnhrVrKf%xV!>QSk?#|Vz@@|E*#wF<@0?hO+6v?f8}6hp~1(ZHvmOg=mU36gR)hL zif;`%2X$-I_tc82-;=*Ke`A#Oi<9iMnaoumO7mIBYIg38ZD*dNC^h*gr|HpxdS)6mp3gL4 zXsw*i)zUo(asATVM1?r_;|e`t?nhM~ReBZHn)C)JS`94{oxaGZ&!w-)_pM#4(M1mD zE?Q|+!!YeapBynM(IB=57PC1<7X*bux0aR_JtXL4no3}k@^F$&+I1V|Yv_;M7sGcq zUs*$odEYlF6^khoZ`5>$%Us2^Ti&FZv{Cf(EV93arbAjhj-IM_!%EeAMpg&Q%FAw)WOH zb8JPiHOFq;@IqMTei!x0NAp>j1oTbOW^v3IGJ#-yl2S}Co9A(TKwhV**k>jwz2(WT zosAHzxvIBy^r)I+;L+OTAso9$jiMB#X!RpTbztIGVSP?7EcE^QMbO~SMZE@ygrl0Z zks)Mk;a38tGFni52jUyibHgH{*OLwiffoYqN*)B}ZFDrcu!OU-tkG0SXjIR1RoGF; zy0Y7>u*uoL@{BIBZ-gN>R_AoGNkNuDg{RoOfsO2)h+~ zbW+*}5>XVMSODcj=PM=npu9ec`Eoo?B$JyRAId{dwiA3Mad)-~_(Az2I|$xDp3CWU z7N4_XdG{7x4nI@^^M&{4LW{d-=S5mXxT^$X7$@+3l0a6XJv7njL90}`xFana#8}uW zoiz9+aUH}5=QAkcDxx3Dxwn}FZI_OK$FC_&9r}2Qp-#W{0=lt6VcpPw=B{thHzVO5 zgdQB^$>8LhhO92;v%X!rfNzW)MCo&zF2bt?fDEuf>DmZytlAM# zi*+_|zxL=&`%+S5d)yWg|1jE7;3O4Q9_!}doW#nnH6@d%16na)OVXTTa3y$3Cz(JH zh96duR60(4Lcl1&amm?}Mi@n)>!A^up7ZP z-|XPEbWxljc=y(w8vd%eBY{CchNG17+pvgUTAT|YWYAD0-xsi1*h%Sw@m2=fHfj<2 z2Pe&X(5>gyW3KaY2E?#zM5|GjmI;)nNPs-c_d*`)E>DYFdl+B54$8ZRC%q}uaQ9qe zI(@1#FQ-iN*e|vD2eDWE`(MBQd+jFD)|*aGi8I*vE(jsc&_xhu2=Xhg^R|C(h%@xh z4RMAZ0+4Zrz6m9b(0$?ztMD7d8MFaF(9@U185r5%uYzu62>q9JSUz!v{`k*}Gh}_q z0)b>1XD|hE6Tep0W2i$?$*k0~Uu#8BOhhZ&Xa%Tch4HbS5jBp+`x3~+3_+d4cee;i z1_VWbvw^-0FD#SuG@!Sf(eq%xnh#}TARDc%G(t6ZM_K#S{-QJ|iToUD3VkX$t%a{ZH@PY?${tOCgFgVqsYW7 zS{WxB_JicSh}Q5}r4;uCR`)bM0=I2S%31~0&+N_o3NxS6_DuGf7tubQUNkTSGE^x^ zZ+E9vKkHXxt>P+;?Cyx5DiB*TIngXzqiE*(=;s?>R|W=9On{@1GTy)(GXAjOL11W#!HuZz1WH`oJv%e7I5V(d{FdjUBi^Hw z5(AFXKBOcCA7sKA1xc7k_S=bqiF|8tc&~e(b_qw%ttdi6|{oLN2B9pKAN*}1haAQ z*x#9tW*lZ2@_BzgT8Z;6jq^N*X9S8g=*Z~vdYX(r6K2kaAArM-@Xq*i zNoARE%c!+iRVejjHK*I?GrP+w8b1vmphzg~m9)%M)=%Lmya#0T^!kyK~ zC}Bp1SP6_4Nu|CN3(qjI)RXE`r17lyQk@$vM}9Is-gN_`3R zZ-me8NS}bCjPo*}%j$nc`iY~l2FUB39FGBUvUMMHOhA=?LNP85d#%^LoPVgoZfbeTG|0HXiXFLC7)Bwdz`6pSyXumJvfB0+GaL=#J{1aQA!GnE8{z zmi28U`hoc;><9)2RucIqt61irPzZd|t|{i9P_Q~UzOMNEL5ckQ6Z+5D{FB6CXz+3) zrzseZG1{sgn}2epYR!uYebD{WA6NX@bj8IDNg1nhdtp*W&hk-yePvPx>{(8B+pR9zy^1Ny-@Bz+Lk7#h;hc_(}=KDYWR#Ly6hy z-Tz+XX&1{pPb13rQeJyX++JP>$dQ)9vZ~_NZ0vdRd>8zL)0D9 z7JLiN8~RXn{mwE`cO2++f%C41{*b!k(&k;Oi^eZMKlQ_;d5A=zOQ|2mXo2LvJ5oOg zyuBy&V|3oR5>|()ACs}vs$VjPVo3dIW73Lh1*}=24B&n);!|dz2DY9TrOfft`o|lF!4swH0{M_osgF-5tif0n=8iDUhFf zT;;SeKwOX(Kcs%p=}~_U9Y6e%+z-wI?YBTDlVuyZAEP<_rrZw$qHch#Uz_`3Sln*Q z{b1DgdAT20KmFp|kGb};u|J8?(KRL@UW$e%$4i0HG3udqO6yI$wBrFXUg}5{cVj#! z{o@!NIal^Pqa&}3uV8eH`nWY-YBYe)=y);l{ChAu*03nLHTCOTG8}x%B$FCr*OXIO zR?G=ic{Iw*gXSvI(M%X8FfC#O-rO1-{W>U3%nsj~1b#>BuIUhc5_8awba8($5~;OK z(iMBf8Xs4P^vra+E1Y}W2w_84h^J%l&kFI8GDKB8VGTxzl{d|dFIMA-g1F!)yQCMH z_e<=v8vuai`w@o8r81dh;|`ZB+8dT#ns)K<6%N(zZJ7c`nEYNmdEFl*XZAYeD1_o} zMw2J+NCJRSxa`wTUghjD0@7&}w)SEIH+unNu#lD>p6)5-hrh$Pxa-q0_~Ty@33h0J z`?)d_-03VJ5)776~^E*72UOMGLI6gC=OQ>?vvc>i*4{z@rs-RK``X*8A4&#b zG<>dWZ!MEafa81b-C(C~VFs};0)H?6#!J_&O#kb!tEo-Cr*4rc= zOv|dXmTfkJ$g_UQs?H^P7c5 zUsgsctfQY57QI+TYJ*SLghj`5QWX|8bnMB=D-va-xZ!YlD1=1~7=iVoGAwEcjYSzL zdkngz!x|PH_16|0!~f7|lH=^KA$>En-Hvvtkq7M7URk>#jz3V=tKD-HiIk zNCMi9r=CH$6Qi!O)+wq3Y0e1(S_QUmBHYC9{=8bJ+)?WD1hfu?I=zY@pp8bJ8Mt3PH*$Vv@eQ0z*^UYePGnqbjBivdw{+3cexJ?OBghnfpfR+X?=-|gS z2zR)$MaWEdzgX*3qkf@ngjhIfLaqE73$AsfJ_FdkVvlJLLrO*3S~ecc~Y%?vW}Jg zmgI)HA1%CR&r?2wr3&bO0}wxhrLHnn45BSC;{wP5n=kB6G$Rv}oW%%;dpz5W zU`*(jFxbHW2&Y!vMd{YGQF|MzWbqScGTewNO(E~fqIuhg2I)hCv?=}2Ad&z2XVD-X zoYuzv>m#WJaB;(Vgbo?GO2LW!Ak&M(P*l&iw2EX-)Tk~;wQ}OVkol7sS&Zs6NF>ZZ zO#Fd5S10i&X*2wnNGkFA|2Z!`WH&57WLxwg(nNWu+Mo!^>QfH4Pz0^=-_kI#!5iGY z7`Bpq0z(%wjZHI75s!!8(`m!mX$EUoO>Mn&o_W+SL^3fIKsswr39pybWLv|-8W{ng zg-xvLB(4F3(sX3a%@9n^l5-NWME}}s-uJc^<|iXR{+h-^laZsP@yDANK0Mwn%5Mjc zQy55^7moN<@HjKCJq(Y7dEvn0>=b-Yczn`_3iE=|3jg%cD69+cxDyCN4ChhvqJ%ym zQ>wdTMt*+U>fggQ=0?m|RIL(2MFDSaEifH~T?3X1s^=MjB8t@tb<+BQj1iH6QS~;b z+{#r-5no*Qu5f_LsR0{xd(r?YDI=i4wq-K9wPtyUAsR6CAsZw)*asC~XYfl+Smt)E z`O@-}G96pA9A^Ep=jG+5DZMI9bgnEtpC-yO)30h(T}cnApE{a@8c%7DUZ|}N&Qhek zGgz}XK;~m~mQyzSJ)qerW6fOA0XWap(TC58cZj&ka6MB;!@CDV=zzWBIpP;J$%BZ| z$wX1A699~AqzfUu$MCL~D4O)b5=n1^!?v#yMJK)7M81#d#v-gzk?&(sOw0k2Q4|N< zWN5l+=Tah;H#BLPoYOHi2ogmnE6cNUx?|N1*fY79sa$0moe}RPQwJsiP1;oS(uKew z6(Bl0TZp%JL$_f#WKuFY%+1L@#}uI1gYf-C(eq7O3MLV75)lV*xz9i#EoxGHf5|2- z#&Nba3nCeAJD#ZZ?NxcA(IEOhC$31y=NM~$LIfDPEZh8F?PT*5shWfcX0q-?XDW8k zANPE8F~K>?2zjDLS7&QFNNp*GR>w1ijRe|q1h|K_<<)tjNV&_Hh=-1t$#A2`U8h|< zJZXHn^|6&EYSMJYW@4f`GB9?wmSDIdP4vtb;q4C+dpf&CczeNWzBq@TZ`gH1j~0$p z@o)-y>f71-8c6xFzH|cT{8En=RseyH1O0I+P1MBO<-UPwqL#0~PZM=hL8>)OUz{d7 zE#rA8gr1j0xd_X#@5rM(5dB*~%`UhA9mSq-0JBc&BJV9>ebf1}Wk#Nzl4n9Q1-feP zOBM(&$)KvQg^f&ax!({%UL5z~jT)GxZ9r&u+6W@lGSpd(>d3JHff^aE`g=HBDY{ZlfH&-0B2>1rpqj@=1?s9o5^pBXa`N?qnV^mk=ekR zb2IK2GjaCurrV910@dFmxqYzJvZ0Qd6C+)c6NsBvmB0uoI(W0b6U;<$_W%zMxK7b8 z6l{l5iR+9|_qHXiCQC4aCv8ywL9{tZ@Ij%i1bsQ^?p~B^-RnksC{rM2V}fRxAeId@ zz?0q!8II`WpxEXECdU;`vSu;rG(mXy1g*%62aB++j2lgxt<2>=#T)|e8^WuTjltOq z0Yt}7Ksb>hu}sGa=+M-TokN%J4UDx&fw4614x@c9pO$Bv4Ck1k9AtdBNDPJ1hcjeR z(oS=Tp%5M?2l{GWD3ePidg&uCROOM#XM_ogpy<}FaE8-?7s?SPkL}tOM(^|u;rgEY z`*@*>9i#!XWs){E28`#Y89pu)kQ-wGWz{=f0P~LdqN6Q?n*wvE72ewN?k6ie9T>fi zc`tVtYgh*hgju7Y!6qyUwNsdsj*S;$;DBO{KAj{TQCOvHh|>f&i6WO9)0AXHeq)+a z)qywA5z(7mM@KZH6+o+ECi5SPHAYzHL`PIKR5L=h?mFaG&=H+3ovr_x6+)WSfzam+ z=!ldSI$4)QPX|d!VSQnsBMNJ?WP*oJ4}HtG?%O^eP4|7F#p z-!Q1J?lSzSpgwH;9MreM;rj>m^{SF~ka*Fk z&&~WAV3kJu%#^qwI2N=%MQTJq7_n(WzfE%*nl=KegjL%BuiyeLjy4t}6Es@Qfy7wG z_7C4(1a%tZO%@Jt%=8-O-J4_}Yjh|lmUN{$Bb`?4vKrx=^^;}*3;QRS3HabqAlYe4 z>FaHFkj@zro9Co%BTa-Eu;WUXG&F1t<{M56G{pPDnmqH|<$S^@4@Z6kwOytMu;x>P zis0ImOxj@$@@Hz+mt;Fk+?{hX8i19v$&BF7K1r51CT#(l89f(a2N3BVJnxY8i)E&G zL9PxK^HzYeL=Vrf9oV4NX5YdKi72fOx=Z{WGv>1~O|oT#SVQ?_DHs+(4-FoIY+xPC z>6q4*jc=gzIHO*SlNlE5!RbcvOXk@Uq;t+VIlsfj)J`imqgnF%pF@kr<6DX}fW45X zlhqo_Q9hpDd)$^U8*ePEg9#1^9gG{+!`$fG5EEULbkspNqLv*IH z)j*ofoxE#$GC29BAGX&p6XN~>8uZPsGkAIB^(#Y!J2;00m;E+)`$H_7s$a>e#d-H zsGK6Touvr zcC^!Xna!bYl!r2rycE!{i1M^E!uz5;G-+Jn)1o{GphoTU$taKL{$V_TE22DBb^GN@ z8&RI@oNgjN4oLTmRaZ%N2=hF$7uv0QaB7+%q7WQ+-whu?okNo%5zujKnwgH6sH5P% z6L*f_@WH6Fno7W<;=ZD$Io8T?NYD4WzBK4cfg&9S6ezhzC%T zRK+^#worvSN;)SEE)p#QAXN?3;AnT5+7g|V_A3G)=Yt*JxvFt-!*>U!ka>EBi+R>7 zmo8>Ds!!y6HY<}ZCW+s~KkWvJUs70LYJBc3EC6~7bTL`X`krNdz#N%AJv(>S$kp#ycbl=Ef=2*$$3I!-43~f_XUQ(u?y|P!oOy8^FU^HBm={Hl_u~DY)ZG@NlIe7+0n#~ILfIG_c6QokW-S6q=bg@jI_ca^B6;ljV3i+%3iSMn`hw{GD zbNrV6$)!5|l&!3JNSNQxshM&nY-}m}In7EeDuOQ7=_fiJtPfK>gff`n1rh?ePT$t% zWuN)SuhX~8R+zpm>-2*@^iJkoi}U%}!uQqb$9Wlmcq{~d0yUn87-<5X8>sPeF`^GO z-d{tFSG;xkwbXb>n0uZYuNLR@J37a_m>Mt6)9C@fYmy6(&s|wA0~F~v!aMU^QkeRb zdr53BtEj@eVteLtWVPtnURDoC){%(qRr$6nreu~FHjPLI^C4BfMw9rp$j!0-jEL=V zN~wtLnXr_{1|aS(oL#-Y*m&|&VtZ5p9rUeDY|l^+kC3(xu{}Or#P-OpgV-Jw)aUHn z9lf^60F@%Pm&}Nubk6EHBV6|6Ls`^;1(|W%)C4w9? z&qDbtDODLS3Hm};V6|_fRP~hm`zTdCto8;vZ4-J(}?oMhp6H8^o=I;Bf>`gjX(5_ z>%{|%{MGc0+G>=rRdG6U6{oYLrf<~f(17dpsq~F(fCqZ2sP|y8OO2l0D(D+ojWAND zx82p(HuQ}=!38DK=-eG!GqCsYKKe!`RNyz}C>jI2Tl9^gi#?(vpl?h{rjgOmwtrz1 zDtJzipl=LaX0+k(74(g%j>CtICUxSXjBwXWh^AV1<>cyud@tk&F#h<5qnxjU^8d5^rS0a!8ByI~T1>w~Nl{jJ z0J*#aUq{~IfBv<;sLq4>&9ZplJ~@nenU`~>c|49~Jo5)J?f(6*U;n*!Q<@s#1*trg z+66Lex|sTXzgi4!rrLFmF|AazHR`Pf&I~cA5qTB>0G4C1-@OZDkr&NDzR;dkGDo;mSAymn;D< z0{M09V`XGxgV3tUb3qwT_%b=e?4;Jg-JS0xoo1WeFxYxumHR^9lL7<3;e{Fi;UvV0 zTQKAuA)J1b(Y~nI<4fnqbKihdbrtSGh*@g%!Chex&Qpuq!r{Jry6cB$49kaJ1~`sS zsZ4T8@d#>Dm9{1k2^pF!;p-J-PE6eNG%_bnRFiItDQ`>;o8AaTm>0>M&ew@tBy-|S zeVy!s z5mJ_jW~}1ovPvhgE=Vo7Lf#nmE-{$$%8)kCRv$WHvH^=6EAC~cb+HKMg`mcK5Q-PW zhW${HR6uj8uQ#E4pT87C!^fqs$yG+9~pc%s?X#K1G> zB5`VDrEO;ts_G<8;C<5hcz4QMG1c2iCIqgl1rgbxSoHX%b@f6~2LeFEPRFg)3)oT1 z0eNmxt>dAq+zREsgqe);g;(KluB#kQ@8L0KvZ~L$ftidV^8`b zGnplac$k^Y;CmXQdOI`OIL^EAaJBL#!cPb{24{`Gknl4Vd*Ac+J}2=eg=uMXpBb@i zr%ueae>LG}-_Wq9p-EAD#%8Mz`0X0EgP&76>s#y87ZYY5t|0szwZA-U5Pr_i-JMNz zc#!b3_Gtu!pK7ux0O4lBPY48^DGCH!;L^5ApLO0;KeukHnW>_lrC{tPiIwRW9G0Ya z3Mb1`=_X24;7|@ZELGbsB1PQ+Eg(U{6eg(b_?Fdy=&+E89G3MC!gd^OK?OfEsL6te z>MG3wJY5x=D;y?)oYr_winI*qurR9Ov8{}ht1l`5`lzCF!d_0)s!!|CpjE4ISekJj zHgzajPyI1$yy<=&YJ#8xCSnL38cZk>T^Cz1lq8bRv)NV*U6DH3Oq!&lZiTL$oq2b? z!@{Do4ok9iu*sIos-Ymz)ieNoxn{kbcd}?yC;Q{~B9FT^o_d*JRtU;5`vb3|vO>O7 zQpi~8=coH{2xp=PCR6bh(F1zsPxs*~x(`1VJt&>u>D+9ob{B*Ysp?@=ZfFM{aico^t%wAK{L2{B`AQ`8`FO zvdPj|DVR5D3!QdGQI4*u-MnUzX!*3=vEdQI4;%J258* zM0FW+2*Ju^IX>?a*r3btv%V*Pq(7=0-*%yVYdLGY~~7RUsqOs_UM>Ttkq!PK7)SR4gdl~<0Bh_094^S71b=deun z@GMl|Q!;UP$%NPc`cEjC@H$|>z`MDnWFo0M4d1ZIQjS2A@upt9D#1^Tpa9c*IxJ+V z%u*yGf==_FZ{3S`(yc)T>_lW<+N9=8`q1cHG6DhJGkftW4UB4e@EQn+Uc6p%3~M_P zSJGKcFdn)WuNDuO+-lh+zoHkfo0{W9nzKr8y(!~0s>{)U>j1LO9fHp~TM@tSO$sJe zPR;r7@Mz)NczE(SVG#boZZ=Mq@gv=A(riSZZZ>~SH=C?O(sDcaif%T6zTl;9HrYSj zw!`|`ZZY$q&n)9mWS){;Kg2kn!r7 zxpTR;UCf**{TNDKl@R&Y*m2qmx_3Tw@_3s>H-y567WPU2spY=;EJZVCHG)JA1RN{; z8n}Qd41R)nJS`WS7MFPX^LxD(GIl=R@i+61Z4;)yxYw&EdzpLOmeCuD^5j$dAyOyq zs{OdmdVQq!!?9l9RQuuDuWzaSa9FBWJ4e)h1T{u0juF(b4>z$?zp3_P!+!mCwI3Vy z>(|zPyo#mzN;NtMLK%Njb5<7L)tr^ZoaMp&`ydS0luXW;JDannpbvdXbJm#D7@a1Z zhO$oy9d%o%+OYP^`qF!vv$9V9G-o~jSRBgT!HA6M&COZ+y6`h@FLqaTI;lE6Q(KlI zVfBaxsaf3xkQ$)|s}rR{z<)|wCN_8!SA!E_MN!dBp-!h~Q+ZWw*%;{XNroG;o_}IJ zvG-lQRq|k)%PSWYC_UBY(saKZu55iN6*;Dift}z8uhj%2nw*3!rg9 zidLK>sRM0o3IeSXjZ@OIJDNe`vU;!~I~oyVB@&HW#R_+;=cEdE3+JQ<*o`IztUOdQ?>D#wH^(&O?DRp$-u>A>#_xT=5~);^Rl5=Eo%IPPk z9l(Tz!vXd%_QXbwJ`2ona;)EKxjAhEAzmBT1f_iZiFAX&pRj=0vW<$y0EpEkQZD@o zvDhro#ZAKo`Q1f%HmNo?31+PV*T?~#o@jhHXP2w-lkRP^8b6fS0KJn;{)9vOF14i? zT2l3ZKj}n%IdqrsC)2<2&G=Idr;#ilV&otu)`uARLyR24hJihNh>_(4`J0H5uhp#c z@{p%qgMXr9m+6vsId<6$t{=UvO^Gt&^|uFff4XDG3rd(OY=8%Sq3keE{Q$>~N1PqI ztB|~>ICfr))c|}Rx+m4N5Ab=hSn1elPXea$I~=>FWjwF6WA{iZKmtlp))iUbY1^^u zbL39P&Om{GlVeAx_a_`3h&J2LD!;qWy9JJ&o&l?4N2h~hXG|L>TR`R|I8AY-V;8zC zd)o3+Vu2y#yEn1mYaF|2qLy0YGN^~!PLCI?jAR|qew+0;DTAU0DIK8kTmM90p|2ug z<)MXN)J+iS&8SAHqGr^VDXvSdUl<)*cR(&aQ_=-#S5b04r=ng}$QU2D`dXSmSj z(Al{MXa@Ok0I=2FxcG@veTJXt)Wzc@S{F1{%dZnf;{J|i&ZZQI1{HJ0irgGrQZZk4E`w4=tPx`(fc-D6sUKIrY^RSZH$|kK@ zK0)wngW%O85!eWVk5*>53f_yA)R>lg9g~P3ZMyH26YRGbKbjF;*>yh}TW^SlP5U&2 z+MMU9kD}sO38ZpF*Zpod0NU4&lHDx2-H8qM*D3A_2iaerCzK~uUH6L`KVe!ikB?!$ z5JNOzVRtq}PMcl#4azuN>ckIo-0!+?Wa2wpwB%l^JB4m)|M;>`YYaC8+2;hOL)mB14~iG!9%k#xIBf-)8)r@Wo)he7 z++eE}7&)+Cq8j6aQ8KAd!7>x;A^RW7K1l|NeLQr+tT8YbJ?J3HK4&=nxn-YF(P3(J zb=jvO@j*s72uaQ`R<_ZfS5wT}t2mv%3Qo9e<_R`%4179vYv_}_V3Ul=%HT_}nDw$S zPNKe0#7QnJ4mQ!);vj1X((XohcV^&=hJ6WT5S_t!VtaT9i^J>`35M<_)jQ^+#*5Q4 zqBCSkaCBzYRG45O2nd4=1W?8OK#tCkfgqwYNt0`WHNerCs2)Wr;(MYq9Eq{8@jR#&)fY;F^l)47WkC zfd4(w837nw3eT|e02&qE%h2|>T|yC+fbh)Z3^Jk(93Wu^x?o@h6`pCN`J!=~u#Xt) zBiCuW6rRbR+r$rwX11ZM7e=lK&oDmcp^^}u@lKCU=o4AqAY?-ePK0MXUi2HnGoC$s zK4kOa_)N`-YR!KvG5Y!e1ZJu)M=MPeqc`<{z$nJ%R#I4&#L9bTBGox zi*26CcPB=_I(^tfG+soEp7fy^_IMyhZ_eF|^Pt5kOt*;M3bl6Wtf!zLMpu(5SBp;<$qo?at13Jk2)x;d`C$ zKK<~;?GeTh*7t+`@Xz1kT1^w`wKJ>PJ__Kb`JNn^|XQWT>htELL#eVoz z-wUvwEBfK5s1L2sV6k8Fr}x9J&b$9$MuS=pnKbh}ojM6ULe2!Ts$-0f4ZT%U$T+ew zB!JO(oeyGjLwYf)DQwyy6}5eCTgp(3sHjpw;rd-$Qz*`zC;2o3)D%LG>t0g`ym%zV z#ZPM06|w=ncUu?x_y?}uVTdm9NC zb!SiOmb8Aj-sao=qN66v$|?s1=y3jB5&uGwBAurjW~sOq)+J z@2;;YfL8sGMd_GSudwD0- z$#B6WTt;U(%p&sSxc^-Lx_+Kq@q7$USGtrZXF9E~+b@YRPmZOgA+7K@S?0B~6&~kR z{nzCr7L@qL^mqEN%MlU0tC?RlG;3%#)k6DFp|R7!R!TR0>pNJw$oJOpmjds=}}`M zk0;7yU5O+bamz$GRu4e5Q><(wQEt>J{xEGZQI2y3M4}viL8zxs7py*<*-Ae> zqQ!h3eqfL2+QvS3uO}K3wcI{l_mo0)g_=@eV|$bSpR zRx%v3g@JXW2>n#0H+HLALy)!rbi#u zpUAOwb@%XZ$g!nwBPN~1!Vy}9mm!!J;e{o z^}K$pbKXsH4Kq-R&hJHDcd?vmNm;%Z@&k5u{KHYs*Fkw#@wRs3H_Kv7r%zSp<&*K=L)erU50pY+uoU@~|Zwzti+G#)oy- zB;y0=M`V0(j%Rd&W?GdyNf@^`%Gy4)q>gPwhR!I;Rx4aNuSsy*sTF7LBUqb=(BgR#R|JBUaY2SKuZ_2CjbCg%vrNLEwg;YIA2UO(CQv19VydKWup3RcFJf{bLD zo!w{0tl2r8zrsa!%%sLhP9_z}A}3x%vZ|5}#UWDQIiw?5O^LyX5Rt5;WOA6#vt#nt zyn-DQsw1^>yoT|?)Cs*cl64E^!=%-ru^?oFZ2)%@J!WfG#)>OBUd!-m%7FY@h&;D-_=S{?oq&sN z@)CG$mgXMdsRD-NZH!!(k(DV2vXRHQ8_P0GWqHvlCoWng`CiHaK@r#azQ{_RPcfPJ zYbuM5ORo!RVEiG2v51otx+3dugYk*Og+mh^e)0*V67`9~@o;2O>8JtF!5nLpg6jC~Nf)LP#XW&!;QfeXX z8~fLA^-imLOv~`phm13j*@kh3=|Ls4IJ613C$j**y{d}hlrWXdl68Sr;?`@B%%V!b z#P*i0MTVl>FSm|`FjX)lw{CZ%-Gcn$uG<>M0S=bSIjKx$F^nj~4GrVGd|@o^GGi`* zo9K`OV={{^?o!Dt257?w-t!nA++-H2qY~+lL04Tt`eSk`36jsQE7Cs<)6r&em)9^Z z8uqdRbcrIFCHD#~OlDcn$GbOOWJM3;H;ltvrVy3LFYcll;}&;80ziK{ug$Qt%S3DD z%Xx9VVr}J=D>fb#>qGmFOXCkh;AZN+->iKhy;(x4j)wN^;rb1|2V-T zsIMVruv5s0X-UnQE>7_td|&?LRBb4%RGO3E!S{26-J9-A@StkN!dq6aR%9!Rw0gry zIrqBY^%LXf#G>ZzCh<(EFsDY+V2K2eNi7l1aYQe|Bdwo+o{woFY%(}IT`IpLIVB>a zq2)r#W|`kn^r2V@(}yC!el>cIi<{q}Gpa-gb=z^#iQm6b>X&YCe#fMlH07Rws*W)g z$nTh(K}OF7@;mfiKVapr$nP*UCPQ(^6rFBLt8J!7ac`CWVv$SaAhkx;O>vGFI@aBgHEq%INANI3F!JS&6?*Ew&Br3~isYV>v$OvC#?_c}2DG}pxn{{J-F`P_xi;^}|g@P>X zfCHYsn}!D`?T!P6C4fLY9e_YxdOskOu_594^&iQv^@QLw+TgH^{HVhg!1i1{HH~cfqej z5i=eID)I_2g<#^aTrBU%^x~eB`KR}Ii7hdW=3enDP5ptn-k58gnYI;ptsCOVar+lu z2)LRjpd&KtP{^2H3GR*{crlBMX9BhUAH=iy#ohXEkCt9#z&9BG#mExFABcER$u-@VeN z!nSZwe1Xm@7xNw{%NQbNv5jL^Ct#`h0?p7*@R5NpFsKWiR3v}+e*MYm?~P=1f-lgt ztrC2J>>qq5zCcWZ6vTiV;;-NfY)ZBoA3-0=V=VXrvvc?2G`__`&VKP?Yg1Ocuj+Tt z5Er#ULd_Rw9u)U81|MF{7ihqZ7xM+ivG#JdDKF1l9_YSwv8tTPx*cSH%Lk_akZFdV zAPLdu^D5On8Jv96kmbCa+NohxUOxD#y8L-10k#l~ zCbP~(g<0ew$`Dxy+DS&EAk6le!8oHfvc3?&aqcofyd#aCkUCk+xZ}tEIEMQLBT^|! z(aBaRlR7Z*tFW0xX#VVc5lmsDG9jlINc6F{XmCe7+jIz6H4q_s{octoQW~7zT&K65 z4A+Ke=c3_%on64pI#9jtu<~#-nS{#QG{6(75o~rbrDeeI$V`9;m?kFphQRjd%*g>` zxg5(3!OGlzDA+F^P>!l!sK|a3fOpU^Rn5RQZ1ghcQDy@T+ow(@W?OJQCd4af)^W3Y zi-3!}V^5L3RR`zc13Wx@_h94D`)z48v4ZGy1&OvDt;FTC)2B|9P!=Uy?Ss)C+Vr6V zCNPSIJ9*X*nw=MNdQ*xRo`~yvQGu){y-4gwjULC6c4IiTGJlClkkKQ?Nu0B(y8u}Am;@RTlD@1{RVz&b?I??dEKLG~<6y?BGzo$}6f;)6ym)C6m`@X& zhY#@Z(j-V~$-sw$EdvtvCHtRA5J$VguFgZr?aP!%!6XIjGaT2Ai(T23QL2Z#_=`DVCjTs?OH^^%TN4T~PhAnE}WQ|K8^ zCxAASwjh4^Ww5|yJ^!px1C?&^V@E=C9y0o*Ox9Nw*9ZN;+1h?Omim{#SL5F%J4rFc z)D&={M>&6L<&G*TXP z@7?MUbSpSD%CRzm|C3%_-gtNiPZwkbR;7~BPJG`&d}Fy=W37o4FC_&MH{$`h|1|cE zT)ZKjI>sgPT3gn}28Z4bh;y5=)^$SzNgDhnCiq2MrYpT9OA?$=E!XQ<2KE({mm`)J z)lk(J#8I~?tD=xL#3+w}UL~cXa7xTb5cm#3gH$@1Hc&j#cPx$-4XXrt&z6-{`nR42 z7$q6GV}Rf4Z$m;sSuL^TpSL5juseQ|U`5=1W7C3!fgxPpWaK@JWaP#K@rV31K{j=9 z`K-=|V`55*w#{GG>+^vB>f5cNxc#ILDpu+ypA-SpMmfwtl|1E27d$;B!em`WG0zub zu#}?P#vf#XIij*$E{@Y$tYF5C@pz{$UHBNsOrW*t;@0a}JNLNTBOAP2p=XL{PW5wDwqIC1m0wou8WLe;nwtWrDI zM8g91lQ@_?BI=Avo>v>)N z3S!_VHIwx6C5yd3ctAv~mwQ9gL)gJW_4RjEWM6q2*e51%&0D0{eRnI79@wP}Jn=NA z=4t#ED$gise)iu-*j23lCpuDj7-{;6+Ww79Zk{IAhJn|dU$yD6!fbZIU}&?JyPX6n z5Po!Jh&P#5jt&(!kJcJ;vgO{Hu4I2o>aSs&^c}yI!gaZf+Nl?h%)ObhO^A0#1(in> zR(Z)4AkztnJJZIe`1=o*a5^$$p3~?F{W4cEaHdF0(YGmF|vK-pzTQ) zH`mM>#T>Yw6-$|v*j7}H@r0eeOC1*oP`xG7nJ|9fOaJ4V`9M}5?{s*7OOP^2v;$6R zU`%ZHyoei@iWiSbn^hpj=8hld#+v6|bM!YuO`v}Fj~nNnEd2-;CrN9%ggi@tm294* z-J=;WO0DdR6Qw}Z|1!G37bbOVdT}mevT}+t?U^yUeuXe%bnTihlg}RaB5eT0@X=Pv zc2p*1(hrcY)Qlg;zCsbNH&|!9yQwdu$bkYtitss--)aS<2%a)p7T5Bl4wo{a8;RVv z@S}(ym#VjSbBa2kuSuSg2?LHH)Qn^sl&ZD)*xNPPXQ-T%GEvwR_k~CwpNh~lVw8PP z7!To8!TUGlV&}@Hv=umEB;!HV!;z>?wjQ1YkUTE6Q{Jh7t1WVWAO?}nE=}k^W)w4X zX2lvNWs)6qeAElE#bwmVFRY-m6cvG)_R#i&k!EP48K1PmYzr;*J2h3tg3S|B$MX{n zva*9_1e(Q5a(tYLd&^Y;oHqmducfZeV)^g`hx}Bt=W&crK>0!vd=kJYe@1So#b48WlyC3t?sy z)r=T4BoRYB<_6+1)hzS#3e)CwqsZjC75fFI#gw$1xry62G}*J_%1uejoWhdM%gu4) zzoRC`vuF#7-=V_jc*4xe)&IfT7rPMRYgo9^A)o?~? z5Oi(51{AorGo~-|*KR{W-Yzm0-PC9|dAR;`qG%SPP7o{^&$Y&{gsN`k!Lv2tw0el<;xi_ zQ+nye5m%mMrRlbHj=7iWo(Km1u)LjwnNy^y%Ip#bL^%n`_FlyK)0UYBp0EB)7&ebW zqwF}dQ3sijNCd^IeNI8+7~9q5@p1dtTq=qy5gO3wp!ZKV{~Dj zVvY_kL_}6{_2O5twE>H$jy|b0&M>4T_4i!{pX_@KiQ*r4q}<~p6Hyi-hu1ZST||ot zYe8Jxa^tRK{%iNF)6v>XJn&#b8Bl5jch;H>+Ka~Dch%HBeM7{0Pt$b{b-1&jQ7_>5Sr`o;uj^=)Gspt*Y+|T zUYc6)0nwFczV}>P-b@@o32+rrW`A#DRmMgk9|YrVe&DR*g+1pEBouS7q?ZD9ncaWd56|dkDt*mx*I@ zP?ha(V-ZpAvDyCq!paBpUnmD}ugYVy_A{`rU$X{0XoO1j{OH9;?etXa2>J-s^vH zef`Ak&<}~8U&j;M9mWqRAV{pxvjEX z55nnAUI_W-k8l;>)qW%RLQl5rHd>zcI7zNBaOIm9)4q+=BTny1#yT?T$Mw1v4{!#x z?=Qc=vX^yfqpGMGzRh481^I?<`0pZGClQIYCM4_NEIS4a`vRzJ9dk|XQx)r1o{qV4 z@bd~#^G3pG;pP&8ig<$g+Mh96CwcGbN$pe8>FRHo&N=sOnibLSAzG(3H{5vxkb4#p zv<`U~@~DLsr~FLr+Yu7AwsGWHcZ{ay%}@QCV#@qoj*eMReQCSI4?!vOJZ(Fof0U#Q;%pe}2qqY^7|m!r7EJngr=p>>E!a zX>5N_lDo*-;^-yoJ=lS#+ah}Dm)k6vu}+GUnGe)>shZnH(%BrhCQhc4ST;@6eW#V0 z+h!GQ$`==O6OmuTG`0@eE+h?m@2nMqBb@Ha8dCoNs$_s>f=vrU`n!xu30}vQ`aO&R zO#K4>3b!$>W>udko*6YoG?<6)GLd!k5k}+(l3EXKp3=GJQ3`&N-oSFJZ#RMvM%`Nf z?1p_~I*JW^2b7L_-5O*Igl83^V};cHb67(TZIn54L2a}Nt)(H3x%$pB{$COQ0a&jV9f!oYzfaI8% z6)p0t)6bxQHO#R?hUvIwkv2FOwpdJ-PesTuZ3P`HaZ`dDYLev8EAQ zdjJQ?>b1bMmvx8TAaT8CzzBkZR}SLfuj^UB&`qJ$|5a*4;TU46l%0DVe8BH1Dy(hz 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 z%0D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�b%+u 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≻^2W@a4{heFVqd2d458lmqEIp| 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

      >|`H9%}0gM7FIO#xnK+DfE0}4kYWov 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
      bJk{$+OwjhOB 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
      8DKmwOG7@nERmXI;X5LaHqT*(QQ&hoq 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 } @@ -48,7 +47,7 @@ namespace Renci.SshNet.Tests.Classes .Setup(p => p.Transform(_path)) .Returns(_transformedPath); _channelSessionMock.InSequence(sequence) - .Setup(p => p.SendExecRequest(string.Format("scp -rt {0}", _transformedPath))) + .Setup(p => p.SendExecRequest(string.Format("scp -r -p -d -t {0}", _transformedPath))) .Returns(false); _channelSessionMock.InSequence(sequence).Setup(p => p.Dispose()); _pipeStreamMock.As().InSequence(sequence).Setup(p => p.Dispose()); @@ -87,7 +86,7 @@ namespace Renci.SshNet.Tests.Classes [TestMethod] public void SendExecREquestOnChannelSessionShouldBeInvokedOnce() { - _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -rt {0}", _transformedPath)), Times.Once); + _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -r -p -d -t {0}", _transformedPath)), Times.Once); } [TestMethod] diff --git a/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_SendExecRequestReturnsFalse.cs b/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_SendExecRequestReturnsFalse.cs index a3d1ca09..0c842a21 100644 --- a/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_SendExecRequestReturnsFalse.cs +++ b/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_SendExecRequestReturnsFalse.cs @@ -13,7 +13,9 @@ namespace Renci.SshNet.Tests.Classes private ConnectionInfo _connectionInfo; private ScpClient _scpClient; private FileInfo _fileInfo; - private string _path; + private string _remoteDirectory; + private string _remoteFile; + private string _remotePath; private string _transformedPath; private string _fileName; private IList _uploadingRegister; @@ -36,7 +38,9 @@ namespace Renci.SshNet.Tests.Classes _fileName = CreateTemporaryFile(new byte[] { 1 }); _connectionInfo = new ConnectionInfo("host", 22, "user", new PasswordAuthenticationMethod("user", "pwd")); _fileInfo = new FileInfo(_fileName); - _path = "/home/sshnet/" + random.Next(); + _remoteDirectory = "/home/sshnet"; + _remoteFile = random.Next().ToString(); + _remotePath = _remoteDirectory + "/" + _remoteFile; _transformedPath = random.Next().ToString(); _uploadingRegister = new List(); } @@ -56,10 +60,10 @@ namespace Renci.SshNet.Tests.Classes _sessionMock.InSequence(sequence).Setup(p => p.CreateChannelSession()).Returns(_channelSessionMock.Object); _channelSessionMock.InSequence(sequence).Setup(p => p.Open()); _remotePathTransformationMock.InSequence(sequence) - .Setup(p => p.Transform(_path)) + .Setup(p => p.Transform(_remoteDirectory)) .Returns(_transformedPath); _channelSessionMock.InSequence(sequence) - .Setup(p => p.SendExecRequest(string.Format("scp -t {0}", _transformedPath))) + .Setup(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath))) .Returns(false); _channelSessionMock.InSequence(sequence).Setup(p => p.Dispose()); _pipeStreamMock.As().InSequence(sequence).Setup(p => p.Dispose()); @@ -78,7 +82,7 @@ namespace Renci.SshNet.Tests.Classes { try { - _scpClient.Upload(_fileInfo, _path); + _scpClient.Upload(_fileInfo, _remotePath); Assert.Fail(); } catch (SshException ex) @@ -98,7 +102,7 @@ namespace Renci.SshNet.Tests.Classes [TestMethod] public void SendExecRequestOnChannelSessionShouldBeInvokedOnce() { - _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -t {0}", _transformedPath)), Times.Once); + _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath)), Times.Once); } [TestMethod] diff --git a/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_Success.cs b/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_Success.cs index a6ac4a11..c04525e0 100644 --- a/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_Success.cs +++ b/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_FileInfoAndPath_Success.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -16,7 +15,9 @@ namespace Renci.SshNet.Tests.Classes private ConnectionInfo _connectionInfo; private ScpClient _scpClient; private FileInfo _fileInfo; - private string _path; + private string _remoteDirectory; + private string _remoteFile; + private string _remotePath; private string _transformedPath; private int _bufferSize; private byte[] _fileContent; @@ -44,7 +45,9 @@ namespace Renci.SshNet.Tests.Classes _fileName = CreateTemporaryFile(_fileContent); _connectionInfo = new ConnectionInfo("host", 22, "user", new PasswordAuthenticationMethod("user", "pwd")); _fileInfo = new FileInfo(_fileName); - _path = "/home/sshnet/" + random.Next().ToString(CultureInfo.InvariantCulture); + _remoteDirectory = "/home/sshnet"; + _remoteFile = random.Next().ToString(); + _remotePath = _remoteDirectory + "/" + _remoteFile; _transformedPath = random.Next().ToString(); _uploadingRegister = new List(); } @@ -64,17 +67,18 @@ namespace Renci.SshNet.Tests.Classes _sessionMock.InSequence(sequence).Setup(p => p.CreateChannelSession()).Returns(_channelSessionMock.Object); _channelSessionMock.InSequence(sequence).Setup(p => p.Open()); _remotePathTransformationMock.InSequence(sequence) - .Setup(p => p.Transform(_path)) + .Setup(p => p.Transform(_remoteDirectory)) .Returns(_transformedPath); _channelSessionMock.InSequence(sequence) - .Setup(p => p.SendExecRequest(string.Format("scp -t {0}", _transformedPath))) + .Setup(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath))) .Returns(true); _pipeStreamMock.InSequence(sequence).Setup(p => p.ReadByte()).Returns(0); _channelSessionMock.InSequence(sequence).Setup(p => p.SendData(It.IsAny())); _pipeStreamMock.InSequence(sequence).Setup(p => p.ReadByte()).Returns(0); _channelSessionMock.InSequence(sequence) - .Setup(p => p.SendData(It.Is(b => b.SequenceEqual(CreateData( - string.Format("C0644 {0} {1}\n", _fileInfo.Length, string.Empty)))))); + .Setup(p => p.SendData(It.Is(b => b.SequenceEqual( + CreateData(string.Format("C0644 {0} {1}\n", _fileInfo.Length, _remoteFile), + _connectionInfo.Encoding))))); _pipeStreamMock.InSequence(sequence).Setup(p => p.ReadByte()).Returns(0); _channelSessionMock.InSequence(sequence) .Setup( @@ -104,13 +108,13 @@ namespace Renci.SshNet.Tests.Classes protected override void Act() { - _scpClient.Upload(_fileInfo, _path); + _scpClient.Upload(_fileInfo, _remotePath); } [TestMethod] public void SendExecRequestOnChannelSessionShouldBeInvokedOnce() { - _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -t {0}", _transformedPath)), Times.Once); + _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath)), Times.Once); } [TestMethod] @@ -143,9 +147,9 @@ namespace Renci.SshNet.Tests.Classes Assert.AreEqual(_fileSize, uploading.Uploaded); } - private static IEnumerable CreateData(string command) + private static IEnumerable CreateData(string command, Encoding encoding) { - return Encoding.Default.GetBytes(command); + return encoding.GetBytes(command); } private static byte[] CreateContent(int length) diff --git a/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_StreamAndPath_SendExecRequestReturnsFalse.cs b/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_StreamAndPath_SendExecRequestReturnsFalse.cs index b03a4484..d2c6992b 100644 --- a/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_StreamAndPath_SendExecRequestReturnsFalse.cs +++ b/src/Renci.SshNet.Tests/Classes/ScpClientTest_Upload_StreamAndPath_SendExecRequestReturnsFalse.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -14,7 +13,9 @@ namespace Renci.SshNet.Tests.Classes private ConnectionInfo _connectionInfo; private ScpClient _scpClient; private Stream _source; - private string _path; + private string _remoteDirectory; + private string _remoteFile; + private string _remotePath; private string _transformedPath; private IList _uploadingRegister; private SshException _actualException; @@ -34,7 +35,9 @@ namespace Renci.SshNet.Tests.Classes _connectionInfo = new ConnectionInfo("host", 22, "user", new PasswordAuthenticationMethod("user", "pwd")); _source = new MemoryStream(); - _path = "/home/sshnet/" + random.Next().ToString(CultureInfo.InvariantCulture); + _remoteDirectory = "/home/sshnet"; + _remoteFile = random.Next().ToString(); + _remotePath = _remoteDirectory + "/" + _remoteFile; _transformedPath = random.Next().ToString(); _uploadingRegister = new List(); } @@ -54,10 +57,10 @@ namespace Renci.SshNet.Tests.Classes _sessionMock.InSequence(sequence).Setup(p => p.CreateChannelSession()).Returns(_channelSessionMock.Object); _channelSessionMock.InSequence(sequence).Setup(p => p.Open()); _remotePathTransformationMock.InSequence(sequence) - .Setup(p => p.Transform(_path)) + .Setup(p => p.Transform(_remoteDirectory)) .Returns(_transformedPath); _channelSessionMock.InSequence(sequence) - .Setup(p => p.SendExecRequest(string.Format("scp -t {0}", _transformedPath))) + .Setup(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath))) .Returns(false); _channelSessionMock.InSequence(sequence).Setup(p => p.Dispose()); _pipeStreamMock.As().InSequence(sequence).Setup(p => p.Dispose()); @@ -76,7 +79,7 @@ namespace Renci.SshNet.Tests.Classes { try { - _scpClient.Upload(_source, _path); + _scpClient.Upload(_source, _remotePath); Assert.Fail(); } catch (SshException ex) @@ -96,7 +99,7 @@ namespace Renci.SshNet.Tests.Classes [TestMethod] public void SendExecRequestOnChannelSessionShouldBeInvokedOnce() { - _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -t {0}", _transformedPath)), Times.Once); + _channelSessionMock.Verify(p => p.SendExecRequest(string.Format("scp -t -d {0}", _transformedPath)), Times.Once); } [TestMethod] diff --git a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj index 5b9ccafc..043c7977 100644 --- a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj +++ b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj @@ -173,6 +173,8 @@ + + @@ -731,4 +733,4 @@ --> - + \ No newline at end of file diff --git a/src/Renci.SshNet/Common/PosixPath.cs b/src/Renci.SshNet/Common/PosixPath.cs index f9c099b8..465916b3 100644 --- a/src/Renci.SshNet/Common/PosixPath.cs +++ b/src/Renci.SshNet/Common/PosixPath.cs @@ -4,6 +4,49 @@ namespace Renci.SshNet.Common { internal class PosixPath { + public string Directory { get; private set; } + public string File { get; private set; } + + public static PosixPath CreateAbsoluteOrRelativeFilePath(string path) + { + if (path == null) + { + throw new ArgumentNullException("path"); + } + + var posixPath = new PosixPath(); + + var pathEnd = path.LastIndexOf('/'); + if (pathEnd == -1) + { + if (path.Length == 0) + { + throw new ArgumentException("The path is a zero-length string.", "path"); + } + + posixPath.Directory = "."; + posixPath.File = path; + } + else if (pathEnd == 0) + { + posixPath.Directory = "/"; + if (path.Length > 1) + { + posixPath.File = path.Substring(pathEnd + 1); + } + } + else + { + posixPath.Directory = path.Substring(0, pathEnd); + if (pathEnd < path.Length - 1) + { + posixPath.File = path.Substring(pathEnd + 1); + } + } + + return posixPath; + } + /// /// Gets the file name part of a given POSIX path. /// @@ -18,11 +61,14 @@ namespace Renci.SshNet.Common /// is returned. /// /// - /// If path has a trailing slash, but return a zero-length string. + /// If path has a trailing slash, return a zero-length string. /// /// public static string GetFileName(string path) { + if (path == null) + throw new ArgumentNullException("path"); + var pathEnd = path.LastIndexOf('/'); if (pathEnd == -1) return path; @@ -30,5 +76,29 @@ namespace Renci.SshNet.Common return string.Empty; return path.Substring(pathEnd + 1); } + + /// + /// Gets the directory name part of a given POSIX path. + /// + /// The POSIX path to get the directory name for. + /// + /// The directory part of the specified , or . if + /// does not contain any directory information. + /// + /// is null. + public static string GetDirectoryName(string path) + { + if (path == null) + throw new ArgumentNullException("path"); + + var pathEnd = path.LastIndexOf('/'); + if (pathEnd == -1) + return "."; + if (pathEnd == 0) + return "/"; + if (pathEnd == path.Length - 1) + return path.Substring(0, pathEnd); + return path.Substring(0, pathEnd); + } } } diff --git a/src/Renci.SshNet/ScpClient.NET.cs b/src/Renci.SshNet/ScpClient.NET.cs index 4665dabf..cb23cb69 100644 --- a/src/Renci.SshNet/ScpClient.NET.cs +++ b/src/Renci.SshNet/ScpClient.NET.cs @@ -20,15 +20,16 @@ namespace Renci.SshNet /// The file system info. /// A relative or absolute path for the remote file. /// is null. - /// is null or empty. + /// is null. + /// is a zero-length . /// A directory with the specified path exists on the remote host. /// The secure copy execution request was rejected by the server. public void Upload(FileInfo fileInfo, string path) { if (fileInfo == null) throw new ArgumentNullException("fileInfo"); - if (string.IsNullOrEmpty(path)) - throw new ArgumentException("path"); + + var posixPath = PosixPath.CreateAbsoluteOrRelativeFilePath(path); using (var input = ServiceFactory.CreatePipeStream()) using (var channel = Session.CreateChannelSession()) @@ -36,7 +37,9 @@ namespace Renci.SshNet channel.DataReceived += (sender, e) => input.Write(e.Data, 0, e.Data.Length); channel.Open(); - if (!channel.SendExecRequest(string.Format("scp -t {0}", _remotePathTransformation.Transform(path)))) + // Pass only the directory part of the path to the server, and use the (hidden) -d option to signal + // that we expect the target to be a directory. + if (!channel.SendExecRequest(string.Format("scp -t -d {0}", _remotePathTransformation.Transform(posixPath.Directory)))) { throw SecureExecutionRequestRejectedException(); } @@ -45,7 +48,7 @@ namespace Renci.SshNet using (var source = fileInfo.OpenRead()) { UploadTimes(channel, input, fileInfo); - UploadFileModeAndName(channel, input, source.Length, string.Empty); + UploadFileModeAndName(channel, input, source.Length, posixPath.File); UploadFileContent(channel, input, source, fileInfo.Name); } } @@ -56,16 +59,19 @@ namespace Renci.SshNet ///

    S&DH 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%0DBG7Wwsv+`?o>SuCVIGv1p_ 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

    /// The directory info. /// A relative or absolute path for the remote directory. - /// fileSystemInfo - /// is null or empty. - /// exists on the remote host, and is not a directory. + /// is null. + /// is null. + /// is a zero-length string. + /// does not exist on the remote host, is not a directory or the user does not have the required permission. /// The secure copy execution request was rejected by the server. public void Upload(DirectoryInfo directoryInfo, string path) { if (directoryInfo == null) throw new ArgumentNullException("directoryInfo"); - if (string.IsNullOrEmpty(path)) - throw new ArgumentException("path"); + if (path == null) + throw new ArgumentNullException("path"); + if (path.Length == 0) + throw new ArgumentException("The path cannot be a zero-length string.", "path"); using (var input = ServiceFactory.CreatePipeStream()) using (var channel = Session.CreateChannelSession()) @@ -73,15 +79,18 @@ namespace Renci.SshNet channel.DataReceived += (sender, e) => input.Write(e.Data, 0, e.Data.Length); channel.Open(); - // start recursive upload - if (!channel.SendExecRequest(string.Format("scp -rt {0}", _remotePathTransformation.Transform(path)))) + // start copy with the following options: + // -p preserve modification and access times + // -r copy directories recursively + // -d expect path to be a directory + // -t copy to remote + if (!channel.SendExecRequest(string.Format("scp -r -p -d -t {0}", _remotePathTransformation.Transform(path)))) { throw SecureExecutionRequestRejectedException(); } + CheckReturnCode(input); - UploadTimes(channel, input, directoryInfo); - UploadDirectoryModeAndName(channel, input, "."); UploadDirectoryContent(channel, input, directoryInfo); } } @@ -311,5 +320,39 @@ namespace Renci.SshNet SendErrorConfirmation(channel, string.Format("\"{0}\" is not valid protocol message.", message)); } } + + /// + /// Return a value indicating whether the specified path is a valid SCP file path. + /// + /// The path to verify. + /// + /// if is a valid SCP file path; otherwise, . + /// + /// + /// To match OpenSSH behavior (introduced as a result of CVE-2018-20685), a file path is considered + /// invalid in any of the following conditions: + /// + /// + /// is a zero-length string. + /// + /// + /// is ".". + /// + /// + /// is "..". + /// + /// + /// contains a forward slash (/). + /// + /// + /// + private static bool IsValidScpFilePath(string path) + { + return path != null && + path.Length != 0 && + path != "." && + path != ".." && + path.IndexOf('/') == -1; + } } } diff --git a/src/Renci.SshNet/ScpClient.cs b/src/Renci.SshNet/ScpClient.cs index 8fb23ebc..a30107e2 100644 --- a/src/Renci.SshNet/ScpClient.cs +++ b/src/Renci.SshNet/ScpClient.cs @@ -202,28 +202,30 @@ namespace Renci.SshNet /// /// The to upload. /// A relative or absolute path for the remote file. + /// is null. + /// is a zero-length . /// A directory with the specified path exists on the remote host. /// The secure copy execution request was rejected by the server. public void Upload(Stream source, string path) { + var posixPath = PosixPath.CreateAbsoluteOrRelativeFilePath(path); + using (var input = ServiceFactory.CreatePipeStream()) using (var channel = Session.CreateChannelSession()) { channel.DataReceived += (sender, e) => input.Write(e.Data, 0, e.Data.Length); channel.Open(); - // pass the full path to ensure the server does not create the directory part - // as a file in case the directory does not exist - if (!channel.SendExecRequest(string.Format("scp -t {0}", _remotePathTransformation.Transform(path)))) + // Pass only the directory part of the path to the server, and use the (hidden) -d option to signal + // that we expect the target to be a directory. + if (!channel.SendExecRequest(string.Format("scp -t -d {0}", _remotePathTransformation.Transform(posixPath.Directory)))) { throw SecureExecutionRequestRejectedException(); } CheckReturnCode(input); - // specify a zero-length file name to avoid creating a file with absolute - // path '/' if directory '' already exists - UploadFileModeAndName(channel, input, source.Length, string.Empty); - UploadFileContent(channel, input, source, PosixPath.GetFileName(path)); + UploadFileModeAndName(channel, input, source.Length, posixPath.File); + UploadFileContent(channel, input, source, posixPath.File); } } From ea5a440131bf0889dacfae0d198e9d9c2559ecf7 Mon Sep 17 00:00:00 2001 From: Adrian Stanislawski Date: Thu, 27 Feb 2020 11:36:39 +0100 Subject: [PATCH 42/67] Fixed few summary comment tags --- src/Renci.SshNet/NetConfClient.cs | 10 +++++----- src/Renci.SshNet/ScpClient.cs | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Renci.SshNet/NetConfClient.cs b/src/Renci.SshNet/NetConfClient.cs index d2d4a8af..b1877c60 100644 --- a/src/Renci.SshNet/NetConfClient.cs +++ b/src/Renci.SshNet/NetConfClient.cs @@ -54,7 +54,7 @@ namespace Renci.SshNet #region Constructors /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The connection info. /// is null. @@ -64,7 +64,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Connection port. @@ -80,7 +80,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Authentication username. @@ -93,7 +93,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Connection port. @@ -109,7 +109,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Authentication username. diff --git a/src/Renci.SshNet/ScpClient.cs b/src/Renci.SshNet/ScpClient.cs index a30107e2..8a252cac 100644 --- a/src/Renci.SshNet/ScpClient.cs +++ b/src/Renci.SshNet/ScpClient.cs @@ -93,7 +93,7 @@ namespace Renci.SshNet #region Constructors /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The connection info. /// is null. @@ -103,7 +103,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Connection port. @@ -119,7 +119,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Authentication username. @@ -132,7 +132,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Connection port. @@ -148,7 +148,7 @@ namespace Renci.SshNet } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// Connection host. /// Authentication username. From 5c2e2b4c4ac842e048d5ccc80265bf951018db9c Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Fri, 28 Feb 2020 21:46:39 +0100 Subject: [PATCH 43/67] Use SDK-style project where possible (#629) * Change Renci.SshNet project into SDK-style project supporting .NET 3.5, .NET 4.0; .NET Standard 1.3, .NET Standard 2.0. * Remove .NET 3.5 project. * Remove .NET 3.5 test project. * Refactor away .NET 3.5 and .NET 4.0 specific source files. * Remove .NET Core project. * Add VS 2019 solution. * Use VS 2019 image and solution file in AppVeyor. * Run tests against multi-target framework test project. * No need to shutdown socket when client disconnects. --- appveyor.yml | 10 +- runtest.cmd | 3 + .../Common/Extensions.NET35.cs | 38 - .../Properties/AssemblyInfo.cs | 8 - .../Renci.SshNet.NET35.csproj | 1416 ------------- .../Properties/AssemblyInfo.cs | 3 - .../Renci.SshNet.NETCore.csproj | 38 - .../Classes/ForwardedPortLocal.NET35.cs | 13 - .../Classes/ForwardedPortRemote.NET35.cs | 13 - .../Classes/SshCommandTest.NET35.cs | 13 - .../Properties/AssemblyInfo.cs | 5 - .../Properties/Resources.Designer.cs | 206 -- .../Properties/Resources.resx | 244 --- .../Renci.SshNet.Tests.NET35.csproj | 1785 ----------------- src/Renci.SshNet.Tests.NET35/packages.config | 4 - .../Common/ProxyExceptionTest.NET40.cs | 8 - .../Classes/ForwardedPortLocalTest.NET40.cs | 103 - .../Classes/ForwardedPortLocalTest.cs | 92 + .../Classes/ForwardedPortRemote.NET40.cs | 51 - .../Classes/ForwardedPortRemoteTest.cs | 41 + .../Classes/ScpClientTest.NET40.cs | 109 - .../Classes/ScpClientTest.cs | 99 + src/Renci.SshNet.Tests/Classes/ShellStream.cs | 13 - .../Classes/SshCommandTest.NET40.cs | 100 - .../Classes/SshCommandTest.cs | 98 + .../Common/AsyncSocketListener.cs | 1 - .../Properties/AssemblyInfo.cs | 5 - .../Renci.SshNet.Tests.csproj | 835 +------- src/Renci.SshNet.Tests/authorized_keys | 4 - src/Renci.SshNet.Tests/packages.config | 4 - src/Renci.SshNet.VS2017.sln | 45 +- src/Renci.SshNet.VS2019.sln | 82 + src/Renci.SshNet/BaseClient.cs | 4 +- src/Renci.SshNet/Common/Extensions.cs | 31 +- src/Renci.SshNet/Properties/AssemblyInfo.cs | 2 +- src/Renci.SshNet/Renci.SshNet.csproj | 660 +----- 36 files changed, 609 insertions(+), 5577 deletions(-) create mode 100644 runtest.cmd delete mode 100644 src/Renci.SshNet.NET35/Common/Extensions.NET35.cs delete mode 100644 src/Renci.SshNet.NET35/Properties/AssemblyInfo.cs delete mode 100644 src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj delete mode 100644 src/Renci.SshNet.NETCore/Properties/AssemblyInfo.cs delete mode 100644 src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj delete mode 100644 src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortLocal.NET35.cs delete mode 100644 src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortRemote.NET35.cs delete mode 100644 src/Renci.SshNet.Tests.NET35/Classes/SshCommandTest.NET35.cs delete mode 100644 src/Renci.SshNet.Tests.NET35/Properties/AssemblyInfo.cs delete mode 100644 src/Renci.SshNet.Tests.NET35/Properties/Resources.Designer.cs delete mode 100644 src/Renci.SshNet.Tests.NET35/Properties/Resources.resx delete mode 100644 src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj delete mode 100644 src/Renci.SshNet.Tests.NET35/packages.config delete mode 100644 src/Renci.SshNet.Tests/Classes/Common/ProxyExceptionTest.NET40.cs delete mode 100644 src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.NET40.cs delete mode 100644 src/Renci.SshNet.Tests/Classes/ForwardedPortRemote.NET40.cs delete mode 100644 src/Renci.SshNet.Tests/Classes/ScpClientTest.NET40.cs delete mode 100644 src/Renci.SshNet.Tests/Classes/ShellStream.cs delete mode 100644 src/Renci.SshNet.Tests/Classes/SshCommandTest.NET40.cs delete mode 100644 src/Renci.SshNet.Tests/Properties/AssemblyInfo.cs delete mode 100644 src/Renci.SshNet.Tests/authorized_keys delete mode 100644 src/Renci.SshNet.Tests/packages.config create mode 100644 src/Renci.SshNet.VS2019.sln diff --git a/appveyor.yml b/appveyor.yml index ab8e88d5..c5bb4a18 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,14 +1,14 @@ -os: Visual Studio 2015 +os: Visual Studio 2019 before_build: - - nuget restore src\Renci.SshNet.VS2015.sln + - nuget restore src\Renci.SshNet.VS2019.sln build: - project: src\Renci.SshNet.VS2015.sln + project: src\Renci.SshNet.VS2019.sln verbosity: minimal test_script: - cmd: >- - vstest.console /logger:Appveyor src\Renci.SshNet.Tests\bin\Debug\Renci.SshNet.Tests.dll /TestCaseFilter:"TestCategory!=integration&TestCategory!=LongRunning" + vstest.console /logger:Appveyor src\Renci.SshNet.Tests\bin\Debug\net40\Renci.SshNet.Tests.dll /TestCaseFilter:"TestCategory!=integration&TestCategory!=LongRunning" - vstest.console /logger:Appveyor src\Renci.SshNet.Tests.NET35\bin\Debug\Renci.SshNet.Tests.NET35.dll /TestCaseFilter:"TestCategory!=integration&TestCategory!=LongRunning" \ No newline at end of file + vstest.console /logger:Appveyor src\Renci.SshNet.Tests\bin\Debug\net35\Renci.SshNet.Tests.dll /TestCaseFilter:"TestCategory!=integration&TestCategory!=LongRunning" \ No newline at end of file diff --git a/runtest.cmd b/runtest.cmd new file mode 100644 index 00000000..ad4c0f5a --- /dev/null +++ b/runtest.cmd @@ -0,0 +1,3 @@ +rem vstest.console src\Renci.SshNet.Tests\bin\Debug\net40\Renci.SshNet.Tests.dll "/TestCaseFilter:TestCategory=Gert + +vstest.console src\Renci.SshNet.Tests\bin\Debug\net40\Renci.SshNet.Tests.dll /TestCaseFilter:"TestCategory!=integration&TestCategory!=LongRunning" \ No newline at end of file diff --git a/src/Renci.SshNet.NET35/Common/Extensions.NET35.cs b/src/Renci.SshNet.NET35/Common/Extensions.NET35.cs deleted file mode 100644 index ed198c00..00000000 --- a/src/Renci.SshNet.NET35/Common/Extensions.NET35.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Diagnostics; -using System.Security.Cryptography; -using System.Text; - -namespace Renci.SshNet.Common -{ - /// - /// Collection of different extension method specific for .NET 3.5 - /// - internal static partial class Extensions - { - /// - /// Disposes the specified algorithm. - /// - /// The algorithm. - [DebuggerNonUserCode] - internal static void Dispose(this HashAlgorithm algorithm) - { - if (algorithm == null) - throw new NullReferenceException(); - - algorithm.Clear(); - } - - /// - /// Clears the contents of the string builder. - /// - /// - /// The to clear. - /// - public static void Clear(this StringBuilder value) - { - value.Length = 0; - value.Capacity = 16; - } - } -} diff --git a/src/Renci.SshNet.NET35/Properties/AssemblyInfo.cs b/src/Renci.SshNet.NET35/Properties/AssemblyInfo.cs deleted file mode 100644 index 9b3fcd24..00000000 --- a/src/Renci.SshNet.NET35/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("SSH.NET .NET 3.5")] -[assembly: Guid("a9698831-4993-469b-81f1-aed4e5379252")] -[assembly: InternalsVisibleTo("Renci.SshNet.Tests.NET35, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f9194e1eb66b7e2575aaee115ee1d27bc100920e7150e43992d6f668f9737de8b9c7ae892b62b8a36dd1d57929ff1541665d101dc476d6e02390846efae7e5186eec409710fdb596e3f83740afef0d4443055937649bc5a773175b61c57615dac0f0fd10f52b52fedf76c17474cc567b3f7a79de95dde842509fb39aaf69c6c2")] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj b/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj deleted file mode 100644 index ffd2bce5..00000000 --- a/src/Renci.SshNet.NET35/Renci.SshNet.NET35.csproj +++ /dev/null @@ -1,1416 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A} - Library - Properties - Renci.SshNet - Renci.SshNet - v3.5 - 512 - - - true - full - false - bin\Debug\ - TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA - prompt - 4 - true - bin\Debug\Renci.SshNet.xml - 5 - - - none - true - bin\Release\ - TRACE;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA - prompt - 4 - bin\Release\Renci.SshNet.xml - - - true - 5 - - - true - - - ..\Renci.SshNet.snk - - - - - - - - - Abstractions\CryptoAbstraction.cs - - - Abstractions\DiagnosticAbstraction.cs - - - Abstractions\DnsAbstraction.cs - - - Abstractions\FileSystemAbstraction.cs - - - Abstractions\ReflectionAbstraction.cs - - - Abstractions\SocketAbstraction.cs - - - Abstractions\ThreadAbstraction.cs - - - AuthenticationMethod.cs - - - AuthenticationResult.cs - - - BaseClient.cs - - - Channels\Channel.cs - - - Channels\ChannelDirectTcpip.cs - - - Channels\ChannelForwardedTcpip.cs - - - Channels\ChannelSession.cs - - - Channels\ChannelTypes.cs - - - Channels\ClientChannel.cs - - - Channels\IChannel.cs - - - Channels\IChannelDirectTcpip.cs - - - Channels\IChannelForwardedTcpip.cs - - - Channels\IChannelSession.cs - - - Channels\ServerChannel.cs - - - CipherInfo.cs - - - ClientAuthentication.cs - - - CommandAsyncResult.cs - - - Common\Array.cs - - - Common\ASCIIEncoding.cs - - - Common\AsyncResult.cs - - - Common\AuthenticationBannerEventArgs.cs - - - Common\AuthenticationEventArgs.cs - - - Common\AuthenticationPasswordChangeEventArgs.cs - - - Common\AuthenticationPrompt.cs - - - Common\AuthenticationPromptEventArgs.cs - - - Common\BigInteger.cs - - - Common\ChannelDataEventArgs.cs - - - Common\ChannelEventArgs.cs - - - Common\ChannelExtendedDataEventArgs.cs - - - Common\ChannelOpenConfirmedEventArgs.cs - - - Common\ChannelOpenFailedEventArgs.cs - - - Common\ChannelRequestEventArgs.cs - - - Common\CountdownEvent.cs - - - Common\DerData.cs - - - Common\ExceptionEventArgs.cs - - - Common\Extensions.cs - - - Common\HostKeyEventArgs.cs - - - Common\NetConfServerException.cs - - - Common\ObjectIdentifier.cs - - - Common\Pack.cs - - - Common\PipeStream.cs - - - Common\PortForwardEventArgs.cs - - - Common\PosixPath.cs - - - Common\ProxyException.cs - - - Common\ScpDownloadEventArgs.cs - - - Common\ScpException.cs - - - Common\ScpUploadEventArgs.cs - - - Common\SemaphoreLight.cs - - - Common\SftpPathNotFoundException.cs - - - Common\SftpPermissionDeniedException.cs - - - Common\ShellDataEventArgs.cs - - - Common\SshAuthenticationException.cs - - - Common\SshConnectionException.cs - - - Common\SshData.cs - - - Common\SshDataStream.cs - - - Common\SshException.cs - - - Common\SshOperationTimeoutException.cs - - - Common\SshPassPhraseNullOrEmptyException.cs - - - Common\TerminalModes.cs - - - Compression\CompressionMode.cs - - - Compression\Compressor.cs - - - Compression\Zlib.cs - - - Compression\ZlibOpenSsh.cs - - - Compression\ZlibStream.cs - - - ConnectionInfo.cs - - - ExpectAction.cs - - - ExpectAsyncResult.cs - - - ForwardedPort.cs - - - ForwardedPortDynamic.cs - - - ForwardedPortDynamic.NET.cs - - - ForwardedPortLocal.cs - - - ForwardedPortLocal.NET.cs - - - ForwardedPortRemote.cs - - - ForwardedPortStatus.cs - - - HashInfo.cs - - - IAuthenticationMethod.cs - - - IClientAuthentication.cs - - - IConnectionInfo.cs - - - IForwardedPort.cs - - - IRemotePathTransformation.cs - - - IServiceFactory.cs - - - IServiceFactory.NET.cs - - - ISession.cs - - - ISubsystemSession.cs - - - KeyboardInteractiveAuthenticationMethod.cs - - - KeyboardInteractiveConnectionInfo.cs - - - MessageEventArgs.cs - - - Messages\Authentication\BannerMessage.cs - - - Messages\Authentication\FailureMessage.cs - - - Messages\Authentication\InformationRequestMessage.cs - - - Messages\Authentication\InformationResponseMessage.cs - - - Messages\Authentication\PasswordChangeRequiredMessage.cs - - - Messages\Authentication\PublicKeyMessage.cs - - - Messages\Authentication\RequestMessage.cs - - - Messages\Authentication\RequestMessageHost.cs - - - Messages\Authentication\RequestMessageKeyboardInteractive.cs - - - Messages\Authentication\RequestMessageNone.cs - - - Messages\Authentication\RequestMessagePassword.cs - - - Messages\Authentication\RequestMessagePublicKey.cs - - - Messages\Authentication\SuccessMessage.cs - - - Messages\Connection\CancelTcpIpForwardGlobalRequestMessage.cs - - - Messages\Connection\ChannelCloseMessage.cs - - - Messages\Connection\ChannelDataMessage.cs - - - Messages\Connection\ChannelEofMessage.cs - - - Messages\Connection\ChannelExtendedDataMessage.cs - - - Messages\Connection\ChannelFailureMessage.cs - - - Messages\Connection\ChannelMessage.cs - - - Messages\Connection\ChannelOpenConfirmationMessage.cs - - - Messages\Connection\ChannelOpenFailureMessage.cs - - - Messages\Connection\ChannelOpenFailureReasons.cs - - - Messages\Connection\ChannelOpen\ChannelOpenInfo.cs - - - Messages\Connection\ChannelOpen\ChannelOpenMessage.cs - - - Messages\Connection\ChannelOpen\DirectTcpipChannelInfo.cs - - - Messages\Connection\ChannelOpen\ForwardedTcpipChannelInfo.cs - - - Messages\Connection\ChannelOpen\SessionChannelOpenInfo.cs - - - Messages\Connection\ChannelOpen\X11ChannelOpenInfo.cs - - - Messages\Connection\ChannelRequest\BreakRequestInfo.cs - - - Messages\Connection\ChannelRequest\ChannelRequestMessage.cs - - - Messages\Connection\ChannelRequest\EndOfWriteRequestInfo.cs - - - Messages\Connection\ChannelRequest\EnvironmentVariableRequestInfo.cs - - - Messages\Connection\ChannelRequest\ExecRequestInfo.cs - - - Messages\Connection\ChannelRequest\ExitSignalRequestInfo.cs - - - Messages\Connection\ChannelRequest\ExitStatusRequestInfo.cs - - - Messages\Connection\ChannelRequest\KeepAliveRequestInfo.cs - - - Messages\Connection\ChannelRequest\PseudoTerminalInfo.cs - - - Messages\Connection\ChannelRequest\RequestInfo.cs - - - Messages\Connection\ChannelRequest\ShellRequestInfo.cs - - - Messages\Connection\ChannelRequest\SignalRequestInfo.cs - - - Messages\Connection\ChannelRequest\SubsystemRequestInfo.cs - - - Messages\Connection\ChannelRequest\WindowChangeRequestInfo.cs - - - Messages\Connection\ChannelRequest\X11ForwardingRequestInfo.cs - - - Messages\Connection\ChannelRequest\XonXoffRequestInfo.cs - - - Messages\Connection\ChannelSuccessMessage.cs - - - Messages\Connection\ChannelWindowAdjustMessage.cs - - - Messages\Connection\GlobalRequestMessage.cs - - - Messages\Connection\GlobalRequestName.cs - - - Messages\Connection\RequestFailureMessage.cs - - - Messages\Connection\RequestSuccessMessage.cs - - - Messages\Connection\TcpIpForwardGlobalRequestMessage.cs - - - Messages\Message.cs - - - Messages\MessageAttribute.cs - - - Messages\ServiceName.cs - - - Messages\Transport\DebugMessage.cs - - - Messages\Transport\DisconnectMessage.cs - - - Messages\Transport\DisconnectReason.cs - - - Messages\Transport\IgnoreMessage.cs - - - Messages\Transport\IKeyExchangedAllowed.cs - - - Messages\Transport\KeyExchangeDhGroupExchangeGroup.cs - - - Messages\Transport\KeyExchangeDhGroupExchangeInit.cs - - - Messages\Transport\KeyExchangeDhGroupExchangeReply.cs - - - Messages\Transport\KeyExchangeDhGroupExchangeRequest.cs - - - Messages\Transport\KeyExchangeDhInitMessage.cs - - - Messages\Transport\KeyExchangeDhReplyMessage.cs - - - Messages\Transport\KeyExchangeEcdhInitMessage.cs - - - Messages\Transport\KeyExchangeEcdhReplyMessage.cs - - - Messages\Transport\KeyExchangeInitMessage.cs - - - Messages\Transport\NewKeysMessage.cs - - - Messages\Transport\ServiceAcceptMessage.cs - - - Messages\Transport\ServiceRequestMessage.cs - - - Messages\Transport\UnimplementedMessage.cs - - - NetConfClient.cs - - - Netconf\INetConfSession.cs - - - Netconf\NetConfSession.cs - - - NoneAuthenticationMethod.cs - - - PasswordAuthenticationMethod.cs - - - PasswordConnectionInfo.cs - - - PrivateKeyAuthenticationMethod.cs - - - PrivateKeyConnectionInfo.cs - - - PrivateKeyFile.cs - - - ProxyTypes.cs - - - RemotePathDoubleQuoteTransformation.cs - - - RemotePathNoneTransformation.cs - - - RemotePathShellQuoteTransformation.cs - - - RemotePathTransformation.cs - - - ScpClient.cs - - - ScpClient.NET.cs - - - Security\Algorithm.cs - - - Security\Cryptography\BouncyCastle\asn1\sec\SECNamedCurves.cs - - - Security\Cryptography\BouncyCastle\asn1\x9\X9Curve.cs - - - Security\Cryptography\BouncyCastle\asn1\x9\X9ECParameters.cs - - - Security\Cryptography\BouncyCastle\asn1\x9\X9ECParametersHolder.cs - - - Security\Cryptography\BouncyCastle\asn1\x9\X9ECPoint.cs - - - Security\Cryptography\BouncyCastle\crypto\agreement\ECDHCBasicAgreement.cs - - - Security\Cryptography\BouncyCastle\crypto\AsymmetricCipherKeyPair.cs - - - Security\Cryptography\BouncyCastle\crypto\AsymmetricKeyParameter.cs - - - Security\Cryptography\BouncyCastle\crypto\digests\GeneralDigest.cs - - - Security\Cryptography\BouncyCastle\crypto\digests\Sha256Digest.cs - - - Security\Cryptography\BouncyCastle\crypto\generators\ECKeyPairGenerator.cs - - - Security\Cryptography\BouncyCastle\crypto\IAsymmetricCipherKeyPairGenerator.cs - - - Security\Cryptography\BouncyCastle\crypto\IDigest.cs - - - Security\Cryptography\BouncyCastle\crypto\KeyGenerationParameters.cs - - - Security\Cryptography\BouncyCastle\crypto\parameters\ECDomainParameters.cs - - - Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyGenerationParameters.cs - - - Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyParameters.cs - - - Security\Cryptography\BouncyCastle\crypto\parameters\ECPrivateKeyParameters.cs - - - Security\Cryptography\BouncyCastle\crypto\parameters\ECPublicKeyParameters.cs - - - Security\Cryptography\BouncyCastle\crypto\prng\CryptoApiRandomGenerator.cs - - - Security\Cryptography\BouncyCastle\crypto\prng\DigestRandomGenerator.cs - - - Security\Cryptography\BouncyCastle\crypto\prng\IRandomGenerator.cs - - - Security\Cryptography\BouncyCastle\crypto\util\Pack.cs - - - Security\Cryptography\BouncyCastle\math\BigInteger.cs - - - Security\Cryptography\BouncyCastle\math\ec\abc\SimpleBigDecimal.cs - - - Security\Cryptography\BouncyCastle\math\ec\abc\Tnaf.cs - - - Security\Cryptography\BouncyCastle\math\ec\abc\ZTauElement.cs - - - Security\Cryptography\BouncyCastle\math\ec\ECAlgorithms.cs - - - Security\Cryptography\BouncyCastle\math\ec\ECCurve.cs - - - Security\Cryptography\BouncyCastle\math\ec\ECFieldElement.cs - - - Security\Cryptography\BouncyCastle\math\ec\ECLookupTable.cs - - - Security\Cryptography\BouncyCastle\math\ec\ECPoint.cs - - - Security\Cryptography\BouncyCastle\math\ec\ECPointMap.cs - - - Security\Cryptography\BouncyCastle\math\ec\endo\ECEndomorphism.cs - - - Security\Cryptography\BouncyCastle\math\ec\endo\GlvEndomorphism.cs - - - Security\Cryptography\BouncyCastle\math\ec\LongArray.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\AbstractECMultiplier.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\ECMultiplier.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointCombMultiplier.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointPreCompInfo.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointUtilities.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\GlvMultiplier.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\IPreCompCallback.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\PreCompInfo.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\ValidityPreCompInfo.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafL2RMultiplier.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafPreCompInfo.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafUtilities.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafMultiplier.cs - - - Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafPreCompInfo.cs - - - Security\Cryptography\BouncyCastle\math\field\FiniteFields.cs - - - Security\Cryptography\BouncyCastle\math\field\GenericPolynomialExtensionField.cs - - - Security\Cryptography\BouncyCastle\math\field\GF2Polynomial.cs - - - Security\Cryptography\BouncyCastle\math\field\IExtensionField.cs - - - Security\Cryptography\BouncyCastle\math\field\IFiniteField.cs - - - Security\Cryptography\BouncyCastle\math\field\IPolynomial.cs - - - Security\Cryptography\BouncyCastle\math\field\IPolynomialExtensionField.cs - - - Security\Cryptography\BouncyCastle\math\field\PrimeField.cs - - - Security\Cryptography\BouncyCastle\math\raw\Mod.cs - - - Security\Cryptography\BouncyCastle\math\raw\Nat.cs - - - Security\Cryptography\BouncyCastle\security\DigestUtilities.cs - - - Security\Cryptography\BouncyCastle\security\SecureRandom.cs - - - Security\Cryptography\BouncyCastle\security\SecurityUtilityException.cs - - - Security\Cryptography\BouncyCastle\util\Arrays.cs - - - Security\Cryptography\BouncyCastle\util\BigIntegers.cs - - - Security\Cryptography\BouncyCastle\util\encoders\Hex.cs - - - Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs - - - Security\Cryptography\BouncyCastle\util\Enums.cs - - - Security\Cryptography\BouncyCastle\util\IMemoable.cs - - - Security\Cryptography\BouncyCastle\util\Integers.cs - - - Security\Cryptography\BouncyCastle\util\MemoableResetException.cs - - - Security\Cryptography\BouncyCastle\util\Times.cs - - - Security\CertificateHostAlgorithm.cs - - - Security\Cryptography\Chaos.NaCl\CryptoBytes.cs - - - Security\Cryptography\Chaos.NaCl\Ed25519.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Array16.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Array8.cs - - - Security\Cryptography\Chaos.NaCl\Internal\ByteIntegerConverter.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base2.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d2.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_0.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_1.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_add.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cmov.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cswap.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_frombytes.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_invert.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnegative.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnonzero.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul121666.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_neg.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_pow22523.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq2.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sub.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_tobytes.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\FieldElement.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_add.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_double_scalarmult.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_frombytes.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_madd.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_msub.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p2.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p3.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_0.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_dbl.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_0.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_dbl.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_tobytes.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_cached.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_p2.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_precomp_0.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_scalarmult_base.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_sub.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_tobytes.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\GroupElement.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\keypair.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\open.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_clamp.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_mul_add.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_reduce.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sign.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sqrtm1.cs - - - Security\Cryptography\Chaos.NaCl\Internal\InternalAssert.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Poly1305Donna.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Salsa\Salsa20.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Salsa\SalsaCore.cs - - - Security\Cryptography\Chaos.NaCl\Internal\Sha512Internal.cs - - - Security\Cryptography\Chaos.NaCl\MontgomeryCurve25519.cs - - - Security\Cryptography\Chaos.NaCl\Sha512.cs - - - Security\Cryptography\AsymmetricCipher.cs - - - Security\Cryptography\Bcrypt.cs - - - Security\Cryptography\BlockCipher.cs - - - Security\Cryptography\Cipher.cs - - - Security\Cryptography\CipherDigitalSignature.cs - - - Security\Cryptography\Ciphers\AesCipher.cs - - - Security\Cryptography\Ciphers\Arc4Cipher.cs - - - Security\Cryptography\Ciphers\BlowfishCipher.cs - - - Security\Cryptography\Ciphers\CastCipher.cs - - - Security\Cryptography\Ciphers\CipherMode.cs - - - Security\Cryptography\Ciphers\CipherPadding.cs - - - Security\Cryptography\Ciphers\DesCipher.cs - - - Security\Cryptography\Ciphers\Modes\CbcCipherMode.cs - - - Security\Cryptography\Ciphers\Modes\CfbCipherMode.cs - - - Security\Cryptography\Ciphers\Modes\CtrCipherMode.cs - - - Security\Cryptography\Ciphers\Modes\OfbCipherMode.cs - - - Security\Cryptography\Ciphers\Paddings\PKCS5Padding.cs - - - Security\Cryptography\Ciphers\Paddings\PKCS7Padding.cs - - - Security\Cryptography\Ciphers\RsaCipher.cs - - - Security\Cryptography\Ciphers\SerpentCipher.cs - - - Security\Cryptography\Ciphers\TripleDesCipher.cs - - - Security\Cryptography\Ciphers\TwofishCipher.cs - - - Security\Cryptography\DigitalSignature.cs - - - Security\Cryptography\DsaDigitalSignature.cs - - - Security\Cryptography\DsaKey.cs - - - Security\Cryptography\ED25519DigitalSignature.cs - - - Security\Cryptography\ED25519Key.cs - - - Security\Cryptography\HMACMD5.cs - - - Security\Cryptography\HMACSHA1.cs - - - Security\Cryptography\HMACSHA256.cs - - - Security\Cryptography\HMACSHA384.cs - - - Security\Cryptography\HMACSHA512.cs - - - Security\Cryptography\Key.cs - - - Security\Cryptography\EcdsaDigitalSignature.cs - - - Security\Cryptography\EcdsaKey.cs - - - Security\Cryptography\RsaDigitalSignature.cs - - - Security\Cryptography\RsaKey.cs - - - Security\Cryptography\StreamCipher.cs - - - Security\Cryptography\SymmetricCipher.cs - - - Security\GroupExchangeHashData.cs - - - Security\HostAlgorithm.cs - - - Security\IKeyExchange.cs - - - Security\KeyExchange.cs - - - Security\KeyExchangeDiffieHellman.cs - - - Security\KeyExchangeDiffieHellmanGroup14Sha1.cs - - - Security\KeyExchangeDiffieHellmanGroup1Sha1.cs - - - Security\KeyExchangeDiffieHellmanGroupExchangeSha1.cs - - - Security\KeyExchangeDiffieHellmanGroupExchangeSha256.cs - - - Security\KeyExchangeDiffieHellmanGroupExchangeShaBase.cs - - - Security\KeyExchangeDiffieHellmanGroupSha1.cs - - - Security\KeyExchangeEC.cs - - - Security\KeyExchangeECCurve25519.cs - - - Security\KeyExchangeECDH.cs - - - Security\KeyExchangeECDH256.cs - - - Security\KeyExchangeECDH384.cs - - - Security\KeyExchangeECDH521.cs - - - Security\KeyHostAlgorithm.cs - - - ServiceFactory.cs - - - ServiceFactory.NET.cs - - - Session.cs - - - SftpClient.cs - - - Sftp\Flags.cs - - - Sftp\ISftpFileReader.cs - - - Sftp\ISftpResponseFactory.cs - - - Sftp\ISftpSession.cs - - - Sftp\Requests\ExtendedRequests\FStatVfsRequest.cs - - - Sftp\Requests\ExtendedRequests\HardLinkRequest.cs - - - Sftp\Requests\ExtendedRequests\PosixRenameRequest.cs - - - Sftp\Requests\ExtendedRequests\StatVfsRequest.cs - - - Sftp\Requests\SftpBlockRequest.cs - - - Sftp\Requests\SftpCloseRequest.cs - - - Sftp\Requests\SftpExtendedRequest.cs - - - Sftp\Requests\SftpFSetStatRequest.cs - - - Sftp\Requests\SftpFStatRequest.cs - - - Sftp\Requests\SftpInitRequest.cs - - - Sftp\Requests\SftpLinkRequest.cs - - - Sftp\Requests\SftpLStatRequest.cs - - - Sftp\Requests\SftpMkDirRequest.cs - - - Sftp\Requests\SftpOpenDirRequest.cs - - - Sftp\Requests\SftpOpenRequest.cs - - - Sftp\Requests\SftpReadDirRequest.cs - - - Sftp\Requests\SftpReadLinkRequest.cs - - - Sftp\Requests\SftpReadRequest.cs - - - Sftp\Requests\SftpRealPathRequest.cs - - - Sftp\Requests\SftpRemoveRequest.cs - - - Sftp\Requests\SftpRenameRequest.cs - - - Sftp\Requests\SftpRequest.cs - - - Sftp\Requests\SftpRmDirRequest.cs - - - Sftp\Requests\SftpSetStatRequest.cs - - - Sftp\Requests\SftpStatRequest.cs - - - Sftp\Requests\SftpSymLinkRequest.cs - - - Sftp\Requests\SftpUnblockRequest.cs - - - Sftp\Requests\SftpWriteRequest.cs - - - Sftp\Responses\ExtendedReplies\ExtendedReplyInfo.cs - - - Sftp\Responses\ExtendedReplies\StatVfsReplyInfo.cs - - - Sftp\Responses\SftpAttrsResponse.cs - - - Sftp\Responses\SftpDataResponse.cs - - - Sftp\Responses\SftpExtendedReplyResponse.cs - - - Sftp\Responses\SftpHandleResponse.cs - - - Sftp\Responses\SftpNameResponse.cs - - - Sftp\Responses\SftpResponse.cs - - - Sftp\Responses\SftpStatusResponse.cs - - - Sftp\Responses\SftpVersionResponse.cs - - - Sftp\SftpCloseAsyncResult.cs - - - Sftp\SftpDownloadAsyncResult.cs - - - Sftp\SftpFile.cs - - - Sftp\SftpFileAttributes.cs - - - Sftp\SftpFileReader.cs - - - Sftp\SftpFileStream.cs - - - Sftp\SftpFileSystemInformation.cs - - - Sftp\SftpListDirectoryAsyncResult.cs - - - Sftp\SftpMessage.cs - - - Sftp\SftpMessageTypes.cs - - - Sftp\SftpOpenAsyncResult.cs - - - Sftp\SftpReadAsyncResult.cs - - - Sftp\SftpRealPathAsyncResult.cs - - - Sftp\SftpResponseFactory.cs - - - Sftp\SftpSession.cs - - - Sftp\SFtpStatAsyncResult.cs - - - Sftp\SftpSynchronizeDirectoriesAsyncResult.cs - - - Sftp\SftpUploadAsyncResult.cs - - - Sftp\StatusCodes.cs - - - Shell.cs - - - ShellStream.cs - - - SshClient.cs - - - SshCommand.cs - - - SshMessageFactory.cs - - - SubsystemSession.cs - - - - - Properties\CommonAssemblyInfo.cs - - - - - - Renci.SshNet.snk - - - - - - - - - - diff --git a/src/Renci.SshNet.NETCore/Properties/AssemblyInfo.cs b/src/Renci.SshNet.NETCore/Properties/AssemblyInfo.cs deleted file mode 100644 index d5769ab9..00000000 --- a/src/Renci.SshNet.NETCore/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Reflection; - -[assembly: AssemblyTitle("SSH.NET")] diff --git a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj b/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj deleted file mode 100644 index b288064e..00000000 --- a/src/Renci.SshNet.NETCore/Renci.SshNet.NETCore.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - netstandard1.3;netstandard2.0 - true - true - false - Renci.SshNet - ../Renci.SshNet.snk - 5 - true - - - - %(RecursiveDir)%(Filename)%(Extension) - - - - - - - - - - - - - - - - - - - FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_TAP;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 - - - FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_ECDSA - - diff --git a/src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortLocal.NET35.cs b/src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortLocal.NET35.cs deleted file mode 100644 index 2eec0336..00000000 --- a/src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortLocal.NET35.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Tests.Common; - -namespace Renci.SshNet.Tests.SshClientTests -{ - public partial class ForwardedPortLocalTest : TestBase - { - } -} diff --git a/src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortRemote.NET35.cs b/src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortRemote.NET35.cs deleted file mode 100644 index 5b057ba1..00000000 --- a/src/Renci.SshNet.Tests.NET35/Classes/ForwardedPortRemote.NET35.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Tests.Common; - -namespace Renci.SshNet.Tests.SshClientTests -{ - public partial class ForwardedPortRemoteTest : TestBase - { - } -} diff --git a/src/Renci.SshNet.Tests.NET35/Classes/SshCommandTest.NET35.cs b/src/Renci.SshNet.Tests.NET35/Classes/SshCommandTest.NET35.cs deleted file mode 100644 index 8f95bf3f..00000000 --- a/src/Renci.SshNet.Tests.NET35/Classes/SshCommandTest.NET35.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Tests.Common; - -namespace Renci.SshNet.Tests.SshClientTests -{ - public partial class SshCommandTest : TestBase - { - } -} diff --git a/src/Renci.SshNet.Tests.NET35/Properties/AssemblyInfo.cs b/src/Renci.SshNet.Tests.NET35/Properties/AssemblyInfo.cs deleted file mode 100644 index 01506232..00000000 --- a/src/Renci.SshNet.Tests.NET35/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,5 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("SSH.NET Tests .NET 3.5")] -[assembly: Guid("7c827904-40c1-4fe3-8ed1-8a729b8417a9")] \ No newline at end of file diff --git a/src/Renci.SshNet.Tests.NET35/Properties/Resources.Designer.cs b/src/Renci.SshNet.Tests.NET35/Properties/Resources.Designer.cs deleted file mode 100644 index 54bef950..00000000 --- a/src/Renci.SshNet.Tests.NET35/Properties/Resources.Designer.cs +++ /dev/null @@ -1,206 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18010 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Renci.SshNet.Tests.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Renci.SshNet.Tests.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to -----BEGIN DSA PRIVATE KEY----- - ///Proc-Type: 4,ENCRYPTED - ///DEK-Info: DES-EDE3-CBC,053105DCFC6132E7 - /// - ///nVjIhJr3Eeqk0aBfyYK38B6cF0g35U2acgq5t3zG8fCM5JLSnFcmkkYvohbmCLva - ///swNHMfmwumoX8Ga94cxGu6vW1qf+IMvgEU4U53DtJqRoeICMwIre1yUq2cCrV+gI - ///qQ6MAVMDgfMs7HrPs5999m+KoDh7oYsA1l5q+axU/rqM4g3lySr/1oT6oAQx5Qp2 - ///2DYkZEwnX5+NTw6aoMXl2qgIHBVxa7wZRMp9L0yAlEFk8T7fMuPrLSAEUBghcIaP - ///iBY1OY+M9MgDTTU56ZjLl+DfT3XfKzsZ3fmn1+bLqTRreiuS4/WF6xIa/DQu1sQd - ///nnjYgnKYcTWSvWWK9AcIVSpoiW2y6FcPkMAIw54ABrzBp4Rz0//Ykwv2Ga7AZxxm - ///P+lkxKf2RWnh406F [rest of string was truncated]";. - /// - internal static string DSA_KEY_WITH_PASS { - get { - return ResourceManager.GetString("DSA_KEY_WITH_PASS", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to -----BEGIN DSA PRIVATE KEY----- - ///MIIBvAIBAAKBgQDdQrrwGvknwD+pb9Gpv/vDxj8yqFUg0cUuC/tkjm3u+lQj86Rw - ///fA8RJOV+OP4Gtvs9zOSsxiuginoB/uEiT+6jbHvyvJeJp2fsDWLx/tVRXxpi8Nwe - ///bfb455R0wVVZdqnFKsAZLrQAT589EUtLgyVAFQbUP5Fz6px8H8AG0qlybQIVALn7 - ///UOxnbFR7fDfZkq2Pc7ZCVegpAoGBANRKf9vezuz1aGUnUGWILHO09SibHK255fkr - ///u4//zvCbdawWSZOoU+vMnplLUhNaVMoSyYE/TYOZvvbG9UtPvr8wZGdNPipvIXIB - ///xlpr+FH0mnSx0qlaRy3PEoDRAmw6msRCzVYV3vZ8ZTEUdt+phuru+pn0W9EugzCM - ///HikVVhJMAoGASHB5nNlWhpqvungn+otYyGKoVoATkRdRfSiUo3fb0mJLTmxrEhEH - ///4UOFA/UFdQ0TYXXW0 [rest of string was truncated]";. - /// - internal static string DSA_KEY_WITHOUT_PASS { - get { - return ResourceManager.GetString("DSA_KEY_WITHOUT_PASS", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to oleg-centos.edc.renci.org. - /// - internal static string HOST { - get { - return ResourceManager.GetString("HOST", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to -----BEGIN DSA PRIVATE KEY----- - ///MIIBugIBAAKBgQCG3ij/JvdNp+1VUsK2zmLM5QWNN4MRRm/FCOHDknDJrWdSKheO - ///h6BbCgyFOw+k5qYtwXQnt3DpQfxPi7PIjr3tQJ9gB8LzqH2DwT2hMXm9VV2ImX2P - ///12aj8hZVM99WOp/ma6+ivLSFHnwET19eaqS9SRb0ftIqZXpWGE3ddW07qQIVAOfT - ///1OPSsvAnOsSrYc5HG5K3xIWlAoGAAzhTmi29+v0YTIsW2W1FihsexeAnpPPjYgRO - ///eT6HreyTvh20UASxDP+IJ2Ba+41G6MU0isuAijp8Z4CCC4RpoS46Ksc3JtPsZiRy - ///wAjwlb7JKGRBoY8V3aT47Xyx+iTSclZfzTmv0Z0bb56NZ6KEU8WRnks2d7tsb0fq - ///JTAgLkkCgYBvt5EoxhlCwEUgm8j3nD4TLSRYt1lt6LVulBYA9qlV4F68b2cJUuOi - ///YTV9H2SWRF6UF+GiR [rest of string was truncated]";. - /// - internal static string INVALID_KEY { - get { - return ResourceManager.GetString("INVALID_KEY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to tester. - /// - internal static string PASSWORD { - get { - return ResourceManager.GetString("PASSWORD", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 22. - /// - internal static string PORT { - get { - return ResourceManager.GetString("PORT", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to proxy.oleg-centos.edc.renci.org. - /// - internal static string PROXY_HOST { - get { - return ResourceManager.GetString("PROXY_HOST", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 8123. - /// - internal static string PROXY_PORT { - get { - return ResourceManager.GetString("PROXY_PORT", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to -----BEGIN RSA PRIVATE KEY----- - ///Proc-Type: 4,ENCRYPTED - ///DEK-Info: DES-EDE3-CBC,B3475536EDD1B442 - /// - ///Xa6Y7FYTfz19CMzPcVbCpBHEh8x3tnA9PutKEDNMwKbR+NVUvBx5fN1QjrLpltCr - ///uX7yD3vLCeyihg4oaK3nTBZBcsB/1TZx+MlLgpvMfV1JKmbKCmebBZ3lUpsypHlG - ///FpCY41miFwdHmBe6tuwL9XA3vz26eJwSgJGMkVN9EBvNbiOHinEPhSW0whzBfbv+ - ///OfseG73gvHc4jZS6Sw8h5VDBAmlldJEfkP/s/1/iTbCXFQ22xRb4Z6NilEyKiWpB - ///nQviXmaucTWCEuNF5QDA7oV7Ugwm5cAXuBqFIs9ZGaKV4/XpfX1tClOLfB3Lguh+ - ///bbkwjPb0ztlhKa4gkwXiMs0S/lhoueXBae4QStM0qJBXHtFhhRYIn4JeIZ8CJ0k6 - ///SMP7QVfPf5aJIaa8 [rest of string was truncated]";. - /// - internal static string RSA_KEY_WITH_PASS { - get { - return ResourceManager.GetString("RSA_KEY_WITH_PASS", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to -----BEGIN RSA PRIVATE KEY----- - ///MIIEogIBAAKCAQEA8ZsD8jgH7ySXnd4dprEFFkJ+zs1ne81E8febjR8hekiKrc+D - ///9GjeEykchy0PsrsBrf2F8J3GtLNISVerkl+EnVh1E0pi9Vllc1vcpQHvBeNPG/jl - ///9Dnum/DcaaMKLot+ARXjBuMX/xJVfnlgkvfpBvoq4QzQ6E27rOMbcPlvrN7KeYba - ///orsTpDMUraHX5u99P1evvw7sOuNl3lc9YpIgmjHT6dWUGTqBx9T2SEKXBRVk2NNb - ///d2UctQkr5BJn1gGehA+1KYS30FMiCSN8F8ZOlpYj1+K6xzs0srq1z30LailIyy7Q - ///mYp739BJlOF3cVywdcFXGre35H2cJylcNV2e+QIBIwKCAQAbnK/+bM207j02nQqz - ///9vlEX17zECkVdouJXiBn5kz4CEpdAcXwC/wfcmmpDHbSmQeBmVEi0DP3ZPJRhlzA - ///RW493jlECIBWjd+1a [rest of string was truncated]";. - /// - internal static string RSA_KEY_WITHOUT_PASS { - get { - return ResourceManager.GetString("RSA_KEY_WITHOUT_PASS", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to tester. - /// - internal static string USERNAME { - get { - return ResourceManager.GetString("USERNAME", resourceCulture); - } - } - } -} diff --git a/src/Renci.SshNet.Tests.NET35/Properties/Resources.resx b/src/Renci.SshNet.Tests.NET35/Properties/Resources.resx deleted file mode 100644 index b1605aba..00000000 --- a/src/Renci.SshNet.Tests.NET35/Properties/Resources.resx +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - -----BEGIN DSA PRIVATE KEY----- -MIIBvAIBAAKBgQDdQrrwGvknwD+pb9Gpv/vDxj8yqFUg0cUuC/tkjm3u+lQj86Rw -fA8RJOV+OP4Gtvs9zOSsxiuginoB/uEiT+6jbHvyvJeJp2fsDWLx/tVRXxpi8Nwe -bfb455R0wVVZdqnFKsAZLrQAT589EUtLgyVAFQbUP5Fz6px8H8AG0qlybQIVALn7 -UOxnbFR7fDfZkq2Pc7ZCVegpAoGBANRKf9vezuz1aGUnUGWILHO09SibHK255fkr -u4//zvCbdawWSZOoU+vMnplLUhNaVMoSyYE/TYOZvvbG9UtPvr8wZGdNPipvIXIB -xlpr+FH0mnSx0qlaRy3PEoDRAmw6msRCzVYV3vZ8ZTEUdt+phuru+pn0W9EugzCM -HikVVhJMAoGASHB5nNlWhpqvungn+otYyGKoVoATkRdRfSiUo3fb0mJLTmxrEhEH -4UOFA/UFdQ0TYXXW0wRX/amynT4iTEXAx0FjxUNK5ryxloeoXiXEH4FK7D8RtJO1 -1UsaRrN+nqWiSTVAehl6tzoMCPargGcWeFlAZZnPGN76OD9J1GiKZj8CFQCl8SkF -GWfS+mH8xhLsxh1nI7rfJw== ------END DSA PRIVATE KEY----- - - - -----BEGIN DSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,053105DCFC6132E7 - -nVjIhJr3Eeqk0aBfyYK38B6cF0g35U2acgq5t3zG8fCM5JLSnFcmkkYvohbmCLva -swNHMfmwumoX8Ga94cxGu6vW1qf+IMvgEU4U53DtJqRoeICMwIre1yUq2cCrV+gI -qQ6MAVMDgfMs7HrPs5999m+KoDh7oYsA1l5q+axU/rqM4g3lySr/1oT6oAQx5Qp2 -2DYkZEwnX5+NTw6aoMXl2qgIHBVxa7wZRMp9L0yAlEFk8T7fMuPrLSAEUBghcIaP -iBY1OY+M9MgDTTU56ZjLl+DfT3XfKzsZ3fmn1+bLqTRreiuS4/WF6xIa/DQu1sQd -nnjYgnKYcTWSvWWK9AcIVSpoiW2y6FcPkMAIw54ABrzBp4Rz0//Ykwv2Ga7AZxxm -P+lkxKf2RWnh406FxBvBZzwB3rQeeM7QTg2IcFqGnlf005FIikp6SlyhZ/3M/Nl3 -FW235vuO37jLCL8qosGt4NOWAstXaxDujfIb/Q+IYxUpWZrdiH5tM/mUXARK0Sjf -D8DHbFwAT2mUv1QxRXYJO1y4pENboEzT6LUqxJgE+ae/F/29g2RD9DhtwqKqWjhM -7jB0kNVZrz3qUKnoJHIozA== ------END DSA PRIVATE KEY----- - - - oleg-centos.edc.renci.org - - - -----BEGIN DSA PRIVATE KEY----- -MIIBugIBAAKBgQCG3ij/JvdNp+1VUsK2zmLM5QWNN4MRRm/FCOHDknDJrWdSKheO -h6BbCgyFOw+k5qYtwXQnt3DpQfxPi7PIjr3tQJ9gB8LzqH2DwT2hMXm9VV2ImX2P -12aj8hZVM99WOp/ma6+ivLSFHnwET19eaqS9SRb0ftIqZXpWGE3ddW07qQIVAOfT -1OPSsvAnOsSrYc5HG5K3xIWlAoGAAzhTmi29+v0YTIsW2W1FihsexeAnpPPjYgRO -eT6HreyTvh20UASxDP+IJ2Ba+41G6MU0isuAijp8Z4CCC4RpoS46Ksc3JtPsZiRy -wAjwlb7JKGRBoY8V3aT47Xyx+iTSclZfzTmv0Z0bb56NZ6KEU8WRnks2d7tsb0fq -JTAgLkkCgYBvt5EoxhlCwEUgm8j3nD4TLSRYt1lt6LVulBYA9qlV4F68b2cJUuOi -YTV9H2SWRF6UF+GiR5SajChveS106T9O+tepip+7V5YgFfW+ALOxwar+6V8VoUF4 -xNvNTWtaw+wK8xsgxhhYDaWVhVLVhR40QmeQhx/BQm+EYkSSa9kkCQIURGd0R+Zj -tM7dZpB+reWl9L5e2L8= ------END DSA PRIVATE KEY----- - - - tester - - - 22 - - - proxy.oleg-centos.edc.renci.org - - - 8123 - - - -----BEGIN RSA PRIVATE KEY----- -MIIEogIBAAKCAQEA8ZsD8jgH7ySXnd4dprEFFkJ+zs1ne81E8febjR8hekiKrc+D -9GjeEykchy0PsrsBrf2F8J3GtLNISVerkl+EnVh1E0pi9Vllc1vcpQHvBeNPG/jl -9Dnum/DcaaMKLot+ARXjBuMX/xJVfnlgkvfpBvoq4QzQ6E27rOMbcPlvrN7KeYba -orsTpDMUraHX5u99P1evvw7sOuNl3lc9YpIgmjHT6dWUGTqBx9T2SEKXBRVk2NNb -d2UctQkr5BJn1gGehA+1KYS30FMiCSN8F8ZOlpYj1+K6xzs0srq1z30LailIyy7Q -mYp739BJlOF3cVywdcFXGre35H2cJylcNV2e+QIBIwKCAQAbnK/+bM207j02nQqz -9vlEX17zECkVdouJXiBn5kz4CEpdAcXwC/wfcmmpDHbSmQeBmVEi0DP3ZPJRhlzA -RW493jlECIBWjd+1aZWPM2vGKJtTp2q802u6DOX9cbgFUcVB899ugFqDjREVxLqU -dBqhtjDJQ0sTPBVy2CBkrsrvLy7AZd4LlaqxpdTdpkD/auUxg4zdThHT/XeQ0V0G -3BS5vGehfqgkDOQpQSm7HexM+9GDJnnzMdNXjmWBPxZU49QAlxujZeZ1M2IgKwMq -eNkWAOnZJidfsfwYluSCi8OHPN2i1s/b7pgn6ffb50S/k2mmhTHxNChDdGTlW91G -6CFLAoGBAPlGA4qzZCG4SLBQicGhhXZlwaKKfTvWNi4xNPZeoJezC0G+yZZT7IIV -zCj83t3dteaRRw15e+7NuIXZx3zl2hANfEpBZwnS4sOekvbS9/S7cEVzOEk53jRU -TOtHRsvNxS2xK3RywqoaqzcPaK2Df917yzbqvEajMRudRPrsTvYdAoGBAPggB/kJ -+VxZf13JqV2KgrFoVvykJpRlw2F5+lkH69ON9gdl976J3TNJDqAmHeWFxBUL+6Lt -9TSpMq3fYueJXg9xaTkSYg177sPRGCmRLO5aneA4nJkIB6KHRXsR71C9D4fJK8Fi -YB5n5dnBUTBhkvaI6KsxcxDzEg2zAJEcn4WNAoGBAOsHf66pI+VHWnpakINdxvqa -dL3TCFz9K8UnFK3G7y/x9Kuz4qOuNsPLaLjua7s+wXL+ASn2MwW6pqoWekKPkxZz -HWqVb8dvEFIKipDyzIepadsU3UxbIfbTI/PG3FnCAw3S7nUbvtrl8eN07arpsxKn -63zr81iLPO4mkX7ezhs/AoGADi23UA8y0hO+Ip3PKeqoYei0g3cYJbysFDLbGwfE -VTtP4ypl7aF6WrO3sWFDiXVbqW5mJpFBNjWN3gzD0rdkdek5NnYUO0jpEoD6EQD7 -QNH6ZJWFSpK+m5Kzg2AcTcGpHbO5W4H23SqCKbNGd8sPtlD3Wj1XCEhnbn9B3GgJ -HZMCgYEAjn9BH4fcobMaM15AV0s6sCEyr/vzn3QBfoIBqqqlipMqOtPDv8oyvGO4 -5tSpMrTKf4e3YAMPA4TXRAiVLjeRYlhdj3He0LkAuZZabrHeRmWqjDruMWd1TcKZ -3o8DLgYbSH7eGXUJ+euM4spKr5OLkBEkmH7Of6Qxss2njvjVNTE= ------END RSA PRIVATE KEY----- - - - -----BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,B3475536EDD1B442 - -Xa6Y7FYTfz19CMzPcVbCpBHEh8x3tnA9PutKEDNMwKbR+NVUvBx5fN1QjrLpltCr -uX7yD3vLCeyihg4oaK3nTBZBcsB/1TZx+MlLgpvMfV1JKmbKCmebBZ3lUpsypHlG -FpCY41miFwdHmBe6tuwL9XA3vz26eJwSgJGMkVN9EBvNbiOHinEPhSW0whzBfbv+ -OfseG73gvHc4jZS6Sw8h5VDBAmlldJEfkP/s/1/iTbCXFQ22xRb4Z6NilEyKiWpB -nQviXmaucTWCEuNF5QDA7oV7Ugwm5cAXuBqFIs9ZGaKV4/XpfX1tClOLfB3Lguh+ -bbkwjPb0ztlhKa4gkwXiMs0S/lhoueXBae4QStM0qJBXHtFhhRYIn4JeIZ8CJ0k6 -SMP7QVfPf5aJIaa8t+SlpvtIFTIkEhTViOCl+udT04670DGwmJUgrJAV0r+/Ytf7 -Mi+m3DagN7gGmCvYo+7r7EBl1G6e3hCSYm0rFxGOBesmCWriRoeRpxirWnkrns57 -D57pEC1hg90IdycCGpiwqubGDKFljuMLiVd2w0onVhudShPszP+nJAaq18wUB+rE -mtBv+GlpqCITREB4lG2noP4r9P9lgrOTqmKvWjvUTQjfS3u0XO/1aQllKlwe97C7 -mfOxcZQWy5F7+9CiWpDpomW7Eso89ja6uyupw4Q4gsm7EUacqOOaVxHrm3MVhYjE -Bfk9I5agKFqeHdjBUUP0DQ6X7JUEtb/Ri8ZrFnyT8sBG7JYnMTXfjPQqdR493cp2 -hWI5reZLi4CCUqt4Pcmhm2vtwJz5HXChARPYq2C3DhdJHcdhxUr97rfTGE1w8mPY -JcwSFnNN47UBcDg6nvSfY3SJKV0gmmqz9fEw1pBoCrudJKw9U0vQrNoCEJOpEETG -4XojbAMsTr0Ps5fI2X1VbVYWtU1uyZxqF8KaTCTN1Paapmqaq4N+qIFrrXA+PTH+ -dyaMLmYJ263Gy5eNkCZMeWLDFZ9WHX/Zx2ERMXfI6fyGImXkb6E0Dia+bB087BZP -9C5gHAvZIjv+FosZrViFqDfrV5hDXL6bO3+V3zieemRxRCTvMtk+RXUJDd50qIOW -gKNcSbevLPOyQH7eQbR+fU4KtJDUigbTFunSn2MZkDl2GDDlKI35wUAVr5yGsJbE -yiIQe5DgLGZcMiEpqbhuqSfuOw0cUlFVyKeNZ/Hr701HWngLt677IY8ExyuNbBfT -PRaes+hcjJ1QmJoRHZx9rQ3w0IpezCpRkRLRKJzzuQZOuwd95whKFXroFsdeaHxO -hS4PqlLbuSMLiSIaPSZM6Huc4kb5lqCaxg/SBlXTCX17Z/8TFoqV/wCJz17XnkH6 -9WtKAC2TwKxiLZ2Qzwr2XV48lASugIOZkSW2qxM9ui+b1T9ICFKRGLn/UB//pOiG -270hNJDLB/BKRExjS+RXeOpdAIJB5XsAEp8h56ub9emhhf9tCEXOn7PN7HbMCnQh -7k8EpAG0h5StLUhY1HHvynVz2/qyMvZa/bIaaudL2565Z6nDU+iBxed7O1qrbRAH -Vakr7Sa3K5niCyH5kxdyO1t29l1ksBqpDUrj+vViFuLkd3XIiui8IA== ------END RSA PRIVATE KEY----- - - - tester - - \ No newline at end of file diff --git a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj b/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj deleted file mode 100644 index abeeb691..00000000 --- a/src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj +++ /dev/null @@ -1,1785 +0,0 @@ - - - - Debug - AnyCPU - - - 2.0 - {007CE8B3-7827-4AD0-AACD-860505638ABE} - Library - Properties - Renci.SshNet.Tests - Renci.SshNet.Tests.NET35 - v3.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug\ - TRACE;DEBUG - prompt - 4 - 5 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 0 - - - true - - - ..\Renci.SshNet.snk - - - - - ..\..\packages\Moq.4.2.1409.1722\lib\net35\Moq.dll - - - - 3.5 - - - - - - - False - - - - - Classes\Abstraction\CryptoAbstraction_GenerateRandom.cs - - - Classes\Abstraction\DnsAbstraction_GetHostAddresses.cs - - - Classes\Abstraction\ThreadAbstraction_ExecuteThread.cs - - - Classes\ForwardedPortStatusTest_Started.cs - - - Classes\ForwardedPortStatusTest_Starting.cs - - - Classes\ForwardedPortStatusTest_Stopped.cs - - - Classes\ForwardedPortStatusTest_Stopping.cs - - - Classes\BaseClientTest_Connected_KeepAliveInterval_NegativeOne.cs - - - Classes\BaseClientTest_Connected_KeepAliveInterval_NotNegativeOne.cs - - - Classes\BaseClientTest_Connected_KeepAlivesNotSentConcurrently.cs - - - Classes\BaseClientTest_Connect_OnConnectedThrowsException.cs - - - Classes\BaseClientTest_Disconnected_KeepAliveInterval_NotNegativeOne.cs - - - Classes\BaseClientTest_NotConnected_KeepAliveInterval_NotNegativeOne.cs - - - Classes\Channels\ChannelDirectTcpipTest.cs - - - Classes\Channels\ChannelDirectTcpipTest_Dispose_SessionIsConnectedAndChannelIsOpen.cs - - - Classes\Channels\ChannelForwardedTcpipTest_Dispose_SessionIsConnectedAndChannelIsOpen.cs - - - Classes\Channels\ChannelSessionTestBase.cs - - - Classes\Channels\ChannelSessionTest_Disposed_Closed.cs - - - Classes\Channels\ChannelSessionTest_Dispose_Disposed.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageFailure.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageSuccess.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageFailure.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageSuccess.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageFailure.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageSuccess.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived_SendChannelEofMessageFailure.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseReceived.cs - - - Classes\Channels\ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived.cs - - - Classes\Channels\ChannelSessionTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen.cs - - - Classes\Channels\ChannelSessionTest_Open_ExceptionWaitingOnOpenConfirmation.cs - - - Classes\Channels\ChannelSessionTest_Open_OnOpenFailureReceived_NoRetriesAvailable.cs - - - Classes\Channels\ChannelSessionTest_Open_OnOpenFailureReceived_RetriesAvalable.cs - - - Classes\Channels\ChannelStub.cs - - - Classes\Channels\ChannelTestBase.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsConnectedAndChannelIsNotOpen.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_DisconnectWaitingForChannelCloseMessage.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived_TimeoutWaitingForChannelCloseMessage.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsNotConnectedAndChannelIsNotOpen.cs - - - Classes\Channels\ChannelTest_Dispose_SessionIsNotConnectedAndChannelIsOpen.cs - - - Classes\Channels\ChannelTest_OnSessionChannelCloseReceived_OnClose_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs - - - Classes\Channels\ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofReceived.cs - - - Classes\Channels\ChannelTest_OnSessionChannelDataReceived_OnData_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionChannelEofReceived_OnEof_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionChannelExtendedDataReceived_OnExtendedData_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionChannelFailureReceived_OnFailure_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionChannelRequestReceived_OnRequest_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionChannelSuccessReceived_OnSuccess_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionChannelWindowAdjustReceived_OnWindowAdjust_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionDisconnected_OnDisconnected_Exception.cs - - - Classes\Channels\ChannelTest_OnSessionDisconnected_SessionIsConnectedAndChannelIsOpen.cs - - - Classes\Channels\ChannelTest_OnSessionErrorOccurred_OnErrorOccurred_Exception.cs - - - Classes\Channels\ClientChannelStub.cs - - - Classes\Channels\ClientChannelTest_OnSessionChannelOpenConfirmationReceived_OnOpenConfirmation_Exception.cs - - - Classes\Channels\ClientChannelTest_OnSessionChannelOpenFailureReceived_OnOpenFailure_Exception.cs - - - Classes\CipherInfoTest.cs - - - Classes\ClientAuthenticationTest.cs - - - Classes\ClientAuthenticationTestBase.cs - - - Classes\ClientAuthenticationTest_Failure_MultiList_AllAllowedAuthenticationsHaveReachedPartialSuccessLimit.cs - - - Classes\ClientAuthenticationTest_Failure_SingleList_AuthenticationMethodFailed.cs - - - Classes\ClientAuthenticationTest_Failure_SingleList_AuthenticationMethodNotConfigured.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_DifferentAllowedAuthenticationsAfterPartialSuccess.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInAlternateBranch.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInAlternateBranch2.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInSameBranch.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedBySuccessInAlternateBranch.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedBySuccessInSameBranch.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_SameAllowedAuthenticationsAfterPartialSuccess.cs - - - Classes\ClientAuthenticationTest_Success_MultiList_SkipFailedAuthenticationMethod.cs - - - Classes\ClientAuthenticationTest_Success_SingleList_SameAllowedAuthenticationAfterPartialSuccess.cs - - - Classes\ClientAuthenticationTest_Success_SingleList_SameAllowedAuthenticationAfterPartialSuccess_PartialSuccessLimitReached.cs - - - Classes\CommandAsyncResultTest.cs - - - Classes\Common\ASCIIEncodingTest.cs - - - Classes\Common\AsyncResultTest.cs - - - Classes\Common\AuthenticationBannerEventArgsTest.cs - - - Classes\Common\AuthenticationPasswordChangeEventArgsTest.cs - - - Classes\Common\AuthenticationPromptEventArgsTest.cs - - - Classes\Common\AuthenticationPromptTest.cs - - - Classes\Common\BigIntegerTest.cs - - - Classes\Common\ChannelDataEventArgsTest.cs - - - Classes\Common\ChannelEventArgsTest.cs - - - Classes\Common\ChannelOpenFailedEventArgsTest.cs - - - Classes\Common\ChannelRequestEventArgsTest.cs - - - Classes\Common\CountdownEventTest.cs - - - Classes\Common\CountdownEventTest_Dispose_NotSet.cs - - - Classes\Common\CountdownEventTest_Dispose_Set.cs - - - Classes\Common\DerDataTest.cs - - - Classes\Common\ExceptionEventArgsTest.cs - - - Classes\Common\ExtensionsTest_Concat.cs - - - Classes\Common\ExtensionsTest_IsEqualTo_ByteArray.cs - - - Classes\Common\ExtensionsTest_Reverse.cs - - - Classes\Common\ExtensionsTest_Take_Count.cs - - - Classes\Common\ExtensionsTest_Take_OffsetAndCount.cs - - - Classes\Common\ExtensionsTest_ToBigInteger2.cs - - - Classes\Common\ExtensionsTest_Pad.cs - - - Classes\Common\ExtensionsTest_TrimLeadingZeros.cs - - - Classes\Common\HostKeyEventArgsTest.cs - - - Classes\Common\NetConfServerExceptionTest.cs - - - Classes\Common\ObjectIdentifierTest.cs - - - Classes\Common\PipeStreamTest.cs - - - Classes\Common\PipeStream_Close_BlockingRead.cs - - - Classes\Common\PipeStream_Close_BlockingWrite.cs - - - Classes\Common\PipeStream_Flush_BytesRemainingAfterRead.cs - - - Classes\Common\PipeStream_Flush_NoBytesRemainingAfterRead.cs - - - Classes\Common\PortForwardEventArgsTest.cs - - - Classes\Common\PosixPathTest_GetFileName.cs - - - Classes\Common\ProxyExceptionTest.cs - - - Classes\Common\ScpDownloadEventArgsTest.cs - - - Classes\Common\ScpExceptionTest.cs - - - Classes\Common\ScpUploadEventArgsTest.cs - - - Classes\Common\SemaphoreLightTest.cs - - - Classes\Common\SftpPathNotFoundExceptionTest.cs - - - Classes\Common\SftpPermissionDeniedExceptionTest.cs - - - Classes\Common\ShellDataEventArgsTest.cs - - - Classes\Common\SshAuthenticationExceptionTest.cs - - - Classes\Common\SshConnectionExceptionTest.cs - - - Classes\Common\SshDataTest.cs - - - Classes\Common\SshExceptionTest.cs - - - Classes\Common\SshOperationTimeoutExceptionTest.cs - - - Classes\Common\SshPassPhraseNullOrEmptyExceptionTest.cs - - - Classes\Compression\CompressorTest.cs - - - Classes\Compression\ZlibOpenSshTest.cs - - - Classes\Compression\ZlibStreamTest.cs - - - Classes\Compression\ZlibTest.cs - - - Classes\ConnectionInfoTest.cs - - - Classes\ExpectActionTest.cs - - - Classes\ForwardedPortDynamicTest.cs - - - Classes\ForwardedPortDynamicTest_Dispose_PortDisposed.cs - - - Classes\ForwardedPortDynamicTest_Dispose_PortNeverStarted.cs - - - Classes\ForwardedPortDynamicTest_Dispose_PortStarted_ChannelBound.cs - - - Classes\ForwardedPortDynamicTest_Dispose_PortStarted_ChannelNotBound.cs - - - Classes\ForwardedPortDynamicTest_Dispose_PortStopped.cs - - - Classes\ForwardedPortDynamicTest_Started_SocketSendShutdownImmediately.cs - - - Classes\ForwardedPortDynamicTest_Started_SocketVersionNotSupported.cs - - - Classes\ForwardedPortDynamicTest_Start_PortDisposed.cs - - - Classes\ForwardedPortDynamicTest_Start_PortNeverStarted.cs - - - Classes\ForwardedPortDynamicTest_Start_PortStarted.cs - - - Classes\ForwardedPortDynamicTest_Start_PortStopped.cs - - - Classes\ForwardedPortDynamicTest_Start_SessionNotConnected.cs - - - Classes\ForwardedPortDynamicTest_Start_SessionNull.cs - - - Classes\ForwardedPortDynamicTest_Stop_PortDisposed.cs - - - Classes\ForwardedPortDynamicTest_Stop_PortNeverStarted.cs - - - Classes\ForwardedPortDynamicTest_Stop_PortStarted_ChannelBound.cs - - - Classes\ForwardedPortDynamicTest_Stop_PortStarted_ChannelNotBound.cs - - - Classes\ForwardedPortDynamicTest_Stop_PortStopped.cs - - - Classes\ForwardedPortLocalTest.cs - - - Classes\ForwardedPortLocalTest_Dispose_PortDisposed.cs - - - Classes\ForwardedPortLocalTest_Dispose_PortDisposed_NeverStarted.cs - - - Classes\ForwardedPortLocalTest_Dispose_PortNeverStarted.cs - - - Classes\ForwardedPortLocalTest_Dispose_PortStarted_ChannelBound.cs - - - Classes\ForwardedPortLocalTest_Dispose_PortStarted_ChannelNotBound.cs - - - Classes\ForwardedPortLocalTest_Dispose_PortStopped.cs - - - Classes\ForwardedPortLocalTest_Start_PortDisposed.cs - - - Classes\ForwardedPortLocalTest_Start_PortNeverStarted.cs - - - Classes\ForwardedPortLocalTest_Start_PortStarted.cs - - - Classes\ForwardedPortLocalTest_Start_PortStopped.cs - - - Classes\ForwardedPortLocalTest_Start_SessionNotConnected.cs - - - Classes\ForwardedPortLocalTest_Start_SessionNull.cs - - - Classes\ForwardedPortLocalTest_Stop_PortDisposed.cs - - - Classes\ForwardedPortLocalTest_Stop_PortNeverStarted.cs - - - Classes\ForwardedPortLocalTest_Stop_PortStarted_ChannelBound.cs - - - Classes\ForwardedPortLocalTest_Stop_PortStarted_ChannelNotBound.cs - - - Classes\ForwardedPortLocalTest_Stop_PortStopped.cs - - - Classes\ForwardedPortRemoteTest.cs - - - Classes\ForwardedPortRemoteTest_Dispose_PortDisposed.cs - - - Classes\ForwardedPortRemoteTest_Dispose_PortNeverStarted.cs - - - Classes\ForwardedPortRemoteTest_Dispose_PortStarted_ChannelBound.cs - - - Classes\ForwardedPortRemoteTest_Dispose_PortStopped.cs - - - Classes\ForwardedPortRemoteTest_Started.cs - - - Classes\ForwardedPortRemoteTest_Start_PortDisposed.cs - - - Classes\ForwardedPortRemoteTest_Start_PortNeverStarted.cs - - - Classes\ForwardedPortRemoteTest_Start_PortStarted.cs - - - Classes\ForwardedPortRemoteTest_Start_PortStopped.cs - - - Classes\ForwardedPortRemoteTest_Start_SessionNotConnected.cs - - - Classes\ForwardedPortRemoteTest_Start_SessionNull.cs - - - Classes\ForwardedPortRemoteTest_Stop_PortDisposed.cs - - - Classes\ForwardedPortRemoteTest_Stop_PortNeverStarted.cs - - - Classes\ForwardedPortRemoteTest_Stop_PortStarted_ChannelBound.cs - - - Classes\ForwardedPortRemoteTest_Stop_PortStopped.cs - - - Classes\KeyboardInteractiveAuthenticationMethodTest.cs - - - Classes\KeyboardInteractiveConnectionInfoTest.cs - - - Classes\MessageEventArgsTest.cs - - - Classes\Messages\Authentication\BannerMessageTest.cs - - - Classes\Messages\Authentication\FailureMessageTest.cs - - - Classes\Messages\Authentication\InformationRequestMessageTest.cs - - - Classes\Messages\Authentication\InformationResponseMessageTest.cs - - - Classes\Messages\Authentication\PasswordChangeRequiredMessageTest.cs - - - Classes\Messages\Authentication\PublicKeyMessageTest.cs - - - Classes\Messages\Authentication\RequestMessageHostTest.cs - - - Classes\Messages\Authentication\RequestMessageKeyboardInteractiveTest.cs - - - Classes\Messages\Authentication\RequestMessageNoneTest.cs - - - Classes\Messages\Authentication\RequestMessagePasswordTest.cs - - - Classes\Messages\Authentication\RequestMessagePublicKeyTest.cs - - - Classes\Messages\Authentication\SuccessMessageTest.cs - - - Classes\Messages\Connection\ChannelCloseMessageTest.cs - - - Classes\Messages\Connection\ChannelDataMessageTest.cs - - - Classes\Messages\Connection\ChannelEofMessageTest.cs - - - Classes\Messages\Connection\ChannelExtendedDataMessageTest.cs - - - Classes\Messages\Connection\ChannelFailureMessageTest.cs - - - Classes\Messages\Connection\ChannelMessageTest.cs - - - Classes\Messages\Connection\ChannelOpenConfirmationMessageTest.cs - - - Classes\Messages\Connection\ChannelOpenFailureMessageTest.cs - - - Classes\Messages\Connection\ChannelOpenInfoTest.cs - - - Classes\Messages\Connection\ChannelOpen\ChannelOpenMessageTest.cs - - - Classes\Messages\Connection\ChannelOpen\DirectTcpipChannelInfoTest.cs - - - Classes\Messages\Connection\ChannelOpen\ForwardedTcpipChannelInfoTest.cs - - - Classes\Messages\Connection\ChannelOpen\SessionChannelOpenInfoTest.cs - - - Classes\Messages\Connection\ChannelOpen\X11ChannelOpenInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\BreakRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\ChannelRequestMessageTest.cs - - - Classes\Messages\Connection\ChannelRequest\EndOfWriteRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\EnvironmentVariableRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\ExecRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\ExitSignalRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\ExitStatusRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\KeepAliveRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\PseudoTerminalInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\ShellRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\SignalRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\SubsystemRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\WindowChangeRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\X11ForwardingRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelRequest\XonXoffRequestInfoTest.cs - - - Classes\Messages\Connection\ChannelSuccessMessageTest.cs - - - Classes\Messages\Connection\ChannelWindowAdjustMessageTest.cs - - - Classes\Messages\Connection\GlobalRequestMessageTest.cs - - - Classes\Messages\Connection\RequestFailureMessageTest.cs - - - Classes\Messages\Connection\RequestInfoTest.cs - - - Classes\Messages\Connection\RequestSuccessMessageTest.cs - - - Classes\Messages\MessageAttributeTest.cs - - - Classes\Messages\MessageTest.cs - - - Classes\Messages\Transport\DebugMessageTest.cs - - - Classes\Messages\Transport\DisconnectMessageTest.cs - - - Classes\Messages\Transport\IgnoreMessageTest.cs - - - Classes\Messages\Transport\KeyExchangeDhGroupExchangeGroupTest.cs - - - Classes\Messages\Transport\KeyExchangeDhGroupExchangeInitTest.cs - - - Classes\Messages\Transport\KeyExchangeDhGroupExchangeReplyTest.cs - - - Classes\Messages\Transport\KeyExchangeDhGroupExchangeRequestTest.cs - - - Classes\Messages\Transport\KeyExchangeDhInitMessageTest.cs - - - Classes\Messages\Transport\KeyExchangeDhReplyMessageTest.cs - - - Classes\Messages\Transport\KeyExchangeInitMessageTest.cs - - - Classes\Messages\Transport\NewKeysMessageTest.cs - - - Classes\Messages\Transport\ServiceAcceptMessageTest.cs - - - Classes\Messages\Transport\ServiceRequestMessageTest.cs - - - Classes\Messages\Transport\UnimplementedMessageTest.cs - - - Classes\NetConfClientTest.cs - - - Classes\NoneAuthenticationMethodTest.cs - - - Classes\PasswordAuthenticationMethodTest.cs - - - Classes\PasswordConnectionInfoTest.cs - - - Classes\PrivateKeyAuthenticationMethodTest.cs - - - Classes\PrivateKeyConnectionInfoTest.cs - - - Classes\PrivateKeyFileTest.cs - - - Classes\RemotePathDoubleQuoteTransformationTest.cs - - - Classes\RemotePathShellQuoteTransformationTest.cs - - - Classes\ScpClientTest.cs - - - Classes\ScpClientTestBase.cs - - - Classes\ScpClientTest_Download_PathAndDirectoryInfo_SendExecRequestReturnsFalse.cs - - - Classes\ScpClientTest_Download_PathAndFileInfo_SendExecRequestReturnsFalse.cs - - - Classes\ScpClientTest_Download_PathAndStream_SendExecRequestReturnsFalse.cs - - - Classes\ScpClientTest_Upload_DirectoryInfoAndPath_SendExecRequestReturnsFalse.cs - - - Classes\ScpClientTest_Upload_FileInfoAndPath_SendExecRequestReturnsFalse.cs - - - Classes\ScpClientTest_Upload_FileInfoAndPath_Success.cs - - - Classes\ScpClientTest_Upload_StreamAndPath_SendExecRequestReturnsFalse.cs - - - Classes\Security\CertificateHostAlgorithmTest.cs - - - Classes\Security\Cryptography\Ciphers\AesCipherTest.cs - - - Classes\Security\Cryptography\Ciphers\Arc4CipherTest.cs - - - Classes\Security\Cryptography\Ciphers\BlowfishCipherTest.cs - - - Classes\Security\Cryptography\Ciphers\CastCipherTest.cs - - - Classes\Security\Cryptography\Ciphers\CipherModeTest.cs - - - Classes\Security\Cryptography\Ciphers\CipherPaddingTest.cs - - - Classes\Security\Cryptography\Ciphers\DesCipherTest.cs - - - Classes\Security\Cryptography\Ciphers\Modes\CbcCipherModeTest.cs - - - Classes\Security\Cryptography\Ciphers\Modes\CfbCipherModeTest.cs - - - Classes\Security\Cryptography\Ciphers\Modes\CtrCipherModeTest.cs - - - Classes\Security\Cryptography\Ciphers\Modes\OfbCipherModeTest.cs - - - Classes\Security\Cryptography\Ciphers\Paddings\PKCS5PaddingTest.cs - - - Classes\Security\Cryptography\Ciphers\Paddings\PKCS7PaddingTest.cs - - - Classes\Security\Cryptography\Ciphers\RsaCipherTest.cs - - - Classes\Security\Cryptography\Ciphers\SerpentCipherTest.cs - - - Classes\Security\Cryptography\Ciphers\TripleDesCipherTest.cs - - - Classes\Security\Cryptography\Ciphers\TwofishCipherTest.cs - - - Classes\Security\Cryptography\DsaDigitalSignatureTest.cs - - - Classes\Security\Cryptography\DsaKeyTest.cs - - - Classes\Security\Cryptography\HMacTest.cs - - - Classes\Security\Cryptography\RsaDigitalSignatureTest.cs - - - Classes\Security\Cryptography\RsaKeyTest.cs - - - Classes\Security\KeyExchangeDiffieHellmanGroup14Sha1Test.cs - - - Classes\Security\KeyExchangeDiffieHellmanGroup1Sha1Test.cs - - - Classes\Security\KeyExchangeDiffieHellmanGroupExchangeSha1Test.cs - - - Classes\Security\KeyExchangeDiffieHellmanGroupExchangeSha256Test.cs - - - Classes\Security\KeyHostAlgorithmTest.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_EndLStatThrowsSshException.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_FileSizeIsAlmostSixTimesGreaterThanChunkSize.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_FileSizeIsEqualToChunkSize.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_FileSizeIsExactlyFiveTimesGreaterThanChunkSize.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_FileSizeIsLessThanChunkSize.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_FileSizeIsLittleMoreThanFiveTimesGreaterThanChunkSize.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_FileSizeIsMoreThanTenTimesGreaterThanChunkSize.cs - - - Classes\ServiceFactoryTest_CreateSftpFileReader_FileSizeIsZero.cs - - - Classes\ServiceFactoryTest_CreateShellStream_ChannelOpenThrowsException.cs - - - Classes\ServiceFactoryTest_CreateShellStream_SendPseudoTerminalRequestReturnsFalse.cs - - - Classes\ServiceFactoryTest_CreateShellStream_SendPseudoTerminalRequestThrowsException.cs - - - Classes\ServiceFactoryTest_CreateShellStream_SendShellRequestReturnsFalse.cs - - - Classes\ServiceFactoryTest_CreateShellStream_SendShellRequestThrowsException.cs - - - Classes\ServiceFactoryTest_CreateShellStream_Success.cs - - - Classes\SessionTest.cs - - - Classes\SessionTest.HttpProxy.cs - - - Classes\SessionTest_Connected.cs - - - Classes\SessionTest_ConnectedBase.cs - - - Classes\SessionTest_Connected_ConnectionReset.cs - - - Classes\SessionTest_Connected_Disconnect.cs - - - Classes\SessionTest_Connected_GlobalRequestMessageAfterAuthenticationRace.cs - - - Classes\SessionTest_Connected_ServerAndClientDisconnectRace.cs - - - Classes\SessionTest_Connected_ServerSendsBadPacket.cs - - - Classes\SessionTest_Connected_ServerSendsDisconnectMessage.cs - - - Classes\SessionTest_Connected_ServerSendsDisconnectMessageAndShutsDownSocket.cs - - - Classes\SessionTest_Connected_ServerSendsUnsupportedMessageType.cs - - - Classes\SessionTest_Connected_ServerShutsDownSendAfterSendingIncompletePacket.cs - - - Classes\SessionTest_Connected_ServerShutsDownSocket.cs - - - Classes\SessionTest_NotConnected.cs - - - Classes\SessionTest_SocketConnected_BadPacketAndDispose.cs - - - Classes\SftpClientTest.ChangeDirectory.cs - - - Classes\SftpClientTest.Connect.cs - - - Classes\SftpClientTest.CreateDirectory.cs - - - Classes\SftpClientTest.cs - - - Classes\SftpClientTest.DeleteDirectory.cs - - - Classes\SftpClientTest.DeleteFile.cs - - - Classes\SftpClientTest.Download.cs - - - Classes\SftpClientTest.ListDirectory.cs - - - Classes\SftpClientTest.RenameFile.cs - - - Classes\SftpClientTest.SynchronizeDirectories.cs - - - Classes\SftpClientTest.Upload.cs - - - Classes\Sftp\Requests\ExtendedRequests\FStatVfsRequestTest.cs - - - Classes\Sftp\Requests\ExtendedRequests\HardLinkRequestTest.cs - - - Classes\Sftp\Requests\ExtendedRequests\PosixRenameRequestTest.cs - - - Classes\Sftp\Requests\ExtendedRequests\StatVfsRequestTest.cs - - - Classes\Sftp\Requests\SftpBlockRequestTest.cs - - - Classes\Sftp\Requests\SftpCloseRequestTest.cs - - - Classes\Sftp\Requests\SftpFSetStatRequestTest.cs - - - Classes\Sftp\Requests\SftpFStatRequestTest.cs - - - Classes\Sftp\Requests\SftpInitRequestTest.cs - - - Classes\Sftp\Requests\SftpLinkRequestTest.cs - - - Classes\Sftp\Requests\SftpLStatRequestTest.cs - - - Classes\Sftp\Requests\SftpMkDirRequestTest.cs - - - Classes\Sftp\Requests\SftpOpenDirRequestTest.cs - - - Classes\Sftp\Requests\SftpOpenRequestTest.cs - - - Classes\Sftp\Requests\SftpReadDirRequestTest.cs - - - Classes\Sftp\Requests\SftpReadLinkRequestTest.cs - - - Classes\Sftp\Requests\SftpReadRequestTest.cs - - - Classes\Sftp\Requests\SftpRealPathRequestTest.cs - - - Classes\Sftp\Requests\SftpRemoveRequestTest.cs - - - Classes\Sftp\Requests\SftpRenameRequestTest.cs - - - Classes\Sftp\Requests\SftpRmDirRequestTest.cs - - - Classes\Sftp\Requests\SftpSetStatRequestTest.cs - - - Classes\Sftp\Requests\SftpStatRequestTest.cs - - - Classes\Sftp\Requests\SftpSymLinkRequestTest.cs - - - Classes\Sftp\Requests\SftpUnblockRequestTest.cs - - - Classes\Sftp\Requests\SftpWriteRequestTest.cs - - - Classes\Sftp\Responses\ExtendedReplies\StatVfsReplyInfoTest.cs - - - Classes\Sftp\Responses\SftpAttrsResponseTest.cs - - - Classes\Sftp\Responses\SftpDataResponseTest.cs - - - Classes\Sftp\Responses\SftpExtendedReplyResponseTest.cs - - - Classes\Sftp\Responses\SftpHandleResponseTest.cs - - - Classes\Sftp\Responses\SftpNameResponseTest.cs - - - Classes\Sftp\Responses\SftpStatusResponseTest.cs - - - Classes\Sftp\Responses\SftpVersionResponseTest.cs - - - Classes\Sftp\SftpDataResponseBuilder.cs - - - Classes\Sftp\SftpDownloadAsyncResultTest.cs - - - Classes\Sftp\SftpFileAttributesTest.cs - - - Classes\Sftp\SftpFileReaderTestBase.cs - - - Classes\Sftp\SftpFileReaderTest_DisposeShouldUnblockReadAndReadAhead.cs - - - Classes\Sftp\SftpFileReaderTest_Dispose_SftpSessionIsNotOpen.cs - - - Classes\Sftp\SftpFileReaderTest_Dispose_SftpSessionIsOpen_BeginCloseThrowsException.cs - - - Classes\Sftp\SftpFileReaderTest_Dispose_SftpSessionIsOpen_EndCloseThrowsException.cs - - - Classes\Sftp\SftpFileReaderTest_LastChunkBeforeEofIsComplete.cs - - - Classes\Sftp\SftpFileReaderTest_LastChunkBeforeEofIsPartial.cs - - - Classes\Sftp\SftpFileReaderTest_PreviousChunkIsIncompleteAndEofIsNotReached.cs - - - Classes\Sftp\SftpFileReaderTest_PreviousChunkIsIncompleteAndEofIsReached.cs - - - Classes\Sftp\SftpFileReaderTest_ReadAheadBeginReadException.cs - - - Classes\Sftp\SftpFileReaderTest_ReadAheadEndInvokeException_DiscardsFurtherReadAheads.cs - - - Classes\Sftp\SftpFileReaderTest_ReadAheadEndInvokeException_PreventsFurtherReadAheads.cs - - - Classes\Sftp\SftpFileReaderTest_ReadBackBeginReadException.cs - - - Classes\Sftp\SftpFileReaderTest_ReadBackEndInvokeException.cs - - - Classes\Sftp\SftpFileReaderTest_Read_ReadAheadExceptionInWaitOnHandle_ChunkAvailable.cs - - - Classes\Sftp\SftpFileReaderTest_Read_ReadAheadExceptionInWaitOnHandle_NoChunkAvailable.cs - - - Classes\Sftp\SftpFileReaderTest_Read_ReahAheadExceptionInBeginRead.cs - - - Classes\Sftp\SftpFileStreamTestBase.cs - - - Classes\Sftp\SftpFileStreamTest_CanRead_Closed_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_CanRead_Closed_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_CanRead_Closed_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_CanRead_Disposed_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_CanRead_Disposed_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_CanRead_Disposed_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_CanWrite_Closed_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_CanWrite_Closed_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_CanWrite_Closed_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_CanWrite_Disposed_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_CanWrite_Disposed_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_CanWrite_Disposed_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Close_Closed.cs - - - Classes\Sftp\SftpFileStreamTest_Close_Disposed.cs - - - Classes\Sftp\SftpFileStreamTest_Close_SessionNotOpen.cs - - - Classes\Sftp\SftpFileStreamTest_Close_SessionOpen.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileAccessInvalid.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeAppend_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeAppend_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeAppend_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreateNew_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreateNew_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreateNew_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreate_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreate_FileAccessReadWrite_FileDoesNotExist.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreate_FileAccessReadWrite_FileExists.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreate_FileAccessWrite_FileDoesNotExist.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeCreate_FileAccessWrite_FileExists.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeInvalid.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeOpenOrCreate_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeOpenOrCreate_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeOpenOrCreate_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeOpen_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeOpen_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeOpen_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeTruncate_FileAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeTruncate_FileAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Ctor_FileModeTruncate_FileAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Dispose_Closed.cs - - - Classes\Sftp\SftpFileStreamTest_Dispose_Disposed.cs - - - Classes\Sftp\SftpFileStreamTest_Dispose_SessionNotOpen.cs - - - Classes\Sftp\SftpFileStreamTest_Dispose_SessionOpen.cs - - - Classes\Sftp\SftpFileStreamTest_Finalize_SessionOpen.cs - - - Classes\Sftp\SftpFileStreamTest_Flush_ReadMode_DataInBuffer_NotReadFromBuffer.cs - - - Classes\Sftp\SftpFileStreamTest_Flush_ReadMode_DataInBuffer_ReadFromBuffer.cs - - - Classes\Sftp\SftpFileStreamTest_Flush_ReadMode_NoDataInBuffer.cs - - - Classes\Sftp\SftpFileStreamTest_Flush_SessionNotOpen.cs - - - Classes\Sftp\SftpFileStreamTest_Flush_WriteMode_DataInBuffer.cs - - - Classes\Sftp\SftpFileStreamTest_Flush_WriteMode_NoDataInBuffer.cs - - - Classes\Sftp\SftpFileStreamTest_ReadByte_ReadMode_NoDataInWriteBufferAndNoDataInReadBuffer_Eof.cs - - - Classes\Sftp\SftpFileStreamTest_ReadByte_ReadMode_NoDataInWriteBufferAndNoDataInReadBuffer_LessDataThanReadBufferSizeAvailable.cs - - - Classes\Sftp\SftpFileStreamTest_Read_ReadMode_NoDataInReaderBufferAndReadLessBytesFromServerThanCountAndEqualToBufferSize.cs - - - Classes\Sftp\SftpFileStreamTest_Read_ReadMode_NoDataInReaderBufferAndReadLessBytesFromServerThanCountAndLessThanBufferSize.cs - - - Classes\Sftp\SftpFileStreamTest_Read_ReadMode_NoDataInReaderBufferAndReadMoreBytesFromServerThanCount.cs - - - Classes\Sftp\SftpFileStreamTest_Seek_PositionedAtBeginningOfStream_OriginBeginAndOffsetNegative.cs - - - Classes\Sftp\SftpFileStreamTest_Seek_PositionedAtBeginningOfStream_OriginBeginAndOffsetPositive.cs - - - Classes\Sftp\SftpFileStreamTest_Seek_PositionedAtBeginningOfStream_OriginBeginAndOffsetZero.cs - - - Classes\Sftp\SftpFileStreamTest_Seek_PositionedAtMiddleOfStream_OriginBeginAndOffsetZero_NoBuffering.cs - - - Classes\Sftp\SftpFileStreamTest_Seek_PositionedAtMiddleOfStream_OriginBeginAndOffsetZero_ReadBuffer.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_Closed.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_DataInReadBuffer_NewLengthGreatherThanPosition.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_DataInReadBuffer_NewLengthLessThanPosition.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_DataInWriteBuffer_NewLengthGreatherThanPosition.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_DataInWriteBuffer_NewLengthLessThanPosition.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_Disposed.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_SessionNotOpen.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_SessionOpen_FIleAccessRead.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_SessionOpen_FIleAccessReadWrite.cs - - - Classes\Sftp\SftpFileStreamTest_SetLength_SessionOpen_FIleAccessWrite.cs - - - Classes\Sftp\SftpFileStreamTest_Write_SessionOpen_CountGreatherThanTwoTimesTheWriteBufferSize.cs - - - Classes\Sftp\SftpFileSystemInformationTest.cs - - - Classes\Sftp\SftpFileTest.cs - - - Classes\Sftp\SftpHandleResponseBuilder.cs - - - Classes\Sftp\SftpInitRequestBuilder.cs - - - Classes\Sftp\SftpListDirectoryAsyncResultTest.cs - - - Classes\Sftp\SftpNameResponseBuilder.cs - - - Classes\Sftp\SftpOpenRequestBuilder.cs - - - Classes\Sftp\SftpReadRequestBuilder.cs - - - Classes\Sftp\SftpRealPathRequestBuilder.cs - - - Classes\Sftp\SftpSessionTest_Connected_RequestRead.cs - - - Classes\Sftp\SftpSessionTest_Connected_RequestStatVfs.cs - - - Classes\Sftp\SftpSessionTest_DataReceived_MultipleSftpMessagesInSingleSshDataMessage.cs - - - Classes\Sftp\SftpSessionTest_DataReceived_MultipleSftpMessagesSplitOverMultipleSshDataMessages.cs - - - Classes\Sftp\SftpSessionTest_DataReceived_SingleSftpMessageInSshDataMessage.cs - - - Classes\Sftp\SftpStatVfsRequestBuilder.cs - - - Classes\Sftp\SftpStatVfsResponseBuilder.cs - - - Classes\Sftp\SftpSynchronizeDirectoriesAsyncResultTest.cs - - - Classes\Sftp\SftpUploadAsyncResultTest.cs - - - Classes\Sftp\SftpVersionResponseBuilder.cs - - - Classes\ShellStreamTest.cs - - - Classes\ShellStreamTest_Write_WriteBufferEmptyAndWriteLessBytesThanBufferSize.cs - - - Classes\ShellStreamTest_Write_WriteBufferEmptyAndWriteMoreBytesThanBufferSize.cs - - - Classes\ShellStreamTest_Write_WriteBufferEmptyAndWriteNumberOfBytesEqualToBufferSize.cs - - - Classes\ShellStreamTest_Write_WriteBufferEmptyAndWriteZeroBytes.cs - - - Classes\ShellStreamTest_Write_WriteBufferFullAndWriteLessBytesThanBufferSize.cs - - - Classes\ShellStreamTest_Write_WriteBufferFullAndWriteZeroBytes.cs - - - Classes\ShellStreamTest_Write_WriteBufferNotEmptyAndWriteLessBytesThanBufferCanContain.cs - - - Classes\ShellStreamTest_Write_WriteBufferNotEmptyAndWriteMoreBytesThanBufferCanContain.cs - - - Classes\ShellStreamTest_Write_WriteBufferNotEmptyAndWriteZeroBytes.cs - - - Classes\ShellTestTest.cs - - - Classes\SshClientTest.cs - - - Classes\SshClientTest_CreateShellStream_TerminalNameAndColumnsAndRowsAndWidthAndHeightAndBufferSizeAndTerminalModes_Connected.cs - - - Classes\SshClientTest_CreateShellStream_TerminalNameAndColumnsAndRowsAndWidthAndHeightAndBufferSize_Connected.cs - - - Classes\SshClientTest_Disconnect_ForwardedPortStarted.cs - - - Classes\SshClientTest_Dispose_ForwardedPortStarted.cs - - - Classes\SshCommandTest.cs - - - Classes\SshCommandTest_BeginExecute_EndExecuteInvokedOnAsyncResultFromPreviousInvocation.cs - - - Classes\SshCommandTest_BeginExecute_EndExecuteNotInvokedOnAsyncResultFromPreviousInvocation.cs - - - Classes\SshCommandTest_Dispose.cs - - - Classes\SshCommandTest_EndExecute.cs - - - Classes\SshCommandTest_EndExecute_AsyncResultFromOtherInstance.cs - - - Classes\SshCommandTest_EndExecute_AsyncResultIsNull.cs - - - Classes\SshCommandTest_EndExecute_ChannelOpen.cs - - - Classes\SubsystemSessionStub.cs - - - Classes\SubsystemSession_Connect_Connected.cs - - - Classes\SubsystemSession_Connect_Disconnected.cs - - - Classes\SubsystemSession_Connect_Disposed.cs - - - Classes\SubsystemSession_Connect_NeverConnected.cs - - - Classes\SubsystemSession_Connect_SendSubsystemRequestFails.cs - - - Classes\SubsystemSession_Disconnect_Connected.cs - - - Classes\SubsystemSession_Disconnect_Disposed.cs - - - Classes\SubsystemSession_Disconnect_NeverConnected.cs - - - Classes\SubsystemSession_Dispose_Connected.cs - - - Classes\SubsystemSession_Dispose_Disconnected.cs - - - Classes\SubsystemSession_Dispose_Disposed.cs - - - Classes\SubsystemSession_Dispose_NeverConnected.cs - - - Classes\SubsystemSession_OnChannelDataReceived_Connected.cs - - - Classes\SubsystemSession_OnChannelDataReceived_Disposed.cs - - - Classes\SubsystemSession_OnChannelDataReceived_OnDataReceived_Exception.cs - - - Classes\SubsystemSession_OnChannelException_Connected.cs - - - Classes\SubsystemSession_OnChannelException_Disposed.cs - - - Classes\SubsystemSession_OnSessionDisconnected_Connected.cs - - - Classes\SubsystemSession_OnSessionDisconnected_Disposed.cs - - - Classes\SubsystemSession_OnSessionErrorOccurred_Connected.cs - - - Classes\SubsystemSession_OnSessionErrorOccurred_Disposed.cs - - - Classes\SubsystemSession_SendData_Connected.cs - - - Classes\SubsystemSession_SendData_Disconnected.cs - - - Classes\SubsystemSession_SendData_Disposed.cs - - - Classes\SubsystemSession_SendData_NeverConnected.cs - - - Common\ArrayBuilder.cs - - - Common\AsyncSocketListener.cs - - - Common\DictionaryAssert.cs - - - Common\Extensions.cs - - - Common\HttpProxyStub.cs - - - Common\HttpRequest.cs - - - Common\SftpFileAttributesBuilder.cs - - - Common\TestBase.cs - - - - - - - Properties\CommonAssemblyInfo.cs - - - True - True - Resources.resx - - - - - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A} - Renci.SshNet.NET35 - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - - - Data\Key.RSA.Encrypted.Aes.128.CBC.12345.txt - - - Data\Key.RSA.Encrypted.Aes.192.CBC.12345.txt - - - Data\Key.RSA.Encrypted.Aes.256.CBC.12345.txt - - - Data\Key.RSA.Encrypted.Des.CBC.12345.txt - - - Data\Key.RSA.Encrypted.Des.Ede3.CBC.12345.txt - - - Data\Key.RSA.Encrypted.Des.Ede3.CFB.1234567890.txt - - - Data\Key.RSA.txt - - - - - Renci.SshNet.snk - - - - - - Data\Key.SSH2.DSA.Encrypted.Des.CBC.12345.txt - - - Data\Key.SSH2.DSA.txt - - - Data\Key.SSH2.RSA.Encrypted.Des.CBC.12345.txt - - - Data\Key.SSH2.RSA.txt - - - - - Data\Key.ECDSA.txt - - - Data\Key.ECDSA384.txt - - - Data\Key.ECDSA521.txt - - - Data\Key.ECDSA.Encrypted.txt - - - Data\Key.ECDSA384.Encrypted.txt - - - Data\Key.ECDSA521.Encrypted.txt - - - Data\Key.OPENSSH.ED25519.Encrypted.txt - - - Data\Key.OPENSSH.ED25519.txt - - - - - - - - - - diff --git a/src/Renci.SshNet.Tests.NET35/packages.config b/src/Renci.SshNet.Tests.NET35/packages.config deleted file mode 100644 index e9365957..00000000 --- a/src/Renci.SshNet.Tests.NET35/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/Common/ProxyExceptionTest.NET40.cs b/src/Renci.SshNet.Tests/Classes/Common/ProxyExceptionTest.NET40.cs deleted file mode 100644 index 711878dc..00000000 --- a/src/Renci.SshNet.Tests/Classes/Common/ProxyExceptionTest.NET40.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Renci.SshNet.Tests.Common; - -namespace Renci.SshNet.Tests.Classes.Common -{ - public partial class ProxyExceptionTest : TestBase - { - } -} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.NET40.cs b/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.NET40.cs deleted file mode 100644 index 115fe662..00000000 --- a/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.NET40.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Net; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Common; -using Renci.SshNet.Tests.Properties; - -namespace Renci.SshNet.Tests.Classes -{ - public partial class ForwardedPortLocalTest - { - [TestMethod] - [TestCategory("integration")] - [ExpectedException(typeof(SshConnectionException))] - public void Test_PortForwarding_Local_Without_Connecting() - { - using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) - { - var port1 = new ForwardedPortLocal("localhost", 8084, "www.renci.org", 80); - client.AddForwardedPort(port1); - port1.Exception += delegate(object sender, ExceptionEventArgs e) - { - Assert.Fail(e.Exception.ToString()); - }; - port1.Start(); - - System.Threading.Tasks.Parallel.For(0, 100, - - //new ParallelOptions - //{ - // MaxDegreeOfParallelism = 20, - //}, - (counter) => - { - var start = DateTime.Now; - var req = HttpWebRequest.Create("http://localhost:8084"); - using (var response = req.GetResponse()) - { - var data = ReadStream(response.GetResponseStream()); - var end = DateTime.Now; - - Debug.WriteLine(string.Format("Request# {2}: Lenght: {0} Time: {1}", data.Length, (end - start), counter)); - } - } - ); - } - } - - [TestMethod] - [TestCategory("integration")] - public void Test_PortForwarding_Local() - { - using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) - { - client.Connect(); - var port1 = new ForwardedPortLocal("localhost", 8084, "www.renci.org", 80); - client.AddForwardedPort(port1); - port1.Exception += delegate(object sender, ExceptionEventArgs e) - { - Assert.Fail(e.Exception.ToString()); - }; - port1.Start(); - - System.Threading.Tasks.Parallel.For(0, 100, - - //new ParallelOptions - //{ - // MaxDegreeOfParallelism = 20, - //}, - (counter) => - { - var start = DateTime.Now; - var req = HttpWebRequest.Create("http://localhost:8084"); - using (var response = req.GetResponse()) - { - var data = ReadStream(response.GetResponseStream()); - var end = DateTime.Now; - - Debug.WriteLine(string.Format("Request# {2}: Length: {0} Time: {1}", data.Length, (end - start), counter)); - } - } - ); - } - } - - private static byte[] ReadStream(Stream stream) - { - byte[] buffer = new byte[1024]; - using (var ms = new MemoryStream()) - { - while (true) - { - int read = stream.Read(buffer, 0, buffer.Length); - if (read > 0) - ms.Write(buffer, 0, read); - else - return ms.ToArray(); - } - } - } - } -} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.cs b/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.cs index 26b6dfd1..13b2c81b 100644 --- a/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.cs +++ b/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest.cs @@ -187,5 +187,97 @@ namespace Renci.SshNet.Tests.Classes } Assert.Inconclusive("TODO: Implement code to verify target"); } + +#if FEATURE_TPL + [TestMethod] + [TestCategory("integration")] + [ExpectedException(typeof(SshConnectionException))] + public void Test_PortForwarding_Local_Without_Connecting() + { + using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) + { + var port1 = new ForwardedPortLocal("localhost", 8084, "www.renci.org", 80); + client.AddForwardedPort(port1); + port1.Exception += delegate (object sender, ExceptionEventArgs e) + { + Assert.Fail(e.Exception.ToString()); + }; + port1.Start(); + + System.Threading.Tasks.Parallel.For(0, 100, + + //new ParallelOptions + //{ + // MaxDegreeOfParallelism = 20, + //}, + (counter) => + { + var start = DateTime.Now; + var req = HttpWebRequest.Create("http://localhost:8084"); + using (var response = req.GetResponse()) + { + var data = ReadStream(response.GetResponseStream()); + var end = DateTime.Now; + + Debug.WriteLine(string.Format("Request# {2}: Lenght: {0} Time: {1}", data.Length, (end - start), counter)); + } + } + ); + } + } + + [TestMethod] + [TestCategory("integration")] + public void Test_PortForwarding_Local() + { + using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) + { + client.Connect(); + var port1 = new ForwardedPortLocal("localhost", 8084, "www.renci.org", 80); + client.AddForwardedPort(port1); + port1.Exception += delegate (object sender, ExceptionEventArgs e) + { + Assert.Fail(e.Exception.ToString()); + }; + port1.Start(); + + System.Threading.Tasks.Parallel.For(0, 100, + + //new ParallelOptions + //{ + // MaxDegreeOfParallelism = 20, + //}, + (counter) => + { + var start = DateTime.Now; + var req = HttpWebRequest.Create("http://localhost:8084"); + using (var response = req.GetResponse()) + { + var data = ReadStream(response.GetResponseStream()); + var end = DateTime.Now; + + Debug.WriteLine(string.Format("Request# {2}: Length: {0} Time: {1}", data.Length, (end - start), counter)); + } + } + ); + } + } + + private static byte[] ReadStream(System.IO.Stream stream) + { + byte[] buffer = new byte[1024]; + using (var ms = new System.IO.MemoryStream()) + { + while (true) + { + int read = stream.Read(buffer, 0, buffer.Length); + if (read > 0) + ms.Write(buffer, 0, read); + else + return ms.ToArray(); + } + } + } +#endif // FEATURE_TPL } } \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/ForwardedPortRemote.NET40.cs b/src/Renci.SshNet.Tests/Classes/ForwardedPortRemote.NET40.cs deleted file mode 100644 index d57ec634..00000000 --- a/src/Renci.SshNet.Tests/Classes/ForwardedPortRemote.NET40.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Diagnostics; -using System.Threading; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Common; -using Renci.SshNet.Tests.Properties; - -namespace Renci.SshNet.Tests.Classes -{ - public partial class ForwardedPortRemoteTest - { - [TestMethod] - [TestCategory("integration")] - public void Test_PortForwarding_Remote() - { - // ****************************************************************** - // ************* Tests are still in not finished ******************** - // ****************************************************************** - - using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) - { - client.Connect(); - var port1 = new ForwardedPortRemote(8082, "www.renci.org", 80); - client.AddForwardedPort(port1); - port1.Exception += delegate(object sender, ExceptionEventArgs e) - { - Assert.Fail(e.Exception.ToString()); - }; - port1.Start(); - var boundport = port1.BoundPort; - - System.Threading.Tasks.Parallel.For(0, 5, - - //new ParallelOptions - //{ - // MaxDegreeOfParallelism = 1, - //}, - (counter) => - { - var cmd = client.CreateCommand(string.Format("wget -O- http://localhost:{0}", boundport)); - var result = cmd.Execute(); - var end = DateTime.Now; - Debug.WriteLine(string.Format("Length: {0}", result.Length)); - } - ); - Thread.Sleep(1000 * 100); - port1.Stop(); - } - } - } -} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest.cs b/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest.cs index fe6f43bf..3a99441d 100644 --- a/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest.cs +++ b/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest.cs @@ -150,5 +150,46 @@ namespace Renci.SshNet.Tests.Classes ForwardedPortRemote target = new ForwardedPortRemote(boundPort, host, port); Assert.Inconclusive("TODO: Implement code to verify target"); } + +#if FEATURE_TPL + [TestMethod] + [TestCategory("integration")] + public void Test_PortForwarding_Remote() + { + // ****************************************************************** + // ************* Tests are still in not finished ******************** + // ****************************************************************** + + using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) + { + client.Connect(); + var port1 = new ForwardedPortRemote(8082, "www.renci.org", 80); + client.AddForwardedPort(port1); + port1.Exception += delegate (object sender, ExceptionEventArgs e) + { + Assert.Fail(e.Exception.ToString()); + }; + port1.Start(); + var boundport = port1.BoundPort; + + System.Threading.Tasks.Parallel.For(0, 5, + + //new ParallelOptions + //{ + // MaxDegreeOfParallelism = 1, + //}, + (counter) => + { + var cmd = client.CreateCommand(string.Format("wget -O- http://localhost:{0}", boundport)); + var result = cmd.Execute(); + var end = DateTime.Now; + System.Diagnostics.Debug.WriteLine(string.Format("Length: {0}", result.Length)); + } + ); + Thread.Sleep(1000 * 100); + port1.Stop(); + } + } +#endif // FEATURE_TPL } } \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/ScpClientTest.NET40.cs b/src/Renci.SshNet.Tests/Classes/ScpClientTest.NET40.cs deleted file mode 100644 index fce6e505..00000000 --- a/src/Renci.SshNet.Tests/Classes/ScpClientTest.NET40.cs +++ /dev/null @@ -1,109 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Common; -using Renci.SshNet.Tests.Properties; -using System.IO; -using System.Linq; -using System.Threading.Tasks; - -namespace Renci.SshNet.Tests.Classes -{ - /// - /// Provides SCP client functionality. - /// - public partial class ScpClientTest - { - [TestMethod] - [TestCategory("Scp")] - [TestCategory("integration")] - public void Test_Scp_File_20_Parallel_Upload_Download() - { - using (var scp = new ScpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) - { - scp.Connect(); - - var uploadFilenames = new string[20]; - for (int i = 0; i < uploadFilenames.Length; i++) - { - uploadFilenames[i] = Path.GetTempFileName(); - this.CreateTestFile(uploadFilenames[i], 1); - } - - Parallel.ForEach(uploadFilenames, - (filename) => - { - scp.Upload(new FileInfo(filename), Path.GetFileName(filename)); - }); - - Parallel.ForEach(uploadFilenames, - (filename) => - { - scp.Download(Path.GetFileName(filename), new FileInfo(string.Format("{0}.down", filename))); - }); - - var result = from file in uploadFilenames - where - CalculateMD5(file) == CalculateMD5(string.Format("{0}.down", file)) - select file; - - scp.Disconnect(); - - Assert.IsTrue(result.Count() == uploadFilenames.Length); - } - } - - [TestMethod] - [TestCategory("Scp")] - [TestCategory("integration")] - public void Test_Scp_File_Upload_Download_Events() - { - using (var scp = new ScpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) - { - scp.Connect(); - - var uploadFilenames = new string[10]; - - for (int i = 0; i < uploadFilenames.Length; i++) - { - uploadFilenames[i] = Path.GetTempFileName(); - this.CreateTestFile(uploadFilenames[i], 1); - } - - var uploadedFiles = uploadFilenames.ToDictionary((filename) => Path.GetFileName(filename), (filename) => 0L); - var downloadedFiles = uploadFilenames.ToDictionary((filename) => string.Format("{0}.down", Path.GetFileName(filename)), (filename) => 0L); - - scp.Uploading += delegate(object sender, ScpUploadEventArgs e) - { - uploadedFiles[e.Filename] = e.Uploaded; - }; - - scp.Downloading += delegate(object sender, ScpDownloadEventArgs e) - { - downloadedFiles[string.Format("{0}.down", e.Filename)] = e.Downloaded; - }; - - Parallel.ForEach(uploadFilenames, - (filename) => - { - scp.Upload(new FileInfo(filename), Path.GetFileName(filename)); - }); - - Parallel.ForEach(uploadFilenames, - (filename) => - { - scp.Download(Path.GetFileName(filename), new FileInfo(string.Format("{0}.down", filename))); - }); - - var result = from uf in uploadedFiles - from df in downloadedFiles - where - string.Format("{0}.down", uf.Key) == df.Key - && uf.Value == df.Value - select uf; - - scp.Disconnect(); - - Assert.IsTrue(result.Count() == uploadFilenames.Length && uploadFilenames.Length == uploadedFiles.Count && uploadedFiles.Count == downloadedFiles.Count); - } - } - } -} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/ScpClientTest.cs b/src/Renci.SshNet.Tests/Classes/ScpClientTest.cs index a7f7da14..038d952e 100644 --- a/src/Renci.SshNet.Tests/Classes/ScpClientTest.cs +++ b/src/Renci.SshNet.Tests/Classes/ScpClientTest.cs @@ -7,6 +7,9 @@ using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; +#if FEATURE_TPL +using System.Threading.Tasks; +#endif // FEATURE_TPL namespace Renci.SshNet.Tests.Classes { @@ -536,6 +539,102 @@ namespace Renci.SshNet.Tests.Classes Assert.Inconclusive("A method that does not return a value cannot be verified."); } +#if FEATURE_TPL + [TestMethod] + [TestCategory("Scp")] + [TestCategory("integration")] + public void Test_Scp_File_20_Parallel_Upload_Download() + { + using (var scp = new ScpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) + { + scp.Connect(); + + var uploadFilenames = new string[20]; + for (int i = 0; i < uploadFilenames.Length; i++) + { + uploadFilenames[i] = Path.GetTempFileName(); + this.CreateTestFile(uploadFilenames[i], 1); + } + + Parallel.ForEach(uploadFilenames, + (filename) => + { + scp.Upload(new FileInfo(filename), Path.GetFileName(filename)); + }); + + Parallel.ForEach(uploadFilenames, + (filename) => + { + scp.Download(Path.GetFileName(filename), new FileInfo(string.Format("{0}.down", filename))); + }); + + var result = from file in uploadFilenames + where + CalculateMD5(file) == CalculateMD5(string.Format("{0}.down", file)) + select file; + + scp.Disconnect(); + + Assert.IsTrue(result.Count() == uploadFilenames.Length); + } + } + + [TestMethod] + [TestCategory("Scp")] + [TestCategory("integration")] + public void Test_Scp_File_Upload_Download_Events() + { + using (var scp = new ScpClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) + { + scp.Connect(); + + var uploadFilenames = new string[10]; + + for (int i = 0; i < uploadFilenames.Length; i++) + { + uploadFilenames[i] = Path.GetTempFileName(); + this.CreateTestFile(uploadFilenames[i], 1); + } + + var uploadedFiles = uploadFilenames.ToDictionary((filename) => Path.GetFileName(filename), (filename) => 0L); + var downloadedFiles = uploadFilenames.ToDictionary((filename) => string.Format("{0}.down", Path.GetFileName(filename)), (filename) => 0L); + + scp.Uploading += delegate (object sender, ScpUploadEventArgs e) + { + uploadedFiles[e.Filename] = e.Uploaded; + }; + + scp.Downloading += delegate (object sender, ScpDownloadEventArgs e) + { + downloadedFiles[string.Format("{0}.down", e.Filename)] = e.Downloaded; + }; + + Parallel.ForEach(uploadFilenames, + (filename) => + { + scp.Upload(new FileInfo(filename), Path.GetFileName(filename)); + }); + + Parallel.ForEach(uploadFilenames, + (filename) => + { + scp.Download(Path.GetFileName(filename), new FileInfo(string.Format("{0}.down", filename))); + }); + + var result = from uf in uploadedFiles + from df in downloadedFiles + where + string.Format("{0}.down", uf.Key) == df.Key + && uf.Value == df.Value + select uf; + + scp.Disconnect(); + + Assert.IsTrue(result.Count() == uploadFilenames.Length && uploadFilenames.Length == uploadedFiles.Count && uploadedFiles.Count == downloadedFiles.Count); + } + } +#endif // FEATURE_TPL + protected static string CalculateMD5(string fileName) { using (var file = new FileStream(fileName, FileMode.Open)) diff --git a/src/Renci.SshNet.Tests/Classes/ShellStream.cs b/src/Renci.SshNet.Tests/Classes/ShellStream.cs deleted file mode 100644 index f5d401af..00000000 --- a/src/Renci.SshNet.Tests/Classes/ShellStream.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Tests.Common; - -namespace Renci.SshNet.Tests.Classes -{ - /// - /// Contains operation for working with SSH Shell. - /// - [TestClass] - public class ShellStreamTest : TestBase - { - } -} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/SshCommandTest.NET40.cs b/src/Renci.SshNet.Tests/Classes/SshCommandTest.NET40.cs deleted file mode 100644 index 589c6881..00000000 --- a/src/Renci.SshNet.Tests/Classes/SshCommandTest.NET40.cs +++ /dev/null @@ -1,100 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Tests.Properties; -using System; -using System.Diagnostics; -using System.Threading.Tasks; - -namespace Renci.SshNet.Tests.Classes -{ - public partial class SshCommandTest - { - - public void Test_MultipleThread_Example_MultipleConnections() - { - var host = Resources.HOST; - var username = Resources.USERNAME; - var password = Resources.PASSWORD; - - try - { - #region Example SshCommand RunCommand Parallel - System.Threading.Tasks.Parallel.For(0, 10000, - () => - { - var client = new SshClient(host, username, password); - client.Connect(); - return client; - }, - (int counter, ParallelLoopState pls, SshClient client) => - { - var result = client.RunCommand("echo 123"); - Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); - return client; - }, - (SshClient client) => - { - client.Disconnect(); - client.Dispose(); - } - ); - #endregion - - } - catch (Exception exp) - { - Assert.Fail(exp.ToString()); - } - } - - //[TestMethod] - public void Test_MultipleThread_10000_MultipleConnections() - { - try - { - System.Threading.Tasks.Parallel.For(0, 10000, - () => - { - var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD); - client.Connect(); - return client; - }, - (int counter, ParallelLoopState pls, SshClient client) => - { - var result = ExecuteTestCommand(client); - Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); - Assert.IsTrue(result); - return client; - }, - (SshClient client) => - { - client.Disconnect(); - client.Dispose(); - } - ); - } - catch (Exception exp) - { - Assert.Fail(exp.ToString()); - } - } - - //[TestMethod] - public void Test_MultipleThread_10000_MultipleSessions() - { - using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) - { - client.Connect(); - System.Threading.Tasks.Parallel.For(0, 10000, - (counter) => - { - var result = ExecuteTestCommand(client); - Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); - Assert.IsTrue(result); - } - ); - - client.Disconnect(); - } - } - } -} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/SshCommandTest.cs b/src/Renci.SshNet.Tests/Classes/SshCommandTest.cs index c1979ce3..cfd68b07 100644 --- a/src/Renci.SshNet.Tests/Classes/SshCommandTest.cs +++ b/src/Renci.SshNet.Tests/Classes/SshCommandTest.cs @@ -6,6 +6,10 @@ using System; using System.IO; using System.Text; using System.Threading; +#if FEATURE_TPL +using System.Diagnostics; +using System.Threading.Tasks; +#endif // FEATURE_TPL namespace Renci.SshNet.Tests.Classes { @@ -622,6 +626,100 @@ namespace Renci.SshNet.Tests.Classes Assert.Inconclusive("Verify the correctness of this test method."); } +#if FEATURE_TPL + [TestMethod] + [TestCategory("integration")] + public void Test_MultipleThread_Example_MultipleConnections() + { + var host = Resources.HOST; + var username = Resources.USERNAME; + var password = Resources.PASSWORD; + + try + { +#region Example SshCommand RunCommand Parallel + System.Threading.Tasks.Parallel.For(0, 10000, + () => + { + var client = new SshClient(host, username, password); + client.Connect(); + return client; + }, + (int counter, ParallelLoopState pls, SshClient client) => + { + var result = client.RunCommand("echo 123"); + Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); + return client; + }, + (SshClient client) => + { + client.Disconnect(); + client.Dispose(); + } + ); +#endregion + + } + catch (Exception exp) + { + Assert.Fail(exp.ToString()); + } + } + + [TestMethod] + [TestCategory("integration")] + public void Test_MultipleThread_10000_MultipleConnections() + { + try + { + System.Threading.Tasks.Parallel.For(0, 10000, + () => + { + var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD); + client.Connect(); + return client; + }, + (int counter, ParallelLoopState pls, SshClient client) => + { + var result = ExecuteTestCommand(client); + Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); + Assert.IsTrue(result); + return client; + }, + (SshClient client) => + { + client.Disconnect(); + client.Dispose(); + } + ); + } + catch (Exception exp) + { + Assert.Fail(exp.ToString()); + } + } + + [TestMethod] + [TestCategory("integration")] + public void Test_MultipleThread_10000_MultipleSessions() + { + using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD)) + { + client.Connect(); + System.Threading.Tasks.Parallel.For(0, 10000, + (counter) => + { + var result = ExecuteTestCommand(client); + Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); + Assert.IsTrue(result); + } + ); + + client.Disconnect(); + } + } +#endif // FEATURE_TPL + private static bool ExecuteTestCommand(SshClient s) { var testValue = Guid.NewGuid().ToString(); diff --git a/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs b/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs index 41c04806..89c26fae 100644 --- a/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs +++ b/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs @@ -127,7 +127,6 @@ namespace Renci.SshNet.Tests.Common else { SignalDisconnected(handler); - handler.Shutdown(SocketShutdown.Send); } } diff --git a/src/Renci.SshNet.Tests/Properties/AssemblyInfo.cs b/src/Renci.SshNet.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 443203d0..00000000 --- a/src/Renci.SshNet.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,5 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("SSH.NET Tests .NET 4.0")] -[assembly: Guid("defb66b2-a4b9-40ca-b205-2183d84b7323")] diff --git a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj index 043c7977..d7ee81e9 100644 --- a/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj +++ b/src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj @@ -1,736 +1,121 @@ - - - - Debug - AnyCPU - 2.0 - {C45379B9-17B1-4E89-BC2E-6D41726413E8} - Library - Properties - Renci.SshNet.Tests - Renci.SshNet.Tests - v4.0 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug\ - TRACE;DEBUG;FEATURE_THREAD_COUNTDOWNEVENT - prompt - 4 - 5 - - - pdbonly - true - bin\Release\ - TRACE;FEATURE_THREAD_COUNTDOWNEVENT - prompt - 0 - - - - - + true - - ..\Renci.SshNet.snk + + + net35;net40;netcoreapp2.1;netcoreapp2.2 + + + net35;net40;netcoreapp2.1;netcoreapp2.2;netcoreapp3.0 + + + + + + + FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_TPL + + + FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_TPL + + + FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_TPL + + + FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_TPL + - - - ..\..\packages\Moq.4.2.1409.1722\lib\net40\Moq.dll - - - - 3.5 - - - - - - - - - False - - - - - Classes\Abstractions\CryptoAbstraction_GenerateRandom.cs - - - Classes\Abstractions\DnsAbstraction_GetHostAddresses.cs - - - Classes\Abstractions\FileSystemAbstraction_EnumerateFiles.cs - - - Classes\Abstractions\ThreadAbstraction_ExecuteThread.cs - - - Classes\ForwardedPortStatusTest_Started.cs - - - Classes\ForwardedPortStatusTest_Starting.cs - - - Classes\ForwardedPortStatusTest_Stopped.cs - - - Classes\ForwardedPortStatusTest_Stopping.cs - - - Classes\SshMessageFactoryTest.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Resources.resx - True - True - - - - Properties\CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - - - - - - - - - - - - - - - Renci.SshNet.snk - - - - - - - - - - - - - - - - {2f5f8c90-0bd1-424f-997c-7bc6280919d1} - Renci.SshNet - - - - - - + + - - + + + + + + + + + + + + - - - \ No newline at end of file + + + + + + + + $(MSBuildProgramFiles32)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + $(MSTestV1UnitTestFrameworkAssemblyCandidate) + + $(MSBuildProgramFiles32)\Microsoft Visual Studio\2017\Professional\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + $(MSTestV1UnitTestFrameworkAssemblyCandidate) + + $(MSBuildProgramFiles32)\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + $(MSTestV1UnitTestFrameworkAssemblyCandidate) + + + + + $(MSBuildProgramFiles32)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + $(MSTestV1UnitTestFrameworkAssemblyCandidate) + + $(MSBuildProgramFiles32)\Microsoft Visual Studio\2019\Professional\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + $(MSTestV1UnitTestFrameworkAssemblyCandidate) + + $(MSBuildProgramFiles32)\Microsoft Visual Studio\2019\Community\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + $(MSTestV1UnitTestFrameworkAssemblyCandidate) + + $(MSBuildProgramFiles32)\Microsoft Visual Studio\2019\Preview\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + $(MSTestV1UnitTestFrameworkAssemblyCandidate) + + + + + $(MSTestV1UnitTestFrameworkAssembly) + + + + + + $(MSTestV1UnitTestFrameworkAssembly) + + + + + + + + 2.1.0 + + + + + + + + 2.1.0 + + + + + + + + 2.1.0 + + + + + + + diff --git a/src/Renci.SshNet.Tests/authorized_keys b/src/Renci.SshNet.Tests/authorized_keys deleted file mode 100644 index 59efb8b0..00000000 --- a/src/Renci.SshNet.Tests/authorized_keys +++ /dev/null @@ -1,4 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA8ZsD8jgH7ySXnd4dprEFFkJ+zs1ne81E8febjR8hekiKrc+D9GjeEykchy0PsrsBrf2F8J3GtLNISVerkl+EnVh1E0pi9Vllc1vcpQHvBeNPG/jl9Dnum/DcaaMKLot+ARXjBuMX/xJVfnlgkvfpBvoq4QzQ6E27rOMbcPlvrN7KeYbaorsTpDMUraHX5u99P1evvw7sOuNl3lc9YpIgmjHT6dWUGTqBx9T2SEKXBRVk2NNbd2UctQkr5BJn1gGehA+1KYS30FMiCSN8F8ZOlpYj1+K6xzs0srq1z30LailIyy7QmYp739BJlOF3cVywdcFXGre35H2cJylcNV2e+Q== rsa_key_without_pass -ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuD5SKSM3RAO/h8z9x1RB9bhLbBkophrYVHYG8MdNwQc/iXb4IZ7PlKR2ZQovIYzHdMI5zGEuOsxJnLjxoV7NSUHlHEoGbRYX72rR3S3ZORUArLTJ9TwGZhR4TZRztJto7l4M5LGDUy4YMNN9kpcyT/aqv8v3ZcTB0UthZDXUHrrmrlktPAC+JagUjhESbtq+FAuiSUWd9/SXnAmLya7LkWANw2ScMpeSyXmEvLD+X0eapNtuwXltjRW4PoKS5fWMhiXnT61NXmgXDccrUHjWrOa1oeNjmhOuIGaDpoRtkBH8lCFQdRePgvcBIRnU9D7sjuBjZUAPqin+fDll2ISy2w== rsa_key_with_pass (tester) -ssh-dss AAAAB3NzaC1kc3MAAACBAN1CuvAa+SfAP6lv0am/+8PGPzKoVSDRxS4L+2SObe76VCPzpHB8DxEk5X44/ga2+z3M5KzGK6CKegH+4SJP7qNse/K8l4mnZ+wNYvH+1VFfGmLw3B5t9vjnlHTBVVl2qcUqwBkutABPnz0RS0uDJUAVBtQ/kXPqnHwfwAbSqXJtAAAAFQC5+1DsZ2xUe3w32ZKtj3O2QlXoKQAAAIEA1Ep/297O7PVoZSdQZYgsc7T1KJscrbnl+Su7j//O8Jt1rBZJk6hT68yemUtSE1pUyhLJgT9Ng5m+9sb1S0++vzBkZ00+Km8hcgHGWmv4UfSadLHSqVpHLc8SgNECbDqaxELNVhXe9nxlMRR236mG6u76mfRb0S6DMIweKRVWEkwAAACASHB5nNlWhpqvungn+otYyGKoVoATkRdRfSiUo3fb0mJLTmxrEhEH4UOFA/UFdQ0TYXXW0wRX/amynT4iTEXAx0FjxUNK5ryxloeoXiXEH4FK7D8RtJO11UsaRrN+nqWiSTVAehl6tzoMCPargGcWeFlAZZnPGN76OD9J1GiKZj8= dsa_key_without_pass -ssh-dss AAAAB3NzaC1kc3MAAACBAJU0pDZQHna2HaaGHsL1D0pZlnh/tM7EYAcGQcHqNRUVPLXbcy94ZdF0R9V1qCA9u7at/EEqdtfseXLbjbxLxccJM6sjCFn7GKNvc6N7w7PpAeUbZBdHdszOkNolyqGs+/45Oj0tGHLTLk2rRyOTeBagpJS1PlZQCnVbT8o/gjtvAAAAFQDUe90v8pdAZhtO84F19cRUMrWoqQAAAIBDZwBGOxMRy7nKc0f6aWNh0JX5NnTCuEiXmD6BmBV/2k9J0VJYgiTZw4mzmF4VzrV7aI+XCQz52N8od7cp76O1DXweO0cIqLkT2xLGuoBtUSpHiSqRnHUsL9BDI8s3bQ5fSCb0IwF6d90tArDX/d9mzYqx+Vvp+4ajSiSiyzaGUQAAAIB3vFz1T9jGAZ3hBPkFQ9zl0gniF2EQ/w1UlnHb7ABUyBigBxtnTN0+7yfNwFVfQS/rKxhT6muzYgQB3e1masvv0ky/vstnh5n7EZmLDLEWwIfRefbPmyfLCKK+23QmMZgPg/SGuLmwagw711ReiLyBqn5YiP8quXcDdnReJCJPig== dsa_key_with_pass (tester) \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/packages.config b/src/Renci.SshNet.Tests/packages.config deleted file mode 100644 index f6c56582..00000000 --- a/src/Renci.SshNet.Tests/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Renci.SshNet.VS2017.sln b/src/Renci.SshNet.VS2017.sln index 00469f61..9f1ce5e3 100644 --- a/src/Renci.SshNet.VS2017.sln +++ b/src/Renci.SshNet.VS2017.sln @@ -19,13 +19,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandcastle", "sandcastle", ..\build\sandcastle\SSH.NET.shfbproj = ..\build\sandcastle\SSH.NET.shfbproj EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet", "Renci.SshNet\Renci.SshNet.csproj", "{2F5F8C90-0BD1-424F-997C-7BC6280919D1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Renci.SshNet", "Renci.SshNet\Renci.SshNet.csproj", "{2F5F8C90-0BD1-424F-997C-7BC6280919D1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Tests", "Renci.SshNet.Tests\Renci.SshNet.Tests.csproj", "{C45379B9-17B1-4E89-BC2E-6D41726413E8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.NET35", "Renci.SshNet.NET35\Renci.SshNet.NET35.csproj", "{DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Renci.SshNet.NETCore", "Renci.SshNet.NETCore\Renci.SshNet.NETCore.csproj", "{8E8229EB-6780-4A8A-B470-E2023FA55AB5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Renci.SshNet.Tests", "Renci.SshNet.Tests\Renci.SshNet.Tests.csproj", "{C45379B9-17B1-4E89-BC2E-6D41726413E8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -69,40 +65,6 @@ Global {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Mixed Platforms.Build.0 = Release|Any CPU {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x64.ActiveCfg = Release|Any CPU {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x86.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|ARM.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|x64.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Any CPU.Build.0 = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|ARM.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|x64.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|x86.ActiveCfg = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|ARM.ActiveCfg = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|ARM.Build.0 = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|x64.ActiveCfg = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|x64.Build.0 = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|x86.ActiveCfg = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Debug|x86.Build.0 = Debug|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|Any CPU.Build.0 = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|ARM.ActiveCfg = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|ARM.Build.0 = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|x64.ActiveCfg = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|x64.Build.0 = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|x86.ActiveCfg = Release|Any CPU - {8E8229EB-6780-4A8A-B470-E2023FA55AB5}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -111,6 +73,9 @@ Global {94EE3919-19FA-4D9B-8DA9-249050B15232} = {2D6CAE62-D053-476F-9BDD-2B1F27FA9C5D} {A6C3FFD3-16A5-44D3-8C1F-3613D6DD17D1} = {2D6CAE62-D053-476F-9BDD-2B1F27FA9C5D} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C3D130B3-A070-4B12-A10F-E3E44D6ACEE2} + EndGlobalSection GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = Renci.SshNet1.vsmdi EndGlobalSection diff --git a/src/Renci.SshNet.VS2019.sln b/src/Renci.SshNet.VS2019.sln new file mode 100644 index 00000000..bc1f6f6d --- /dev/null +++ b/src/Renci.SshNet.VS2019.sln @@ -0,0 +1,82 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29521.150 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{2D6CAE62-D053-476F-9BDD-2B1F27FA9C5D}" + ProjectSection(SolutionItems) = preProject + ..\build\build.cmd = ..\build\build.cmd + ..\build\build.proj = ..\build\build.proj + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nuget", "nuget", "{94EE3919-19FA-4D9B-8DA9-249050B15232}" + ProjectSection(SolutionItems) = preProject + ..\build\nuget\SSH.NET.nuspec = ..\build\nuget\SSH.NET.nuspec + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandcastle", "sandcastle", "{A6C3FFD3-16A5-44D3-8C1F-3613D6DD17D1}" + ProjectSection(SolutionItems) = preProject + ..\build\sandcastle\SSH.NET.shfbproj = ..\build\sandcastle\SSH.NET.shfbproj + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Renci.SshNet", "Renci.SshNet\Renci.SshNet.csproj", "{2F5F8C90-0BD1-424F-997C-7BC6280919D1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Renci.SshNet.Tests", "Renci.SshNet.Tests\Renci.SshNet.Tests.csproj", "{C45379B9-17B1-4E89-BC2E-6D41726413E8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|Mixed Platforms = Release|Mixed Platforms + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Any CPU.Build.0 = Release|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|ARM.ActiveCfg = Release|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|x64.ActiveCfg = Release|Any CPU + {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|x86.ActiveCfg = Release|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|ARM.ActiveCfg = Debug|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|x64.ActiveCfg = Debug|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|x86.ActiveCfg = Debug|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Any CPU.Build.0 = Release|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|ARM.ActiveCfg = Release|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x64.ActiveCfg = Release|Any CPU + {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x86.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {94EE3919-19FA-4D9B-8DA9-249050B15232} = {2D6CAE62-D053-476F-9BDD-2B1F27FA9C5D} + {A6C3FFD3-16A5-44D3-8C1F-3613D6DD17D1} = {2D6CAE62-D053-476F-9BDD-2B1F27FA9C5D} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BAD6019D-4AF7-4E15-99A0-8036E16FC0E5} + EndGlobalSection + GlobalSection(TestCaseManagementSettings) = postSolution + CategoryFile = Renci.SshNet1.vsmdi + EndGlobalSection +EndGlobal diff --git a/src/Renci.SshNet/BaseClient.cs b/src/Renci.SshNet/BaseClient.cs index 4a962a6d..0b5e627f 100644 --- a/src/Renci.SshNet/BaseClient.cs +++ b/src/Renci.SshNet/BaseClient.cs @@ -327,7 +327,7 @@ namespace Renci.SshNet } } - #region IDisposable Members +#region IDisposable Members private bool _isDisposed; @@ -386,7 +386,7 @@ namespace Renci.SshNet Dispose(false); } - #endregion +#endregion /// /// Stops the keep-alive timer, and waits until all timer callbacks have been diff --git a/src/Renci.SshNet/Common/Extensions.cs b/src/Renci.SshNet/Common/Extensions.cs index b2c2e7d7..d4ce4dee 100644 --- a/src/Renci.SshNet/Common/Extensions.cs +++ b/src/Renci.SshNet/Common/Extensions.cs @@ -262,7 +262,7 @@ namespace Renci.SshNet.Common } /// - /// Pads with leading zeros if needd + /// Pads with leading zeros if needed. /// /// The data. /// The length to pad to. @@ -335,5 +335,34 @@ namespace Renci.SshNet.Common handle.Close(); } #endif // !FEATURE_WAITHANDLE_DISPOSE + +#if !FEATURE_HASHALGORITHM_DISPOSE + /// + /// Disposes the specified algorithm. + /// + /// The algorithm. + [DebuggerNonUserCode] + internal static void Dispose(this System.Security.Cryptography.HashAlgorithm algorithm) + { + if (algorithm == null) + throw new NullReferenceException(); + + algorithm.Clear(); + } +#endif // FEATURE_HASHALGORITHM_DISPOSE + +#if !FEATURE_STRINGBUILDER_CLEAR + /// + /// Clears the contents of the string builder. + /// + /// + /// The to clear. + /// + public static void Clear(this StringBuilder value) + { + value.Length = 0; + value.Capacity = 16; + } +#endif // !FEATURE_STRINGBUILDER_CLEAR } } diff --git a/src/Renci.SshNet/Properties/AssemblyInfo.cs b/src/Renci.SshNet/Properties/AssemblyInfo.cs index 805a316c..22e4125c 100644 --- a/src/Renci.SshNet/Properties/AssemblyInfo.cs +++ b/src/Renci.SshNet/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.InteropServices; using System.Runtime.CompilerServices; -[assembly: AssemblyTitle("SSH.NET .NET 4.0")] +[assembly: AssemblyTitle("SSH.NET")] [assembly: Guid("ad816c5e-6f13-4589-9f3e-59523f8b77a4")] [assembly: InternalsVisibleTo("Renci.SshNet.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f9194e1eb66b7e2575aaee115ee1d27bc100920e7150e43992d6f668f9737de8b9c7ae892b62b8a36dd1d57929ff1541665d101dc476d6e02390846efae7e5186eec409710fdb596e3f83740afef0d4443055937649bc5a773175b61c57615dac0f0fd10f52b52fedf76c17474cc567b3f7a79de95dde842509fb39aaf69c6c2")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index d44d10bb..b8efa8b4 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -1,626 +1,48 @@ - - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {2F5F8C90-0BD1-424F-997C-7BC6280919D1} - Library - Properties - Renci.SshNet + true + true + false Renci.SshNet - v4.0 - 512 - - - true - full - false - bin\Debug\ - TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA - prompt - 4 - bin\Debug\Renci.SshNet.xml - true + ../Renci.SshNet.snk 5 - - - none - true - bin\Release\ - FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA - prompt - 4 - bin\Release\Renci.SshNet.xml - - - true - 5 - - true + net35;net40;netstandard1.3;netstandard2.0 - - ..\Renci.SshNet.snk + + - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA + + + FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA + + + FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_TAP;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 + + + FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_ECDSA + + From 1f325586eb2d8996f3887b7247bacb7570ec1e6d Mon Sep 17 00:00:00 2001 From: drieseng Date: Sat, 29 Feb 2020 17:17:32 +0100 Subject: [PATCH 44/67] Remove unused code. --- .../BouncyCastle/security/DigestUtilities.cs | 58 ------------------- .../BouncyCastle/security/SecureRandom.cs | 39 +------------ 2 files changed, 3 insertions(+), 94 deletions(-) diff --git a/src/Renci.SshNet/Security/BouncyCastle/security/DigestUtilities.cs b/src/Renci.SshNet/Security/BouncyCastle/security/DigestUtilities.cs index a04ef5f4..06fbd9a6 100644 --- a/src/Renci.SshNet/Security/BouncyCastle/security/DigestUtilities.cs +++ b/src/Renci.SshNet/Security/BouncyCastle/security/DigestUtilities.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections; - -using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Digests; using Renci.SshNet.Security.Org.BouncyCastle.Crypto; -using Renci.SshNet.Security.Org.BouncyCastle.Utilities; -using System.Collections.Generic; namespace Renci.SshNet.Security.Org.BouncyCastle.Security { @@ -21,58 +15,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Security { } - private static readonly IDictionary algorithms = new Dictionary(); - private static readonly IDictionary oids = new Dictionary(); - - static DigestUtilities() - { - // Signal to obfuscation tools not to change enum constants - ((DigestAlgorithm)Enums.GetArbitraryValue(typeof(DigestAlgorithm))).ToString(); - - algorithms["SHA256"] = "SHA-256"; - algorithms["2.16.840.1.101.3.4.2.1"] = "SHA-256"; - } - - public static ICollection Algorithms - { - get { return oids.Keys; } - } - - public static IDigest GetDigest( - string algorithm) - { - string upper = algorithm.ToUpper(); - string mechanism = (string) algorithms[upper]; - - if (mechanism == null) - { - mechanism = upper; - } - - try - { - DigestAlgorithm digestAlgorithm = (DigestAlgorithm)Enums.GetEnumValue( - typeof(DigestAlgorithm), mechanism); - - switch (digestAlgorithm) - { - case DigestAlgorithm.SHA_256: return new Sha256Digest(); - } - } - catch (ArgumentException) - { - } - - throw new SecurityUtilityException("Digest " + mechanism + " not recognised."); - } - - public static byte[] CalculateDigest(string algorithm, byte[] input) - { - IDigest digest = GetDigest(algorithm); - digest.BlockUpdate(input, 0, input.Length); - return DoFinal(digest); - } - public static byte[] DoFinal( IDigest digest) { diff --git a/src/Renci.SshNet/Security/BouncyCastle/security/SecureRandom.cs b/src/Renci.SshNet/Security/BouncyCastle/security/SecureRandom.cs index f63412a2..377817e0 100644 --- a/src/Renci.SshNet/Security/BouncyCastle/security/SecureRandom.cs +++ b/src/Renci.SshNet/Security/BouncyCastle/security/SecureRandom.cs @@ -2,6 +2,7 @@ using System; using System.Threading; using Renci.SshNet.Security.Org.BouncyCastle.Crypto; +using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Digests; using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Prng; using Renci.SshNet.Security.Org.BouncyCastle.Utilities; @@ -23,11 +24,8 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Security get { return master; } } - private static DigestRandomGenerator CreatePrng(string digestName, bool autoSeed) + private static DigestRandomGenerator CreatePrng(IDigest digest, bool autoSeed) { - IDigest digest = DigestUtilities.GetDigest(digestName); - if (digest == null) - return null; DigestRandomGenerator prng = new DigestRandomGenerator(digest); if (autoSeed) { @@ -44,41 +42,10 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Security return result; } - /// - /// Create and auto-seed an instance based on the given algorithm. - /// - /// Equivalent to GetInstance(algorithm, true) - /// e.g. "SHA256PRNG" - public static SecureRandom GetInstance(string algorithm) - { - return GetInstance(algorithm, true); - } - - /// - /// Create an instance based on the given algorithm, with optional auto-seeding - /// - /// e.g. "SHA256PRNG" - /// If true, the instance will be auto-seeded. - public static SecureRandom GetInstance(string algorithm, bool autoSeed) - { - string upper = algorithm.ToUpper(); - if (upper.EndsWith("PRNG")) - { - string digestName = upper.Substring(0, upper.Length - "PRNG".Length); - DigestRandomGenerator prng = CreatePrng(digestName, autoSeed); - if (prng != null) - { - return new SecureRandom(prng); - } - } - - throw new ArgumentException("Unrecognised PRNG algorithm: " + algorithm, "algorithm"); - } - protected readonly IRandomGenerator generator; public SecureRandom() - : this(CreatePrng("SHA256", true)) + : this(CreatePrng(new Sha256Digest(), true)) { } From c9d6ca4b3306bd5dc4fbb4721116d7b8289159bf Mon Sep 17 00:00:00 2001 From: drieseng Date: Sat, 29 Feb 2020 17:19:55 +0100 Subject: [PATCH 45/67] Remove unused code. --- .../Security/BouncyCastle/util/Enums.cs | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 src/Renci.SshNet/Security/BouncyCastle/util/Enums.cs diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/Enums.cs b/src/Renci.SshNet/Security/BouncyCastle/util/Enums.cs deleted file mode 100644 index 117abef0..00000000 --- a/src/Renci.SshNet/Security/BouncyCastle/util/Enums.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; - -namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities -{ - internal abstract class Enums - { - internal static Enum GetEnumValue(System.Type enumType, string s) - { - // We only want to parse single named constants - if (s.Length > 0 && char.IsLetter(s[0]) && s.IndexOf(',') < 0) - { - s = s.Replace('-', '_'); - s = s.Replace('/', '_'); - return (Enum)Enum.Parse(enumType, s, false); - } - - throw new ArgumentException(); - } - - internal static Array GetEnumValues(System.Type enumType) - { - return Enum.GetValues(enumType); - } - - internal static Enum GetArbitraryValue(System.Type enumType) - { - Array values = GetEnumValues(enumType); - int pos = (int)(int.MaxValue) % values.Length; - return (Enum)values.GetValue(pos); - } - } -} From 19708c9daa8e086a1c2e36c715444dd0facfdb26 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sat, 29 Feb 2020 17:23:51 +0100 Subject: [PATCH 46/67] Fix CLS compliance warnings. --- src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs | 7 ------- src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs | 2 -- 2 files changed, 9 deletions(-) diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs b/src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs index 87ffa307..3e894754 100644 --- a/src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs +++ b/src/Renci.SshNet/Security/BouncyCastle/util/Arrays.cs @@ -110,7 +110,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return HaveSameContents(a, b); } - [CLSCompliantAttribute(false)] public static bool AreEqual(uint[] a, uint[] b) { if (a == b) @@ -288,7 +287,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return hc; } - [CLSCompliantAttribute(false)] public static int GetHashCode(uint[] data) { if (data == null) @@ -306,7 +304,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return hc; } - [CLSCompliantAttribute(false)] public static int GetHashCode(uint[] data, int off, int len) { if (data == null) @@ -324,7 +321,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return hc; } - [CLSCompliantAttribute(false)] public static int GetHashCode(ulong[] data) { if (data == null) @@ -345,7 +341,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return hc; } - [CLSCompliantAttribute(false)] public static int GetHashCode(ulong[] data, int off, int len) { if (data == null) @@ -404,14 +399,12 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return data == null ? null : (long[])data.Clone(); } - [CLSCompliantAttribute(false)] public static ulong[] Clone( ulong[] data) { return data == null ? null : (ulong[]) data.Clone(); } - [CLSCompliantAttribute(false)] public static ulong[] Clone( ulong[] data, ulong[] existing) diff --git a/src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs b/src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs index a5c53ac8..29a858cc 100644 --- a/src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs +++ b/src/Renci.SshNet/Security/BouncyCastle/util/Integers.cs @@ -9,7 +9,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return (i << distance) ^ (int)((uint)i >> -distance); } - [CLSCompliantAttribute(false)] public static uint RotateLeft(uint i, int distance) { return (i << distance) ^ (i >> -distance); @@ -20,7 +19,6 @@ namespace Renci.SshNet.Security.Org.BouncyCastle.Utilities return (int)((uint)i >> distance) ^ (i << -distance); } - [CLSCompliantAttribute(false)] public static uint RotateRight(uint i, int distance) { return (i >> distance) ^ (i << -distance); From a5f0933ab03433ae1fc96d8a936352d5be6e710a Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sat, 29 Feb 2020 17:24:24 +0100 Subject: [PATCH 47/67] Remove obsolete extension methods. --- .../Common/Extensions.SilverlightShared.cs | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 src/Renci.SshNet.Silverlight/Common/Extensions.SilverlightShared.cs diff --git a/src/Renci.SshNet.Silverlight/Common/Extensions.SilverlightShared.cs b/src/Renci.SshNet.Silverlight/Common/Extensions.SilverlightShared.cs deleted file mode 100644 index c69e7c4f..00000000 --- a/src/Renci.SshNet.Silverlight/Common/Extensions.SilverlightShared.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Net.Sockets; -using System.Threading; -using System.Security.Cryptography; -using System.Diagnostics; - -namespace Renci.SshNet.Common -{ - /// - /// Collection of different extension method specific for Silverlight - /// - internal static partial class Extensions - { - /// - /// Disposes the specified socket. - /// - /// The socket. - [DebuggerNonUserCode] - internal static void Dispose(this Socket socket) - { - if (socket == null) - throw new NullReferenceException(); - - socket.Close(); - } - - /// - /// Disposes the specified handle. - /// - /// The handle. - [DebuggerNonUserCode] - internal static void Dispose(this WaitHandle handle) - { - if (handle == null) - throw new NullReferenceException(); - - handle.Close(); - } - - /// - /// Disposes the specified algorithm. - /// - /// The algorithm. - [DebuggerNonUserCode] - internal static void Dispose(this HashAlgorithm algorithm) - { - if (algorithm == null) - throw new NullReferenceException(); - - algorithm.Clear(); - } - } -} From ce4cee254c2b2d97987e0e8f4c984b3ca1051ff8 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sat, 29 Feb 2020 17:25:07 +0100 Subject: [PATCH 48/67] Remove obsolete and SDK-style projects from solution. --- src/Renci.SshNet.VS2012.sln | 64 ------------------------------------- src/Renci.SshNet.VS2015.sln | 64 ------------------------------------- 2 files changed, 128 deletions(-) diff --git a/src/Renci.SshNet.VS2012.sln b/src/Renci.SshNet.VS2012.sln index 394ac252..a80b1908 100644 --- a/src/Renci.SshNet.VS2012.sln +++ b/src/Renci.SshNet.VS2012.sln @@ -1,16 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet", "Renci.SshNet\Renci.SshNet.csproj", "{2F5F8C90-0BD1-424F-997C-7BC6280919D1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Tests", "Renci.SshNet.Tests\Renci.SshNet.Tests.csproj", "{C45379B9-17B1-4E89-BC2E-6D41726413E8}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Silverlight", "Renci.SshNet.Silverlight\Renci.SshNet.Silverlight.csproj", "{77C294BB-1DC2-49DC-BE16-963F8F22794D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.NET35", "Renci.SshNet.NET35\Renci.SshNet.NET35.csproj", "{DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Tests.NET35", "Renci.SshNet.Tests.NET35\Renci.SshNet.Tests.NET35.csproj", "{007CE8B3-7827-4AD0-AACD-860505638ABE}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.WindowsPhone", "Renci.SshNet.WindowsPhone\Renci.SshNet.WindowsPhone.csproj", "{3AD3EDF0-702E-4A91-8735-DCE4659AA54C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Silverlight5", "Renci.SshNet.Silverlight5\Renci.SshNet.Silverlight5.csproj", "{E367F791-C1EC-4181-912A-2943CAC6B3BC}" @@ -49,34 +41,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|ARM.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|x64.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|x86.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Any CPU.Build.0 = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|ARM.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|x64.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|x86.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|ARM.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|x64.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|x86.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Any CPU.Build.0 = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|ARM.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x64.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x86.ActiveCfg = Release|Any CPU {77C294BB-1DC2-49DC-BE16-963F8F22794D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {77C294BB-1DC2-49DC-BE16-963F8F22794D}.Debug|Any CPU.Build.0 = Debug|Any CPU {77C294BB-1DC2-49DC-BE16-963F8F22794D}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -91,34 +55,6 @@ Global {77C294BB-1DC2-49DC-BE16-963F8F22794D}.Release|Mixed Platforms.Build.0 = Release|Any CPU {77C294BB-1DC2-49DC-BE16-963F8F22794D}.Release|x64.ActiveCfg = Release|Any CPU {77C294BB-1DC2-49DC-BE16-963F8F22794D}.Release|x86.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|ARM.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|x64.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Any CPU.Build.0 = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|ARM.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|x64.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|x86.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|ARM.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|x64.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|x86.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Any CPU.Build.0 = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|ARM.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|x64.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|x86.ActiveCfg = Release|Any CPU {3AD3EDF0-702E-4A91-8735-DCE4659AA54C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3AD3EDF0-702E-4A91-8735-DCE4659AA54C}.Debug|Any CPU.Build.0 = Debug|Any CPU {3AD3EDF0-702E-4A91-8735-DCE4659AA54C}.Debug|ARM.ActiveCfg = Debug|Any CPU diff --git a/src/Renci.SshNet.VS2015.sln b/src/Renci.SshNet.VS2015.sln index 56a14c91..81fa7155 100644 --- a/src/Renci.SshNet.VS2015.sln +++ b/src/Renci.SshNet.VS2015.sln @@ -18,14 +18,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandcastle", "sandcastle", ..\build\sandcastle\SSH.NET.shfbproj = ..\build\sandcastle\SSH.NET.shfbproj EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet", "Renci.SshNet\Renci.SshNet.csproj", "{2F5F8C90-0BD1-424F-997C-7BC6280919D1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Tests", "Renci.SshNet.Tests\Renci.SshNet.Tests.csproj", "{C45379B9-17B1-4E89-BC2E-6D41726413E8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.NET35", "Renci.SshNet.NET35\Renci.SshNet.NET35.csproj", "{DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Tests.NET35", "Renci.SshNet.Tests.NET35\Renci.SshNet.Tests.NET35.csproj", "{007CE8B3-7827-4AD0-AACD-860505638ABE}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.Silverlight5", "Renci.SshNet.Silverlight5\Renci.SshNet.Silverlight5.csproj", "{E367F791-C1EC-4181-912A-2943CAC6B3BC}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Renci.SshNet.WindowsPhone8", "Renci.SshNet.WindowsPhone8\Renci.SshNet.WindowsPhone8.csproj", "{4A6CA785-1C8A-47FE-98C0-30C675A9328B}" @@ -54,62 +46,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|ARM.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|x64.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Debug|x86.ActiveCfg = Debug|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Any CPU.Build.0 = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|ARM.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|x64.ActiveCfg = Release|Any CPU - {2F5F8C90-0BD1-424F-997C-7BC6280919D1}.Release|x86.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|ARM.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|x64.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Debug|x86.ActiveCfg = Debug|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Any CPU.Build.0 = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|ARM.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x64.ActiveCfg = Release|Any CPU - {C45379B9-17B1-4E89-BC2E-6D41726413E8}.Release|x86.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|ARM.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|x64.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Any CPU.Build.0 = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|ARM.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|x64.ActiveCfg = Release|Any CPU - {DD1C552F-7F48-4269-ABB3-2E4C89B7E43A}.Release|x86.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|ARM.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|x64.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Debug|x86.ActiveCfg = Debug|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Any CPU.Build.0 = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|ARM.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|x64.ActiveCfg = Release|Any CPU - {007CE8B3-7827-4AD0-AACD-860505638ABE}.Release|x86.ActiveCfg = Release|Any CPU {E367F791-C1EC-4181-912A-2943CAC6B3BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E367F791-C1EC-4181-912A-2943CAC6B3BC}.Debug|Any CPU.Build.0 = Debug|Any CPU {E367F791-C1EC-4181-912A-2943CAC6B3BC}.Debug|ARM.ActiveCfg = Debug|Any CPU From a8b8bb95ec01bbe5f735692510dd4002fc1781c7 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sat, 29 Feb 2020 17:37:43 +0100 Subject: [PATCH 49/67] Sync legacy project files. --- .../Renci.SshNet.Silverlight.csproj | 424 ++++++++++++++++- .../Renci.SshNet.Silverlight5.csproj | 8 +- .../Renci.SshNet.UAP10.csproj | 6 +- .../Renci.SshNet.WindowsPhone.csproj | 426 +++++++++++++++++- .../Renci.SshNet.WindowsPhone8.csproj | 8 +- 5 files changed, 851 insertions(+), 21 deletions(-) diff --git a/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj b/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj index 16c95635..8e579ab1 100644 --- a/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj +++ b/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj @@ -593,12 +593,411 @@ Security\Algorithm.cs + + Security\Cryptography\BouncyCastle\asn1\sec\SECNamedCurves.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9Curve.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParameters.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParametersHolder.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECPoint.cs + + + Security\Cryptography\BouncyCastle\crypto\agreement\ECDHCBasicAgreement.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricCipherKeyPair.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricKeyParameter.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\GeneralDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\Sha256Digest.cs + + + Security\Cryptography\BouncyCastle\crypto\generators\ECKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IAsymmetricCipherKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\KeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECDomainParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPrivateKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPublicKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\CryptoApiRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\DigestRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\IRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\util\Pack.cs + + + Security\Cryptography\BouncyCastle\math\BigInteger.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\SimpleBigDecimal.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\Tnaf.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\ZTauElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECAlgorithms.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECCurve.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECFieldElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECLookupTable.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPoint.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPointMap.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\ECEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\GlvEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\LongArray.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\AbstractECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointCombMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\GlvMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\IPreCompCallback.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\PreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ValidityPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafL2RMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\field\FiniteFields.cs + + + Security\Cryptography\BouncyCastle\math\field\GenericPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\GF2Polynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\IFiniteField.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\PrimeField.cs + + + Security\Cryptography\BouncyCastle\math\raw\Mod.cs + + + Security\Cryptography\BouncyCastle\math\raw\Nat.cs + + + Security\Cryptography\BouncyCastle\security\DigestUtilities.cs + + + Security\Cryptography\BouncyCastle\security\SecureRandom.cs + + + Security\Cryptography\BouncyCastle\security\SecurityUtilityException.cs + + + Security\Cryptography\BouncyCastle\util\Arrays.cs + + + Security\Cryptography\BouncyCastle\util\BigIntegers.cs + + + Security\Cryptography\BouncyCastle\util\encoders\Hex.cs + + + Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs + + + Security\Cryptography\BouncyCastle\util\IMemoable.cs + + + Security\Cryptography\BouncyCastle\util\Integers.cs + + + Security\Cryptography\BouncyCastle\util\MemoableResetException.cs + + + Security\Cryptography\BouncyCastle\util\Times.cs + Security\CertificateHostAlgorithm.cs + + Security\Cryptography\Chaos.NaCl\CryptoBytes.cs + + + Security\Cryptography\Chaos.NaCl\Ed25519.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array16.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array8.cs + + + Security\Cryptography\Chaos.NaCl\Internal\ByteIntegerConverter.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cmov.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cswap.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_invert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnegative.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnonzero.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul121666.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_neg.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_pow22523.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\FieldElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_double_scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_madd.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_msub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p3.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_cached.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_precomp_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_scalarmult_base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\GroupElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\keypair.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\open.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_clamp.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_mul_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_reduce.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sign.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sqrtm1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\InternalAssert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Poly1305Donna.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\Salsa20.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\SalsaCore.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Sha512Internal.cs + + + Security\Cryptography\Chaos.NaCl\MontgomeryCurve25519.cs + + + Security\Cryptography\Chaos.NaCl\Sha512.cs + Security\Cryptography\AsymmetricCipher.cs + + Security\Cryptography\Bcrypt.cs + Security\Cryptography\BlockCipher.cs @@ -668,6 +1067,12 @@ Security\Cryptography\DsaKey.cs + + Security\Cryptography\ED25519DigitalSignature.cs + + + Security\Cryptography\ED25519Key.cs + Security\Cryptography\HMACMD5.cs @@ -731,6 +1136,24 @@ Security\KeyExchangeDiffieHellmanGroupSha1.cs + + Security\KeyExchangeEC.cs + + + Security\KeyExchangeECCurve25519.cs + + + Security\KeyExchangeECDH.cs + + + Security\KeyExchangeECDH256.cs + + + Security\KeyExchangeECDH384.cs + + + Security\KeyExchangeECDH521.cs + Security\KeyHostAlgorithm.cs @@ -944,7 +1367,6 @@ SubsystemSession.cs - Properties\CommonAssemblyInfo.cs diff --git a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj index 2523a02f..b65b7ba6 100644 --- a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj +++ b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj @@ -200,9 +200,6 @@ Common\Extensions.cs - - Common\Extensions.SilverlightShared.cs - Common\HostKeyEventArgs.cs @@ -803,9 +800,6 @@ Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs - - Security\Cryptography\BouncyCastle\util\Enums.cs - Security\Cryptography\BouncyCastle\util\IMemoable.cs @@ -1406,4 +1400,4 @@ --> - + \ No newline at end of file diff --git a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj index d1b874f4..ac0b5dd2 100644 --- a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj +++ b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj @@ -23,7 +23,7 @@ full false bin\Debug\ - TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;DEBUG;FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII prompt 4 bin\Debug\Renci.SshNet.xml @@ -34,7 +34,7 @@ pdbonly true bin\Release\ - TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII prompt 4 bin\Release\Renci.SshNet.xml @@ -1466,4 +1466,4 @@ --> - + \ No newline at end of file diff --git a/src/Renci.SshNet.WindowsPhone/Renci.SshNet.WindowsPhone.csproj b/src/Renci.SshNet.WindowsPhone/Renci.SshNet.WindowsPhone.csproj index d5d155ab..61abd53a 100644 --- a/src/Renci.SshNet.WindowsPhone/Renci.SshNet.WindowsPhone.csproj +++ b/src/Renci.SshNet.WindowsPhone/Renci.SshNet.WindowsPhone.csproj @@ -182,9 +182,6 @@ Common\Extensions.cs - - Common\Extensions.cs - Common\HostKeyEventArgs.cs @@ -584,12 +581,411 @@ Security\Algorithm.cs + + Security\Cryptography\BouncyCastle\asn1\sec\SECNamedCurves.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9Curve.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParameters.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECParametersHolder.cs + + + Security\Cryptography\BouncyCastle\asn1\x9\X9ECPoint.cs + + + Security\Cryptography\BouncyCastle\crypto\agreement\ECDHCBasicAgreement.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricCipherKeyPair.cs + + + Security\Cryptography\BouncyCastle\crypto\AsymmetricKeyParameter.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\GeneralDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\digests\Sha256Digest.cs + + + Security\Cryptography\BouncyCastle\crypto\generators\ECKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IAsymmetricCipherKeyPairGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\IDigest.cs + + + Security\Cryptography\BouncyCastle\crypto\KeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECDomainParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyGenerationParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPrivateKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\parameters\ECPublicKeyParameters.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\CryptoApiRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\DigestRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\prng\IRandomGenerator.cs + + + Security\Cryptography\BouncyCastle\crypto\util\Pack.cs + + + Security\Cryptography\BouncyCastle\math\BigInteger.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\SimpleBigDecimal.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\Tnaf.cs + + + Security\Cryptography\BouncyCastle\math\ec\abc\ZTauElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECAlgorithms.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECCurve.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECFieldElement.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECLookupTable.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPoint.cs + + + Security\Cryptography\BouncyCastle\math\ec\ECPointMap.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\ECEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\endo\GlvEndomorphism.cs + + + Security\Cryptography\BouncyCastle\math\ec\LongArray.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\AbstractECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ECMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointCombMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\FixedPointUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\GlvMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\IPreCompCallback.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\PreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\ValidityPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafL2RMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WNafUtilities.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafMultiplier.cs + + + Security\Cryptography\BouncyCastle\math\ec\multiplier\WTauNafPreCompInfo.cs + + + Security\Cryptography\BouncyCastle\math\field\FiniteFields.cs + + + Security\Cryptography\BouncyCastle\math\field\GenericPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\GF2Polynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\IFiniteField.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomial.cs + + + Security\Cryptography\BouncyCastle\math\field\IPolynomialExtensionField.cs + + + Security\Cryptography\BouncyCastle\math\field\PrimeField.cs + + + Security\Cryptography\BouncyCastle\math\raw\Mod.cs + + + Security\Cryptography\BouncyCastle\math\raw\Nat.cs + + + Security\Cryptography\BouncyCastle\security\DigestUtilities.cs + + + Security\Cryptography\BouncyCastle\security\SecureRandom.cs + + + Security\Cryptography\BouncyCastle\security\SecurityUtilityException.cs + + + Security\Cryptography\BouncyCastle\util\Arrays.cs + + + Security\Cryptography\BouncyCastle\util\BigIntegers.cs + + + Security\Cryptography\BouncyCastle\util\encoders\Hex.cs + + + Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs + + + Security\Cryptography\BouncyCastle\util\IMemoable.cs + + + Security\Cryptography\BouncyCastle\util\Integers.cs + + + Security\Cryptography\BouncyCastle\util\MemoableResetException.cs + + + Security\Cryptography\BouncyCastle\util\Times.cs + Security\CertificateHostAlgorithm.cs + + Security\Cryptography\Chaos.NaCl\CryptoBytes.cs + + + Security\Cryptography\Chaos.NaCl\Ed25519.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array16.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Array8.cs + + + Security\Cryptography\Chaos.NaCl\Internal\ByteIntegerConverter.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\base2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\d2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cmov.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_cswap.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_invert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnegative.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_isnonzero.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_mul121666.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_neg.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_pow22523.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sq2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\fe_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\FieldElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_double_scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_frombytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_madd.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_msub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p1p1_to_p3.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p2_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_dbl.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_cached.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_p3_to_p2.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_precomp_0.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_scalarmult_base.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_sub.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\ge_tobytes.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\GroupElement.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\keypair.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\open.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_clamp.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_mul_add.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sc_reduce.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sign.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Ed25519Ref10\sqrtm1.cs + + + Security\Cryptography\Chaos.NaCl\Internal\InternalAssert.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Poly1305Donna.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\Salsa20.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Salsa\SalsaCore.cs + + + Security\Cryptography\Chaos.NaCl\Internal\Sha512Internal.cs + + + Security\Cryptography\Chaos.NaCl\MontgomeryCurve25519.cs + + + Security\Cryptography\Chaos.NaCl\Sha512.cs + Security\Cryptography\AsymmetricCipher.cs + + Security\Cryptography\Bcrypt.cs + Security\Cryptography\BlockCipher.cs @@ -656,6 +1052,12 @@ Security\Cryptography\DsaKey.cs + + Security\Cryptography\ED25519DigitalSignature.cs + + + Security\Cryptography\ED25519Key.cs + Security\Cryptography\HMACMD5.cs @@ -719,6 +1121,24 @@ Security\KeyExchangeDiffieHellmanGroupSha1.cs + + Security\KeyExchangeEC.cs + + + Security\KeyExchangeECCurve25519.cs + + + Security\KeyExchangeECDH.cs + + + Security\KeyExchangeECDH256.cs + + + Security\KeyExchangeECDH384.cs + + + Security\KeyExchangeECDH521.cs + Security\KeyHostAlgorithm.cs diff --git a/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj b/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj index 7a915c18..2588e917 100644 --- a/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj +++ b/src/Renci.SshNet.WindowsPhone8/Renci.SshNet.WindowsPhone8.csproj @@ -223,9 +223,6 @@ Common\Extensions.cs - - Common\Extensions.cs - Common\HostKeyEventArgs.cs @@ -832,9 +829,6 @@ Security\Cryptography\BouncyCastle\util\encoders\HexEncoder.cs - - Security\Cryptography\BouncyCastle\util\Enums.cs - Security\Cryptography\BouncyCastle\util\IMemoable.cs @@ -1439,4 +1433,4 @@ --> - + \ No newline at end of file From facdf115c31b272ae0732e28be814a18d8d9e17c Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sat, 29 Feb 2020 17:38:04 +0100 Subject: [PATCH 50/67] Formatting. --- src/Renci.SshNet/Common/Extensions.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Renci.SshNet/Common/Extensions.cs b/src/Renci.SshNet/Common/Extensions.cs index d4ce4dee..17d72d7f 100644 --- a/src/Renci.SshNet/Common/Extensions.cs +++ b/src/Renci.SshNet/Common/Extensions.cs @@ -353,11 +353,9 @@ namespace Renci.SshNet.Common #if !FEATURE_STRINGBUILDER_CLEAR /// - /// Clears the contents of the string builder. + /// Clears the contents of the string builder. /// - /// - /// The to clear. - /// + /// The to clear. public static void Clear(this StringBuilder value) { value.Length = 0; From bc59db5ff4209b0be1fcdc8f89558991ffe0df16 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Fri, 6 Mar 2020 19:57:26 +0100 Subject: [PATCH 51/67] Avoid autolink --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eaf0b3e5..cd395b9d 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ This project was inspired by **Sharp.SSH** library which was ported from java an **SSH.NET** supports the following key exchange methods: * curve25519-sha256 -* curve25519-sha256@libssh.org +* curve25519-sha256@libssh.org * ecdh-sha2-nistp256 * ecdh-sha2-nistp384 * ecdh-sha2-nistp521 @@ -94,7 +94,7 @@ Private keys can be encrypted using one of the following cipher methods: * hmac-sha2-512 * hmac-sha2-512-96 * hmac-ripemd160 -* hmac-ripemd160@openssh.com +* hmac-ripemd160@openssh.com ## Framework Support **SSH.NET** supports the following target frameworks: From c2e929d60161d0d9c1db7bf6a4c912674017a1c1 Mon Sep 17 00:00:00 2001 From: drieseng Date: Fri, 6 Mar 2020 22:09:50 +0100 Subject: [PATCH 52/67] Use multi-TFM output directory for .NET Framework 4.0. --- build/sandcastle/SSH.NET.shfbproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/sandcastle/SSH.NET.shfbproj b/build/sandcastle/SSH.NET.shfbproj index dbd43088..50141f16 100644 --- a/build/sandcastle/SSH.NET.shfbproj +++ b/build/sandcastle/SSH.NET.shfbproj @@ -41,8 +41,8 @@ - - + + Summary, Parameter, Returns, AutoDocumentCtors, TypeParameter, AutoDocumentDispose OnlyWarningsAndErrors From 93f092ce2c4576911de1eb4a174017b3f5ed332a Mon Sep 17 00:00:00 2001 From: drieseng Date: Fri, 6 Mar 2020 22:19:20 +0100 Subject: [PATCH 53/67] Split build into modern and classic targets to allow building both "flavors" on separate machines. This is done since I only have a VM for building the "classic" projects, and I build the "modern" projects on my main development box. Use tokens for replacing the version and copyright in the nuspec. --- build/build.proj | 262 ++++++++++++++++++++++++------------- build/nuget/SSH.NET.nuspec | 6 +- 2 files changed, 173 insertions(+), 95 deletions(-) diff --git a/build/build.proj b/build/build.proj index 065a0070..fd5a96ed 100644 --- a/build/build.proj +++ b/build/build.proj @@ -1,5 +1,5 @@ - + Release @@ -8,136 +8,214 @@ MSBuildTasks 1.5.0.214 + - + $(MSBuildThisFileDirectory)..\src\Renci.SshNet.VS2012.sln 14.0 14.0 - - + + $(MSBuildThisFileDirectory)..\src\Renci.SshNet.VS2015.sln 14.0 14.0 - - - $(MSBuildThisFileDirectory)..\src\Renci.SshNet.VS2017.sln - 15.0 - 15.0 - + + - - Renci.SshNet.NET35\bin\$(Configuration) - net35 - - - Renci.SshNet\bin\$(Configuration) - net40 - - - Renci.SshNet.NETCore\bin\$(Configuration)\netstandard1.3 - netstandard1.3 - - - Renci.SshNet.NETCore\bin\$(Configuration)\netstandard2.0 - netstandard2.0 - - + + $(MSBuildThisFileDirectory)..\src\Renci.SshNet.VS2019.sln + 16.0 + + + + + Renci.SshNet.WindowsPhone\bin\$(Configuration) wp71 - - + + Renci.SshNet.WindowsPhone8\bin\$(Configuration) wp8 - - + + Renci.SshNet.Silverlight\bin\$(Configuration) sl4 - - + + Renci.SshNet.Silverlight5\bin\$(Configuration) sl5 - - + + Renci.SshNet.UAP10\bin\$(Configuration) uap10 - + - + + + + Renci.SshNet\bin\$(Configuration)\net35 + net35 + + + Renci.SshNet\bin\$(Configuration)\net40 + net40 + + + Renci.SshNet\bin\$(Configuration)\netstandard1.3 + netstandard1.3 + + + Renci.SshNet\bin\$(Configuration)\netstandard2.0 + netstandard2.0 + + + + - - + + + + + + - - Configuration=Release;VisualStudioVersion=%(VisualStudioVersion.VisualStudioVersion) + + Configuration=Release;VisualStudioVersion=%(VisualStudioVersionClassic.VisualStudioVersion) - + + + + + + + Configuration=Release;VisualStudioVersion=%(VisualStudioVersionModern.VisualStudioVersion) + + + + + + + + + + + + + + + + + + + + Configuration=Release;VisualStudioVersion=%(VisualStudioVersionClassic.VisualStudioVersion) + + + + + + + + + + Configuration=Release;VisualStudioVersion=%(VisualStudioVersionModern.VisualStudioVersion) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - Configuration=Release;VisualStudioVersion=%(VisualStudioVersion.VisualStudioVersion) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + $(MSBuildThisFileDirectory)target\nuget-$(ReleaseVersion) + + + + + + $(MSBuildThisFileDirectory)target\bin-$(ReleaseVersion) + + +
    diff --git a/build/nuget/SSH.NET.nuspec b/build/nuget/SSH.NET.nuspec index a3520842..03830583 100644 --- a/build/nuget/SSH.NET.nuspec +++ b/build/nuget/SSH.NET.nuspec @@ -2,7 +2,7 @@ SSH.NET - 2017.0.0-beta1 + $version$ SSH.NET Renci olegkap,drieseng @@ -10,9 +10,9 @@ https://github.com/sshnet/SSH.NET/ false SSH.NET is a Secure Shell (SSH) library for .NET, optimized for parallelism and with broad framework support. - https://github.com/sshnet/SSH.NET/releases/tag/2017.0.0-beta1 + https://github.com/sshnet/SSH.NET/releases/tag/$version$ A Secure Shell (SSH) library for .NET, optimized for parallelism. - 2012-2017, RENCI + $copyright$ en-US ssh scp sftp From c0da2c14fb133637245ed30cb029c1d2f95a0c4a Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 15 Mar 2020 15:56:09 +0100 Subject: [PATCH 54/67] Make key exchange more efficient by using byte[] in our internal structures, and convert to BigInteger when necessary. Fixes #643. Introduce base classes for DiffieHelman group key exchange. Eliminate code duplication. --- src/Renci.SshNet/Common/Extensions.cs | 15 ++ src/Renci.SshNet/ConnectionInfo.cs | 2 - .../KeyExchangeDhGroupExchangeInit.cs | 21 +-- .../KeyExchangeDhGroupExchangeReply.cs | 13 +- .../Transport/KeyExchangeDhInitMessage.cs | 21 +-- .../Transport/KeyExchangeDhReplyMessage.cs | 17 +- src/Renci.SshNet/Renci.SshNet.csproj | 1 - .../Security/GroupExchangeHashData.cs | 33 +--- src/Renci.SshNet/Security/KeyExchange.cs | 53 ++---- .../Security/KeyExchangeDiffieHellman.cs | 16 +- ...yExchangeDiffieHellmanGroupExchangeSha1.cs | 19 +- ...changeDiffieHellmanGroupExchangeShaBase.cs | 9 +- .../KeyExchangeDiffieHellmanGroupSha1.cs | 171 +----------------- .../KeyExchangeDiffieHellmanGroupSha256.cs | 36 ++++ .../KeyExchangeDiffieHellmanGroupSha512.cs | 36 ++++ .../KeyExchangeDiffieHellmanGroupShaBase.cs | 83 +++++++++ src/Renci.SshNet/Security/KeyExchangeEC.cs | 119 ++---------- .../Security/KeyExchangeECCurve25519.cs | 5 +- src/Renci.SshNet/Security/KeyExchangeECDH.cs | 5 +- src/Renci.SshNet/Security/KeyExchangeHash.cs | 84 +++++++++ 20 files changed, 361 insertions(+), 398 deletions(-) create mode 100644 src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha256.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha512.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupShaBase.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeHash.cs diff --git a/src/Renci.SshNet/Common/Extensions.cs b/src/Renci.SshNet/Common/Extensions.cs index d4ce4dee..8989b932 100644 --- a/src/Renci.SshNet/Common/Extensions.cs +++ b/src/Renci.SshNet/Common/Extensions.cs @@ -72,6 +72,21 @@ namespace Renci.SshNet.Common return new BigInteger(reversed.Reverse()); } + /// + /// Initializes a new instance of the structure using the SSH BigNum2 Format + /// + public static byte[] ToBigNum2(this byte[] data) + { + if ((data[0] & (1 << 7)) != 0) + { + var buf = new byte[data.Length + 1]; + Buffer.BlockCopy(data, 0, buf, 1, data.Length); + data = buf; + } + + return data; + } + /// /// Initializes a new instance of the structure using the SSH BigNum2 Format /// diff --git a/src/Renci.SshNet/ConnectionInfo.cs b/src/Renci.SshNet/ConnectionInfo.cs index d76882c2..d4a4c9a1 100644 --- a/src/Renci.SshNet/ConnectionInfo.cs +++ b/src/Renci.SshNet/ConnectionInfo.cs @@ -331,8 +331,6 @@ namespace Renci.SshNet {"diffie-hellman-group-exchange-sha1", typeof (KeyExchangeDiffieHellmanGroupExchangeSha1)}, {"diffie-hellman-group14-sha1", typeof (KeyExchangeDiffieHellmanGroup14Sha1)}, {"diffie-hellman-group1-sha1", typeof (KeyExchangeDiffieHellmanGroup1Sha1)}, - //"gss-group1-sha1-toWM5Slw5Ew8Mqkay+al2g==" - WinSSHD - //"gss-gex-sha1-toWM5Slw5Ew8Mqkay+al2g==" - WinSSHD }; Encryptions = new Dictionary diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs index be2d9c01..c8af4724 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs @@ -1,6 +1,4 @@ -using Renci.SshNet.Common; - -namespace Renci.SshNet.Messages.Transport +namespace Renci.SshNet.Messages.Transport { /// /// Represents SSH_MSG_KEX_DH_GEX_INIT message. @@ -8,15 +6,10 @@ namespace Renci.SshNet.Messages.Transport [Message("SSH_MSG_KEX_DH_GEX_INIT", 32)] internal class KeyExchangeDhGroupExchangeInit : Message, IKeyExchangedAllowed { - private byte[] _eBytes; - /// /// Gets the E value. /// - public BigInteger E - { - get { return _eBytes.ToBigInteger(); } - } + public byte[] E { get; private set; } /// /// Gets the size of the message in bytes. @@ -30,7 +23,7 @@ namespace Renci.SshNet.Messages.Transport { var capacity = base.BufferCapacity; capacity += 4; // E length - capacity += _eBytes.Length; // E + capacity += E.Length; // E return capacity; } } @@ -39,9 +32,9 @@ namespace Renci.SshNet.Messages.Transport /// Initializes a new instance of the class. /// /// The client exchange value. - public KeyExchangeDhGroupExchangeInit(BigInteger clientExchangeValue) + public KeyExchangeDhGroupExchangeInit(byte[] clientExchangeValue) { - _eBytes = clientExchangeValue.ToByteArray().Reverse(); + E = clientExchangeValue; } /// @@ -49,7 +42,7 @@ namespace Renci.SshNet.Messages.Transport /// protected override void LoadData() { - _eBytes = ReadBinary(); + E = ReadBinary(); } /// @@ -57,7 +50,7 @@ namespace Renci.SshNet.Messages.Transport /// protected override void SaveData() { - WriteBinaryString(_eBytes); + WriteBinaryString(E); } internal override void Process(Session session) diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs index 8caa1244..88bad74e 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs @@ -10,8 +10,6 @@ namespace Renci.SshNet.Messages.Transport { internal const byte MessageNumber = 33; - private byte[] _fBytes; - /// /// Gets server public host key and certificates /// @@ -21,10 +19,7 @@ namespace Renci.SshNet.Messages.Transport /// /// Gets the F value. /// - public BigInteger F - { - get { return _fBytes.ToBigInteger(); } - } + public byte[] F { get; private set; } /// /// Gets the signature of H. @@ -46,7 +41,7 @@ namespace Renci.SshNet.Messages.Transport capacity += 4; // HostKey length capacity += HostKey.Length; // HostKey capacity += 4; // F length - capacity += _fBytes.Length; // F + capacity += F.Length; // F capacity += 4; // Signature length capacity += Signature.Length; // Signature return capacity; @@ -59,7 +54,7 @@ namespace Renci.SshNet.Messages.Transport protected override void LoadData() { HostKey = ReadBinary(); - _fBytes = ReadBinary(); + F = ReadBinary(); Signature = ReadBinary(); } @@ -69,7 +64,7 @@ namespace Renci.SshNet.Messages.Transport protected override void SaveData() { WriteBinaryString(HostKey); - WriteBinaryString(_fBytes); + WriteBinaryString(F); WriteBinaryString(Signature); } diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs index 8d990e26..9d1d7685 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs @@ -1,6 +1,4 @@ -using Renci.SshNet.Common; - -namespace Renci.SshNet.Messages.Transport +namespace Renci.SshNet.Messages.Transport { /// /// Represents SSH_MSG_KEXDH_INIT message. @@ -8,15 +6,10 @@ namespace Renci.SshNet.Messages.Transport [Message("SSH_MSG_KEXDH_INIT", 30)] internal class KeyExchangeDhInitMessage : Message, IKeyExchangedAllowed { - private byte[] _eBytes; - /// /// Gets the E value. /// - public BigInteger E - { - get { return _eBytes.ToBigInteger(); } - } + public byte[] E { get; private set; } /// /// Gets the size of the message in bytes. @@ -30,7 +23,7 @@ namespace Renci.SshNet.Messages.Transport { var capacity = base.BufferCapacity; capacity += 4; // E length - capacity += _eBytes.Length; // E + capacity += E.Length; // E return capacity; } } @@ -39,9 +32,9 @@ namespace Renci.SshNet.Messages.Transport /// Initializes a new instance of the class. /// /// The client exchange value. - public KeyExchangeDhInitMessage(BigInteger clientExchangeValue) + public KeyExchangeDhInitMessage(byte[] clientExchangeValue) { - _eBytes = clientExchangeValue.ToByteArray().Reverse(); + E = clientExchangeValue; } /// @@ -49,7 +42,7 @@ namespace Renci.SshNet.Messages.Transport /// protected override void LoadData() { - _eBytes = ReadBinary(); + E = ReadBinary(); } /// @@ -57,7 +50,7 @@ namespace Renci.SshNet.Messages.Transport /// protected override void SaveData() { - WriteBinaryString(_eBytes); + WriteBinaryString(E); } internal override void Process(Session session) diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs index 474e29c6..105e5797 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs @@ -1,6 +1,4 @@ -using Renci.SshNet.Common; - -namespace Renci.SshNet.Messages.Transport +namespace Renci.SshNet.Messages.Transport { /// /// Represents SSH_MSG_KEXDH_REPLY message. @@ -8,8 +6,6 @@ namespace Renci.SshNet.Messages.Transport [Message("SSH_MSG_KEXDH_REPLY", 31)] public class KeyExchangeDhReplyMessage : Message { - private byte[] _fBytes; - /// /// Gets server public host key and certificates /// @@ -19,10 +15,7 @@ namespace Renci.SshNet.Messages.Transport /// /// Gets the F value. /// - public BigInteger F - { - get { return _fBytes.ToBigInteger(); } - } + public byte[] F { get; private set; } /// /// Gets the signature of H. @@ -44,7 +37,7 @@ namespace Renci.SshNet.Messages.Transport capacity += 4; // HostKey length capacity += HostKey.Length; // HostKey capacity += 4; // F length - capacity += _fBytes.Length; // F + capacity += F.Length; // F capacity += 4; // Signature length capacity += Signature.Length; // Signature return capacity; @@ -57,7 +50,7 @@ namespace Renci.SshNet.Messages.Transport protected override void LoadData() { HostKey = ReadBinary(); - _fBytes = ReadBinary(); + F = ReadBinary(); Signature = ReadBinary(); } @@ -67,7 +60,7 @@ namespace Renci.SshNet.Messages.Transport protected override void SaveData() { WriteBinaryString(HostKey); - WriteBinaryString(_fBytes); + WriteBinaryString(F); WriteBinaryString(Signature); } diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index b8efa8b4..2af20911 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -30,7 +30,6 @@ - diff --git a/src/Renci.SshNet/Security/GroupExchangeHashData.cs b/src/Renci.SshNet/Security/GroupExchangeHashData.cs index 992df4ae..12b5fbf1 100644 --- a/src/Renci.SshNet/Security/GroupExchangeHashData.cs +++ b/src/Renci.SshNet/Security/GroupExchangeHashData.cs @@ -9,9 +9,6 @@ namespace Renci.SshNet.Security private byte[] _clientVersion; private byte[] _prime; private byte[] _subGroup; - private byte[] _clientExchangeValue; - private byte[] _serverExchangeValue; - private byte[] _sharedKey; public string ServerVersion { @@ -50,23 +47,11 @@ namespace Renci.SshNet.Security set { _subGroup = value.ToByteArray().Reverse(); } } - public BigInteger ClientExchangeValue - { - private get { return _clientExchangeValue.ToBigInteger(); } - set { _clientExchangeValue = value.ToByteArray().Reverse(); } - } + public byte[] ClientExchangeValue { get; set; } - public BigInteger ServerExchangeValue - { - private get { return _serverExchangeValue.ToBigInteger(); } - set { _serverExchangeValue = value.ToByteArray().Reverse(); } - } + public byte[] ServerExchangeValue { get; set; } - public BigInteger SharedKey - { - private get { return _sharedKey.ToBigInteger(); } - set { _sharedKey = value.ToByteArray().Reverse(); } - } + public byte[] SharedKey { get; set; } /// /// Gets the size of the message in bytes. @@ -97,11 +82,11 @@ namespace Renci.SshNet.Security capacity += 4; // SubGroup length capacity += _subGroup.Length; // SubGroup capacity += 4; // ClientExchangeValue length - capacity += _clientExchangeValue.Length; // ClientExchangeValue + capacity += ClientExchangeValue.Length; // ClientExchangeValue capacity += 4; // ServerExchangeValue length - capacity += _serverExchangeValue.Length; // ServerExchangeValue + capacity += ServerExchangeValue.Length; // ServerExchangeValue capacity += 4; // SharedKey length - capacity += _sharedKey.Length; // SharedKey + capacity += SharedKey.Length; // SharedKey return capacity; } } @@ -123,9 +108,9 @@ namespace Renci.SshNet.Security Write(MaximumGroupSize); WriteBinaryString(_prime); WriteBinaryString(_subGroup); - WriteBinaryString(_clientExchangeValue); - WriteBinaryString(_serverExchangeValue); - WriteBinaryString(_sharedKey); + WriteBinaryString(ClientExchangeValue); + WriteBinaryString(ServerExchangeValue); + WriteBinaryString(SharedKey); } } } diff --git a/src/Renci.SshNet/Security/KeyExchange.cs b/src/Renci.SshNet/Security/KeyExchange.cs index 75e3517a..57ea6c50 100644 --- a/src/Renci.SshNet/Security/KeyExchange.cs +++ b/src/Renci.SshNet/Security/KeyExchange.cs @@ -37,7 +37,7 @@ namespace Renci.SshNet.Security /// /// The shared key. /// - public BigInteger SharedKey { get; protected set; } + public byte[] SharedKey { get; protected set; } private byte[] _exchangeHash; @@ -323,13 +323,7 @@ namespace Renci.SshNet.Security /// /// Hashed bytes /// - protected virtual byte[] Hash(byte[] hashData) - { - using (var sha1 = CryptoAbstraction.CreateSHA1()) - { - return sha1.ComputeHash(hashData, 0, hashData.Length); - } - } + protected abstract byte[] Hash(byte[] hashData); /// /// Sends SSH message to the server @@ -348,7 +342,7 @@ namespace Renci.SshNet.Security /// The key. /// The size. /// - private byte[] GenerateSessionKey(BigInteger sharedKey, byte[] exchangeHash, byte[] key, int size) + private byte[] GenerateSessionKey(byte[] sharedKey, byte[] exchangeHash, byte[] key, int size) { var result = new List(key); while (size > result.Count) @@ -372,26 +366,21 @@ namespace Renci.SshNet.Security /// The p. /// The session id. /// - private static byte[] GenerateSessionKey(BigInteger sharedKey, byte[] exchangeHash, char p, byte[] sessionId) + private static byte[] GenerateSessionKey(byte[] sharedKey, byte[] exchangeHash, char p, byte[] sessionId) { - return new _SessionKeyGeneration - { - SharedKey = sharedKey, - ExchangeHash = exchangeHash, - Char = p, - SessionId = sessionId, - }.GetBytes(); + var sessionKeyGeneration = new _SessionKeyGeneration + { + SharedKey = sharedKey, + ExchangeHash = exchangeHash, + Char = p, + SessionId = sessionId + }; + return sessionKeyGeneration.GetBytes(); } private class _SessionKeyGeneration : SshData { - private byte[] _sharedKey; - - public BigInteger SharedKey - { - private get { return _sharedKey.ToBigInteger(); } - set { _sharedKey = value.ToByteArray().Reverse(); } - } + public byte[] SharedKey { get; set; } public byte[] ExchangeHash { get; set; } public char Char { get; set; } public byte[] SessionId { get; set; } @@ -408,7 +397,7 @@ namespace Renci.SshNet.Security { var capacity = base.BufferCapacity; capacity += 4; // SharedKey length - capacity += _sharedKey.Length; // SharedKey + capacity += SharedKey.Length; // SharedKey capacity += ExchangeHash.Length; // ExchangeHash capacity += 1; // Char capacity += SessionId.Length; // SessionId @@ -423,7 +412,7 @@ namespace Renci.SshNet.Security protected override void SaveData() { - WriteBinaryString(_sharedKey); + WriteBinaryString(SharedKey); Write(ExchangeHash); Write((byte) Char); Write(SessionId); @@ -432,13 +421,7 @@ namespace Renci.SshNet.Security private class _SessionKeyAdjustment : SshData { - private byte[] _sharedKey; - - public BigInteger SharedKey - { - private get { return _sharedKey.ToBigInteger(); } - set { _sharedKey = value.ToByteArray().Reverse(); } - } + public byte[] SharedKey { get; set; } public byte[] ExchangeHash { get; set; } public byte[] Key { get; set; } @@ -454,7 +437,7 @@ namespace Renci.SshNet.Security { var capacity = base.BufferCapacity; capacity += 4; // SharedKey length - capacity += _sharedKey.Length; // SharedKey + capacity += SharedKey.Length; // SharedKey capacity += ExchangeHash.Length; // ExchangeHash capacity += Key.Length; // Key return capacity; @@ -468,7 +451,7 @@ namespace Renci.SshNet.Security protected override void SaveData() { - WriteBinaryString(_sharedKey); + WriteBinaryString(SharedKey); Write(ExchangeHash); Write(Key); } diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellman.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellman.cs index 29223a2e..375c3a59 100644 --- a/src/Renci.SshNet/Security/KeyExchangeDiffieHellman.cs +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellman.cs @@ -33,12 +33,12 @@ namespace Renci.SshNet.Security /// /// Specifies client exchange number. /// - protected BigInteger _clientExchangeValue; + protected byte[] _clientExchangeValue; /// /// Specifies server exchange number. /// - protected BigInteger _serverExchangeValue; + protected byte[] _serverExchangeValue; /// /// Specifies random generated number. @@ -114,13 +114,17 @@ namespace Renci.SshNet.Security // of 1024 bits (whatever is less) var privateExponentSize = Math.Max(HashSize * 2, 1024); + BigInteger clientExchangeValue; + do { // create private component _privateExponent = BigInteger.Random(privateExponentSize); // generate public component - _clientExchangeValue = BigInteger.ModPow(_group, _privateExponent, _prime); - } while (_clientExchangeValue < 1 || _clientExchangeValue > (_prime - 1)); + clientExchangeValue = BigInteger.ModPow(_group, _privateExponent, _prime); + } while (clientExchangeValue < 1 || clientExchangeValue > (_prime - 1)); + + _clientExchangeValue = clientExchangeValue.ToByteArray().Reverse(); } /// @@ -129,11 +133,11 @@ namespace Renci.SshNet.Security /// The host key. /// The server exchange value. /// The signature. - protected virtual void HandleServerDhReply(byte[] hostKey, BigInteger serverExchangeValue, byte[] signature) + protected virtual void HandleServerDhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) { _serverExchangeValue = serverExchangeValue; _hostKey = hostKey; - SharedKey = BigInteger.ModPow(serverExchangeValue, _privateExponent, _prime); + SharedKey = BigInteger.ModPow(serverExchangeValue.ToBigInteger(), _privateExponent, _prime).ToByteArray().Reverse(); _signature = signature; } } diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeSha1.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeSha1.cs index fc1a18a6..a7f1b742 100644 --- a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeSha1.cs +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeSha1.cs @@ -1,4 +1,6 @@ -namespace Renci.SshNet.Security +using Renci.SshNet.Abstractions; + +namespace Renci.SshNet.Security { /// /// Represents "diffie-hellman-group-exchange-sha1" algorithm implementation. @@ -23,5 +25,20 @@ { get { return 160; } } + + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha1 = CryptoAbstraction.CreateSHA1()) + { + return sha1.ComputeHash(hashData, 0, hashData.Length); + } + } } } diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeShaBase.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeShaBase.cs index 2ccdf731..755f77f2 100644 --- a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeShaBase.cs +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupExchangeShaBase.cs @@ -19,7 +19,7 @@ namespace Renci.SshNet.Security /// protected override byte[] CalculateHash() { - var hashData = new GroupExchangeHashData + var groupExchangeHashData = new GroupExchangeHashData { ClientVersion = Session.ClientVersion, ServerVersion = Session.ServerVersion, @@ -34,9 +34,9 @@ namespace Renci.SshNet.Security ClientExchangeValue = _clientExchangeValue, ServerExchangeValue = _serverExchangeValue, SharedKey = SharedKey, - }.GetBytes(); + }; - return Hash(hashData); + return Hash(groupExchangeHashData.GetBytes()); } /// @@ -54,8 +54,7 @@ namespace Renci.SshNet.Security Session.KeyExchangeDhGroupExchangeGroupReceived += Session_KeyExchangeDhGroupExchangeGroupReceived; // 1. client sends SSH_MSG_KEY_DH_GEX_REQUEST - SendMessage(new KeyExchangeDhGroupExchangeRequest(MinimumGroupSize, PreferredGroupSize, - MaximumProupSize)); + SendMessage(new KeyExchangeDhGroupExchangeRequest(MinimumGroupSize, PreferredGroupSize, MaximumProupSize)); } /// diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha1.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha1.cs index eb2a0cb1..675ee2cf 100644 --- a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha1.cs +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha1.cs @@ -1,22 +1,12 @@ -using System; -using Renci.SshNet.Common; -using Renci.SshNet.Messages.Transport; +using Renci.SshNet.Abstractions; namespace Renci.SshNet.Security { /// /// Represents "diffie-hellman-group1-sha1" algorithm implementation. /// - internal abstract class KeyExchangeDiffieHellmanGroupSha1 : KeyExchangeDiffieHellman + internal abstract class KeyExchangeDiffieHellmanGroupSha1 : KeyExchangeDiffieHellmanGroupShaBase { - /// - /// Gets the group prime. - /// - /// - /// The group prime. - /// - public abstract BigInteger GroupPrime { get; } - /// /// Gets the size, in bits, of the computed hash code. /// @@ -29,162 +19,17 @@ namespace Renci.SshNet.Security } /// - /// Calculates key exchange hash value. + /// Hashes the specified data bytes. /// + /// The hash data. /// - /// Key exchange hash. + /// Hashed bytes /// - protected override byte[] CalculateHash() + protected override byte[] Hash(byte[] hashData) { - var hashData = new _ExchangeHashData - { - ClientVersion = Session.ClientVersion, - ServerVersion = Session.ServerVersion, - ClientPayload = _clientPayload, - ServerPayload = _serverPayload, - HostKey = _hostKey, - ClientExchangeValue = _clientExchangeValue, - ServerExchangeValue = _serverExchangeValue, - SharedKey = SharedKey, - }.GetBytes(); - - return Hash(hashData); - } - - /// - /// Starts key exchange algorithm - /// - /// The session. - /// Key exchange init message. - public override void Start(Session session, KeyExchangeInitMessage message) - { - base.Start(session, message); - - Session.RegisterMessage("SSH_MSG_KEXDH_REPLY"); - - Session.KeyExchangeDhReplyMessageReceived += Session_KeyExchangeDhReplyMessageReceived; - - _prime = GroupPrime; - _group = new BigInteger(new byte[] { 2 }); - - PopulateClientExchangeValue(); - - SendMessage(new KeyExchangeDhInitMessage(_clientExchangeValue)); - } - - /// - /// Finishes key exchange algorithm. - /// - public override void Finish() - { - base.Finish(); - - Session.KeyExchangeDhReplyMessageReceived -= Session_KeyExchangeDhReplyMessageReceived; - } - - private void Session_KeyExchangeDhReplyMessageReceived(object sender, MessageEventArgs e) - { - var message = e.Message; - - // Unregister message once received - Session.UnRegisterMessage("SSH_MSG_KEXDH_REPLY"); - - HandleServerDhReply(message.HostKey, message.F, message.Signature); - - // When SSH_MSG_KEXDH_REPLY received key exchange is completed - Finish(); - } - - private class _ExchangeHashData : SshData - { - private byte[] _serverVersion; - private byte[] _clientVersion; - private byte[] _clientExchangeValue; - private byte[] _serverExchangeValue; - private byte[] _sharedKey; - - public string ServerVersion + using (var sha1 = CryptoAbstraction.CreateSHA1()) { - private get { return Utf8.GetString(_serverVersion, 0, _serverVersion.Length); } - set { _serverVersion = Utf8.GetBytes(value); } - } - - public string ClientVersion - { - private get { return Utf8.GetString(_clientVersion, 0, _clientVersion.Length); } - set { _clientVersion = Utf8.GetBytes(value); } - } - - public byte[] ClientPayload { get; set; } - - public byte[] ServerPayload { get; set; } - - public byte[] HostKey { get; set; } - - public BigInteger ClientExchangeValue - { - private get { return _clientExchangeValue.ToBigInteger(); } - set { _clientExchangeValue = value.ToByteArray().Reverse(); } - } - - public BigInteger ServerExchangeValue - { - private get { return _serverExchangeValue.ToBigInteger(); } - set { _serverExchangeValue = value.ToByteArray().Reverse(); } - } - - public BigInteger SharedKey - { - private get { return _sharedKey.ToBigInteger(); } - set { _sharedKey = value.ToByteArray().Reverse(); } - } - - /// - /// Gets the size of the message in bytes. - /// - /// - /// The size of the messages in bytes. - /// - protected override int BufferCapacity - { - get - { - var capacity = base.BufferCapacity; - capacity += 4; // ClientVersion length - capacity += _clientVersion.Length; // ClientVersion - capacity += 4; // ServerVersion length - capacity += _serverVersion.Length; // ServerVersion - capacity += 4; // ClientPayload length - capacity += ClientPayload.Length; // ClientPayload - capacity += 4; // ServerPayload length - capacity += ServerPayload.Length; // ServerPayload - capacity += 4; // HostKey length - capacity += HostKey.Length; // HostKey - capacity += 4; // ClientExchangeValue length - capacity += _clientExchangeValue.Length; // ClientExchangeValue - capacity += 4; // ServerExchangeValue length - capacity += _serverExchangeValue.Length; // ServerExchangeValue - capacity += 4; // SharedKey length - capacity += _sharedKey.Length; // SharedKey - return capacity; - } - } - - protected override void LoadData() - { - throw new NotImplementedException(); - } - - protected override void SaveData() - { - WriteBinaryString(_clientVersion); - WriteBinaryString(_serverVersion); - WriteBinaryString(ClientPayload); - WriteBinaryString(ServerPayload); - WriteBinaryString(HostKey); - WriteBinaryString(_clientExchangeValue); - WriteBinaryString(_serverExchangeValue); - WriteBinaryString(_sharedKey); + return sha1.ComputeHash(hashData, 0, hashData.Length); } } } diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha256.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha256.cs new file mode 100644 index 00000000..6cb67460 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha256.cs @@ -0,0 +1,36 @@ +using Renci.SshNet.Abstractions; + +namespace Renci.SshNet.Security +{ + /// + /// Base class for "diffie-hellman" SHA-256 group algorithm implementations. + /// + internal abstract class KeyExchangeDiffieHellmanGroupSha256 : KeyExchangeDiffieHellmanGroupShaBase + { + /// + /// Gets the size, in bits, of the computed hash code. + /// + /// + /// The size, in bits, of the computed hash code. + /// + protected override int HashSize + { + get { return 256; } + } + + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha256 = CryptoAbstraction.CreateSHA256()) + { + return sha256.ComputeHash(hashData); + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha512.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha512.cs new file mode 100644 index 00000000..54369b84 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupSha512.cs @@ -0,0 +1,36 @@ +using Renci.SshNet.Abstractions; + +namespace Renci.SshNet.Security +{ + /// + /// Base class for "diffie-hellman" SHA-512 group algorithm implementations. + /// + internal abstract class KeyExchangeDiffieHellmanGroupSha512 : KeyExchangeDiffieHellmanGroupShaBase + { + /// + /// Gets the size, in bits, of the computed hash code. + /// + /// + /// The size, in bits, of the computed hash code. + /// + protected override int HashSize + { + get { return 512; } + } + + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha512 = CryptoAbstraction.CreateSHA512()) + { + return sha512.ComputeHash(hashData); + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupShaBase.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupShaBase.cs new file mode 100644 index 00000000..2618b63a --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroupShaBase.cs @@ -0,0 +1,83 @@ +using Renci.SshNet.Common; +using Renci.SshNet.Messages.Transport; + +namespace Renci.SshNet.Security +{ + internal abstract class KeyExchangeDiffieHellmanGroupShaBase : KeyExchangeDiffieHellman + { + /// + /// Gets the group prime. + /// + /// + /// The group prime. + /// + public abstract BigInteger GroupPrime { get; } + + /// + /// Calculates key exchange hash value. + /// + /// + /// Key exchange hash. + /// + protected override byte[] CalculateHash() + { + var keyExchangeHashData = new KeyExchangeHashData + { + ClientVersion = Session.ClientVersion, + ServerVersion = Session.ServerVersion, + ClientPayload = _clientPayload, + ServerPayload = _serverPayload, + HostKey = _hostKey, + ClientExchangeValue = _clientExchangeValue, + ServerExchangeValue = _serverExchangeValue, + SharedKey = SharedKey, + }; + + return Hash(keyExchangeHashData.GetBytes()); + } + + /// + /// Starts key exchange algorithm + /// + /// The session. + /// Key exchange init message. + public override void Start(Session session, KeyExchangeInitMessage message) + { + base.Start(session, message); + + Session.RegisterMessage("SSH_MSG_KEXDH_REPLY"); + + Session.KeyExchangeDhReplyMessageReceived += Session_KeyExchangeDhReplyMessageReceived; + + _prime = GroupPrime; + _group = new BigInteger(new byte[] { 2 }); + + PopulateClientExchangeValue(); + + SendMessage(new KeyExchangeDhInitMessage(_clientExchangeValue)); + } + + /// + /// Finishes key exchange algorithm. + /// + public override void Finish() + { + base.Finish(); + + Session.KeyExchangeDhReplyMessageReceived -= Session_KeyExchangeDhReplyMessageReceived; + } + + private void Session_KeyExchangeDhReplyMessageReceived(object sender, MessageEventArgs e) + { + var message = e.Message; + + // Unregister message once received + Session.UnRegisterMessage("SSH_MSG_KEXDH_REPLY"); + + HandleServerDhReply(message.HostKey, message.F, message.Signature); + + // When SSH_MSG_KEXDH_REPLY received key exchange is completed + Finish(); + } + } +} diff --git a/src/Renci.SshNet/Security/KeyExchangeEC.cs b/src/Renci.SshNet/Security/KeyExchangeEC.cs index 44856909..22bd4e77 100644 --- a/src/Renci.SshNet/Security/KeyExchangeEC.cs +++ b/src/Renci.SshNet/Security/KeyExchangeEC.cs @@ -1,5 +1,4 @@ -using System; -using System.Text; +using System.Text; using Renci.SshNet.Messages.Transport; using Renci.SshNet.Common; using Renci.SshNet.Abstractions; @@ -69,19 +68,19 @@ namespace Renci.SshNet.Security /// protected override byte[] CalculateHash() { - var hashData = new _ExchangeHashData - { - ClientVersion = Session.ClientVersion, - ServerVersion = Session.ServerVersion, - ClientPayload = _clientPayload, - ServerPayload = _serverPayload, - HostKey = _hostKey, - ClientExchangeValue = _clientExchangeValue, - ServerExchangeValue = _serverExchangeValue, - SharedKey = SharedKey, - }.GetBytes(); + var keyExchangeHashData = new KeyExchangeHashData + { + ClientVersion = Session.ClientVersion, + ServerVersion = Session.ServerVersion, + ClientPayload = _clientPayload, + ServerPayload = _serverPayload, + HostKey = _hostKey, + ClientExchangeValue = _clientExchangeValue, + ServerExchangeValue = _serverExchangeValue, + SharedKey = SharedKey + }; - return Hash(hashData); + return Hash(keyExchangeHashData.GetBytes()); } /// @@ -119,97 +118,5 @@ namespace Renci.SshNet.Security _serverPayload = message.GetBytes(); _clientPayload = Session.ClientInitMessage.GetBytes(); } - - /// - /// Handles the server DH reply message. - /// - /// The host key. - /// The server exchange value. - /// The signature. - protected virtual void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) - { - } - - internal class _ExchangeHashData : SshData - { - private byte[] _serverVersion; - private byte[] _clientVersion; - private byte[] _sharedKey; - - public string ServerVersion - { - private get { return Utf8.GetString(_serverVersion, 0, _serverVersion.Length); } - set { _serverVersion = Utf8.GetBytes(value); } - } - - public string ClientVersion - { - private get { return Utf8.GetString(_clientVersion, 0, _clientVersion.Length); } - set { _clientVersion = Utf8.GetBytes(value); } - } - - public byte[] ClientPayload { get; set; } - - public byte[] ServerPayload { get; set; } - - public byte[] HostKey { get; set; } - - public byte[] ClientExchangeValue { get; set; } - - public byte[] ServerExchangeValue { get; set; } - - public BigInteger SharedKey - { - private get { return _sharedKey.ToBigInteger(); } - set { _sharedKey = value.ToByteArray().Reverse(); } - } - /// - /// Gets the size of the message in bytes. - /// - /// - /// The size of the messages in bytes. - /// - protected override int BufferCapacity - { - get - { - var capacity = base.BufferCapacity; - capacity += 4; // ClientVersion length - capacity += _clientVersion.Length; // ClientVersion - capacity += 4; // ServerVersion length - capacity += _serverVersion.Length; // ServerVersion - capacity += 4; // ClientPayload length - capacity += ClientPayload.Length; // ClientPayload - capacity += 4; // ServerPayload length - capacity += ServerPayload.Length; // ServerPayload - capacity += 4; // HostKey length - capacity += HostKey.Length; // HostKey - capacity += 4; // ClientExchangeValue length - capacity += ClientExchangeValue.Length; // ClientExchangeValue - capacity += 4; // ServerExchangeValue length - capacity += ServerExchangeValue.Length; // ServerExchangeValue - capacity += 4; // SharedKey length - capacity += _sharedKey.Length; // SharedKey - return capacity; - } - } - - protected override void LoadData() - { - throw new NotImplementedException(); - } - - protected override void SaveData() - { - WriteBinaryString(_clientVersion); - WriteBinaryString(_serverVersion); - WriteBinaryString(ClientPayload); - WriteBinaryString(ServerPayload); - WriteBinaryString(HostKey); - WriteBinaryString(ClientExchangeValue); - WriteBinaryString(ServerExchangeValue); - WriteBinaryString(_sharedKey); - } - } } } \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs b/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs index 39658de0..7d91abfe 100644 --- a/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs +++ b/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs @@ -84,16 +84,15 @@ namespace Renci.SshNet.Security /// The host key. /// The server exchange value. /// The signature. - protected override void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) + private void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) { _serverExchangeValue = serverExchangeValue; _hostKey = hostKey; - _serverExchangeValue = serverExchangeValue; _signature = signature; var sharedKey = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; MontgomeryOperations.scalarmult(sharedKey, 0, _privateKey, 0, serverExchangeValue, 0); - SharedKey = sharedKey.ToBigInteger2(); + SharedKey = sharedKey.ToBigNum2(); } } } diff --git a/src/Renci.SshNet/Security/KeyExchangeECDH.cs b/src/Renci.SshNet/Security/KeyExchangeECDH.cs index 9c5d4bfd..a32efd86 100644 --- a/src/Renci.SshNet/Security/KeyExchangeECDH.cs +++ b/src/Renci.SshNet/Security/KeyExchangeECDH.cs @@ -83,11 +83,10 @@ namespace Renci.SshNet.Security /// The host key. /// The server exchange value. /// The signature. - protected override void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) + private void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, byte[] signature) { _serverExchangeValue = serverExchangeValue; _hostKey = hostKey; - _serverExchangeValue = serverExchangeValue; _signature = signature; var cordSize = (serverExchangeValue.Length - 1) / 2; @@ -101,7 +100,7 @@ namespace Renci.SshNet.Security var publicKey = new ECPublicKeyParameters("ECDH", q, DomainParameters); var k1 = KeyAgreement.CalculateAgreement(publicKey); - SharedKey = k1.ToByteArray().ToBigInteger2(); + SharedKey = k1.ToByteArray().ToBigNum2(); } } } diff --git a/src/Renci.SshNet/Security/KeyExchangeHash.cs b/src/Renci.SshNet/Security/KeyExchangeHash.cs new file mode 100644 index 00000000..c5b1003d --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeHash.cs @@ -0,0 +1,84 @@ +using Renci.SshNet.Common; +using System; +using System.Linq; + +namespace Renci.SshNet.Security +{ + internal class KeyExchangeHashData : SshData + { + private byte[] _serverVersion; + private byte[] _clientVersion; + + public string ServerVersion + { + private get { return Utf8.GetString(_serverVersion, 0, _serverVersion.Length); } + set { _serverVersion = Utf8.GetBytes(value); } + } + + public string ClientVersion + { + private get { return Utf8.GetString(_clientVersion, 0, _clientVersion.Length); } + set { _clientVersion = Utf8.GetBytes(value); } + } + + public byte[] ClientPayload { get; set; } + + public byte[] ServerPayload { get; set; } + + public byte[] HostKey { get; set; } + + public byte[] ClientExchangeValue { get; set; } + + public byte[] ServerExchangeValue { get; set; } + + public byte[] SharedKey { get; set; } + + /// + /// Gets the size of the message in bytes. + /// + /// + /// The size of the messages in bytes. + /// + protected override int BufferCapacity + { + get + { + var capacity = base.BufferCapacity; + capacity += 4; // ClientVersion length + capacity += _clientVersion.Length; // ClientVersion + capacity += 4; // ServerVersion length + capacity += _serverVersion.Length; // ServerVersion + capacity += 4; // ClientPayload length + capacity += ClientPayload.Length; // ClientPayload + capacity += 4; // ServerPayload length + capacity += ServerPayload.Length; // ServerPayload + capacity += 4; // HostKey length + capacity += HostKey.Length; // HostKey + capacity += 4; // ClientExchangeValue length + capacity += ClientExchangeValue.Length; // ClientExchangeValue + capacity += 4; // ServerExchangeValue length + capacity += ServerExchangeValue.Length; // ServerExchangeValue + capacity += 4; // SharedKey length + capacity += SharedKey.Length; // SharedKey + return capacity; + } + } + + protected override void LoadData() + { + throw new NotImplementedException(); + } + + protected override void SaveData() + { + WriteBinaryString(_clientVersion); + WriteBinaryString(_serverVersion); + WriteBinaryString(ClientPayload); + WriteBinaryString(ServerPayload); + WriteBinaryString(HostKey); + WriteBinaryString(ClientExchangeValue); + WriteBinaryString(ServerExchangeValue); + WriteBinaryString(SharedKey); + } + } +} From 36cf5f22573e91571d40371b51fd6305f1172f2b Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 15 Mar 2020 17:12:19 +0100 Subject: [PATCH 55/67] Fix test after failure introduced by #643. --- .../Messages/Transport/KeyExchangeDhGroupExchangeReplyTest.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyTest.cs b/src/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyTest.cs index 0fb8e87f..2e424b50 100644 --- a/src/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyTest.cs +++ b/src/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyTest.cs @@ -1,8 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -using Renci.SshNet.Common; using Renci.SshNet.Messages.Transport; using Renci.SshNet.Tests.Common; -using System.Globalization; using System.Linq; namespace Renci.SshNet.Tests.Classes.Messages.Transport @@ -25,7 +23,7 @@ namespace Renci.SshNet.Tests.Classes.Messages.Transport Assert.IsTrue(m.HostKey.SequenceEqual(new byte[] { 0x00, 0x00, 0x00, 0x07, 0x73, 0x73, 0x68, 0x2d, 0x72, 0x73, 0x61, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0xce, 0x38, 0xdf, 0x0d, 0x04, 0x2c, 0x10, 0x45, 0x8f, 0x5e, 0xeb, 0xc2, 0x35, 0x01, 0xd5, 0x4d, 0x09, 0xa3, 0xee, 0x74, 0x3d, 0x75, 0xcf, 0xf4, 0xf3, 0x4f, 0xc9, 0xf9, 0x2e, 0x59, 0xd6, 0xb8, 0x69, 0x85, 0x16, 0xac, 0x33, 0x5b, 0x2a, 0x2a, 0xf8, 0x9c, 0xc4, 0xc3, 0x87, 0xd6, 0xb8, 0x50, 0x6c, 0xed, 0x60, 0x9c, 0x0f, 0x83, 0x37, 0xb3, 0xa2, 0x25, 0xbe, 0x07, 0xde, 0xb6, 0x1f, 0x28, 0xab, 0x05, 0x21, 0xc0, 0x23, 0xf7, 0xd6, 0xca, 0xcb, 0x03, 0x42, 0x69, 0x31, 0x93, 0x2b, 0x3b, 0x94, 0xb8, 0x3b, 0x90, 0xe6, 0x25, 0x7c, 0x23, 0xc5, 0x24, 0x89, 0x65, 0x37, 0x7b, 0x56, 0x54, 0xa2, 0x23, 0xcb, 0xeb, 0xf0, 0xe9, 0xd1, 0x07, 0x88, 0x36, 0x8f, 0xef, 0x65, 0x71, 0xac, 0x80, 0x5c, 0x81, 0x0a, 0x95, 0x1c, 0xf5, 0xc0, 0x5d, 0xd3, 0xd4, 0x10, 0x0e, 0x4f, 0xcf, 0x87, 0x80, 0xa5, 0xde, 0x6e, 0xff, 0x89, 0x9c, 0xfc, 0x2f, 0x85, 0xf5, 0x93, 0xff, 0x70, 0x8e, 0x48, 0xb6, 0x6e, 0x6e, 0x0a, 0x18, 0xa3, 0xbb, 0x1c, 0x56, 0x60, 0xf1, 0x9d, 0x2a, 0xca, 0xbf, 0xa0, 0x84, 0x73, 0xb1, 0x6d, 0x10, 0x75, 0xcc, 0xa3, 0x20, 0xed, 0x00, 0x52, 0xd0, 0x84, 0x5a, 0xc9, 0xbb, 0x17, 0x84, 0x96, 0x40, 0x48, 0xe2, 0x8e, 0x84, 0x30, 0x82, 0x3b, 0x87, 0xa4, 0x54, 0x55, 0x8c, 0xb5, 0x62, 0x97, 0xd7, 0xf1, 0xa3, 0x8b, 0x44, 0xaa, 0x34, 0xfd, 0xe9, 0xad, 0xda, 0xeb, 0x45, 0x27, 0xfb, 0xad, 0xea, 0x9a, 0x0c, 0x38, 0x30, 0x27, 0x6a, 0x82, 0xc2, 0xc2, 0x0a, 0xa0, 0xed, 0x30, 0x2f, 0x50, 0x9f, 0xdb, 0x1a, 0xfb, 0x29, 0x1c, 0x8a, 0x28, 0x3f, 0xd6, 0xf6, 0xa9, 0xeb, 0x76, 0x60, 0xa2, 0x56, 0xa2, 0x90, 0x32, 0xcd, 0x25, 0x41, 0xb7, 0xc0, 0x9e, 0x13, 0x97, 0xaf })); Assert.IsTrue(m.Signature.SequenceEqual(new byte[] { 0x00, 0x00, 0x00, 0x07, 0x73, 0x73, 0x68, 0x2d, 0x72, 0x73, 0x61, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x67, 0x83, 0xa1, 0xb8, 0x0c, 0x65, 0xb8, 0xd3, 0x76, 0x5f, 0x5f, 0x05, 0x51, 0x8c, 0xb3, 0x2d, 0x1e, 0x95, 0x67, 0xd6, 0xe2, 0xe4, 0x86, 0x49, 0x11, 0xca, 0x83, 0xab, 0xdb, 0x80, 0x75, 0x4e, 0x89, 0xa7, 0x3d, 0xb6, 0xc2, 0x92, 0xbb, 0x40, 0x00, 0xb9, 0xb3, 0x03, 0x86, 0x19, 0x9d, 0x67, 0x29, 0x2b, 0x5a, 0xc9, 0x0a, 0x6c, 0xa3, 0x21, 0xaf, 0xd8, 0xd4, 0xa7, 0x84, 0x6a, 0xe5, 0x36, 0x3e, 0xa5, 0x58, 0xd6, 0x36, 0x33, 0x12, 0x2e, 0xf9, 0x22, 0x10, 0xff, 0xae, 0x0e, 0xee, 0xfa, 0xdf, 0x1f, 0xf8, 0x70, 0xfe, 0xc0, 0x30, 0x1d, 0x23, 0xbf, 0x99, 0x20, 0x22, 0x18, 0x78, 0xab, 0x5f, 0xd5, 0xfa, 0x5f, 0xf1, 0x18, 0xc2, 0x20, 0xc5, 0x58, 0x90, 0x63, 0x4b, 0x12, 0xf3, 0xa4, 0xe9, 0x20, 0x03, 0x8f, 0x5a, 0x2d, 0x17, 0xbd, 0x75, 0x0a, 0xaf, 0x6d, 0xc5, 0x15, 0x8a, 0x14, 0x74, 0x7f, 0xa0, 0xd2, 0x0f, 0x6f, 0x96, 0xa5, 0x60, 0xb1, 0xb7, 0x65, 0x0f, 0x48, 0x67, 0x5d, 0x32, 0x0a, 0xcb, 0x8e, 0xdf, 0x0c, 0xa9, 0xd5, 0x14, 0x0b, 0x6d, 0xfb, 0x8b, 0xef, 0xa3, 0x79, 0xaf, 0xdb, 0xa3, 0xb4, 0x6d, 0xbb, 0x40, 0x9e, 0xb3, 0x45, 0x04, 0x7f, 0xd1, 0x84, 0xad, 0x90, 0x8b, 0x2d, 0xb6, 0x13, 0xfb, 0x7a, 0xf5, 0xad, 0xbf, 0xa6, 0x74, 0x75, 0xfa, 0x70, 0x59, 0xae, 0x22, 0xbb, 0xfb, 0x09, 0x68, 0xae, 0xe5, 0x26, 0x5c, 0xbd, 0xe0, 0xae, 0x39, 0xbb, 0xaa, 0x59, 0x4c, 0x73, 0x11, 0x01, 0x64, 0x6d, 0xc1, 0x95, 0x1b, 0x93, 0x6b, 0x14, 0x83, 0x4a, 0xdc, 0x16, 0x67, 0x7b, 0x85, 0xd0, 0x89, 0x2e, 0x3c, 0xa1, 0x05, 0x34, 0xf0, 0xd2, 0xb9, 0x3b, 0x83, 0xf4, 0x02, 0xd4, 0x7f, 0x73, 0x76, 0x5d, 0xc2, 0x67, 0xb9, 0xac, 0x8a, 0xd1, 0xab, 0xd4, 0x82 })); - Assert.IsTrue(m.F.Equals(BigInteger.Parse("139283707184174223973094328642546470115773370503206784462562067731214352325418848176518987606406368553205415627101408281035430394244245366884121855956041981785619368311948822371849754297010084387209814408417993188610908497995240761565618964080251146407679074869975343762660867551322434680855150842669738933549", System.Globalization.NumberStyles.None, CultureInfo.CurrentCulture))); + Assert.IsTrue(m.F.SequenceEqual(new byte[] { 0x00, 0xc6, 0x58, 0xb9, 0xa8, 0x11, 0xfd, 0xb6, 0xd6, 0xe9, 0x0c, 0x51, 0x45, 0xac, 0x51, 0x8a, 0x25, 0x6e, 0x1d, 0x9e, 0xbb, 0x7f, 0x98, 0xe3, 0x94, 0xd5, 0xac, 0x97, 0xd6, 0x35, 0x2e, 0xcc, 0x34, 0x85, 0xe2, 0x29, 0x2c, 0xba, 0x45, 0x6b, 0x39, 0xce, 0xd2, 0xae, 0x2e, 0x9a, 0x30, 0x43, 0x45, 0x09, 0xd2, 0xeb, 0x21, 0x46, 0x95, 0xa8, 0xb9, 0xbc, 0xb4, 0x21, 0xcd, 0x65, 0xeb, 0x0f, 0x48, 0x3c, 0x82, 0xdb, 0x52, 0x0e, 0xa5, 0xa8, 0xca, 0x29, 0x2d, 0xf8, 0x54, 0x38, 0xe4, 0x8f, 0x2c, 0x2d, 0x45, 0x2d, 0x2c, 0xf7, 0x1a, 0x41, 0xef, 0xd4, 0xec, 0x0f, 0xa5, 0xa8, 0xa7, 0x64, 0xb3, 0xe8, 0x7b, 0xa1, 0x40, 0x41, 0x69, 0x70, 0x4d, 0x95, 0x91, 0x8b, 0x5f, 0x28, 0xa2, 0xfc, 0xa7, 0x12, 0x2b, 0x94, 0xf0, 0x0a, 0x82, 0x92, 0x65, 0xdf, 0x8a, 0x35, 0xfb, 0xcc, 0xbe, 0xbd, 0x2d })); } } } \ No newline at end of file From 34df3dd725f4bf98c29a1e5c029cd0741ab27d4a Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 15 Mar 2020 19:43:45 +0100 Subject: [PATCH 56/67] Support diffie-hellman-group14-sha256 and diffie-hellman-group16-sha512 key exchange methods. --- README.md | 2 + ...yExchangeDiffieHellmanGroup14Sha256Test.cs | 61 ++++++++++++++++ ...yExchangeDiffieHellmanGroup16Sha512Test.cs | 70 +++++++++++++++++++ src/Renci.SshNet/ConnectionInfo.cs | 2 + .../KeyExchangeDiffieHellmanGroup14Sha256.cs | 62 ++++++++++++++++ .../KeyExchangeDiffieHellmanGroup16Sha512.cs | 66 +++++++++++++++++ 6 files changed, 263 insertions(+) create mode 100644 src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup14Sha256Test.cs create mode 100644 src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup16Sha512Test.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup14Sha256.cs create mode 100644 src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup16Sha512.cs diff --git a/README.md b/README.md index cd395b9d..9d09c9f4 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,8 @@ This project was inspired by **Sharp.SSH** library which was ported from java an * ecdh-sha2-nistp521 * diffie-hellman-group-exchange-sha256 * diffie-hellman-group-exchange-sha1 +* diffie-hellman-group16-sha512 +* diffie-hellman-group14-sha256 * diffie-hellman-group14-sha1 * diffie-hellman-group1-sha1 diff --git a/src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup14Sha256Test.cs b/src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup14Sha256Test.cs new file mode 100644 index 00000000..744a434f --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup14Sha256Test.cs @@ -0,0 +1,61 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Renci.SshNet.Common; +using Renci.SshNet.Security; +using Renci.SshNet.Tests.Common; +using System.Text; + +namespace Renci.SshNet.Tests.Classes.Security +{ + [TestClass] + public class KeyExchangeDiffieHellmanGroup14Sha256Test : TestBase + { + private static readonly byte[] SecondOkleyGroup = + { + 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x0f, 0xda, 0xa2, + 0x21, 0x68, 0xc2, 0x34, 0xc4, 0xc6, 0x62, 0x8b, 0x80, 0xdc, 0x1c, 0xd1, + 0x29, 0x02, 0x4e, 0x08, 0x8a, 0x67, 0xcc, 0x74, 0x02, 0x0b, 0xbe, 0xa6, + 0x3b, 0x13, 0x9b, 0x22, 0x51, 0x4a, 0x08, 0x79, 0x8e, 0x34, 0x04, 0xdd, + 0xef, 0x95, 0x19, 0xb3, 0xcd, 0x3a, 0x43, 0x1b, 0x30, 0x2b, 0x0a, 0x6d, + 0xf2, 0x5f, 0x14, 0x37, 0x4f, 0xe1, 0x35, 0x6d, 0x6d, 0x51, 0xc2, 0x45, + 0xe4, 0x85, 0xb5, 0x76, 0x62, 0x5e, 0x7e, 0xc6, 0xf4, 0x4c, 0x42, 0xe9, + 0xa6, 0x37, 0xed, 0x6b, 0x0b, 0xff, 0x5c, 0xb6, 0xf4, 0x06, 0xb7, 0xed, + 0xee, 0x38, 0x6b, 0xfb, 0x5a, 0x89, 0x9f, 0xa5, 0xae, 0x9f, 0x24, 0x11, + 0x7c, 0x4b, 0x1f, 0xe6, 0x49, 0x28, 0x66, 0x51, 0xec, 0xe4, 0x5b, 0x3d, + 0xc2, 0x00, 0x7c, 0xb8, 0xa1, 0x63, 0xbf, 0x05, 0x98, 0xda, 0x48, 0x36, + 0x1c, 0x55, 0xd3, 0x9a, 0x69, 0x16, 0x3f, 0xa8, 0xfd, 0x24, 0xcf, 0x5f, + 0x83, 0x65, 0x5d, 0x23, 0xdc, 0xa3, 0xad, 0x96, 0x1c, 0x62, 0xf3, 0x56, + 0x20, 0x85, 0x52, 0xbb, 0x9e, 0xd5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6d, + 0x67, 0x0c, 0x35, 0x4e, 0x4a, 0xbc, 0x98, 0x04, 0xf1, 0x74, 0x6c, 0x08, + 0xca, 0x18, 0x21, 0x7c, 0x32, 0x90, 0x5e, 0x46, 0x2e, 0x36, 0xce, 0x3b, + 0xe3, 0x9e, 0x77, 0x2c, 0x18, 0x0e, 0x86, 0x03, 0x9b, 0x27, 0x83, 0xa2, + 0xec, 0x07, 0xa2, 0x8f, 0xb5, 0xc5, 0x5d, 0xf0, 0x6f, 0x4c, 0x52, 0xc9, + 0xde, 0x2b, 0xcb, 0xf6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7c, + 0xea, 0x95, 0x6a, 0xe5, 0x15, 0xd2, 0x26, 0x18, 0x98, 0xfa, 0x05, 0x10, + 0x15, 0x72, 0x8e, 0x5a, 0x8a, 0xac, 0xaa, 0x68, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff + }; + + private KeyExchangeDiffieHellmanGroup14Sha256 _group14; + + protected override void OnInit() + { + base.OnInit(); + + _group14 = new KeyExchangeDiffieHellmanGroup14Sha256(); + } + + [TestMethod] + public void GroupPrimeShouldBeSecondOakleyGroup() + { + var bytes = _group14.GroupPrime.ToByteArray().Reverse(); + Assert.IsTrue(SecondOkleyGroup.IsEqualTo(bytes)); + } + + [TestMethod] + public void NameShouldBeDiffieHellmanGroup14Sha256() + { + Assert.AreEqual("diffie-hellman-group14-sha256", _group14.Name); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup16Sha512Test.cs b/src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup16Sha512Test.cs new file mode 100644 index 00000000..45d6f295 --- /dev/null +++ b/src/Renci.SshNet.Tests/Classes/Security/KeyExchangeDiffieHellmanGroup16Sha512Test.cs @@ -0,0 +1,70 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Renci.SshNet.Common; +using Renci.SshNet.Security; +using Renci.SshNet.Tests.Common; + +namespace Renci.SshNet.Tests.Classes.Security +{ + [TestClass] + public class KeyExchangeDiffieHellmanGroup16Sha512Test : TestBase + { + private static readonly byte[] MoreModularExponentialGroup16 = + { + 0x00, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc9,0x0f,0xda,0xa2,0x21,0x68,0xc2,0x34, + 0xc4,0xc6,0x62,0x8b,0x80,0xdc,0x1c,0xd1,0x29,0x02,0x4e,0x08,0x8a,0x67,0xcc,0x74, + 0x02,0x0b,0xbe,0xa6,0x3b,0x13,0x9b,0x22,0x51,0x4a,0x08,0x79,0x8e,0x34,0x04,0xdd, + 0xef,0x95,0x19,0xb3,0xcd,0x3a,0x43,0x1b,0x30,0x2b,0x0a,0x6d,0xf2,0x5f,0x14,0x37, + 0x4f,0xe1,0x35,0x6d,0x6d,0x51,0xc2,0x45,0xe4,0x85,0xb5,0x76,0x62,0x5e,0x7e,0xc6, + 0xf4,0x4c,0x42,0xe9,0xa6,0x37,0xed,0x6b,0x0b,0xff,0x5c,0xb6,0xf4,0x06,0xb7,0xed, + 0xee,0x38,0x6b,0xfb,0x5a,0x89,0x9f,0xa5,0xae,0x9f,0x24,0x11,0x7c,0x4b,0x1f,0xe6, + 0x49,0x28,0x66,0x51,0xec,0xe4,0x5b,0x3d,0xc2,0x00,0x7c,0xb8,0xa1,0x63,0xbf,0x05, + 0x98,0xda,0x48,0x36,0x1c,0x55,0xd3,0x9a,0x69,0x16,0x3f,0xa8,0xfd,0x24,0xcf,0x5f, + 0x83,0x65,0x5d,0x23,0xdc,0xa3,0xad,0x96,0x1c,0x62,0xf3,0x56,0x20,0x85,0x52,0xbb, + 0x9e,0xd5,0x29,0x07,0x70,0x96,0x96,0x6d,0x67,0x0c,0x35,0x4e,0x4a,0xbc,0x98,0x04, + 0xf1,0x74,0x6c,0x08,0xca,0x18,0x21,0x7c,0x32,0x90,0x5e,0x46,0x2e,0x36,0xce,0x3b, + 0xe3,0x9e,0x77,0x2c,0x18,0x0e,0x86,0x03,0x9b,0x27,0x83,0xa2,0xec,0x07,0xa2,0x8f, + 0xb5,0xc5,0x5d,0xf0,0x6f,0x4c,0x52,0xc9,0xde,0x2b,0xcb,0xf6,0x95,0x58,0x17,0x18, + 0x39,0x95,0x49,0x7c,0xea,0x95,0x6a,0xe5,0x15,0xd2,0x26,0x18,0x98,0xfa,0x05,0x10, + 0x15,0x72,0x8e,0x5a,0x8a,0xaa,0xc4,0x2d,0xad,0x33,0x17,0x0d,0x04,0x50,0x7a,0x33, + 0xa8,0x55,0x21,0xab,0xdf,0x1c,0xba,0x64,0xec,0xfb,0x85,0x04,0x58,0xdb,0xef,0x0a, + 0x8a,0xea,0x71,0x57,0x5d,0x06,0x0c,0x7d,0xb3,0x97,0x0f,0x85,0xa6,0xe1,0xe4,0xc7, + 0xab,0xf5,0xae,0x8c,0xdb,0x09,0x33,0xd7,0x1e,0x8c,0x94,0xe0,0x4a,0x25,0x61,0x9d, + 0xce,0xe3,0xd2,0x26,0x1a,0xd2,0xee,0x6b,0xf1,0x2f,0xfa,0x06,0xd9,0x8a,0x08,0x64, + 0xd8,0x76,0x02,0x73,0x3e,0xc8,0x6a,0x64,0x52,0x1f,0x2b,0x18,0x17,0x7b,0x20,0x0c, + 0xbb,0xe1,0x17,0x57,0x7a,0x61,0x5d,0x6c,0x77,0x09,0x88,0xc0,0xba,0xd9,0x46,0xe2, + 0x08,0xe2,0x4f,0xa0,0x74,0xe5,0xab,0x31,0x43,0xdb,0x5b,0xfc,0xe0,0xfd,0x10,0x8e, + 0x4b,0x82,0xd1,0x20,0xa9,0x21,0x08,0x01,0x1a,0x72,0x3c,0x12,0xa7,0x87,0xe6,0xd7, + 0x88,0x71,0x9a,0x10,0xbd,0xba,0x5b,0x26,0x99,0xc3,0x27,0x18,0x6a,0xf4,0xe2,0x3c, + 0x1a,0x94,0x68,0x34,0xb6,0x15,0x0b,0xda,0x25,0x83,0xe9,0xca,0x2a,0xd4,0x4c,0xe8, + 0xdb,0xbb,0xc2,0xdb,0x04,0xde,0x8e,0xf9,0x2e,0x8e,0xfc,0x14,0x1f,0xbe,0xca,0xa6, + 0x28,0x7c,0x59,0x47,0x4e,0x6b,0xc0,0x5d,0x99,0xb2,0x96,0x4f,0xa0,0x90,0xc3,0xa2, + 0x23,0x3b,0xa1,0x86,0x51,0x5b,0xe7,0xed,0x1f,0x61,0x29,0x70,0xce,0xe2,0xd7,0xaf, + 0xb8,0x1b,0xdd,0x76,0x21,0x70,0x48,0x1c,0xd0,0x06,0x91,0x27,0xd5,0xb0,0x5a,0xa9, + 0x93,0xb4,0xea,0x98,0x8d,0x8f,0xdd,0xc1,0x86,0xff,0xb7,0xdc,0x90,0xa6,0xc0,0x8f, + 0x4d,0xf4,0x35,0xc9,0x34,0x06,0x31,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff + }; + + private KeyExchangeDiffieHellmanGroup16Sha512 _group16; + + protected override void OnInit() + { + base.OnInit(); + + _group16 = new KeyExchangeDiffieHellmanGroup16Sha512(); + } + + [TestMethod] + public void GroupPrimeShouldBeMoreModularExponentialGroup16() + { + var bytes = _group16.GroupPrime.ToByteArray().Reverse(); + Assert.IsTrue(MoreModularExponentialGroup16.IsEqualTo(bytes)); + } + + [TestMethod] + public void NameShouldBeDiffieHellmanGroup16Sha512() + { + Assert.AreEqual("diffie-hellman-group16-sha512", _group16.Name); + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/ConnectionInfo.cs b/src/Renci.SshNet/ConnectionInfo.cs index d4a4c9a1..233fd62a 100644 --- a/src/Renci.SshNet/ConnectionInfo.cs +++ b/src/Renci.SshNet/ConnectionInfo.cs @@ -329,6 +329,8 @@ namespace Renci.SshNet {"ecdh-sha2-nistp521", typeof(KeyExchangeECDH521)}, {"diffie-hellman-group-exchange-sha256", typeof (KeyExchangeDiffieHellmanGroupExchangeSha256)}, {"diffie-hellman-group-exchange-sha1", typeof (KeyExchangeDiffieHellmanGroupExchangeSha1)}, + {"diffie-hellman-group16-sha512", typeof(KeyExchangeDiffieHellmanGroup16Sha512)}, + {"diffie-hellman-group14-sha256", typeof (KeyExchangeDiffieHellmanGroup14Sha256)}, {"diffie-hellman-group14-sha1", typeof (KeyExchangeDiffieHellmanGroup14Sha1)}, {"diffie-hellman-group1-sha1", typeof (KeyExchangeDiffieHellmanGroup1Sha1)}, }; diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup14Sha256.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup14Sha256.cs new file mode 100644 index 00000000..276077a0 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup14Sha256.cs @@ -0,0 +1,62 @@ +using Renci.SshNet.Common; + +namespace Renci.SshNet.Security +{ + /// + /// Represents "diffie-hellman-group14-sha256" algorithm implementation. + /// + internal class KeyExchangeDiffieHellmanGroup14Sha256 : KeyExchangeDiffieHellmanGroupSha256 + { + /// + /// https://tools.ietf.org/html/rfc2409#section-6.2 + /// + private static readonly byte[] SecondOkleyGroupReversed = + { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0xaa, 0xac, 0x8a, + 0x5a, 0x8e, 0x72, 0x15, 0x10, 0x05, 0xfa, 0x98, 0x18, 0x26, 0xd2, 0x15, + 0xe5, 0x6a, 0x95, 0xea, 0x7c, 0x49, 0x95, 0x39, 0x18, 0x17, 0x58, 0x95, + 0xf6, 0xcb, 0x2b, 0xde, 0xc9, 0x52, 0x4c, 0x6f, 0xf0, 0x5d, 0xc5, 0xb5, + 0x8f, 0xa2, 0x07, 0xec, 0xa2, 0x83, 0x27, 0x9b, 0x03, 0x86, 0x0e, 0x18, + 0x2c, 0x77, 0x9e, 0xe3, 0x3b, 0xce, 0x36, 0x2e, 0x46, 0x5e, 0x90, 0x32, + 0x7c, 0x21, 0x18, 0xca, 0x08, 0x6c, 0x74, 0xf1, 0x04, 0x98, 0xbc, 0x4a, + 0x4e, 0x35, 0x0c, 0x67, 0x6d, 0x96, 0x96, 0x70, 0x07, 0x29, 0xd5, 0x9e, + 0xbb, 0x52, 0x85, 0x20, 0x56, 0xf3, 0x62, 0x1c, 0x96, 0xad, 0xa3, 0xdc, + 0x23, 0x5d, 0x65, 0x83, 0x5f, 0xcf, 0x24, 0xfd, 0xa8, 0x3f, 0x16, 0x69, + 0x9a, 0xd3, 0x55, 0x1c, 0x36, 0x48, 0xda, 0x98, 0x05, 0xbf, 0x63, 0xa1, + 0xb8, 0x7c, 0x00, 0xc2, 0x3d, 0x5b, 0xe4, 0xec, 0x51, 0x66, 0x28, 0x49, + 0xe6, 0x1f, 0x4b, 0x7c, 0x11, 0x24, 0x9f, 0xae, 0xa5, 0x9f, 0x89, 0x5a, + 0xfb, 0x6b, 0x38, 0xee, 0xed, 0xb7, 0x06, 0xf4, 0xb6, 0x5c, 0xff, 0x0b, + 0x6b, 0xed, 0x37, 0xa6, 0xe9, 0x42, 0x4c, 0xf4, 0xc6, 0x7e, 0x5e, 0x62, + 0x76, 0xb5, 0x85, 0xe4, 0x45, 0xc2, 0x51, 0x6d, 0x6d, 0x35, 0xe1, 0x4f, + 0x37, 0x14, 0x5f, 0xf2, 0x6d, 0x0a, 0x2b, 0x30, 0x1b, 0x43, 0x3a, 0xcd, + 0xb3, 0x19, 0x95, 0xef, 0xdd, 0x04, 0x34, 0x8e, 0x79, 0x08, 0x4a, 0x51, + 0x22, 0x9b, 0x13, 0x3b, 0xa6, 0xbe, 0x0b, 0x02, 0x74, 0xcc, 0x67, 0x8a, + 0x08, 0x4e, 0x02, 0x29, 0xd1, 0x1c, 0xdc, 0x80, 0x8b, 0x62, 0xc6, 0xc4, + 0x34, 0xc2, 0x68, 0x21, 0xa2, 0xda, 0x0f, 0xc9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0x00 + }; + + /// + /// Gets algorithm name. + /// + public override string Name + { + get { return "diffie-hellman-group14-sha256"; } + } + + /// + /// Gets the group prime. + /// + /// + /// The group prime. + /// + public override BigInteger GroupPrime + { + get + { + return new BigInteger(SecondOkleyGroupReversed); + } + } + } +} \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup16Sha512.cs b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup16Sha512.cs new file mode 100644 index 00000000..48f7e178 --- /dev/null +++ b/src/Renci.SshNet/Security/KeyExchangeDiffieHellmanGroup16Sha512.cs @@ -0,0 +1,66 @@ +using Renci.SshNet.Common; + +namespace Renci.SshNet.Security +{ + /// + /// Represents "diffie-hellman-group16-sha512" algorithm implementation. + /// + internal class KeyExchangeDiffieHellmanGroup16Sha512 : KeyExchangeDiffieHellmanGroupSha512 + { + /// + /// https://tools.ietf.org/html/rfc3526#section-5 + /// + private static readonly byte[] MoreModularExponentialGroup16Reversed = + { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x31,0x06,0x34,0xc9,0x35,0xf4,0x4d, + 0x8f,0xc0,0xa6,0x90,0xdc,0xb7,0xff,0x86,0xc1,0xdd,0x8f,0x8d,0x98,0xea,0xb4,0x93, + 0xa9,0x5a,0xb0,0xd5,0x27,0x91,0x06,0xd0,0x1c,0x48,0x70,0x21,0x76,0xdd,0x1b,0xb8, + 0xaf,0xd7,0xe2,0xce,0x70,0x29,0x61,0x1f,0xed,0xe7,0x5b,0x51,0x86,0xa1,0x3b,0x23, + 0xa2,0xc3,0x90,0xa0,0x4f,0x96,0xb2,0x99,0x5d,0xc0,0x6b,0x4e,0x47,0x59,0x7c,0x28, + 0xa6,0xca,0xbe,0x1f,0x14,0xfc,0x8e,0x2e,0xf9,0x8e,0xde,0x04,0xdb,0xc2,0xbb,0xdb, + 0xe8,0x4c,0xd4,0x2a,0xca,0xe9,0x83,0x25,0xda,0x0b,0x15,0xb6,0x34,0x68,0x94,0x1a, + 0x3c,0xe2,0xf4,0x6a,0x18,0x27,0xc3,0x99,0x26,0x5b,0xba,0xbd,0x10,0x9a,0x71,0x88, + 0xd7,0xe6,0x87,0xa7,0x12,0x3c,0x72,0x1a,0x01,0x08,0x21,0xa9,0x20,0xd1,0x82,0x4b, + 0x8e,0x10,0xfd,0xe0,0xfc,0x5b,0xdb,0x43,0x31,0xab,0xe5,0x74,0xa0,0x4f,0xe2,0x08, + 0xe2,0x46,0xd9,0xba,0xc0,0x88,0x09,0x77,0x6c,0x5d,0x61,0x7a,0x57,0x17,0xe1,0xbb, + 0x0c,0x20,0x7b,0x17,0x18,0x2b,0x1f,0x52,0x64,0x6a,0xc8,0x3e,0x73,0x02,0x76,0xd8, + 0x64,0x08,0x8a,0xd9,0x06,0xfa,0x2f,0xf1,0x6b,0xee,0xd2,0x1a,0x26,0xd2,0xe3,0xce, + 0x9d,0x61,0x25,0x4a,0xe0,0x94,0x8c,0x1e,0xd7,0x33,0x09,0xdb,0x8c,0xae,0xf5,0xab, + 0xc7,0xe4,0xe1,0xa6,0x85,0x0f,0x97,0xb3,0x7d,0x0c,0x06,0x5d,0x57,0x71,0xea,0x8a, + 0x0a,0xef,0xdb,0x58,0x04,0x85,0xfb,0xec,0x64,0xba,0x1c,0xdf,0xab,0x21,0x55,0xa8, + 0x33,0x7a,0x50,0x04,0x0d,0x17,0x33,0xad,0x2d,0xc4,0xaa,0x8a,0x5a,0x8e,0x72,0x15, + 0x10,0x05,0xfa,0x98,0x18,0x26,0xd2,0x15,0xe5,0x6a,0x95,0xea,0x7c,0x49,0x95,0x39, + 0x18,0x17,0x58,0x95,0xf6,0xcb,0x2b,0xde,0xc9,0x52,0x4c,0x6f,0xf0,0x5d,0xc5,0xb5, + 0x8f,0xa2,0x07,0xec,0xa2,0x83,0x27,0x9b,0x03,0x86,0x0e,0x18,0x2c,0x77,0x9e,0xe3, + 0x3b,0xce,0x36,0x2e,0x46,0x5e,0x90,0x32,0x7c,0x21,0x18,0xca,0x08,0x6c,0x74,0xf1, + 0x04,0x98,0xbc,0x4a,0x4e,0x35,0x0c,0x67,0x6d,0x96,0x96,0x70,0x07,0x29,0xd5,0x9e, + 0xbb,0x52,0x85,0x20,0x56,0xf3,0x62,0x1c,0x96,0xad,0xa3,0xdc,0x23,0x5d,0x65,0x83, + 0x5f,0xcf,0x24,0xfd,0xa8,0x3f,0x16,0x69,0x9a,0xd3,0x55,0x1c,0x36,0x48,0xda,0x98, + 0x05,0xbf,0x63,0xa1,0xb8,0x7c,0x00,0xc2,0x3d,0x5b,0xe4,0xec,0x51,0x66,0x28,0x49, + 0xe6,0x1f,0x4b,0x7c,0x11,0x24,0x9f,0xae,0xa5,0x9f,0x89,0x5a,0xfb,0x6b,0x38,0xee, + 0xed,0xb7,0x06,0xf4,0xb6,0x5c,0xff,0x0b,0x6b,0xed,0x37,0xa6,0xe9,0x42,0x4c,0xf4, + 0xc6,0x7e,0x5e,0x62,0x76,0xb5,0x85,0xe4,0x45,0xc2,0x51,0x6d,0x6d,0x35,0xe1,0x4f, + 0x37,0x14,0x5f,0xf2,0x6d,0x0a,0x2b,0x30,0x1b,0x43,0x3a,0xcd,0xb3,0x19,0x95,0xef, + 0xdd,0x04,0x34,0x8e,0x79,0x08,0x4a,0x51,0x22,0x9b,0x13,0x3b,0xa6,0xbe,0x0b,0x02, + 0x74,0xcc,0x67,0x8a,0x08,0x4e,0x02,0x29,0xd1,0x1c,0xdc,0x80,0x8b,0x62,0xc6,0xc4, + 0x34,0xc2,0x68,0x21,0xa2,0xda,0x0f,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x00 + }; + + public override BigInteger GroupPrime + { + get + { + return new BigInteger(MoreModularExponentialGroup16Reversed); + } + } + + /// + /// Gets algorithm name. + /// + public override string Name + { + get { return "diffie-hellman-group16-sha512"; } + } + } +} From 21c5c8e0b42153314ef8a8e009f9352d4a89e67b Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 5 Apr 2020 11:34:36 +0200 Subject: [PATCH 57/67] Log warning upon timeout waiting for pending channels to reach zero. --- src/Renci.SshNet/ForwardedPortDynamic.NET.cs | 7 ++++++- src/Renci.SshNet/ForwardedPortLocal.NET.cs | 6 +++++- src/Renci.SshNet/ForwardedPortRemote.cs | 12 +++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/Renci.SshNet/ForwardedPortDynamic.NET.cs b/src/Renci.SshNet/ForwardedPortDynamic.NET.cs index b2c16cd2..36a80455 100644 --- a/src/Renci.SshNet/ForwardedPortDynamic.NET.cs +++ b/src/Renci.SshNet/ForwardedPortDynamic.NET.cs @@ -264,7 +264,12 @@ namespace Renci.SshNet partial void InternalStop(TimeSpan timeout) { _pendingChannelCountdown.Signal(); - _pendingChannelCountdown.Wait(timeout); + if (!_pendingChannelCountdown.Wait(timeout)) + { + // TODO: log as warning + DiagnosticAbstraction.Log("Timeout waiting for pending channels in dynamic forwarded port to close."); + } + } partial void InternalDispose(bool disposing) diff --git a/src/Renci.SshNet/ForwardedPortLocal.NET.cs b/src/Renci.SshNet/ForwardedPortLocal.NET.cs index ed8f89c0..ba01ddbd 100644 --- a/src/Renci.SshNet/ForwardedPortLocal.NET.cs +++ b/src/Renci.SshNet/ForwardedPortLocal.NET.cs @@ -214,7 +214,11 @@ namespace Renci.SshNet partial void InternalStop(TimeSpan timeout) { _pendingChannelCountdown.Signal(); - _pendingChannelCountdown.Wait(timeout); + if (!_pendingChannelCountdown.Wait(timeout)) + { + // TODO: log as warning + DiagnosticAbstraction.Log("Timeout waiting for pending channels in local forwarded port to close."); + } } partial void InternalDispose(bool disposing) diff --git a/src/Renci.SshNet/ForwardedPortRemote.cs b/src/Renci.SshNet/ForwardedPortRemote.cs index 4b5915de..b2ed15fe 100644 --- a/src/Renci.SshNet/ForwardedPortRemote.cs +++ b/src/Renci.SshNet/ForwardedPortRemote.cs @@ -201,7 +201,12 @@ namespace Renci.SshNet // wait for pending channels to close _pendingChannelCountdown.Signal(); - _pendingChannelCountdown.Wait(timeout); + + if (!_pendingChannelCountdown.Wait(timeout)) + { + // TODO: log as warning + DiagnosticAbstraction.Log("Timeout waiting for pending channels in remote forwarded port to close."); + } _status = ForwardedPortStatus.Stopped; } @@ -244,10 +249,7 @@ namespace Renci.SshNet { RaiseRequestReceived(info.OriginatorAddress, info.OriginatorPort); - using ( - var channel = - Session.CreateChannelForwardedTcpip(channelOpenMessage.LocalChannelNumber, - channelOpenMessage.InitialWindowSize, channelOpenMessage.MaximumPacketSize)) + using (var channel = Session.CreateChannelForwardedTcpip(channelOpenMessage.LocalChannelNumber, channelOpenMessage.InitialWindowSize, channelOpenMessage.MaximumPacketSize)) { channel.Exception += Channel_Exception; channel.Bind(new IPEndPoint(HostAddress, (int) Port), this); From 59d908d308a5184c42a4b4afdaf470ef8cc457b0 Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 5 Apr 2020 11:34:59 +0200 Subject: [PATCH 58/67] Formatting --- src/Renci.SshNet/Common/AsyncResult.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Renci.SshNet/Common/AsyncResult.cs b/src/Renci.SshNet/Common/AsyncResult.cs index d045c90c..3466a030 100644 --- a/src/Renci.SshNet/Common/AsyncResult.cs +++ b/src/Renci.SshNet/Common/AsyncResult.cs @@ -67,11 +67,15 @@ namespace Renci.SshNet.Common // If the event exists, set it if (_asyncWaitHandle != null) + { _asyncWaitHandle.Set(); + } // If a callback method was set, call it if (_asyncCallback != null) + { _asyncCallback(this); + } } /// From 2c1a4d95961b174fe9950ee1a5995bd73a20173a Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 5 Apr 2020 11:36:57 +0200 Subject: [PATCH 59/67] Make sure to shutdown receive socket when client has closed. --- src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs b/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs index 89c26fae..d446408e 100644 --- a/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs +++ b/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs @@ -127,6 +127,8 @@ namespace Renci.SshNet.Tests.Common else { SignalDisconnected(handler); + handler.Shutdown(SocketShutdown.Both); + handler.Close(); } } From f262b4aa7b54526d304493ccd6efa20f78a97bb3 Mon Sep 17 00:00:00 2001 From: Mark Moore Date: Sun, 19 Apr 2020 05:28:49 -0700 Subject: [PATCH 60/67] Added documentation section to README (#656) --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9d09c9f4..db4d3f7a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -SSH.NET +SSH.NET ======= SSH.NET is a Secure Shell (SSH-2) library for .NET, optimized for parallelism. @@ -7,7 +7,23 @@ SSH.NET is a Secure Shell (SSH-2) library for .NET, optimized for parallelism. [![Build status](https://ci.appveyor.com/api/projects/status/ih77qu6tap3o92gu/branch/develop?svg=true)](https://ci.appveyor.com/api/projects/status/ih77qu6tap3o92gu/branch/develop) ## Introduction -This project was inspired by **Sharp.SSH** library which was ported from java and it seems like was not supported for quite some time. This library is a complete rewrite, without any third party dependencies, using parallelism to achieve the best performance possible. +This project was inspired by **Sharp.SSH** library which was ported from java and it seems like was not supported +for quite some time. This library is a complete rewrite, without any third party dependencies, using parallelism +to achieve the best performance possible. + +## Documentation +There is MSDN-style class documentation in a .chm file for each release, which you can find in the Assets section +of the [latest release](https://github.com/sshnet/SSH.NET/releases/latest) page. Please note that you will need +to [right-click and "unblock"](https://support.microsoft.com/en-us/help/2021383/some-chm-files-may-not-render-properly-on-windows-vista-and-windows-7) +the CHM file after you download it. + +Currently (4/18/2020), the documentation is very sparse. Fortunately, there are a large number of tests in +[Renci.SshNet.Tests](https://github.com/sshnet/SSH.NET/tree/develop/src/Renci.SshNet.Tests) that demonstrate +usage with working code. + +If the test for the functionality you would like to see documented is not complete, then you are cordially +invited to read the source, Luke, and highly encouraged to generate a pull request for the implementation of +the missing test once you figure things out. 🤓 ## Features * Execution of SSH command using both synchronous and asynchronous methods From 1a803b50ee33ff7c484144a57693f4fc7ddacf68 Mon Sep 17 00:00:00 2001 From: drieseng Date: Fri, 24 Apr 2020 21:09:12 +0200 Subject: [PATCH 61/67] Partially revert changes from #643. Fixes #653. --- src/Renci.SshNet/Common/Extensions.cs | 15 ----------- src/Renci.SshNet/Security/KeyExchange.cs | 26 ++++++++++++------- src/Renci.SshNet/Security/KeyExchangeEC.cs | 24 +++-------------- .../Security/KeyExchangeECCurve25519.cs | 18 ++++++++++++- src/Renci.SshNet/Security/KeyExchangeECDH.cs | 2 +- .../Security/KeyExchangeECDH256.cs | 18 ++++++++++++- src/Renci.SshNet/Security/KeyExchangeHash.cs | 1 - src/Renci.SshNet/Security/KeyHostAlgorithm.cs | 2 +- 8 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/Renci.SshNet/Common/Extensions.cs b/src/Renci.SshNet/Common/Extensions.cs index 547bdacd..17d72d7f 100644 --- a/src/Renci.SshNet/Common/Extensions.cs +++ b/src/Renci.SshNet/Common/Extensions.cs @@ -72,21 +72,6 @@ namespace Renci.SshNet.Common return new BigInteger(reversed.Reverse()); } - /// - /// Initializes a new instance of the structure using the SSH BigNum2 Format - /// - public static byte[] ToBigNum2(this byte[] data) - { - if ((data[0] & (1 << 7)) != 0) - { - var buf = new byte[data.Length + 1]; - Buffer.BlockCopy(data, 0, buf, 1, data.Length); - data = buf; - } - - return data; - } - /// /// Initializes a new instance of the structure using the SSH BigNum2 Format /// diff --git a/src/Renci.SshNet/Security/KeyExchange.cs b/src/Renci.SshNet/Security/KeyExchange.cs index 57ea6c50..a13c272a 100644 --- a/src/Renci.SshNet/Security/KeyExchange.cs +++ b/src/Renci.SshNet/Security/KeyExchange.cs @@ -345,14 +345,17 @@ namespace Renci.SshNet.Security private byte[] GenerateSessionKey(byte[] sharedKey, byte[] exchangeHash, byte[] key, int size) { var result = new List(key); + while (size > result.Count) { - result.AddRange(Hash(new _SessionKeyAdjustment - { - SharedKey = sharedKey, - ExchangeHash = exchangeHash, - Key = key, - }.GetBytes())); + var sessionKeyAdjustment = new SessionKeyAdjustment + { + SharedKey = sharedKey, + ExchangeHash = exchangeHash, + Key = key, + }; + + result.AddRange(Hash(sessionKeyAdjustment.GetBytes())); } return result.ToArray(); @@ -368,7 +371,7 @@ namespace Renci.SshNet.Security /// private static byte[] GenerateSessionKey(byte[] sharedKey, byte[] exchangeHash, char p, byte[] sessionId) { - var sessionKeyGeneration = new _SessionKeyGeneration + var sessionKeyGeneration = new SessionKeyGeneration { SharedKey = sharedKey, ExchangeHash = exchangeHash, @@ -378,11 +381,14 @@ namespace Renci.SshNet.Security return sessionKeyGeneration.GetBytes(); } - private class _SessionKeyGeneration : SshData + private class SessionKeyGeneration : SshData { public byte[] SharedKey { get; set; } + public byte[] ExchangeHash { get; set; } + public char Char { get; set; } + public byte[] SessionId { get; set; } /// @@ -419,10 +425,12 @@ namespace Renci.SshNet.Security } } - private class _SessionKeyAdjustment : SshData + private class SessionKeyAdjustment : SshData { public byte[] SharedKey { get; set; } + public byte[] ExchangeHash { get; set; } + public byte[] Key { get; set; } /// diff --git a/src/Renci.SshNet/Security/KeyExchangeEC.cs b/src/Renci.SshNet/Security/KeyExchangeEC.cs index 22bd4e77..79cdf5be 100644 --- a/src/Renci.SshNet/Security/KeyExchangeEC.cs +++ b/src/Renci.SshNet/Security/KeyExchangeEC.cs @@ -1,7 +1,6 @@ using System.Text; using Renci.SshNet.Messages.Transport; using Renci.SshNet.Common; -using Renci.SshNet.Abstractions; namespace Renci.SshNet.Security { @@ -45,21 +44,6 @@ namespace Renci.SshNet.Security /// protected abstract int HashSize { get; } - /// - /// Hashes the specified data bytes. - /// - /// The hash data. - /// - /// Hashed bytes - /// - protected override byte[] Hash(byte[] hashData) - { - using (var sha256 = CryptoAbstraction.CreateSHA256()) - { - return sha256.ComputeHash(hashData, 0, hashData.Length); - } - } - /// /// Calculates key exchange hash value. /// @@ -68,7 +52,7 @@ namespace Renci.SshNet.Security /// protected override byte[] CalculateHash() { - var keyExchangeHashData = new KeyExchangeHashData + var hashData = new KeyExchangeHashData { ClientVersion = Session.ClientVersion, ServerVersion = Session.ServerVersion, @@ -77,10 +61,10 @@ namespace Renci.SshNet.Security HostKey = _hostKey, ClientExchangeValue = _clientExchangeValue, ServerExchangeValue = _serverExchangeValue, - SharedKey = SharedKey + SharedKey = SharedKey, }; - return Hash(keyExchangeHashData.GetBytes()); + return Hash(hashData.GetBytes()); } /// @@ -118,5 +102,5 @@ namespace Renci.SshNet.Security _serverPayload = message.GetBytes(); _clientPayload = Session.ClientInitMessage.GetBytes(); } - } + } } \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs b/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs index 7d91abfe..9de7af8f 100644 --- a/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs +++ b/src/Renci.SshNet/Security/KeyExchangeECCurve25519.cs @@ -1,4 +1,5 @@ using System; +using Renci.SshNet.Abstractions; using Renci.SshNet.Common; using Renci.SshNet.Messages.Transport; using Renci.SshNet.Security.Chaos.NaCl; @@ -65,6 +66,21 @@ namespace Renci.SshNet.Security Session.KeyExchangeEcdhReplyMessageReceived -= Session_KeyExchangeEcdhReplyMessageReceived; } + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha256 = CryptoAbstraction.CreateSHA256()) + { + return sha256.ComputeHash(hashData, 0, hashData.Length); + } + } + private void Session_KeyExchangeEcdhReplyMessageReceived(object sender, MessageEventArgs e) { var message = e.Message; @@ -92,7 +108,7 @@ namespace Renci.SshNet.Security var sharedKey = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; MontgomeryOperations.scalarmult(sharedKey, 0, _privateKey, 0, serverExchangeValue, 0); - SharedKey = sharedKey.ToBigNum2(); + SharedKey = sharedKey.ToBigInteger2().ToByteArray().Reverse(); } } } diff --git a/src/Renci.SshNet/Security/KeyExchangeECDH.cs b/src/Renci.SshNet/Security/KeyExchangeECDH.cs index a32efd86..f87a5c7e 100644 --- a/src/Renci.SshNet/Security/KeyExchangeECDH.cs +++ b/src/Renci.SshNet/Security/KeyExchangeECDH.cs @@ -100,7 +100,7 @@ namespace Renci.SshNet.Security var publicKey = new ECPublicKeyParameters("ECDH", q, DomainParameters); var k1 = KeyAgreement.CalculateAgreement(publicKey); - SharedKey = k1.ToByteArray().ToBigNum2(); + SharedKey = k1.ToByteArray().ToBigInteger2().ToByteArray().Reverse(); } } } diff --git a/src/Renci.SshNet/Security/KeyExchangeECDH256.cs b/src/Renci.SshNet/Security/KeyExchangeECDH256.cs index 84a8d12b..8f14d9bd 100644 --- a/src/Renci.SshNet/Security/KeyExchangeECDH256.cs +++ b/src/Renci.SshNet/Security/KeyExchangeECDH256.cs @@ -1,4 +1,5 @@ -using Renci.SshNet.Security.Org.BouncyCastle.Asn1.Sec; +using Renci.SshNet.Abstractions; +using Renci.SshNet.Security.Org.BouncyCastle.Asn1.Sec; using Renci.SshNet.Security.Org.BouncyCastle.Asn1.X9; namespace Renci.SshNet.Security @@ -34,5 +35,20 @@ namespace Renci.SshNet.Security { get { return 256; } } + + /// + /// Hashes the specified data bytes. + /// + /// The hash data. + /// + /// Hashed bytes + /// + protected override byte[] Hash(byte[] hashData) + { + using (var sha256 = CryptoAbstraction.CreateSHA256()) + { + return sha256.ComputeHash(hashData, 0, hashData.Length); + } + } } } \ No newline at end of file diff --git a/src/Renci.SshNet/Security/KeyExchangeHash.cs b/src/Renci.SshNet/Security/KeyExchangeHash.cs index c5b1003d..e33cb14c 100644 --- a/src/Renci.SshNet/Security/KeyExchangeHash.cs +++ b/src/Renci.SshNet/Security/KeyExchangeHash.cs @@ -1,6 +1,5 @@ using Renci.SshNet.Common; using System; -using System.Linq; namespace Renci.SshNet.Security { diff --git a/src/Renci.SshNet/Security/KeyHostAlgorithm.cs b/src/Renci.SshNet/Security/KeyHostAlgorithm.cs index e9899214..ca94fa70 100644 --- a/src/Renci.SshNet/Security/KeyHostAlgorithm.cs +++ b/src/Renci.SshNet/Security/KeyHostAlgorithm.cs @@ -82,7 +82,7 @@ namespace Renci.SshNet.Security private class SshKeyData : SshData { private byte[] _name; - private IList _keys; + private List _keys; public BigInteger[] Keys { From 516d982addb97a99fb029486d54ddc51e49ad2f1 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sun, 26 Apr 2020 10:35:04 +0200 Subject: [PATCH 62/67] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index db4d3f7a..2eacd873 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ the missing test once you figure things out. 🤓 * diffie-hellman-group14-sha1 * diffie-hellman-group1-sha1 -## Public Key Authenntication +## Public Key Authentication **SSH.NET** supports the following private key formats: * RSA in OpenSSL PEM and ssh.com format From 8aad18ff982af265936121945de9ac46878b9f9c Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 26 Apr 2020 11:37:07 +0200 Subject: [PATCH 63/67] Fix typos. --- src/Renci.SshNet/ConnectionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Renci.SshNet/ConnectionInfo.cs b/src/Renci.SshNet/ConnectionInfo.cs index 233fd62a..68df9fd4 100644 --- a/src/Renci.SshNet/ConnectionInfo.cs +++ b/src/Renci.SshNet/ConnectionInfo.cs @@ -143,13 +143,13 @@ namespace Renci.SshNet public TimeSpan Timeout { get; set; } /// - /// Gets or sets the timeout to used when waiting for a server to acknowledge closing a channel. + /// Gets or sets the timeout to use when waiting for a server to acknowledge closing a channel. /// /// /// The channel close timeout. The default value is 1 second. /// /// - /// If a server does not send a SSH2_MSG_CHANNEL_CLOSE message before the specified timeout + /// If a server does not send a SSH_MSG_CHANNEL_CLOSE message before the specified timeout /// elapses, the channel will be closed immediately. /// public TimeSpan ChannelCloseTimeout { get; set; } From 916c01926688c16d0e9058197741a1f342010ff4 Mon Sep 17 00:00:00 2001 From: drieseng Date: Thu, 30 Apr 2020 11:13:10 +0200 Subject: [PATCH 64/67] Update EAP implementation to correctly deal with a socket operation that is completed synchronously. Fixes #571. --- .../Abstractions/SocketAbstraction.cs | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Renci.SshNet/Abstractions/SocketAbstraction.cs b/src/Renci.SshNet/Abstractions/SocketAbstraction.cs index ef4bd956..f15b6034 100644 --- a/src/Renci.SshNet/Abstractions/SocketAbstraction.cs +++ b/src/Renci.SshNet/Abstractions/SocketAbstraction.cs @@ -148,10 +148,10 @@ namespace Renci.SshNet.Abstractions var receiveCompleted = new ManualResetEvent(false); var sendReceiveToken = new PartialSendReceiveToken(socket, receiveCompleted); var args = new SocketAsyncEventArgs - { - RemoteEndPoint = socket.RemoteEndPoint, - UserToken = sendReceiveToken - }; + { + RemoteEndPoint = socket.RemoteEndPoint, + UserToken = sendReceiveToken + }; args.Completed += ReceiveCompleted; args.SetBuffer(buffer, offset, size); @@ -166,6 +166,10 @@ namespace Renci.SshNet.Abstractions "Socket read operation has timed out after {0:F0} milliseconds.", timeout.TotalMilliseconds)); } + else + { + sendReceiveToken.Process(args); + } if (args.SocketError != SocketError.Success) throw new SocketException((int) args.SocketError); @@ -359,10 +363,10 @@ namespace Renci.SshNet.Abstractions var sendReceiveToken = new BlockingSendReceiveToken(socket, buffer, offset, size, receiveCompleted); var args = new SocketAsyncEventArgs - { - UserToken = sendReceiveToken, - RemoteEndPoint = socket.RemoteEndPoint - }; + { + UserToken = sendReceiveToken, + RemoteEndPoint = socket.RemoteEndPoint + }; args.Completed += ReceiveCompleted; args.SetBuffer(buffer, offset, size); @@ -374,6 +378,10 @@ namespace Renci.SshNet.Abstractions throw new SshOperationTimeoutException(string.Format(CultureInfo.InvariantCulture, "Socket read operation has timed out after {0:F0} milliseconds.", timeout.TotalMilliseconds)); } + else + { + sendReceiveToken.Process(args); + } if (args.SocketError != SocketError.Success) throw new SocketException((int) args.SocketError); @@ -443,6 +451,10 @@ namespace Renci.SshNet.Abstractions if (!sendCompleted.WaitOne()) throw new SocketException((int) SocketError.TimedOut); } + else + { + sendReceiveToken.Process(socketAsyncSendArgs); + } if (socketAsyncSendArgs.SocketError != SocketError.Success) throw new SocketException((int) socketAsyncSendArgs.SocketError); From 14ddfca4e926c1f8a7ca1db0026434ee159f384d Mon Sep 17 00:00:00 2001 From: drieseng Date: Thu, 30 Apr 2020 13:20:49 +0200 Subject: [PATCH 65/67] Fix test failures --- .../Classes/SessionTest_ConnectedBase.cs | 1 + .../Common/AsyncSocketListener.cs | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs b/src/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs index 074ab059..3e42dac1 100644 --- a/src/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs +++ b/src/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs @@ -97,6 +97,7 @@ namespace Renci.SshNet.Tests.Classes }; ServerListener = new AsyncSocketListener(_serverEndPoint); + ServerListener.ShutdownRemoteCommunicationSocket = false; ServerListener.Connected += socket => { ServerSocket = socket; diff --git a/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs b/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs index d446408e..dbb6128b 100644 --- a/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs +++ b/src/Renci.SshNet.Tests/Common/AsyncSocketListener.cs @@ -27,8 +27,20 @@ namespace Renci.SshNet.Tests.Common { _endPoint = endPoint; _acceptCallbackDone = new ManualResetEvent(false); + ShutdownRemoteCommunicationSocket = true; } + /// + /// Gets a value indicating whether the is invoked on the + /// that is used to handle the communication with the remote host, when the remote host has closed the connection. + /// + /// + /// to invoke on the that is used + /// to handle the communication with the remote host, when the remote host has closed the connection; otherwise, + /// . The default is . + /// + public bool ShutdownRemoteCommunicationSocket { get; set; } + public void Start() { _listener = new Socket(_endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); @@ -127,8 +139,12 @@ namespace Renci.SshNet.Tests.Common else { SignalDisconnected(handler); - handler.Shutdown(SocketShutdown.Both); - handler.Close(); + + if (ShutdownRemoteCommunicationSocket) + { + handler.Shutdown(SocketShutdown.Both); + handler.Close(); + } } } From cdbdefe4491b1ef4ffa301ded7f518b4d5bd973b Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 3 May 2020 10:45:10 +0200 Subject: [PATCH 66/67] Remove unused FEATURE_SOCKET_SETSOCKETOPTION. --- .../Renci.SshNet.Silverlight5.csproj | 4 ++-- src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj | 16 ++++++++-------- src/Renci.SshNet/Renci.SshNet.csproj | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj index b65b7ba6..30e4f2b8 100644 --- a/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj +++ b/src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj @@ -29,7 +29,7 @@ full false Bin\Debug - TRACE;DEBUG;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256 + TRACE;DEBUG;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256 true true prompt @@ -42,7 +42,7 @@ none true Bin\Release - TRACE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256 + TRACE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256 true true prompt diff --git a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj index ac0b5dd2..34da9d63 100644 --- a/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj +++ b/src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj @@ -23,7 +23,7 @@ full false bin\Debug\ - TRACE;DEBUG;FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;DEBUG;FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII prompt 4 bin\Debug\Renci.SshNet.xml @@ -34,7 +34,7 @@ pdbonly true bin\Release\ - TRACE;FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII prompt 4 bin\Release\Renci.SshNet.xml @@ -44,7 +44,7 @@ x86 true bin\x86\Debug\ - TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII ;2008 full x86 @@ -54,7 +54,7 @@ x86 bin\x86\Release\ - TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII true ;2008 pdbonly @@ -66,7 +66,7 @@ ARM true bin\ARM\Debug\ - TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII ;2008 full ARM @@ -76,7 +76,7 @@ ARM bin\ARM\Release\ - TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII true ;2008 pdbonly @@ -88,7 +88,7 @@ x64 true bin\x64\Debug\ - TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII ;2008 full x64 @@ -98,7 +98,7 @@ x64 bin\x64\Release\ - TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII + TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII true ;2008 pdbonly diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj index 2af20911..124ce9d4 100644 --- a/src/Renci.SshNet/Renci.SshNet.csproj +++ b/src/Renci.SshNet/Renci.SshNet.csproj @@ -33,15 +33,15 @@ - FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA + FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA - FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA + FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_ECDSA - FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_TAP;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 + FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_TAP;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512 - FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_ECDSA + FEATURE_STRINGBUILDER_CLEAR;FEATURE_HASHALGORITHM_DISPOSE;FEATURE_ENCODING_ASCII;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_RNG_CREATE;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_SELECT;FEATURE_SOCKET_POLL;FEATURE_SOCKET_DISPOSE;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP;FEATURE_STREAM_APM;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_WAITHANDLE_DISPOSE;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_ECDSA From 504d1dc035bd2ea75e7f8dc2456fbcb89975bc00 Mon Sep 17 00:00:00 2001 From: drieseng Date: Sun, 3 May 2020 13:10:30 +0200 Subject: [PATCH 67/67] Prefer Socket.Poll(...) over Socket.Select(...). Fixes #355. --- src/Renci.SshNet/Session.cs | 60 ++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/src/Renci.SshNet/Session.cs b/src/Renci.SshNet/Session.cs index fd771095..9edcb687 100644 --- a/src/Renci.SshNet/Session.cs +++ b/src/Renci.SshNet/Session.cs @@ -1784,16 +1784,16 @@ namespace Renci.SshNet /// /// #else -/// -/// Gets a value indicating whether the socket is connected. -/// -/// -/// true if the socket is connected; otherwise, false. -/// -/// -/// We verify whether is true. However, this only returns the state -/// of the socket as of the last I/O operation. -/// + /// + /// Gets a value indicating whether the socket is connected. + /// + /// + /// true if the socket is connected; otherwise, false. + /// + /// + /// We verify whether is true. However, this only returns the state + /// of the socket as of the last I/O operation. + /// #endif private bool IsSocketConnected() { @@ -1920,16 +1920,23 @@ namespace Renci.SshNet /// private void MessageListener() { -#if FEATURE_SOCKET_SELECT - var readSockets = new List { _socket }; -#endif // FEATURE_SOCKET_SELECT - try { // remain in message loop until socket is shut down or until we're disconnecting while (_socket.IsConnected()) { -#if FEATURE_SOCKET_SELECT +#if FEATURE_SOCKET_POLL + // Block until either data is available or the socket is closed + var connectionClosedOrDataAvailable = _socket.Poll(-1, SelectMode.SelectRead); + if (connectionClosedOrDataAvailable && _socket.Available == 0) + { + // connection with SSH server was closed or socket was disposed; + // break out of the message loop + break; + } +#elif FEATURE_SOCKET_SELECT + var readSockets = new List { _socket }; + // if the socket is already disposed when Select is invoked, then a SocketException // stating "An operation was attempted on something that is not a socket" is thrown; // we attempt to avoid this exception by having an IsConnected() that can break the @@ -1963,18 +1970,9 @@ namespace Renci.SshNet // break out of the message loop break; } -#elif FEATURE_SOCKET_POLL - // when Socket.Select(IList, IList, IList, Int32) is not available or is buggy, we use - // Socket.Poll(Int, SelectMode) to block until either data is available or the socket - // is closed - _socket.Poll(-1, SelectMode.SelectRead); - - if (!_socket.IsConnected()) - { - // connection with SSH server was closed or socket was disposed; - // break out of the message loop - break; - } +#else + #error Blocking wait on either socket data to become available or connection to be + #error closed is not implemented. #endif // FEATURE_SOCKET_SELECT var message = ReceiveMessage(); @@ -2459,7 +2457,7 @@ namespace Renci.SshNet DisconnectReason.ConnectionLost); } - #region IDisposable implementation +#region IDisposable implementation private bool _disposed; @@ -2550,9 +2548,9 @@ namespace Renci.SshNet Dispose(false); } - #endregion IDisposable implementation +#endregion IDisposable implementation - #region ISession implementation +#region ISession implementation /// /// Gets or sets the connection info. @@ -2638,7 +2636,7 @@ namespace Renci.SshNet return TrySendMessage(message); } - #endregion ISession implementation +#endregion ISession implementation } ///