Non-executable stack in asm.
[openssl.git] / crypto / aes / aes_ctr.c
index 6a89f4d..7c9d165 100644 (file)
  *
  */
 
-#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[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);
-
-       n = *num;
-
-       while (l--) {
-               if (n == 0) {
-                       AES_encrypt(counter, ecount_buf, key);
-                       AES_ctr128_inc(counter);
-               }
-               *(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);
 }