Bug 26674: use new IDL required keyword to indicate required dictionary members
authorMark Watson <watsonm@netflix.com>
Thu, 25 Sep 2014 17:43:05 -0700
changeset 236 2616605d14ae
parent 235 b70e27d42387
child 237 dc8073493900
Bug 26674: use new IDL required keyword to indicate required dictionary members
spec/Overview-WebCryptoAPI.xml
spec/Overview.html
--- a/spec/Overview-WebCryptoAPI.xml	Thu Sep 25 16:33:41 2014 -0700
+++ b/spec/Overview-WebCryptoAPI.xml	Thu Sep 25 17:43:05 2014 -0700
@@ -958,7 +958,7 @@
 typedef <a href="#dfn-AlgorithmIdentifier">AlgorithmIdentifier</a> <dfn id="dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</dfn>;
 
 dictionary <dfn id="dfn-Algorithm">Algorithm</dfn> {
-  DOMString <a href="#dfn-Algorithm-name">name</a>;
+  required DOMString <a href="#dfn-Algorithm-name">name</a>;
 };
         </x:codeblock>
         <div id="algorithm-dictionary-members" class="section">
@@ -982,7 +982,7 @@
         </p>
         <x:codeblock language="idl">
 dictionary <dfn id="dfn-KeyAlgorithm">KeyAlgorithm</dfn> {
-  DOMString <a href="#dfn-KeyAlgorithm-name">name</a>
+  required DOMString <a href="#dfn-KeyAlgorithm-name">name</a>
 };
         </x:codeblock>
         <div id="key-algorithm-dictionary-description" class="section">
@@ -3159,11 +3159,6 @@
                     If an error occurred, return the error and terminate this algorithm.
                   </li>
                   <li>
-                    If the <a href="#dfn-Algorithm-name">name</a> attribute of <var>initialAlg</var>
-                    is not present, return a new <code>SyntaxError</code> and terminate this
-                    algorithm.
-                  </li>
-                  <li>
                     Let <var>algName</var> be the value of the <a href="#dfn-Algorithm-name">name</a>
                     attribute of <var>initialAlg</var>.
                   </li>
@@ -3208,15 +3203,6 @@
                         </p>
                         <ol>
                           <li>
-                            If <var>member</var> is not nullable, and is not present, return a new
-                            <code>SyntaxError</code> and terminate this algorithm.
-                          </li>
-                          <li>
-                            If <var>member</var> is nullable, and is not present, return to
-                            iterating the next dictionary member <var>member</var>, stopping further
-                            processing of this <var>member</var>.
-                          </li>
-                          <li>
                             Let <var>key</var> be the identifier of <var>member</var>.
                           </li>
                           <li>
@@ -3801,9 +3787,9 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-RsaKeyGenParams">RsaKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
   <span class="comment">// The length, in bits, of the RSA modulus</span>
-  [EnforceRange] unsigned long <dfn id="dfn-RsaKeyGenParams-modulusLength">modulusLength</dfn>;
+  [EnforceRange] required unsigned long <dfn id="dfn-RsaKeyGenParams-modulusLength">modulusLength</dfn>;
   <span class="comment">// The RSA public exponent</span>
-  <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyGenParams-publicExponent">publicExponent</dfn>;
+  required <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyGenParams-publicExponent">publicExponent</dfn>;
 };
           </x:codeblock>
         </div>
@@ -3812,7 +3798,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-RsaHashedKeyGenParams">RsaHashedKeyGenParams</dfn> : <a href="#dfn-RsaKeyGenParams">RsaKeyGenParams</a> {
   <span class="comment">// The hash algorithm to use</span> 
-  <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedKeyGenParams-hash">hash</dfn>;
+  required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedKeyGenParams-hash">hash</dfn>;
 };
           </x:codeblock>
         </div>
@@ -3821,9 +3807,9 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-RsaKeyAlgorithm">RsaKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
   <span class="comment">// The length, in bits, of the RSA modulus</span>
-  unsigned long <dfn id="dfn-RsaKeyAlgorithm-modulusLength">modulusLength</dfn>;
+  required unsigned long <dfn id="dfn-RsaKeyAlgorithm-modulusLength">modulusLength</dfn>;
   <span class="comment">// The RSA public exponent</span>
-  <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyAlgorithm-publicExponent">publicExponent</dfn>;
+  required <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyAlgorithm-publicExponent">publicExponent</dfn>;
 };
           </x:codeblock>
         </div>
@@ -3832,7 +3818,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-RsaHashedKeyAlgorithm">RsaHashedKeyAlgorithm</dfn> : <a href="#dfn-RsaKeyAlgorithm">RsaKeyAlgorithm</a> {
   <span class="comment">// The hash algorithm that is used with this key</span>
-  <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> <dfn id="dfn-RsaHashedKeyAlgorithm-hash">hash</dfn>;
+  required <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> <dfn id="dfn-RsaHashedKeyAlgorithm-hash">hash</dfn>;
 };
           </x:codeblock>
         </div>
@@ -3841,7 +3827,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-RsaHashedImportParams">RsaHashedImportParams</dfn> {
   <span class="comment">// The hash algorithm to use</span>
-  <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedImportParams-hash">hash</dfn>;
+  required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedImportParams-hash">hash</dfn>;
 };
           </x:codeblock>
           <div class="ednote">
@@ -5044,7 +5030,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-RsaPssParams">RsaPssParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The desired length of the random salt</span>
-[EnforceRange] unsigned long <dfn id="dfn-RsaPssParams-saltLength">saltLength</dfn>;
+[EnforceRange] required unsigned long <dfn id="dfn-RsaPssParams-saltLength">saltLength</dfn>;
 };
           </x:codeblock>
         </div>
@@ -6584,7 +6570,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-RsaOaepParams">RsaOaepParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The optional label/application data to associate with the message</span>
-CryptoOperationData? <dfn id="dfn-RsaOaepParams-label">label</dfn>;
+CryptoOperationData <dfn id="dfn-RsaOaepParams-label">label</dfn>;
 };
           </x:codeblock>
         </div>
@@ -6604,14 +6590,23 @@
                 </li>
                 <li>
                   <p>
+                    Let <var>label</var> be the <a
+                    href="#concept-contents-of-arraybuffer">contents of</a> the <a
+                    href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> or the empty octet string if the
+                    <a
+                    href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> is not present.
+                  </p>
+                </li>
+                <li>
+                  <p>
                     Perform the encryption operation defined in Section 7.1 of [<cite><a
                     href="#RFC3447">RFC3447</a></cite>] with the key represented by <var>key</var>
                     as the recipient's RSA public key, the <a
                     href="#concept-contents-of-arraybuffer">contents of <var>plaintext</var></a>
-                    as the message to be encrypted, <var>M</var> and the <a
-                    href="#concept-contents-of-arraybuffer">contents of</a> <a
-                    href="#dfn-RsaOaepParams-label">label</a> member of
-                    <var>normalizedAlgorithm</var> as the label, <var>L</var>, and with the hash
+                    as the message to be encrypted, <var>M</var> and <var>label</var>
+                    as the label, <var>L</var>, and with the hash
                     function specified by the <a href="#dfn-RsaHashedKeyAlgorithm-hash">hash</a>
                     attribute of the [[<a href="#dfn-CryptoKey-slot-algorithm">algorithm</a>]] internal slot of
                     <var>key</var> as the Hash option and MGF1 (defined in Section B.2.1 of
@@ -6647,14 +6642,23 @@
                 </li>
                 <li>
                   <p>
+                    Let <var>label</var> be the <a
+                    href="#concept-contents-of-arraybuffer">contents of</a> the <a
+                    href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> or the empty octet string if the
+                    <a
+                    href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> is not present.
+                  </p>
+                </li>
+                <li>
+                  <p>
                     Perform the decryption operation defined in Section 7.1 of [<cite><a
                     href="#RFC3447">RFC3447</a></cite>] with the key represented by <var>key</var>
                     as the recipient's RSA private key, the <a
                     href="#concept-contents-of-arraybuffer">contents of <var>ciphertext</var></a>
-                    as the ciphertext to be decrypted, C, and the <a
-                    href="#concept-contents-of-arraybuffer">contents of</a> the <a
-                    href="#dfn-RsaOaepParams-label">label</a> member of
-                    <var>normalizedAlgorithm</var> as the label, <var>L</var>, and with the hash
+                    as the ciphertext to be decrypted, C, and <var>label</var>
+                    as the label, <var>L</var>, and with the hash
                     function specified by the <a href="#dfn-RsaHashedKeyAlgorithm-hash">hash</a>
                     attribute of the [[<a href="#dfn-CryptoKey-slot-algorithm">algorithm</a>]] internal slot of
                     <var>key</var> as the Hash option and MGF1 (defined in Section B.2.1 of
@@ -8111,7 +8115,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-EcdsaParams">EcdsaParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The hash algorithm to use</span>
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-EcdsaParams-hash">hash</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-EcdsaParams-hash">hash</dfn>;
 };
           </x:codeblock>
         </div>
@@ -8122,7 +8126,7 @@
 
 dictionary <dfn id="dfn-EcKeyGenParams">EcKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// A named curve</span>
-<a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyGenParams-namedCurve">namedCurve</dfn>;
+required <a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyGenParams-namedCurve">namedCurve</dfn>;
 };
           </x:codeblock>
           <p>
@@ -8148,7 +8152,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-EcKeyAlgorithm">EcKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The named curve that the key uses</span>
-<a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyAlgorithm-namedCurve">namedCurve</dfn>;
+required <a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyAlgorithm-namedCurve">namedCurve</dfn>;
 };
           </x:codeblock>
         </div>
@@ -8157,7 +8161,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-EcKeyImportParams">EcKeyImportParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// A named curve</span>
-<a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyImportParams-namedCurve">namedCurve</dfn>;
+required <a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyImportParams-namedCurve">namedCurve</dfn>;
 };
           </x:codeblock>
         </div>
@@ -9585,7 +9589,7 @@
 
 dictionary <dfn id="dfn-EcdhKeyDeriveParams">EcdhKeyDeriveParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The peer's EC public key.</span>
-<a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-EcdhKeyDeriveParams-public">public</dfn>;
+required <a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-EcdhKeyDeriveParams-public">public</dfn>;
 };
           </x:codeblock>
         </div>
@@ -9605,14 +9609,6 @@
                 </li>
                 <li>
                   <p>
-                    If any of the members of <a href="#dfn-EcKeyGenParams">EcKeyGenParams</a> are
-                    not present in <var>normalizedAlgorithm</var>,
-                    then <a href="#concept-return-an-error">return an error</a> named
-                    <a href="#dfn-SyntaxError"><code>SyntaxError</code></a>.
-                  </p>
-                </li>
-                <li>
-                  <p>
                     If <var>usages</var> contains a value which is not
                     one of <code>"deriveKey"</code> or <code>"deriveBits"</code>,
                     then <a href="#concept-return-an-error">return an error</a> named
@@ -10433,15 +10429,6 @@
                       <ol>
                         <li>
                           <p>
-                            If any of the members of <a
-                            href="#dfn-EcKeyImportParams">EcKeyImportParams</a> are not present in
-                            <var>normalizedAlgorithm</var>,
-                            then <a href="#concept-return-an-error">return an error</a> named
-                            <a href="#dfn-SyntaxError"><code>SyntaxError</code></a>.
-                          </p>
-                        </li>
-                        <li>
-                          <p>
                             If the <a href="#dfn-EcKeyImportParams-namedCurve">namedCurve</a>
                             member of <var>normalizedAlgorithm</var> is not a
                             <a href="#dfn-NamedCurve">named curve</a>,
@@ -11008,10 +10995,10 @@
 // incrementing function specified in NIST SP 800-38A Appendix B.1:
 // the counter bits are interpreted as a big-endian integer and
 // incremented by one.</span>
-CryptoOperationData <dfn id="dfn-AesCtrParams-counter">counter</dfn>;
+required CryptoOperationData <dfn id="dfn-AesCtrParams-counter">counter</dfn>;
 <span class="comment">// The length, in bits, of the rightmost part of the counter block
 // that is incremented.</span>
-[EnforceRange] octet <dfn id="dfn-AesCtrParams-length">length</dfn>;
+[EnforceRange] required octet <dfn id="dfn-AesCtrParams-length">length</dfn>;
 };
           </x:codeblock>
         </div>
@@ -11019,7 +11006,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-AesKeyAlgorithm">AesKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The length, in bits, of the key.</span>
-unsigned short <dfn id="dfn-AesKeyAlgorithm-length">length</dfn>;
+required unsigned short <dfn id="dfn-AesKeyAlgorithm-length">length</dfn>;
 };
           </x:codeblock>
         </div>
@@ -11028,7 +11015,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-AesKeyGenParams">AesKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The length, in bits, of the key.</span>
-[EnforceRange] unsigned short <dfn id="dfn-AesKeyGenParams-length">length</dfn>;
+[EnforceRange] required unsigned short <dfn id="dfn-AesKeyGenParams-length">length</dfn>;
 };
           </x:codeblock>
         </div>
@@ -11037,7 +11024,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-AesDerivedKeyParams">AesDerivedKeyParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The length, in bits, of the key.</span>
-[EnforceRange] unsigned short <dfn id="dfn-AesDerivedKeyParams-length">length</dfn>;
+[EnforceRange] required unsigned short <dfn id="dfn-AesDerivedKeyParams-length">length</dfn>;
 };
           </x:codeblock>
         </div>
@@ -11588,7 +11575,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-AesCbcParams">AesCbcParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The initialization vector. <span class="RFC2119">MUST</span> be 16 bytes.</span>
-CryptoOperationData <dfn id="dfn-AesCbcParams-iv">iv</dfn>;
+required CryptoOperationData <dfn id="dfn-AesCbcParams-iv">iv</dfn>;
 };
           </x:codeblock>
         </div>
@@ -12125,7 +12112,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-AesCmacParams">AesCmacParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The length, in bits, of the MAC.</span>
-[EnforceRange] unsigned short <dfn id="dfn-AesCmacParams-length">length</dfn>;
+[EnforceRange] required unsigned short <dfn id="dfn-AesCmacParams-length">length</dfn>;
 };
           </x:codeblock>
         </div>
@@ -12554,15 +12541,6 @@
               <ol>
                 <li>
                   <p>
-                    If any of the members of
-                    <a href="#dfn-AesDerivedKeyParams">AesDerivedKeyParams</a> are not present in
-                    <var>normalizedDerivedKeyAlgorithm</var>,
-                    then <a href="#concept-return-an-error">return an error</a> named
-                    <a href="#dfn-SyntaxError"><code>SyntaxError</code></a>.
-                  </p>
-                </li>
-                <li>
-                  <p>
                     If the <a href="#dfn-AesDerivedKeyParams-length">length</a> member of
                     <var>normalizedDerivedKeyAlgorithm</var> is not 128, 192 or 256,
                     then <a href="#concept-return-an-error">return an error</a> named
@@ -12644,11 +12622,11 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-AesGcmParams">AesGcmParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The initialization vector to use. May be up to 2^64-1 bytes long.</span>
-CryptoOperationData <dfn id="dfn-AesGcmParams-iv">iv</dfn>;
+required CryptoOperationData <dfn id="dfn-AesGcmParams-iv">iv</dfn>;
 <span class="comment">// The additional authentication data to include.</span>
-CryptoOperationData? <dfn id="dfn-AesGcmParams-additionalData">additionalData</dfn>;
+CryptoOperationData <dfn id="dfn-AesGcmParams-additionalData">additionalData</dfn>;
 <span class="comment">// The desired length of the authentication tag. May be 0 - 128.</span>
-[EnforceRange] octet? <dfn id="dfn-AesGcmParams-tagLength">tagLength</dfn>;
+[EnforceRange] octet <dfn id="dfn-AesGcmParams-tagLength">tagLength</dfn>;
 };
           </x:codeblock>
         </div>
@@ -12678,7 +12656,7 @@
                 <li>
                   <p>
                     If the <a href="#dfn-AesGcmParams-additionalData">additionalData</a> member
-                    of <var>normalizedAlgorithm</var> is present, is not null and has a length
+                    of <var>normalizedAlgorithm</var> is present and has a length
                     greater than 2^64 - 1 bytes,
                     then <a href="#concept-return-an-error">return an error</a> named
                     <a href="#dfn-DataError"><code>DataError</code></a>.
@@ -12687,7 +12665,7 @@
                 <li>
                   <dl class="switch">
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
-                    <var>normalizedAlgorithm</var> is not present or is null:</dt>
+                    <var>normalizedAlgorithm</var> is not present:</dt>
                     <dd>Let <var>tagLength</var> be 128.</dd>
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
                     <var>normalizedAlgorithm</var> is one of 32, 64, 96, 104, 112, 120 or 128:</dt>
@@ -12706,7 +12684,7 @@
                     Let <var>additionalData</var> be <a
                     href="#concept-contents-of-arraybuffer">the contents of</a> the <a
                     href="#dfn-AesGcmParams-additionalData">additionalData</a> member of
-                    <var>normalizedAlgorithm</var> if present and not null and the empty octet
+                    <var>normalizedAlgorithm</var> if present or the empty octet
                     string otherwise.
                   </p>
                 </li>
@@ -12739,7 +12717,7 @@
                 <li>
                   <dl class="switch">
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
-                    <var>normalizedAlgorithm</var> is not present or null:</dt>
+                    <var>normalizedAlgorithm</var> is not present:</dt>
                     <dd>Let <var>tagLength</var> be 128.</dd>
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
                     <var>normalizedAlgorithm</var> is one of 32, 64, 96, 104, 112, 120 or 128:</dt>
@@ -12772,7 +12750,7 @@
                 <li>
                   <p>
                     If the <a href="#dfn-AesGcmParams-additionalData">additionalData</a> member
-                    of <var>normalizedAlgorithm</var> is present, is not null and has a length
+                    of <var>normalizedAlgorithm</var> is present and has a length
                     greater than 2^64 - 1
                     bytes,
                     then <a href="#concept-return-an-error">return an error</a> named
@@ -12796,7 +12774,7 @@
                     Let <var>additionalData</var> be <a
                     href="#concept-contents-of-arraybuffer">the contents</a> of the <a
                     href="#dfn-AesGcmParams-additionalData">additionalData</a> member of
-                    <var>normalizedAlgorithm</var> if present and not null and the empty octet
+                    <var>normalizedAlgorithm</var> if present or the empty octet
                     string otherwise.
                   </p>
                 </li>
@@ -13277,7 +13255,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-AesCfbParams">AesCfbParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The initialization vector. <span class="RFC2119">MUST</span> be 16 bytes.</span>
-CryptoOperationData <dfn id="dfn-AesCfbParams-iv">iv</dfn>;
+required CryptoOperationData <dfn id="dfn-AesCfbParams-iv">iv</dfn>;
 };
           </x:codeblock>
         </div>
@@ -14294,9 +14272,9 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-HmacKeyAlgorithm">HmacKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The inner hash function to use.</span>
-KeyAlgorithm <dfn id="dfn-HmacKeyAlgorithm-hash">hash</dfn>;
+required KeyAlgorithm <dfn id="dfn-HmacKeyAlgorithm-hash">hash</dfn>;
 <span class="comment">// The length (in bits) of the key.</span>
-unsigned long <dfn id="dfn-HmacKeyAlgorithm-length">length</dfn>;
+required unsigned long <dfn id="dfn-HmacKeyAlgorithm-length">length</dfn>;
 };
           </x:codeblock>
         </div>
@@ -14305,7 +14283,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-HmacKeyGenParams">HmacKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The inner hash function to use.</span>
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HmacKeyGenParams-hash">hash</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HmacKeyGenParams-hash">hash</dfn>;
 <span class="comment">// The length (in bits) of the key to generate. If unspecified, the
 // recommended length will be used, which is the size of the associated hash function's block
 // size.</span>
@@ -14545,8 +14523,7 @@
                           <dl class="switch">
                             <dt>
                               If the <a href="#dfn-HmacImportParams-hash">hash</a> member of
-                              <var>normalizedAlgorithm</var> is present and has a
-                              <a href="#dfn-Algorithm-name">name</a> member:
+                              <var>normalizedAlgorithm</var> is present:
                             </dt>
                             <dd>
                               Set the <a href="#dfn-KeyAlgorithm-name">name</a> attribute of
@@ -14598,8 +14575,7 @@
                           <dl class="switch">
                             <dt>
                               If the <a href="#dfn-HmacImportParams-hash">hash</a> member of
-                              <var>normalizedAlgorithm</var> is present and has a
-                              <a href="#dfn-Algorithm-name">name</a> member:
+                              <var>normalizedAlgorithm</var> is present:
                             </dt>
                             <dd>
                               <ol>
@@ -14868,7 +14844,7 @@
                     specifications</a>, passing <var>key</var> and obtaining <var>result</var>.
                     <dl class="switch">
                       <dt>
-                        If <var>format</var> is not <code>"jwkf"</code> and
+                        If <var>format</var> is not <code>"jwk"</code> and
                         <var>result</var> is an <a href="#dfn-ArrayBuffer">ArrayBuffer</a>
                         object
                       </dt>
@@ -15108,9 +15084,9 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-DhKeyGenParams">DhKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The prime p.</span>
-BigInteger <dfn id="dfn-DhKeyGenParams-prime">prime</dfn>;
+required BigInteger <dfn id="dfn-DhKeyGenParams-prime">prime</dfn>;
 <span class="comment">// The base g.</span>
-BigInteger <dfn id="dfn-DhKeyGenParams-generator">generator</dfn>;
+required BigInteger <dfn id="dfn-DhKeyGenParams-generator">generator</dfn>;
 };
           </x:codeblock>
         </div>
@@ -15119,9 +15095,9 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-DhKeyAlgorithm">DhKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The prime p.</span>
-BigInteger <dfn id="dfn-DhKeyAlgorithm-prime">prime</dfn>;
+required BigInteger <dfn id="dfn-DhKeyAlgorithm-prime">prime</dfn>;
 <span class="comment">// The base g.</span>
-BigInteger <dfn id="dfn-DhKeyAlgorithm-generator">generator</dfn>;
+required BigInteger <dfn id="dfn-DhKeyAlgorithm-generator">generator</dfn>;
 };
           </x:codeblock>
         </div>
@@ -15130,7 +15106,7 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-DhKeyDeriveParams">DhKeyDeriveParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The peer's public value.</span>
-<a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-DhKeyDeriveParams-public">public</dfn>;
+required <a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-DhKeyDeriveParams-public">public</dfn>;
 };
           </x:codeblock>
         </div>
@@ -15139,9 +15115,9 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-DhImportKeyParams">DhImportKeyParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The prime p.</span>
-BigInteger <dfn id="dfn-DhImportKeyParams-prime">prime</dfn>;
+required BigInteger <dfn id="dfn-DhImportKeyParams-prime">prime</dfn>;
 <span class="comment">// The base g.</span>
-BigInteger <dfn id="dfn-DhImportKeyParams-generator">generator</dfn>;
+required BigInteger <dfn id="dfn-DhImportKeyParams-generator">generator</dfn>;
 };
           </x:codeblock>
         </div>
@@ -16110,15 +16086,15 @@
 <span class="comment">// A bit string corresponding to the AlgorithmId field of the OtherInfo parameter.</span>
 <span class="comment">// The AlgorithmId indicates how the derived keying material will be parsed and for which</span>
 <span class="comment">// algorithm(s) the derived secret keying material will be used.</span>
-CryptoOperationData <dfn id="dfn-ConcatParams-algorithmId">algorithmId</dfn>;
+required CryptoOperationData <dfn id="dfn-ConcatParams-algorithmId">algorithmId</dfn>;
 <span class="comment">// A bit string that corresponds to the PartyUInfo field of the OtherInfo parameter.</span>
-CryptoOperationData <dfn id="dfn-ConcatParams-partyUInfo">partyUInfo</dfn>;
+required CryptoOperationData <dfn id="dfn-ConcatParams-partyUInfo">partyUInfo</dfn>;
 <span class="comment">// A bit string that corresponds to the PartyVInfo field of the OtherInfo parameter.</span>
-CryptoOperationData <dfn id="dfn-ConcatParams-partyVInfo">partyVInfo</dfn>;
+required CryptoOperationData <dfn id="dfn-ConcatParams-partyVInfo">partyVInfo</dfn>;
 <span class="comment">// An optional bit string that corresponds to the SuppPubInfo field of the OtherInfo parameter.</span>
-CryptoOperationData? <dfn id="dfn-ConcatParams-publicInfo">publicInfo</dfn>;
+CryptoOperationData <dfn id="dfn-ConcatParams-publicInfo">publicInfo</dfn>;
 <span class="comment">// An optional bit string that corresponds to the SuppPrivInfo field of the OtherInfo parameter.</span>
-CryptoOperationData? <dfn id="dfn-ConcatParams-privateInfo">privateInfo</dfn>;
+CryptoOperationData <dfn id="dfn-ConcatParams-privateInfo">privateInfo</dfn>;
 };
           </x:codeblock>
         </div>
@@ -16143,11 +16119,11 @@
                     <a href="#dfn-ConcatParams-partyVInfo">partyVInfo</a> member of
                     <var>normalizedAlgorithm</var> as <var>PartyVInfo</var>, the
                     <a href="#dfn-ConcatParams-publicInfo">publicInfo</a> member of
-                    <var>normalizedAlgorithm</var>, if present and not null, as
-                    <var>publicInfo</var> and the
+                    <var>normalizedAlgorithm</var>, if present, as
+                    <var>SuppPubInfo</var> and the
                     <a href="#dfn-ConcatParams-privateInfo">privateInfo</a> member of
-                    <var>normalizedAlgorithm</var>, if present and not null, as
-                    <var>privateInfo</var>.
+                    <var>normalizedAlgorithm</var>, if present, as
+                    <var>SuppPrivInfo</var>.
                   </p>
                 </li>
                 <li>
@@ -16331,11 +16307,11 @@
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-HkdfCtrParams">HkdfCtrParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The algorithm to use with HMAC (e.g.: <a href="#sha-256">SHA-256</a>)</span>
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HkdfCtrParams-hash">hash</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HkdfCtrParams-hash">hash</dfn>;
 <span class="comment">// A bit string that corresponds to the label that identifies the purpose for the derived keying material.</span>
-CryptoOperationData <dfn id="dfn-HkdfCtrParams-label">label</dfn>;
+required CryptoOperationData <dfn id="dfn-HkdfCtrParams-label">label</dfn>;
 <span class="comment">// A bit string that corresponds to the context of the key derivation, as described in Section 5 of NIST SP 800-108 [<a href="#SP800-108">SP800-108</a>]</span>
-CryptoOperationData <dfn id="dfn-HkdfCtrParams-context">context</dfn>;
+required CryptoOperationData <dfn id="dfn-HkdfCtrParams-context">context</dfn>;
 };
           </x:codeblock>
           <div class="ednote">
@@ -16630,9 +16606,9 @@
           <h4>Pbkdf2Params dictionary</h4>
           <x:codeblock language="idl">
 dictionary <dfn id="dfn-Pbkdf2Params">Pbkdf2Params</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
-CryptoOperationData <dfn id="dfn-Pbkdf2Params-salt">salt</dfn>;
-[EnforceRange] unsigned long <dfn id="dfn-Pbkdf2Params-iterations">iterations</dfn>;
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-Pbkdf2Params-hash">hash</dfn>;
+required CryptoOperationData <dfn id="dfn-Pbkdf2Params-salt">salt</dfn>;
+[EnforceRange] required unsigned long <dfn id="dfn-Pbkdf2Params-iterations">iterations</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-Pbkdf2Params-hash">hash</dfn>;
 };
           </x:codeblock>
         </div>
--- a/spec/Overview.html	Thu Sep 25 16:33:41 2014 -0700
+++ b/spec/Overview.html	Thu Sep 25 17:43:05 2014 -0700
@@ -963,7 +963,7 @@
 typedef <a href="#dfn-AlgorithmIdentifier">AlgorithmIdentifier</a> <dfn id="dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</dfn>;
 
 dictionary <dfn id="dfn-Algorithm">Algorithm</dfn> {
-  DOMString <a href="#dfn-Algorithm-name">name</a>;
+  required DOMString <a href="#dfn-Algorithm-name">name</a>;
 };
         </code></pre></div></div>
         <div id="algorithm-dictionary-members" class="section">
@@ -987,7 +987,7 @@
         </p>
         <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-KeyAlgorithm">KeyAlgorithm</dfn> {
-  DOMString <a href="#dfn-KeyAlgorithm-name">name</a>
+  required DOMString <a href="#dfn-KeyAlgorithm-name">name</a>
 };
         </code></pre></div></div>
         <div id="key-algorithm-dictionary-description" class="section">
@@ -3101,11 +3101,6 @@
                     If an error occurred, return the error and terminate this algorithm.
                   </li>
                   <li>
-                    If the <a href="#dfn-Algorithm-name">name</a> attribute of <var>initialAlg</var>
-                    is not present, return a new <code>SyntaxError</code> and terminate this
-                    algorithm.
-                  </li>
-                  <li>
                     Let <var>algName</var> be the value of the <a href="#dfn-Algorithm-name">name</a>
                     attribute of <var>initialAlg</var>.
                   </li>
@@ -3150,15 +3145,6 @@
                         </p>
                         <ol>
                           <li>
-                            If <var>member</var> is not nullable, and is not present, return a new
-                            <code>SyntaxError</code> and terminate this algorithm.
-                          </li>
-                          <li>
-                            If <var>member</var> is nullable, and is not present, return to
-                            iterating the next dictionary member <var>member</var>, stopping further
-                            processing of this <var>member</var>.
-                          </li>
-                          <li>
                             Let <var>key</var> be the identifier of <var>member</var>.
                           </li>
                           <li>
@@ -3741,9 +3727,9 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-RsaKeyGenParams">RsaKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
   <span class="comment">// The length, in bits, of the RSA modulus</span>
-  [EnforceRange] unsigned long <dfn id="dfn-RsaKeyGenParams-modulusLength">modulusLength</dfn>;
+  [EnforceRange] required unsigned long <dfn id="dfn-RsaKeyGenParams-modulusLength">modulusLength</dfn>;
   <span class="comment">// The RSA public exponent</span>
-  <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyGenParams-publicExponent">publicExponent</dfn>;
+  required <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyGenParams-publicExponent">publicExponent</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -3752,7 +3738,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-RsaHashedKeyGenParams">RsaHashedKeyGenParams</dfn> : <a href="#dfn-RsaKeyGenParams">RsaKeyGenParams</a> {
   <span class="comment">// The hash algorithm to use</span> 
-  <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedKeyGenParams-hash">hash</dfn>;
+  required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedKeyGenParams-hash">hash</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -3761,9 +3747,9 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-RsaKeyAlgorithm">RsaKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
   <span class="comment">// The length, in bits, of the RSA modulus</span>
-  unsigned long <dfn id="dfn-RsaKeyAlgorithm-modulusLength">modulusLength</dfn>;
+  required unsigned long <dfn id="dfn-RsaKeyAlgorithm-modulusLength">modulusLength</dfn>;
   <span class="comment">// The RSA public exponent</span>
-  <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyAlgorithm-publicExponent">publicExponent</dfn>;
+  required <a href="#dfn-BigInteger">BigInteger</a> <dfn id="dfn-RsaKeyAlgorithm-publicExponent">publicExponent</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -3772,7 +3758,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-RsaHashedKeyAlgorithm">RsaHashedKeyAlgorithm</dfn> : <a href="#dfn-RsaKeyAlgorithm">RsaKeyAlgorithm</a> {
   <span class="comment">// The hash algorithm that is used with this key</span>
-  <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> <dfn id="dfn-RsaHashedKeyAlgorithm-hash">hash</dfn>;
+  required <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> <dfn id="dfn-RsaHashedKeyAlgorithm-hash">hash</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -3781,7 +3767,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-RsaHashedImportParams">RsaHashedImportParams</dfn> {
   <span class="comment">// The hash algorithm to use</span>
-  <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedImportParams-hash">hash</dfn>;
+  required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-RsaHashedImportParams-hash">hash</dfn>;
 };
           </code></pre></div></div>
           <div class="ednote"><div class="ednoteHeader">Editorial note</div>
@@ -4942,7 +4928,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-RsaPssParams">RsaPssParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The desired length of the random salt</span>
-[EnforceRange] unsigned long <dfn id="dfn-RsaPssParams-saltLength">saltLength</dfn>;
+[EnforceRange] required unsigned long <dfn id="dfn-RsaPssParams-saltLength">saltLength</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -6397,7 +6383,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-RsaOaepParams">RsaOaepParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The optional label/application data to associate with the message</span>
-CryptoOperationData? <dfn id="dfn-RsaOaepParams-label">label</dfn>;
+CryptoOperationData <dfn id="dfn-RsaOaepParams-label">label</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -6417,10 +6403,18 @@
                 </li>
                 <li>
                   <p>
+                    Let <var>label</var> be the <a href="#concept-contents-of-arraybuffer">contents of</a> the <a href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> or the empty octet string if the
+                    <a href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> is not present.
+                  </p>
+                </li>
+                <li>
+                  <p>
                     Perform the encryption operation defined in Section 7.1 of [<cite><a href="#RFC3447">RFC3447</a></cite>] with the key represented by <var>key</var>
                     as the recipient's RSA public key, the <a href="#concept-contents-of-arraybuffer">contents of <var>plaintext</var></a>
-                    as the message to be encrypted, <var>M</var> and the <a href="#concept-contents-of-arraybuffer">contents of</a> <a href="#dfn-RsaOaepParams-label">label</a> member of
-                    <var>normalizedAlgorithm</var> as the label, <var>L</var>, and with the hash
+                    as the message to be encrypted, <var>M</var> and <var>label</var>
+                    as the label, <var>L</var>, and with the hash
                     function specified by the <a href="#dfn-RsaHashedKeyAlgorithm-hash">hash</a>
                     attribute of the [[<a href="#dfn-CryptoKey-slot-algorithm">algorithm</a>]] internal slot of
                     <var>key</var> as the Hash option and MGF1 (defined in Section B.2.1 of
@@ -6456,10 +6450,18 @@
                 </li>
                 <li>
                   <p>
+                    Let <var>label</var> be the <a href="#concept-contents-of-arraybuffer">contents of</a> the <a href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> or the empty octet string if the
+                    <a href="#dfn-RsaOaepParams-label">label</a> member of
+                    <var>normalizedAlgorithm</var> is not present.
+                  </p>
+                </li>
+                <li>
+                  <p>
                     Perform the decryption operation defined in Section 7.1 of [<cite><a href="#RFC3447">RFC3447</a></cite>] with the key represented by <var>key</var>
                     as the recipient's RSA private key, the <a href="#concept-contents-of-arraybuffer">contents of <var>ciphertext</var></a>
-                    as the ciphertext to be decrypted, C, and the <a href="#concept-contents-of-arraybuffer">contents of</a> the <a href="#dfn-RsaOaepParams-label">label</a> member of
-                    <var>normalizedAlgorithm</var> as the label, <var>L</var>, and with the hash
+                    as the ciphertext to be decrypted, C, and <var>label</var>
+                    as the label, <var>L</var>, and with the hash
                     function specified by the <a href="#dfn-RsaHashedKeyAlgorithm-hash">hash</a>
                     attribute of the [[<a href="#dfn-CryptoKey-slot-algorithm">algorithm</a>]] internal slot of
                     <var>key</var> as the Hash option and MGF1 (defined in Section B.2.1 of
@@ -7833,7 +7835,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-EcdsaParams">EcdsaParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The hash algorithm to use</span>
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-EcdsaParams-hash">hash</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-EcdsaParams-hash">hash</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -7844,7 +7846,7 @@
 
 dictionary <dfn id="dfn-EcKeyGenParams">EcKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// A named curve</span>
-<a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyGenParams-namedCurve">namedCurve</dfn>;
+required <a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyGenParams-namedCurve">namedCurve</dfn>;
 };
           </code></pre></div></div>
           <p>
@@ -7870,7 +7872,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-EcKeyAlgorithm">EcKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The named curve that the key uses</span>
-<a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyAlgorithm-namedCurve">namedCurve</dfn>;
+required <a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyAlgorithm-namedCurve">namedCurve</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -7879,7 +7881,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-EcKeyImportParams">EcKeyImportParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// A named curve</span>
-<a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyImportParams-namedCurve">namedCurve</dfn>;
+required <a href="#dfn-NamedCurve">NamedCurve</a> <dfn id="dfn-EcKeyImportParams-namedCurve">namedCurve</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -9250,7 +9252,7 @@
 
 dictionary <dfn id="dfn-EcdhKeyDeriveParams">EcdhKeyDeriveParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The peer's EC public key.</span>
-<a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-EcdhKeyDeriveParams-public">public</dfn>;
+required <a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-EcdhKeyDeriveParams-public">public</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -9270,14 +9272,6 @@
                 </li>
                 <li>
                   <p>
-                    If any of the members of <a href="#dfn-EcKeyGenParams">EcKeyGenParams</a> are
-                    not present in <var>normalizedAlgorithm</var>,
-                    then <a href="#concept-return-an-error">return an error</a> named
-                    <a href="#dfn-SyntaxError"><code>SyntaxError</code></a>.
-                  </p>
-                </li>
-                <li>
-                  <p>
                     If <var>usages</var> contains a value which is not
                     one of <code>"deriveKey"</code> or <code>"deriveBits"</code>,
                     then <a href="#concept-return-an-error">return an error</a> named
@@ -10065,14 +10059,6 @@
                       <ol>
                         <li>
                           <p>
-                            If any of the members of <a href="#dfn-EcKeyImportParams">EcKeyImportParams</a> are not present in
-                            <var>normalizedAlgorithm</var>,
-                            then <a href="#concept-return-an-error">return an error</a> named
-                            <a href="#dfn-SyntaxError"><code>SyntaxError</code></a>.
-                          </p>
-                        </li>
-                        <li>
-                          <p>
                             If the <a href="#dfn-EcKeyImportParams-namedCurve">namedCurve</a>
                             member of <var>normalizedAlgorithm</var> is not a
                             <a href="#dfn-NamedCurve">named curve</a>,
@@ -10610,10 +10596,10 @@
 // incrementing function specified in NIST SP 800-38A Appendix B.1:
 // the counter bits are interpreted as a big-endian integer and
 // incremented by one.</span>
-CryptoOperationData <dfn id="dfn-AesCtrParams-counter">counter</dfn>;
+required CryptoOperationData <dfn id="dfn-AesCtrParams-counter">counter</dfn>;
 <span class="comment">// The length, in bits, of the rightmost part of the counter block
 // that is incremented.</span>
-[EnforceRange] octet <dfn id="dfn-AesCtrParams-length">length</dfn>;
+[EnforceRange] required octet <dfn id="dfn-AesCtrParams-length">length</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -10621,7 +10607,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-AesKeyAlgorithm">AesKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The length, in bits, of the key.</span>
-unsigned short <dfn id="dfn-AesKeyAlgorithm-length">length</dfn>;
+required unsigned short <dfn id="dfn-AesKeyAlgorithm-length">length</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -10630,7 +10616,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-AesKeyGenParams">AesKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The length, in bits, of the key.</span>
-[EnforceRange] unsigned short <dfn id="dfn-AesKeyGenParams-length">length</dfn>;
+[EnforceRange] required unsigned short <dfn id="dfn-AesKeyGenParams-length">length</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -10639,7 +10625,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-AesDerivedKeyParams">AesDerivedKeyParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The length, in bits, of the key.</span>
-[EnforceRange] unsigned short <dfn id="dfn-AesDerivedKeyParams-length">length</dfn>;
+[EnforceRange] required unsigned short <dfn id="dfn-AesDerivedKeyParams-length">length</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -11170,7 +11156,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-AesCbcParams">AesCbcParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The initialization vector. <span class="RFC2119">MUST</span> be 16 bytes.</span>
-CryptoOperationData <dfn id="dfn-AesCbcParams-iv">iv</dfn>;
+required CryptoOperationData <dfn id="dfn-AesCbcParams-iv">iv</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -11695,7 +11681,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-AesCmacParams">AesCmacParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The length, in bits, of the MAC.</span>
-[EnforceRange] unsigned short <dfn id="dfn-AesCmacParams-length">length</dfn>;
+[EnforceRange] required unsigned short <dfn id="dfn-AesCmacParams-length">length</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -12119,15 +12105,6 @@
               <ol>
                 <li>
                   <p>
-                    If any of the members of
-                    <a href="#dfn-AesDerivedKeyParams">AesDerivedKeyParams</a> are not present in
-                    <var>normalizedDerivedKeyAlgorithm</var>,
-                    then <a href="#concept-return-an-error">return an error</a> named
-                    <a href="#dfn-SyntaxError"><code>SyntaxError</code></a>.
-                  </p>
-                </li>
-                <li>
-                  <p>
                     If the <a href="#dfn-AesDerivedKeyParams-length">length</a> member of
                     <var>normalizedDerivedKeyAlgorithm</var> is not 128, 192 or 256,
                     then <a href="#concept-return-an-error">return an error</a> named
@@ -12209,11 +12186,11 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-AesGcmParams">AesGcmParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The initialization vector to use. May be up to 2^64-1 bytes long.</span>
-CryptoOperationData <dfn id="dfn-AesGcmParams-iv">iv</dfn>;
+required CryptoOperationData <dfn id="dfn-AesGcmParams-iv">iv</dfn>;
 <span class="comment">// The additional authentication data to include.</span>
-CryptoOperationData? <dfn id="dfn-AesGcmParams-additionalData">additionalData</dfn>;
+CryptoOperationData <dfn id="dfn-AesGcmParams-additionalData">additionalData</dfn>;
 <span class="comment">// The desired length of the authentication tag. May be 0 - 128.</span>
-[EnforceRange] octet? <dfn id="dfn-AesGcmParams-tagLength">tagLength</dfn>;
+[EnforceRange] octet <dfn id="dfn-AesGcmParams-tagLength">tagLength</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -12243,7 +12220,7 @@
                 <li>
                   <p>
                     If the <a href="#dfn-AesGcmParams-additionalData">additionalData</a> member
-                    of <var>normalizedAlgorithm</var> is present, is not null and has a length
+                    of <var>normalizedAlgorithm</var> is present and has a length
                     greater than 2^64 - 1 bytes,
                     then <a href="#concept-return-an-error">return an error</a> named
                     <a href="#dfn-DataError"><code>DataError</code></a>.
@@ -12252,7 +12229,7 @@
                 <li>
                   <dl class="switch">
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
-                    <var>normalizedAlgorithm</var> is not present or is null:</dt>
+                    <var>normalizedAlgorithm</var> is not present:</dt>
                     <dd>Let <var>tagLength</var> be 128.</dd>
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
                     <var>normalizedAlgorithm</var> is one of 32, 64, 96, 104, 112, 120 or 128:</dt>
@@ -12269,7 +12246,7 @@
                 <li>
                   <p>
                     Let <var>additionalData</var> be <a href="#concept-contents-of-arraybuffer">the contents of</a> the <a href="#dfn-AesGcmParams-additionalData">additionalData</a> member of
-                    <var>normalizedAlgorithm</var> if present and not null and the empty octet
+                    <var>normalizedAlgorithm</var> if present or the empty octet
                     string otherwise.
                   </p>
                 </li>
@@ -12298,7 +12275,7 @@
                 <li>
                   <dl class="switch">
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
-                    <var>normalizedAlgorithm</var> is not present or null:</dt>
+                    <var>normalizedAlgorithm</var> is not present:</dt>
                     <dd>Let <var>tagLength</var> be 128.</dd>
                     <dt>If the <a href="#dfn-AesGcmParams-tagLength">tagLength</a> member of
                     <var>normalizedAlgorithm</var> is one of 32, 64, 96, 104, 112, 120 or 128:</dt>
@@ -12331,7 +12308,7 @@
                 <li>
                   <p>
                     If the <a href="#dfn-AesGcmParams-additionalData">additionalData</a> member
-                    of <var>normalizedAlgorithm</var> is present, is not null and has a length
+                    of <var>normalizedAlgorithm</var> is present and has a length
                     greater than 2^64 - 1
                     bytes,
                     then <a href="#concept-return-an-error">return an error</a> named
@@ -12353,7 +12330,7 @@
                 <li>
                   <p>
                     Let <var>additionalData</var> be <a href="#concept-contents-of-arraybuffer">the contents</a> of the <a href="#dfn-AesGcmParams-additionalData">additionalData</a> member of
-                    <var>normalizedAlgorithm</var> if present and not null and the empty octet
+                    <var>normalizedAlgorithm</var> if present or the empty octet
                     string otherwise.
                   </p>
                 </li>
@@ -12823,7 +12800,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-AesCfbParams">AesCfbParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The initialization vector. <span class="RFC2119">MUST</span> be 16 bytes.</span>
-CryptoOperationData <dfn id="dfn-AesCfbParams-iv">iv</dfn>;
+required CryptoOperationData <dfn id="dfn-AesCfbParams-iv">iv</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -13809,9 +13786,9 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-HmacKeyAlgorithm">HmacKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The inner hash function to use.</span>
-KeyAlgorithm <dfn id="dfn-HmacKeyAlgorithm-hash">hash</dfn>;
+required KeyAlgorithm <dfn id="dfn-HmacKeyAlgorithm-hash">hash</dfn>;
 <span class="comment">// The length (in bits) of the key.</span>
-unsigned long <dfn id="dfn-HmacKeyAlgorithm-length">length</dfn>;
+required unsigned long <dfn id="dfn-HmacKeyAlgorithm-length">length</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -13820,7 +13797,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-HmacKeyGenParams">HmacKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The inner hash function to use.</span>
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HmacKeyGenParams-hash">hash</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HmacKeyGenParams-hash">hash</dfn>;
 <span class="comment">// The length (in bits) of the key to generate. If unspecified, the
 // recommended length will be used, which is the size of the associated hash function's block
 // size.</span>
@@ -14056,8 +14033,7 @@
                           <dl class="switch">
                             <dt>
                               If the <a href="#dfn-HmacImportParams-hash">hash</a> member of
-                              <var>normalizedAlgorithm</var> is present and has a
-                              <a href="#dfn-Algorithm-name">name</a> member:
+                              <var>normalizedAlgorithm</var> is present:
                             </dt>
                             <dd>
                               Set the <a href="#dfn-KeyAlgorithm-name">name</a> attribute of
@@ -14109,8 +14085,7 @@
                           <dl class="switch">
                             <dt>
                               If the <a href="#dfn-HmacImportParams-hash">hash</a> member of
-                              <var>normalizedAlgorithm</var> is present and has a
-                              <a href="#dfn-Algorithm-name">name</a> member:
+                              <var>normalizedAlgorithm</var> is present:
                             </dt>
                             <dd>
                               <ol>
@@ -14376,7 +14351,7 @@
                     specifications</a>, passing <var>key</var> and obtaining <var>result</var>.
                     <dl class="switch">
                       <dt>
-                        If <var>format</var> is not <code>"jwkf"</code> and
+                        If <var>format</var> is not <code>"jwk"</code> and
                         <var>result</var> is an <a href="#dfn-ArrayBuffer">ArrayBuffer</a>
                         object
                       </dt>
@@ -14611,9 +14586,9 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-DhKeyGenParams">DhKeyGenParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The prime p.</span>
-BigInteger <dfn id="dfn-DhKeyGenParams-prime">prime</dfn>;
+required BigInteger <dfn id="dfn-DhKeyGenParams-prime">prime</dfn>;
 <span class="comment">// The base g.</span>
-BigInteger <dfn id="dfn-DhKeyGenParams-generator">generator</dfn>;
+required BigInteger <dfn id="dfn-DhKeyGenParams-generator">generator</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -14622,9 +14597,9 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-DhKeyAlgorithm">DhKeyAlgorithm</dfn> : <a href="#dfn-KeyAlgorithm">KeyAlgorithm</a> {
 <span class="comment">// The prime p.</span>
-BigInteger <dfn id="dfn-DhKeyAlgorithm-prime">prime</dfn>;
+required BigInteger <dfn id="dfn-DhKeyAlgorithm-prime">prime</dfn>;
 <span class="comment">// The base g.</span>
-BigInteger <dfn id="dfn-DhKeyAlgorithm-generator">generator</dfn>;
+required BigInteger <dfn id="dfn-DhKeyAlgorithm-generator">generator</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -14633,7 +14608,7 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-DhKeyDeriveParams">DhKeyDeriveParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The peer's public value.</span>
-<a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-DhKeyDeriveParams-public">public</dfn>;
+required <a href="#dfn-CryptoKey">CryptoKey</a> <dfn id="dfn-DhKeyDeriveParams-public">public</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -14642,9 +14617,9 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-DhImportKeyParams">DhImportKeyParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The prime p.</span>
-BigInteger <dfn id="dfn-DhImportKeyParams-prime">prime</dfn>;
+required BigInteger <dfn id="dfn-DhImportKeyParams-prime">prime</dfn>;
 <span class="comment">// The base g.</span>
-BigInteger <dfn id="dfn-DhImportKeyParams-generator">generator</dfn>;
+required BigInteger <dfn id="dfn-DhImportKeyParams-generator">generator</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -15555,15 +15530,15 @@
 <span class="comment">// A bit string corresponding to the AlgorithmId field of the OtherInfo parameter.</span>
 <span class="comment">// The AlgorithmId indicates how the derived keying material will be parsed and for which</span>
 <span class="comment">// algorithm(s) the derived secret keying material will be used.</span>
-CryptoOperationData <dfn id="dfn-ConcatParams-algorithmId">algorithmId</dfn>;
+required CryptoOperationData <dfn id="dfn-ConcatParams-algorithmId">algorithmId</dfn>;
 <span class="comment">// A bit string that corresponds to the PartyUInfo field of the OtherInfo parameter.</span>
-CryptoOperationData <dfn id="dfn-ConcatParams-partyUInfo">partyUInfo</dfn>;
+required CryptoOperationData <dfn id="dfn-ConcatParams-partyUInfo">partyUInfo</dfn>;
 <span class="comment">// A bit string that corresponds to the PartyVInfo field of the OtherInfo parameter.</span>
-CryptoOperationData <dfn id="dfn-ConcatParams-partyVInfo">partyVInfo</dfn>;
+required CryptoOperationData <dfn id="dfn-ConcatParams-partyVInfo">partyVInfo</dfn>;
 <span class="comment">// An optional bit string that corresponds to the SuppPubInfo field of the OtherInfo parameter.</span>
-CryptoOperationData? <dfn id="dfn-ConcatParams-publicInfo">publicInfo</dfn>;
+CryptoOperationData <dfn id="dfn-ConcatParams-publicInfo">publicInfo</dfn>;
 <span class="comment">// An optional bit string that corresponds to the SuppPrivInfo field of the OtherInfo parameter.</span>
-CryptoOperationData? <dfn id="dfn-ConcatParams-privateInfo">privateInfo</dfn>;
+CryptoOperationData <dfn id="dfn-ConcatParams-privateInfo">privateInfo</dfn>;
 };
           </code></pre></div></div>
         </div>
@@ -15588,11 +15563,11 @@
                     <a href="#dfn-ConcatParams-partyVInfo">partyVInfo</a> member of
                     <var>normalizedAlgorithm</var> as <var>PartyVInfo</var>, the
                     <a href="#dfn-ConcatParams-publicInfo">publicInfo</a> member of
-                    <var>normalizedAlgorithm</var>, if present and not null, as
-                    <var>publicInfo</var> and the
+                    <var>normalizedAlgorithm</var>, if present, as
+                    <var>SuppPubInfo</var> and the
                     <a href="#dfn-ConcatParams-privateInfo">privateInfo</a> member of
-                    <var>normalizedAlgorithm</var>, if present and not null, as
-                    <var>privateInfo</var>.
+                    <var>normalizedAlgorithm</var>, if present, as
+                    <var>SuppPrivInfo</var>.
                   </p>
                 </li>
                 <li>
@@ -15776,11 +15751,11 @@
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-HkdfCtrParams">HkdfCtrParams</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
 <span class="comment">// The algorithm to use with HMAC (e.g.: <a href="#sha-256">SHA-256</a>)</span>
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HkdfCtrParams-hash">hash</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-HkdfCtrParams-hash">hash</dfn>;
 <span class="comment">// A bit string that corresponds to the label that identifies the purpose for the derived keying material.</span>
-CryptoOperationData <dfn id="dfn-HkdfCtrParams-label">label</dfn>;
+required CryptoOperationData <dfn id="dfn-HkdfCtrParams-label">label</dfn>;
 <span class="comment">// A bit string that corresponds to the context of the key derivation, as described in Section 5 of NIST SP 800-108 [<a href="#SP800-108">SP800-108</a>]</span>
-CryptoOperationData <dfn id="dfn-HkdfCtrParams-context">context</dfn>;
+required CryptoOperationData <dfn id="dfn-HkdfCtrParams-context">context</dfn>;
 };
           </code></pre></div></div>
           <div class="ednote"><div class="ednoteHeader">Editorial note</div>
@@ -16072,9 +16047,9 @@
           <h4>38.3. Pbkdf2Params dictionary</h4>
           <div class="block"><div class="blockTitleDiv"><span class="blockTitle">IDL</span></div><div class="blockContent"><pre class="code"><code class="idl-code">
 dictionary <dfn id="dfn-Pbkdf2Params">Pbkdf2Params</dfn> : <a href="#dfn-Algorithm">Algorithm</a> {
-CryptoOperationData <dfn id="dfn-Pbkdf2Params-salt">salt</dfn>;
-[EnforceRange] unsigned long <dfn id="dfn-Pbkdf2Params-iterations">iterations</dfn>;
-<a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-Pbkdf2Params-hash">hash</dfn>;
+required CryptoOperationData <dfn id="dfn-Pbkdf2Params-salt">salt</dfn>;
+[EnforceRange] required unsigned long <dfn id="dfn-Pbkdf2Params-iterations">iterations</dfn>;
+required <a href="#dfn-HashAlgorithmIdentifier">HashAlgorithmIdentifier</a> <dfn id="dfn-Pbkdf2Params-hash">hash</dfn>;
 };
           </code></pre></div></div>
         </div>