~ubuntu-branches/ubuntu/feisty/clamav/feisty-backports

« back to all changes in this revision

Viewing changes to libclamav/sha256.c

  • Committer: Bazaar Package Importer
  • Author(s): SpecialK
  • Date: 2008-01-04 11:25:36 UTC
  • mfrom: (19.2.4 hardy)
  • Revision ID: james.westby@ubuntu.com-20080104112536-b23litkqiv48cm9o
Tags: 0.92~dfsg-2~feisty1
Automated backport upload; no source changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2001 Niels Moller
3
 
 *  
4
 
 * This program is free software; you can redistribute it and/or
5
 
 * modify it under the terms of the GNU General Public License as
6
 
 * published by the Free Software Foundation; either version 2 of the
7
 
 * License, or (at your option) any later version.
8
 
 *
9
 
 * The nettle library is distributed in the hope that it will be useful, but
10
 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11
 
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
12
 
 * License for more details.
13
 
 * 
14
 
 * You should have received a copy of the GNU Lesser General Public License
15
 
 * along with the nettle library; see the file COPYING.LIB.  If not, write to
16
 
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
17
 
 * MA 02111-1307, USA.
18
 
 */
19
 
 
20
 
/* Modelled after the sha1.c code by Peter Gutmann. */
21
 
 
22
 
#include <stdio.h>
23
 
#include <string.h>
24
 
 
25
 
#include "cltypes.h"
26
 
#include "sha256.h"
27
 
 
28
 
/* A block, treated as a sequence of 32-bit words. */
29
 
#define SHA256_DATA_LENGTH 16
30
 
 
31
 
#define ROTR(n,x) ((x)>>(n) | ((x)<<(32-(n))))
32
 
#define SHR(n,x) ((x)>>(n))
33
 
 
34
 
#define Choice(x,y,z)   ( (z) ^ ( (x) & ( (y) ^ (z) ) ) )
35
 
#define Majority(x,y,z) ( ((x) & (y)) ^ ((z) & ((x) ^ (y))) )
36
 
 
37
 
#define S0(x) (ROTR(2,(x)) ^ ROTR(13,(x)) ^ ROTR(22,(x)))
38
 
#define S1(x) (ROTR(6,(x)) ^ ROTR(11,(x)) ^ ROTR(25,(x)))
39
 
 
40
 
#define s0(x) (ROTR(7,(x)) ^ ROTR(18,(x)) ^ SHR(3,(x)))
41
 
#define s1(x) (ROTR(17,(x)) ^ ROTR(19,(x)) ^ SHR(10,(x)))
42
 
 
43
 
static const uint32_t K[64] = {
44
 
        0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
45
 
        0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
46
 
        0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
47
 
        0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
48
 
        0xe49b69c1UL, 0xefbe4786UL, 0xfc19dc6UL, 0x240ca1ccUL,
49
 
        0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
50
 
        0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
51
 
        0xc6e00bf3UL, 0xd5a79147UL, 0x6ca6351UL, 0x14292967UL,
52
 
        0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
53
 
        0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
54
 
        0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
55
 
        0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
56
 
        0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
57
 
        0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
58
 
        0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
59
 
        0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
60
 
};
61
 
 
62
 
#define EXPAND(W,i) \
63
 
( W[(i) & 15 ] += (s1(W[((i)-2) & 15]) + W[((i)-7) & 15] + s0(W[((i)-15) & 15])) )
64
 
 
65
 
#define ROUND(a,b,c,d,e,f,g,h,k,data) do {              \
66
 
  uint32_t T1 = h + S1(e) + Choice(e,f,g) + k + data;   \
67
 
  uint32_t T2 = S0(a) + Majority(a,b,c);                \
68
 
  d += T1;                                              \
69
 
  h = T1 + T2;                                          \
70
 
} while (0)
71
 
 
72
 
#ifndef EXTRACT_UCHAR
73
 
#define EXTRACT_UCHAR(p)  (*(const unsigned char *)(p))
74
 
#endif
75
 
 
76
 
#define STRING2INT(s) ((((((EXTRACT_UCHAR(s) << 8)    \
77
 
                         | EXTRACT_UCHAR(s+1)) << 8)  \
78
 
                         | EXTRACT_UCHAR(s+2)) << 8)  \
79
 
                         | EXTRACT_UCHAR(s+3))
80
 
 
81
 
#ifndef EXTRACT_UCHAR
82
 
#define EXTRACT_UCHAR(p)  (*(const mutils_word8 *)(p))
83
 
#endif
84
 
 
85
 
#define STRING2INT(s) ((((((EXTRACT_UCHAR(s) << 8)    \
86
 
                         | EXTRACT_UCHAR(s+1)) << 8)  \
87
 
                         | EXTRACT_UCHAR(s+2)) << 8)  \
88
 
                         | EXTRACT_UCHAR(s+3))
89
 
 
90
 
/* Initialize the SHA values */
91
 
 
92
 
void sha256_init(struct sha256_ctx *ctx)
93
 
{
94
 
        /* Initial values, also generated by the shadata program. */
95
 
        static const uint32_t H0[_SHA256_DIGEST_LENGTH] = {
96
 
                0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL,
97
 
                0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL,
98
 
        };
99
 
 
100
 
        memcpy(ctx->state, H0, sizeof(H0));
101
 
 
102
 
        /* Initialize bit count */
103
 
        ctx->count_low = ctx->count_high = 0;
104
 
 
105
 
        /* Initialize buffer */
106
 
        ctx->index = 0;
107
 
}
108
 
 
109
 
/* Perform the SHA transformation.  Note that this code, like MD5, seems to
110
 
   break some optimizing compilers due to the complexity of the expressions
111
 
   and the size of the basic block.  It may be necessary to split it into
112
 
   sections, e.g. based on the four subrounds
113
 
 
114
 
   Note that this function destroys the data area */
115
 
 
116
 
static void sha256_transform(uint32_t *state, uint32_t *data)
117
 
{
118
 
        uint32_t A, B, C, D, E, F, G, H;        /* Local vars */
119
 
        unsigned char i;
120
 
        const uint32_t *k;
121
 
        uint32_t *d;
122
 
 
123
 
        /* Set up first buffer and local data buffer */
124
 
        A = state[0];
125
 
        B = state[1];
126
 
        C = state[2];
127
 
        D = state[3];
128
 
        E = state[4];
129
 
        F = state[5];
130
 
        G = state[6];
131
 
        H = state[7];
132
 
 
133
 
        /* Heavy mangling */
134
 
        /* First 16 subrounds that act on the original data */
135
 
 
136
 
        for (i = 0, k = K, d = data; i < 16; i += 8, k += 8, d += 8) {
137
 
                ROUND(A, B, C, D, E, F, G, H, k[0], d[0]);
138
 
                ROUND(H, A, B, C, D, E, F, G, k[1], d[1]);
139
 
                ROUND(G, H, A, B, C, D, E, F, k[2], d[2]);
140
 
                ROUND(F, G, H, A, B, C, D, E, k[3], d[3]);
141
 
                ROUND(E, F, G, H, A, B, C, D, k[4], d[4]);
142
 
                ROUND(D, E, F, G, H, A, B, C, k[5], d[5]);
143
 
                ROUND(C, D, E, F, G, H, A, B, k[6], d[6]);
144
 
                ROUND(B, C, D, E, F, G, H, A, k[7], d[7]);
145
 
        }
146
 
 
147
 
        for (; i < 64; i += 16, k += 16) {
148
 
                ROUND(A, B, C, D, E, F, G, H, k[0], EXPAND(data, 0));
149
 
                ROUND(H, A, B, C, D, E, F, G, k[1], EXPAND(data, 1));
150
 
                ROUND(G, H, A, B, C, D, E, F, k[2], EXPAND(data, 2));
151
 
                ROUND(F, G, H, A, B, C, D, E, k[3], EXPAND(data, 3));
152
 
                ROUND(E, F, G, H, A, B, C, D, k[4], EXPAND(data, 4));
153
 
                ROUND(D, E, F, G, H, A, B, C, k[5], EXPAND(data, 5));
154
 
                ROUND(C, D, E, F, G, H, A, B, k[6], EXPAND(data, 6));
155
 
                ROUND(B, C, D, E, F, G, H, A, k[7], EXPAND(data, 7));
156
 
                ROUND(A, B, C, D, E, F, G, H, k[8], EXPAND(data, 8));
157
 
                ROUND(H, A, B, C, D, E, F, G, k[9], EXPAND(data, 9));
158
 
                ROUND(G, H, A, B, C, D, E, F, k[10], EXPAND(data, 10));
159
 
                ROUND(F, G, H, A, B, C, D, E, k[11], EXPAND(data, 11));
160
 
                ROUND(E, F, G, H, A, B, C, D, k[12], EXPAND(data, 12));
161
 
                ROUND(D, E, F, G, H, A, B, C, k[13], EXPAND(data, 13));
162
 
                ROUND(C, D, E, F, G, H, A, B, k[14], EXPAND(data, 14));
163
 
                ROUND(B, C, D, E, F, G, H, A, k[15], EXPAND(data, 15));
164
 
        }
165
 
 
166
 
        /* Update state */
167
 
        state[0] += A;
168
 
        state[1] += B;
169
 
        state[2] += C;
170
 
        state[3] += D;
171
 
        state[4] += E;
172
 
        state[5] += F;
173
 
        state[6] += G;
174
 
        state[7] += H;
175
 
}
176
 
 
177
 
static void sha256_block(struct sha256_ctx *ctx, const unsigned char *block)
178
 
{
179
 
        uint32_t data[SHA256_DATA_LENGTH];
180
 
        uint16_t i;
181
 
 
182
 
        /* Update block count */
183
 
        if (!++ctx->count_low)
184
 
                ++ctx->count_high;
185
 
 
186
 
        /* Endian independent conversion */
187
 
        for (i = 0; i < SHA256_DATA_LENGTH; i++, block += 4)
188
 
                data[i] = STRING2INT(block);
189
 
 
190
 
        sha256_transform(ctx->state, data);
191
 
}
192
 
 
193
 
void
194
 
sha256_update(struct sha256_ctx *ctx, const unsigned char *buffer, uint32_t length)
195
 
{
196
 
        uint32_t left;
197
 
 
198
 
        if (ctx->index) {       /* Try to fill partial block */
199
 
                left = SHA256_DATA_SIZE - ctx->index;
200
 
                if (length < left) {
201
 
                        memcpy(ctx->block + ctx->index, buffer, length);
202
 
                        ctx->index += length;
203
 
                        return; /* Finished */
204
 
                } else {
205
 
                        memcpy(ctx->block + ctx->index, buffer, left);
206
 
                        sha256_block(ctx, ctx->block);
207
 
                        buffer += left;
208
 
                        length -= left;
209
 
                }
210
 
        }
211
 
        while (length >= SHA256_DATA_SIZE) {
212
 
                sha256_block(ctx, buffer);
213
 
                buffer += SHA256_DATA_SIZE;
214
 
                length -= SHA256_DATA_SIZE;
215
 
        }
216
 
        /* Buffer leftovers */
217
 
        /* NOTE: The corresponding sha1 code checks for the special case length == 0.
218
 
         * That seems supoptimal, as I suspect it increases the number of branches. */
219
 
 
220
 
        memcpy(ctx->block, buffer, length);
221
 
        ctx->index = length;
222
 
}
223
 
 
224
 
/* Final wrapup - pad to SHA1_DATA_SIZE-byte boundary with the bit pattern
225
 
   1 0* (64-bit count of bits processed, MSB-first) */
226
 
 
227
 
void sha256_final(struct sha256_ctx *ctx)
228
 
{
229
 
        uint32_t data[SHA256_DATA_LENGTH];
230
 
        uint32_t i;
231
 
        uint32_t words;
232
 
 
233
 
        i = ctx->index;
234
 
 
235
 
        /* Set the first char of padding to 0x80.  This is safe since there is
236
 
           always at least one byte free */
237
 
 
238
 
/*  assert(i < SHA256_DATA_SIZE);
239
 
 */
240
 
        ctx->block[i++] = 0x80;
241
 
 
242
 
        /* Fill rest of word */
243
 
        for (; i & 3; i++)
244
 
                ctx->block[i] = 0;
245
 
 
246
 
        /* i is now a multiple of the word size 4 */
247
 
        words = i >> 2;
248
 
        for (i = 0; i < words; i++)
249
 
                data[i] = STRING2INT(ctx->block + 4 * i);
250
 
 
251
 
        if (words > (SHA256_DATA_LENGTH - 2)) { /* No room for length in this block. Process it and
252
 
                                                 * pad with another one */
253
 
                for (i = words; i < SHA256_DATA_LENGTH; i++)
254
 
                        data[i] = 0;
255
 
                sha256_transform(ctx->state, data);
256
 
                for (i = 0; i < (SHA256_DATA_LENGTH - 2); i++)
257
 
                        data[i] = 0;
258
 
        } else
259
 
                for (i = words; i < SHA256_DATA_LENGTH - 2; i++)
260
 
                        data[i] = 0;
261
 
 
262
 
        /* There are 512 = 2^9 bits in one block */
263
 
        data[SHA256_DATA_LENGTH - 2] =
264
 
            (ctx->count_high << 9) | (ctx->count_low >> 23);
265
 
        data[SHA256_DATA_LENGTH - 1] =
266
 
            (ctx->count_low << 9) | (ctx->index << 3);
267
 
        sha256_transform(ctx->state, data);
268
 
}
269
 
 
270
 
void sha256_digest(const struct sha256_ctx *ctx, unsigned char *s)
271
 
{
272
 
        uint32_t i;
273
 
 
274
 
        if (s!=NULL)
275
 
                for (i = 0; i < _SHA256_DIGEST_LENGTH; i++) {
276
 
                        *s++ = ctx->state[i] >> 24;
277
 
                        *s++ = 0xff & (ctx->state[i] >> 16);
278
 
                        *s++ = 0xff & (ctx->state[i] >> 8);
279
 
                        *s++ = 0xff & ctx->state[i];
280
 
                }
281
 
}