Crates.io | md2_digest |
lib.rs | md2_digest |
version | 1.0.0 |
source | src |
created_at | 2024-07-20 17:48:44.213757 |
updated_at | 2024-07-20 17:48:44.213757 |
description | A 0 dependency, no_std library for generating md2 digests. |
homepage | https://github.com/auronandace/md2_digest |
repository | https://github.com/auronandace/md2_digest |
max_upload_size | |
id | 1309661 |
size | 26,252 |
A 0 dependency, no_std library implementing the md2 hashing function.
I wanted to learn how the md2 hash function works. It was fun trying work out how to write this in a const context. Explaining how it works by writing it down in steps aided the understanding of the algorithm. There can be multiple ways to implement something and alternative approaches can be taken.
It is no longer recommended to use md2 hashes for any sensitive information.
This library is functional but you are very likely better off using a more modern alternative hashing algorithm.
Input is any number of bytes.
Output is always exactly 16 bytes.
You can break down creating the md2 digest into steps which themselves can be broken down further.
Here is a high level overview:
Both the checksum and the digest step use a fixed array of 256 bytes that are chosen from the digits of PI to provide a form of randomness.
Here is the PI based array:
[
41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
31, 26, 219, 153, 141, 51, 159, 17, 131, 20
]
Padding is always applied.
After appending the padding to the input the total amount of bytes must be divisible by 16.
If the input is already divisible by 16 before padding then 16 bytes of padding are appended.
The value of the padded bytes is always the same as the amount of bytes added.
Minimum padding would be 1 byte of value 1.
Maximum padding would be 16 bytes of value 16.
The checksum is 16 bytes and is appended to the output of the padding step.
The input is the result of the previous step (original input + padding) and is divisible by 16.
To calculate the checksum perform the following steps:
In practice the above steps are likely to be implemented as a loop nested inside another loop. The outer loop ensures you deal with 16 bytes of input at a time. The inner loop performs the calculation and populates the checksum.
The digest is 16 bytes and the final output of the md2 algorithm.
The input is the result of the previous step (original input + padding + checksum) and is divisible by 16.
To calculate the digest perform the following steps:
In practice the above steps are likely to be implemented as several nested loops. The outer loop ensures you deal with 16 bytes of input at a time. The first inner loop alters the last 32 bytes of the 48 byte array. The middle 16 bytes are changed to the corresponding input bytes. The last 16 bytes are changed to the middle 16 bytes bitwise XOR'ed by the first 16 bytes. The second inner loop performs an operation 18 times in conjunction with a new variable. The innermost loop (inside the second inner loop) performs a calculation that alters the entire 48 byte array using both the new variable and the contents of the PI based array.