blob: 74232bc7e90f2b1c88d079b3b81e31800b63bfb7 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/************************************************************************
2 * Id: util.c *
3 * *
4 * TR069 Project: A TR069 library in C *
5 * Copyright (C) 2013-2014 netcwmp.netcwmp group *
6 * *
7 * *
8 * Email: netcwmp ( & ) gmail dot com *
9 * *
10 ***********************************************************************/
11
12
13#include "cwmp/util.h"
14#include "cwmp/md5.h"
15
16static const char base64[] =
17 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
18 "abcdefghijklmnopqrstuvwxyz"
19 "0123456789+/";
20
21static char * base64_encode(const char *src)
22{
23 char *str, *dst;
24 size_t l;
25 int t, r;
26
27 l = strlen(src);
28 if ((str = malloc(((l + 2) / 3) * 4 + 1)) == 0)
29 return (void*)0;
30 dst = str;
31 r = 0;
32
33 while (l >= 3)
34 {
35 t = (src[0] << 16) | (src[1] << 8) | src[2];
36 dst[0] = base64[(t >> 18) & 0x3f];
37 dst[1] = base64[(t >> 12) & 0x3f];
38 dst[2] = base64[(t >> 6) & 0x3f];
39 dst[3] = base64[(t >> 0) & 0x3f];
40 src += 3;
41 l -= 3;
42 dst += 4;
43 r += 4;
44 }
45
46 switch (l)
47 {
48 case 2:
49 t = (src[0] << 16) | (src[1] << 8);
50 dst[0] = base64[(t >> 18) & 0x3f];
51 dst[1] = base64[(t >> 12) & 0x3f];
52 dst[2] = base64[(t >> 6) & 0x3f];
53 dst[3] = '=';
54 dst += 4;
55 r += 4;
56 break;
57 case 1:
58 t = src[0] << 16;
59 dst[0] = base64[(t >> 18) & 0x3f];
60 dst[1] = base64[(t >> 12) & 0x3f];
61 dst[2] = dst[3] = '=';
62 dst += 4;
63 r += 4;
64 break;
65 case 0:
66 break;
67 }
68
69 *dst = 0;
70 return (str);
71}
72
73static void cwmp_hex_to_string(char *to, const unsigned char *p, size_t len)
74{
75 const char *hex = "0123456789abcdef";
76
77 for (;len--; p++)
78 {
79 *to++ = hex[p[0] >> 4];
80 *to++ = hex[p[0] & 0x0f];
81
82 }
83 *to = '\0';
84}
85
86
87
88void cwmp_MD5(char *buf, ...)
89{
90 unsigned char hash[HASHLEN];
91 unsigned char *p;
92 va_list ap = {0};
93 cwmp_MD5_CTX ctx;
94
95 cwmp_MD5Init(&ctx);
96
97 va_start(ap, buf);
98 while ((p = va_arg(ap, unsigned char *)) != NULL)
99 {
100 cwmp_MD5Update(&ctx, p, strlen((char *) p));
101 }
102 va_end(ap);
103
104 cwmp_MD5Final(hash, &ctx);
105
106 cwmp_hex_to_string(buf, hash, sizeof(hash));
107}
108
109
110
111void convert_to_hex(const char *Bin, char *Hex)
112{
113 unsigned short i;
114 unsigned char j;
115 for (i = 0; i < 16; i++)
116 {
117 j = (Bin[i] >> 4) & 0xf;
118 if (j <= 9)
119 {
120 Hex[i*2] = (j + '0');
121 }
122 else
123 {
124 Hex[i*2] = (j + 'a'-10);
125 }
126
127 j = Bin[i] & 0xf;
128
129 if (j <= 9)
130 {
131 Hex[i*2+1] = (j + '0');
132 }
133 else
134 {
135 Hex[i*2+1] = (j + 'a'-10);
136 }
137 }
138 Hex[32] = '\0';
139}
140
141
142
143
144
145
146
147
148
149