Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 159870 | Differences between
and this patch

Collapse All | Expand All

(-)file_not_specified_in_diff (-7 / +294 lines)
Line  Link Here
0
-- libgcrypt-1.5.0-orig/cipher/Makefile.am
0
++ libgcrypt-1.5.0/cipher/Makefile.am
Lines 51-56 Link Here
51
dsa.c \
51
dsa.c \
52
elgamal.c \
52
elgamal.c \
53
ecc.c \
53
ecc.c \
54
idea.c \
54
md4.c \
55
md4.c \
55
md5.c \
56
md5.c \
56
rijndael.c rijndael-tables.h \
57
rijndael.c rijndael-tables.h \
57
-- libgcrypt-1.5.0-orig/cipher/cipher.c
58
++ libgcrypt-1.5.0/cipher/cipher.c
Lines 112-117 Link Here
112
    { &_gcry_cipher_spec_camellia256,
112
    { &_gcry_cipher_spec_camellia256,
113
      &dummy_extra_spec,                  GCRY_CIPHER_CAMELLIA256 },
113
      &dummy_extra_spec,                  GCRY_CIPHER_CAMELLIA256 },
114
#endif
114
#endif
115
#ifdef USE_IDEA
116
    { &_gcry_cipher_spec_idea,
117
      &dummy_extra_spec,                  GCRY_CIPHER_IDEA },
118
#endif
115
    { NULL                    }
119
    { NULL                    }
116
  };
120
  };
117
121
118
-- libgcrypt-1.5.0-orig/cipher/idea.c
122
++ libgcrypt-1.5.0/cipher/idea.c
Line 0 Link Here
0
-- libgcrypt-1.5.0-orig/configure.ac
1
#include <config.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <string.h> /* for memcmp() */
5
#include <assert.h>
6
7
#include "types.h"  /* for byte and u32 typedefs */
8
#include "g10lib.h"
9
#include "cipher.h"
10
11
/* configuration stuff */
12
#ifdef __alpha__
13
  #define SIZEOF_UNSIGNED_LONG 8
14
#else
15
  #define SIZEOF_UNSIGNED_LONG 4
16
#endif
17
18
#if defined(__mc68000__) || defined (__sparc__) || defined (__PPC__) \
19
    || (defined(__mips__) && (defined(MIPSEB) || defined (__MIPSEB__)) ) \
20
    || defined(__powerpc__) \
21
    || defined(__hpux__) /* should be replaced by the Macro for the PA */
22
  #define BIG_ENDIAN_HOST 1
23
#else
24
  #define LITTLE_ENDIAN_HOST 1
25
#endif
26
27
#ifndef DIM
28
  #define DIM(v) (sizeof(v)/sizeof((v)[0]))
29
  #define DIMof(type,member)   DIM(((type *)0)->member)
30
#endif
31
32
/* imports */
33
void g10_log_fatal( const char *fmt, ... );
34
35
36
/* local stuff */
37
38
#define FNCCAST_SETKEY(f)  ((int(*)(void*, byte*, unsigned))(f))
39
#define FNCCAST_CRYPT(f)   ((void(*)(void*, byte*, byte*))(f))
40
41
#define IDEA_KEYSIZE 16
42
#define IDEA_BLOCKSIZE 8
43
#define IDEA_ROUNDS 8
44
#define IDEA_KEYLEN (6*IDEA_ROUNDS+4)
45
46
typedef struct {
47
    u16 ek[IDEA_KEYLEN];
48
    u16 dk[IDEA_KEYLEN];
49
    int have_dk;
50
} IDEA_context;
51
52
static u16
53
mul_inv( u16 x )
54
{
55
    u16 t0, t1;
56
    u16 q, y;
57
58
    if( x < 2 )
59
	return x;
60
    t1 = 0x10001L / x;
61
    y =  0x10001L % x;
62
    if( y == 1 )
63
	return (1-t1) & 0xffff;
64
65
    t0 = 1;
66
    do {
67
	q = x / y;
68
	x = x % y;
69
	t0 += q * t1;
70
	if( x == 1 )
71
	    return t0;
72
	q = y / x;
73
	y = y % x;
74
	t1 += q * t0;
75
    } while( y != 1 );
76
    return (1-t1) & 0xffff;
77
}
78
79
static void
80
cipher( byte *outbuf, const byte *inbuf, u16 *key )
81
{
82
    u16 x1, x2, x3,x4, s2, s3;
83
    u16 *in, *out;
84
    int r = IDEA_ROUNDS;
85
  #define MUL(x,y) \
86
	do {u16 _t16; u32 _t32; 		    \
87
	    if( (_t16 = (y)) ) {		    \
88
		if( (x = (x)&0xffff) ) {	    \
89
		    _t32 = (u32)x * _t16;	    \
90
		    x = _t32 & 0xffff;		    \
91
		    _t16 = _t32 >> 16;		    \
92
		    x = ((x)-_t16) + (x<_t16?1:0);  \
93
		}				    \
94
		else {				    \
95
		    x = 1 - _t16;		    \
96
		}				    \
97
	    }					    \
98
	    else {				    \
99
		x = 1 - x;			    \
100
	    }					    \
101
	} while(0)
102
103
    in = (u16*)inbuf;
104
    x1 = *in++;
105
    x2 = *in++;
106
    x3 = *in++;
107
    x4 = *in;
108
  #ifdef LITTLE_ENDIAN_HOST
109
    x1 = (x1>>8) | (x1<<8);
110
    x2 = (x2>>8) | (x2<<8);
111
    x3 = (x3>>8) | (x3<<8);
112
    x4 = (x4>>8) | (x4<<8);
113
  #endif
114
    do {
115
	MUL(x1, *key++);
116
	x2 += *key++;
117
	x3 += *key++;
118
	MUL(x4, *key++ );
119
120
	s3 = x3;
121
	x3 ^= x1;
122
	MUL(x3, *key++);
123
	s2 = x2;
124
	x2 ^=x4;
125
	x2 += x3;
126
	MUL(x2, *key++);
127
	x3 += x2;
128
129
	x1 ^= x2;
130
	x4 ^= x3;
131
132
	x2 ^= s3;
133
	x3 ^= s2;
134
    } while( --r );
135
    MUL(x1, *key++);
136
    x3 += *key++;
137
    x2 += *key++;
138
    MUL(x4, *key);
139
140
    out = (u16*)outbuf;
141
  #ifdef LITTLE_ENDIAN_HOST
142
    *out++ = (x1>>8) | (x1<<8);
143
    *out++ = (x3>>8) | (x3<<8);
144
    *out++ = (x2>>8) | (x2<<8);
145
    *out   = (x4>>8) | (x4<<8);
146
  #else
147
    *out++ = x1;
148
    *out++ = x3;
149
    *out++ = x2;
150
    *out   = x4;
151
  #endif
152
  #undef MUL
153
}
154
155
static void
156
expand_key( const byte *userkey, u16 *ek )
157
{
158
    int i,j;
159
160
    for(j=0; j < 8; j++ ) {
161
	ek[j] = (*userkey << 8) + userkey[1];
162
	userkey += 2;
163
    }
164
    for(i=0; j < IDEA_KEYLEN; j++ ) {
165
	i++;
166
	ek[i+7] = ek[i&7] << 9 | ek[(i+1)&7] >> 7;
167
	ek += i & 8;
168
	i &= 7;
169
    }
170
}
171
172
static void
173
invert_key( u16 *ek, u16 dk[IDEA_KEYLEN] )
174
{
175
    int i;
176
    u16 t1, t2, t3;
177
    u16 temp[IDEA_KEYLEN];
178
    u16 *p = temp + IDEA_KEYLEN;
179
180
    t1 = mul_inv( *ek++ );
181
    t2 = -*ek++;
182
    t3 = -*ek++;
183
    *--p = mul_inv( *ek++ );
184
    *--p = t3;
185
    *--p = t2;
186
    *--p = t1;
187
188
    for(i=0; i < IDEA_ROUNDS-1; i++ ) {
189
	t1 = *ek++;
190
	*--p = *ek++;
191
	*--p = t1;
192
193
	t1 = mul_inv( *ek++ );
194
	t2 = -*ek++;
195
	t3 = -*ek++;
196
	*--p = mul_inv( *ek++ );
197
	*--p = t2;
198
	*--p = t3;
199
	*--p = t1;
200
    }
201
    t1 = *ek++;
202
    *--p = *ek++;
203
    *--p = t1;
204
205
    t1 = mul_inv( *ek++ );
206
    t2 = -*ek++;
207
    t3 = -*ek++;
208
    *--p = mul_inv( *ek++ );
209
    *--p = t3;
210
    *--p = t2;
211
    *--p = t1;
212
    memcpy(dk, temp, sizeof(temp) );
213
    memset(temp, 0, sizeof(temp) );  /* burn temp */
214
}
215
216
static int
217
do_idea_setkey( IDEA_context *c, const byte *key, unsigned int keylen )
218
{
219
    assert(keylen == 16);
220
    c->have_dk = 0;
221
    expand_key( key, c->ek );
222
    invert_key( c->ek, c->dk );
223
    return 0;
224
}
225
226
static gcry_err_code_t
227
idea_setkey (void *context, const byte *key, unsigned int keylen)
228
{
229
  IDEA_context *ctx = context;
230
  int rc = do_idea_setkey (ctx, key, keylen);
231
  _gcry_burn_stack (23+6*sizeof(void*));
232
  return rc;
233
}
234
235
static void
236
do_idea_encrypt( IDEA_context *c, byte *outbuf, const byte *inbuf )
237
{
238
    cipher( outbuf, inbuf, c->ek );
239
}
240
241
static void
242
idea_encrypt (void *context, byte *out, const byte *in)
243
{
244
  IDEA_context *ctx = context;
245
  do_idea_encrypt (ctx, out, in);
246
  _gcry_burn_stack (24+3*sizeof (void*));
247
}
248
249
static void
250
do_idea_decrypt( IDEA_context *c, byte *outbuf, const byte *inbuf )
251
{
252
    if( !c->have_dk ) {
253
       c->have_dk = 1;
254
       invert_key( c->ek, c->dk );
255
    }
256
    cipher( outbuf, inbuf, c->dk );
257
}
258
259
static void
260
idea_decrypt (void *context, byte *out, const byte *in)
261
{
262
  IDEA_context *ctx = context;
263
264
  do_idea_decrypt (ctx, out, in);
265
  _gcry_burn_stack (24+3*sizeof (void*));
266
}
267
268
gcry_cipher_spec_t _gcry_cipher_spec_idea =
269
  {
270
    "IDEA", NULL, NULL, IDEA_BLOCKSIZE, 128, sizeof (IDEA_context),
271
    idea_setkey, idea_encrypt, idea_decrypt,
272
  };
273
++ libgcrypt-1.5.0/configure.ac
Lines 156-162 Link Here
156
156
157
# Definitions for symmetric ciphers.
157
# Definitions for symmetric ciphers.
158
available_ciphers="arcfour blowfish cast5 des aes twofish serpent rfc2268 seed"
158
available_ciphers="arcfour blowfish cast5 des aes twofish serpent rfc2268 seed"
159
available_ciphers="$available_ciphers camellia"
159
available_ciphers="$available_ciphers camellia idea"
160
enabled_ciphers=""
160
enabled_ciphers=""
161
161
162
# Definitions for public-key ciphers.
162
# Definitions for public-key ciphers.
Lines 1047-1052 Link Here
1047
   AC_DEFINE(USE_CAMELLIA, 1, [Defined if this module should be included])
1047
   AC_DEFINE(USE_CAMELLIA, 1, [Defined if this module should be included])
1048
fi
1048
fi
1049
1049
1050
LIST_MEMBER(idea, $enabled_ciphers)
1051
if test "$found" = "1" ; then
1052
   GCRYPT_CIPHERS="$GCRYPT_CIPHERS idea.lo"
1053
   AC_DEFINE(USE_IDEA, 1, [Defined if this module should be included])
1054
fi
1055
1050
LIST_MEMBER(dsa, $enabled_pubkey_ciphers)
1056
LIST_MEMBER(dsa, $enabled_pubkey_ciphers)
1051
if test "$found" = "1" ; then
1057
if test "$found" = "1" ; then
1052
   GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS dsa.lo"
1058
   GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS dsa.lo"
1053
-- libgcrypt-1.5.0-orig/src/cipher.h
1059
++ libgcrypt-1.5.0/src/cipher.h
Lines 135-140 Link Here
135
extern gcry_cipher_spec_t _gcry_cipher_spec_camellia128;
135
extern gcry_cipher_spec_t _gcry_cipher_spec_camellia128;
136
extern gcry_cipher_spec_t _gcry_cipher_spec_camellia192;
136
extern gcry_cipher_spec_t _gcry_cipher_spec_camellia192;
137
extern gcry_cipher_spec_t _gcry_cipher_spec_camellia256;
137
extern gcry_cipher_spec_t _gcry_cipher_spec_camellia256;
138
extern gcry_cipher_spec_t _gcry_cipher_spec_idea;
138
139
139
extern cipher_extra_spec_t _gcry_cipher_extraspec_tripledes;
140
extern cipher_extra_spec_t _gcry_cipher_extraspec_tripledes;
140
extern cipher_extra_spec_t _gcry_cipher_extraspec_aes;
141
extern cipher_extra_spec_t _gcry_cipher_extraspec_aes;
141
-- libgcrypt-1.5.0-orig/tests/basic.c
142
++ libgcrypt-1.5.0/tests/basic.c
Lines 1494-1499 Link Here
1494
    GCRY_CIPHER_CAMELLIA192,
1494
    GCRY_CIPHER_CAMELLIA192,
1495
    GCRY_CIPHER_CAMELLIA256,
1495
    GCRY_CIPHER_CAMELLIA256,
1496
#endif
1496
#endif
1497
#if USE_IDEA
1498
    GCRY_CIPHER_IDEA,
1499
#endif
1497
    0
1500
    0
1498
  };
1501
  };
1499
  static int algos2[] = {
1502
  static int algos2[] = {

Return to bug 159870