Home | History | Annotate | Line # | Download | only in md2
md2.c revision 1.1
      1  1.1  elad /*	$NetBSD: md2.c,v 1.1 2005/09/24 20:51:14 elad Exp $	*/
      2  1.1  elad 
      3  1.1  elad /*
      4  1.1  elad  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5  1.1  elad  * All rights reserved.
      6  1.1  elad  *
      7  1.1  elad  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1  elad  * by Andrew Brown.
      9  1.1  elad  *
     10  1.1  elad  * Redistribution and use in source and binary forms, with or without
     11  1.1  elad  * modification, are permitted provided that the following conditions
     12  1.1  elad  * are met:
     13  1.1  elad  * 1. Redistributions of source code must retain the above copyright
     14  1.1  elad  *    notice, this list of conditions and the following disclaimer.
     15  1.1  elad  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  elad  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  elad  *    documentation and/or other materials provided with the distribution.
     18  1.1  elad  * 3. All advertising materials mentioning features or use of this software
     19  1.1  elad  *    must display the following acknowledgement:
     20  1.1  elad  *        This product includes software developed by the NetBSD
     21  1.1  elad  *        Foundation, Inc. and its contributors.
     22  1.1  elad  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  1.1  elad  *    contributors may be used to endorse or promote products derived
     24  1.1  elad  *    from this software without specific prior written permission.
     25  1.1  elad  *
     26  1.1  elad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  1.1  elad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  1.1  elad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  1.1  elad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  1.1  elad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  1.1  elad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  1.1  elad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  1.1  elad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  1.1  elad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  1.1  elad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  1.1  elad  * POSSIBILITY OF SUCH DAMAGE.
     37  1.1  elad  */
     38  1.1  elad 
     39  1.1  elad #include <sys/cdefs.h>
     40  1.1  elad #if defined(LIBC_SCCS) && !defined(lint)
     41  1.1  elad __RCSID("$NetBSD: md2.c,v 1.1 2005/09/24 20:51:14 elad Exp $");
     42  1.1  elad #endif /* LIBC_SCCS and not lint */
     43  1.1  elad 
     44  1.1  elad #include "namespace.h"
     45  1.1  elad 
     46  1.1  elad #include <sys/types.h>
     47  1.1  elad 
     48  1.1  elad #include <assert.h>
     49  1.1  elad #include <md2.h>
     50  1.1  elad #include <string.h>
     51  1.1  elad 
     52  1.1  elad #if HAVE_NBTOOL_CONFIG_H
     53  1.1  elad #include "nbtool_config.h"
     54  1.1  elad #endif
     55  1.1  elad 
     56  1.1  elad #if !HAVE_MD2_H
     57  1.1  elad 
     58  1.1  elad /* cut-n-pasted from rfc1319 */
     59  1.1  elad static unsigned char S[256] = {
     60  1.1  elad 	41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
     61  1.1  elad 	19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
     62  1.1  elad 	76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
     63  1.1  elad 	138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
     64  1.1  elad 	245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
     65  1.1  elad 	148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
     66  1.1  elad 	39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
     67  1.1  elad 	181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
     68  1.1  elad 	150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
     69  1.1  elad 	112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
     70  1.1  elad 	96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
     71  1.1  elad 	85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
     72  1.1  elad 	234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
     73  1.1  elad 	129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
     74  1.1  elad 	8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
     75  1.1  elad 	203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
     76  1.1  elad 	166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
     77  1.1  elad 	31, 26, 219, 153, 141, 51, 159, 17, 131, 20
     78  1.1  elad };
     79  1.1  elad 
     80  1.1  elad /* cut-n-pasted from rfc1319 */
     81  1.1  elad static unsigned char *pad[] = {
     82  1.1  elad 	(unsigned char *)"",
     83  1.1  elad 	(unsigned char *)"\001",
     84  1.1  elad 	(unsigned char *)"\002\002",
     85  1.1  elad 	(unsigned char *)"\003\003\003",
     86  1.1  elad 	(unsigned char *)"\004\004\004\004",
     87  1.1  elad 	(unsigned char *)"\005\005\005\005\005",
     88  1.1  elad 	(unsigned char *)"\006\006\006\006\006\006",
     89  1.1  elad 	(unsigned char *)"\007\007\007\007\007\007\007",
     90  1.1  elad 	(unsigned char *)"\010\010\010\010\010\010\010\010",
     91  1.1  elad 	(unsigned char *)"\011\011\011\011\011\011\011\011\011",
     92  1.1  elad 	(unsigned char *)"\012\012\012\012\012\012\012\012\012\012",
     93  1.1  elad 	(unsigned char *)"\013\013\013\013\013\013\013\013\013\013\013",
     94  1.1  elad 	(unsigned char *)"\014\014\014\014\014\014\014\014\014\014\014\014",
     95  1.1  elad 	(unsigned char *)
     96  1.1  elad 	"\015\015\015\015\015\015\015\015\015\015\015\015\015",
     97  1.1  elad 	(unsigned char *)
     98  1.1  elad 	"\016\016\016\016\016\016\016\016\016\016\016\016\016\016",
     99  1.1  elad 	(unsigned char *)
    100  1.1  elad 	"\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017",
    101  1.1  elad 	(unsigned char *)
    102  1.1  elad 	"\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020"
    103  1.1  elad };
    104  1.1  elad 
    105  1.1  elad static void MD2Transform __P((MD2_CTX *));
    106  1.1  elad 
    107  1.1  elad #ifdef __weak_alias
    108  1.1  elad __weak_alias(MD2Init,_MD2Init)
    109  1.1  elad __weak_alias(MD2Update,_MD2Update)
    110  1.1  elad __weak_alias(MD2Final,_MD2Final)
    111  1.1  elad #endif
    112  1.1  elad 
    113  1.1  elad void
    114  1.1  elad MD2Init(context)
    115  1.1  elad 	MD2_CTX *context;
    116  1.1  elad {
    117  1.1  elad 	_DIAGASSERT(context != 0);
    118  1.1  elad 
    119  1.1  elad 	context->i = 16;
    120  1.1  elad 	memset(&context->C[0], 0, sizeof(context->C));
    121  1.1  elad 	memset(&context->X[0], 0, sizeof(context->X));
    122  1.1  elad }
    123  1.1  elad 
    124  1.1  elad void
    125  1.1  elad MD2Update(context, input, inputLen)
    126  1.1  elad 	MD2_CTX *context;
    127  1.1  elad 	const unsigned char *input;
    128  1.1  elad 	unsigned int inputLen;
    129  1.1  elad {
    130  1.1  elad 	unsigned int idx, piece;
    131  1.1  elad 
    132  1.1  elad 	_DIAGASSERT(context != 0);
    133  1.1  elad 	_DIAGASSERT(input != 0);
    134  1.1  elad 
    135  1.1  elad 	for (idx = 0; idx < inputLen; idx += piece) {
    136  1.1  elad 		piece = 32 - context->i;
    137  1.1  elad 		if ((inputLen - idx) < piece)
    138  1.1  elad 			piece = inputLen - idx;
    139  1.1  elad 		memcpy(&context->X[context->i], &input[idx], (size_t)piece);
    140  1.1  elad 		if ((context->i += piece) == 32)
    141  1.1  elad 			MD2Transform(context); /* resets i */
    142  1.1  elad 	}
    143  1.1  elad }
    144  1.1  elad 
    145  1.1  elad void
    146  1.1  elad MD2Final(digest, context)
    147  1.1  elad 	unsigned char digest[16];	/* message digest */
    148  1.1  elad 	MD2_CTX *context;		/* context */
    149  1.1  elad {
    150  1.1  elad 	unsigned int padlen;
    151  1.1  elad 
    152  1.1  elad 	_DIAGASSERT(digest != 0);
    153  1.1  elad 	_DIAGASSERT(context != 0);
    154  1.1  elad 
    155  1.1  elad 	/* padlen should be 1..16 */
    156  1.1  elad 	padlen = 32 - context->i;
    157  1.1  elad 
    158  1.1  elad 	/* add padding */
    159  1.1  elad 	MD2Update(context, pad[padlen], padlen);
    160  1.1  elad 
    161  1.1  elad 	/* add checksum */
    162  1.1  elad 	MD2Update(context, &context->C[0], (unsigned int) sizeof(context->C));
    163  1.1  elad 
    164  1.1  elad 	/* copy out final digest */
    165  1.1  elad 	memcpy(digest, &context->X[0], (size_t)16);
    166  1.1  elad 
    167  1.1  elad 	/* reset the context */
    168  1.1  elad 	MD2Init(context);
    169  1.1  elad }
    170  1.1  elad 
    171  1.1  elad static void
    172  1.1  elad MD2Transform(context)
    173  1.1  elad 	MD2_CTX *context;
    174  1.1  elad {
    175  1.1  elad 	u_int32_t l, j, k, t;
    176  1.1  elad 
    177  1.1  elad 	/* set block "3" and update "checksum" */
    178  1.1  elad 	for (l = context->C[15], j = 0; j < 16; j++) {
    179  1.1  elad 		context->X[32 + j] = context->X[j] ^ context->X[16 + j];
    180  1.1  elad 		l = context->C[j] ^= S[context->X[16 + j] ^ l];
    181  1.1  elad 	}
    182  1.1  elad 
    183  1.1  elad 	/* mangle input block */
    184  1.1  elad 	for (t = j = 0; j < 18; t = (t + j) % 256, j++)
    185  1.1  elad 		for (k = 0; k < 48; k++)
    186  1.1  elad 			t = context->X[k] = (context->X[k] ^ S[t]);
    187  1.1  elad 
    188  1.1  elad 	/* reset input pointer */
    189  1.1  elad 	context->i = 16;
    190  1.1  elad }
    191  1.1  elad 
    192  1.1  elad #endif /* !HAVE_MD2_H */
    193