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
Post a Comment