Use deterministic signatures for ECDSA keys.

This is now considered the preffered approach across the board for ECDSA. This
is because with the traditional, random "k" parameter for ECDSA, any entropy
problems at all, even a single bit, about "k", results in a complete compromise
(see https://en.wikipedia.org/wiki/ECDSA#Security). The deterministic algorithm
doesn't have this downside.
This commit is contained in:
Alex Gaynor 2014-04-01 08:04:25 -07:00
parent 4eb7720fae
commit fded67e712
1 changed files with 4 additions and 3 deletions

View File

@ -21,6 +21,8 @@ L{ECDSAKey}
""" """
import binascii import binascii
import hashlib
from ecdsa import SigningKey, VerifyingKey, der, curves from ecdsa import SigningKey, VerifyingKey, der, curves
from Crypto.Hash import SHA256 from Crypto.Hash import SHA256
from ecdsa.test_pyecdsa import ECDSA from ecdsa.test_pyecdsa import ECDSA
@ -98,9 +100,8 @@ class ECDSAKey (PKey):
return self.signing_key is not None return self.signing_key is not None
def sign_ssh_data(self, rpool, data): def sign_ssh_data(self, rpool, data):
digest = SHA256.new(data).digest() sig = self.signing_key.sign_deterministic(
sig = self.signing_key.sign_digest(digest, entropy=rpool.read, data, sigencode=self._sigencode, hashfunc=hashlib.sha256)
sigencode=self._sigencode)
m = Message() m = Message()
m.add_string('ecdsa-sha2-nistp256') m.add_string('ecdsa-sha2-nistp256')
m.add_string(sig) m.add_string(sig)