Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bitstamp - new authentication in C# - signature

The new authentication of bitstamp says the following:

Signature is a HMAC-SHA256 encoded message containing: nonce, client ID and API key. The HMAC-SHA256 code must be generated using a secret key that was generated with your API key. This code must be converted to it's hexadecimal representation (64 uppercase characters).Example (Python): message = nonce + client_id + api_key signature = hmac.new(API_SECRET, msg=message, digestmod=hashlib.sha256).hexdigest().upper()

Source: link

I've got the following code to add the new signature (and other parameters):

public void AddApiAuthentication(RestRequest restRequest)
    {
        var nonce = DateTime.Now.Ticks;
        var signature = GetSignature(nonce, apiKey, apiSecret, clientId);

        restRequest.AddParameter("key", apiKey);
        restRequest.AddParameter("signature", signature);
        restRequest.AddParameter("nonce", nonce);

    }

    private string GetSignature(long nonce, string key, string secret, string clientId)
    {
        string msg = string.Format("{0}{1}{2}", nonce,
            clientId,
            key);

        return ByteArrayToString(SignHMACSHA256(secret, StrinToByteArray(msg))).ToUpper();
    }
    public static byte[] SignHMACSHA256(String key, byte[] data)
    {
        HMACSHA256 hashMaker = new HMACSHA256(Encoding.ASCII.GetBytes(key));
        return hashMaker.ComputeHash(data);
    }

    public static byte[] StrinToByteArray(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    public static string ByteArrayToString(byte[] hash)
    {
        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }

And then I get this error:

{"error": "Invalid signature"}

Anyone got an idea what the problem could be? I checked my parameters a 100 times and those aren't wrong. Maybe somebody got a working piece of code (in C#) for the new authentication?

UPDATE

Abhinav was right, the StringToByteArray method was wrong (not only the typo :P) the working code is:

public static byte[] StrinToByteArray(string str)
    {
        return System.Text.Encoding.ASCII.GetBytes(str);
    }
like image 233
Julian Avatar asked Oct 31 '13 21:10

Julian


1 Answers

You are using str.ToCharArray() in StrinToByteArray which is incorrect (correct ONLY when used on the same system). You need to use ASCII encoding or something.

like image 183
Abhinav Avatar answered Sep 25 '22 15:09

Abhinav