<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>On Aug 25, 2022, at 12:24 PM, Phillip Hallam-Baker <<a href="mailto:phill@hallambaker.com">phill@hallambaker.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr"><div class="gmail_default" style="font-size:small">[Before we start, use language X instead is not an answer here.]</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">We all know array bounds checking etc. is a good thing to have to write any application code. But the cost of abstracting away memory management is that cryptographic code has the very particular property that we want to ensure data is cleared AFTER USE rather than BEFORE REUSE.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">A lot of applications written in high level languages are vulnerable to attacks when someone uses portable assembly language, aka C to write a program that allocates large chunks of memory and then greps through it looking for 'good stuff'.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">So the question is how to ensure this does not happen by implementing disposal mechanisms THAT DO NOT GET OPTIMIZED AWAY.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">See here is the thing. I can check my code and check my code but I can only check the current version of the compiler/optimizer. And some of the things I know the C# optimizer is now doing are pretty hard core. Yes, when generating assemblies, it can optimize across assembly boundaries now.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">I am pretty sure most other high level languages suffer from the same thing unless there is a mechanism to explicitly state 'do not optimize'. Same goes for things like the Montgomery ladder which isn't as reliably constant time as some people might imagine. </div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Has anyone got pointers to ways to make sure this is done right?</div></div></blockquote><br></div><div>This is a Really Hard Problem that goes beyond the language level.  Nowadays these kinds of optimizations happen *in hardware*.  Even in assembly language there is often no way to guarantee that if you write a word to memory that anything actually happens beyond the L0 cache.  It is simply not possible to draw a reliable security perimeter around a *process* on modern hardware.  This is one reason secure enclaves have become a thing.</div><div><br></div><div>rg</div><div><br></div></body></html>