Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

YoBit tapi problems with authetincation

I am trying to write simple application for myself and when i try to call getInfo method i always get a error into the response. Key, sign, method or nonce is incorrect. I found a number of examples but i still can't find mistake in my code. Could anyone help me with it?

The code works fine for hitbtc. I know yobit is a bit different but I think I have accomodate that.

My code:

Protected Shared Function readStrings(signatureheader As String, host As String, pathandQuery As String, post As String, secret As String, hasher As System.Security.Cryptography.HMAC, otherHeaders As Tuple(Of String, String)()) As String
    'apikey=98998BEEB8796455044F02E4864984F4
    'secret=44b7659167ffc38bb34fa35b5c816cf5
    hasher.Key = exchanges.getBytes(secret)
    Dim url = host + pathandQuery ' url = "https://yobit.net/tapi/"
    Dim wc = New CookieAwareWebClient()
    Dim sigHash2 = ""

    If post = "" Then
        sigHash2 = CalculateSignature2(pathandQuery, hasher)
    Else
        'post = "method=getInfo&nonce=636431012620"
        sigHash2 = CalculateSignature2(post, hasher) 'sighash2= "ece0a3c4af0c68dedb1f840d0aef0fd5fb9fc5e808105c4e6590aa39f4643679af5da52b97d595cd2277642eb27b8a357793082007abe1a3bab8de8df24f80d2"
    End If

    wc.Headers.Add(signatureheader, sigHash2) ' SignatureHeader ="Sign"

    Dim response = ""

    For Each oh In otherHeaders ' otherHeaders =(0) {(Key, 98998BEEB8796455044F02E4864984F4)}   System.Tuple(Of String, String)
        wc.Headers.Add(oh.Item1, oh.Item2)
    Next

    '-      wc.Headers  {Sign: ece0a3c4af0c68dedb1f840d0aef0fd5fb9fc5e808105c4e6590aa39f4643679af5da52b97d595cd2277642eb27b8a357793082007abe1a3bab8de8df24f80d2  Key: 98998BEEB8796455044F02E4864984F4    } System.Net.WebHeaderCollection
    'url =  "https://yobit.net/tapi/"
    'post = "method=getInfo&nonce=636431012620"

    If post = "" Then
        response = wc.DownloadString(url)
    Else
        response = wc.UploadString(url, post) 'response =       response    "{"success":0,"error":"invalid key, sign, method or nonce"}"    String

    End If


    Return response
End Function

The code has been tested succesfully for hitbtc.

So the crypto part is correct. I put it here anyway for completeness

Protected Shared Function CalculateSignature2(text As String, hasher As System.Security.Cryptography.HMAC) As String
    Dim siginhash = hasher.ComputeHash(exchanges.getBytes(text))
    Dim sighash = exchanges.getString(siginhash)
    Return sighash
End Function

So,

for sanity check

This code works

Public Overrides Sub readbalances()
    Dim response = readStrings("X-Signature", "https://api.hitbtc.com", "/api/1/trading/balance?nonce=" + exchanges.getNonce().ToString + "&apikey=" + _apiKey, "", _secret, New System.Security.Cryptography.HMACSHA512(), {})


End Sub

With yobit things are different. I got to use post instead of get. I got to add more headers. However, I think I have fixed that.

It doesn't work.

The python function for yobit API is this I just need to translate that to vb.net which I think I have done faithfully

API Call Authentication in Python ( Working PHP example )

I think the mistake is around here

request_url = "https://yobit.net/tapi";
request_body = "method=TradeHistory&pair=ltc_btc&nonce=123";
signature = hmac_sha512(request_body,yobit_secret);
http_headers = {
    "Content-Type":"application/x-www-form-urlencoded",
    "Key":yobit_public_key,
    "Sign":signature
}

response = http_post_request(request_url,request_body,http_headers);
result = json_decode(response.text);

There the stuff that I copied is method=getInfo&nonce=636431012620 which is what I put in post.

So that seems right.

like image 975
Alex Avatar asked Aug 06 '17 09:08

Alex


1 Answers

Looks like it works.

I just need to change the nonce so that it's between 0 to 2^31

So this is the error

 post = "method=getInfo&nonce=636431012620

The nonce shouldn't be that big. At most it should be

2147483646

Also though not documented, I must add

content type as one of the header. This is the final solution

   Dim nonce = exchanges.getNonce().ToString
    Dim content = hashObject("", nonce, "method=getInfo&nonce=")
    Dim sighash = computeSig(content)
    Dim result = CookieAwareWebClient.downloadString1("https://yobit.net/tapi/", content, {New Tuple(Of String, String)("Key", _apiKey), New Tuple(Of String, String)("Sign", sighash), New Tuple(Of String, String)("Content-Type", "application/x-www-form-urlencoded")})

So I added New Tuple(Of String, String)("Content-Type", "application/x-www-form-urlencoded") as one of the headers

Protected Overridable Function computeSig(content As String) As String
    Dim hasher = New System.Security.Cryptography.HMACSHA512(System.Text.Encoding.UTF8.GetBytes(_secret))
    Return CalculateSignature2(content, hasher)
End Function

Public Shared Function CalculateSignature2(content As String, hasher As System.Security.Cryptography.HMAC) As String
    Dim siginhash = hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes(content))
    Dim sighash = exchanges.getString(siginhash) 'convert bytes to string
    Return sighash
End Function

Public Shared Function downloadString1(url As String, post As String, otherHeaders As Tuple(Of String, String)()) As String
    Dim wc = New CookieAwareWebClient()
    For Each oh In otherHeaders
        wc.Headers.Add(oh.Item1, oh.Item2)
    Next

    Dim response = String.Empty

    Try
        If post = "" Then
            response = wc.DownloadString(url)
        Else
            response = wc.UploadString(url, post)
        End If
    Catch ex As Exception
        Dim a = 1
    End Try

    Return response
End Function
like image 92
user4951 Avatar answered Oct 06 '22 01:10

user4951