xref: /minix3/external/bsd/dhcpcd/dist/crypt/hmac_md5.c (revision 9f20bfa6c4c442e2e798d91b11c2a5f8d6833a41)
1*9f20bfa6SDavid van Moolenbroek #include <sys/cdefs.h>
2*9f20bfa6SDavid van Moolenbroek  __RCSID("$NetBSD: hmac_md5.c,v 1.7 2015/03/27 11:33:47 roy Exp $");
3*9f20bfa6SDavid van Moolenbroek 
4*9f20bfa6SDavid van Moolenbroek /*
5*9f20bfa6SDavid van Moolenbroek  * dhcpcd - DHCP client daemon
6*9f20bfa6SDavid van Moolenbroek  * Copyright (c) 2006-2015 Roy Marples <roy@marples.name>
7*9f20bfa6SDavid van Moolenbroek  * All rights reserved
8*9f20bfa6SDavid van Moolenbroek 
9*9f20bfa6SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
10*9f20bfa6SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
11*9f20bfa6SDavid van Moolenbroek  * are met:
12*9f20bfa6SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
13*9f20bfa6SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
14*9f20bfa6SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
15*9f20bfa6SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
16*9f20bfa6SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
17*9f20bfa6SDavid van Moolenbroek  *
18*9f20bfa6SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19*9f20bfa6SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*9f20bfa6SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*9f20bfa6SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22*9f20bfa6SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23*9f20bfa6SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24*9f20bfa6SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25*9f20bfa6SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26*9f20bfa6SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27*9f20bfa6SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28*9f20bfa6SDavid van Moolenbroek  * SUCH DAMAGE.
29*9f20bfa6SDavid van Moolenbroek  */
30*9f20bfa6SDavid van Moolenbroek 
31*9f20bfa6SDavid van Moolenbroek #include <inttypes.h>
32*9f20bfa6SDavid van Moolenbroek #include <string.h>
33*9f20bfa6SDavid van Moolenbroek 
34*9f20bfa6SDavid van Moolenbroek #include "crypt.h"
35*9f20bfa6SDavid van Moolenbroek 
36*9f20bfa6SDavid van Moolenbroek #include "../config.h"
37*9f20bfa6SDavid van Moolenbroek #ifdef HAVE_MD5_H
38*9f20bfa6SDavid van Moolenbroek #  ifndef DEPGEN
39*9f20bfa6SDavid van Moolenbroek #    include <md5.h>
40*9f20bfa6SDavid van Moolenbroek #  endif
41*9f20bfa6SDavid van Moolenbroek #else
42*9f20bfa6SDavid van Moolenbroek #  include "md5.h"
43*9f20bfa6SDavid van Moolenbroek #endif
44*9f20bfa6SDavid van Moolenbroek 
45*9f20bfa6SDavid van Moolenbroek #define HMAC_PAD_LEN	64
46*9f20bfa6SDavid van Moolenbroek #define IPAD		0x36
47*9f20bfa6SDavid van Moolenbroek #define OPAD		0x5C
48*9f20bfa6SDavid van Moolenbroek 
49*9f20bfa6SDavid van Moolenbroek /* hmac_md5 as per RFC3118 */
50*9f20bfa6SDavid van Moolenbroek void
hmac_md5(const uint8_t * text,size_t text_len,const uint8_t * key,size_t key_len,uint8_t * digest)51*9f20bfa6SDavid van Moolenbroek hmac_md5(const uint8_t *text, size_t text_len,
52*9f20bfa6SDavid van Moolenbroek     const uint8_t *key, size_t key_len,
53*9f20bfa6SDavid van Moolenbroek     uint8_t *digest)
54*9f20bfa6SDavid van Moolenbroek {
55*9f20bfa6SDavid van Moolenbroek 	uint8_t k_ipad[HMAC_PAD_LEN], k_opad[HMAC_PAD_LEN];
56*9f20bfa6SDavid van Moolenbroek 	uint8_t tk[MD5_DIGEST_LENGTH];
57*9f20bfa6SDavid van Moolenbroek 	int i;
58*9f20bfa6SDavid van Moolenbroek 	MD5_CTX context;
59*9f20bfa6SDavid van Moolenbroek 
60*9f20bfa6SDavid van Moolenbroek 	/* Ensure key is no bigger than HMAC_PAD_LEN */
61*9f20bfa6SDavid van Moolenbroek 	if (key_len > HMAC_PAD_LEN) {
62*9f20bfa6SDavid van Moolenbroek 		MD5Init(&context);
63*9f20bfa6SDavid van Moolenbroek 		MD5Update(&context, key, (unsigned int)key_len);
64*9f20bfa6SDavid van Moolenbroek 		MD5Final(tk, &context);
65*9f20bfa6SDavid van Moolenbroek 		key = tk;
66*9f20bfa6SDavid van Moolenbroek 		key_len = MD5_DIGEST_LENGTH;
67*9f20bfa6SDavid van Moolenbroek 	}
68*9f20bfa6SDavid van Moolenbroek 
69*9f20bfa6SDavid van Moolenbroek 	/* store key in pads */
70*9f20bfa6SDavid van Moolenbroek 	memcpy(k_ipad, key, key_len);
71*9f20bfa6SDavid van Moolenbroek 	memcpy(k_opad, key, key_len);
72*9f20bfa6SDavid van Moolenbroek 	memset(k_ipad + key_len, 0, sizeof(k_ipad) - key_len);
73*9f20bfa6SDavid van Moolenbroek 	memset(k_opad + key_len, 0, sizeof(k_opad) - key_len);
74*9f20bfa6SDavid van Moolenbroek 
75*9f20bfa6SDavid van Moolenbroek 	/* XOR key with ipad and opad values */
76*9f20bfa6SDavid van Moolenbroek 	for (i = 0; i < HMAC_PAD_LEN; i++) {
77*9f20bfa6SDavid van Moolenbroek 		k_ipad[i] ^= IPAD;
78*9f20bfa6SDavid van Moolenbroek 		k_opad[i] ^= OPAD;
79*9f20bfa6SDavid van Moolenbroek 	}
80*9f20bfa6SDavid van Moolenbroek 
81*9f20bfa6SDavid van Moolenbroek 	/* inner MD5 */
82*9f20bfa6SDavid van Moolenbroek 	MD5Init(&context);
83*9f20bfa6SDavid van Moolenbroek 	MD5Update(&context, k_ipad, HMAC_PAD_LEN);
84*9f20bfa6SDavid van Moolenbroek 	MD5Update(&context, text, (unsigned int)text_len);
85*9f20bfa6SDavid van Moolenbroek 	MD5Final(digest, &context);
86*9f20bfa6SDavid van Moolenbroek 
87*9f20bfa6SDavid van Moolenbroek 	/* outer MD5 */
88*9f20bfa6SDavid van Moolenbroek 	MD5Init(&context);
89*9f20bfa6SDavid van Moolenbroek 	MD5Update(&context, k_opad, HMAC_PAD_LEN);
90*9f20bfa6SDavid van Moolenbroek 	MD5Update(&context, digest, MD5_DIGEST_LENGTH);
91*9f20bfa6SDavid van Moolenbroek 	MD5Final(digest, &context);
92*9f20bfa6SDavid van Moolenbroek }
93