예제 #1
0
        public static Akep2Message3 FromString(string str, byte[] longTermKey)
        {
            var contentBytes       = PemParser.GetMessageContentBytes(str);
            var contentObjectsList = (List <object>)SksAsn1Parser.Parse(contentBytes);

            var iv            = (byte[])contentObjectsList[0];
            var encryptedPart = (byte[])contentObjectsList[1];
            var hmacPart      = (byte[])contentObjectsList[2];

            var myHmac = SksHmac.Hash(longTermKey, encryptedPart);

            if (!Utils.CompareByteArrays(hmacPart, myHmac))
            {
                Logger.Log("AKEP2MESSAGE2:", "Hmac doesn't match");
                return(null);
            }

            var decryptedSequence = SksAes.DecryptBytesFromBytes_Aes(encryptedPart, longTermKey, iv);

            contentObjectsList = (List <object>)SksAsn1Parser.Parse(decryptedSequence);

            var a      = (string)contentObjectsList[0];
            var nonceB = (byte[])contentObjectsList[1];

            return(new Akep2Message3(a, nonceB, longTermKey));
        }
예제 #2
0
        public void SendChatMessage(string message)
        {
            Logger.Log(GetWholeLogTag(), $"SendChatMessage - Message: {message}");

            var secret = GetSecretFromProtocol();

            if (secret == null)
            {
                Logger.Log("USER:"******"Secret is null");
                return;
            }


            var iv = Utils.GenerateRandom16();
            var encryptedMessageBytes = SksAes.EncryptStringToBytes_Aes(message, secret, iv);
            var hmacBytes             = SksHmac.Hash(secret, Utils.StringToBytes(message));

            Logger.Log(GetWholeLogTag(), $"SendChatMessage - EcnryptedBytes: {string.Join(",", encryptedMessageBytes)}");
            Logger.Log(GetWholeLogTag(), $"SendChatMessage - Hmac: {string.Join(",", hmacBytes)}");

            var chatMessage  = new ChatMessage(iv, encryptedMessageBytes, hmacBytes);
            var finalMessage = chatMessage.ToString();

            Client.SendMessage(finalMessage);
        }
예제 #3
0
        public KdcHelloRequest(string name, byte[] kdcKey)
        {
            Iv = Utils.GenerateRandom16();

            Name = name;

            EncryptedName = SksAes.EncryptStringToBytes_Aes($"Hi I am \"{Name}\"", kdcKey, Iv);
        }
예제 #4
0
        private static void HandleChatMessage(SksMessageReceivedEventArgs sksMessageReceivedEventArgs)
        {
            var user = GetUserByIpAndPort(sksMessageReceivedEventArgs.FromIp, sksMessageReceivedEventArgs.FromPort);

            var message = ChatMessage.FromString(sksMessageReceivedEventArgs.Message);

            var secret = user.GetSecretFromProtocol();

            var messageStr = SksAes.DecryptStringFromBytes_Aes(message.EncryptedMessageBytes, secret, message.Iv);

            user.Client.OnChatMessageReceived(user.Client.tcpClient, messageStr);
        }
예제 #5
0
        public Akep2Message3(string a, byte[] nonceB, byte[] longTermKey)
        {
            Iv = Utils.GenerateRandom16();

            A      = a;
            NonceB = nonceB;

            var objects = new List <object> {
                A, NonceB
            };

            var sequence = SksAsn1Encoder.EncodeSequence(objects);

            EncryptedPart = SksAes.EncryptBytes_Aes(sequence, longTermKey, Iv);
            HmacPart      = SksHmac.Hash(longTermKey, sequence);
        }
예제 #6
0
        public static KdcHelloResponse FromString(string message, byte[] kdcKey)
        {
            var contentBytes       = PemParser.GetMessageContentBytes(message);
            var contentObjectsList = (List <object>)SksAsn1Parser.Parse(contentBytes);

            var iv            = (byte[])contentObjectsList[0];
            var encryptedPart = (byte[])contentObjectsList[1];

            var decryptedSequence = SksAes.DecryptBytesFromBytes_Aes(encryptedPart, kdcKey, iv);

            contentObjectsList = (List <object>)SksAsn1Parser.Parse(decryptedSequence);

            var users = new List <User>();

            foreach (var sequenceObj in contentObjectsList)
            {
                var sequence = (List <object>)sequenceObj;
                var ip       = (string)sequence[0];
                var port     = (string)sequence[1];
                var name     = (string)sequence[2];
                var key      = (byte[])sequence[3];
                var pass     = (string)sequence[4];

                var user = new User
                {
                    Password  = pass,
                    Key       = key,
                    Name      = name,
                    IpAddress = ip,
                    Port      = port,
                };

                users.Add(user);
            }

            return(new KdcHelloResponse
            {
                Users = users,
            });
        }