1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 01:18:00 +00:00
Go to file
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
charset sbcsgen.pl: handle \r\n line endings. 2022-09-01 20:43:23 +01:00
cmake Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
contrib Use the new 'HYBRID' names for the hybrid KEX packets. 2024-12-08 10:42:34 +00:00
crypto Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
doc Update cmake_minimum_required to avoid warnings on sid. 2024-12-15 11:13:40 +00:00
icons New script to draw the icons as SVG. 2022-03-18 12:55:01 +00:00
keygen Add some missing #includes. 2022-09-03 11:59:12 +01:00
otherbackends SUPDUP: make the TDCRL command clear to end of line. 2024-12-12 08:57:27 +00:00
proxy Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
ssh Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
stubs Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
terminal lineedit: make both ^M and ^J terminate a line. 2024-12-15 19:23:21 +00:00
test Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
unicode Update all Unicode tables to Unicode 16.0.0. 2024-09-22 19:08:24 +01:00
unix Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
utils Fix compile warnings in tree234 tests. 2024-12-19 08:35:33 +00:00
windows Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
.gitignore Add .gitignore rules for in-tree builds. 2021-04-19 18:26:56 +01:00
aqsync.c Build outgoing SSH agent requests in a strbuf. 2018-05-25 14:36:16 +01:00
be_list.c Merge be_*.c into one ifdef-controlled module. 2021-11-26 17:58:55 +00:00
Buildscr Update version number for 0.82 release. 2024-11-25 19:49:17 +00:00
Buildscr.cv Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
callback.c Add lots of missing 'static' keywords. 2020-01-29 06:44:18 +00:00
cgtest.c Richer data type for interactive prompt results. 2021-12-28 18:08:31 +00:00
CHECKLST.txt CHECKLST: update for some extra test builds. 2024-11-28 18:36:20 +00:00
clicons.c Change vtable defs to use C99 designated initialisers. 2020-03-10 21:06:29 +00:00
CMakeLists.txt Update cmake_minimum_required to avoid warnings on sid. 2024-12-15 11:13:40 +00:00
cmdgen.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
cmdline.c Make the -legacy-foo options not SAVEABLE. 2024-11-21 12:49:07 +00:00
conf-enums.h Add ability to specify custom load and save separately. 2023-09-22 16:23:37 +01:00
conf.h Switch CONF_remote_cmd to being STR_AMBI. 2024-09-26 11:30:07 +01:00
config.c Windows: rewrite request_file() to support Unicode. 2024-12-13 19:38:48 +00:00
console.c Merge tag '0.80'. 2023-12-18 14:47:48 +00:00
console.h Mention the host name in host-key prompts. 2021-09-16 14:33:59 +01:00
defs.h Add more variants of SHAKE. 2024-12-08 09:50:08 +00:00
dialog.c Windows: rewrite request_file() to support Unicode. 2024-12-13 19:38:48 +00:00
dialog.h Windows: rewrite request_file() to support Unicode. 2024-12-13 19:38:48 +00:00
errsock.c Centralise stub plug/socket functions. 2024-06-29 12:19:35 +01:00
import.c Rename 'ret' variables passed from allocation to return. 2022-09-14 16:10:29 +01:00
LATEST.VER Update version number for 0.82 release. 2024-11-25 19:49:17 +00:00
ldisc.c ldisc: fix unwanted double-action of ^U. 2023-04-19 14:28:36 +01:00
LICENCE It's a new year. 2024-02-22 14:31:26 +00:00
licence.pl Separate the functions of licence.pl. 2021-04-17 13:52:27 +01:00
logging.c Merge log file name tweaks from 'pre-0.79'. 2023-07-16 16:38:56 +01:00
marshal.h Rework Unicode conversion APIs to use a BinarySink. 2024-09-26 11:30:07 +01:00
misc.h Add helper function dupwcscat(). 2024-12-13 19:24:41 +00:00
mksrcarc.sh Updates to mksrcarc.sh. 2022-09-01 20:43:23 +01:00
mkunxarc.sh Integrate the 'doc' subdir into the CMake system. 2021-05-03 17:01:55 +01:00
mpint.h Utility function mp_resize. 2022-04-15 17:46:06 +01:00
network.h Centralise stub plug/socket functions. 2024-06-29 12:19:35 +01:00
pageant.c Rename SocketPeerInfo to SocketEndpointInfo. 2024-06-29 11:49:32 +01:00
pageant.h winpgnt: menu options to delete/reencrypt everything. 2021-04-04 10:02:24 +01:00
pinger.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
pscp.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
psftp.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
psftp.h New abstraction for command-line arguments. 2024-09-26 11:30:07 +01:00
psftpcommon.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00
psocks.c New abstraction for command-line arguments. 2024-09-26 11:30:07 +01:00
psocks.h New abstraction for command-line arguments. 2024-09-26 11:30:07 +01:00
putty.h Windows: rewrite request_file() to support Unicode. 2024-12-13 19:38:48 +00:00
puttymem.h Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
README README: clarify that you need to run vcvars32 first. 2024-06-29 12:19:35 +01:00
release.pl release.pl: Adjust pscp/plink transcript updater. 2024-11-30 09:27:30 +00:00
settings.c New post-quantum kex: ML-KEM, and three hybrids of it. 2024-12-08 10:41:08 +00:00
sign.sh sign.sh: stop telling gpg to load the 'idea' extension. 2024-09-10 06:35:42 +01:00
specials.h Move SessionSpecial definitions into their own header. 2023-03-04 13:05:20 +00:00
ssh.h Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
sshcr.h Formatting: fix a few mis-spaced assignments. 2022-12-28 15:28:36 +00:00
sshkeygen.h Side-channel-safe rewrite of the Miller-Rabin test. 2021-08-27 18:04:49 +01:00
sshpubk.c Fix infinite loop on a truncated RFC4176 public key file. 2024-08-10 14:00:41 +01:00
sshrand.c Arm: turn on PSTATE.DIT if available and needed. 2024-12-19 08:52:47 +00:00
storage.h New Seat method, seat_nonfatal(). 2022-09-13 11:26:57 +01:00
timing.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
tree234.h Formatting: remove spurious spaces in 'type * var'. 2022-08-03 20:48:46 +01:00
version.h Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
x11disp.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00

PuTTY source code README
========================

This is the README for the source code of PuTTY, a free Windows and
Unix Telnet and SSH client.

PuTTY is built using CMake <https://cmake.org/>. To compile in the
simplest way (on any of Linux, Windows or Mac), the general method is
to run these commands in the source directory:

  cmake .
  cmake --build .

These commands will expect to find a usable compile toolchain on your
path. So if you're building on Windows with MSVC, you'll need to make
sure that the MSVC compiler (cl.exe) is on your path, by running one
of the 'vcvars32.bat' setup scripts provided with the tools. Then the
cmake commands above should work.

To install in the simplest way on Linux or Mac:

  cmake --build . --target install

On Unix, pterm would like to be setuid or setgid, as appropriate, to
permit it to write records of user logins to /var/run/utmp and
/var/log/wtmp. (Of course it will not use this privilege for
anything else, and in particular it will drop all privileges before
starting up complex subsystems like GTK.) The cmake install step
doesn't attempt to add these privileges, so if you want user login
recording to work, you should manually ch{own,grp} and chmod the
pterm binary yourself after installation. If you don't do this,
pterm will still work, but not update the user login databases.

Documentation (in various formats including Windows Help and Unix
`man' pages) is built from the Halibut (`.but') files in the `doc'
subdirectory. If you aren't using one of our source snapshots,
you'll need to do this yourself. Halibut can be found at
<https://www.chiark.greenend.org.uk/~sgtatham/halibut/>.

The PuTTY home web site is

    https://www.chiark.greenend.org.uk/~sgtatham/putty/

If you want to send bug reports or feature requests, please read the
Feedback section of the web site before doing so. Sending one-line
reports saying `it doesn't work' will waste your time as much as
ours.

See the file LICENCE for the licence conditions.