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