protected override Uri ProcessRequestUrl(UriBuilder url, Dictionary <string, object> payload, string method) { if (CanMakeAuthenticatedRequest(payload)) { // must sort case sensitive var dict = new SortedDictionary <string, object>(StringComparer.Ordinal) { ["Timestamp"] = CryptoUtility.UnixTimeStampToDateTimeMilliseconds(payload["nonce"].ConvertInvariant <long>()).ToString("s"), ["AccessKeyId"] = PublicApiKey.ToUnsecureString(), ["SignatureMethod"] = "HmacSHA256", ["SignatureVersion"] = "2" }; if (method == "GET") { foreach (var kv in payload) { dict.Add(kv.Key, kv.Value); } } string msg = CryptoUtility.GetFormForPayload(dict, false, false, false); string toSign = $"{method}\n{url.Host}\n{url.Path}\n{msg}"; // calculate signature var sign = CryptoUtility.SHA256SignBase64(toSign, PrivateApiKey.ToBytesUTF8()).UrlEncode(); // append signature to end of message msg += $"&Signature={sign}"; url.Query = msg; } return(url.Uri); }
protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { if (CanMakeAuthenticatedRequest(payload)) { string payloadForm = CryptoUtility.GetFormForPayload(payload, false); request.AddHeader("API-Key", PublicApiKey.ToUnsecureString()); request.AddHeader("Sign", CryptoUtility.SHA256Sign(payloadForm, PrivateApiKey.ToBytesUTF8()).ToUpperInvariant()); await request.WriteToRequestAsync(payloadForm); } }
protected override Uri ProcessRequestUrl(UriBuilder url, Dictionary <string, object> payload, string method) { if (CanMakeAuthenticatedRequest(payload)) { if (!payload.ContainsKey("method")) { return(url.Uri); } method = payload["method"].ToStringInvariant(); payload.Remove("method"); var dict = new Dictionary <string, object> { ["Timestamp"] = DateTime.UtcNow.ToString("s"), ["AccessKeyId"] = PublicApiKey.ToUnsecureString(), ["SignatureMethod"] = "HmacSHA256", ["SignatureVersion"] = "2" }; string msg = null; if (method == "GET") { dict = dict.Concat(payload).ToDictionary(x => x.Key, x => x.Value); } msg = CryptoUtility.GetFormForPayload(dict, false); // must sort case sensitive msg = string.Join("&", new SortedSet <string>(msg.Split('&'), StringComparer.Ordinal)); StringBuilder sb = new StringBuilder(); sb.Append(method).Append("\n") .Append(url.Host).Append("\n") .Append(url.Path).Append("\n") .Append(msg); var sign = CryptoUtility.SHA256SignBase64(sb.ToString(), PrivateApiKey.ToBytesUTF8()); var signUrl = sign.UrlEncode(); msg += $"&Signature={signUrl}"; /* * // Huobi rolled this back, it is no longer needed. Leaving it here in case they change their minds again. * // https://github.com/huobiapi/API_Docs_en/wiki/Signing_API_Requests * // API Authentication Change * var privateSign = GetPrivateSignatureStr(Passphrase.ToUnsecureString(), sign); * var privateSignUrl = privateSign.UrlEncode(); * msg += $"&PrivateSignature={privateSignUrl}"; */ url.Query = msg; } return(url.Uri); }