title: Calculating HMACSHA256 using c# to match payment provider example
body: <p>For a payment provider, I need to calculate a hash-based message authentication code, using HMAC-SHA256. That is causing me quite a bit of trouble.</p>
  
  <p>The payment provider gives two examples of orrectly calculated authentication code in pseudo-code. All keys are in hex.</p>
  
  <h3>Method 1</h3>
  
  <pre><code>key = 57617b5d2349434b34734345635073433835777e2d244c31715535255a366773755a4d70532a5879793238235f707c4f7865753f3f446e633a21575643303f66
  message = "amount=100&amp;currency=EUR"
  MAC = HMAC-SHA256( hexDecode(key), message )
  result = b436e3e86cb3800b3864aeecc8d06c126f005e7645803461717a8e4b2de3a905
  </code></pre>
  
  <h3>Method 2</h3>
  
  <pre><code>message = "amount=100&amp;currency=EUR"
  Ki = 61574d6b157f757d02457573556645750e0341481b127a07476303136c005145436c7b46651c6e4f4f040e1569464a794e534309097258550c17616075060950
  Ko = 0b3d27017f151f17682f1f193f0c2f1f64692b227178106d2d096979066a3b2f2906112c0f760425256e647f032c2013243929636318323f667d0b0a1f6c633a
  MAC = SHA256( hexDecode(Ko) + SHA256( hexDecode(Ki) + message ) )
  result = b436e3e86cb3800b3864aeecc8d06c126f005e7645803461717a8e4b2de3a905
  </code></pre>
  
  <p>I tried to write the code to do this, after doing some research, but I keep coming up with different results.</p>
  
  <pre><code>private static void Main(string[] args)
      {
          var key = "57617b5d2349434b34734345635073433835777e2d244c31715535255a366773755a4d70532a5879793238235f707c4f7865753f3f446e633a21575643303f66";
          var ki = "61574d6b157f757d02457573556645750e0341481b127a07476303136c005145436c7b46651c6e4f4f040e1569464a794e534309097258550c17616075060950";
          var ko = "0b3d27017f151f17682f1f193f0c2f1f64692b227178106d2d096979066a3b2f2906112c0f760425256e647f032c2013243929636318323f667d0b0a1f6c633a";
          var mm = "amount=100&amp;currency=EUR";
  
          var result1 = CalcHMACSHA256Hash(HexDecode(key), mm);
  
          var result2 = CalcSha256Hash(string.Format("{0}{1}", HexDecode(ko), CalcSha256Hash(HexDecode(ki) + mm)));
  
          Console.WriteLine("Expected: b436e3e86cb3800b3864aeecc8d06c126f005e7645803461717a8e4b2de3a905");
          Console.WriteLine("Actual 1: " + result1);
          Console.WriteLine("Actual 2: " + result2);
  
          Console.WriteLine("------------------------------");
          Console.ReadKey();
  
      }
  
      private static string HexDecode(string hex)
      {
          var sb = new StringBuilder();
          for (int i = 0; i &lt;= hex.Length - 2; i += 2)
          {
              sb.Append(Convert.ToString(Convert.ToChar(Int32.Parse(hex.Substring(i, 2), System.Globalization.NumberStyles.HexNumber))));
          }
          return sb.ToString();
      }
  
      private static string CalcHMACSHA256Hash(string plaintext, string salt)
      {
          string result = "";
          var enc = Encoding.Default;
          byte[]
          baText2BeHashed = enc.GetBytes(plaintext),
          baSalt = enc.GetBytes(salt);
          System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
          byte[] baHashedText = hasher.ComputeHash(baText2BeHashed);
          result = string.Join("", baHashedText.ToList().Select(b =&gt; b.ToString("x2")).ToArray());
          return result;
      }
  
  
      public static string CalcSha256Hash(string input)
      {
          SHA256 sha256 = new SHA256Managed();
          byte[] sha256Bytes = Encoding.Default.GetBytes(input);
          byte[] cryString = sha256.ComputeHash(sha256Bytes);
          string sha256Str = string.Empty;
          for (int i = 0; i &lt; cryString.Length; i++)
          {
              sha256Str += cryString[i].ToString("x2");
          }
          return sha256Str;
      }
  </code></pre>
  
  <p>And this is the result I get:</p>
  
  <pre><code>Expected: b436e3e86cb3800b3864aeecc8d06c126f005e7645803461717a8e4b2de3a905
  Actual 1: 421ce16f2036bb9f2a3770c16f01e9220f0232d45580584ca41768fd16c15fe6
  Actual 2: 290f14398bf8c0959dfc963e2fd9c377534c6fec1983025d2ab192382f132b92
  </code></pre>
  
  <p>So with none of the two methods, I can get the result the provider example wants.</p>
  
  <p><strong>What am I missing here? Is it encoding? Is my hexDecode screwed up?</strong></p>
  
  <p>Test tool from payment provider: <a href="http://tech.dibs.dk/dibs_api/other_features/hmac_tool/">http://tech.dibs.dk/dibs_api/other_features/hmac_tool/</a></p>
  
  <p>PHP sample code: <a href="http://tech.dibspayment.com/dibs_api/other_features/mac_calculation/">http://tech.dibspayment.com/dibs_api/other_features/mac_calculation/</a></p>