@@ -18,14 +18,16 @@ describe("JoseUtil", function() {
1818
1919 const expectedIssuer = "https://localhost:44333/core" ;
2020 const expectedAudience = "js.tokenmanager" ;
21- const expires = 1459130201 ;
2221 const notBefore = 1459129901 ;
22+ const issuedAt = notBefore ;
23+ const expires = 1459130201 ;
24+
2325 const expectedNow = notBefore ;
2426
2527 beforeEach ( function ( ) {
2628 Log . logger = console ;
2729 Log . level = Log . NONE ;
28-
30+
2931 jwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSIsImtpZCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSJ9.eyJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo0NDMzMy9jb3JlIiwiYXVkIjoianMudG9rZW5tYW5hZ2VyIiwiZXhwIjoxNDU5MTMwMjAxLCJuYmYiOjE0NTkxMjk5MDEsIm5vbmNlIjoiNzIyMTAwNTIwOTk3MjM4MiIsImlhdCI6MTQ1OTEyOTkwMSwiYXRfaGFzaCI6IkpnRFVDeW9hdEp5RW1HaWlXYndPaEEiLCJzaWQiOiIwYzVmMDYxZTYzOThiMWVjNmEwYmNlMmM5NDFlZTRjNSIsInN1YiI6Ijg4NDIxMTEzIiwiYXV0aF90aW1lIjoxNDU5MTI5ODk4LCJpZHAiOiJpZHNydiIsImFtciI6WyJwYXNzd29yZCJdfQ.f6S1Fdd0UQScZAFBzXwRiVsUIPQnWZLSe07kdtjANRZDZXf5A7yDtxOftgCx5W0ONQcDFVpLGPgTdhp7agZkPpCFutzmwr0Rr9G7E7mUN4xcIgAABhmRDfzDayFBEu6VM8wEWTChezSWtx2xG_2zmVJxxmNV0jvkaz0bu7iin-C_UZg6T-aI9FZDoKRGXZP9gF65FQ5pQ4bCYQxhKcvjjUfs0xSHGboL7waN6RfDpO4vvVR1Kz-PQhIRyFAJYRuoH4PdMczHYtFCb-k94r-7TxEU0vp61ww4WntbPvVWwUbCUgsEtmDzAZT-NEJVhWztNk1ip9wDPXzZ2hEhDAPJ7A" ;
3032
3133 jwtFromRsa = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSIsImtpZCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSJ9.eyJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo0NDMzMy9jb3JlIiwiYXVkIjoianMudG9rZW5tYW5hZ2VyIiwiZXhwIjoxNDU5MTMwMjAxLCJuYmYiOjE0NTkxMjk5MDEsIm5vbmNlIjoiNzIyMTAwNTIwOTk3MjM4MiIsImlhdCI6MTQ1OTEyOTkwMSwiYXRfaGFzaCI6IkpnRFVDeW9hdEp5RW1HaWlXYndPaEEiLCJzaWQiOiIwYzVmMDYxZTYzOThiMWVjNmEwYmNlMmM5NDFlZTRjNSIsInN1YiI6Ijg4NDIxMTEzIiwiYXV0aF90aW1lIjoxNDU5MTI5ODk4LCJpZHAiOiJpZHNydiIsImFtciI6WyJwYXNzd29yZCJdfQ.f6S1Fdd0UQScZAFBzXwRiVsUIPQnWZLSe07kdtjANRZDZXf5A7yDtxOftgCx5W0ONQcDFVpLGPgTdhp7agZkPpCFutzmwr0Rr9G7E7mUN4xcIgAABhmRDfzDayFBEu6VM8wEWTChezSWtx2xG_2zmVJxxmNV0jvkaz0bu7iin-C_UZg6T-aI9FZDoKRGXZP9gF65FQ5pQ4bCYQxhKcvjjUfs0xSHGboL7waN6RfDpO4vvVR1Kz-PQhIRyFAJYRuoH4PdMczHYtFCb-k94r-7TxEU0vp61ww4WntbPvVWwUbCUgsEtmDzAZT-NEJVhWztNk1ip9wDPXzZ2hEhDAPJ7A" ;
@@ -107,7 +109,7 @@ describe("JoseUtil", function() {
107109 delete rsaKey . n ;
108110 delete rsaKey . e ;
109111
110- var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , expectedNow ) ;
112+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 0 , expectedNow ) ;
111113 result . should . be . true ;
112114
113115 } ) ;
@@ -118,7 +120,7 @@ describe("JoseUtil", function() {
118120
119121 delete rsaKey . x5c ;
120122
121- var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , expectedNow ) ;
123+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 0 , expectedNow ) ;
122124 result . should . be . true ;
123125
124126 } ) ;
@@ -127,42 +129,97 @@ describe("JoseUtil", function() {
127129
128130 rsaKey . kty = "foo" ;
129131
130- var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , expectedNow ) ;
132+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 0 , expectedNow ) ;
131133 result . should . be . false ;
132134
133135 } ) ;
134136
135137 it ( "should fail for mismatched keys" , function ( ) {
136138
137- var result = JoseUtil . validateJwt ( jwtFromRsa , ecKey , expectedIssuer , expectedAudience , expectedNow ) ;
139+ var result = JoseUtil . validateJwt ( jwtFromRsa , ecKey , expectedIssuer , expectedAudience , 0 , expectedNow ) ;
138140 result . should . be . false ;
139141
140142 } ) ;
141143
142- it ( "should not validate after exp " , function ( ) {
144+ it ( "should not validate before nbf " , function ( ) {
143145
144- var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , expires + 1 ) ;
146+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 0 , notBefore - 1 ) ;
145147 result . should . be . false ;
146148
147149 } ) ;
150+
151+ it ( "should allow nbf within clock skew" , function ( ) {
152+
153+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , notBefore - 1 ) ;
154+ result . should . be . true ;
148155
149- it ( "should not validate before nbf" , function ( ) {
156+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , notBefore - 10 ) ;
157+ result . should . be . true ;
158+ } ) ;
150159
151- var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , notBefore - 1 ) ;
160+ it ( "should now allow nbf outside clock skew" , function ( ) {
161+
162+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , notBefore - 11 ) ;
152163 result . should . be . false ;
153164
154165 } ) ;
166+
167+ it ( "should not validate before iat" , function ( ) {
168+
169+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 0 , issuedAt - 1 ) ;
170+ result . should . be . false ;
171+
172+ } ) ;
173+
174+ it ( "should allow iat within clock skew" , function ( ) {
175+
176+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , issuedAt - 1 ) ;
177+ result . should . be . true ;
178+
179+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , issuedAt - 10 ) ;
180+ result . should . be . true ;
181+ } ) ;
155182
183+ it ( "should now allow iat outside clock skew" , function ( ) {
184+
185+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , issuedAt - 11 ) ;
186+ result . should . be . false ;
187+
188+ } ) ;
189+
190+ it ( "should not validate after exp" , function ( ) {
191+
192+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 0 , expires + 1 ) ;
193+ result . should . be . false ;
194+
195+ } ) ;
196+
197+ it ( "should allow exp within clock skew" , function ( ) {
198+
199+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , expires + 1 ) ;
200+ result . should . be . true ;
201+
202+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , expires + 10 ) ;
203+ result . should . be . true ;
204+ } ) ;
205+
206+ it ( "should now allow exp outside clock skew" , function ( ) {
207+
208+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , expectedAudience , 10 , expires + 11 ) ;
209+ result . should . be . false ;
210+
211+ } ) ;
212+
156213 it ( "should not validate for invalid audience" , function ( ) {
157214
158- var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , "invalid aud" , expectedNow ) ;
215+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , expectedIssuer , "invalid aud" , 0 , expectedNow ) ;
159216 result . should . be . false ;
160217
161218 } ) ;
162219
163220 it ( "should not validate for invalid issuer" , function ( ) {
164221
165- var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , "invalid issuer" , expectedAudience , expectedNow ) ;
222+ var result = JoseUtil . validateJwt ( jwtFromRsa , rsaKey , "invalid issuer" , expectedAudience , 0 , expectedNow ) ;
166223 result . should . be . false ;
167224
168225 } ) ;
0 commit comments