1010from jose import jws
1111from py_vapid import Vapid01 , Vapid02 , VapidException
1212
13+ # This is a private key in DER form.
1314T_DER = """
1415MHcCAQEEIPeN1iAipHbt8+/KZ2NIF8NeN24jqAmnMLFZEMocY8RboAoGCCqGSM49
1516AwEHoUQDQgAEEJwJZq/GN8jJbo1GGpyU70hmP2hbWAUpQFKDByKB81yldJ9GTklB
1617M5xqEwuPM7VuQcyiLDhvovthPIXx+gsQRQ==
1718"""
19+
20+ # This is the same private key, in PEM form.
1821T_PRIVATE = ("-----BEGIN EC PRIVATE KEY-----{}"
1922 "-----END EC PRIVATE KEY-----\n " ).format (T_DER )
2023
24+ # This is the same private key, as a point in uncompressed form. This should
25+ # be Base64url-encoded without padding.
26+ T_RAW = """
27+ 943WICKkdu3z78pnY0gXw143biOoCacwsVkQyhxjxFs
28+ """
29+
30+ # This is a public key in PEM form.
2131T_PUBLIC = """-----BEGIN PUBLIC KEY-----
2232MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEJwJZq/GN8jJbo1GGpyU70hmP2hb
2333WAUpQFKDByKB81yldJ9GTklBM5xqEwuPM7VuQcyiLDhvovthPIXx+gsQRQ==
2434-----END PUBLIC KEY-----
2535"""
2636
27- # this is a DER RAW key ('\x04' + 2 32 octet digits )
37+ # this is a public key in uncompressed form ('\x04' + 2 * 32 octets )
2838# Remember, this should have any padding stripped.
2939T_PUBLIC_RAW = (
3040 "BBCcCWavxjfIyW6NRhqclO9IZj9oW1gFKUBSgwcigfNc"
3343
3444
3545def setUp (self ):
36- ff = open ('/tmp/private' , 'w' )
37- ff .write (T_PRIVATE )
38- ff . close ()
39- ff = open ( '/tmp/public' , 'w' )
40- ff . write ( T_PUBLIC )
41- ff .close ( )
46+ with open ('/tmp/private' , 'w' ) as ff :
47+ ff .write (T_PRIVATE )
48+ with open ( '/tmp/public' , 'w' ) as ff :
49+ ff . write ( T_PUBLIC )
50+ with open ( '/tmp/private.der' , 'w' ) as ff :
51+ ff .write ( T_DER )
4252
4353
4454def tearDown (self ):
@@ -48,17 +58,20 @@ def tearDown(self):
4858
4959class VapidTestCase (unittest .TestCase ):
5060 def test_init (self ):
51- v1 = Vapid01 ( private_key_file = "/tmp/private" )
61+ v1 = Vapid01 . from_file ( "/tmp/private" )
5262 eq_ (v1 .private_key .to_pem (), T_PRIVATE .encode ('utf8' ))
5363 eq_ (v1 .public_key .to_pem (), T_PUBLIC .encode ('utf8' ))
54- v2 = Vapid01 ( private_key = T_PRIVATE )
64+ v2 = Vapid01 . from_pem ( T_PRIVATE )
5565 eq_ (v2 .private_key .to_pem (), T_PRIVATE .encode ('utf8' ))
5666 eq_ (v2 .public_key .to_pem (), T_PUBLIC .encode ('utf8' ))
57- v3 = Vapid01 ( private_key = T_DER )
67+ v3 = Vapid01 . from_der ( T_DER )
5868 eq_ (v3 .private_key .to_pem (), T_PRIVATE .encode ('utf8' ))
5969 eq_ (v3 .public_key .to_pem (), T_PUBLIC .encode ('utf8' ))
70+ v4 = Vapid01 .from_file ("/tmp/private.der" )
71+ eq_ (v4 .private_key .to_pem (), T_PRIVATE .encode ('utf8' ))
72+ eq_ (v4 .public_key .to_pem (), T_PUBLIC .encode ('utf8' ))
6073 no_exist = '/tmp/not_exist'
61- Vapid01 ( private_key_file = no_exist )
74+ Vapid01 . from_file ( no_exist )
6275 ok_ (os .path .isfile (no_exist ))
6376 os .unlink (no_exist )
6477
@@ -68,7 +81,7 @@ def repad(self, data):
6881 @patch ("ecdsa.SigningKey.from_pem" , side_effect = Exception )
6982 def test_init_bad_priv (self , mm ):
7083 self .assertRaises (Exception ,
71- Vapid01 ,
84+ Vapid01 . from_file ,
7285 private_key_file = "/tmp/private" )
7386
7487 def test_private (self ):
@@ -97,8 +110,13 @@ def test_same_public_key(self):
97110 v .save_public_key ("/tmp/p2" )
98111 os .unlink ("/tmp/p2" )
99112
113+ def test_from_raw (self ):
114+ v = Vapid01 .from_raw (T_RAW )
115+ eq_ (v .private_key .to_pem (), T_PRIVATE .encode ('utf8' ))
116+ eq_ (v .public_key .to_pem (), T_PUBLIC .encode ('utf8' ))
117+
100118 def test_validate (self ):
101- v = Vapid01 ("/tmp/private" )
119+ v = Vapid01 . from_file ("/tmp/private" )
102120 msg = "foobar" .encode ('utf8' )
103121 vtoken = v .validate (msg )
104122 ok_ (v .public_key .verify (base64 .urlsafe_b64decode (vtoken ),
@@ -108,7 +126,7 @@ def test_validate(self):
108126 ok_ (v .verify_token (msg , vtoken ))
109127
110128 def test_sign_01 (self ):
111- v = Vapid01 ("/tmp/private" )
129+ v = Vapid01 . from_file ("/tmp/private" )
112130 claims = {
"aud" :
"example.com" ,
"sub" :
"[email protected] " }
113131 result = v .sign (claims , "id=previous" )
114132 eq_ (result ['Crypto-Key' ],
@@ -123,7 +141,7 @@ def test_sign_01(self):
123141 'p256ecdsa=' + T_PUBLIC_RAW )
124142
125143 def test_sign_02 (self ):
126- v = Vapid02 ("/tmp/private" )
144+ v = Vapid02 . from_file ("/tmp/private" )
127145 claims = {"aud" : "example.com" ,
128146129147 "foo" : "extra value" }
@@ -144,7 +162,7 @@ def test_sign_02(self):
144162 eq_ (t_val [k ], claims [k ])
145163
146164 def test_bad_sign (self ):
147- v = Vapid01 ("/tmp/private" )
165+ v = Vapid01 . from_file ("/tmp/private" )
148166 self .assertRaises (VapidException ,
149167 v .sign ,
150168 {'aud' : "p.example.com" })
0 commit comments