public void CanGenerateValidMac()
        {
            /*
             The text string that will be hashed is the concatenation of the
             * <requestor>, <session>, <timestamp>, <routing>, <member>, and <account> fields.
             * RFC 2104 calls for a shared secret password that is used in creating the MAC.
             * Vertifi and the home banking services provider mutually agree on a key
             * (a minimum of 16-bytes in length), and a mechanism and schedule for periodically
             * refreshing this key.

             * http://www.briangrinstead.com/blog/multipart-form-post-in-c
             */

            var macMessage = GenerateMacMessage();
            var macSecretPassword = GenerateMacSecretPassword();

            var macHelper = new MacHelper();

            var mac = macHelper.BuildMac(macSecretPassword, macMessage);
            var macValidate = macHelper.BuildMac(macSecretPassword, macMessage);

            Assert.IsTrue(mac == macValidate);
        }
        public void SendRequest()
        {
            var macHelper = new MacHelper();
            var mac = macHelper.BuildMac(GenerateMacSecretPassword(), GenerateMacMessage());

            var postUrl = "http://testing.testing.com";
            var contentType = "multipart/form-data";
            var userAgent = "";

            var formDataStream = new System.IO.MemoryStream();
            var formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());

            var formData = new Dictionary<string, string>();
            formData.Add("requestor", "requestor1");
            formData.Add("session", "session1");
            formData.Add("timestamp", DateTime.UtcNow.ToString());
            formData.Add("routing", "routing1");
            formData.Add("member", "member1");
            formData.Add("account", "account1");
            formData.Add("MAC", mac);

            foreach (var data in formData)
            {
                var postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",
                    formDataBoundary,
                    data.Key,
                    data.Value);

                formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData));
            }

            formDataStream.Position = 0;
            byte[] formDataBytes = new byte[formDataStream.Length];
            formDataStream.Read(formDataBytes, 0, formDataBytes.Length);
            formDataStream.Close();

            HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;

            request.Method = "POST";
            request.ContentType = contentType;
            request.UserAgent = userAgent;
            request.CookieContainer = new CookieContainer();
            request.ContentLength = formDataBytes.Length;

            using (Stream requestStream = request.GetRequestStream())
            {
                requestStream.Write(formDataBytes, 0, formDataBytes.Length);
                requestStream.Close();
            }

            var webResponseText = "";
            var encoding = System.Text.Encoding.GetEncoding(1252);

            using (var webResponse = request.GetResponse() as HttpWebResponse)
            {
                using (var webResponseStream = new StreamReader(webResponse.GetResponseStream(), encoding))
                {
                    webResponseText = webResponseStream.ReadToEnd();
                }
            }
        }