Open 17337162621254271304 opened 1 year ago
I just tested this with go 1.18.7 and I get d11e9c49e54677f584c5f8fa5e132a7d
.
Here's the test I used:
package otto
import (
"fmt"
"testing"
"github.com/stretchr/testify/require"
)
var issue446JS = `function func_get_k(string, bit) {
function func_get_k_RotateLeft(lValue, iShiftBits) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
function func_get_k_mGr51T5WIX(lX, lY) {
var lX4, lY4, lX8, lY8, lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
if (lX4 & lY4) {
return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
}
if (lX4 | lY4) {
if (lResult & 0x40000000) {
return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
} else {
return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
}
} else {
return (lResult ^ lX8 ^ lY8);
}
}
function func_get_k_F(x, y, z) {
return (x & y) | ((~x) & z);
}
function func_get_k_G(x, y, z) {
return (x & z) | (y & (~z));
}
function func_get_k_H(x, y, z) {
return (x ^ y ^ z);
}
function func_get_k_I(x, y, z) {
return (y ^ (x | (~z)));
}
function func_get_k_FF(a, b, c, d, x, s, ac) {
a = func_get_k_mGr51T5WIX(a, func_get_k_mGr51T5WIX(func_get_k_mGr51T5WIX(func_get_k_F(b, c, d), x), ac));
return func_get_k_mGr51T5WIX(func_get_k_RotateLeft(a, s), b);
};
function func_get_k_GG(a, b, c, d, x, s, ac) {
a = func_get_k_mGr51T5WIX(a, func_get_k_mGr51T5WIX(func_get_k_mGr51T5WIX(func_get_k_G(b, c, d), x), ac));
return func_get_k_mGr51T5WIX(func_get_k_RotateLeft(a, s), b);
};
function func_get_k_HH(a, b, c, d, x, s, ac) {
a = func_get_k_mGr51T5WIX(a, func_get_k_mGr51T5WIX(func_get_k_mGr51T5WIX(func_get_k_H(b, c, d), x), ac));
return func_get_k_mGr51T5WIX(func_get_k_RotateLeft(a, s), b);
};
function func_get_k_II(a, b, c, d, x, s, ac) {
a = func_get_k_mGr51T5WIX(a, func_get_k_mGr51T5WIX(func_get_k_mGr51T5WIX(func_get_k_I(b, c, d), x), ac));
return func_get_k_mGr51T5WIX(func_get_k_RotateLeft(a, s), b);
};
function func_get_k_ConvertToWordArray(string) {
var lWordCount;
var lMessageLength = string.length;
var lNumberOfWords_temp1 = lMessageLength + 8;
var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
var lWordArray = Array(lNumberOfWords - 1);
var lBytePosition = 0;
var lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
return lWordArray;
};
function func_get_k_WordToHex(lValue) {
var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount;
for (lCount = 0; lCount <= 3; lCount++) {
lByte = (lValue >>> (lCount * 8)) & 255;
WordToHexValue_temp = "0" + lByte.toString(16);
WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
}
return WordToHexValue;
};
function func_get_k_FcCSRiu0tp(string) {
string = string.replace(/\r\n/g, "\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
};
var x = Array();
var k, AA, BB, CC, DD, a, b, c, d;
var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
var S41 = 6, S42 = 10, S43 = 15, S44 = 21;
string = func_get_k_FcCSRiu0tp(string);
x = func_get_k_ConvertToWordArray(string);
a = 0x67452301;
b = 0xEFCDAB89;
c = 0x98BADCFE;
d = 0x10325476;
for (k = 0; k < x.length; k += 16) {
AA = a;
BB = b;
CC = c;
DD = d;
a = func_get_k_FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
d = func_get_k_FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
c = func_get_k_FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
b = func_get_k_FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
a = func_get_k_FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
d = func_get_k_FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
c = func_get_k_FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
b = func_get_k_FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
a = func_get_k_FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
d = func_get_k_FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
c = func_get_k_FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
b = func_get_k_FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
a = func_get_k_FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
d = func_get_k_FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
c = func_get_k_FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
b = func_get_k_FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
a = func_get_k_GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
d = func_get_k_GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
c = func_get_k_GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
b = func_get_k_GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
a = func_get_k_GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
d = func_get_k_GG(d, a, b, c, x[k + 10], S22, 0x2441453);
c = func_get_k_GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
b = func_get_k_GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
a = func_get_k_GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
d = func_get_k_GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
c = func_get_k_GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
b = func_get_k_GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
a = func_get_k_GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
d = func_get_k_GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
c = func_get_k_GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
b = func_get_k_GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
a = func_get_k_HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
d = func_get_k_HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
c = func_get_k_HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
b = func_get_k_HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
a = func_get_k_HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
d = func_get_k_HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
c = func_get_k_HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
b = func_get_k_HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
a = func_get_k_HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
d = func_get_k_HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
c = func_get_k_HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
b = func_get_k_HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
a = func_get_k_HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
d = func_get_k_HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
c = func_get_k_HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
b = func_get_k_HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
a = func_get_k_II(a, b, c, d, x[k + 0], S41, 0xF4292244);
d = func_get_k_II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
c = func_get_k_II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
b = func_get_k_II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
a = func_get_k_II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
d = func_get_k_II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
c = func_get_k_II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
b = func_get_k_II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
a = func_get_k_II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
d = func_get_k_II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
c = func_get_k_II(c, d, a, b, x[k + 6], S43, 0xA3014314);
b = func_get_k_II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
a = func_get_k_II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
d = func_get_k_II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
c = func_get_k_II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
b = func_get_k_II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
a = func_get_k_mGr51T5WIX(a, AA);
b = func_get_k_mGr51T5WIX(b, BB);
c = func_get_k_mGr51T5WIX(c, CC);
d = func_get_k_mGr51T5WIX(d, DD);
}
if (bit == 32) {
return (func_get_k_WordToHex(a) + func_get_k_WordToHex(b) + func_get_k_WordToHex(c) + func_get_k_WordToHex(d)).toLowerCase();
}
return (func_get_k_WordToHex(b) + func_get_k_WordToHex(c)).toLowerCase();
}`
func TestIssue446(t *testing.T) {
vm := New()
_, err := vm.Run(issue446JS)
require.NoError(t, err)
key := "488,853,642"
k, err := vm.Call("func_get_k", nil, key, 32)
require.NoError(t, err)
require.Equal(t, "d11e9c49e54677f584c5f8fa5e132a7d", out.String())
}
go1.18.7 test -run=TestIssue446 -v
=== RUN TestIssue446
--- PASS: TestIssue446 (0.01s)
PASS
ok github.com/robertkrimen/otto 0.012s
Might this be related to https://github.com/robertkrimen/otto/pull/474 that was just fixed? Before that PR we were depending on undefined behaviour.
Could well be, hopefully the reporter will check.
This is my code. It is normal in version 1.18.1, but there is a problem in version 1.18.7
The result of 1.18.1 is as follows: d11e9c49e54677f584c5f8fa5e132a7d The result of 1.18.7 is as follows: 00000000000000000000000000000000
This is "js"code: