aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2010-04-14 20:43:06 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2010-04-14 21:11:29 +0200
commit250273cf1aa5d8391aeb68ac11b55a067cab1969 (patch)
tree5ad47192757c2e4e45ef0aa3e58995bddea40496
parentbc15f7b7aa60f993e5fb138e1193a5dd72eddea9 (diff)
downloadlibssh-250273cf1aa5d8391aeb68ac11b55a067cab1969.tar.gz
libssh-250273cf1aa5d8391aeb68ac11b55a067cab1969.tar.xz
libssh-250273cf1aa5d8391aeb68ac11b55a067cab1969.zip
Do not compile aes*-ctr with <=OpenSSL 0.9.7b
-rw-r--r--include/libssh/wrapper.h5
-rw-r--r--libssh/kex.c5
-rw-r--r--libssh/wrapper.c8
3 files changed, 18 insertions, 0 deletions
diff --git a/include/libssh/wrapper.h b/include/libssh/wrapper.h
index 093f8b74..71ed81f4 100644
--- a/include/libssh/wrapper.h
+++ b/include/libssh/wrapper.h
@@ -70,6 +70,11 @@ typedef HMAC_CTX* HMACCTX;
#define MD5_DIGEST_LEN MD5_DIGEST_LENGTH
#include <openssl/bn.h>
+#include <openssl/opensslv.h>
+#define OPENSSL_0_9_7b 0x0090702fL
+#if (OPENSSL_VERSION_NUMBER <= OPENSSL_0_9_7b)
+#define BROKEN_AES_CTR
+#endif
typedef BIGNUM* bignum;
typedef BN_CTX* bignum_CTX;
diff --git a/libssh/kex.c b/libssh/kex.c
index 2b833840..a5997348 100644
--- a/libssh/kex.c
+++ b/libssh/kex.c
@@ -53,10 +53,15 @@
#define BLOWFISH ""
#endif
#ifdef HAVE_OPENSSL_AES_H
+#ifdef BROKEN_AES_CTR
+#define AES "aes256-cbc,aes192-cbc,aes128-cbc,"
+#else
#define AES "aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,"
+#endif /* BROKEN_AES_CTR */
#else
#define AES ""
#endif
+
#define DES "3des-cbc"
#endif
diff --git a/libssh/wrapper.c b/libssh/wrapper.c
index 807f743a..c3a31237 100644
--- a/libssh/wrapper.c
+++ b/libssh/wrapper.c
@@ -614,6 +614,11 @@ static void aes_decrypt(struct crypto_struct *cipher, void *in, void *out,
AES_cbc_encrypt(in, out, len, cipher->key, IV, AES_DECRYPT);
}
+#ifndef BROKEN_AES_CTR
+/* OpenSSL until 0.9.7c has a broken AES_ctr128_encrypt implementation which
+ * increments the counter from 2^64 instead of 1. It's better not to use it
+ */
+
/** @internal
* @brief encrypts/decrypts data with stream cipher AES_ctr128. 128 bits is actually
* the size of the CTR counter and incidentally the blocksize, but not the keysize.
@@ -631,6 +636,7 @@ static void aes_ctr128_encrypt(struct crypto_struct *cipher, void *in, void *out
*/
AES_ctr128_encrypt(in, out, len, cipher->key, IV, tmp_buffer, &num);
}
+#endif /* BROKEN_AES_CTR */
#endif /* HAS_AES */
#ifdef HAS_DES
@@ -722,6 +728,7 @@ static struct crypto_struct ssh_ciphertab[] = {
},
#endif /* HAS_BLOWFISH */
#ifdef HAS_AES
+#ifndef BROKEN_AES_CTR
{
"aes128-ctr",
16,
@@ -755,6 +762,7 @@ static struct crypto_struct ssh_ciphertab[] = {
aes_ctr128_encrypt,
aes_ctr128_encrypt
},
+#endif /* BROKEN_AES_CTR */
{
"aes128-cbc",
16,