7
7
from mock import patch
8
8
9
9
from jose import jws
10
- from py_vapid import Vapid , VapidException
10
+ from py_vapid import Vapid01 , Vapid02 , VapidException
11
11
12
12
T_DER = """
13
13
MHcCAQEEIPeN1iAipHbt8+/KZ2NIF8NeN24jqAmnMLFZEMocY8RboAoGCCqGSM49
@@ -43,54 +43,57 @@ def tearDown(self):
43
43
44
44
class VapidTestCase (unittest .TestCase ):
45
45
def test_init (self ):
46
- v1 = Vapid (private_key_file = "/tmp/private" )
46
+ v1 = Vapid01 (private_key_file = "/tmp/private" )
47
47
eq_ (v1 .private_key .to_pem (), T_PRIVATE )
48
48
eq_ (v1 .public_key .to_pem (), T_PUBLIC )
49
- v2 = Vapid (private_key = T_PRIVATE )
49
+ v2 = Vapid01 (private_key = T_PRIVATE )
50
50
eq_ (v2 .private_key .to_pem (), T_PRIVATE )
51
51
eq_ (v2 .public_key .to_pem (), T_PUBLIC )
52
- v3 = Vapid (private_key = T_DER )
52
+ v3 = Vapid01 (private_key = T_DER )
53
53
eq_ (v3 .private_key .to_pem (), T_PRIVATE )
54
54
eq_ (v3 .public_key .to_pem (), T_PUBLIC )
55
55
no_exist = '/tmp/not_exist'
56
- Vapid (private_key_file = no_exist )
56
+ Vapid01 (private_key_file = no_exist )
57
57
ok_ (os .path .isfile (no_exist ))
58
58
os .unlink (no_exist )
59
59
60
+ def repad (self , data ):
61
+ return data + b"====" [:len (data ) % 4 ]
62
+
60
63
@patch ("ecdsa.SigningKey.from_pem" , side_effect = Exception )
61
64
def test_init_bad_priv (self , mm ):
62
65
self .assertRaises (Exception ,
63
- Vapid ,
66
+ Vapid01 ,
64
67
private_key_file = "/tmp/private" )
65
68
66
69
def test_private (self ):
67
- v = Vapid ()
70
+ v = Vapid01 ()
68
71
self .assertRaises (VapidException , lambda x = None : v .private_key )
69
72
70
73
def test_public (self ):
71
- v = Vapid ()
74
+ v = Vapid01 ()
72
75
73
76
self .assertRaises (VapidException , lambda x = None : v .public_key )
74
77
75
78
def test_gen_key (self ):
76
- v = Vapid ()
79
+ v = Vapid01 ()
77
80
v .generate_keys ()
78
81
ok_ (v .public_key )
79
82
ok_ (v .private_key )
80
83
81
84
def test_save_key (self ):
82
- v = Vapid ()
85
+ v = Vapid01 ()
83
86
v .save_key ("/tmp/p2" )
84
87
os .unlink ("/tmp/p2" )
85
88
86
89
def test_save_public_key (self ):
87
- v = Vapid ()
90
+ v = Vapid01 ()
88
91
v .generate_keys ()
89
92
v .save_public_key ("/tmp/p2" )
90
93
os .unlink ("/tmp/p2" )
91
94
92
95
def test_validate (self ):
93
- v = Vapid ("/tmp/private" )
96
+ v = Vapid01 ("/tmp/private" )
94
97
msg = "foobar"
95
98
vtoken = v .validate (msg )
96
99
ok_ (v .public_key .verify (base64 .urlsafe_b64decode (vtoken ),
@@ -99,8 +102,8 @@ def test_validate(self):
99
102
# test verify
100
103
ok_ (v .verify_token (msg , vtoken ))
101
104
102
- def test_sign (self ):
103
- v = Vapid ("/tmp/private" )
105
+ def test_sign_01 (self ):
106
+ v = Vapid01 ("/tmp/private" )
104
107
claims = {
"aud" :
"example.com" ,
"sub" :
"[email protected] " }
105
108
result = v .sign (claims , "id=previous" )
106
109
eq_ (result ['Crypto-Key' ],
@@ -114,8 +117,29 @@ def test_sign(self):
114
117
eq_ (result ['Crypto-Key' ],
115
118
'p256ecdsa=' + T_PUBLIC_RAW )
116
119
120
+ def test_sign_02 (self ):
121
+ v = Vapid02 ("/tmp/private" )
122
+ claims = {"aud" : "example.com" ,
123
+
124
+ "foo" : "extra value" }
125
+ result = v .sign (claims , "id=previous" )
126
+ auth = result ['Authorization' ]
127
+ eq_ (auth [:6 ], 'vapid ' )
128
+ ok_ (' t=' in auth )
129
+ ok_ (',k=' in auth )
130
+ parts = auth [6 :].split (',' )
131
+ eq_ (len (parts ), 2 )
132
+ t_val = json .loads (base64 .urlsafe_b64decode (
133
+ self .repad (parts [0 ][2 :].split ('.' )[1 ])
134
+ ))
135
+ k_val = base64 .urlsafe_b64decode (self .repad (parts [1 ][2 :]))
136
+ eq_ (k_val [0 ], "\04 " )
137
+ eq_ (len (k_val ), 65 )
138
+ for k in claims :
139
+ eq_ (t_val [k ], claims [k ])
140
+
117
141
def test_bad_sign (self ):
118
- v = Vapid ("/tmp/private" )
142
+ v = Vapid01 ("/tmp/private" )
119
143
self .assertRaises (VapidException ,
120
144
v .sign ,
121
145
{'aud' : "p.example.com" })
0 commit comments