Remove pointless free, and use preferred way of calling d2i_* functions
[openssl.git] / crypto / aes / aes_ctr.c
index aea3db209272189e4e8fcd6638a3e3ed51048e10..3ee382299881c1d19104ab3a1cf6f01e281374e0 100644 (file)
@@ -7,7 +7,7 @@
  * are met:
  *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
+ *    notice, this list of conditions and the following disclaimer.
  *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *
  */
 
-#include <assert.h>
 #include <openssl/aes.h>
-#include "aes_locl.h"
+#include <openssl/modes.h>
 
-/* NOTE: CTR mode is big-endian.  The rest of the AES code
- * is endian-neutral. */
-
-/* increment counter (128-bit int) by 2^64 */
-static void AES_ctr128_inc(unsigned char *counter) {
-       unsigned long c;
-
-       /* Grab 3rd dword of counter and increment */
-#ifdef L_ENDIAN
-       c = GETU32(counter + 8);
-       c++;
-       PUTU32(counter + 8, c);
-#else
-       c = GETU32(counter + 4);
-       c++;
-       PUTU32(counter + 4, c);
-#endif
-
-       /* if no overflow, we're done */
-       if (c)
-               return;
-
-       /* Grab top dword of counter and increment */
-#ifdef L_ENDIAN
-       c = GETU32(counter + 12);
-       c++;
-       PUTU32(counter + 12, c);
-#else
-       c = GETU32(counter +  0);
-       c++;
-       PUTU32(counter +  0, c);
-#endif
-
-}
-
-/* The input encrypted as though 128bit counter mode is being
- * used.  The extra state information to record how much of the
- * 128bit block we have used is contained in *num;
- */
 void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
-       const unsigned long length, const AES_KEY *key,
-       unsigned char *counter, unsigned int *num) {
-
-       unsigned int n;
-       unsigned long l=length;
-       unsigned char tmp[AES_BLOCK_SIZE];
-
-       assert(in && out && key && counter && num);
-
-       n = *num;
-
-       while (l--) {
-               if (n == 0) {
-                       AES_encrypt(counter, tmp, key);
-                       AES_ctr128_inc(counter);
-               }
-               *(out++) = *(in++) ^ tmp[n];
-               n = (n+1) % AES_BLOCK_SIZE;
-       }
-
-       *num=n;
+                        size_t length, const AES_KEY *key,
+                        unsigned char ivec[AES_BLOCK_SIZE],
+                        unsigned char ecount_buf[AES_BLOCK_SIZE],
+                        unsigned int *num)
+{
+    CRYPTO_ctr128_encrypt(in, out, length, key, ivec, ecount_buf, num,
+                          (block128_f) AES_encrypt);
 }