@@ -3,6 +3,11 @@ import {
3
3
ValidationParams
4
4
} from './validation-handler' ;
5
5
6
+ // declare var require: any;
7
+ // let rs = require('jsrsasign');
8
+
9
+ import * as rs from 'jsrsasign' ;
10
+
6
11
/**
7
12
* Validates the signature of an id_token against one
8
13
* of the keys of an JSON Web Key Set (jwks).
@@ -33,10 +38,7 @@ export class JwksValidationHandler extends AbstractValidationHandler {
33
38
*/
34
39
gracePeriodInSec = 600 ;
35
40
36
- private cyptoObj : Crypto = window . crypto || ( window as any ) . msCrypto // for IE11
37
- private textEncoder = new ( window as any ) . TextEncoder ( ) ;
38
-
39
- async validateSignature ( params : ValidationParams , retry = false ) : Promise < any > {
41
+ validateSignature ( params : ValidationParams , retry = false ) : Promise < any > {
40
42
if ( ! params . idToken ) throw new Error ( 'Parameter idToken expected!' ) ;
41
43
if ( ! params . idTokenHeader )
42
44
throw new Error ( 'Parameter idTokenHandler expected.' ) ;
@@ -50,9 +52,11 @@ export class JwksValidationHandler extends AbstractValidationHandler {
50
52
throw new Error ( 'Array keys in jwks missing!' ) ;
51
53
}
52
54
55
+ // console.debug('validateSignature: retry', retry);
56
+
53
57
let kid : string = params . idTokenHeader [ 'kid' ] ;
54
- let keys : JsonWebKey [ ] = params . jwks [ 'keys' ] ;
55
- let key : JsonWebKey ;
58
+ let keys : object [ ] = params . jwks [ 'keys' ] ;
59
+ let key : object ;
56
60
57
61
let alg = params . idTokenHeader [ 'alg' ] ;
58
62
@@ -64,6 +68,12 @@ export class JwksValidationHandler extends AbstractValidationHandler {
64
68
k => k [ 'kty' ] === kty && k [ 'use' ] === 'sig'
65
69
) ;
66
70
71
+ /*
72
+ if (matchingKeys.length == 0) {
73
+ let error = 'No matching key found.';
74
+ console.error(error);
75
+ return Promise.reject(error);
76
+ }*/
67
77
if ( matchingKeys . length > 1 ) {
68
78
let error =
69
79
'More than one matching key found. Please specify a kid in the id_token header.' ;
@@ -99,14 +109,20 @@ export class JwksValidationHandler extends AbstractValidationHandler {
99
109
return Promise . reject ( error ) ;
100
110
}
101
111
102
- const [ header , body , sig ] = params . idToken . split ( ',' ) ;
103
-
104
- const cyptokey = await this . cyptoObj . subtle . importKey ( 'jwk' , key as any , alg , true , [ 'verify' ] ) ;
105
- const isValid = await this . cyptoObj . subtle . verify ( alg , cyptokey , this . textEncoder . encode ( sig ) , this . textEncoder . encode ( body ) ) ;
106
-
107
- if ( isValid ) {
112
+ let keyObj = rs . KEYUTIL . getKey ( key ) ;
113
+ let validationOptions = {
114
+ alg : this . allowedAlgorithms ,
115
+ gracePeriod : this . gracePeriodInSec
116
+ } ;
117
+ let isValid = rs . KJUR . jws . JWS . verifyJWT (
118
+ params . idToken ,
119
+ keyObj ,
120
+ validationOptions
121
+ ) ;
122
+
123
+ if ( isValid ) {
108
124
return Promise . resolve ( ) ;
109
- } else {
125
+ } else {
110
126
return Promise . reject ( 'Signature not valid' ) ;
111
127
}
112
128
}
@@ -122,11 +138,11 @@ export class JwksValidationHandler extends AbstractValidationHandler {
122
138
}
123
139
}
124
140
125
- async calcHash ( valueToHash : string , algorithm : string ) : Promise < string > {
126
- const valueAsBytes = this . textEncoder . encode ( valueToHash ) ;
127
- const resultBytes = await this . cyptoObj . subtle . digest ( algorithm , valueAsBytes ) ;
128
- // the returned bytes are encoded as UTF-16
129
- return String . fromCharCode . apply ( null , new Uint16Array ( resultBytes ) ) ;
141
+ calcHash ( valueToHash : string , algorithm : string ) : Promise < string > {
142
+ let hashAlg = new rs . KJUR . crypto . MessageDigest ( { alg : algorithm } ) ;
143
+ let result = hashAlg . digestString ( valueToHash ) ;
144
+ let byteArrayAsString = this . toByteArrayAsString ( result ) ;
145
+ return Promise . resolve ( byteArrayAsString ) ;
130
146
}
131
147
132
148
toByteArrayAsString ( hexString : string ) {
@@ -138,4 +154,4 @@ export class JwksValidationHandler extends AbstractValidationHandler {
138
154
}
139
155
return result ;
140
156
}
141
- }
157
+ }
0 commit comments