Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sha256 hash returns incorrect result if input's (byteLength & 63) == 63 #376

Open
0xproto opened this issue May 27, 2024 · 0 comments
Open

Comments

@0xproto
Copy link

0xproto commented May 27, 2024

The hash function returns incorrect result for any inputs where byteLength % 64 == 63. To reproduce create a test case where byte length % 64 == 63 and compare it against another implementation of sha256.

example test one:

 it("hex bytes of 191 byte length", function () {
      const inputStr = "1".repeat(382);
      const input = Buffer.from(inputStr, "hex");
      expect(input.length).to.be.equal(191);

      const output = Buffer.from(sha256.digest(input)).toString("hex");
      expect(output).to.be.equal("b8ffd888fe6ffff63cb0193ad93b0fee6bda8ea913e4e75424af7914f55d3411");
    });

example one output running yarn test

AssertionError: expected 'de66d39d769de0b512fe724191d53339a3efc…' to equal 'b8ffd888fe6ffff63cb0193ad93b0fee6bda8…'
      + expected - actual

      -de66d39d769de0b512fe724191d53339a3efc491875c25795a2c20bb7c03ad32
      +b8ffd888fe6ffff63cb0193ad93b0fee6bda8ea913e4e75424af7914f55d3411

example two

it("hex bytes of 676 byte length", function () {
      const inputStr = "1".repeat(1150);
      const input = Buffer.from(inputStr, "hex");
      expect(input.length).to.be.equal(575);

      const output = Buffer.from(sha256.digest(input)).toString("hex");
      expect(output).to.be.equal("fc6b0073005a8ce2b4bf9a9c482bb2b1707bc1dab06c0185752104157edb62c6");
    });

example two output running yarn test

digest function
         hex bytes of 575 byte length:

      AssertionError: expected '758a6d0187dfd01483d6a7e742bdda25a2f47…' to equal 'fc6b0073005a8ce2b4bf9a9c482bb2b1707bc…'
      + expected - actual

      -758a6d0187dfd01483d6a7e742bdda25a2f47ef804fed45423484b27a6717243
      +fc6b0073005a8ce2b4bf9a9c482bb2b1707bc1dab06c0185752104157edb62c6

      at Context.<anonymous> (test/unit/index.test.ts:22:28)
      at processImmediate (node:internal/timers:478:21)

I am still working through why this behavior occurs - I believe this could be an edge case in the math that is not handled correctly, any assistance on this would be greatly appreciated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants