@@ -3,6 +3,11 @@ import {
33 ValidationParams
44} from './validation-handler' ;
55
6+ // declare var require: any;
7+ // let rs = require('jsrsasign');
8+
9+ import * as rs from 'jsrsasign' ;
10+
611/**
712 * Validates the signature of an id_token against one
813 * of the keys of an JSON Web Key Set (jwks).
@@ -33,10 +38,7 @@ export class JwksValidationHandler extends AbstractValidationHandler {
3338 */
3439 gracePeriodInSec = 600 ;
3540
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 > {
4042 if ( ! params . idToken ) throw new Error ( 'Parameter idToken expected!' ) ;
4143 if ( ! params . idTokenHeader )
4244 throw new Error ( 'Parameter idTokenHandler expected.' ) ;
@@ -50,9 +52,11 @@ export class JwksValidationHandler extends AbstractValidationHandler {
5052 throw new Error ( 'Array keys in jwks missing!' ) ;
5153 }
5254
55+ // console.debug('validateSignature: retry', retry);
56+
5357 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 ;
5660
5761 let alg = params . idTokenHeader [ 'alg' ] ;
5862
@@ -64,6 +68,12 @@ export class JwksValidationHandler extends AbstractValidationHandler {
6468 k => k [ 'kty' ] === kty && k [ 'use' ] === 'sig'
6569 ) ;
6670
71+ /*
72+ if (matchingKeys.length == 0) {
73+ let error = 'No matching key found.';
74+ console.error(error);
75+ return Promise.reject(error);
76+ }*/
6777 if ( matchingKeys . length > 1 ) {
6878 let error =
6979 'More than one matching key found. Please specify a kid in the id_token header.' ;
@@ -99,14 +109,20 @@ export class JwksValidationHandler extends AbstractValidationHandler {
99109 return Promise . reject ( error ) ;
100110 }
101111
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 ) {
108124 return Promise . resolve ( ) ;
109- } else {
125+ } else {
110126 return Promise . reject ( 'Signature not valid' ) ;
111127 }
112128 }
@@ -122,11 +138,11 @@ export class JwksValidationHandler extends AbstractValidationHandler {
122138 }
123139 }
124140
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 ) ;
130146 }
131147
132148 toByteArrayAsString ( hexString : string ) {
@@ -138,4 +154,4 @@ export class JwksValidationHandler extends AbstractValidationHandler {
138154 }
139155 return result ;
140156 }
141- }
157+ }
0 commit comments