Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /* md2.c  | 
2  |  |  | 
3  |  |    The MD2 hash function, described in RFC 1319.  | 
4  |  |  | 
5  |  |    Copyright (C) 2003 Niels Möller, Andreas Sigfridsson  | 
6  |  |  | 
7  |  |    This file is part of GNU Nettle.  | 
8  |  |  | 
9  |  |    GNU Nettle is free software: you can redistribute it and/or  | 
10  |  |    modify it under the terms of either:  | 
11  |  |  | 
12  |  |      * the GNU Lesser General Public License as published by the Free  | 
13  |  |        Software Foundation; either version 3 of the License, or (at your  | 
14  |  |        option) any later version.  | 
15  |  |  | 
16  |  |    or  | 
17  |  |  | 
18  |  |      * the GNU General Public License as published by the Free  | 
19  |  |        Software Foundation; either version 2 of the License, or (at your  | 
20  |  |        option) any later version.  | 
21  |  |  | 
22  |  |    or both in parallel, as here.  | 
23  |  |  | 
24  |  |    GNU Nettle is distributed in the hope that it will be useful,  | 
25  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of  | 
26  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  | 
27  |  |    General Public License for more details.  | 
28  |  |  | 
29  |  |    You should have received copies of the GNU General Public License and  | 
30  |  |    the GNU Lesser General Public License along with this program.  If  | 
31  |  |    not, see http://www.gnu.org/licenses/.  | 
32  |  | */  | 
33  |  |  | 
34  |  | /* This code originates from the Python Cryptography Toolkit, version 1.0.1.  | 
35  |  |    Further hacked by Andreas Sigfridsson and Niels Möller. Original license:  | 
36  |  |  | 
37  |  |    ===================================================================  | 
38  |  |    Distribute and use freely; there are no restrictions on further  | 
39  |  |    dissemination and usage except those imposed by the laws of your  | 
40  |  |    country of residence.  This software is provided "as is" without  | 
41  |  |    warranty of fitness for use or suitability for any purpose, express  | 
42  |  |    or implied. Use at your own risk or not at all.  | 
43  |  |    ===================================================================  | 
44  |  |      | 
45  |  |    Incorporating the code into commercial products is permitted; you do  | 
46  |  |    not have to make source available or contribute your changes back  | 
47  |  |    (though that would be nice).  | 
48  |  |      | 
49  |  |    --amk                                                    (www.amk.ca) */  | 
50  |  |      | 
51  |  | #if HAVE_CONFIG_H  | 
52  |  | # include "config.h"  | 
53  |  | #endif  | 
54  |  |  | 
55  |  | #include <assert.h>  | 
56  |  | #include <string.h>  | 
57  |  |  | 
58  |  | #include "md2.h"  | 
59  |  |  | 
60  |  | #include "macros.h"  | 
61  |  |  | 
62  |  | static const uint8_t  | 
63  |  | S[256] = { | 
64  |  |   41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,  | 
65  |  |   19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,  | 
66  |  |   76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,  | 
67  |  |   138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,  | 
68  |  |   245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,  | 
69  |  |   148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,  | 
70  |  |   39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,  | 
71  |  |   181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,  | 
72  |  |   150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,  | 
73  |  |   112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,  | 
74  |  |   96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,  | 
75  |  |   85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,  | 
76  |  |   234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,  | 
77  |  |   129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,  | 
78  |  |   8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,  | 
79  |  |   203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,  | 
80  |  |   166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,  | 
81  |  |   31, 26, 219, 153, 141, 51, 159, 17, 131, 20  | 
82  |  | };  | 
83  |  |  | 
84  |  | static void  | 
85  |  | md2_transform(struct md2_ctx *ctx, const uint8_t *data)  | 
86  | 0  | { | 
87  | 0  |   unsigned i;  | 
88  | 0  |   uint8_t t;  | 
89  |  |     | 
90  | 0  |   memcpy(ctx->X + 16, data, MD2_BLOCK_SIZE);  | 
91  |  | 
  | 
92  | 0  |   for (i = 0, t = ctx->C[15];  | 
93  | 0  |        i<MD2_BLOCK_SIZE; i++)  | 
94  | 0  |     { | 
95  | 0  |       ctx->X[2 * MD2_BLOCK_SIZE + i]  | 
96  | 0  |   = ctx->X[i] ^ ctx->X[MD2_BLOCK_SIZE + i];  | 
97  | 0  |       t = (ctx->C[i] ^= S[data[i]^t]);  | 
98  | 0  |     }  | 
99  | 0  |   for (i = t = 0;  | 
100  | 0  |        i< MD2_BLOCK_SIZE + 2;  | 
101  | 0  |        t = (t + i) & 0xff, i++)  | 
102  | 0  |     { | 
103  | 0  |       unsigned j;  | 
104  | 0  |       for (j = 0; j < 3 * MD2_BLOCK_SIZE; j++)  | 
105  | 0  |   t = (ctx->X[j] ^= S[t]);  | 
106  | 0  |     }  | 
107  | 0  | }  | 
108  |  |  | 
109  |  | void  | 
110  |  | md2_init(struct md2_ctx *ctx)  | 
111  | 0  | { | 
112  | 0  |   memset(ctx, 0, sizeof(*ctx));  | 
113  | 0  | }  | 
114  |  |  | 
115  |  | void  | 
116  |  | md2_update(struct md2_ctx *ctx,  | 
117  |  |      size_t length,  | 
118  |  |      const uint8_t *data)  | 
119  | 0  | { | 
120  | 0  |   MD_UPDATE(ctx, length, data, md2_transform, (void)0);  | 
121  | 0  | }  | 
122  |  |  | 
123  |  | void  | 
124  |  | md2_digest(struct md2_ctx *ctx,  | 
125  |  |      size_t length,  | 
126  |  |      uint8_t *digest)  | 
127  | 0  | { | 
128  | 0  |   unsigned left;  | 
129  |  |     | 
130  | 0  |   assert(length <= MD2_DIGEST_SIZE);  | 
131  |  |  | 
132  | 0  |   left = MD2_BLOCK_SIZE - ctx->index;  | 
133  | 0  |   memset(ctx->block + ctx->index, left, left);  | 
134  | 0  |   md2_transform(ctx, ctx->block);  | 
135  |  |     | 
136  | 0  |   md2_transform(ctx, ctx->C);  | 
137  | 0  |   memcpy(digest, ctx->X, length);  | 
138  | 0  |   md2_init(ctx);  | 
139  | 0  | }  |