1414
1515from six import b , print_ , binary_type
1616from .keys import SigningKey , VerifyingKey
17- from .keys import BadSignatureError , MalformedPointError
17+ from .keys import BadSignatureError , MalformedPointError , BadDigestError
1818from . import util
1919from .util import sigencode_der , sigencode_strings
2020from .util import sigdecode_der , sigdecode_strings
21- from .util import number_to_string
21+ from .util import number_to_string , encoded_oid_ecPublicKey , \
22+ MalformedSignature
2223from .curves import Curve , UnknownCurveError
2324from .curves import NIST192p , NIST224p , NIST256p , NIST384p , NIST521p , \
2425 SECP256k1 , curves
2526from .ellipticcurve import Point
2627from . import der
2728from . import rfc6979
29+ from . import ecdsa
2830
2931
3032class SubprocessError (Exception ):
@@ -275,6 +277,47 @@ def order(self):
275277 pub2 = VerifyingKey .from_pem (pem )
276278 self .assertTruePubkeysEqual (pub1 , pub2 )
277279
280+ def test_vk_from_der_garbage_after_curve_oid (self ):
281+ type_oid_der = encoded_oid_ecPublicKey
282+ curve_oid_der = der .encode_oid (* (1 , 2 , 840 , 10045 , 3 , 1 , 1 )) + \
283+ b ('garbage' )
284+ enc_type_der = der .encode_sequence (type_oid_der , curve_oid_der )
285+ point_der = der .encode_bitstring (b'\x00 \xff ' )
286+ to_decode = der .encode_sequence (enc_type_der , point_der )
287+
288+ with self .assertRaises (der .UnexpectedDER ):
289+ VerifyingKey .from_der (to_decode )
290+
291+ def test_vk_from_der_invalid_key_type (self ):
292+ type_oid_der = der .encode_oid (* (1 , 2 , 3 ))
293+ curve_oid_der = der .encode_oid (* (1 , 2 , 840 , 10045 , 3 , 1 , 1 ))
294+ enc_type_der = der .encode_sequence (type_oid_der , curve_oid_der )
295+ point_der = der .encode_bitstring (b'\x00 \xff ' )
296+ to_decode = der .encode_sequence (enc_type_der , point_der )
297+
298+ with self .assertRaises (der .UnexpectedDER ):
299+ VerifyingKey .from_der (to_decode )
300+
301+ def test_vk_from_der_garbage_after_point_string (self ):
302+ type_oid_der = encoded_oid_ecPublicKey
303+ curve_oid_der = der .encode_oid (* (1 , 2 , 840 , 10045 , 3 , 1 , 1 ))
304+ enc_type_der = der .encode_sequence (type_oid_der , curve_oid_der )
305+ point_der = der .encode_bitstring (b'\x00 \xff ' ) + b ('garbage' )
306+ to_decode = der .encode_sequence (enc_type_der , point_der )
307+
308+ with self .assertRaises (der .UnexpectedDER ):
309+ VerifyingKey .from_der (to_decode )
310+
311+ def test_vk_from_der_invalid_bitstring (self ):
312+ type_oid_der = encoded_oid_ecPublicKey
313+ curve_oid_der = der .encode_oid (* (1 , 2 , 840 , 10045 , 3 , 1 , 1 ))
314+ enc_type_der = der .encode_sequence (type_oid_der , curve_oid_der )
315+ point_der = der .encode_bitstring (b'\x08 \xff ' )
316+ to_decode = der .encode_sequence (enc_type_der , point_der )
317+
318+ with self .assertRaises (der .UnexpectedDER ):
319+ VerifyingKey .from_der (to_decode )
320+
278321 def test_signature_strings (self ):
279322 priv1 = SigningKey .generate ()
280323 pub1 = priv1 .get_verifying_key ()
@@ -298,6 +341,86 @@ def test_signature_strings(self):
298341 self .assertEqual (type (sig_der ), binary_type )
299342 self .assertTrue (pub1 .verify (sig_der , data , sigdecode = sigdecode_der ))
300343
344+ def test_sig_decode_strings_with_invalid_count (self ):
345+ with self .assertRaises (MalformedSignature ):
346+ sigdecode_strings ([b ('one' ), b ('two' ), b ('three' )], 0xff )
347+
348+ def test_sig_decode_strings_with_wrong_r_len (self ):
349+ with self .assertRaises (MalformedSignature ):
350+ sigdecode_strings ([b ('one' ), b ('two' )], 0xff )
351+
352+ def test_sig_decode_strings_with_wrong_s_len (self ):
353+ with self .assertRaises (MalformedSignature ):
354+ sigdecode_strings ([b ('\xa0 ' ), b ('\xb0 \xff ' )], 0xff )
355+
356+ def test_verify_with_too_long_input (self ):
357+ sk = SigningKey .generate ()
358+ vk = sk .verifying_key
359+
360+ with self .assertRaises (BadDigestError ):
361+ vk .verify_digest (None , b ('\x00 ' ) * 128 )
362+
363+ def test_sk_from_secret_exponent_with_wrong_sec_exponent (self ):
364+ with self .assertRaises (MalformedPointError ):
365+ SigningKey .from_secret_exponent (0 )
366+
367+ def test_sk_from_string_with_wrong_len_string (self ):
368+ with self .assertRaises (MalformedPointError ):
369+ SigningKey .from_string (b ('\x01 ' ))
370+
371+ def test_sk_from_der_with_junk_after_sequence (self ):
372+ ver_der = der .encode_integer (1 )
373+ to_decode = der .encode_sequence (ver_der ) + b ('garbage' )
374+
375+ with self .assertRaises (der .UnexpectedDER ):
376+ SigningKey .from_der (to_decode )
377+
378+ def test_sk_from_der_with_wrong_version (self ):
379+ ver_der = der .encode_integer (0 )
380+ to_decode = der .encode_sequence (ver_der )
381+
382+ with self .assertRaises (der .UnexpectedDER ):
383+ SigningKey .from_der (to_decode )
384+
385+ def test_sk_from_der_invalid_const_tag (self ):
386+ ver_der = der .encode_integer (1 )
387+ privkey_der = der .encode_octet_string (b ('\x00 \xff ' ))
388+ curve_oid_der = der .encode_oid (* (1 , 2 , 3 ))
389+ const_der = der .encode_constructed (1 , curve_oid_der )
390+ to_decode = der .encode_sequence (ver_der , privkey_der , const_der ,
391+ curve_oid_der )
392+
393+ with self .assertRaises (der .UnexpectedDER ):
394+ SigningKey .from_der (to_decode )
395+
396+ def test_sk_from_der_garbage_after_privkey_oid (self ):
397+ ver_der = der .encode_integer (1 )
398+ privkey_der = der .encode_octet_string (b ('\x00 \xff ' ))
399+ curve_oid_der = der .encode_oid (* (1 , 2 , 3 )) + b ('garbage' )
400+ const_der = der .encode_constructed (0 , curve_oid_der )
401+ to_decode = der .encode_sequence (ver_der , privkey_der , const_der ,
402+ curve_oid_der )
403+
404+ with self .assertRaises (der .UnexpectedDER ):
405+ SigningKey .from_der (to_decode )
406+
407+ def test_sk_from_der_with_short_privkey (self ):
408+ ver_der = der .encode_integer (1 )
409+ privkey_der = der .encode_octet_string (b ('\x00 \xff ' ))
410+ curve_oid_der = der .encode_oid (* (1 , 2 , 840 , 10045 , 3 , 1 , 1 ))
411+ const_der = der .encode_constructed (0 , curve_oid_der )
412+ to_decode = der .encode_sequence (ver_der , privkey_der , const_der ,
413+ curve_oid_der )
414+
415+ sk = SigningKey .from_der (to_decode )
416+ self .assertEqual (sk .privkey .secret_multiplier , 255 )
417+
418+ def test_sign_with_too_long_hash (self ):
419+ sk = SigningKey .from_secret_exponent (12 )
420+
421+ with self .assertRaises (BadDigestError ):
422+ sk .sign_digest (b ('\xff ' ) * 64 )
423+
301424 def test_hashfunc (self ):
302425 sk = SigningKey .generate (curve = NIST256p , hashfunc = sha256 )
303426 data = b ("security level is 128 bits" )
@@ -448,6 +571,49 @@ def test_not_lying_on_curve(self):
448571 with self .assertRaises (MalformedPointError ):
449572 VerifyingKey .from_string (b ('\x02 ' ) + enc )
450573
574+ def test_decoding_with_malformed_uncompressed (self ):
575+ enc = b ('\x0c \xe0 \x1d \xe0 d\x1c \x8e S\x8a \xc0 \x9e K\xa8 x !\xd5 \xc2 \xc3 '
576+ '\xfd \xc8 \xa0 c\xff \xfb \x02 \xb9 \xc4 \x84 )\x1a \x0f \x8b \x87 \xa4 '
577+ 'z\x8a #\xb5 \x97 \xec O\xb6 \xa0 HQ\x89 *' )
578+
579+ with self .assertRaises (MalformedPointError ):
580+ VerifyingKey .from_string (b ('\x02 ' ) + enc )
581+
582+ def test_decoding_with_point_not_on_curve (self ):
583+ enc = b ('\x0c \xe0 \x1d \xe0 d\x1c \x8e S\x8a \xc0 \x9e K\xa8 x !\xd5 \xc2 \xc3 '
584+ '\xfd \xc8 \xa0 c\xff \xfb \x02 \xb9 \xc4 \x84 )\x1a \x0f \x8b \x87 \xa4 '
585+ 'z\x8a #\xb5 \x97 \xec O\xb6 \xa0 HQ\x89 *' )
586+
587+ with self .assertRaises (MalformedPointError ):
588+ VerifyingKey .from_string (enc [:47 ] + b ('\x00 ' ))
589+
590+ def test_decoding_with_point_at_infinity (self ):
591+ # decoding it is unsupported, as it's not necessary to encode it
592+ with self .assertRaises (MalformedPointError ):
593+ VerifyingKey .from_string (b ('\x00 ' ))
594+
595+ def test_from_string_with_invalid_curve_too_short_ver_key_len (self ):
596+ # both verifying_key_length and baselen are calculated internally
597+ # by the Curve constructor, but since we depend on them verify
598+ # that inconsistent values are detected
599+ curve = Curve ("test" , ecdsa .curve_192 , ecdsa .generator_192 , (1 , 2 ))
600+ curve .verifying_key_length = 16
601+ curve .baselen = 32
602+
603+ with self .assertRaises (MalformedPointError ):
604+ VerifyingKey .from_string (b ('\x00 ' )* 16 , curve )
605+
606+ def test_from_string_with_invalid_curve_too_long_ver_key_len (self ):
607+ # both verifying_key_length and baselen are calculated internally
608+ # by the Curve constructor, but since we depend on them verify
609+ # that inconsistent values are detected
610+ curve = Curve ("test" , ecdsa .curve_192 , ecdsa .generator_192 , (1 , 2 ))
611+ curve .verifying_key_length = 16
612+ curve .baselen = 16
613+
614+ with self .assertRaises (MalformedPointError ):
615+ VerifyingKey .from_string (b ('\x00 ' )* 16 , curve )
616+
451617
452618@pytest .mark .parametrize ("val,even" ,
453619 [(i , j ) for i in range (256 ) for j in [True , False ]])
0 commit comments