| Tech Note 0003 |
| Minimizing Memory Usage |
| Tom St Denis |
| |
| Introduction |
| ------------ |
| |
| For the most part the library can get by with around 20KB of stack and about 32KB of heap even if you use the |
| public key functions. If all you plan on using are the hashes and ciphers than only about 1KB of stack is required |
| and no heap. |
| |
| To save space all of the symmetric key scheduled keys are stored in a union called "symmetric_key". This means the |
| size of a symmetric_key is the size of the largest scheduled key. By removing the ciphers you don't use from |
| the build you can minimize the size of this structure. For instance, by removing both Twofish and Blowfish the |
| size reduces to 768 bytes from the 4,256 bytes it would have been (on a 32-bit platform). Or if you remove |
| Blowfish and use Twofish with TWOFISH_SMALL defined its still 768 bytes. Even at its largest the structure is only |
| 4KB which is normally not a problem for any platform. |
| |
| |
| Cipher Name | Size of scheduled key (bytes) | |
| ------------+-------------------------------| |
| Twofish | 4,256 | |
| Blowfish | 4,168 | |
| 3DES | 768 | |
| SAFER+ | 532 | |
| Serpent | 528 | |
| Rijndael | 516 | |
| XTEA | 256 | |
| RC2 | 256 | |
| DES | 256 | |
| SAFER [#] | 217 | |
| RC5 | 204 | |
| Twofish [*] | 193 | |
| RC6 | 176 | |
| CAST5 | 132 | |
| Noekeon | 32 | |
| Skipjack | 10 | |
| ------------+-------------------------------/ |
| Memory used per cipher on a 32-bit platform. |
| |
| [*] For Twofish with TWOFISH_SMALL defined |
| [#] For all 64-bit SAFER ciphers. |
| |
| Noekeon is a fairly fast cipher and uses very little memory. Ideally in low-ram platforms all other ciphers should be |
| left undefined and Noekeon should remain. While Noekeon is generally considered a secure block cipher (it is insecure |
| as a hash) CAST5 is perhaps a "runner-up" choice. CAST5 has been around longer (it is also known as CAST-128) and is |
| fairly fast as well. |
| |
| You can easily accomplish this via the "config.pl" script. Simply answer "n" to all of the ciphers except the one you want |
| and then rebuild the library. [or you can hand edit mycrypt_custom.h] |
| |
| |