@@ -36,6 +36,7 @@ import { AsymmetricKeyFormatValues } from "@/features/common/values/asymmetric-k
3636import { useDebuggerStore } from "@/features/debugger/services/debugger.store" ;
3737import { SigningAlgCategoryValues } from "@/features/common/values/signing-alg-category.values" ;
3838import { EncoderInputsModel } from "@/features/debugger/models/encoder-inputs.model" ;
39+ import { EncoderResult } from "@/features/common/models/encoder-result.model" ;
3940
4041type EncodingHeaderErrors = {
4142 headerErrors : string [ ] | null ;
@@ -183,7 +184,8 @@ class _TokenEncoderService {
183184 }
184185
185186 if ( encodeJWTResult . isOk ( ) ) {
186- stateUpdate . jwt = encodeJWTResult . value . trim ( ) ;
187+ stateUpdate . jwt = encodeJWTResult . value . jwt . trim ( ) ;
188+ stateUpdate . signingErrors = encodeJWTResult . value . signingErrors ;
187189 }
188190
189191 return {
@@ -214,7 +216,7 @@ class _TokenEncoderService {
214216 }
215217
216218 if ( encodeJWTResult . isOk ( ) ) {
217- stateUpdate . jwt = encodeJWTResult . value . trim ( ) ;
219+ stateUpdate . jwt = encodeJWTResult . value . jwt . trim ( ) ;
218220
219221 useDebuggerStore . getState ( ) . setStash$ ( {
220222 asymmetricPublicKey : digitallySignedToken . publicKey ,
@@ -379,7 +381,7 @@ class _TokenEncoderService {
379381 }
380382
381383 if ( encodeJWTResult . isOk ( ) ) {
382- stateUpdate . jwt = encodeJWTResult . value . trim ( ) ;
384+ stateUpdate . jwt = encodeJWTResult . value . jwt . trim ( ) ;
383385 }
384386
385387 return {
@@ -409,7 +411,7 @@ class _TokenEncoderService {
409411 }
410412
411413 if ( encodeJWTResult . isOk ( ) ) {
412- stateUpdate . jwt = encodeJWTResult . value . trim ( ) ;
414+ stateUpdate . jwt = encodeJWTResult . value . jwt . trim ( ) ;
413415 }
414416
415417 return {
@@ -484,48 +486,61 @@ class _TokenEncoderService {
484486 payload : DecodedJwtPayloadModel ,
485487 key : string ,
486488 encodingFormat : EncodingValues ,
487- ) : Promise < Result < string , DebuggerErrorModel > > {
488- if ( isHmacAlg ( header . alg ) ) {
489- if ( ! key ) {
490- return err ( {
491- task : DebuggerTaskValues . ENCODE ,
492- input : DebuggerInputValues . KEY ,
493- message : "Secret must not be empty." ,
494- } ) ;
495- }
489+ ) : Promise < Result < EncoderResult , DebuggerErrorModel > > {
490+ if ( ! isHmacAlg ( header . alg ) ) {
491+ return err ( {
492+ task : DebuggerTaskValues . ENCODE ,
493+ input : DebuggerInputValues . HEADER ,
494+ message : `Invalid MAC algorithm. Only use MAC "alg" parameter values in the header as defined by [RFC 7518 (JSON Web Algorithms)](https://datatracker.ietf.org/doc/html/rfc7518#section-3.1).` ,
495+ } ) ;
496+ }
496497
497- const getAlgSizeResult = getAlgSize ( header . alg ) ;
498+ if ( ! key ) {
499+ return err ( {
500+ task : DebuggerTaskValues . ENCODE ,
501+ input : DebuggerInputValues . KEY ,
502+ message : "Secret must not be empty." ,
503+ } ) ;
504+ }
498505
499- if ( getAlgSizeResult . isErr ( ) ) {
500- return err ( {
501- task : DebuggerTaskValues . ENCODE ,
502- input : DebuggerInputValues . KEY ,
503- message : getAlgSizeResult . error ,
504- } ) ;
505- }
506+ const getAlgSizeResult = getAlgSize ( header . alg ) ;
506507
507- const checkHmacSecretLengthResult = checkHmacSecretLength (
508- key ,
509- getAlgSizeResult . value . size ,
510- encodingFormat ,
511- ) ;
508+ if ( getAlgSizeResult . isErr ( ) ) {
509+ return err ( {
510+ task : DebuggerTaskValues . ENCODE ,
511+ input : DebuggerInputValues . KEY ,
512+ message : getAlgSizeResult . error ,
513+ } ) ;
514+ }
512515
513- if ( checkHmacSecretLengthResult . isErr ( ) ) {
514- return err ( checkHmacSecretLengthResult . error ) ;
515- }
516+ const checkHmacSecretLengthResult = checkHmacSecretLength (
517+ key ,
518+ getAlgSizeResult . value . size ,
519+ encodingFormat ,
520+ ) ;
516521
517- return await signWithSymmetricSecretKey (
518- header as CompactJWSHeaderParameters ,
519- payload ,
520- key ,
521- encodingFormat ,
522- ) ;
522+ const signingError = checkHmacSecretLengthResult . isErr ( )
523+ ? [ checkHmacSecretLengthResult . error . message ]
524+ : null ;
525+
526+ const signWithSymmetricSecretKeyResult = await signWithSymmetricSecretKey (
527+ header as CompactJWSHeaderParameters ,
528+ payload ,
529+ key ,
530+ encodingFormat ,
531+ ) ;
532+
533+ if ( signWithSymmetricSecretKeyResult . isErr ( ) ) {
534+ return err ( {
535+ task : DebuggerTaskValues . ENCODE ,
536+ input : DebuggerInputValues . KEY ,
537+ message : signWithSymmetricSecretKeyResult . error . message ,
538+ } ) ;
523539 }
524540
525- return err ( {
526- task : DebuggerTaskValues . ENCODE ,
527- input : DebuggerInputValues . HEADER ,
528- message : `Invalid MAC algorithm. Only use MAC "alg" parameter values in the header as defined by [RFC 7518 (JSON Web Algorithms)](https://datatracker.ietf.org/doc/html/rfc7518#section-3.1).` ,
541+ return ok < EncoderResult > ( {
542+ jwt : signWithSymmetricSecretKeyResult . value ,
543+ signingErrors : signingError ,
529544 } ) ;
530545 }
531546
@@ -534,7 +549,7 @@ class _TokenEncoderService {
534549 payload : DecodedJwtPayloadModel ,
535550 key : string ,
536551 keyFormat : AsymmetricKeyFormatValues ,
537- ) : Promise < Result < string , DebuggerErrorModel > > {
552+ ) : Promise < Result < EncoderResult , DebuggerErrorModel > > {
538553 if ( isDigitalSignatureAlg ( header . alg ) ) {
539554 if ( ! key ) {
540555 return err ( {
@@ -544,12 +559,25 @@ class _TokenEncoderService {
544559 } ) ;
545560 }
546561
547- return await signWithAsymmetricPrivateKey (
562+ const jwt = await signWithAsymmetricPrivateKey (
548563 header as CompactJWSHeaderParameters ,
549564 payload ,
550565 key ,
551566 keyFormat ,
552567 ) ;
568+
569+ if ( jwt . isErr ( ) ) {
570+ return err ( {
571+ task : DebuggerTaskValues . ENCODE ,
572+ input : DebuggerInputValues . KEY ,
573+ message : "Private key must not be empty." ,
574+ } )
575+ }
576+
577+ return ok ( {
578+ jwt : jwt . value ,
579+ signingErrors : null ,
580+ } ) ;
553581 }
554582
555583 return err ( {
@@ -684,9 +712,7 @@ class _TokenEncoderService {
684712 symmetricSecretKeyEncoding : EncodingValues ;
685713 } ) : Promise <
686714 Result <
687- {
688- jwt : string ;
689- } ,
715+ EncoderResult ,
690716 EncodingSymmetricSecretKeyErrors
691717 >
692718 > {
@@ -767,6 +793,7 @@ class _TokenEncoderService {
767793
768794 return ok ( {
769795 jwt : encodeJwtResult . value . jwt . trim ( ) ,
796+ signingErrors : encodeJwtResult . value . signingErrors ,
770797 } ) ;
771798 }
772799
@@ -861,17 +888,15 @@ class _TokenEncoderService {
861888 } ,
862889 ) : Promise <
863890 Result <
864- {
865- jwt : string ;
866- } ,
891+ EncoderResult ,
867892 EncodingJwtErrors
868893 >
869894 > {
870895 const algType = params . algType ;
871896 const header = params . header ;
872897 const payload = params . payload ;
873898
874- let encodeJWTResult : Result < string , DebuggerErrorModel > | null = null ;
899+ let encodeJWTResult : Result < EncoderResult , DebuggerErrorModel > | null = null ;
875900
876901 if ( algType === SigningAlgCategoryValues . ANY ) {
877902 const symmetricSecretKey = params . symmetricSecretKey ;
@@ -998,8 +1023,9 @@ class _TokenEncoderService {
9981023 }
9991024 }
10001025
1001- return ok ( {
1002- jwt : encodeJWTResult . value ,
1026+ return ok < EncoderResult > ( {
1027+ jwt : encodeJWTResult . value . jwt ,
1028+ signingErrors : encodeJWTResult . value . signingErrors ,
10031029 } ) ;
10041030 }
10051031
@@ -1235,6 +1261,7 @@ class _TokenEncoderService {
12351261 }
12361262
12371263 stateUpdate . jwt = processSymmetricSecretKeyResult . value . jwt . trim ( ) ;
1264+ stateUpdate . signingErrors = processSymmetricSecretKeyResult . value . signingErrors ;
12381265
12391266 return stateUpdate ;
12401267 }
@@ -1269,6 +1296,7 @@ class _TokenEncoderService {
12691296 }
12701297
12711298 stateUpdate . jwt = processSymmetricSecretKeyResult . value . jwt . trim ( ) ;
1299+ stateUpdate . signingErrors = processSymmetricSecretKeyResult . value . signingErrors ;
12721300
12731301 return stateUpdate ;
12741302 }
0 commit comments