internal static string GenerateSig(ClientHeader header, XMMsgBind bind, string challenge, string securityKey) { Hashtable paramsMap = new Hashtable(); paramsMap.Add("challenge", challenge); paramsMap.Add("token", bind.token); paramsMap.Add("chid", header.chid); paramsMap.Add("from", String.Format("{0}@xiaomi.com/{1}", header.uuid, header.resource)); paramsMap.Add("id", header.id); paramsMap.Add("to", Constant.SERVER); paramsMap.Add("kick", bind.kick); paramsMap.Add("client_attrs", bind.client_attrs == null ? "" : bind.client_attrs); paramsMap.Add("cloud_attrs", bind.cloud_attrs == null ? "" : bind.cloud_attrs); ArrayList exps = new ArrayList(); exps.Add(bind.method.ToUpper()); ArrayList lst = new ArrayList(paramsMap.Keys); lst.Sort(); foreach (string key in lst) { exps.Add(String.Format("{0}={1}", key, paramsMap[key])); } exps.Add(securityKey); //logger.DebugFormat("GenerateSig =======securityKey:{0}", securityKey); bool first = true; StringBuilder sb = new StringBuilder(); foreach (String s in exps) { if (!first) { sb.Append('&'); } sb.Append(s); first = false; } //logger.DebugFormat(sb.ToString()); return(Hash4SHA1(sb.ToString())); }
public static V6Packet BuildBindPacket(MIMCUser user) { if (string.IsNullOrEmpty(user.Token)) { logger.DebugFormat("{0} User BuildBindPacket fail Token is null,wait ...", user.AppAccount); return(null); } logger.DebugFormat("{0} User BuildBindPacket", user.AppAccount); ClientHeader clientHeader = MIMCUtil.CreateClientHeader(user, Constant.CMD_BIND, Constant.CIPHER_NONE, MIMCUtil.CreateMsgId(user)); XMMsgBind xMMsgBind = new XMMsgBind(); xMMsgBind.token = user.Token; xMMsgBind.method = Constant.METHOD; xMMsgBind.client_attrs = user.ClientAttrs; xMMsgBind.cloud_attrs = user.CloudAttrs; xMMsgBind.kick = Constant.NO_KICK; string sign = MIMCUtil.GenerateSig(clientHeader, xMMsgBind, user.Connection.Challenge, user.SecurityKey); if (String.IsNullOrEmpty(sign)) { logger.WarnFormat("GenerateSig fail sign is null"); return(null); } xMMsgBind.sig = sign; V6Packet v6Packet = new V6Packet(); V6Body v6Body = new V6Body(); v6Body.PayloadType = Constant.PAYLOAD_TYPE; v6Body.ClientHeader = clientHeader; using (MemoryStream ms = new MemoryStream()) { Serializer.Serialize(ms, xMMsgBind); byte[] payload = ms.ToArray(); v6Body.Payload = payload; v6Packet.Body = v6Body; } return(v6Packet); }