1#include "hash.h"
2
3#include "hash_ctxt.h"
4#include "system.h"
5
6static void digest_str(const unsigned char *digest, size_t digest_len, char *str, size_t max_len)
7{
8 if(max_len > digest_len * 2 + 1)
9 {
10 max_len = digest_len * 2 + 1;
11 }
12 str[max_len - 1] = 0;
13 max_len -= 1;
14 for(size_t i = 0; i < max_len; i++)
15 {
16 static const char HEX[] = "0123456789abcdef";
17 size_t index = i / 2;
18 if(i % 2 == 0)
19 {
20 str[i] = HEX[digest[index] >> 4];
21 }
22 else
23 {
24 str[i] = HEX[digest[index] & 0xf];
25 }
26 }
27}
28
29SHA256_DIGEST sha256(const void *message, size_t message_len)
30{
31 SHA256_CTX ctxt;
32 sha256_init(ctxt: &ctxt);
33 sha256_update(ctxt: &ctxt, data: message, data_len: message_len);
34 return sha256_finish(ctxt: &ctxt);
35}
36
37void sha256_str(SHA256_DIGEST digest, char *str, size_t max_len)
38{
39 digest_str(digest: digest.data, digest_len: sizeof(digest.data), str, max_len);
40}
41
42int sha256_from_str(SHA256_DIGEST *out, const char *str)
43{
44 return str_hex_decode(dst: out->data, dst_size: sizeof(out->data), src: str);
45}
46
47int sha256_comp(SHA256_DIGEST digest1, SHA256_DIGEST digest2)
48{
49 return mem_comp(a: digest1.data, b: digest2.data, size: sizeof(digest1.data));
50}
51
52MD5_DIGEST md5(const void *message, size_t message_len)
53{
54 MD5_CTX ctxt;
55 md5_init(ctxt: &ctxt);
56 md5_update(ctxt: &ctxt, data: message, data_len: message_len);
57 return md5_finish(ctxt: &ctxt);
58}
59
60void md5_str(MD5_DIGEST digest, char *str, size_t max_len)
61{
62 digest_str(digest: digest.data, digest_len: sizeof(digest.data), str, max_len);
63}
64
65int md5_from_str(MD5_DIGEST *out, const char *str)
66{
67 return str_hex_decode(dst: out->data, dst_size: sizeof(out->data), src: str);
68}
69
70int md5_comp(MD5_DIGEST digest1, MD5_DIGEST digest2)
71{
72 return mem_comp(a: digest1.data, b: digest2.data, size: sizeof(digest1.data));
73}
74