Пример #1
0
        public static string GeneratePacket(Pack pack, Cert cert, Rsa key)
        {
            Buf b = new Buf();

            byte[] pack_data = pack.WriteToBuf().ByteData;
            WpcEntry.AddDataEntry(b, "PACK", pack_data);

            byte[] hash = Secure.HashSHA1(pack_data);
            WpcEntry.AddDataEntry(b, "HASH", hash);

            if (cert != null && key != null)
            {
                WpcEntry.AddDataEntry(b, "CERT", cert.ByteData);
                WpcEntry.AddDataEntry(b, "SIGN", key.SignData(hash));
            }

            return(Str.AsciiEncoding.GetString(b.ByteData));
        }
Пример #2
0
        public static List <WpcEntry> ParseDataEntry(string str)
        {
            Buf             src = new Buf(Str.AsciiEncoding.GetBytes(str));
            List <WpcEntry> o   = new List <WpcEntry>();

            while (true)
            {
                byte[] entryNameByte = src.Read(4);
                if (entryNameByte.Length != 4)
                {
                    break;
                }
                byte[] sizeStrByte = src.Read(10);
                if (sizeStrByte.Length != 10)
                {
                    break;
                }
                string sizeStr = Str.AsciiEncoding.GetString(sizeStrByte);
                uint   size    = Str.StrToUInt(sizeStr);

                byte[] strData = src.Read(size);
                if ((uint)strData.Length != size)
                {
                    break;
                }

                string payload = Str.AsciiEncoding.GetString(strData);
                byte[] data    = Wpc.StrToByte(payload);

                WpcEntry e = new WpcEntry(entryNameByte, data);

                o.Add(e);
            }

            return(o);
        }
Пример #3
0
        public static WpcPacket ParsePacket(string recvStr)
        {
            List <WpcEntry> o = WpcEntry.ParseDataEntry(recvStr);

            WpcEntry e;

            try
            {
                e = WpcEntry.FindEntry(o, "PACK");
                if (e != null)
                {
                    byte[] hash = Secure.HashSHA1(e.Data);
                    Pack   pack = null;

                    pack = Pack.CreateFromBuf(new Buf(e.Data));

                    e = WpcEntry.FindEntry(o, "HASH");

                    if (e != null)
                    {
                        byte[] hash2 = e.Data;

                        if (Util.CompareByte(hash, hash2))
                        {
                            e = WpcEntry.FindEntry(o, "CERT");
                            if (e != null)
                            {
                                Cert cert;

                                try
                                {
                                    cert = new Cert(e.Data);
                                }
                                catch
                                {
                                    return(null);
                                }

                                e = WpcEntry.FindEntry(o, "SIGN");
                                if (e != null)
                                {
                                    byte[] sign = e.Data;

                                    if (cert.RsaPublicKey.VerifyData(hash2, sign))
                                    {
                                        return(new WpcPacket(pack, hash2, cert, sign));
                                    }
                                }
                            }
                            else
                            {
                                return(new WpcPacket(pack, hash2));
                            }
                        }
                    }
                }
            }
            catch (OverflowException)
            {
                return(null);
            }

            return(null);
        }