Skip to content

Commit 31b28fb

Browse files
committed
bytes input for SigningKey.from_der()
add support for all bytes-like objects as input for SigningKey.from_der
1 parent 7e5c5ec commit 31b28fb

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

src/ecdsa/der.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def remove_sequence(string):
147147

148148

149149
def remove_octet_string(string):
150-
if not string.startswith(b("\x04")):
150+
if string[:1] != b"\x04":
151151
n = string[0] if isinstance(string[0], integer_types) else ord(string[0])
152152
raise UnexpectedDER("wanted type 'octetstring' (0x04), got 0x%02x" % n)
153153
length, llen = read_length(string[1:])

src/ecdsa/keys.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@ def from_der(cls, string, hashfunc=sha1):
830830
:return: Initialised VerifyingKey object
831831
:rtype: VerifyingKey
832832
"""
833+
string = normalise_bytes(string)
833834
s, empty = der.remove_sequence(string)
834835
if empty != b(""):
835836
raise der.UnexpectedDER("trailing junk after DER privkey: %s" %

src/ecdsa/test_keys.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def test_VerifyingKey_verify(
229229
prv_key_bytes = (b'^\xc8B\x0b\xd6\xef\x92R\xa9B\xe9\x89\x04<\xa2'
230230
b'\x9fV\x1f\xa5%w\x0e\xb1\xc5')
231231
assert len(prv_key_bytes) == 24
232-
keys = []
232+
converters = []
233233
for modifier, convert in [
234234
("bytes", lambda x: x),
235235
("bytes memoryview", buffer),
@@ -242,13 +242,33 @@ def test_VerifyingKey_verify(
242242
("array.array of ints memoryview",
243243
lambda x: buffer(array.array('I', x)))
244244
]:
245-
keys.append(pytest.param(
245+
converters.append(pytest.param(
246246
convert,
247247
id=modifier))
248248

249-
@pytest.mark.parametrize("convert", keys)
249+
@pytest.mark.parametrize("convert", converters)
250250
def test_SigningKey_from_string(convert):
251251
key = convert(prv_key_bytes)
252252
sk = SigningKey.from_string(key)
253253

254254
assert sk.to_string() == prv_key_bytes
255+
256+
257+
# test SigningKey.from_der()
258+
prv_key_str = (
259+
"-----BEGIN EC PRIVATE KEY-----\n"
260+
"MF8CAQEEGF7IQgvW75JSqULpiQQ8op9WH6Uldw6xxaAKBggqhkjOPQMBAaE0AzIA\n"
261+
"BLiBd9CE7xf15FY5QIAoNg+fWbSk1yZOYtoGUdzkejWkxbRc9RWTQjqLVXucIJnz\n"
262+
"bA==\n"
263+
"-----END EC PRIVATE KEY-----\n")
264+
key_bytes = unpem(prv_key_str)
265+
assert isinstance(key_bytes, bytes)
266+
267+
# last two converters are for array.array of ints, those require input
268+
# that's multiple of 4, which no curve we support produces
269+
@pytest.mark.parametrize("convert", converters[:-2])
270+
def test_SigningKey_from_der(convert):
271+
key = convert(key_bytes)
272+
sk = SigningKey.from_der(key)
273+
274+
assert sk.to_string() == prv_key_bytes

0 commit comments

Comments
 (0)