Re: avr-crypto-lib
"W.P." <[email protected]> Sun, 30 May 2021 03:09:43 +0200
| Newsgroups | gmane.comp.hardware.avr.gcc |
|---|---|
| Message-ID | <[email protected]> |
W dniu 29.05.2021 o 20:37, David Brown pisze: > On 29/05/2021 18:45, BERTRAND Joël wrote: >> David Brown a écrit : >>> On 29/05/2021 14:37, BERTRAND Joël wrote: >>>> Nigel Winterbottom a écrit : >>>>> I took a quick look and attempted to compile your Crypto library in >>>>> Visual Studio. >>>>> >>>>> I got nowhere: Probably for good reasons; Microsoft C doesn't allow >>>>> dynamic array size like this: >>>>> >>>>> bigint_word_t d_b[a->length_W + b->length_W]; >>>>> >>>>> This is about as far as I'm going to get on this, there is just far too >>>>> much work to get it to compile to run on the Desktop. >>>>> Wouldn't it be funny if thiat line was the reason for your crash. >>>> Do you think I have to replace these allocations by malloc()/free() or >>>> alloca() ? I haven't written theses routines, but I can try to fix them. >>>> But I would be sure my issue comes from this kind of allocation. >>>> >>> A VLA like the one above is fine when using a decent C compiler - which >>> MSVC is not. (It's an okay C++ compiler, but has traditionally failed >>> to support C99. I gather it's a bit better with the most recent >>> versions, but it still has its own silly ideas about some features and >>> library functions.) >>> >>> You do have to be aware that a VLA like this gets allocated on the data >>> stack. If you are using an RTOS and have limited stack size, that can >>> quickly be an issue. (alloca also allocates on the stack.) >>> >>> If you can, you should try to allocate this array statically, using a >>> maximum size for the array. That gives you a much clearer idea of the >>> sizes you need, and whether or not you have space for everything on the >>> device. It avoids run-time complications or allocation failures, and >>> the risk of memory fragmentation (malloc/free should be avoided in >>> embedded systems whenever possible). And it will be noticeably more >>> efficient on an AVR. >> OK. If I understand, in my case, this code should run as expected as >> gcc is C99 compliant. > AFAIK VLA's will work fine (though less efficiently than a statically > allocated array). > >> If I check pointers, I see that high value returned by malloc() (I use >> malloc() to allocate private and public keys for some reasons) is 0xde6. >> Thus heap ends at 0xde6+0xff+0x2. Current stack is about 0x3f62. >> > Try to avoid any kind of malloc() in all code on an AVR. > >> Only two solutions : avr-crypto-lib is broken or I have done a mistake >> in my code... And I think I have a bug in this code. >> >> RSA encoding computes (code word**65537)%modulus if I remember. Length >> of codeword is 256 bytes. I suppose (code word**65537) cannot be saved >> in available RAM. I will check next monday with exponent=3. >> > The operation "(x ** y) % z" is done as a combined calculation, not by > calculating "(x ** y)" and then reducing it modulo "z". Basically, you > do "x = code_word;" then "x = (x ** 2) % modulus;" 16 times, and finally > "x = (x * code_word) % modulus;". Even then, it still takes a fair > amount of working ram for an AVR, and quite a bit of processing time. > > Such encryption can work on an AVR that is big enough, but it is not a > good fit for a microcontroller of that kind. > > To OP: there was (is?) a project for AVR named "OpenCryptoToken", using Elliptic Curve cryptography. Size and execution time "acceptable" on AVR. Maybe this would fit better than RSA? Laurent