1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00
putty-source/windows
Simon Tatham 98200d1bfe Arm: turn on PSTATE.DIT if available and needed.
DIT, for 'Data-Independent Timing', is a bit you can set in the
processor state on sufficiently new Arm CPUs, which promises that a
long list of instructions will deliberately avoid varying their timing
based on the input register values. Just what you want for keeping
your constant-time crypto primitives constant-time.

As far as I'm aware, no CPU has _yet_ implemented any data-dependent
optimisations, so DIT is a safety precaution against them doing so in
future. It would be embarrassing to be caught without it if a future
CPU does do that, so we now turn on DIT in the PuTTY process state.

I've put a call to the new enable_dit() function at the start of every
main() and WinMain() belonging to a program that might do
cryptography (even testcrypt, in case someone uses it for something!),
and in case I missed one there, also added a second call at the first
moment that any cryptography-using part of the code looks as if it
might become active: when an instance of the SSH protocol object is
configured, when the system PRNG is initialised, and when selecting
any cryptographic authentication protocol in an HTTP or SOCKS proxy
connection. With any luck those precautions between them should ensure
it's on whenever we need it.

Arm's own recommendation is that you should carefully choose the
granularity at which you enable and disable DIT: there's a potential
time cost to turning it on and off (I'm not sure what, but plausibly
something of the order of a pipeline flush), so it's a performance hit
to do it _inside_ each individual crypto function, but if CPUs start
supporting significant data-dependent optimisation in future, then it
will also become a noticeable performance hit to just leave it on
across the whole process. So you'd like to do it somewhere in the
middle: for example, you might turn on DIT once around the whole
process of verifying and decrypting an SSH packet, instead of once for
decryption and once for MAC.

With all respect to that recommendation as a strategy for maximum
performance, I'm not following it here. I turn on DIT at the start of
the PuTTY process, and then leave it on. Rationale:

 1. PuTTY is not otherwise a performance-critical application: it's
    not likely to max out your CPU for any purpose _other_ than
    cryptography. The most CPU-intensive non-cryptographic thing I can
    imagine a PuTTY process doing is the complicated computation of
    font rendering in the terminal, and that will normally be cached
    (you don't recompute each glyph from its outline and hints for
    every time you display it).

 2. I think a bigger risk lies in accidental side channels from having
    DIT turned off when it should have been on. I can imagine lots of
    causes for that. Missing a crypto operation in some unswept corner
    of the code; confusing control flow (like my coroutine macros)
    jumping with DIT clear into the middle of a region of code that
    expected DIT to have been set at the beginning; having a reference
    counter of DIT requests and getting it out of sync.

In a more sophisticated programming language, it might be possible to
avoid the risk in #2 by cleverness with the type system. For example,
in Rust, you could have a zero-sized type that acts as a proof token
for DIT being enabled (it would be constructed by a function that also
sets DIT, have a Drop implementation that clears DIT, and be !Send so
you couldn't use it in a thread other than the one where DIT was set),
and then you could require all the actual crypto functions to take a
DitToken as an extra parameter, at zero runtime cost. Then "oops I
forgot to set DIT around this piece of crypto" would become a compile
error. Even so, you'd have to take some care with coroutine-structured
code (what happens if a Rust async function yields while holding a DIT
token?) and with nesting (if you have two DIT tokens, you don't want
dropping the inner one to clear DIT while the outer one is still there
to wrongly convince callees that it's set). Maybe in Rust you could
get this all to work reliably. But not in C!

DIT is an optional feature of the Arm architecture, so we must first
test to see if it's supported. This is done the same way as we already
do for the various Arm crypto accelerators: on ELF-based systems,
check the appropriate bit in the 'hwcap' words in the ELF aux vector;
on Mac, look for an appropriate sysctl flag.

On Windows I don't know of a way to query the DIT feature, _or_ of a
way to write the necessary enabling instruction in an MSVC-compatible
way. I've _heard_ that it might not be necessary, because Windows
might just turn on DIT unconditionally and leave it on, in an even
more extreme version of my own strategy. I don't have a source for
that - I heard it by word of mouth - but I _hope_ it's true, because
that would suit me very well! Certainly I can't write code to enable
DIT without knowing (a) how to do it, (b) how to know if it's safe.
Nonetheless, I've put the enable_dit() call in all the right places in
the Windows main programs as well as the Unix and cross-platform code,
so that if I later find out that I _can_ put in an explicit enable of
DIT in some way, I'll only have to arrange to set HAVE_ARM_DIT and
compile the enable_dit() function appropriately.
2024-12-19 08:52:47 +00:00
..
test Add and use cmdline_arg_to_filename(). 2024-09-26 11:30:07 +01:00
utils Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
agent-client.c Formatting: standardise on "func(\n", not "func\n(". 2022-08-03 20:48:46 +01:00
cliloop.c Reorganise Windows HANDLE management. 2021-05-24 15:27:38 +01:00
CMakeLists.txt Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
config.c Windows: rewrite request_file() to support Unicode. 2024-12-13 19:38:48 +00:00
conpty.c Switch CONF_remote_cmd to being STR_AMBI. 2024-09-26 11:30:07 +01:00
console.c Windows: make is_interactive() match Unix. 2024-11-24 14:49:22 +00:00
controls.c Windows: rewrite request_file() to support Unicode. 2024-12-13 19:38:48 +00:00
cryptoapi.h Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
dialog.c Add and use cmdline_arg_to_filename(). 2024-09-26 11:30:07 +01:00
gss.c dup_mb_to_wc, dup_wc_to_mb: remove the 'flags' parameter. 2024-09-24 09:42:58 +01:00
handle-io.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
handle-socket.c Pass the calling Socket to plug_log. 2024-06-29 12:00:12 +01:00
handle-wait.c Fix an unused variable. 2021-05-27 09:48:32 +01:00
help.c Fix potential corruption when writing help file. 2023-04-19 14:28:36 +01:00
help.h Add a Features checkbox to disable bracketed paste mode. 2024-08-10 12:11:28 +01:00
help.rc2 Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
installer.wxs Windows installer: restore InstallScope setting. 2023-04-19 14:28:36 +01:00
jump-list.c Formatting: miscellaneous. 2022-08-03 20:48:46 +01:00
local-proxy.c New facility, platform_start_subprocess. 2022-09-01 20:43:23 +01:00
make_install_images.sh Remove white dialog background in MSI user interface. 2020-06-21 16:39:47 +01:00
msifixup.py msifixup.py: replace pipes.quote with shlex.quote. 2024-10-07 20:41:35 +01:00
named-pipe-client.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
named-pipe-server.c Centralise stub plug/socket functions. 2024-06-29 12:19:35 +01:00
network.c Pass the calling Socket to plug_log. 2024-06-29 12:00:12 +01:00
no-jump-list.c Add some missing #includes. 2022-09-03 11:59:12 +01:00
nohelp.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
noise.c Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
pageant-rc.h winpgnt: say 'click to focus' in async passphrase prompt. 2021-04-22 20:00:46 +01:00
pageant.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
pageant.ico
pageant.mft Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
pageant.rc Certificate-aware handling of key fingerprints. 2022-08-05 18:08:59 +01:00
pageants.ico
platform.h Windows: rewrite request_file() to support Unicode. 2024-12-13 19:38:48 +00:00
plink.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
plink.rc
printing.c Rename 'ret' variables passed from allocation to return. 2022-09-14 16:10:29 +01:00
pscp.ico
pscp.rc
psftp.rc
psocks.c New abstraction for command-line arguments. 2024-09-26 11:30:07 +01:00
pterm.c Switch CONF_remote_cmd to being STR_AMBI. 2024-09-26 11:30:07 +01:00
pterm.ico Make Windows versions of the pterm icons. 2021-05-08 17:33:25 +01:00
pterm.rc New application: a Windows version of 'pterm'! 2021-05-08 17:51:27 +01:00
ptermcfg.ico Make Windows versions of the pterm icons. 2021-05-08 17:33:25 +01:00
putty-common.rc2 Windows host-key warning: reinstate shortcut. 2022-10-21 20:41:36 +01:00
putty-rc.h Centralise most details of host-key prompting. 2022-07-07 18:05:32 +01:00
putty.c Don't exit(1) after printing PGP key fingerprints. 2024-09-26 11:30:07 +01:00
putty.ico
putty.mft Windows 10: add per monitor DPI awareness support. 2021-04-02 19:04:19 +01:00
putty.rc Move icon declarations out of putty-common.rc2. 2021-05-08 17:33:25 +01:00
puttycfg.ico
puttygen-rc.h PuTTYgen: option to control Argon2 flavour. 2021-02-23 18:26:50 +00:00
puttygen.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
puttygen.ico
puttygen.mft Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
puttygen.rc Windows PuTTYgen: also display certificate info. 2022-07-30 17:16:55 +01:00
puttyins.ico
puttytel.mft Windows 10: add per monitor DPI awareness support. 2021-04-02 19:04:19 +01:00
puttytel.rc Move icon declarations out of putty-common.rc2. 2021-05-08 17:33:25 +01:00
rcstuff.h Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
README-msi.txt Remove note about .CHM on network drives. 2019-03-18 21:53:45 +00:00
security-api.h Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
select-cli.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
select-gui.c Handle WM_NETEVENT in Windows Pageant. 2022-02-04 19:32:47 +00:00
serial.c Add memsets after allocation of all Backend implementors. 2021-10-30 17:28:28 +01:00
sftp.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
sharing.c Windows: factor out mutex lock/unlock from sharing.c. 2022-01-03 12:12:05 +00:00
sizetip.c Formatting change to braces around one case of a switch. 2020-02-16 11:26:21 +00:00
storage.c windows/utils/registry.c: allow opening reg keys RO. 2023-12-16 13:06:49 +00:00
unicode.c Rework Unicode conversion APIs to use a BinarySink. 2024-09-26 11:30:07 +01:00
version.rc2 FIXME about Windows resource CHMfulness hint. 2019-03-18 22:02:13 +00:00
website.url Switch chiark URLs to https. 2017-05-07 16:29:01 +01:00
win-gui-seat.h windows/window.c: move more variables into WinGuiSeat. 2023-05-27 17:45:15 +01:00
window.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
x11.c Make x11_get_auth_from_authfile take a Filename. 2023-05-29 15:41:50 +01:00