1# coding: utf-8 2from __future__ import unicode_literals, division, absolute_import, print_function 3 4import os 5import sys 6import unittest 7 8from asn1crypto import keys, core, util 9 10from .unittest_data import data_decorator, data 11from ._unittest_compat import patch 12 13patch() 14 15if sys.version_info < (3,): 16 int_types = (int, long) # noqa 17else: 18 int_types = int 19 20tests_root = os.path.dirname(__file__) 21fixtures_dir = os.path.join(tests_root, 'fixtures') 22 23 24@data_decorator 25class KeysTests(unittest.TestCase): 26 27 def test_parse_rsa_private_key(self): 28 with open(os.path.join(fixtures_dir, 'keys/test-der.key'), 'rb') as f: 29 key = keys.RSAPrivateKey.load(f.read()) 30 31 self.assertEqual( 32 'two-prime', 33 key['version'].native 34 ) 35 self.assertEqual( 36 23903990516906431865559598284199534387004799030432486061102966678620221767754702651554142956492614440585611990224871381291841413369032752409360196079700921141819811294444393525264295297988924243231844876926173670633422654261873814968313363171188082579071492839040415373948505938897419917635370450127498164824808630475648771544810334682447182123219422360569466851807131368135806769502898151721274383486320505905826683946456552230958810028663378886363555981449715929872558073101554364803925363048965464124465016494920967179276744892632783712377912841537032383450409486298694116013299423220523450956288827030007092359007, # noqa 37 key['modulus'].native 38 ) 39 self.assertEqual( 40 65537, 41 key['public_exponent'].native 42 ) 43 self.assertEqual( 44 9979296894007354255484849917690758820642557661666429934720496335307525025035760937280030384204921358841911348590147260206368632524783497961763507098900120579828036636037636859350155169644276779450131617753331883188587268575077705380671279069284616924232052795766448946873233783789819627790465470123569125678598045748629782316184667685110712273519313310937077963014676074966877849272992367512921997850502687035430136911690081438185238817835171119161013656103255853961444458012340770881411877222316871444386486841632394098449378506206645681449475758856053641206175913163492821894709155329556294181613669730336931773953, # noqa 45 key['private_exponent'].native 46 ) 47 self.assertEqual( 48 166647390172913547327716251713919741459272587597255782032652236515036001974461323181989715320980256918783849999012066159723695368018857439366733087649658067943054926668058248612521531843495934099419046629521378187012692776633310821178903471282399402138521150042979117060141563972064613977168440186057796106743, # noqa 49 key['prime1'].native 50 ) 51 self.assertEqual( 52 143440533284701431115857974625778819273481773744021067505004499855263691219807413711274106281992493130281690570930126889424222979194828112331057105055939481042398415265558356642606674863401518188395487842736496447305100392269029249928750130190700690239916449523411304928539660679996452045625683879143320460249, # noqa 53 key['prime2'].native 54 ) 55 self.assertEqual( 56 109414079859473229289779858629449815451592843305649008118818271892297238643195390011716060554289324731958287404176117228233683079641781234394481865640434212819044363330635799312574408253258259431525735957118503776629524657609514187779529692628749620437591384488141789034909003405007374076072765197764330205487, # noqa 57 key['exponent1'].native 58 ) 59 self.assertEqual( 60 39361498857013145813625735320048312950154816653378623953034178027634194773898965899927575680536994315500952488328843279054659597751495930118280223039291020752651068863936425009698924893471060669547041417272275998418220630400632040385105243470857091616562513209775072216226822370097138922876120342440353924609, # noqa 61 key['exponent2'].native 62 ) 63 self.assertEqual( 64 109796662729796355370195012683418958273962986010546166376879205603219777065076464250440708895625560840314914603409569660942497623175203159192440744329997446961447023349392064212216532091513743978251892999757210494211477167363008686808094766092274115601607346901935491774285446659775729268493276413171032997893, # noqa 65 key['coefficient'].native 66 ) 67 self.assertEqual( 68 None, 69 key['other_prime_infos'].native 70 ) 71 72 def test_parse_rsa_private_key_no_spec(self): 73 with open(os.path.join(fixtures_dir, 'keys/test-der.key'), 'rb') as f: 74 key = core.Asn1Value.load(f.read()) 75 76 self.assertEqual( 77 0, 78 key[0].native 79 ) 80 self.assertEqual( 81 23903990516906431865559598284199534387004799030432486061102966678620221767754702651554142956492614440585611990224871381291841413369032752409360196079700921141819811294444393525264295297988924243231844876926173670633422654261873814968313363171188082579071492839040415373948505938897419917635370450127498164824808630475648771544810334682447182123219422360569466851807131368135806769502898151721274383486320505905826683946456552230958810028663378886363555981449715929872558073101554364803925363048965464124465016494920967179276744892632783712377912841537032383450409486298694116013299423220523450956288827030007092359007, # noqa 82 key[1].native 83 ) 84 self.assertEqual( 85 65537, 86 key[2].native 87 ) 88 self.assertEqual( 89 9979296894007354255484849917690758820642557661666429934720496335307525025035760937280030384204921358841911348590147260206368632524783497961763507098900120579828036636037636859350155169644276779450131617753331883188587268575077705380671279069284616924232052795766448946873233783789819627790465470123569125678598045748629782316184667685110712273519313310937077963014676074966877849272992367512921997850502687035430136911690081438185238817835171119161013656103255853961444458012340770881411877222316871444386486841632394098449378506206645681449475758856053641206175913163492821894709155329556294181613669730336931773953, # noqa 90 key[3].native 91 ) 92 self.assertEqual( 93 166647390172913547327716251713919741459272587597255782032652236515036001974461323181989715320980256918783849999012066159723695368018857439366733087649658067943054926668058248612521531843495934099419046629521378187012692776633310821178903471282399402138521150042979117060141563972064613977168440186057796106743, # noqa 94 key[4].native 95 ) 96 self.assertEqual( 97 143440533284701431115857974625778819273481773744021067505004499855263691219807413711274106281992493130281690570930126889424222979194828112331057105055939481042398415265558356642606674863401518188395487842736496447305100392269029249928750130190700690239916449523411304928539660679996452045625683879143320460249, # noqa 98 key[5].native 99 ) 100 self.assertEqual( 101 109414079859473229289779858629449815451592843305649008118818271892297238643195390011716060554289324731958287404176117228233683079641781234394481865640434212819044363330635799312574408253258259431525735957118503776629524657609514187779529692628749620437591384488141789034909003405007374076072765197764330205487, # noqa 102 key[6].native 103 ) 104 self.assertEqual( 105 39361498857013145813625735320048312950154816653378623953034178027634194773898965899927575680536994315500952488328843279054659597751495930118280223039291020752651068863936425009698924893471060669547041417272275998418220630400632040385105243470857091616562513209775072216226822370097138922876120342440353924609, # noqa 106 key[7].native 107 ) 108 self.assertEqual( 109 109796662729796355370195012683418958273962986010546166376879205603219777065076464250440708895625560840314914603409569660942497623175203159192440744329997446961447023349392064212216532091513743978251892999757210494211477167363008686808094766092274115601607346901935491774285446659775729268493276413171032997893, # noqa 110 key[8].native 111 ) 112 113 with self.assertRaises(KeyError): 114 key[9].native 115 116 def test_parse_dsa_private_key(self): 117 with open(os.path.join(fixtures_dir, 'keys/test-dsa-der.key'), 'rb') as f: 118 key = keys.DSAPrivateKey.load(f.read()) 119 120 self.assertEqual( 121 0, 122 key['version'].native 123 ) 124 self.assertEqual( 125 4511743893397705393934377497936985478231822206263141826261443300639402520800626925517264115785551703273809312112372693877437137848393530691841757974971843334497076835630893064661599193178307024379015589119302113551197423138934242435710226975119594589912289060014025377813473273600967729027125618396732574594753039493158066887433778053086408525146692226448554390096911703556213619406958876388642882534250747780313634767409586007581976273681005928967585750017105562145167146445061803488570714706090280814293902464230717946651489964409785146803791743658888866280873858000476717727810363942159874283767926511678640730707887895260274767195555813448140889391762755466967436731106514029224490921857229134393798015954890071206959203407845438863870686180087606429828973298318856683615900474921310376145478859687052812749087809700610549251964102790514588562086548577933609968589710807989944739877028770343142449461177732058649962678857, # noqa 126 key['p'].native 127 ) 128 self.assertEqual( 129 71587850165936478337655415373676526523562874562337607790945426056266440596923, 130 key['q'].native 131 ) 132 self.assertEqual( 133 761437146067908309288345767887973163494473925243194806582679580640442238588269326525839153095505341738937595419375068472941615006110237832663093084973431440436421580371384720052414080562019831325744042316268714195397974084616335082272743706567701546951285088540646372701485690904535540223121118329044403681933304838754517522024738251994717369464179515923093116622352823578284891812676662979104509631349201801577889230316128523885862472086364717411346341249139971907827526291913249445756671582283459372536334490171231311487207683108274785825764378203622999309355578169139646003751751448501475767709869676880946562283552431757983801739671783678927397420797147373441051876558068212062253171347849380506793433921881336652424898488378657239798694995315456959568806256079056461448199493507273882763491729787817044805150879660784158902456811649964987582162907020243296662602990514615480712948126671999033658064244112238138589732202, # noqa 134 key['g'].native 135 ) 136 self.assertEqual( 137 934231235067929794039535952071098031636053793876274937162425423023735221571983693370780054696865229184537343792766496068557051933738826401423094028670222490622041397241325320965905259541032379046252395145258594355589801644789631904099105867133976990593761395721476198083091062806327384261369876465927159169400428623265291958463077792777155465482611741502621885386691681062128487785344975981628995609792181581218570320181053055516069553767918513262908069925035292416868414952256645902605335068760774106734518308281769128146479819566784704033671969858507248124850451414380441279385481154336362988505436125981975735568289420374790767927084033441728922597082155884801013899630856890463962357814273014111039522903328923758417820349377075487103441305806369234738881875734407495707878637895190993370257589211331043479113328811265005530361001980539377903738453549980082795009589559114091215518866106998956304437954236070776810740036, # noqa 138 key['public_key'].native 139 ) 140 self.assertEqual( 141 67419307522580891944110478232775481982040250615628832761657973309422062357004, 142 key['private_key'].native 143 ) 144 145 def test_parse_ec_private_key(self): 146 with open(os.path.join(fixtures_dir, 'keys/test-ec-der.key'), 'rb') as f: 147 key = keys.ECPrivateKey.load(f.read()) 148 149 self.assertEqual( 150 'ecPrivkeyVer1', 151 key['version'].native 152 ) 153 self.assertEqual( 154 105342176757643535635985202437872662036661123763048203788770333621775587689309, 155 key['private_key'].native 156 ) 157 self.assertEqual( 158 util.OrderedDict([ 159 ('version', 'ecdpVer1'), 160 ( 161 'field_id', 162 util.OrderedDict([ 163 ('field_type', 'prime_field'), 164 ('parameters', 115792089210356248762697446949407573530086143415290314195533631308867097853951) 165 ]) 166 ), 167 ( 168 'curve', 169 util.OrderedDict([ 170 ( 171 'a', 172 b'\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00' 173 b'\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC' 174 ), 175 ( 176 'b', 177 b'\x5A\xC6\x35\xD8\xAA\x3A\x93\xE7\xB3\xEB\xBD\x55\x76\x98\x86\xBC' 178 b'\x65\x1D\x06\xB0\xCC\x53\xB0\xF6\x3B\xCE\x3C\x3E\x27\xD2\x60\x4B' 179 ), 180 ('seed', b'\xC4\x9D\x36\x08\x86\xE7\x04\x93\x6A\x66\x78\xE1\x13\x9D\x26\xB7\x81\x9F\x7E\x90'), 181 ]) 182 ), 183 ( 184 'base', 185 b'\x04\x6B\x17\xD1\xF2\xE1\x2C\x42\x47\xF8\xBC\xE6\xE5\x63\xA4\x40\xF2\x77' 186 b'\x03\x7D\x81\x2D\xEB\x33\xA0\xF4\xA1\x39\x45\xD8\x98\xC2\x96\x4F\xE3\x42' 187 b'\xE2\xFE\x1A\x7F\x9B\x8E\xE7\xEB\x4A\x7C\x0F\x9E\x16\x2B\xCE\x33\x57\x6B' 188 b'\x31\x5E\xCE\xCB\xB6\x40\x68\x37\xBF\x51\xF5' 189 ), 190 ( 191 'order', 192 115792089210356248762697446949407573529996955224135760342422259061068512044369 193 ), 194 ('cofactor', 1), 195 ('hash', None), 196 ]), 197 key['parameters'].native 198 ) 199 self.assertEqual( 200 b'\x04\x8B\x5D\x4C\x71\xF7\xD6\xC6\xA3\x49\x63\x42\x5C\x47\x9F\xCB\x73\x24\x1D\xC9\xDD' 201 b'\xD1\x2D\xF1\x3A\x9F\xB7\x04\xDE\x20\xD0\x58\x00\x93\x54\xF6\x89\xC7\x2F\x87\x2B\xF7' 202 b'\xF9\x3D\x3B\x34\xED\x9E\x7B\x0E\x3D\x57\x42\xDF\x78\x03\x0B\xCC\x31\xC6\x03\xD7\x9F' 203 b'\x60\x01', 204 key['public_key'].native 205 ) 206 207 def test_parse_ed25519_private_key(self): 208 with open(os.path.join(fixtures_dir, 'keys/test-ed25519.key'), 'rb') as f: 209 key = keys.PrivateKeyInfo.load(f.read()) 210 211 self.assertEqual( 212 b'\xab),,c\x03o\xed)r5\x95+p\xb0\xbbc Lu\xc1\xfd\xc8FH\xfe\xce\x83\xf0F\x0f\xd7', 213 key['private_key'].native 214 ) 215 216 def test_parse_ed448_private_key(self): 217 with open(os.path.join(fixtures_dir, 'keys/test-ed448.key'), 'rb') as f: 218 key = keys.PrivateKeyInfo.load(f.read()) 219 220 self.assertEqual( 221 b'yQ\xf0<\x99\x89\tU\xda}\x84\x027\xa8\xc0\xdb\x0fs\xafd\xdcQ\xa1' 222 b'\xa6(7g\x06\x07\x8d#\xb1&\x11\x15\xfb\xd3\xfd\x0b\x03\xc7\x80\xe1' 223 b'\xf2\x82\xb6\xedo\xb1Sk\x828#M\xb2\\', 224 key['private_key'].native 225 ) 226 227 def test_parse_rsa_public_key(self): 228 with open(os.path.join(fixtures_dir, 'keys/test-public-rsa-der.key'), 'rb') as f: 229 key = keys.RSAPublicKey.load(f.read()) 230 231 self.assertEqual( 232 23903990516906431865559598284199534387004799030432486061102966678620221767754702651554142956492614440585611990224871381291841413369032752409360196079700921141819811294444393525264295297988924243231844876926173670633422654261873814968313363171188082579071492839040415373948505938897419917635370450127498164824808630475648771544810334682447182123219422360569466851807131368135806769502898151721274383486320505905826683946456552230958810028663378886363555981449715929872558073101554364803925363048965464124465016494920967179276744892632783712377912841537032383450409486298694116013299423220523450956288827030007092359007, # noqa 233 key['modulus'].native 234 ) 235 self.assertEqual( 236 65537, 237 key['public_exponent'].native 238 ) 239 240 def test_parse_public_key_info(self): 241 with open(os.path.join(fixtures_dir, 'keys/test-public-der.key'), 'rb') as f: 242 key = keys.PublicKeyInfo.load(f.read()) 243 244 public_key = key['public_key'].parsed 245 246 self.assertEqual( 247 'rsa', 248 key['algorithm']['algorithm'].native 249 ) 250 self.assertEqual( 251 None, 252 key['algorithm']['parameters'].native 253 ) 254 self.assertEqual( 255 23903990516906431865559598284199534387004799030432486061102966678620221767754702651554142956492614440585611990224871381291841413369032752409360196079700921141819811294444393525264295297988924243231844876926173670633422654261873814968313363171188082579071492839040415373948505938897419917635370450127498164824808630475648771544810334682447182123219422360569466851807131368135806769502898151721274383486320505905826683946456552230958810028663378886363555981449715929872558073101554364803925363048965464124465016494920967179276744892632783712377912841537032383450409486298694116013299423220523450956288827030007092359007, # noqa 256 public_key['modulus'].native 257 ) 258 self.assertEqual( 259 65537, 260 public_key['public_exponent'].native 261 ) 262 263 def test_parse_pkcs8_private_key(self): 264 with open(os.path.join(fixtures_dir, 'keys/test-pkcs8-der.key'), 'rb') as f: 265 key_info = keys.PrivateKeyInfo.load(f.read()) 266 267 key = key_info['private_key'].parsed 268 269 self.assertEqual( 270 0, 271 key_info['version'].native 272 ) 273 self.assertEqual( 274 'rsa', 275 key_info['private_key_algorithm']['algorithm'].native 276 ) 277 self.assertEqual( 278 None, 279 key_info['private_key_algorithm']['parameters'].native 280 ) 281 282 self.assertEqual( 283 'two-prime', 284 key['version'].native 285 ) 286 self.assertEqual( 287 23903990516906431865559598284199534387004799030432486061102966678620221767754702651554142956492614440585611990224871381291841413369032752409360196079700921141819811294444393525264295297988924243231844876926173670633422654261873814968313363171188082579071492839040415373948505938897419917635370450127498164824808630475648771544810334682447182123219422360569466851807131368135806769502898151721274383486320505905826683946456552230958810028663378886363555981449715929872558073101554364803925363048965464124465016494920967179276744892632783712377912841537032383450409486298694116013299423220523450956288827030007092359007, # noqa 288 key['modulus'].native 289 ) 290 self.assertEqual( 291 65537, 292 key['public_exponent'].native 293 ) 294 self.assertEqual( 295 9979296894007354255484849917690758820642557661666429934720496335307525025035760937280030384204921358841911348590147260206368632524783497961763507098900120579828036636037636859350155169644276779450131617753331883188587268575077705380671279069284616924232052795766448946873233783789819627790465470123569125678598045748629782316184667685110712273519313310937077963014676074966877849272992367512921997850502687035430136911690081438185238817835171119161013656103255853961444458012340770881411877222316871444386486841632394098449378506206645681449475758856053641206175913163492821894709155329556294181613669730336931773953, # noqa 296 key['private_exponent'].native 297 ) 298 self.assertEqual( 299 166647390172913547327716251713919741459272587597255782032652236515036001974461323181989715320980256918783849999012066159723695368018857439366733087649658067943054926668058248612521531843495934099419046629521378187012692776633310821178903471282399402138521150042979117060141563972064613977168440186057796106743, # noqa 300 key['prime1'].native 301 ) 302 self.assertEqual( 303 143440533284701431115857974625778819273481773744021067505004499855263691219807413711274106281992493130281690570930126889424222979194828112331057105055939481042398415265558356642606674863401518188395487842736496447305100392269029249928750130190700690239916449523411304928539660679996452045625683879143320460249, # noqa 304 key['prime2'].native 305 ) 306 self.assertEqual( 307 109414079859473229289779858629449815451592843305649008118818271892297238643195390011716060554289324731958287404176117228233683079641781234394481865640434212819044363330635799312574408253258259431525735957118503776629524657609514187779529692628749620437591384488141789034909003405007374076072765197764330205487, # noqa 308 key['exponent1'].native 309 ) 310 self.assertEqual( 311 39361498857013145813625735320048312950154816653378623953034178027634194773898965899927575680536994315500952488328843279054659597751495930118280223039291020752651068863936425009698924893471060669547041417272275998418220630400632040385105243470857091616562513209775072216226822370097138922876120342440353924609, # noqa 312 key['exponent2'].native 313 ) 314 self.assertEqual( 315 109796662729796355370195012683418958273962986010546166376879205603219777065076464250440708895625560840314914603409569660942497623175203159192440744329997446961447023349392064212216532091513743978251892999757210494211477167363008686808094766092274115601607346901935491774285446659775729268493276413171032997893, # noqa 316 key['coefficient'].native 317 ) 318 self.assertEqual( 319 None, 320 key['other_prime_infos'].native 321 ) 322 323 self.assertEqual( 324 None, 325 key_info['attributes'].native 326 ) 327 328 def test_parse_rsapss_private_key(self): 329 with open(os.path.join(fixtures_dir, 'keys/test-rsapss-der.key'), 'rb') as f: 330 key_info = keys.PrivateKeyInfo.load(f.read()) 331 332 key = key_info['private_key'].parsed 333 334 self.assertEqual( 335 0, 336 key_info['version'].native 337 ) 338 self.assertEqual( 339 'rsassa_pss', 340 key_info['private_key_algorithm']['algorithm'].native 341 ) 342 self.assertEqual( 343 None, 344 key_info['private_key_algorithm']['parameters'].native 345 ) 346 347 self.assertEqual( 348 'two-prime', 349 key['version'].native 350 ) 351 self.assertEqual( 352 20334810015710919160110203472269180092101382951468058535601491502957196266577250503666807938732810152931665713052098820680792829137564325868564844098687045650387144565108903086036194735310494097581552241575174798917880615962200904076841064384200149608953782976948109759991080721261141139715447415148530436086884795768009560076896590825433136132086023781159444716805738553676228393667377624295683128237093827752550284339271476658714835879903906034493875531632793284572104031230158276531850092876884395075794398068537347947800593962574809516836581297669594643468201529164877789603529698620577572178907861813134904392181, # noqa 353 key['modulus'].native 354 ) 355 self.assertEqual( 356 65537, 357 key['public_exponent'].native 358 ) 359 self.assertEqual( 360 19811367921985171557639752989981035886303512541789150212828710994763522615025976847568941008714007785902419332260807020468874408966438534060269241736746690644631569655037665166904359886012100769497873119376457740069070560586943676477505866318738720913860857882999478282122015106772111353446622784949473859714808146533832277397219231218258638918521475883551912394494264506377559745603922894963456171825545032908365582944199734667178542763963194351614183530759037228600105514522819433425764227915014375970397879315537366008672232442295229043876987446583754589361036423305704619726617664187630589314612553217357586095673, # noqa 361 key['private_exponent'].native 362 ) 363 self.assertEqual( 364 145062186227663059634108314593892541355080853648164075820395373006330022883408993468365984286369578851636705799765757665015182142763055043654284213839887910732213256250809510746337738407165996181392718941356683486810092456676083857188565619344293262177288309348259896401807590237461717880393098789423620650939, # noqa 365 key['prime1'].native 366 ) 367 self.assertEqual( 368 140179950023620372289001596962713930540779028054089057618536399863850868080064249195053602322991362108187576825895413419966213531630187432159266399149913629896819277637422106295703267471029328291865017941552279870382011332512626586060449095917164740367589115287472025339179557750935025294415109144213020312079, # noqa 369 key['prime2'].native 370 ) 371 self.assertEqual( 372 118228658851708114001194157738654137417646348120344781510758784408198602961600439097293142570946864897406396441532083859790972106955549111215800799518497533665722246507785513633594518505277393228754912332478232018012333162654627815552589285314495327920681107702945726939074883271186966123919571825659906212509, # noqa 373 key['exponent1'].native 374 ) 375 self.assertEqual( 376 56878789554421364113540907677075374840783006759759162308194149033058002105452927576710337564627405910873614034121348759689054278241450542380322750296695046251983127560528078041645807537568272852545501885984378691627606471980343411760066258123338644976958508227786686876412756148631524064712858116223089798721, # noqa 377 key['exponent2'].native 378 ) 379 self.assertEqual( 380 23480707628058872067473220975854826046220552607063059593257976510053338333806071359463231176605785818753563067398907246278690942690250152695883594601176151883590956534074071491193074275985805378044282321604348476199853682247297755042167691612551582210509658456585074900583647465600111554502893125233815233234, # noqa 381 key['coefficient'].native 382 ) 383 self.assertEqual( 384 None, 385 key['other_prime_infos'].native 386 ) 387 388 self.assertEqual( 389 None, 390 key_info['attributes'].native 391 ) 392 393 def test_parse_rsapss_public_key_info(self): 394 with open(os.path.join(fixtures_dir, 'keys/test-public-rsapss-der.key'), 'rb') as f: 395 key = keys.PublicKeyInfo.load(f.read()) 396 397 public_key = key['public_key'].parsed 398 399 self.assertEqual( 400 'rsassa_pss', 401 key['algorithm']['algorithm'].native 402 ) 403 self.assertEqual( 404 None, 405 key['algorithm']['parameters'].native 406 ) 407 self.assertEqual( 408 20334810015710919160110203472269180092101382951468058535601491502957196266577250503666807938732810152931665713052098820680792829137564325868564844098687045650387144565108903086036194735310494097581552241575174798917880615962200904076841064384200149608953782976948109759991080721261141139715447415148530436086884795768009560076896590825433136132086023781159444716805738553676228393667377624295683128237093827752550284339271476658714835879903906034493875531632793284572104031230158276531850092876884395075794398068537347947800593962574809516836581297669594643468201529164877789603529698620577572178907861813134904392181, # noqa 409 public_key['modulus'].native 410 ) 411 self.assertEqual( 412 65537, 413 public_key['public_exponent'].native 414 ) 415 416 @staticmethod 417 def key_sha1_hashes(): 418 return ( 419 ('keys/test-public-der.key', b'\xbeB\x85=\xcc\xff\xe3\xf9(\x02\x8f~XV\xb4\xfd\x03\\\xeaK'), 420 ('keys/test-public-dsa-der.key', b'\x81\xa37\x86\xf9\x99(\xf2tp`\x87\xf2\xd3~\x8d\x19a\xa8\xbe'), 421 ('keys/test-public-ec-named-der.key', b'#\x8d\xee\xeeGH*\xe45T\xb8\xfdVh\x16_\xe2\xaa\xcd\x81'), 422 ('keys/test-public-ec-der.key', b'T\xaaTpl4\x1am\xeb]\x97\xd7\x1e\xfc\xd5$<\x8a\x0e\xd7'), 423 ) 424 425 @data('key_sha1_hashes') 426 def sha1(self, relative_path, sha1): 427 with open(os.path.join(fixtures_dir, relative_path), 'rb') as f: 428 public_key = keys.PublicKeyInfo.load(f.read()) 429 430 self.assertEqual(sha1, public_key.sha1) 431 432 @staticmethod 433 def key_sha256_hashes(): 434 return ( 435 ( 436 'keys/test-public-der.key', 437 b'\xd9\x80\xdf\x94J\x8e\x1e\xf5z\xd2o\x8eS\xa8\x03qX\x9a[\x17g\x12\x89\xc5\xcc\xca\x04\x94\xf2R|F' 438 ), 439 ( 440 'keys/test-public-dsa-der.key', 441 b'<\x10X\xbf=\xe4\xec3\xb9\xb2 \x11\xce9\xca\xd4\x95\xcf\xf9\xbc\x91q]O\x8f4\xbf\xdb\xdc\xe2\xd6\x82' 442 ), 443 ( 444 'keys/test-public-ec-named-der.key', 445 b'\x87e \xb4\x13\x8cu\xdd\x11\x92\xa4\xd9;\x8e\xe5"p\xb2\xb7\xa7\xcb8\x88\x16;f\xb9\xf8I\x86J\x1c' 446 ), 447 ( 448 'keys/test-public-ec-der.key', 449 b'\xf3\xa3k\xe0\xbf\xa9\xd9sl\xaa\x99\xe7\x9c-\xec\xb9\x0e\xe2d\xe9\xc3$\xb9\x893\x99A\xc19ec_' 450 ), 451 ) 452 453 @data('key_sha256_hashes') 454 def sha256(self, relative_path, sha256): 455 with open(os.path.join(fixtures_dir, relative_path), 'rb') as f: 456 public_key = keys.PublicKeyInfo.load(f.read()) 457 458 self.assertEqual(sha256, public_key.sha256) 459 460 @staticmethod 461 def key_pairs(): 462 return ( 463 ( 464 'dsa', 465 'keys/test-pkcs8-dsa-der.key', 466 'keys/test-public-dsa-der.key', 467 'dsa', 468 3072 469 ), 470 ( 471 'ec_named', 472 'keys/test-pkcs8-ec-named-der.key', 473 'keys/test-public-ec-named-der.key', 474 'ec', 475 256 476 ), 477 ( 478 'ec', 479 'keys/test-pkcs8-ec-der.key', 480 'keys/test-public-ec-der.key', 481 'ec', 482 256 483 ), 484 ( 485 'rsa', 486 'keys/test-pkcs8-der.key', 487 'keys/test-public-der.key', 488 'rsa', 489 2048 490 ), 491 ) 492 493 @data('key_pairs', True) 494 def algorithm_name(self, private_key_file, public_key_file, algorithm, _): 495 with open(os.path.join(fixtures_dir, private_key_file), 'rb') as f: 496 private_key = keys.PrivateKeyInfo.load(f.read()) 497 with open(os.path.join(fixtures_dir, public_key_file), 'rb') as f: 498 public_key = keys.PublicKeyInfo.load(f.read()) 499 500 self.assertEqual(algorithm, private_key.algorithm) 501 self.assertEqual(algorithm, public_key.algorithm) 502 503 @data('key_pairs', True) 504 def bit_size(self, private_key_file, public_key_file, _, bit_size): 505 with open(os.path.join(fixtures_dir, private_key_file), 'rb') as f: 506 private_key = keys.PrivateKeyInfo.load(f.read()) 507 with open(os.path.join(fixtures_dir, public_key_file), 'rb') as f: 508 public_key = keys.PublicKeyInfo.load(f.read()) 509 510 self.assertIsInstance(private_key.bit_size, int_types) 511 self.assertEqual(bit_size, private_key.bit_size) 512 self.assertIsInstance(public_key.bit_size, int_types) 513 self.assertEqual(bit_size, public_key.bit_size) 514 515 @staticmethod 516 def key_variations(): 517 return ( 518 ( 519 'dsa', 520 'keys/test-pkcs8-dsa-der.key', 521 'keys/test-dsa-der.key', 522 ), 523 ( 524 'ec_named', 525 'keys/test-pkcs8-ec-named-der.key', 526 'keys/test-ec-named-der.key', 527 ), 528 ( 529 'ec', 530 'keys/test-pkcs8-ec-der.key', 531 'keys/test-ec-der.key', 532 ), 533 ( 534 'rsa', 535 'keys/test-pkcs8-der.key', 536 'keys/test-der.key', 537 ), 538 ) 539 540 def test_curve_invalid(self): 541 with open(os.path.join(fixtures_dir, 'keys/test-pkcs8-der.key'), 'rb') as f: 542 private_key = keys.PrivateKeyInfo.load(f.read()) 543 544 with self.assertRaises(ValueError): 545 private_key.curve 546 547 with open(os.path.join(fixtures_dir, 'keys/test-public-rsa-der.key'), 'rb') as f: 548 public_key = keys.PublicKeyInfo.load(f.read()) 549 550 with self.assertRaises(ValueError): 551 public_key.curve 552 553 def test_curve_info_name(self): 554 with open(os.path.join(fixtures_dir, 'keys/test-pkcs8-ec-named-der.key'), 'rb') as f: 555 private_key = keys.PrivateKeyInfo.load(f.read()) 556 557 curve = ('named', 'secp256r1') 558 559 self.assertEqual(curve, private_key.curve) 560 561 with open(os.path.join(fixtures_dir, 'keys/test-public-ec-named-der.key'), 'rb') as f: 562 public_key = keys.PublicKeyInfo.load(f.read()) 563 564 self.assertEqual(curve, public_key.curve) 565 566 def test_curve_info_specified(self): 567 with open(os.path.join(fixtures_dir, 'keys/test-pkcs8-ec-der.key'), 'rb') as f: 568 private_key = keys.PrivateKeyInfo.load(f.read()) 569 570 curve = ( 571 'specified', 572 util.OrderedDict([ 573 ('version', 'ecdpVer1'), 574 ( 575 'field_id', 576 util.OrderedDict([ 577 ('field_type', 'prime_field'), 578 ('parameters', 115792089210356248762697446949407573530086143415290314195533631308867097853951) 579 ]) 580 ), 581 ( 582 'curve', 583 util.OrderedDict([ 584 ( 585 'a', 586 b'\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00' 587 b'\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC' 588 ), 589 ( 590 'b', 591 b'\x5A\xC6\x35\xD8\xAA\x3A\x93\xE7\xB3\xEB\xBD\x55\x76\x98\x86\xBC' 592 b'\x65\x1D\x06\xB0\xCC\x53\xB0\xF6\x3B\xCE\x3C\x3E\x27\xD2\x60\x4B' 593 ), 594 ( 595 'seed', 596 b'\xC4\x9D\x36\x08\x86\xE7\x04\x93\x6A\x66\x78\xE1\x13\x9D\x26\xB7\x81\x9F\x7E\x90' 597 ), 598 ]) 599 ), 600 ( 601 'base', 602 b'\x04\x6B\x17\xD1\xF2\xE1\x2C\x42\x47\xF8\xBC\xE6\xE5\x63\xA4\x40\xF2\x77\x03\x7D' 603 b'\x81\x2D\xEB\x33\xA0\xF4\xA1\x39\x45\xD8\x98\xC2\x96\x4F\xE3\x42\xE2\xFE\x1A\x7F' 604 b'\x9B\x8E\xE7\xEB\x4A\x7C\x0F\x9E\x16\x2B\xCE\x33\x57\x6B\x31\x5E\xCE\xCB\xB6\x40' 605 b'\x68\x37\xBF\x51\xF5' 606 ), 607 ( 608 'order', 609 115792089210356248762697446949407573529996955224135760342422259061068512044369 610 ), 611 ('cofactor', 1), 612 ('hash', None), 613 ]) 614 ) 615 616 self.assertEqual(curve, private_key.curve) 617 618 with open(os.path.join(fixtures_dir, 'keys/test-public-ec-der.key'), 'rb') as f: 619 public_key = keys.PublicKeyInfo.load(f.read()) 620 621 self.assertEqual(curve, public_key.curve) 622 623 def test_named_curve_register(self): 624 keys.NamedCurve.register('customcurve', '1.2.3.4.5.6.7.8', 16) 625 626 k = keys.NamedCurve('customcurve') 627 self.assertEqual('customcurve', k.native) 628 self.assertEqual('1.2.3.4.5.6.7.8', k.dotted) 629 630 k = keys.ECPrivateKey({ 631 'version': 1, 632 'private_key': 1, 633 'parameters': keys.ECDomainParameters(('named', 'customcurve')), 634 }) 635 636 self.assertEqual('ecPrivkeyVer1', k['version'].native) 637 self.assertEqual(1, k['private_key'].native) 638 self.assertEqual('customcurve', k['parameters'].native) 639 self.assertEqual( 640 b'\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', 641 k['private_key'].dump() 642 ) 643 644 def test_ec_private_key_width(self): 645 k = keys.ECPrivateKey({ 646 'version': 1, 647 'private_key': 1, 648 'parameters': keys.ECDomainParameters(('named', 'secp256r1')), 649 }) 650 651 self.assertEqual('ecPrivkeyVer1', k['version'].native) 652 self.assertEqual(1, k['private_key'].native) 653 self.assertEqual('secp256r1', k['parameters'].native) 654 self.assertEqual( 655 b'\x04\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 656 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', 657 k['private_key'].dump() 658 ) 659 660 def test_ec_private_key_width_dotted(self): 661 k = keys.ECPrivateKey({ 662 'version': 1, 663 'private_key': 1, 664 'parameters': keys.ECDomainParameters(('named', '1.3.132.0.10')), 665 }) 666 667 self.assertEqual('ecPrivkeyVer1', k['version'].native) 668 self.assertEqual(1, k['private_key'].native) 669 self.assertEqual('secp256k1', k['parameters'].native) 670 self.assertEqual( 671 b'\x04\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 672 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', 673 k['private_key'].dump() 674 ) 675 676 def test_ec_private_key_info_width(self): 677 pki = keys.PrivateKeyInfo({ 678 'version': 0, 679 'private_key_algorithm': { 680 'algorithm': 'ec', 681 'parameters': ('named', 'secp256r1'), 682 }, 683 'private_key': { 684 'version': 1, 685 'private_key': 1 686 } 687 }) 688 689 k = pki['private_key'].parsed 690 self.assertEqual('ecPrivkeyVer1', k['version'].native) 691 self.assertEqual(1, k['private_key'].native) 692 self.assertEqual(None, k['parameters'].native) 693 self.assertEqual( 694 b'\x04\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 695 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', 696 k['private_key'].dump() 697 ) 698