using System.Linq;\r
using System.Net;\r
using System.Reflection;\r
+using System.Security.Cryptography;\r
using System.Text;\r
using System.Threading;\r
using System.Threading.Tasks;\r
using Pithos.Client.WPF.Configuration;\r
using Pithos.Client.WPF.Properties;\r
using Pithos.Interfaces;\r
+using Pithos.Network;\r
using log4net.Appender;\r
using log4net.Core;\r
using log4net.Repository.Hierarchy;\r
//var instanceMutex=new Mutex()\r
InitializeLogging();\r
\r
- \r
+ RegisterOpenSSL();\r
+\r
\r
//Detect OS, if Major Version is 6+ use RestartManager\r
OperatingSystem os = Environment.OSVersion;\r
InitializeComponent(); \r
}\r
\r
+ private static void RegisterOpenSSL()\r
+ {\r
+\r
+ //Try to instantiate OpenSSL and hash an empty array\r
+ try\r
+ {\r
+ using(var testHasher=new SHA256OpenSSL())\r
+ {\r
+ testHasher.ComputeHash(new byte[0]);\r
+ }\r
+ CryptoConfig.AddAlgorithm(typeof(SHA256OpenSSL), "SHA256");\r
+ Log.InfoFormat("Registered OpenSSL hash provider");\r
+ }\r
+ catch (Exception exc)\r
+ {\r
+ Log.WarnFormat("OpenSSL instantiation failed. Falling back to CNG provider.\r\n[{0}]",exc); \r
+ }\r
+ //Running on Vista + ?\r
+ if (Environment.OSVersion.Version.Major >= 6)\r
+ {\r
+ CryptoConfig.AddAlgorithm(typeof(SHA256Cng), "SHA256");\r
+ Log.InfoFormat("Registered CNG hash provider");\r
+ }\r
+ else\r
+ {\r
+ Log.WarnFormat("Running on XP. Falling back to default hash algorithm.");\r
+ }\r
+\r
+ \r
+ }\r
+\r
\r
/* private static string[] platformLibraries = {"libeay32.dll","ssleay32.dll"};\r
private static Assembly CustomResolve(object sender,ResolveEventArgs args)\r
\r
[global::System.Configuration.ApplicationScopedSettingAttribute()]\r
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
- [global::System.Configuration.DefaultSettingValueAttribute(@"<?xml version=""1.0"" encoding=""utf-16""?>\r
-<ArrayOfServerSettings xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">\r
- <ServerSettings>\r
-<ServerName>Pithos Production</ServerName>\r
- <ServerUri>https://pithos.okeanos.grnet.gr</ServerUri>\r
- <LoginUri>https://pithos.okeanos.grnet.gr/login</LoginUri>\r
- <LogoutUri>https://accounts.okeanos.grnet.gr/im/logout</LogoutUri>\r
- </ServerSettings>\r
- <ServerSettings>\r
-<ServerName>Pithos Development</ServerName>\r
- <ServerUri>https://pithos.dev.grnet.gr</ServerUri>\r
- <LoginUri>https://pithos.dev.grnet.gr/login</LoginUri>\r
- <LogoutUri>https://pithos.dev.grnet.gr/im/logout</LogoutUri>\r
- </ServerSettings>\r
-</ArrayOfServerSettings>")]\r
+ [global::System.Configuration.DefaultSettingValueAttribute(@"\r
+ <ArrayOfServerSettings xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">\r
+ <ServerSettings>\r
+ <ServerName>Pithos Production</ServerName>\r
+ <ServerUri>https://pithos.okeanos.grnet.gr</ServerUri>\r
+ <LoginUri>https://pithos.okeanos.grnet.gr/login</LoginUri>\r
+ <LogoutUri>https://accounts.okeanos.grnet.gr/im/logout</LogoutUri>\r
+ </ServerSettings>\r
+ <ServerSettings>\r
+ <ServerName>Pithos Development</ServerName>\r
+ <ServerUri>https://pithos.dev.grnet.gr</ServerUri>\r
+ <LoginUri>https://pithos.dev.grnet.gr/login</LoginUri>\r
+ <LogoutUri>https://pithos.dev.grnet.gr/im/logout</LogoutUri>\r
+ </ServerSettings>\r
+ </ArrayOfServerSettings>\r
+ ")]\r
public global::Pithos.Interfaces.ServersCollection Servers {\r
get {\r
return ((global::Pithos.Interfaces.ServersCollection)(this["Servers"]));\r
<Value Profile="(Default)">False</Value>\r
</Setting>\r
<Setting Name="Servers" Type="Pithos.Interfaces.ServersCollection" Scope="Application">\r
- <Value Profile="(Default)"><?xml version="1.0" encoding="utf-16"?>\r
-<ArrayOfServerSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">\r
- <ServerSettings>\r
-<ServerName>Pithos Production</ServerName>\r
- <ServerUri>https://pithos.okeanos.grnet.gr</ServerUri>\r
- <LoginUri>https://pithos.okeanos.grnet.gr/login</LoginUri>\r
- <LogoutUri>https://accounts.okeanos.grnet.gr/im/logout</LogoutUri>\r
- </ServerSettings>\r
- <ServerSettings>\r
-<ServerName>Pithos Development</ServerName>\r
- <ServerUri>https://pithos.dev.grnet.gr</ServerUri>\r
- <LoginUri>https://pithos.dev.grnet.gr/login</LoginUri>\r
- <LogoutUri>https://pithos.dev.grnet.gr/im/logout</LogoutUri>\r
- </ServerSettings>\r
-</ArrayOfServerSettings></Value>\r
+ <Value Profile="(Default)">\r
+ <ArrayOfServerSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">\r
+ <ServerSettings>\r
+ <ServerName>Pithos Production</ServerName>\r
+ <ServerUri>https://pithos.okeanos.grnet.gr</ServerUri>\r
+ <LoginUri>https://pithos.okeanos.grnet.gr/login</LoginUri>\r
+ <LogoutUri>https://accounts.okeanos.grnet.gr/im/logout</LogoutUri>\r
+ </ServerSettings>\r
+ <ServerSettings>\r
+ <ServerName>Pithos Development</ServerName>\r
+ <ServerUri>https://pithos.dev.grnet.gr</ServerUri>\r
+ <LoginUri>https://pithos.dev.grnet.gr/login</LoginUri>\r
+ <LogoutUri>https://pithos.dev.grnet.gr/im/logout</LogoutUri>\r
+ </ServerSettings>\r
+ </ArrayOfServerSettings>\r
+ </Value>\r
</Setting>\r
</Settings>\r
</SettingsFile>
\ No newline at end of file
</setting>\r
<setting name="Servers" serializeAs="Xml">\r
<value>\r
- <ArrayOfServerSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
- xmlns:xsd="http://www.w3.org/2001/XMLSchema">\r
+ <ArrayOfServerSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">\r
<ServerSettings>\r
<ServerName>Pithos Production</ServerName>\r
<ServerUri>https://pithos.okeanos.grnet.gr</ServerUri>\r
</filter>\r
</appender>\r
<appender name="DumpFileAppender" type="log4net.Appender.RollingFileAppender">\r
- <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\GRNET\PITHOS\errorlog.xml" />\r
+ <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\GRNET\PITHOS\errorlog.xml" />\r
<appendToFile value="false" />\r
<rollingStyle value="Size" />\r
<maxSizeRollBackups value="10" />\r
<layout type="log4net.Layout.XMLLayout" />\r
</appender>\r
<appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender">\r
- <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\GRNET\PITHOS\debuglog.xml" />\r
+ <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\GRNET\PITHOS\debuglog.xml" />\r
<appendToFile value="true" />\r
<rollingStyle value="Size" />\r
<maxSizeRollBackups value="10" />\r
<layout type="log4net.Layout.XMLLayout" />\r
</appender>\r
<appender name="NetworkFileAppender" type="log4net.Appender.RollingFileAppender">\r
- <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\GRNET\PITHOS\network.log" />\r
+ <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\GRNET\PITHOS\network.log" />\r
<appendToFile value="true" />\r
<rollingStyle value="Size" />\r
<maxSizeRollBackups value="10" />\r
}\r
catch (IOException)\r
{\r
- if (i>=3)\r
+ if (i>=2)\r
throw;\r
- Thread.Sleep(100);\r
+ Thread.Sleep((i+1)*300);\r
} \r
}\r
}\r
using System.Diagnostics.Contracts;\r
using System.IO;\r
using System.Reflection;\r
+using System.Security.Cryptography;\r
using System.ServiceModel.Channels;\r
using System.Threading;\r
using System.Threading.Tasks;\r
using System.Threading.Tasks.Dataflow;\r
-using OpenSSL.Crypto;\r
+\r
\r
namespace Pithos.Network\r
{\r
if (size == 0)\r
{\r
var buf = new byte[0];\r
- using (var hasher = new MessageDigestContext(MessageDigest.CreateByName(algorithm)))\r
- { \r
- hasher.Init();\r
- hashes[0] = hasher.Digest(buf);\r
+ using (var hasher = HashAlgorithm.Create(algorithm))\r
+ {\r
+ hashes[0] = hasher.ComputeHash(buf);\r
return hashes;\r
}\r
}\r
var actualHashers = parallelism > blocks ? (byte)blocks : parallelism;\r
\r
var buffer = new byte[actualHashers][];\r
- var hashers = new MessageDigestContext[actualHashers];\r
+ var hashers = new HashAlgorithm[actualHashers];\r
var bufferManager = GetBufferManager(blockSize, actualHashers);\r
for (var i = 0; i < actualHashers; i++)\r
{\r
buffer[i] = bufferManager.TakeBuffer(blockSize);// new byte[blockSize];\r
- hashers[i] = new MessageDigestContext(MessageDigest.CreateByName(algorithm));\r
- hashers[i].Init();\r
+ hashers[i] = HashAlgorithm.Create(algorithm); \r
}\r
try\r
{\r
\r
var hasher = hashers[idx];\r
\r
- byte[] hash;\r
+ byte[] hash=hasher.ComputeHash(buffer[idx],0,lastByteIndex+1);\r
+/*\r
if (buffer[idx].Length == lastByteIndex || lastByteIndex==-1)\r
hash = hasher.Digest(buffer[idx]);\r
else\r
Buffer.BlockCopy(buffer[idx],0,buf,0,lastByteIndex+1);\r
hash = hasher.Digest(buf);\r
}\r
+*/\r
\r
\r
\r
}\r
}\r
}\r
+ \r
+ public class SHA256OpenSSL : SHA256\r
+ {\r
+\r
+ private MessageDigestContext _context;\r
+\r
+ public SHA256OpenSSL()\r
+ {\r
+ _context = new MessageDigestContext(MessageDigest.CreateByName("SHA256"));\r
+ _context.Init();\r
+ }\r
+\r
+ public override void Initialize()\r
+ {\r
+ _context.Init();\r
+ }\r
+\r
+ protected override void HashCore(byte[] array, int ibStart, int cbSize)\r
+ {\r
+ if (array.Length == cbSize)\r
+ _context.Update(array);\r
+ else\r
+ {\r
+ var block = new byte[cbSize];\r
+ Buffer.BlockCopy(array, ibStart, block, 0, cbSize);\r
+ _context.Update(block);\r
+ }\r
+ }\r
+\r
+ protected override byte[] HashFinal()\r
+ {\r
+ return _context.DigestFinal();\r
+ }\r
+\r
+ protected override void Dispose(bool disposing)\r
+ {\r
+ base.Dispose(disposing);\r
+ if (disposing)\r
+ {\r
+ if (_context != null)\r
+ _context.Dispose();\r
+ _context = null;\r
+ }\r
+ }\r
+ }\r
}\r