Non-executable stack in asm.
[openssl.git] / crypto / aes / aes_ctr.c
index 2487d83fb15cfd50e24c235306875da9e05c9ec3..7c9d165d8adbf35a6054e42032eb342164ca0a71 100644 (file)
  *
  */
 
-#ifndef AES_DEBUG
-# ifndef NDEBUG
-#  define NDEBUG
-# endif
-#endif
-#include <assert.h>
-
 #include <openssl/aes.h>
-#include "aes_locl.h"
-
-/* NOTE: the IV/counter CTR mode is big-endian.  The rest of the AES code
- * is endian-neutral. */
-
-/* increment counter (128-bit int) by 1 */
-static void AES_ctr128_inc(unsigned char *counter) {
-       unsigned long c;
-
-       /* Grab bottom dword of counter and increment */
-       c = GETU32(counter + 12);
-       c++;
-       PUTU32(counter + 12, c);
-
-       /* if no overflow, we're done */
-       if (c)
-               return;
-
-       /* Grab 1st dword of counter and increment */
-       c = GETU32(counter +  8);
-       c++;
-       PUTU32(counter +  8, c);
-
-       /* if no overflow, we're done */
-       if (c)
-               return;
-
-       /* Grab 2nd dword of counter and increment */
-       c = GETU32(counter +  4);
-       c++;
-       PUTU32(counter +  4, c);
-
-       /* if no overflow, we're done */
-       if (c)
-               return;
+#include <openssl/modes.h>
 
-       /* Grab top dword of counter and increment */
-       c = GETU32(counter +  0);
-       c++;
-       PUTU32(counter +  0, c);
-}
-
-/* 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, and the
- * encrypted counter is kept in ecount_buf.  Both *num and
- * ecount_buf must be initialised with zeros before the first
- * call to AES_ctr128_encrypt().
- *
- * This algorithm assumes that the counter is in the x lower bits
- * of the IV (ivec), and that the application has full control over
- * overflow and the rest of the IV.  This implementation takes NO
- * responsability for checking that the counter doesn't overflow
- * into the rest of the IV when incremented.
- */
 void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
-       const unsigned long length, const AES_KEY *key,
-       unsigned char ivec[AES_BLOCK_SIZE],
-       unsigned char ecount_buf[AES_BLOCK_SIZE],
-       unsigned int *num) {
-
-       unsigned int n;
-       unsigned long l=length;
-
-       assert(in && out && key && counter && num);
-       assert(*num < AES_BLOCK_SIZE);
-
-       n = *num;
-
-       while (l--) {
-               if (n == 0) {
-                       AES_encrypt(ivec, ecount_buf, key);
-                       AES_ctr128_inc(ivec);
-               }
-               *(out++) = *(in++) ^ ecount_buf[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);
 }