From c74440b27e64dd513bcbf772307db310bcea6b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mois=C3=A9s=20Guimar=C3=A3es?= Date: Sat, 2 Aug 2014 17:25:39 -0300 Subject: [PATCH] tls: refactoring DeriveTlsKeys to reduce stack usage: --- variable seed moved to the heap (up to 64 bytes saved) --- variable key_data moved to the heap (up to 224 bytes saved) --- src/tls.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/tls.c b/src/tls.c index ae563e3f9..144d2febc 100644 --- a/src/tls.c +++ b/src/tls.c @@ -410,19 +410,42 @@ int DeriveTlsKeys(CYASSL* ssl) int length = 2 * ssl->specs.hash_size + 2 * ssl->specs.key_size + 2 * ssl->specs.iv_size; +#ifdef CYASSL_SMALL_STACK + byte* seed; + byte* key_data; +#else byte seed[SEED_LEN]; byte key_data[MAX_PRF_DIG]; +#endif - XMEMCPY(seed, ssl->arrays->serverRandom, RAN_LEN); - XMEMCPY(&seed[RAN_LEN], ssl->arrays->clientRandom, RAN_LEN); +#ifdef CYASSL_SMALL_STACK + seed = (byte*)XMALLOC(SEED_LEN, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (seed == NULL) + return MEMORY_E; + + key_data = (byte*)XMALLOC(MAX_PRF_DIG, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (key_data == NULL) { + XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return MEMORY_E; + } +#endif + + XMEMCPY(seed, ssl->arrays->serverRandom, RAN_LEN); + XMEMCPY(seed + RAN_LEN, ssl->arrays->clientRandom, RAN_LEN); ret = PRF(key_data, length, ssl->arrays->masterSecret, SECRET_LEN, key_label, KEY_LABEL_SZ, seed, SEED_LEN, IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm); - if (ret != 0) - return ret; - return StoreKeys(ssl, key_data); + if (ret == 0) + ret = StoreKeys(ssl, key_data); + +#ifdef CYASSL_SMALL_STACK + XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key_data, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; }