Retire non-repeatability check for unsuitable SSH keys in the tests
Marco Ricci

Marco Ricci commited on 2024-09-21 12:17:48
Zeige 1 geänderte Dateien mit 0 Einfügungen und 7 Löschungen.


DSA and ECDSA keys use a nonce during signing, and it is well-known that
reusing the nonce for another signature allows the private key to be
derived directly from those two signatures.  Because of this, many
implementations choose the nonce via a high-quality random number
generator.  This leads to DSA and ECDSA signatures being non-repeatable,
i.e. signing the same document twice leads to two different
signatures/binary strings.  OpenSSH's agent behaves this way.

However, various implementations of DSA or DSA variants have attempted
to find a way to avoid the random number generator by choosing the nonce
deterministically (but still unpredictably, for an attacker): EdDSA
mandates a specific nonce as part of the specification, and RFC 6979
outlines a different deterministic nonce scheme for all (other) DSA
variants.  All versions of PuTTY/Pageant use deterministic nonce
generation (a homegrown system in 0.80 and lower, RFC 6979 afterwards),
so DSA and ECDSA signatures by Pageant *are* repeatable.  And there is
no reason why OpenSSH couldn't adopt RFC 6979 in the future.

Therefore, remove the check for repeatability in the tests.  The `Vault`
class check for key suitability remains unchanged, because while
DSA/ECDSA keys *can* use repeatable signatures, such use is not
*guaranteed*.
... ...
@@ -249,13 +249,6 @@ class TestAgentInteraction:
249 249
             _ = data_dict['expected_signature']
250 250
             if public_key_data not in key_comment_pairs:  # pragma: no cover
251 251
                 pytest.skip('prerequisite SSH key not loaded')
252
-            signature = bytes(
253
-                client.sign(payload=vault.Vault._UUID, key=public_key_data)
254
-            )
255
-            signature2 = bytes(
256
-                client.sign(payload=vault.Vault._UUID, key=public_key_data)
257
-            )
258
-            assert signature != signature2, 'SSH signature repeatable?!'
259 252
             with pytest.raises(ValueError, match='unsuitable SSH key'):
260 253
                 vault.Vault.phrase_from_key(public_key_data)
261 254
 
262 255