diff --git a/dotnet/IEC61850forCSharp/IEC61850.NET.csproj b/dotnet/IEC61850forCSharp/IEC61850.NET.csproj
new file mode 100644
index 00000000..cbdff48b
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/IEC61850.NET.csproj
@@ -0,0 +1,51 @@
+
+
+
+ Debug
+ AnyCPU
+ {C35D624E-5506-4560-8074-1728F1FA1A4D}
+ Library
+ iec61850dotnet
+ iec61850dotnet
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ none
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dotnet/IEC61850forCSharp/TLS.cs b/dotnet/IEC61850forCSharp/TLS.cs
new file mode 100644
index 00000000..a10d4c23
--- /dev/null
+++ b/dotnet/IEC61850forCSharp/TLS.cs
@@ -0,0 +1,205 @@
+/*
+ * TLS.cs
+ *
+ * Copyright 2017 Michael Zillgith
+ *
+ * This file is part of libIEC61850.
+ *
+ * libIEC61850 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * libIEC61850 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libIEC61850. If not, see .
+ *
+ * See COPYING file for the complete license text.
+ */
+using System;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.Collections;
+using System.Security.Cryptography.X509Certificates;
+using System.Security.Cryptography;
+
+using IEC61850.Common;
+
+///
+/// IEC 61850 API for the libiec61850 .NET wrapper library
+///
+namespace IEC61850
+{
+ namespace TLS
+ {
+ ///
+ /// A container for TLS configuration and certificates.
+ ///
+ public class TLSConfiguration : IDisposable
+ {
+ private IntPtr self = IntPtr.Zero;
+
+ private bool allowOnlyKnownCerts = false;
+ private bool chainValidation = true;
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern IntPtr TLSConfiguration_create();
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void TLSConfiguration_destroy(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void TLSConfiguration_setAllowOnlyKnownCertificates(IntPtr self, bool value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void TLSConfiguration_setChainValidation (IntPtr self, bool value);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern void TLSConfiguration_setClientMode(IntPtr self);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_setOwnCertificate(IntPtr self, byte[] certificate, int certLen);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_setOwnCertificateFromFile(IntPtr self, string filename);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_setOwnKey(IntPtr self, byte[] key, int keyLen, string keyPassword);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_setOwnKeyFromFile (IntPtr self, string filename, string keyPassword);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_addAllowedCertificate(IntPtr self, byte[] certificate, int certLen);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_addAllowedCertificateFromFile(IntPtr self, string filename);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_addCACertificate(IntPtr self, byte[] certificate, int certLen);
+
+ [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
+ static extern bool TLSConfiguration_addCACertificateFromFile(IntPtr self, string filename);
+
+ public TLSConfiguration() {
+ self = TLSConfiguration_create ();
+ }
+
+ internal IntPtr GetNativeInstance()
+ {
+ return self;
+ }
+
+ public bool AllowOnlyKnownCertificates
+ {
+ set {
+ TLSConfiguration_setAllowOnlyKnownCertificates (self, value);
+ allowOnlyKnownCerts = value;
+ }
+ get {
+ return allowOnlyKnownCerts;
+ }
+ }
+
+ public bool ChainValidation
+ {
+ set {
+ TLSConfiguration_setChainValidation (self, value);
+ chainValidation = value;
+ }
+ get {
+ return chainValidation;
+ }
+ }
+
+
+ public void SetClientMode()
+ {
+ TLSConfiguration_setClientMode (self);
+ }
+
+ public void SetOwnCertificate(string filename)
+ {
+ if (TLSConfiguration_setOwnCertificateFromFile (self, filename) == false) {
+ Console.WriteLine ("Failed to read certificate from file!");
+ throw new CryptographicException ("Failed to read certificate from file");
+ }
+ }
+
+ public void SetOwnCertificate(X509Certificate2 cert)
+ {
+ byte[] certBytes = cert.GetRawCertData ();
+
+ if (TLSConfiguration_setOwnCertificate (self, certBytes, certBytes.Length) == false) {
+ Console.WriteLine ("Failed to set certificate!");
+ throw new CryptographicException ("Failed to set certificate");
+ }
+ }
+
+ public void AddAllowedCertificate(string filename)
+ {
+ if (TLSConfiguration_addAllowedCertificateFromFile (self, filename) == false) {
+ Console.WriteLine ("Failed to read allowed certificate from file!");
+ throw new CryptographicException ("Failed to read allowed certificate from file");
+ }
+ }
+
+ public void AddAllowedCertificate(X509Certificate2 cert)
+ {
+ byte[] certBytes = cert.GetRawCertData ();
+
+ if (TLSConfiguration_addAllowedCertificate (self, certBytes, certBytes.Length) == false) {
+ Console.WriteLine ("Failed to add allowed certificate!");
+ throw new CryptographicException ("Failed to add allowed certificate");
+ }
+ }
+
+ public void AddCACertificate(string filename)
+ {
+ if (TLSConfiguration_addCACertificateFromFile (self, filename) == false) {
+ Console.WriteLine ("Failed to read CA certificate from file!");
+ throw new CryptographicException ("Failed to read CA certificate from file");
+ }
+ }
+
+ public void AddCACertificate(X509Certificate2 cert)
+ {
+ byte[] certBytes = cert.GetRawCertData ();
+
+ if (TLSConfiguration_addCACertificate (self, certBytes, certBytes.Length) == false) {
+ Console.WriteLine ("Failed to add CA certificate!");
+ throw new CryptographicException ("Failed to add CA certificate");
+ }
+ }
+
+ public void SetOwnKey (string filename, string password)
+ {
+ if (TLSConfiguration_setOwnKeyFromFile (self, filename, password) == false) {
+ Console.WriteLine ("Failed to read own key from file!");
+ throw new CryptographicException ("Failed to read own key from file");
+ }
+ }
+
+ public void SetOwnKey (X509Certificate2 key, string password)
+ {
+ byte[] certBytes = key.Export (X509ContentType.Pkcs12);
+
+ if (TLSConfiguration_setOwnKey (self, certBytes, certBytes.Length, password) == false) {
+ Console.WriteLine ("Failed to set own key!");
+ throw new CryptographicException ("Failed to set own key");
+ }
+ }
+
+ public void Dispose()
+ {
+ TLSConfiguration_destroy (self);
+ }
+
+ }
+ }
+}
\ No newline at end of file