Search code examples
javascriptgoogle-apps-scriptgoogle-sheetscryptojshmacsha1

Crypto-Js library's hmac-256 script returning function structure instead of value within Google Apps Script, working fine outside?


I am setting up a google spreadsheet project to connect to my CryptoExchange API. But when it comes to this simple CryptoJs Hmac-sha256 script, it's not working: it is returning the function structure instead of the value, while outside it's working fine (see my jsfiddle).

Now, I understand from this Stack answer by Cameron Roberts that Apps Script behaves differently under certain POVs, but I can't understand how this relates.

Besides, if I just switch script and use the Stanford Javascript Crypto Library, the code executes perfectly with no issue at all, both within Google Apps Script AND outside of it of course.

Here is my code:

eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js').getContentText());


function write() {
var hash = CryptoJS.HmacSHA256("message", "secret");
return hash;
}
Logger.log(write());

and the console log from Google Apps Script

[19-06-07 00:53:32:859 PDT] {mixIn=
function (a) {
    for (var c in a) {
        a.hasOwnProperty(c) && (this[c] = a[c]);
    }
    a.hasOwnProperty("toString") && (this.toString = a.toString);
}
, extend=
function (a) {
    q.prototype = this;
    var c = new q();
    a && c.mixIn(a);
    c.hasOwnProperty("init") || (c.init = function () {
        c.$super.init.apply(this, arguments);
    });
    c.init.prototype = c;
    c.$super = this;
    return c;
}
, init=
function (a, c) {
    a = this.words = a || [];
    this.sigBytes = c != s ? c : 4 * a.length;
}
, random=
function (a) {
    for (var c = [], d = 0; d < a; d += 4) {
        c.push(4294967296 * h.random() | 0);
    }
    return new r.init(c, a);
}
, words=[-1.956689808E9, 6.97680217E8, -1.940439631E9, -5.01717335E8, -

1.205480281E9, -1.798215209E9, 1.0131952E8, 1.469462027E9], clone=
function () {
    var a = m.clone.call(this);
    a.words = this.words.slice(0);
    return a;
}
, sigBytes=32.0, create=
function () {
    var a = this.extend();
    a.init.apply(a, arguments);
    return a;
}
, toString=
function (a) {
    return (a || k).stringify(this);
}
, concat=
function (a) {
    var c = this.words, d = a.words, b = this.sigBytes;
    a = a.sigBytes;
    this.clamp();
    if (b % 4) {
        for (var e = 0; e < a; e++) {
            c[b + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 

8 * ((b + e) % 4);
        }
    } else {
        if (65535 < d.length) {
            for (e = 0; e < a; e += 4) {
                c[b + e >>> 2] = d[e >>> 2];
            }
        } else {
            c.push.apply(c, d);
        }
    }
    this.sigBytes += a;
    return this;
}
, clamp=
function () {
    var a = this.words, c = this.sigBytes;
    a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4);
    a.length = h.ceil(c / 4);
}
, $super={extend=
function (a) {
    q.prototype = this;
    var c = new q();
    a && c.mixIn(a);
    c.hasOwnProperty("init") || (c.init = function () {
        c.$super.init.apply(this, arguments);
    });
    c.init.prototype = c;
    c.$super = this;
    return c;
}
, mixIn=
function (a) {
    for (var c in a) {
        a.hasOwnProperty(c) && (this[c] = a[c]);
    }
    a.hasOwnProperty("toString") && (this.toString = a.toString);
}
, init=
function () {
}
, clone=
function () {
    return this.init.prototype.extend(this);
}
, create=
function () {
    var a = this.extend();
    a.init.apply(a, arguments);
    return a;
}
}}

While the same code within jsfiddle works fine

EDIT: While my question is still a source of curiosity for me, I have just found a whole branch of replies here on stack which involve a specific method within Google Apps Script I didn't know about: a built in Class Utility for creating HMAC Sha256 signature.

This may not be the very answer to my question in terms of theoretical knowledge, but will probably solve my problem from a practical point of view; so I will look into that now. Thanks

Generate a keyed hash value using the HMAC method with Google Apps Script

How to get Hex value from computeHmacSha256Signature method of Google Apps Script?

get back a string representation from computeDigest(algorithm, value) byte[]


Solution

    • You want to retrieve the value of 8b5f48702995c1598c573db1e21866a9b825d4a794d169d7060a03605796360b from CryptoJS.HmacSHA256("message", "secret") using Google Apps Script.

    If my understanding is correct, how about directly calculating the value using the methods of Google Apps Script? In this case, CryptoJS is not used. Please think of this as just one of several answers.

    Sample script:

    var res = Utilities.computeHmacSha256Signature("message", "secret")
      .map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
    Logger.log(res)
    

    Result:

    8b5f48702995c1598c573db1e21866a9b825d4a794d169d7060a03605796360b
    

    Note:

    The important point for above script is as follows.

    • At Google Apps Script, the data which was encrypted by Utilities.computeHmacSha256Signature() is the bytes array of the signed hexadecimal.
    • In your case, the bytes array is converted to the unsigned hexadecimal.

    References:

    If I misunderstood your question and this was not the direction you want, I apologize.