aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/embeddable-dll-service/csharp/Program.cs
blob: dfefc3ece3b16b0129a534e6406af57ffcebc9ad (plain) (blame)
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
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* SPDX-License-Identifier: MIT
 *
 * Copyright (C) 2019-2020 WireGuard LLC. All Rights Reserved.
 */

using System;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;

namespace Tunnel
{
    class Program
    {

        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(SetConsoleCtrlEventHandler handler, bool add);
        private delegate bool SetConsoleCtrlEventHandler(UInt32 signal);

        public static void Main(string[] args)
        {
            if (args.Length == 2 && args[0] == "/service")
            {
                Service.Run(args[1]);
                return;
            }

            var baseDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
            var configFile = Path.Combine(baseDirectory, "demobox.conf");
            var logFile = Path.Combine(baseDirectory, "log.bin");

            try { File.Delete(logFile); } catch { }
            Ringlogger log = new Ringlogger(logFile, "GUI");

            var logPrintingThread = new Thread(() =>
            {
                var cursor = Ringlogger.CursorAll;
                while (Thread.CurrentThread.IsAlive)
                {
                    var lines = log.FollowFromCursor(ref cursor);
                    foreach (var line in lines)
                        Console.WriteLine(line);
                    Thread.Sleep(300);
                }
            });
            logPrintingThread.Start();

            log.Write("Generating keys");
            var keys = Keypair.Generate();
            log.Write("Exchanging keys with demo server");
            var client = new TcpClient("demo.wireguard.com", 42912);
            var stream = client.GetStream();
            var reader = new StreamReader(stream, Encoding.UTF8);
            var pubKeyBytes = Encoding.UTF8.GetBytes(keys.Public + "\n");
            stream.Write(pubKeyBytes, 0, pubKeyBytes.Length);
            stream.Flush();
            var ret = reader.ReadLine().Split(':');
            client.Close();
            var status = ret.Length >= 1 ? ret[0] : "";
            var serverPubkey = ret.Length >= 2 ? ret[1] : "";
            var serverPort = ret.Length >= 3 ? ret[2] : "";
            var internalIP = ret.Length >= 4 ? ret[3] : "";

            if (status != "OK")
                throw new InvalidOperationException(String.Format("Server status is {0}", status));

            SetConsoleCtrlHandler(delegate
            {
                Service.Remove(configFile);
                Environment.Exit(0);
                return true;
            }, true);

            log.Write("Writing config file to disk");
            var configFileContents = String.Format("[Interface]\nPrivateKey = {0}\nAddress = {1}/24\nDNS = 8.8.8.8, 8.8.4.4\n\n[Peer]\nPublicKey = {2}\nEndpoint = demo.wireguard.com:{3}\nAllowedIPs = 0.0.0.0/0\n", keys.Private, internalIP, serverPubkey, serverPort);
            File.WriteAllText(configFile, configFileContents);

            try
            {
                Service.Add(configFile);
                logPrintingThread.Join();
            }
            finally
            {
                Service.Remove(configFile);
            }
        }
    }
}