version 1.3, 2011/04/20 22:56:32
|
version 1.8, 2012/08/02 00:47:47
|
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, 2011 | Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
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 io_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 = io_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); | io_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); | io_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 io_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 = io_strdup((char*) pInput); |
} else { |
} else { |
len = strlen((char*) pInput) / 2; |
len = strlen((char*) pInput) / 2; |
str = malloc(len + 1); | str = io_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); | io_free(str); |
|
|
if (nMode) { |
if (nMode) { |
ret *= 2; |
ret *= 2; |
*ppOutput = malloc(ret + 1); | *ppOutput = io_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*) io_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 io_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 = io_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) { |
|
io_free(*ppOutput); |
|
*ppOutput = NULL; |
|
total = -1; |
|
break; |
|
} else { |
|
total += num; |
|
inLen -= num; |
|
} |
|
} |
|
|
|
return total; |
} |
} |