javascript - Problems with cross-language HMAC / SHA256 / Base64 -


i'm using node.js script create signature azure documentdb - simplified version (result @ bottom):-

var crypto = require("crypto");  var masterkey = "abcde" var key = new buffer(masterkey, "base64"); var signature = crypto.createhmac("sha256", key).update("fghij").digest("base64");  console.log("\n\n"+signature)  // rnkid54/1h1h9p3nwpera0mow2l0c0hujgtty2gpbdo= 

this works, , need to. i'm trying same thing in swift commoncrypto

let keystring = "abcde" let body = "fghij"  let utf8data = keystring.datausingencoding(nsutf8stringencoding) let key = utf8data!.base64encodeddatawithoptions(nsdatabase64encodingoptions(rawvalue: 0))  let str = body.cstringusingencoding(nsutf8stringencoding) let strlen = body.lengthofbytesusingencoding(nsutf8stringencoding) let digestlen = int(cc_sha256_digest_length) let result = unsafemutablepointer<cunsignedchar>.alloc(digestlen)  cchmac(cchmacalgorithm(kcchmacalgsha256), key.bytes, key.length, str!, strlen, result);  var hmacdata = nsdata(bytes: result, length: digestlen) var hmacbase64 = hmacdata.base64encodedstringwithoptions(nsdatabase64encodingoptions(rawvalue: 0))  result.dealloc(digestlen)  let signature = string(hmacbase64)  let test = "rnkid54/1h1h9p3nwpera0mow2l0c0hujgtty2gpbdo=" xctassert(test == signature, "pass") 

but returns different result. if pass masterkey directly javascript hmac, , pass in string cchmac method in swift, works; seems finding equivalent this:-

var key = new buffer(masterkey, "base64"); 

thoughts?


more information - this:-

let keystring = "abcde" let body = "fghij"  let keydata = keystring.datausingencoding(nsutf8stringencoding)! // .base64encodeddatawithoptions(nsdatabase64encodingoptions(rawvalue: 0)) let bodydata = body.datausingencoding(nsutf8stringencoding)!  let digestlen = int(cc_sha256_digest_length) let result = unsafemutablepointer<cunsignedchar>.alloc(digestlen)  cchmac(cchmacalgorithm(kcchmacalgsha256), keydata.bytes, keydata.length, bodydata.bytes, bodydata.length, result);  var hmacdata = nsdata(bytes: result, length: digestlen) var hmacbase64 = hmacdata.base64encodedstringwithoptions(nsdatabase64encodingoptions(rawvalue: 0))  result.dealloc(digestlen)  let signature = string(hmacbase64)  let test = "fa372zbobgptli5cqwh5yfifwknhmi8womx4cvw68ye=" // "rnkid54/1h1h9p3nwpera0mow2l0c0hujgtty2gpbdo=" xctassert(test == signature, "pass") 

produces same result this:-

var crypto = require("crypto");  var masterkey = "abcde" var signature = crypto.createhmac("sha256", masterkey).update("fghij").digest("base64");  console.log("\n\n"+signature)  // fa372zbobgptli5cqwh5yfifwknhmi8womx4cvw68ye= 


Comments

Popular posts from this blog

apache - PHP Soap issue while content length is larger -

asynchronous - Python asyncio task got bad yield -

javascript - Complete OpenIDConnect auth when requesting via Ajax -