mirror of https://github.com/wolfSSL/wolfssl.git
camellia_setup128 and camellia_setup256 refactory to reduce stack usage:
--- subL and subR variables moved to the heap; --- return type changed to int, returning 0 for success; --- chain of dependency updated to propagate the error in CamelliaSetKey function.pull/1/head
parent
d7eff191ce
commit
41cc5f06e4
|
@ -405,9 +405,13 @@ void bench_camellia(void)
|
||||||
{
|
{
|
||||||
Camellia cam;
|
Camellia cam;
|
||||||
double start, total, persec;
|
double start, total, persec;
|
||||||
int i;
|
int i, ret;
|
||||||
|
|
||||||
CamelliaSetKey(&cam, key, 16, iv);
|
ret = CamelliaSetKey(&cam, key, 16, iv);
|
||||||
|
if (ret != 0) {
|
||||||
|
printf("CamelliaSetKey failed, ret = %d\n", ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
start = current_time(1);
|
start = current_time(1);
|
||||||
|
|
||||||
for(i = 0; i < numBlocks; i++)
|
for(i = 0; i < numBlocks; i++)
|
||||||
|
|
|
@ -486,13 +486,21 @@ static const u32 camellia_sp4404[256] = {
|
||||||
#define subl(x) subL[(x)]
|
#define subl(x) subL[(x)]
|
||||||
#define subr(x) subR[(x)]
|
#define subr(x) subR[(x)]
|
||||||
|
|
||||||
static void camellia_setup128(const unsigned char *key, u32 *subkey)
|
static int camellia_setup128(const unsigned char *key, u32 *subkey)
|
||||||
{
|
{
|
||||||
u32 kll, klr, krl, krr;
|
u32 kll, klr, krl, krr;
|
||||||
u32 il, ir, t0, t1, w0, w1;
|
u32 il, ir, t0, t1, w0, w1;
|
||||||
u32 kw4l, kw4r, dw, tl, tr;
|
u32 kw4l, kw4r, dw, tl, tr;
|
||||||
u32 subL[26];
|
u32* subL;
|
||||||
u32 subR[26];
|
u32* subR;
|
||||||
|
|
||||||
|
subL = (u32*) XMALLOC(sizeof(u32) * 26, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
if (subL == NULL)
|
||||||
|
return MEMORY_E;
|
||||||
|
|
||||||
|
subR = (u32*) XMALLOC(sizeof(u32) * 26, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
if (subR == NULL)
|
||||||
|
return MEMORY_E;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* k == kll || klr || krl || krr (|| is concatination)
|
* k == kll || klr || krl || krr (|| is concatination)
|
||||||
|
@ -694,17 +702,28 @@ static void camellia_setup128(const unsigned char *key, u32 *subkey)
|
||||||
dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw);
|
dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw);
|
||||||
CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw;
|
CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw;
|
||||||
|
|
||||||
return;
|
XFREE(subL, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
XFREE(subR, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void camellia_setup256(const unsigned char *key, u32 *subkey)
|
static int camellia_setup256(const unsigned char *key, u32 *subkey)
|
||||||
{
|
{
|
||||||
u32 kll,klr,krl,krr; /* left half of key */
|
u32 kll,klr,krl,krr; /* left half of key */
|
||||||
u32 krll,krlr,krrl,krrr; /* right half of key */
|
u32 krll,krlr,krrl,krrr; /* right half of key */
|
||||||
u32 il, ir, t0, t1, w0, w1; /* temporary variables */
|
u32 il, ir, t0, t1, w0, w1; /* temporary variables */
|
||||||
u32 kw4l, kw4r, dw, tl, tr;
|
u32 kw4l, kw4r, dw, tl, tr;
|
||||||
u32 subL[34];
|
u32* subL;
|
||||||
u32 subR[34];
|
u32* subR;
|
||||||
|
|
||||||
|
subL = (u32*) XMALLOC(sizeof(u32) * 34, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
if (subL == NULL)
|
||||||
|
return MEMORY_E;
|
||||||
|
|
||||||
|
subR = (u32*) XMALLOC(sizeof(u32) * 34, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
if (subR == NULL)
|
||||||
|
return MEMORY_E;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
|
* key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
|
||||||
|
@ -980,10 +999,13 @@ static void camellia_setup256(const unsigned char *key, u32 *subkey)
|
||||||
dw = CamelliaSubkeyL(31) ^ CamelliaSubkeyR(31), dw = CAMELLIA_RL8(dw);
|
dw = CamelliaSubkeyL(31) ^ CamelliaSubkeyR(31), dw = CAMELLIA_RL8(dw);
|
||||||
CamelliaSubkeyR(31) = CamelliaSubkeyL(31) ^ dw,CamelliaSubkeyL(31) = dw;
|
CamelliaSubkeyR(31) = CamelliaSubkeyL(31) ^ dw,CamelliaSubkeyL(31) = dw;
|
||||||
|
|
||||||
return;
|
XFREE(subL, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
XFREE(subR, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void camellia_setup192(const unsigned char *key, u32 *subkey)
|
static int camellia_setup192(const unsigned char *key, u32 *subkey)
|
||||||
{
|
{
|
||||||
unsigned char kk[32];
|
unsigned char kk[32];
|
||||||
u32 krll, krlr, krrl,krrr;
|
u32 krll, krlr, krrl,krrr;
|
||||||
|
@ -995,8 +1017,8 @@ static void camellia_setup192(const unsigned char *key, u32 *subkey)
|
||||||
krrr = ~krlr;
|
krrr = ~krlr;
|
||||||
memcpy(kk+24, (unsigned char *)&krrl, 4);
|
memcpy(kk+24, (unsigned char *)&krrl, 4);
|
||||||
memcpy(kk+28, (unsigned char *)&krrr, 4);
|
memcpy(kk+28, (unsigned char *)&krrr, 4);
|
||||||
camellia_setup256(kk, subkey);
|
|
||||||
return;
|
return camellia_setup256(kk, subkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1488,22 +1510,29 @@ static void Camellia_DecryptBlock(const int keyBitLength,
|
||||||
|
|
||||||
int CamelliaSetKey(Camellia* cam, const byte* key, word32 len, const byte* iv)
|
int CamelliaSetKey(Camellia* cam, const byte* key, word32 len, const byte* iv)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (cam == NULL) return BAD_FUNC_ARG;
|
if (cam == NULL) return BAD_FUNC_ARG;
|
||||||
|
|
||||||
XMEMSET(cam->key, 0, sizeof(KEY_TABLE_TYPE));
|
XMEMSET(cam->key, 0, sizeof(KEY_TABLE_TYPE));
|
||||||
|
|
||||||
switch (len) {
|
switch (len) {
|
||||||
case 16:
|
case 16:
|
||||||
camellia_setup128(key, cam->key);
|
ret = camellia_setup128(key, cam->key);
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
camellia_setup192(key, cam->key);
|
ret = camellia_setup192(key, cam->key);
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
camellia_setup256(key, cam->key);
|
ret = camellia_setup256(key, cam->key);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret != 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
cam->keySz = len * 8;
|
cam->keySz = len * 8;
|
||||||
|
|
||||||
return CamelliaSetIV(cam, iv);
|
return CamelliaSetIV(cam, iv);
|
||||||
|
|
|
@ -2476,8 +2476,9 @@ int camellia_test(void)
|
||||||
|
|
||||||
testsSz = sizeof(testVectors)/sizeof(test_vector_t);
|
testsSz = sizeof(testVectors)/sizeof(test_vector_t);
|
||||||
for (i = 0; i < testsSz; i++) {
|
for (i = 0; i < testsSz; i++) {
|
||||||
CamelliaSetKey(&cam, testVectors[i].key, testVectors[i].keySz,
|
if (CamelliaSetKey(&cam, testVectors[i].key, testVectors[i].keySz,
|
||||||
testVectors[i].iv);
|
testVectors[i].iv) != 0)
|
||||||
|
return testVectors[i].errorCode;
|
||||||
|
|
||||||
switch (testVectors[i].type) {
|
switch (testVectors[i].type) {
|
||||||
case CAM_ECB_ENC:
|
case CAM_ECB_ENC:
|
||||||
|
|
22
src/keys.c
22
src/keys.c
|
@ -1748,27 +1748,41 @@ static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs,
|
||||||
|
|
||||||
#ifdef HAVE_CAMELLIA
|
#ifdef HAVE_CAMELLIA
|
||||||
if (specs->bulk_cipher_algorithm == cyassl_camellia) {
|
if (specs->bulk_cipher_algorithm == cyassl_camellia) {
|
||||||
|
int camRet;
|
||||||
|
|
||||||
if (enc->cam == NULL)
|
if (enc->cam == NULL)
|
||||||
enc->cam =
|
enc->cam =
|
||||||
(Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER);
|
(Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER);
|
||||||
if (enc->cam == NULL)
|
if (enc->cam == NULL)
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
|
|
||||||
if (dec->cam == NULL)
|
if (dec->cam == NULL)
|
||||||
dec->cam =
|
dec->cam =
|
||||||
(Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER);
|
(Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER);
|
||||||
if (dec->cam == NULL)
|
if (dec->cam == NULL)
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
|
|
||||||
if (side == CYASSL_CLIENT_END) {
|
if (side == CYASSL_CLIENT_END) {
|
||||||
CamelliaSetKey(enc->cam, keys->client_write_key,
|
camRet = CamelliaSetKey(enc->cam, keys->client_write_key,
|
||||||
specs->key_size, keys->client_write_IV);
|
specs->key_size, keys->client_write_IV);
|
||||||
CamelliaSetKey(dec->cam, keys->server_write_key,
|
if (camRet != 0)
|
||||||
|
return camRet;
|
||||||
|
|
||||||
|
camRet = CamelliaSetKey(dec->cam, keys->server_write_key,
|
||||||
specs->key_size, keys->server_write_IV);
|
specs->key_size, keys->server_write_IV);
|
||||||
|
if (camRet != 0)
|
||||||
|
return camRet;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CamelliaSetKey(enc->cam, keys->server_write_key,
|
camRet = CamelliaSetKey(enc->cam, keys->server_write_key,
|
||||||
specs->key_size, keys->server_write_IV);
|
specs->key_size, keys->server_write_IV);
|
||||||
CamelliaSetKey(dec->cam, keys->client_write_key,
|
if (camRet != 0)
|
||||||
|
return camRet;
|
||||||
|
|
||||||
|
camRet = CamelliaSetKey(dec->cam, keys->client_write_key,
|
||||||
specs->key_size, keys->client_write_IV);
|
specs->key_size, keys->client_write_IV);
|
||||||
|
if (camRet != 0)
|
||||||
|
return camRet;
|
||||||
}
|
}
|
||||||
enc->setup = 1;
|
enc->setup = 1;
|
||||||
dec->setup = 1;
|
dec->setup = 1;
|
||||||
|
|
Loading…
Reference in New Issue