using System.Security.Cryptography;
private static string merchantID = "fiservar_ypf";
private static string merchantKeyId = "113b3daf-463f-48da-92ec-617643dc9bf8";
private static string merchantsecretKey = "JuhZWLi7rwNqtnnPVYAttbyIRdwaDWOPXVPhkD/SHIc=";
private static string requestHost = "apitest.cybersource.com";
private static string body = @"{'encryptionType':'None'}";
private static string resource = "/flex/v1/keys";
public static void Main()
string gmtDateTime = DateTime.Now.ToUniversalTime().ToString("r");
Console.WriteLine(gmtDateTime);
Console.WriteLine(GenerateDigest(body));
Console.WriteLine(GenerateSignature(body, GenerateDigest(body), merchantKeyId, gmtDateTime, "post", resource));
public static string GenerateDigest(string request)
string digest = "DIGEST_PLACEHOLDER";
using (SHA256 sha256Hash = SHA256.Create())
byte[] payloadBytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(request));
digest = Convert.ToBase64String(payloadBytes);
digest = "SHA-256=" + digest;
Console.WriteLine("ERROR : " + ex.ToString());
public static string GenerateSignature(string request, string digest, string keyid, string gmtDateTime, string method, string resource)
StringBuilder signatureHeaderValue = new StringBuilder();
string algorithm = "HmacSHA256";
string postHeaders = "host date (request-target) digest v-c-merchant-id";
string getHeaders = "host date (request-target) v-c-merchant-id";
string url = "https://" + requestHost + resource;
string getRequestTarget = method + " " + resource;
string postRequestTarget = method + " " + resource;
StringBuilder signatureString = new StringBuilder();
signatureString.Append('\n');
signatureString.Append("host");
signatureString.Append(": ");
signatureString.Append(requestHost);
signatureString.Append('\n');
signatureString.Append("date");
signatureString.Append(": ");
signatureString.Append(gmtDateTime);
signatureString.Append('\n');
signatureString.Append("(request-target)");
signatureString.Append(": ");
if (method.Equals("post"))
signatureString.Append(postRequestTarget);
signatureString.Append('\n');
signatureString.Append("digest");
signatureString.Append(": ");
signatureString.Append(digest);
signatureString.Append(getRequestTarget);
signatureString.Append('\n');
signatureString.Append("v-c-merchant-id");
signatureString.Append(": ");
signatureString.Append(merchantID);
signatureString.Remove(0, 1);
byte[] signatureByteString = Encoding.UTF8.GetBytes(signatureString.ToString());
byte[] decodedKey = Convert.FromBase64String(merchantsecretKey);
HMACSHA256 aKeyId = new HMACSHA256(decodedKey);
byte[] hashmessage = aKeyId.ComputeHash(signatureByteString);
string base64EncodedSignature = Convert.ToBase64String(hashmessage);
signatureHeaderValue.Append("keyid=\"" + merchantKeyId + "\"");
signatureHeaderValue.Append(", algorithm=\"" + algorithm + "\"");
if (method.Equals("post"))
signatureHeaderValue.Append(", headers=\"" + postHeaders + "\"");
else if (method.Equals("get"))
signatureHeaderValue.Append(", headers=\"" + getHeaders + "\"");
signatureHeaderValue.Append(", signature=\"" + base64EncodedSignature + "\"");
Console.WriteLine("ERROR : " + ex.ToString());
return signatureHeaderValue.ToString();