From 8c1a4a494488b536b72e09f29ea9ab6e3d607add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mois=C3=A9s=20Guimar=C3=A3es?= Date: Thu, 26 Jun 2014 18:22:36 -0300 Subject: [PATCH] asn: refactoring ToTraditionalEnc to reduce stack usage: 128 bytes - pointers size moved to the heap. --- variable salt moved to the heap (64 bytes saved) --- variable cbcIv moved to the heap (64 bytes saved) --- ctaocrypt/src/asn.c | 81 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/ctaocrypt/src/asn.c b/ctaocrypt/src/asn.c index c8efa1682..2bdf75786 100644 --- a/ctaocrypt/src/asn.c +++ b/ctaocrypt/src/asn.c @@ -1007,8 +1007,13 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz) word32 inOutIdx = 0, oid; int first, second, length, version, saltSz, id; int iterations = 0; +#ifdef CYASSL_SMALL_STACK + byte* salt = NULL; + byte* cbcIv = NULL; +#else byte salt[MAX_SALT_SIZE]; byte cbcIv[MAX_IV_SIZE]; +#endif if (GetSequence(input, &inOutIdx, &length, sz) < 0) return ASN_PARSE_E; @@ -1046,39 +1051,97 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz) if (saltSz > MAX_SALT_SIZE) return ASN_PARSE_E; +#ifdef CYASSL_SMALL_STACK + salt = (byte*)XMALLOC(MAX_SALT_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (salt == NULL) + return MEMORY_E; +#endif + XMEMCPY(salt, &input[inOutIdx], saltSz); inOutIdx += saltSz; - if (GetShortInt(input, &inOutIdx, &iterations) < 0) + if (GetShortInt(input, &inOutIdx, &iterations) < 0) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_PARSE_E; + } + +#ifdef CYASSL_SMALL_STACK + cbcIv = (byte*)XMALLOC(MAX_IV_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (cbcIv == NULL) { + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return MEMORY_E; + } +#endif if (version == PKCS5v2) { /* get encryption algo */ - if (GetAlgoId(input, &inOutIdx, &oid, sz) < 0) + if (GetAlgoId(input, &inOutIdx, &oid, sz) < 0) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_PARSE_E; + } - if (CheckAlgoV2(oid, &id) < 0) + if (CheckAlgoV2(oid, &id) < 0) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_PARSE_E; /* PKCS v2 algo id error */ + } - if (input[inOutIdx++] != ASN_OCTET_STRING) + if (input[inOutIdx++] != ASN_OCTET_STRING) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_PARSE_E; + } - if (GetLength(input, &inOutIdx, &length, sz) < 0) + if (GetLength(input, &inOutIdx, &length, sz) < 0) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_PARSE_E; + } XMEMCPY(cbcIv, &input[inOutIdx], length); inOutIdx += length; } - if (input[inOutIdx++] != ASN_OCTET_STRING) + if (input[inOutIdx++] != ASN_OCTET_STRING) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_PARSE_E; - - if (GetLength(input, &inOutIdx, &length, sz) < 0) + } + + if (GetLength(input, &inOutIdx, &length, sz) < 0) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_PARSE_E; + } if (DecryptKey(password, passwordSz, salt, saltSz, iterations, id, - input + inOutIdx, length, version, cbcIv) < 0) + input + inOutIdx, length, version, cbcIv) < 0) { +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif return ASN_INPUT_E; /* decrypt failure */ + } + +#ifdef CYASSL_SMALL_STACK + XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif XMEMMOVE(input, input + inOutIdx, length); return ToTraditional(input, length);