@@ -515,6 +515,75 @@ def test_sk_from_der_with_short_privkey(self):
515515 sk = SigningKey .from_der (to_decode )
516516 self .assertEqual (sk .privkey .secret_multiplier , 255 )
517517
518+ def test_sk_from_p8_der_with_wrong_version (self ):
519+ ver_der = der .encode_integer (2 )
520+ algorithm_der = der .encode_sequence (
521+ der .encode_oid (1 , 2 , 840 , 10045 , 2 , 1 ),
522+ der .encode_oid (1 , 2 , 840 , 10045 , 3 , 1 , 1 ),
523+ )
524+ privkey_der = der .encode_octet_string (
525+ der .encode_sequence (
526+ der .encode_integer (1 ), der .encode_octet_string (b"\x00 \xff " )
527+ )
528+ )
529+ to_decode = der .encode_sequence (ver_der , algorithm_der , privkey_der )
530+
531+ with self .assertRaises (der .UnexpectedDER ):
532+ SigningKey .from_der (to_decode )
533+
534+ def test_sk_from_p8_der_with_wrong_algorithm (self ):
535+ ver_der = der .encode_integer (1 )
536+ algorithm_der = der .encode_sequence (
537+ der .encode_oid (1 , 2 , 3 ), der .encode_oid (1 , 2 , 840 , 10045 , 3 , 1 , 1 )
538+ )
539+ privkey_der = der .encode_octet_string (
540+ der .encode_sequence (
541+ der .encode_integer (1 ), der .encode_octet_string (b"\x00 \xff " )
542+ )
543+ )
544+ to_decode = der .encode_sequence (ver_der , algorithm_der , privkey_der )
545+
546+ with self .assertRaises (der .UnexpectedDER ):
547+ SigningKey .from_der (to_decode )
548+
549+ def test_sk_from_p8_der_with_trailing_junk_after_algorithm (self ):
550+ ver_der = der .encode_integer (1 )
551+ algorithm_der = der .encode_sequence (
552+ der .encode_oid (1 , 2 , 840 , 10045 , 2 , 1 ),
553+ der .encode_oid (1 , 2 , 840 , 10045 , 3 , 1 , 1 ),
554+ der .encode_octet_string (b"junk" ),
555+ )
556+ privkey_der = der .encode_octet_string (
557+ der .encode_sequence (
558+ der .encode_integer (1 ), der .encode_octet_string (b"\x00 \xff " )
559+ )
560+ )
561+ to_decode = der .encode_sequence (ver_der , algorithm_der , privkey_der )
562+
563+ with self .assertRaises (der .UnexpectedDER ):
564+ SigningKey .from_der (to_decode )
565+
566+ def test_sk_from_p8_der_with_trailing_junk_after_key (self ):
567+ ver_der = der .encode_integer (1 )
568+ algorithm_der = der .encode_sequence (
569+ der .encode_oid (1 , 2 , 840 , 10045 , 2 , 1 ),
570+ der .encode_oid (1 , 2 , 840 , 10045 , 3 , 1 , 1 ),
571+ )
572+ privkey_der = der .encode_octet_string (
573+ der .encode_sequence (
574+ der .encode_integer (1 ), der .encode_octet_string (b"\x00 \xff " )
575+ ) + der .encode_integer (999 )
576+ )
577+ to_decode = der .encode_sequence (
578+ ver_der ,
579+ algorithm_der ,
580+ privkey_der ,
581+ der .encode_octet_string (b"junk" ),
582+ )
583+
584+ with self .assertRaises (der .UnexpectedDER ):
585+ SigningKey .from_der (to_decode )
586+
518587 def test_sign_with_too_long_hash (self ):
519588 sk = SigningKey .from_secret_exponent (12 )
520589
@@ -945,11 +1014,20 @@ def do_test_from_openssl(self, curve, hash_name="SHA1"):
9451014 with open ("t/privkey.pem" ) as e :
9461015 fp = e .read ()
9471016 sk = SigningKey .from_pem (fp ) # 1
948- sig = sk .sign (data , hashfunc = partial (hashlib .new , hash_name ), )
1017+ sig = sk .sign (data , hashfunc = partial (hashlib .new , hash_name ))
9491018 self .assertTrue (
9501019 vk .verify (sig , data , hashfunc = partial (hashlib .new , hash_name ))
9511020 )
9521021
1022+ run_openssl (
1023+ "pkcs8 -topk8 -nocrypt "
1024+ "-in t/privkey.pem -outform pem -out t/privkey-p8.pem"
1025+ )
1026+ with open ("t/privkey-p8.pem" , "rb" ) as e :
1027+ privkey_p8_pem = e .read ()
1028+ sk_from_p8 = SigningKey .from_pem (privkey_p8_pem )
1029+ self .assertEqual (sk , sk_from_p8 )
1030+
9531031 @pytest .mark .skipif (
9541032 "prime192v1" not in OPENSSL_SUPPORTED_CURVES ,
9551033 reason = "system openssl does not support prime192v1" ,
@@ -1112,6 +1190,17 @@ def do_test_to_openssl(self, curve, hash_name="SHA1"):
11121190 % mdarg
11131191 )
11141192
1193+ with open ("t/privkey-p8.pem" , "wb" ) as e :
1194+ e .write (sk .to_pem (format = "pkcs8" ))
1195+ run_openssl (
1196+ "dgst %s -sign t/privkey-p8.pem -out t/data.sig3 t/data.txt"
1197+ % mdarg
1198+ )
1199+ run_openssl (
1200+ "dgst %s -verify t/pubkey.pem -signature t/data.sig3 t/data.txt"
1201+ % mdarg
1202+ )
1203+
11151204
11161205class DER (unittest .TestCase ):
11171206 def test_integer (self ):
0 commit comments