openssl: move shared AES-CTR code into misc
diff --git a/src/misc.c b/src/misc.c
index f7faae7..94904ab 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -643,3 +643,31 @@
     }
     return p;
 }
+
+/* XOR operation on buffers input1 and input2, result in output.
+   It is safe to use an input buffer as the output buffer. */
+void _libssh2_xor_data(unsigned char *output,
+                       const unsigned char *input1,
+                       const unsigned char *input2,
+                       size_t length)
+{
+    size_t i;
+
+    for (i = 0; i < length; i++)
+        *output++ = *input1++ ^ *input2++;
+}
+
+/* Increments an AES CTR buffer to prepare it for use with the
+   next AES block. */
+void _libssh2_aes_ctr_increment(unsigned char *ctr,
+                                size_t length)
+{
+    if (length == 0)
+        return;
+    size_t i = (length - 1);
+    while (ctr[i]++ == 0xFF) {
+        if (i == 0)
+            break;
+        i--;
+    }
+}
diff --git a/src/misc.h b/src/misc.h
index 54ae546..44e2996 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -93,4 +93,11 @@
 #endif
 #endif
 
+void _libssh2_xor_data(unsigned char *output,
+                       const unsigned char *input1,
+                       const unsigned char *input2,
+                       size_t length);
+
+void _libssh2_aes_ctr_increment(unsigned char *ctr, size_t length);
+
 #endif /* _LIBSSH2_MISC_H */
diff --git a/src/openssl.c b/src/openssl.c
index b7b146c..f10f292 100644
--- a/src/openssl.c
+++ b/src/openssl.c
@@ -43,6 +43,7 @@
 #ifdef LIBSSH2_OPENSSL /* compile only if we build with openssl */
 
 #include <string.h>
+#include "misc.h"
 
 #ifndef EVP_MAX_BLOCK_LENGTH
 #define EVP_MAX_BLOCK_LENGTH 32
@@ -364,15 +365,8 @@
         return 0;
     }
 
-    for (i = 0; i < 16; i++)
-        *out++ = *in++ ^ b1[i];
-
-    i = 15;
-    while (c->ctr[i]++ == 0xFF) {
-        if (i == 0)
-            break;
-        i--;
-    }
+    _libssh2_xor_data(out, in, b1, AES_BLOCK_SIZE);
+    _libssh2_aes_ctr_increment(c->ctr, AES_BLOCK_SIZE);
 
     return 1;
 }