3
3
ValidationParams
4
4
} from './validation-handler' ;
5
5
6
- import * as rs from 'jsrsasign' ;
7
-
8
6
/**
9
7
* Validates the signature of an id_token against one
10
8
* of the keys of an JSON Web Key Set (jwks).
@@ -35,7 +33,10 @@ export class JwksValidationHandler extends AbstractValidationHandler {
35
33
*/
36
34
gracePeriodInSec = 600 ;
37
35
38
- validateSignature ( params : ValidationParams , retry = false ) : Promise < any > {
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 > {
39
40
if ( ! params . idToken ) throw new Error ( 'Parameter idToken expected!' ) ;
40
41
if ( ! params . idTokenHeader )
41
42
throw new Error ( 'Parameter idTokenHandler expected.' ) ;
@@ -50,8 +51,8 @@ export class JwksValidationHandler extends AbstractValidationHandler {
50
51
}
51
52
52
53
let kid : string = params . idTokenHeader [ 'kid' ] ;
53
- let keys : object [ ] = params . jwks [ 'keys' ] ;
54
- let key : object ;
54
+ let keys : JsonWebKey [ ] = params . jwks [ 'keys' ] ;
55
+ let key : JsonWebKey ;
55
56
56
57
let alg = params . idTokenHeader [ 'alg' ] ;
57
58
@@ -98,20 +99,14 @@ export class JwksValidationHandler extends AbstractValidationHandler {
98
99
return Promise . reject ( error ) ;
99
100
}
100
101
101
- let keyObj = rs . KEYUTIL . getKey ( key ) ;
102
- let validationOptions = {
103
- alg : this . allowedAlgorithms ,
104
- gracePeriod : this . gracePeriodInSec
105
- } ;
106
- let isValid = rs . KJUR . jws . JWS . verifyJWT (
107
- params . idToken ,
108
- keyObj ,
109
- validationOptions
110
- ) ;
111
-
112
- if ( isValid ) {
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 ) {
113
108
return Promise . resolve ( ) ;
114
- } else {
109
+ } else {
115
110
return Promise . reject ( 'Signature not valid' ) ;
116
111
}
117
112
}
@@ -127,11 +122,11 @@ export class JwksValidationHandler extends AbstractValidationHandler {
127
122
}
128
123
}
129
124
130
- calcHash ( valueToHash : string , algorithm : string ) : string {
131
- let hashAlg = new rs . KJUR . crypto . MessageDigest ( { alg : algorithm } ) ;
132
- let result = hashAlg . digestString ( valueToHash ) ;
133
- let byteArrayAsString = this . toByteArrayAsString ( result ) ;
134
- return byteArrayAsString ;
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 ) ) ;
135
130
}
136
131
137
132
toByteArrayAsString ( hexString : string ) {
0 commit comments