47 lines
1.3 KiB
C
47 lines
1.3 KiB
C
|
#pragma once
|
||
|
|
||
|
// Derived from the "RSA Data Security, Inc. MD5 Message-Digest Algorithm":
|
||
|
// src: https://github.com/freebsd/freebsd-src/blob/release/14.2.0/sys/kern/md5c.c
|
||
|
|
||
|
#include <cstdint>
|
||
|
|
||
|
#define MD5_BLOCK_LENGTH 64
|
||
|
#define MD5_DIGEST_LENGTH 16
|
||
|
#define MD5_DIGEST_STRING_LENGTH (MD5_DIGEST_LENGTH * 2 + 1)
|
||
|
|
||
|
/* MD5 context. */
|
||
|
struct MD5_CTX {
|
||
|
uint64_t count; /* number of bits, modulo 2^64 (lsb first) */
|
||
|
uint32_t state[4]; /* state (ABCD) */
|
||
|
unsigned char buffer[64]; /* input buffer */
|
||
|
};
|
||
|
|
||
|
/* MD5 initialization. Begins an MD5 operation, writing a new context. */
|
||
|
inline void md5_init(MD5_CTX* context) {
|
||
|
context->count = 0;
|
||
|
|
||
|
/* Load magic initialization constants. */
|
||
|
context->state[0] = 0x67452301;
|
||
|
context->state[1] = 0xefcdab89;
|
||
|
context->state[2] = 0x98badcfe;
|
||
|
context->state[3] = 0x10325476;
|
||
|
}
|
||
|
|
||
|
void md5_update(MD5_CTX* ctx, const uint8_t* in, size_t len);
|
||
|
void md5_final(MD5_CTX* ctx, uint8_t* digest);
|
||
|
|
||
|
inline void md5(uint8_t* digest, const uint8_t* in, const size_t len) {
|
||
|
MD5_CTX ctx;
|
||
|
md5_init(&ctx);
|
||
|
md5_update(&ctx, in, len);
|
||
|
md5_final(&ctx, digest);
|
||
|
}
|
||
|
|
||
|
inline void md5(uint8_t* digest, const uint8_t* in, const size_t len, const uint8_t* in2, size_t len2) {
|
||
|
MD5_CTX ctx;
|
||
|
md5_init(&ctx);
|
||
|
md5_update(&ctx, in, len);
|
||
|
md5_update(&ctx, in2, len2);
|
||
|
md5_final(&ctx, digest);
|
||
|
}
|