@@ -192,6 +192,16 @@ converters.object = (V, opts) => {
192
192
193
193
const isNonSharedArrayBuffer = isArrayBuffer ;
194
194
195
+ function ensureSHA ( V , label ) {
196
+ if (
197
+ typeof V === 'string' ?
198
+ ! V . toLowerCase ( ) . startsWith ( 'sha' ) :
199
+ V . name ?. toLowerCase ?. ( ) . startsWith ( 'sha' ) === false
200
+ )
201
+ throw lazyDOMException (
202
+ `Only SHA hashes are supported in ${ label } ` , 'NotSupportedError' ) ;
203
+ }
204
+
195
205
converters . Uint8Array = ( V , opts = kEmptyObject ) => {
196
206
if ( ! ArrayBufferIsView ( V ) ||
197
207
TypedArrayPrototypeGetSymbolToStringTag ( V ) !== 'Uint8Array' ) {
@@ -393,6 +403,7 @@ converters.RsaHashedKeyGenParams = createDictionaryConverter(
393
403
{
394
404
key : 'hash' ,
395
405
converter : converters . HashAlgorithmIdentifier ,
406
+ validator : ( V , dict ) => ensureSHA ( V , 'RsaHashedKeyGenParams' ) ,
396
407
required : true ,
397
408
} ,
398
409
] ) ;
@@ -403,6 +414,7 @@ converters.RsaHashedImportParams = createDictionaryConverter(
403
414
{
404
415
key : 'hash' ,
405
416
converter : converters . HashAlgorithmIdentifier ,
417
+ validator : ( V , dict ) => ensureSHA ( V , 'RsaHashedImportParams' ) ,
406
418
required : true ,
407
419
} ,
408
420
] ) ;
@@ -449,6 +461,7 @@ converters.HmacKeyGenParams = createDictionaryConverter(
449
461
{
450
462
key : 'hash' ,
451
463
converter : converters . HashAlgorithmIdentifier ,
464
+ validator : ( V , dict ) => ensureSHA ( V , 'HmacKeyGenParams' ) ,
452
465
required : true ,
453
466
} ,
454
467
{
@@ -503,6 +516,7 @@ converters.EcdsaParams = createDictionaryConverter(
503
516
{
504
517
key : 'hash' ,
505
518
converter : converters . HashAlgorithmIdentifier ,
519
+ validator : ( V , dict ) => ensureSHA ( V , 'EcdsaParams' ) ,
506
520
required : true ,
507
521
} ,
508
522
] ) ;
@@ -513,6 +527,7 @@ converters.HmacImportParams = createDictionaryConverter(
513
527
{
514
528
key : 'hash' ,
515
529
converter : converters . HashAlgorithmIdentifier ,
530
+ validator : ( V , dict ) => ensureSHA ( V , 'HmacImportParams' ) ,
516
531
required : true ,
517
532
} ,
518
533
{
@@ -573,6 +588,7 @@ converters.HkdfParams = createDictionaryConverter(
573
588
{
574
589
key : 'hash' ,
575
590
converter : converters . HashAlgorithmIdentifier ,
591
+ validator : ( V , dict ) => ensureSHA ( V , 'HkdfParams' ) ,
576
592
required : true ,
577
593
} ,
578
594
{
@@ -587,12 +603,40 @@ converters.HkdfParams = createDictionaryConverter(
587
603
} ,
588
604
] ) ;
589
605
606
+ converters . CShakeParams = createDictionaryConverter (
607
+ 'CShakeParams' , [
608
+ ...new SafeArrayIterator ( dictAlgorithm ) ,
609
+ {
610
+ key : 'length' ,
611
+ converter : ( V , opts ) =>
612
+ converters [ 'unsigned long' ] ( V , { ...opts , enforceRange : true } ) ,
613
+ validator : ( V , opts ) => {
614
+ // The Web Crypto spec allows for SHAKE output length that are not multiples of
615
+ // 8. We don't.
616
+ if ( V % 8 )
617
+ throw lazyDOMException ( 'Unsupported CShakeParams length' , 'NotSupportedError' ) ;
618
+ } ,
619
+ required : true ,
620
+ } ,
621
+ {
622
+ key : 'functionName' ,
623
+ converter : converters . BufferSource ,
624
+ validator : validateZeroLength ( 'CShakeParams.functionName' ) ,
625
+ } ,
626
+ {
627
+ key : 'customization' ,
628
+ converter : converters . BufferSource ,
629
+ validator : validateZeroLength ( 'CShakeParams.customization' ) ,
630
+ } ,
631
+ ] ) ;
632
+
590
633
converters . Pbkdf2Params = createDictionaryConverter (
591
634
'Pbkdf2Params' , [
592
635
...new SafeArrayIterator ( dictAlgorithm ) ,
593
636
{
594
637
key : 'hash' ,
595
638
converter : converters . HashAlgorithmIdentifier ,
639
+ validator : ( V , dict ) => ensureSHA ( V , 'Pbkdf2Params' ) ,
596
640
required : true ,
597
641
} ,
598
642
{
0 commit comments