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 | } |