public SpanBuffer <byte> ToPacketBinary() { WpcItemList list = new WpcItemList(); var packData = this.Pack.WriteToBuf().ByteData; list.Add("PACK", packData); var hashData = Secure.HashSHA1(packData); list.Add("HASH", hashData); if (this.HostKey._IsFilled() && this.HostSecret2._IsFilled()) { var hostKeyData = this.HostKey._GetHexBytes(); var hostSecret2Data = this.HostSecret2._GetHexBytes(); if (hostKeyData.Length != 20) { throw new CoresLibException("hostKeyData.Length != 20"); } if (hostSecret2Data.Length != 20) { throw new CoresLibException("hostSecret2Data.Length != 20"); } list.Add("HOST", hostKeyData); list.Add("HOST", hostSecret2Data); } return(list.ToPacketBinary()); }
public static WpcItemList Parse(ref ReadOnlySpanBuffer <byte> buf) { WpcItemList ret = new WpcItemList(); while (true) { if (WpcItem.Parse(ref buf, out string name, out ReadOnlyMemory <byte> data) == false) { break; } ret.Add(name, data); } return(ret); }
public static WpcPack Parse(string recvStr, bool requireKeyAndSecret) { WpcItemList items = WpcItemList.Parse(recvStr); var packItem = items.Find("PACK"); var hashItem = items.Find("HASH"); var hostKeyItem = items.Find("HOST", 0); var hostSecret2Item = items.Find("HOST", 1); if (packItem == null || hashItem == null) { throw new CoresLibException("packItem == null || hashItem == null"); } var hash = Secure.HashSHA1(packItem.Data.Span).AsSpan(); if (hash._MemEquals(hashItem.Data.Span) == false) { throw new CoresLibException("Different hash"); } Buf buf = new Buf(packItem.Data.ToArray()); var pack = Pack.CreateFromBuf(buf); string hostKey = ""; string hostSecret2 = ""; if (requireKeyAndSecret) { if (hostKeyItem == null || hostKeyItem.Data.Length != 20) { throw new CoresLibException("hostKeyItem == null || hostKeyItem.Data.Length != 20"); } if (hostSecret2Item == null || hostSecret2Item.Data.Length != 20) { throw new CoresLibException("hostSecret2Item == null || hostSecret2Item.Data.Length != 20"); } } hostKey = hostKeyItem?.Data._GetHexString() ?? ""; hostSecret2 = hostSecret2Item?.Data._GetHexString() ?? ""; return(new WpcPack(pack, hostKey, hostSecret2)); }