Diff for /libaitio/src/crypt.c between versions 1.3 and 1.9

version 1.3, 2011/04/20 22:56:32 version 1.9, 2013/03/13 14:54:39
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 47  SUCH DAMAGE. Line 47  SUCH DAMAGE.
   
   
 /*  /*
 * ioCipher() Cipher wrapper for all supported crypto algorythms * ioCipher() - Cipher wrapper for all supported crypto algorythms
  *
  * @pInput = input buffer   * @pInput = input buffer
  * @inLen = input buffer len   * @inLen = input buffer len
 * @ppOutput = output allocated buffe, must be free after use * @ppOutput = output allocated buffe, must be e_free after use
  * @Cipher = cipher engine, like EVP_bf_cbc() or etc...   * @Cipher = cipher engine, like EVP_bf_cbc() or etc...
  * @pKey = key   * @pKey = key
  * @pIV = IV, salt (8 bytes)   * @pIV = IV, salt (8 bytes)
Line 67  ioCipher(u_char *pInput, int inLen, u_char **ppOutput, Line 68  ioCipher(u_char *pInput, int inLen, u_char **ppOutput,
   
         if (!pInput || !inLen || !ppOutput || nMode & 0xFFFFFFFE)          if (!pInput || !inLen || !ppOutput || nMode & 0xFFFFFFFE)
                 return 0;                  return 0;
        buf = malloc(inLen + EVP_MAX_BLOCK_LENGTH);        buf = e_malloc(inLen + EVP_MAX_BLOCK_LENGTH);
         if (!buf) {          if (!buf) {
                 LOGERR;                  LOGERR;
                 goto end;                  goto end;
Line 83  ioCipher(u_char *pInput, int inLen, u_char **ppOutput, Line 84  ioCipher(u_char *pInput, int inLen, u_char **ppOutput,
                 if (!EVP_CipherUpdate(&ctx, buf + outlen, &buflen, pos, chunk)) {                  if (!EVP_CipherUpdate(&ctx, buf + outlen, &buflen, pos, chunk)) {
                         EVP_CIPHER_CTX_cleanup(&ctx);                          EVP_CIPHER_CTX_cleanup(&ctx);
                         outlen = 0;                          outlen = 0;
                        free(buf);                        e_free(buf);
                         buf = NULL;                          buf = NULL;
                         goto end;                          goto end;
                 } else {                  } else {
Line 96  ioCipher(u_char *pInput, int inLen, u_char **ppOutput, Line 97  ioCipher(u_char *pInput, int inLen, u_char **ppOutput,
         }          }
         if (!EVP_CipherFinal_ex(&ctx, buf + outlen, &buflen)) {          if (!EVP_CipherFinal_ex(&ctx, buf + outlen, &buflen)) {
                 outlen = 0;                  outlen = 0;
                free(buf);                e_free(buf);
                 buf = NULL;                  buf = NULL;
         } else          } else
                 outlen += buflen;                  outlen += buflen;
Line 108  end: Line 109  end:
 }  }
   
 /*  /*
 * io_Blowfish() Blowfish cipher algorythm, work with ASCII hex strings * io_Blowfish() - Blowfish cipher algorythm, work with ASCII hex strings
  *
  * @pInput = input buffer   * @pInput = input buffer
  * @inLen = input buffer len   * @inLen = input buffer len
 * @ppOutput = output allocated buffe, must be free after use * @ppOutput = output allocated buffe, must be e_free after use
  * @pKey = key   * @pKey = key
  * @pIV = IV, salt (8 bytes)   * @pIV = IV, salt (8 bytes)
  * @nMode = Mode 0 - decrypting or 1 - encrypting   * @nMode = Mode 0 - decrypting or 1 - encrypting
Line 130  io_Blowfish(u_char *pInput, int inLen, u_char **ppOutp Line 132  io_Blowfish(u_char *pInput, int inLen, u_char **ppOutp
   
         if (nMode) {          if (nMode) {
                 len = strlen((char*) pInput);                  len = strlen((char*) pInput);
                str = strdup((char*) pInput);                str = e_strdup((char*) pInput);
         } else {          } else {
                 len = strlen((char*) pInput) / 2;                  len = strlen((char*) pInput) / 2;
                str = malloc(len + 1);                str = e_malloc(len + 1);
                 if (!str) {                  if (!str) {
                         LOGERR;                          LOGERR;
                         return 0;                          return 0;
Line 147  io_Blowfish(u_char *pInput, int inLen, u_char **ppOutp Line 149  io_Blowfish(u_char *pInput, int inLen, u_char **ppOutp
         }          }
   
         ret = len = ioCipher((u_char*) str, len, &buf, EVP_bf_cbc(), pKey, pIV, nMode);          ret = len = ioCipher((u_char*) str, len, &buf, EVP_bf_cbc(), pKey, pIV, nMode);
        free(str);        e_free(str);
   
         if (nMode) {          if (nMode) {
                 ret *= 2;                  ret *= 2;
                *ppOutput = malloc(ret + 1);                *ppOutput = e_malloc(ret + 1);
                 if (!*ppOutput) {                  if (!*ppOutput) {
                         LOGERR;                          LOGERR;
                         return 0;                          return 0;
Line 165  io_Blowfish(u_char *pInput, int inLen, u_char **ppOutp Line 167  io_Blowfish(u_char *pInput, int inLen, u_char **ppOutp
                 }                  }
         } else          } else
                 if (ret && buf)                  if (ret && buf)
                        *ppOutput = (u_char*) strdup((char*) buf);                        *ppOutput = (u_char*) e_strdup((char*) buf);
   
         return ret;          return ret;
   }
   
   /*
    * io_ctr_AES() - Encrypt/Decrypt stream cipher CTR_AES
    *
    * @pInput = Input buffer with ASCII
    * @inLen = Input buffer data length
    * @ppOutput = Output buffer with cipher data, must be e_free after use
    * @pKey = Key
    * @IV = IVector/Nonce/Counter, Warning: IV must be variable, because we write there!!!
    * return: -1 error or >-1 how many cipher blocks proceeded
    */
   int
   io_ctr_AES(u_char *pInput, int inLen, u_char **ppOutput, u_char *pKey, u_char IV[AES_BLOCK_SIZE])
   {
           u_int num;
           AES_KEY key;
           u_char ecount_buf[AES_BLOCK_SIZE] = { 0 };
           int total = 0;
   
           if (!pInput || !inLen || !ppOutput)
                   return -1;
   
           *ppOutput = e_malloc(inLen);
           if (!*ppOutput) {
                   LOGERR;
                   return -1;
           } else
                   memset(*ppOutput, 0, inLen);
   
           AES_set_encrypt_key(pKey, 128, &key);
   
           while (inLen) {
                   num = 0;
                   memset(ecount_buf, 0, sizeof ecount_buf);
                   AES_ctr128_encrypt(pInput + total, (*ppOutput) + total, 
                                   (inLen / (AES_BLOCK_SIZE - 1)) ? (AES_BLOCK_SIZE - 1) : inLen, 
                                   &key, IV, ecount_buf, &num);
                   if (num < 1) {
                           e_free(*ppOutput);
                           *ppOutput = NULL;
                           total = -1;
                           break;
                   } else {
                           total += num;
                           inLen -= num;
                   }
           }
   
           return total;
 }  }

Removed from v.1.3  
changed lines
  Added in v.1.9


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>