~cpick/mongrel2/release

« back to all changes in this revision

Viewing changes to src/polarssl/xtea.c

  • Committer: Chris Pick
  • Date: 2013-06-30 16:39:57 UTC
  • mfrom: (1106.1.15)
  • Revision ID: git-v1:ec39967acb6bc9867ed9b9dc3774304ca6b9c294
Merge tag 'v1.8.1' into debian

Hotfix for github issue 148

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
 
30
30
#include "polarssl/xtea.h"
31
31
 
32
 
#include <string.h>
33
 
 
34
32
/*
35
33
 * 32-bit integer manipulation macros (big endian)
36
34
 */
38
36
#define GET_ULONG_BE(n,b,i)                             \
39
37
{                                                       \
40
38
    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \
41
 
            | ( (unsigned long) (b)[(i) + 1] << 16 )        \
42
 
            | ( (unsigned long) (b)[(i) + 2] <<  8 )        \
43
 
            | ( (unsigned long) (b)[(i) + 3]       );       \
 
39
        | ( (unsigned long) (b)[(i) + 1] << 16 )        \
 
40
        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \
 
41
        | ( (unsigned long) (b)[(i) + 3]       );       \
44
42
}
45
43
#endif
46
44
 
65
63
 
66
64
    for( i = 0; i < 4; i++ )
67
65
    {
68
 
        GET_ULONG_BE( ctx->k[i], key, i << 2 );
 
66
        GET_ULONG_BE( ctx->k[i], key, i << 2 );
69
67
    }
70
68
}
71
69
 
84
82
 
85
83
    if( mode == XTEA_ENCRYPT )
86
84
    {
87
 
            uint32_t sum = 0, delta = 0x9E3779B9;
 
85
        uint32_t sum = 0, delta = 0x9E3779B9;
88
86
 
89
 
            for( i = 0; i < 32; i++ )
90
 
            {
91
 
                    v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
92
 
                    sum += delta;
93
 
                    v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
94
 
            }
 
87
        for( i = 0; i < 32; i++ )
 
88
        {
 
89
            v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
 
90
            sum += delta;
 
91
            v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
 
92
        }
95
93
    }
96
94
    else /* XTEA_DECRYPT */
97
95
    {
98
 
            uint32_t delta = 0x9E3779B9, sum = delta * 32;
 
96
        uint32_t delta = 0x9E3779B9, sum = delta * 32;
99
97
 
100
 
            for( i = 0; i < 32; i++ )
101
 
            {
102
 
                    v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
103
 
                    sum -= delta;
104
 
                    v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
105
 
            }
 
98
        for( i = 0; i < 32; i++ )
 
99
        {
 
100
            v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
 
101
            sum -= delta;
 
102
            v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
 
103
        }
106
104
    }
107
105
 
108
106
    PUT_ULONG_BE( v0, output, 0 );
111
109
    return( 0 );
112
110
}
113
111
 
 
112
/*
 
113
 * XTEA-CBC buffer encryption/decryption
 
114
 */
 
115
int xtea_crypt_cbc( xtea_context *ctx,
 
116
                    int mode,
 
117
                    size_t length,
 
118
                    unsigned char iv[8],
 
119
                    unsigned char *input,
 
120
                    unsigned char *output)
 
121
{
 
122
    int i;
 
123
    unsigned char temp[8];
 
124
 
 
125
    if(length % 8)
 
126
        return( POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH );
 
127
 
 
128
    if( mode == XTEA_DECRYPT ) 
 
129
    {
 
130
        while( length > 0 )
 
131
        {
 
132
            memcpy( temp, input, 8 );
 
133
            xtea_crypt_ecb( ctx, mode, input, output );
 
134
 
 
135
            for(i = 0; i < 8; i++) 
 
136
                output[i] = (unsigned char)( output[i] ^ iv[i] );
 
137
 
 
138
            memcpy( iv, temp, 8 );
 
139
 
 
140
            input  += 8;
 
141
            output += 8;
 
142
            length -= 8;
 
143
        }
 
144
    } 
 
145
    else 
 
146
    {
 
147
        while( length > 0 )
 
148
        {
 
149
            for( i = 0; i < 8; i++ )
 
150
                output[i] = (unsigned char)( input[i] ^ iv[i] );
 
151
 
 
152
            xtea_crypt_ecb( ctx, mode, output, output );
 
153
            memcpy( iv, output, 8 );
 
154
            
 
155
            input  += 8;
 
156
            output += 8;
 
157
            length -= 8;
 
158
        }
 
159
    }
 
160
 
 
161
    return( 0 );
 
162
}
 
163
 
114
164
#if defined(POLARSSL_SELF_TEST)
115
165
 
116
166
#include <string.h>