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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
28 */
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
29
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
30 #include <string.h>
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
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
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
83 }