@@ -106,6 +106,22 @@ converters['sequence<KeyUsage>'] = createSequenceConverter(converters.KeyUsage);
106106
107107converters . HashAlgorithmIdentifier = converters . AlgorithmIdentifier ;
108108
109+ /**
110+ * Builds conversion options for Web Crypto integer members that use Web IDL
111+ * [EnforceRange]. Keep this helper instead of spreading opts in each member
112+ * converter so the hot dictionary paths allocate stable-shape objects.
113+ * @param {object } opts Parent conversion options.
114+ * @returns {object }
115+ */
116+ function enforceRangeOptions ( opts ) {
117+ return {
118+ prefix : opts . prefix ,
119+ context : opts . context ,
120+ code : opts . code ,
121+ enforceRange : true ,
122+ } ;
123+ }
124+
109125const dictAlgorithm = [
110126{
111127key : 'name' ,
@@ -121,8 +137,9 @@ converters.Algorithm = createDictionaryConverter(
121137// converters.BigInteger = webidl.Uint8Array;
122138converters . BigInteger = ( V , opts = kEmptyObject ) => {
123139return webidl . Uint8Array ( V , {
124- __proto__ : null ,
125- ...opts ,
140+ prefix : opts . prefix ,
141+ context : opts . context ,
142+ code : opts . code ,
126143allowResizable : true ,
127144allowShared : false ,
128145} ) ;
@@ -132,18 +149,20 @@ converters.BigInteger = (V, opts = kEmptyObject) => {
132149// removing this altogether.
133150converters . BufferSource = ( V , opts = kEmptyObject ) => {
134151return webidl . BufferSource ( V , {
135- __proto__ : null ,
136- ...opts ,
152+ prefix : opts . prefix ,
153+ context : opts . context ,
154+ code : opts . code ,
137155allowResizable : opts . allowResizable === undefined ?
138156true : opts . allowResizable ,
157+ allowShared : opts . allowShared ,
139158} ) ;
140159} ;
141160
142161const dictRsaKeyGenParams = [
143162{
144163key : 'modulusLength' ,
145164converter : ( V , opts ) =>
146- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
165+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
147166required : true ,
148167} ,
149168{
@@ -221,7 +240,7 @@ converters.AesKeyGenParams = createDictionaryConverter(
221240{
222241key : 'length' ,
223242converter : ( V , opts ) =>
224- converters [ 'unsigned short' ] ( V , { ... opts , enforceRange : true } ) ,
243+ converters [ 'unsigned short' ] ( V , enforceRangeOptions ( opts ) ) ,
225244validator : AESLengthValidator ,
226245required : true ,
227246} ,
@@ -244,7 +263,7 @@ converters.RsaPssParams = createDictionaryConverter(
244263{
245264key : 'saltLength' ,
246265converter : ( V , opts ) =>
247- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
266+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
248267required : true ,
249268} ,
250269] ,
@@ -288,7 +307,7 @@ for (const { 0: name, 1: zeroError } of [['HmacKeyGenParams', 'OperationError'],
288307{
289308key : 'length' ,
290309converter : ( V , opts ) =>
291- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
310+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
292311validator : validateMacKeyLength ( `${ name } .length` , zeroError ) ,
293312} ,
294313] ,
@@ -370,7 +389,7 @@ converters.CShakeParams = createDictionaryConverter(
370389{
371390key : 'outputLength' ,
372391converter : ( V , opts ) =>
373- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
392+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
374393validator : ( V , opts ) => {
375394// The Web Crypto spec allows for SHAKE output length that are not multiples of
376395// 8. We don't.
@@ -404,7 +423,7 @@ converters.Pbkdf2Params = createDictionaryConverter(
404423{
405424key : 'iterations' ,
406425converter : ( V , opts ) =>
407- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
426+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
408427validator : ( V , dict ) => {
409428if ( V === 0 )
410429throw lazyDOMException ( 'iterations cannot be zero' , 'OperationError' ) ;
@@ -427,7 +446,7 @@ converters.AesDerivedKeyParams = createDictionaryConverter(
427446{
428447key : 'length' ,
429448converter : ( V , opts ) =>
430- converters [ 'unsigned short' ] ( V , { ... opts , enforceRange : true } ) ,
449+ converters [ 'unsigned short' ] ( V , enforceRangeOptions ( opts ) ) ,
431450validator : AESLengthValidator ,
432451required : true ,
433452} ,
@@ -481,7 +500,7 @@ converters.AeadParams = createDictionaryConverter(
481500{
482501key : 'tagLength' ,
483502converter : ( V , opts ) =>
484- converters . octet ( V , { ... opts , enforceRange : true } ) ,
503+ converters . octet ( V , enforceRangeOptions ( opts ) ) ,
485504validator : ( V , dict ) => {
486505switch ( StringPrototypeToLowerCase ( dict . name ) ) {
487506case 'chacha20-poly1305' :
@@ -524,7 +543,7 @@ converters.AesCtrParams = createDictionaryConverter(
524543{
525544key : 'length' ,
526545converter : ( V , opts ) =>
527- converters . octet ( V , { ... opts , enforceRange : true } ) ,
546+ converters . octet ( V , enforceRangeOptions ( opts ) ) ,
528547validator : ( V , dict ) => {
529548if ( V === 0 || V > 128 )
530549throw lazyDOMException (
@@ -604,7 +623,7 @@ converters.Argon2Params = createDictionaryConverter(
604623{
605624key : 'parallelism' ,
606625converter : ( V , opts ) =>
607- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
626+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
608627validator : ( V , dict ) => {
609628if ( V === 0 || V > MathPow ( 2 , 24 ) - 1 ) {
610629throw lazyDOMException (
@@ -617,7 +636,7 @@ converters.Argon2Params = createDictionaryConverter(
617636{
618637key : 'memory' ,
619638converter : ( V , opts ) =>
620- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
639+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
621640validator : ( V , dict ) => {
622641if ( V < 8 * dict . parallelism ) {
623642throw lazyDOMException (
@@ -630,7 +649,7 @@ converters.Argon2Params = createDictionaryConverter(
630649{
631650key : 'passes' ,
632651converter : ( V , opts ) =>
633- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
652+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
634653validator : ( V ) => {
635654if ( V === 0 ) {
636655throw lazyDOMException ( 'passes must be > 0' , 'OperationError' ) ;
@@ -641,7 +660,7 @@ converters.Argon2Params = createDictionaryConverter(
641660{
642661key : 'version' ,
643662converter : ( V , opts ) =>
644- converters . octet ( V , { ... opts , enforceRange : true } ) ,
663+ converters . octet ( V , enforceRangeOptions ( opts ) ) ,
645664validator : ( V , dict ) => {
646665if ( V !== 0x13 ) {
647666throw lazyDOMException (
@@ -680,7 +699,7 @@ for (const { 0: name, 1: zeroError } of [['KmacKeyGenParams', 'OperationError'],
680699{
681700key : 'length' ,
682701converter : ( V , opts ) =>
683- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
702+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
684703validator : validateMacKeyLength ( `${ name } .length` , zeroError ) ,
685704} ,
686705] ,
@@ -694,7 +713,7 @@ converters.KmacParams = createDictionaryConverter(
694713{
695714key : 'outputLength' ,
696715converter : ( V , opts ) =>
697- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
716+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
698717validator : ( V , opts ) => {
699718// The Web Crypto spec allows for KMAC output length that are not multiples of 8. We don't.
700719if ( V % 8 )
@@ -716,7 +735,7 @@ converters.KangarooTwelveParams = createDictionaryConverter(
716735{
717736key : 'outputLength' ,
718737converter : ( V , opts ) =>
719- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
738+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
720739validator : ( V , opts ) => {
721740if ( V === 0 || V % 8 )
722741throw lazyDOMException ( 'Invalid KangarooTwelveParams outputLength' , 'OperationError' ) ;
@@ -737,7 +756,7 @@ converters.TurboShakeParams = createDictionaryConverter(
737756{
738757key : 'outputLength' ,
739758converter : ( V , opts ) =>
740- converters [ 'unsigned long' ] ( V , { ... opts , enforceRange : true } ) ,
759+ converters [ 'unsigned long' ] ( V , enforceRangeOptions ( opts ) ) ,
741760validator : ( V , opts ) => {
742761if ( V === 0 || V % 8 )
743762throw lazyDOMException ( 'Invalid TurboShakeParams outputLength' , 'OperationError' ) ;
@@ -747,7 +766,7 @@ converters.TurboShakeParams = createDictionaryConverter(
747766{
748767key : 'domainSeparation' ,
749768converter : ( V , opts ) =>
750- converters . octet ( V , { ... opts , enforceRange : true } ) ,
769+ converters . octet ( V , enforceRangeOptions ( opts ) ) ,
751770validator : ( V ) => {
752771if ( V < 0x01 || V > 0x7F ) {
753772throw lazyDOMException (
0 commit comments