From d51df918970bcf42f915a3882bfdee5972aa9bad Mon Sep 17 00:00:00 2001 From: Bruce Momjian <bruce@momjian.us> Date: Sun, 10 Jul 2005 13:54:34 +0000 Subject: [PATCH] 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 --- contrib/pgcrypto/openssl.c | 56 ++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/contrib/pgcrypto/openssl.c b/contrib/pgcrypto/openssl.c index cb9604b4a32..3c3c7bda70f 100644 --- a/contrib/pgcrypto/openssl.c +++ b/contrib/pgcrypto/openssl.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.21 2005/07/10 03:55:28 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.22 2005/07/10 13:54:34 momjian Exp $ */ #include <postgres.h> @@ -50,6 +50,26 @@ #include <openssl/aes.h> #endif +/* + * Compatibility with older OpenSSL API for DES. + */ +#if OPENSSL_VERSION_NUMBER < 0x00907000L +#define DES_key_schedule des_key_schedule +#define DES_cblock des_cblock +#define DES_set_key(k, ks) \ + des_set_key((k), *(ks)) +#define DES_ecb_encrypt(i, o, k, e) \ + des_ecb_encrypt((i), (o), *(k), (e)) +#define DES_ncbc_encrypt(i, o, l, k, iv, e) \ + des_ncbc_encrypt((i), (o), (l), *(k), (iv), (e)) +#define DES_ecb3_encrypt(i, o, k1, k2, k3, e) \ + des_ecb3_encrypt((des_cblock *)(i), (des_cblock *)(o), \ + *(k1), *(k2), *(k3), (e)) +#define DES_ede3_cbc_encrypt(i, o, l, k1, k2, k3, iv, e) \ + des_ede3_cbc_encrypt((i), (o), \ + (l), *(k1), *(k2), *(k3), (iv), (e)) +#endif + /* * Hashes */ @@ -178,11 +198,11 @@ typedef struct } bf; struct { - des_key_schedule key_schedule; + DES_key_schedule key_schedule; } des; struct { - des_key_schedule k1, k2, k3; + DES_key_schedule k1, k2, k3; } des3; CAST_KEY cast_key; #ifdef GOT_AES @@ -318,11 +338,11 @@ static int ossl_des_init(PX_Cipher * c, const uint8 *key, unsigned klen, const uint8 *iv) { ossldata *od = c->ptr; - des_cblock xkey; + DES_cblock xkey; memset(&xkey, 0, sizeof(xkey)); memcpy(&xkey, key, klen > 8 ? 8 : klen); - des_set_key(&xkey, od->u.des.key_schedule); + DES_set_key(&xkey, &od->u.des.key_schedule); memset(&xkey, 0, sizeof(xkey)); if (iv) @@ -341,9 +361,9 @@ ossl_des_ecb_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, ossldata *od = c->ptr; for (i = 0; i < dlen / bs; i++) - des_ecb_encrypt((des_cblock *) (data + i * bs), - (des_cblock *) (res + i * bs), - od->u.des.key_schedule, 1); + DES_ecb_encrypt((DES_cblock *) (data + i * bs), + (DES_cblock *) (res + i * bs), + &od->u.des.key_schedule, 1); return 0; } @@ -356,9 +376,9 @@ ossl_des_ecb_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, ossldata *od = c->ptr; for (i = 0; i < dlen / bs; i++) - des_ecb_encrypt((des_cblock *) (data + i * bs), - (des_cblock *) (res + i * bs), - od->u.des.key_schedule, 0); + DES_ecb_encrypt((DES_cblock *) (data + i * bs), + (DES_cblock *) (res + i * bs), + &od->u.des.key_schedule, 0); return 0; } @@ -368,8 +388,8 @@ ossl_des_cbc_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, { ossldata *od = c->ptr; - des_ncbc_encrypt(data, res, dlen, od->u.des.key_schedule, - (des_cblock *) od->iv, 1); + DES_ncbc_encrypt(data, res, dlen, &od->u.des.key_schedule, + (DES_cblock *) od->iv, 1); return 0; } @@ -379,8 +399,8 @@ ossl_des_cbc_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, { ossldata *od = c->ptr; - des_ncbc_encrypt(data, res, dlen, od->u.des.key_schedule, - (des_cblock *) od->iv, 0); + DES_ncbc_encrypt(data, res, dlen, &od->u.des.key_schedule, + (DES_cblock *) od->iv, 0); return 0; } @@ -390,7 +410,7 @@ static int ossl_des3_init(PX_Cipher * c, const uint8 *key, unsigned klen, const uint8 *iv) { ossldata *od = c->ptr; - des_cblock xkey1, + DES_cblock xkey1, xkey2, xkey3; @@ -453,7 +473,7 @@ ossl_des3_cbc_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, DES_ede3_cbc_encrypt(data, res, dlen, &od->u.des3.k1, &od->u.des3.k2, &od->u.des3.k3, - (des_cblock *) od->iv, 1); + (DES_cblock *) od->iv, 1); return 0; } @@ -465,7 +485,7 @@ ossl_des3_cbc_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, DES_ede3_cbc_encrypt(data, res, dlen, &od->u.des3.k1, &od->u.des3.k2, &od->u.des3.k3, - (des_cblock *) od->iv, 0); + (DES_cblock *) od->iv, 0); return 0; } -- GitLab