public bool Check() { byte[] hashdata = SignTool.HexString2Bytes(sha256); var hash = SignTool.ComputeSHA256(data, 0, data.Length); var hashstr = SignTool.Bytes2HexString(hash, 0, hash.Length); match = (hashstr.ToUpper() == sha256.ToUpper()); return(match); }
void OnMsg(Message msg) { Message srcmsg = null; if (msg.tag1 == 0x00 || msg.tag2 >= 0xa0)//如果是一条回复消息,找原始消息 { if (this.needBackMessage.ContainsKey(msg.msgid)) { srcmsg = this.needBackMessage[msg.msgid]; } else { return; } } System.Threading.ThreadPool.QueueUserWorkItem(async(_state) => { #region 0x01 if (msg.tag1 == 0x01 && msg.tag2 == 0x01) { //recv a file var len = msg.readUInt32(0); var hash = msg.readHash256(4); var block = dataTable.newOrGet(hash, len, NeoDun.DataBlockFrom.FromSigner); var piececount = len / 50; if (len % 50 > 0) { piececount++; } await System.Threading.Tasks.Task.Delay(50);//add bu hkh 1216 System.Threading.ThreadPool.QueueUserWorkItem((__state) => { NeoDun.Message _msg = new NeoDun.Message(); _msg.tag1 = 0x01; _msg.tag2 = 0x10; _msg.msgid = NeoDun.SignTool.RandomShort(); _msg.writeUInt16(0, 0); _msg.writeUInt16(2, (UInt16)(piececount - 1)); _msg.writeHash256(4, hash); SendMessage(_msg, true); }); } if (msg.tag1 == 0x01 && msg.tag2 == 0x10)//请求数据 { int blockbegin = BitConverter.ToUInt16(msg.data, 0); int blockend = BitConverter.ToUInt16(msg.data, 2); string hash = SignTool.Bytes2HexString(msg.data, 4, 32); var block = dataTable.getBlockBySha256(hash); if (block == null) { //发送错误回应,下一步再说 } else { for (var i = blockbegin; i < blockend + 1; i++) { Message msg1 = new Message(); block.FillPieceMessage(msg1, msg.msgid, (UInt16)i); SendMessage(msg1, false); } //Send0103 Message msg2 = new Message(); msg2.tag1 = 0x01; msg2.tag2 = 0xa3; msg2.msgid = msg.msgid;//这是一条回复消息 SendMessage(msg2, false); } } if (msg.tag1 == 0x01 && msg.tag2 == 0x11)//给数据分配编号 { var remoteid = msg.readUInt32(0); var hash = msg.readHash256(4); var block = dataTable.getBlockBySha256(hash); block.dataidRemote = (uint)remoteid; } if (msg.tag1 == 0x01 && msg.tag2 == 0x12) { var remoteid = msg.readUInt32(0); var hash = msg.readHash256(4); var block = dataTable.getBlockBySha256(hash); block.dataidRemote = (uint)remoteid; } if (msg.tag1 == 0x01 && msg.tag2 == 0xa2)//收到一个分片 { var hash = srcmsg.readHash256(4); var data = dataTable.getBlockBySha256(hash); data.FromPieceMsg(msg); } if (msg.tag1 == 0x01 && msg.tag2 == 0xa3)//接收完毕 { var hash = srcmsg.readHash256(4); var data = dataTable.getBlockBySha256(hash); bool bcheck = data.Check(); if (bcheck) {//数据接收完整 System.Threading.ThreadPool.QueueUserWorkItem((__state) => { NeoDun.Message _msg = new NeoDun.Message(); _msg.tag1 = 0x01; _msg.tag2 = 0x11; _msg.msgid = NeoDun.SignTool.RandomShort(); _msg.writeUInt32(0, data.dataid); _msg.writeHash256(4, hash); SendMessage(_msg, false); }); } else {//数据接收完毕,但是hash256 不匹配 System.Threading.ThreadPool.QueueUserWorkItem((__state) => { NeoDun.Message _msg = new NeoDun.Message(); _msg.tag1 = 0x01; _msg.tag2 = 0x12; _msg.msgid = NeoDun.SignTool.RandomShort(); _msg.writeUInt32(0, data.dataid); _msg.writeHash256(4, hash); SendMessage(_msg, false); }); } } #endregion //设置地址名称失败 if (msg.tag1 == 0x02 && msg.tag2 == 0xe2) { EnumErrorCode errorCode = (EnumErrorCode)msg.readUInt16(0); eventHandler(EnumControl.SetName, EnumMsgCode.SetNameFailed, errorCode); } //删除地址失败 if (msg.tag1 == 0x02 && msg.tag2 == 0xe3) { EnumErrorCode errorCode = (EnumErrorCode)msg.readUInt16(0); eventHandler(EnumControl.DelAddress, EnumMsgCode.DeleteNameFailed, errorCode); } //增加地址失败 if (msg.tag1 == 0x02 && msg.tag2 == 0xe4) { EnumErrorCode errorCode = (EnumErrorCode)msg.readUInt16(0); eventHandler(EnumControl.AddAddress, EnumMsgCode.AddAddressFailed, errorCode); } //签名失败 if (msg.tag1 == 0x02 && msg.tag2 == 0xe5) { EnumErrorCode errorCode = (EnumErrorCode)msg.readUInt16(0); eventHandler(EnumControl.SignData, EnumMsgCode.SignFailed, errorCode); } //安装失败 if (msg.tag1 == 0x03 && msg.tag2 == 0xe1) { EnumErrorCode errorCode = (EnumErrorCode)msg.readUInt16(0); eventHandler(EnumControl.Common, EnumMsgCode.InstallFailed, errorCode); } //拒绝更新固件 if (msg.tag1 == 0x03 && msg.tag2 == 0xe2) { eventHandler(EnumControl.ApplyInstallFramework, EnumMsgCode.RefuseUpdate, EnumErrorCode.NoError); } //卸载失败 if (msg.tag1 == 0x03 && msg.tag2 == 0xe3) { EnumErrorCode errorCode = (EnumErrorCode)msg.readUInt16(0); eventHandler(EnumControl.UninstallPlugin, EnumMsgCode.UninstallFailed, errorCode); } //收到地址,//加进地址池子里 if (msg.tag1 == 0x02 && msg.tag2 == 0xa0) { var epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; var pos = msg.readUInt16(0); var count = msg.readUInt16(2); var type = (NeoDun.AddressType)msg.readUInt16(4); var add = new NeoDun.Address(); add.type = type; add.AddressText = SignTool.EncodeBase58(msg.data, 6, 25); add.name = System.Text.Encoding.UTF8.GetString(msg.data, 32, 6).Replace("\0", ""); addressPool.addresses.Add(add); } //地址接受完毕 if (msg.tag1 == 0x02 && msg.tag2 == 0xa1) { eventHandler(EnumControl.GetAddress, EnumMsgCode.GetAddressSuc, EnumErrorCode.NoError); } //设置地址名称成功 if (msg.tag1 == 0x02 && msg.tag2 == 0xa2) { eventHandler(EnumControl.SetName, EnumMsgCode.SetNameSuc, EnumErrorCode.NoError); } //删除地址成功 if (msg.tag1 == 0x02 && msg.tag2 == 0xa3) { eventHandler(EnumControl.DelAddress, EnumMsgCode.DeleteNameSuc, EnumErrorCode.NoError); } //增加地址成功 if (msg.tag1 == 0x02 && msg.tag2 == 0xa4) { eventHandler(EnumControl.AddAddress, EnumMsgCode.AddAddressSuc, EnumErrorCode.NoError); } //签名成功 if (msg.tag1 == 0x02 && msg.tag2 == 0xa5) { byte[] outdata = null; string outdatahash = null; outdatahash = msg.readHash256(4); //轮询直到reciveid的数据被收到 while (true) { await Task.Delay(5); var __block = dataTable.getBlockBySha256(outdatahash); if (__block != null && __block.Check()) { outdata = __block.data; break; } } eventHandler(EnumControl.SignData, EnumMsgCode.SignSuc, EnumErrorCode.NoError, outdata); } //安装成功 if (msg.tag1 == 0x03 && msg.tag2 == 0xa1) { eventHandler(EnumControl.Common, EnumMsgCode.InstallSuc, EnumErrorCode.NoError); } //同意更新固件 if (msg.tag1 == 0x03 && msg.tag2 == 0xa2) { eventHandler(EnumControl.ApplyInstallFramework, EnumMsgCode.AgreeUpdate, EnumErrorCode.NoError); } //卸载成功 if (msg.tag1 == 0x03 && msg.tag2 == 0xa3) { eventHandler(EnumControl.UninstallPlugin, EnumMsgCode.UninstallSuc, EnumErrorCode.NoError); } //查询固件插件版本回复 if (msg.tag1 == 0x03 && msg.tag2 == 0xa4) { byte[] outdata = null; outdata = msg.data; eventHandler(EnumControl.GetPackage, EnumMsgCode.GetMessageSuc, EnumErrorCode.NoError, outdata); } //下位机请求更新固件 if (msg.tag1 == 0x03 && msg.tag2 == 0x11) { deleInstallFramework(); } //安全通道回复 if (msg.tag1 == 0x04 && msg.tag2 == 0xa1) { byte[] outdata = null; string outdatahash = null; outdatahash = msg.readHash256(4); //轮询直到reciveid的数据被收到 while (true) { await Task.Delay(5); var __block = dataTable.getBlockBySha256(outdatahash); if (__block != null && __block.Check()) { outdata = __block.data; break; } } eventHandler(EnumControl.SecurityChannel, EnumMsgCode.BuildSecurityChannelSuc, EnumErrorCode.NoError, outdata); } }); watcherColl.OnRecv(msg, srcmsg); //if (userHandleRecv != null) //{ // userHandleRecv(msg, srcmsg); //} }
public string readHash256(int pos, int len = 32) { return(SignTool.Bytes2HexString(data, pos, len)); }