Mercurial > masqmail
annotate src/md5/hmac_md5.c @ 304:d5ce2ba71e7b
manual formating of Received: hdrs; changed hdr for local receival
Now the Received: headers are much friendlier to read.
About folding: We must fold any line at 998 chars before transfer.
We should fold the lines we produce at 78 chars. That is what RFC
2821 requests. We should think about it, somewhen.
The header for locally (i.e. non-SMTP) received mail is changed
to the format postfix uses. This matches RFC 2821 better. The
`from' clause should contain a domain or IP, not a user name. Also,
the `with' clause should contain a registered standard protocol
name, which ``local'' is not.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Thu, 09 Dec 2010 18:28:11 -0300 |
parents | 0f36c0a46f82 |
children | 41958685480d |
rev | line source |
---|---|
0 | 1 /* |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
2 hmac_md5 -- implements RFC 2104 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
3 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
4 Copyright 2010, markus schnalke <meillo@marmaro.de> |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
5 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
6 Permission to use, copy, modify, and/or distribute this software for any |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
7 purpose with or without fee is hereby granted, provided that the above |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
8 copyright notice and this permission notice appear in all copies. |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
9 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
13 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
17 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
18 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
19 My motivation to write this code was the lack of a nicely licensed |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
20 hmac_md5 function in C. I programmed it following the RFC's text. |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
21 Obviously this code is highly similar to the sample code of the RFC. |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
22 The code is tested against the test vectors of the RFC. Wikipedia's |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
23 HMAC page helped me to understand the algorithm better. |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
24 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
25 This hmac_md5 function requires an OpenSSL-compatible MD5 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
26 implementation. There are Public Domain MD5 implementations by Colin |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
27 Plumb and by Solar Designer. You probably want to use one of these. |
0 | 28 */ |
29 | |
30 #include <string.h> | |
31 #include "md5.h" | |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
32 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
33 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
34 const int blocksize = 64; |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
35 const int hashsize = 16; |
0 | 36 |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
37 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
38 /* |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
39 The computed HMAC will be written to `digest'. |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
40 Ensure digest points to hashsize bytes of allocated memory. |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
41 */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
42 void |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
43 hmac_md5(unsigned char* text, int textlen, unsigned char* key, int keylen, unsigned char* digest) |
0 | 44 { |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
45 int i; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
46 MD5_CTX context; |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
47 unsigned char ipad[blocksize]; |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
48 unsigned char opad[blocksize]; |
0 | 49 |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
50 /* too long keys are replaced by their hash value */ |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
51 if (keylen > blocksize) { |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
52 MD5_Init(&context); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
53 MD5_Update(&context, key, keylen); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
54 MD5_Final(digest, &context); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
55 key = digest; |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
56 keylen = hashsize; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
57 } |
0 | 58 |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
59 /* copy the key into the pads */ |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
60 memset(ipad, 0, sizeof(ipad)); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
61 memcpy(ipad, key, keylen); |
0 | 62 |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
63 memset(opad, 0, sizeof(opad)); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
64 memcpy(opad, key, keylen); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
65 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
66 /* xor the pads with their ``basic'' value */ |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
67 for (i=0; i<blocksize; i++) { |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
68 ipad[i] ^= 0x36; |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
69 opad[i] ^= 0x5c; |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
70 } |
0 | 71 |
211
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
72 /* inner pass (ipad ++ message) */ |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
73 MD5_Init(&context); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
74 MD5_Update(&context, ipad, sizeof(ipad)); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
75 MD5_Update(&context, text, textlen); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
76 MD5_Final(digest, &context); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
77 |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
78 /* outer pass (opad ++ result of inner pass) */ |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
79 MD5_Init(&context); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
80 MD5_Update(&context, opad, sizeof(opad)); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
81 MD5_Update(&context, digest, hashsize); |
0f36c0a46f82
replaced hmac_md5.c with an own implementation of RFC 2104
meillo@marmaro.de
parents:
209
diff
changeset
|
82 MD5_Final(digest, &context); |
0 | 83 } |