in reply to Re^2: HMAC Sha256 Help! (updated)
in thread HMAC Sha256 Help!

Well I don' really know what the expected output should be either, thats my issue really.

This does seem to be the central issue. Is there really no example transaction provided in the API documentation? Perhaps you could ask whomever published the API for one? Is there a reference implementation that you could look at? Even if it's in another programming language, you might be able to just read that, or, you could execute it and run a trace (Wireshark) of a successful request?

Replies are listed 'Best First'.
Re^4: HMAC Sha256 Help! (updated)
by ribble (Novice) on Jul 18, 2017 at 19:23 UTC

    unfortunately the documentation is lacking

    I have the following example using go

    // makeHmac: // non-exportable helper to do SHA256 HMAC func makeHmac(data string, key string) string { byteKey, _ := hex.DecodeString(key) byteData := []byte(data) sig := hmac.New(sha256.New, byteKey) sig.Write([]byte(byteData)) return base64.StdEncoding.EncodeToString(sig.Sum(nil)) }

    still none the wiser though!

    I do know that the app key provided should be treated as 32 2 byte values and not 64 1 byte values

    Its this handling of the 32 2 byte values I am unsure of

    thanks again for responding, its driving me slightly mad

      In case this helps, I ran the Go code

      package main import ( "fmt" "encoding/hex" "encoding/base64" "crypto/hmac" "crypto/sha256" ) func main() { x := makeHmac("abcdef","1234567890") fmt.Printf("%s\n", x) } func makeHmac(data string, key string) string { byteKey, _ := hex.DecodeString(key) byteData := []byte(data) sig := hmac.New(sha256.New, byteKey) sig.Write([]byte(byteData)) return base64.StdEncoding.EncodeToString(sig.Sum(nil)) }

      and the result was

      1CBMzMydzanzzzHwnZKJEswN1jqvKZiI3fwBw81t1f4=

      Running this perl

      #!perl use strict; use Digest::SHA qw( hmac_sha256_base64 ); my $digest = hmac_sha256_base64("abcdef", pack "H*",'1234567890'); print $digest;

      gave the same but without the padding

      1CBMzMydzanzzzHwnZKJEswN1jqvKZiI3fwBw81t1f4
      poj

      1. updated with perl code
      
      2. updated with full example code below both giving same result
      GET\n08 Apr 2015 21:37:33 GMT\nd6468df6c1e8419fb5ec50f62be9a28b\n/xxxxxxxxxxxx/xxxxxxx/api/v1/users/xxxxx/factors
      ApplicationID:2LIG2VOfl6swsD6rwRxBHW64dF6WK0vOO+b+VO/UbTk=
      Basic :QXBwbGljYXRpb25JRDoyTElHMlZPZmw2c3dzRDZyd1J4QkhXNjRkRjZXSzB2T08rYitWTy9VYlRrPQ==
      
      
      #!perl use strict; use Digest::SHA qw( hmac_sha256_base64 ); use MIME::Base64; my $datestring = '08 Apr 2015 21:37:33 GMT'; my $method = 'GET'; my $appid = 'd6468df6c1e8419fb5ec50f62be9a28b'; my $appkey = '15c7a6e1a5bd73500db29dffd0e19b6c6228b044c64348a6f5d6d470 +c54fc208'; my $path = '/xxxxxxxxxxxx/xxxxxxx/api/v1/users/xxxxx/factors'; # build the hash string my $step1 = "$method\\n$datestring\\n$appid\\n$path"; print "$step1\n"; # hmac, base64 and add padding my $step3 = hmac_sha256_base64($step1, pack "H*",$appkey); while (length($step3) % 4) { $step3 .= '='; } my $step4 = 'ApplicationID:'.$step3; print "$step4\n"; my $step6 = "Basic :".encode_base64($step4,''); print "$step6\n";
      // GO code package main import ( "fmt" "encoding/hex" "encoding/base64" "crypto/hmac" "crypto/sha256" ) func main() { datestring := "08 Apr 2015 21:37:33 GMT" appid := "d6468df6c1e8419fb5ec50f62be9a28b" appkey:= "15c7a6e1a5bd73500db29dffd0e19b6c6228b044c64348a6f5d6d470c5 +4fc208" path := "/xxxxxxxxxxxx/xxxxxxx/api/v1/users/xxxxx/factors" step1 := "GET\\n"+datestring+"\\n"+appid+"\\n"+path fmt.Printf("%s\n",step1) step4 := "ApplicationID:" + makeHmac( step1, appkey ) fmt.Printf("%s\n",step4) step6 := "Basic :" + base64.StdEncoding.EncodeToString([]byte(step4) +) fmt.Printf("%s\n", step6) } func makeHmac(data string, key string) string { byteKey, _ := hex.DecodeString(key) byteData := []byte(data) sig := hmac.New(sha256.New, byteKey) sig.Write([]byte(byteData)) return base64.StdEncoding.EncodeToString(sig.Sum(nil)) }