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)); }
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); }
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); }