Thanks to visit codestin.com
Credit goes to github.com

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)