Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit d51df91

Browse files
committed
As Kris Jurka found out, pgcrypto does not work with
OpenSSL 0.9.6x. The DES functions use the older 'des_' API, but the newer 3DES functions use the 0.9.7x-only 'DES_' API. I think I just used /usr/include/openssl/des.h for reference when implementing them, and had upgraded OpenSSL in the meantime. Following patch converts DES also to newer API and provides compatibility functions for OpenSSL < 0.9.7. I chose this route because: - openssl.c uses few DES functions. - compatibility for old 'des_' API is going away at some point of time from OpenSSL. - as seen from macros, new API is saner - Thus pgcrypto supports any OpenSSL version from 0.9.5 to 1.0 Tested with OpenSSL 0.9.6c and 0.9.7e. Marko Kreen
1 parent e94dd6a commit d51df91

File tree

1 file changed

+38
-18
lines changed

1 file changed

+38
-18
lines changed

contrib/pgcrypto/openssl.c

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2727
* SUCH DAMAGE.
2828
*
29-
* $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.21 2005/07/10 03:55:28 momjian Exp $
29+
* $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.22 2005/07/10 13:54:34 momjian Exp $
3030
*/
3131

3232
#include <postgres.h>
@@ -50,6 +50,26 @@
5050
#include <openssl/aes.h>
5151
#endif
5252

53+
/*
54+
* Compatibility with older OpenSSL API for DES.
55+
*/
56+
#if OPENSSL_VERSION_NUMBER < 0x00907000L
57+
#define DES_key_schedule des_key_schedule
58+
#define DES_cblock des_cblock
59+
#define DES_set_key(k, ks) \
60+
des_set_key((k), *(ks))
61+
#define DES_ecb_encrypt(i, o, k, e) \
62+
des_ecb_encrypt((i), (o), *(k), (e))
63+
#define DES_ncbc_encrypt(i, o, l, k, iv, e) \
64+
des_ncbc_encrypt((i), (o), (l), *(k), (iv), (e))
65+
#define DES_ecb3_encrypt(i, o, k1, k2, k3, e) \
66+
des_ecb3_encrypt((des_cblock *)(i), (des_cblock *)(o), \
67+
*(k1), *(k2), *(k3), (e))
68+
#define DES_ede3_cbc_encrypt(i, o, l, k1, k2, k3, iv, e) \
69+
des_ede3_cbc_encrypt((i), (o), \
70+
(l), *(k1), *(k2), *(k3), (iv), (e))
71+
#endif
72+
5373
/*
5474
* Hashes
5575
*/
@@ -178,11 +198,11 @@ typedef struct
178198
} bf;
179199
struct
180200
{
181-
des_key_schedule key_schedule;
201+
DES_key_schedule key_schedule;
182202
} des;
183203
struct
184204
{
185-
des_key_schedule k1, k2, k3;
205+
DES_key_schedule k1, k2, k3;
186206
} des3;
187207
CAST_KEY cast_key;
188208
#ifdef GOT_AES
@@ -318,11 +338,11 @@ static int
318338
ossl_des_init(PX_Cipher * c, const uint8 *key, unsigned klen, const uint8 *iv)
319339
{
320340
ossldata *od = c->ptr;
321-
des_cblock xkey;
341+
DES_cblock xkey;
322342

323343
memset(&xkey, 0, sizeof(xkey));
324344
memcpy(&xkey, key, klen > 8 ? 8 : klen);
325-
des_set_key(&xkey, od->u.des.key_schedule);
345+
DES_set_key(&xkey, &od->u.des.key_schedule);
326346
memset(&xkey, 0, sizeof(xkey));
327347

328348
if (iv)
@@ -341,9 +361,9 @@ ossl_des_ecb_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
341361
ossldata *od = c->ptr;
342362

343363
for (i = 0; i < dlen / bs; i++)
344-
des_ecb_encrypt((des_cblock *) (data + i * bs),
345-
(des_cblock *) (res + i * bs),
346-
od->u.des.key_schedule, 1);
364+
DES_ecb_encrypt((DES_cblock *) (data + i * bs),
365+
(DES_cblock *) (res + i * bs),
366+
&od->u.des.key_schedule, 1);
347367
return 0;
348368
}
349369

@@ -356,9 +376,9 @@ ossl_des_ecb_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
356376
ossldata *od = c->ptr;
357377

358378
for (i = 0; i < dlen / bs; i++)
359-
des_ecb_encrypt((des_cblock *) (data + i * bs),
360-
(des_cblock *) (res + i * bs),
361-
od->u.des.key_schedule, 0);
379+
DES_ecb_encrypt((DES_cblock *) (data + i * bs),
380+
(DES_cblock *) (res + i * bs),
381+
&od->u.des.key_schedule, 0);
362382
return 0;
363383
}
364384

@@ -368,8 +388,8 @@ ossl_des_cbc_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
368388
{
369389
ossldata *od = c->ptr;
370390

371-
des_ncbc_encrypt(data, res, dlen, od->u.des.key_schedule,
372-
(des_cblock *) od->iv, 1);
391+
DES_ncbc_encrypt(data, res, dlen, &od->u.des.key_schedule,
392+
(DES_cblock *) od->iv, 1);
373393
return 0;
374394
}
375395

@@ -379,8 +399,8 @@ ossl_des_cbc_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
379399
{
380400
ossldata *od = c->ptr;
381401

382-
des_ncbc_encrypt(data, res, dlen, od->u.des.key_schedule,
383-
(des_cblock *) od->iv, 0);
402+
DES_ncbc_encrypt(data, res, dlen, &od->u.des.key_schedule,
403+
(DES_cblock *) od->iv, 0);
384404
return 0;
385405
}
386406

@@ -390,7 +410,7 @@ static int
390410
ossl_des3_init(PX_Cipher * c, const uint8 *key, unsigned klen, const uint8 *iv)
391411
{
392412
ossldata *od = c->ptr;
393-
des_cblock xkey1,
413+
DES_cblock xkey1,
394414
xkey2,
395415
xkey3;
396416

@@ -453,7 +473,7 @@ ossl_des3_cbc_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
453473

454474
DES_ede3_cbc_encrypt(data, res, dlen,
455475
&od->u.des3.k1, &od->u.des3.k2, &od->u.des3.k3,
456-
(des_cblock *) od->iv, 1);
476+
(DES_cblock *) od->iv, 1);
457477
return 0;
458478
}
459479

@@ -465,7 +485,7 @@ ossl_des3_cbc_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
465485

466486
DES_ede3_cbc_encrypt(data, res, dlen,
467487
&od->u.des3.k1, &od->u.des3.k2, &od->u.des3.k3,
468-
(des_cblock *) od->iv, 0);
488+
(DES_cblock *) od->iv, 0);
469489
return 0;
470490
}
471491

0 commit comments

Comments
 (0)