ze-filter  (ze-filter-0.8.0-develop-180218)
ze-msg-hash.c
Go to the documentation of this file.
1 /*
2  *
3  * ze-filter - Mail Server Filter for sendmail
4  *
5  * Copyright (c) 2001-2018 - Jose-Marcio Martins da Cruz
6  *
7  * Auteur : Jose Marcio Martins da Cruz
8  * jose.marcio.mc@gmail.org
9  *
10  * Historique :
11  * Creation : Wed May 9 22:18:40 CEST 2007
12  *
13  * This program is free software, but with restricted license :
14  *
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19  *
20  * More details about ze-filter license can be found at ze-filter
21  * web site : http://foss.jose-marcio.org
22  */
23 
24 
25 #include <ze-sys.h>
26 #include <libml.h>
27 #include <libze.h>
28 #include <ze-libjc.h>
29 #include <ze-msg-hash.h>
30 
31 
32 /* ****************************************************************************
33  * *
34  * *
35  **************************************************************************** */
36 bool
37 jmc_str2md5(sout, sin, szout)
38  char *sout;
39  unsigned char *sin;
40  size_t szout;
41 {
42  ZEMD5_T ctx;
43  unsigned char dig[64];
44 
45  memset(dig, 0, sizeof (dig));
46  zeMD5_Init(&ctx);
47  zeMD5_Update(&ctx, sin, strlen((char *) sin));
48  zeMD5_Final(&ctx, dig);
49 
50  base64_encode(sout, szout, dig, ZE_MD5_DIGESTLENGTH);
51 
52  return TRUE;
53 }
54 
55 /* ****************************************************************************
56  * *
57  * *
58  **************************************************************************** */
59 bool
60 jmc_str2sha1(sout, sin, szout)
61  char *sout;
62  unsigned char *sin;
63  size_t szout;
64 {
65  ZESHA1_T ctx;
66  unsigned char dig[64];
67 
68  memset(dig, 0, sizeof (dig));
69  zeSHA1_Init(&ctx);
70  zeSHA1_Update(&ctx, sin, strlen((char *) sin));
71  zeSHA1_Final(&ctx, dig);
72 
73  base64_encode(sout, szout, dig, ZE_SHA1_DIGESTLENGTH);
74 
75  return TRUE;
76 }
77 
78 /* ****************************************************************************
79  * *
80  * *
81  **************************************************************************** */
82 static void
83 hexa_encode(sout, szout, sin, szin)
84  char *sout;
85  size_t szout;
86  unsigned char *sin;
87  size_t szin;
88 {
89  int i;
90 
91  memset(sout, 0, szout);
92  for (i = 0; i < szin; i++)
93  {
94  char s[4];
95 
96  snprintf(s, sizeof (s), "%02X", sin[i]);
97 
98  strlcat(sout, s, szout);
99  }
100 }
101 
102 /* ****************************************************************************
103  * *
104  * *
105  **************************************************************************** */
106 bool
107 str2hash2hex(code, sout, sin, szout)
108  int code;
109  char *sout;
110  char *sin;
111  size_t szout;
112 {
113  unsigned char dig[64];
114 
115  memset(dig, 0, sizeof (dig));
116  switch (code)
117  {
118  case HASH_SHA1:
119  {
120  ZESHA1_T ctx;
121 
122  zeSHA1_Init(&ctx);
123  zeSHA1_Update(&ctx, (unsigned char *) sin, strlen((char *) sin));
124  zeSHA1_Final(&ctx, dig);
125  hexa_encode(sout, szout, dig, ZE_SHA1_DIGESTLENGTH);
126  }
127  break;
128  case HASH_MD5:
129  {
130  ZEMD5_T ctx;
131 
132  zeMD5_Init(&ctx);
133  zeMD5_Update(&ctx, (unsigned char *) sin, strlen((char *) sin));
134  zeMD5_Final(&ctx, dig);
135  hexa_encode(sout, szout, dig, ZE_MD5_DIGESTLENGTH);
136  }
137  break;
138  }
139  return TRUE;
140 }
141 
142 
143 /* ****************************************************************************
144  * *
145  * *
146  **************************************************************************** */
147 bool
148 str2hash2b64(code, sout, sin, szout)
149  int code;
150  char *sout;
151  char *sin;
152  size_t szout;
153 {
154  unsigned char dig[64];
155 
156  memset(dig, 0, sizeof (dig));
157  switch (code)
158  {
159  case HASH_SHA1:
160  {
161  ZESHA1_T ctx;
162 
163  zeSHA1_Init(&ctx);
164  zeSHA1_Update(&ctx, (unsigned char *) sin, strlen((char *) sin));
165  zeSHA1_Final(&ctx, dig);
166  base64_encode(sout, szout, dig, ZE_SHA1_DIGESTLENGTH);
167  }
168  break;
169  case HASH_MD5:
170  {
171  ZEMD5_T ctx;
172 
173  zeMD5_Init(&ctx);
174  zeMD5_Update(&ctx, (unsigned char *) sin, strlen((char *) sin));
175  zeMD5_Final(&ctx, dig);
176  base64_encode(sout, szout, dig, ZE_MD5_DIGESTLENGTH);
177  }
178  break;
179  }
180  return TRUE;
181 }
182 
183 
184 /* ****************************************************************************
185  * *
186  * *
187  **************************************************************************** */
188 int
190  char *label;
191 {
192  if (label == NULL)
193  return HASH_PLAIN;
194 
195  if (STRCASEEQUAL(label, "MD5"))
196  return HASH_MD5;
197  if (STRCASEEQUAL(label, "SHA1"))
198  return HASH_SHA1;
199  if (STRCASEEQUAL(label, "PLAIN"))
200  return HASH_PLAIN;
201  return HASH_PLAIN;
202 }
203 
204 /* ****************************************************************************
205  * *
206  * *
207  **************************************************************************** */
208 char *
210  int code;
211 {
212  char *s = "PLAIN";
213 
214  switch (code)
215  {
216  case HASH_PLAIN:
217  s = "PLAIN";
218  break;
219  case HASH_MD5:
220  s = "MD5";
221  break;
222  case HASH_SHA1:
223  s = "SHA1";
224  break;
225  }
226  return s;
227 }
void zeMD5_Final(ZEMD5_T *ctx, unsigned char *digest)
Definition: zeMD5.c:226
void zeSHA1_Init(ZESHA1_T *ctx)
Definition: zeSHA1.c:344
#define HASH_SHA1
Definition: ze-msg-hash.h:29
void zeSHA1_Final(ZESHA1_T *ctx, unsigned char *digest)
Definition: zeSHA1.c:404
char * hash_code2label(int code)
Definition: ze-msg-hash.c:209
#define HASH_PLAIN
Definition: ze-msg-hash.h:27
#define HASH_MD5
Definition: ze-msg-hash.h:28
bool str2hash2hex(int code, char *sout, char *sin, size_t szout)
Definition: ze-msg-hash.c:107
bool jmc_str2sha1(char *sout, unsigned char *sin, size_t szout)
Definition: ze-msg-hash.c:60
#define ZE_MD5_DIGESTLENGTH
Definition: zeMD5.h:45
int hash_label2code(char *label)
Definition: ze-msg-hash.c:189
Definition: zeMD5.h:47
void zeSHA1_Update(ZESHA1_T *ctx, const unsigned char *data, unsigned int len)
Definition: zeSHA1.c:368
#define strlcat
Definition: zeString.h:28
bool str2hash2b64(int code, char *sout, char *sin, size_t szout)
Definition: ze-msg-hash.c:148
#define TRUE
Definition: macros.h:157
bool base64_encode(char *sout, size_t szout, unsigned char *sin, size_t szin)
Definition: ze-base64.c:312
void zeMD5_Update(ZEMD5_T *ctx, const unsigned char *buf, unsigned int len)
Definition: zeMD5.c:184
#define ZE_SHA1_DIGESTLENGTH
Definition: zeSHA1.h:31
#define STRCASEEQUAL(a, b)
Definition: macros.h:72
void zeMD5_Init(ZEMD5_T *ctx)
Definition: zeMD5.c:61
bool jmc_str2md5(char *sout, unsigned char *sin, size_t szout)
Definition: ze-msg-hash.c:37