[INC] SHA-256 Hash Function
A single file include with a SHA-256 hash function.
Supports UTF-8 text, hexadecimal or binary string inputs.
While I have tested this code and it seems to work pretty well, I can't guarantee it's 100% working and bug free.
If you're using this for any security purposes, you use it at your own risk
And also, you shouldn't be using SHA-256 for securing anything anyway.
* Generate a SHA-256 hash of a string of input data.
* Input data can be in UTF-8, hexadecimal or binary.
* @param input Input data (UTF-8 text, hexadecimal bytes or binary bytes).
* @param output Output buffer.
* @param size Size of output buffer.
* @param mode How to interpret input data.
stock void SHA256(const char input, char output, int size, StrInputMode mode = String_UTF8)
How do I know it works?
char output[HASH_SIZE_256BIT]; // size 65
/* Text (UTF-8) */
SHA256("The quick brown fox jumps over the lazy dog", output, sizeof(output));
// output = "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"
SHA256("The quick brown fox jumps over the lazy dog?", output, sizeof(output));
// output = "f77bc0c0d0779a6b329c7b9e847acb3797734ae531f08cc9d44cb4124d6e2b16"
/* Hexadecimal bytes (Case-insensitive) */
SHA256("AA0066FFDEADBEEF", output, sizeof(output), String_Hex);
// output = "1a61db0b7dc6ba6812d73eb6acdd2e84271c1124b0ec684192aca6f0933045a8"
/* Binary bytes */
SHA256("011000010110001001100011", output, sizeof(output), String_Binary);
// or SHA256("abc", output, sizeof(output), String_UTF8);
// output = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
The code has been tested with the NIST's publically available tests SHA Test Vectors for Hashing Byte-Oriented Messages
provided by their Cryptographic Algorithm Validation Program.
The tests are provided in the repo along with the python script to generate the test plugin from the original .rsp files.
No, that doesn't mean this code is officially validated.
The only one test that consistently fails is the "00" (0x00) test, which is because the test is wrong.
That test assumes a null string (length 0) is the same as a null byte (0x00, length 1).
Other SHA-256 implementations will fail this test too (like 7-Zip's).
If you find any bugs or issues let me know.