On 2/17/25 23:30, NIIBE Yutaka wrote:
Hello,

Thank you for your comments.

You are welcome.

Jacob Bachmeyer<jcb62...@gmail.com> wrote:
[...]

There might also be architecture-specific instructions that can be used
to retrieve a table row without polluting the data cache; allowing
architecture-specific overrides here could make a very significant
performance difference, as the basic implementation could easily flush
the entire data cache if used on a large table.

For the base case, reading the entire table is probably the best that
you can do, but if you have a "load without temporal locality"
instruction (I believe that there are such instructions in SSE, for
example), you can avoid the problem, while accessing only a single table
row.  (The memory bus is assumed to not be visible to an attacker.)
Ah, I didn't consider that.

IIUC, you mean something like _mm*_stream_load_si* functions in the
Intel Intrinsics Guide (to access an entry in a table).

     
https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#cats=Load

Those, and analogous instructions on other architectures.

That is interesting to try, and it could be effective when table is
larger and read-only.  (But when table is larger than a page,
it might be a target of TLB flush attack to determine which page.)

Note that in this particular case of the modular exponentiation, the
table size is typically 4 Ki-byte and the entry size is 256-byte.  The
table is computed in _gcry_mpih_powm_lli before the loop which uses the
table.

So, for the initial case, simply ensure that the table is page-aligned and TLB leaks are solved, since the table is exactly one page.

Exactly one page is also very unlikely to have significant impact on the effectiveness of the data cache, since every modern processor that I have seen has L1 caches much larger than 4KiB.

I believe that there are also prefetch instructions that would force TLB entries to be allocated, or "non-temporal" accesses might also have their own TLB.

For now, let me apply and push _gcry_mpih_lookup_lli, and
possible improvement will be done in future.

You should probably add comments noting this caveat that the LLI table select will read the entire table into the data cache, which is fine for very small tables but could be very slow if used with a larger table.

This (holding the entire table in the data cache) might actually be beneficial, since it avoids the possibility of cache misses introducing timing leaks.

Just be sure to document the caveat that the table size must be carefully limited.


-- Jacob
_______________________________________________
Gcrypt-devel mailing list
Gcrypt-devel@gnupg.org
https://lists.gnupg.org/mailman/listinfo/gcrypt-devel

Reply via email to