diff --git a/Nexmo.Api/Cryptography/SmsSignatureGenerator.cs b/Nexmo.Api/Cryptography/SmsSignatureGenerator.cs index 03fecde81..125db1cf0 100644 --- a/Nexmo.Api/Cryptography/SmsSignatureGenerator.cs +++ b/Nexmo.Api/Cryptography/SmsSignatureGenerator.cs @@ -20,20 +20,18 @@ public enum Method } public static string GenerateSignature(string query, string securitySecret, Method method) { - var queryToSign = "&" + query; - queryToSign = queryToSign.Remove(queryToSign.Length - 1); // security secret provided, sort and sign request if (method == Method.md5hash) { - queryToSign += securitySecret; + query += securitySecret; var hashgen = MD5.Create(); - var hash = hashgen.ComputeHash(Encoding.UTF8.GetBytes(queryToSign)); + var hash = hashgen.ComputeHash(Encoding.UTF8.GetBytes(query)); return ByteArrayToHexHelper.ByteArrayToHex(hash).ToLower(); } else { var securityBytes = Encoding.UTF8.GetBytes(securitySecret); - var input = Encoding.UTF8.GetBytes(queryToSign); + var input = Encoding.UTF8.GetBytes(query); HMAC hmacGen = new HMACMD5(securityBytes); switch (method) { diff --git a/Nexmo.Api/Request/ApiRequest.cs b/Nexmo.Api/Request/ApiRequest.cs index 4f0912e67..1d4b01fb3 100644 --- a/Nexmo.Api/Request/ApiRequest.cs +++ b/Nexmo.Api/Request/ApiRequest.cs @@ -68,7 +68,9 @@ private static StringBuilder BuildQueryString(IDictionary parame var sortedParams = new SortedDictionary(parameters); buildStringFromParams(sortedParams, sb); buildSignatureStringFromParams(sortedParams, signature_sb); - var signature = SmsSignatureGenerator.GenerateSignature(signature_sb.ToString(), securitySecret, method); + var queryToSign = "&" + signature_sb.ToString(); + queryToSign = queryToSign.Remove(queryToSign.Length - 1); + var signature = SmsSignatureGenerator.GenerateSignature(queryToSign, securitySecret, method); sb.AppendFormat("sig={0}", signature); return sb; } diff --git a/Nexmo.Api/SMS.cs b/Nexmo.Api/SMS.cs index b8c3c5a8d..189dc15a5 100644 --- a/Nexmo.Api/SMS.cs +++ b/Nexmo.Api/SMS.cs @@ -1,4 +1,9 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using Nexmo.Api.Request; @@ -301,7 +306,7 @@ public class SMSInbound /// The time at UTC�00:00 that Nexmo started to push this inbound message to your webhook endpoint. The message-timestamp is in the following format YYYY-MM-DD HH:MM:SS. For example, 2020-01-01 12:00:00. /// [JsonProperty("message-timestamp")] - public DateTime message_timestamp { get; set; } + public string message_timestamp { get; set; } /// /// A unix timestamp representation of message-timestamp. /// @@ -359,6 +364,37 @@ public class SMSInbound /// Signature if Applicable /// public string sig { get; set; } + + /// + /// converts dictionary into properly formatted signature string + /// + /// + /// + public static string ConstructSignatureStringFromDictionary(Dictionary query) + { + try + { + var sig_sb = new StringBuilder(); + var sorted_dict = new SortedDictionary(StringComparer.Ordinal); + foreach (var key in query.Keys) + { + sorted_dict.Add(key, query[key].ToString()); + } + foreach (var key in sorted_dict.Keys) + { + if (key == "sig") + { + continue; + } + sig_sb.AppendFormat("&{0}={1}", key.Replace('=', '_').Replace('&', '_'), sorted_dict[key].ToString().Replace('=', '_').Replace('&', '_')); + } + return sig_sb.ToString(); + } + catch + { + return ""; + } + } } ///