<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SubtleCrypto on Grafana Labs</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/</link><description>Recent content in SubtleCrypto on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/index.xml" rel="self" type="application/rss+xml"/><item><title>decrypt</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/decrypt/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/decrypt/</guid><content><![CDATA[&lt;h1 id=&#34;decrypt&#34;&gt;decrypt&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;decrypt()&lt;/code&gt; method decrypts some encrypted data.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;decrypt(algorithm, key, data)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/&#34;&gt;AesCbcParams&lt;/a&gt;, 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/&#34;&gt;AesCtrParams&lt;/a&gt;, or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/&#34;&gt;AesGcmParams&lt;/a&gt; object&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Defines the algorithm to use and any extra-parameters. The values given for the extra parameters must match those used in the corresponding [encrypt] call.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;key&lt;/a&gt; to use for decryption.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;data&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;, &lt;code&gt;TypedArray&lt;/code&gt;, or &lt;code&gt;DataView&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The encrypted data to be decrypted (also known as &lt;em&gt;ciphertext&lt;/em&gt;).&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-encrypt-decrypt.md&#34;&gt;
            &lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CBC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CTR&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-GCM&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-OAEP&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/&#34;&gt;AesCbcParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/&#34;&gt;AesCtrParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/&#34;&gt;AesGcmParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsaoaepparams/&#34;&gt;RsaOaepParams&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves to a new &lt;code&gt;ArrayBuffer&lt;/code&gt; containing the decrypted data.&lt;/p&gt;
&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;InvalidAccessError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the requested operation is not valid with the provided key. For instance when an invalid encryption algorithm is used, or a key not matching the selected algorithm is provided.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;OperationError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the operation failed for an operation-specific reason. For instance, if the algorithm size is invalid, or errors occurred during the process of decrypting the ciphertext.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const plaintext = new TextEncoder().encode(&amp;#39;Hello, World!&amp;#39;);

  /**
   * Generate a symmetric key using the AES-CBC algorithm.
   */
  const key = await crypto.subtle.generateKey(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      length: 256,
    },
    true,
    [&amp;#39;encrypt&amp;#39;, &amp;#39;decrypt&amp;#39;]
  );

  /**
   * Encrypt the plaintext using the AES-CBC key with
   * have generated.
   */
  const iv = crypto.getRandomValues(new Uint8Array(16));
  const ciphertext = await crypto.subtle.encrypt(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      iv: iv,
    },
    key,
    plaintext
  );

  /**
   * Decrypt the ciphertext using the same key to verify
   * that the resulting plaintext is the same as the original.
   */
  const deciphered = await crypto.subtle.decrypt(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      iv: iv,
    },
    key,
    ciphertext
  );

  console.log(
    &amp;#39;deciphered text == original plaintext: &amp;#39;,
    arrayBufferToHex(deciphered) === arrayBufferToHex(plaintext)
  );
}

function arrayBufferToHex(buffer) {
  return [...new Uint8Array(buffer)].map((x) =&amp;gt; x.toString(16).padStart(2, &amp;#39;0&amp;#39;)).join(&amp;#39;&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="decrypt">decrypt&lt;/h1>
&lt;p>The &lt;code>decrypt()&lt;/code> method decrypts some encrypted data.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;div class="code-snippet code-snippet__mini">&lt;div class="lang-toolbar__mini">
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;/div>&lt;div class="code-snippet code-snippet__border">
&lt;pre data-expanded="false">&lt;code class="language-none">decrypt(algorithm, key, data)&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h2 id="parameters">Parameters&lt;/h2>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">Name&lt;/th>
&lt;th style="text-align: left">Type&lt;/th>
&lt;th style="text-align: left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;code>algorithm&lt;/code>&lt;/td>
&lt;td style="text-align: left">
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/">AesCbcParams&lt;/a>,
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/">AesCtrParams&lt;/a>, or
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/">AesGcmParams&lt;/a> object&lt;/td>
&lt;td style="text-align: left">Defines the algorithm to use and any extra-parameters. The values given for the extra parameters must match those used in the corresponding [encrypt] call.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>key&lt;/code>&lt;/td>
&lt;td style="text-align: left">
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a>&lt;/td>
&lt;td style="text-align: left">The
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">key&lt;/a> to use for decryption.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>data&lt;/code>&lt;/td>
&lt;td style="text-align: left">&lt;code>ArrayBuffer&lt;/code>, &lt;code>TypedArray&lt;/code>, or &lt;code>DataView&lt;/code>&lt;/td>
&lt;td style="text-align: left">The encrypted data to be decrypted (also known as &lt;em>ciphertext&lt;/em>).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="supported-algorithms">Supported algorithms&lt;/h3>
&lt;div data-shared="crypto/supported-encrypt-decrypt.md">
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">AES-CBC&lt;/th>
&lt;th style="text-align: left">AES-CTR&lt;/th>
&lt;th style="text-align: left">AES-GCM&lt;/th>
&lt;th style="text-align: left">RSA-OAEP&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/">AesCbcParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/">AesCtrParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/">AesGcmParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/rsaoaepparams/">RsaOaepParams&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;/div>
&lt;h2 id="return-value">Return Value&lt;/h2>
&lt;p>A &lt;code>Promise&lt;/code> that resolves to a new &lt;code>ArrayBuffer&lt;/code> containing the decrypted data.&lt;/p></description></item><item><title>deriveBits</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/derivebits/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/derivebits/</guid><content><![CDATA[&lt;h1 id=&#34;derivebits&#34;&gt;deriveBits&lt;/h1&gt;
&lt;p&gt;It takes as its arguments the base key, the derivation algorithm to use, and the length of the bits to derive. It returns a Promise which will be fulfilled with an &lt;code&gt;ArrayBuffer&lt;/code&gt; containing the derived bits. This array of bits can be used as a key for encryption or decryption as a shared secret.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;deriveBits(algorithm, baseKey, length)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdhkeyderiveparams/&#34;&gt;EcdhKeyDeriveParams&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/pbkdf2params/&#34;&gt;Pbkdf2Params&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;An object defining a derivation algorithm to use.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;baseKey&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Represents an input to derivation algorithm. Could be an ECDH private key or a PBKDF2 password imported as a CryptoKey.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;length&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The length of the bits to derive. Must be a positive number and a multiple of 8.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDH&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;PBKDF2&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HKDF&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdhkeyderiveparams/&#34;&gt;EcdhKeyDeriveParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/pbkdf2params/&#34;&gt;Pbkdf2Params&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;❌&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves to a new &lt;code&gt;ArrayBuffer&lt;/code&gt; containing the derived bits.&lt;/p&gt;
&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;OperationError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when &lt;code&gt;length&lt;/code&gt; is 0 or not a multiple of 8.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;deriving-bits-using-ecdh&#34;&gt;Deriving bits using ECDH&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  // Generate a key pair for Alice
  const aliceKeyPair = await crypto.subtle.generateKey(
    {
      name: &amp;#39;ECDH&amp;#39;,
      namedCurve: &amp;#39;P-256&amp;#39;,
    },
    true,
    [&amp;#39;deriveKey&amp;#39;, &amp;#39;deriveBits&amp;#39;]
  );

  // Generate a key pair for Bob
  const bobKeyPair = await crypto.subtle.generateKey(
    {
      name: &amp;#39;ECDH&amp;#39;,
      namedCurve: &amp;#39;P-256&amp;#39;,
    },
    true,
    [&amp;#39;deriveKey&amp;#39;, &amp;#39;deriveBits&amp;#39;]
  );

  // Derive shared secret for Alice
  const aliceSharedSecret = await deriveSharedSecret(aliceKeyPair.privateKey, bobKeyPair.publicKey);

  // Derive shared secret for Bob
  const bobSharedSecret = await deriveSharedSecret(bobKeyPair.privateKey, aliceKeyPair.publicKey);

  console.log(&amp;#39;alice shared secret: &amp;#39; &amp;#43; printArrayBuffer(aliceSharedSecret));
  console.log(&amp;#39;bob shared secret: &amp;#39; &amp;#43; printArrayBuffer(bobSharedSecret));
}

async function deriveSharedSecret(privateKey, publicKey) {
  return crypto.subtle.deriveBits(
    {
      name: &amp;#39;ECDH&amp;#39;,
      public: publicKey,
    },
    privateKey,
    256
  );
}

const printArrayBuffer = (buffer) =&amp;gt; {
  const view = new Uint8Array(buffer);
  return Array.from(view);
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;deriving-bits-using-pbkdf2&#34;&gt;Deriving bits using PBKDF2&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const password = new TextEncoder().encode(&amp;#39;my secret password&amp;#39;);

  // Import the password as a key
  const baseKey = await crypto.subtle.importKey(&amp;#39;raw&amp;#39;, password, &amp;#39;PBKDF2&amp;#39;, false, [
    &amp;#39;deriveBits&amp;#39;,
    &amp;#39;deriveKey&amp;#39;,
  ]);

  // Generate a random salt
  const salt = crypto.getRandomValues(new Uint8Array(16));

  // Derive 256 bits using PBKDF2
  const derivedBits = await crypto.subtle.deriveBits(
    {
      name: &amp;#39;PBKDF2&amp;#39;,
      hash: &amp;#39;SHA-256&amp;#39;,
      salt: salt,
      iterations: 310000,
    },
    baseKey,
    256
  );

  console.log(&amp;#39;derived bits: &amp;#39; &amp;#43; printArrayBuffer(derivedBits));
}

const printArrayBuffer = (buffer) =&amp;gt; {
  const view = new Uint8Array(buffer);
  return Array.from(view);
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="derivebits">deriveBits&lt;/h1>
&lt;p>It takes as its arguments the base key, the derivation algorithm to use, and the length of the bits to derive. It returns a Promise which will be fulfilled with an &lt;code>ArrayBuffer&lt;/code> containing the derived bits. This array of bits can be used as a key for encryption or decryption as a shared secret.&lt;/p></description></item><item><title>digest</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/digest/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/digest/</guid><content><![CDATA[&lt;h1 id=&#34;digest&#34;&gt;digest&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;digest()&lt;/code&gt; method generates a cryptographically secure &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Glossary/Digest&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;digest&lt;/a&gt; of the given data. A digest is a short fixed-length value derived from some input data. The &lt;code&gt;digest()&lt;/code&gt; method is commonly used to compute a checksum of data or to verify the integrity of data.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;digest(algorithm, data)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;a &lt;code&gt;string&lt;/code&gt; or object with a single &lt;code&gt;name&lt;/code&gt; string property&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Names the hash function to use. Supported values are &lt;code&gt;&amp;quot;SHA-1&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;SHA-256&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;SHA-384&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;SHA-512&amp;quot;&lt;/code&gt;. Note that the SHA-1 hash function is not considered safe for cryptographic use.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;data&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;, &lt;code&gt;TypedArray&lt;/code&gt;, or &lt;code&gt;DataView&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The data to be digested.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;SHA-1&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;SHA-256&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;SHA-384&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;SHA-512&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves to a new &lt;code&gt;ArrayBuffer&lt;/code&gt; containing the digest.&lt;/p&gt;
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const digest = await crypto.subtle.digest(&amp;#39;SHA-256&amp;#39;, new TextEncoder().encode(&amp;#39;Hello, world!&amp;#39;));

  console.log(arrayBufferToHex(digest));
}

function arrayBufferToHex(buffer) {
  return [...new Uint8Array(buffer)].map((x) =&amp;gt; x.toString(16).padStart(2, &amp;#39;0&amp;#39;)).join(&amp;#39;&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="digest">digest&lt;/h1>
&lt;p>The &lt;code>digest()&lt;/code> method generates a cryptographically secure &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Digest" target="_blank" rel="noopener noreferrer">digest&lt;/a> of the given data. A digest is a short fixed-length value derived from some input data. The &lt;code>digest()&lt;/code> method is commonly used to compute a checksum of data or to verify the integrity of data.&lt;/p></description></item><item><title>deriveKey</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/derivekey/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/derivekey/</guid><content><![CDATA[&lt;h1 id=&#34;derivekey&#34;&gt;deriveKey&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;deriveKey()&lt;/code&gt; method derives a secret key from a master key. It takes as arguments a base key, the derivation algorithm to use, and the desired properties for the key to derive. It returns a Promise which will be fulfilled with a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object representing the new key.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;deriveKey(algorithm, baseKey, derivedKeyType, extractable, keyUsages)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/pbkdf2params/&#34;&gt;Pbkdf2Params&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;An object defining the derivation algorithm to use.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;baseKey&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The base key to derive the new key from. For PBKDF2, this is the password imported as a CryptoKey.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;derivedKeyType&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;object with &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;length&lt;/code&gt; properties&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;An object defining the algorithm the derived key will be used for. Must include &lt;code&gt;name&lt;/code&gt; (e.g., &lt;code&gt;AES-GCM&lt;/code&gt;, &lt;code&gt;AES-CBC&lt;/code&gt;, &lt;code&gt;AES-CTR&lt;/code&gt;, &lt;code&gt;AES-KW&lt;/code&gt;) and &lt;code&gt;length&lt;/code&gt; (e.g., 256).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;extractable&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Whether the key can be exported using 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/exportkey/&#34;&gt;exportKey&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;keyUsages&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Array&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;An array indicating what the key can be used for (e.g., &lt;code&gt;encrypt&lt;/code&gt;, &lt;code&gt;decrypt&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;PBKDF2&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDH&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HKDF&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/pbkdf2params/&#34;&gt;Pbkdf2Params&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;❌&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;❌&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-derived-key-algorithms&#34;&gt;Supported derived key algorithms&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CBC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CTR&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-GCM&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-KW&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HMAC&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;❌&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves to a new 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object.&lt;/p&gt;
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const password = new TextEncoder().encode(&amp;#39;my secret password&amp;#39;);

  // Import the password as a key
  const baseKey = await crypto.subtle.importKey(&amp;#39;raw&amp;#39;, password, &amp;#39;PBKDF2&amp;#39;, false, [
    &amp;#39;deriveBits&amp;#39;,
    &amp;#39;deriveKey&amp;#39;,
  ]);

  // Generate a random salt
  const salt = crypto.getRandomValues(new Uint8Array(16));

  // Derive an AES-GCM key using PBKDF2
  const derivedKey = await crypto.subtle.deriveKey(
    {
      name: &amp;#39;PBKDF2&amp;#39;,
      hash: &amp;#39;SHA-256&amp;#39;,
      salt: salt,
      iterations: 310000,
    },
    baseKey,
    {
      name: &amp;#39;AES-GCM&amp;#39;,
      length: 256,
    },
    true,
    [&amp;#39;encrypt&amp;#39;, &amp;#39;decrypt&amp;#39;]
  );

  console.log(&amp;#39;derived key: &amp;#39; &amp;#43; JSON.stringify(derivedKey));
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="derivekey">deriveKey&lt;/h1>
&lt;p>The &lt;code>deriveKey()&lt;/code> method derives a secret key from a master key. It takes as arguments a base key, the derivation algorithm to use, and the desired properties for the key to derive. It returns a Promise which will be fulfilled with a
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a> object representing the new key.&lt;/p></description></item><item><title>encrypt</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/encrypt/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/encrypt/</guid><content><![CDATA[&lt;h1 id=&#34;encrypt&#34;&gt;encrypt&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;encrypt()&lt;/code&gt; method encrypts some data.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;encrypt(algorithm, key, data)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/&#34;&gt;AesCbcParams&lt;/a&gt;, 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/&#34;&gt;AesCtrParams&lt;/a&gt;, or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/&#34;&gt;AesGcmParams&lt;/a&gt; object&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Defines the algorithm to use and any extra-parameters.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;key&lt;/a&gt; to use for encryption.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;data&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;, &lt;code&gt;TypedArray&lt;/code&gt;, or &lt;code&gt;DataView&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The data to be encrypted (also known as &amp;ldquo;plaintext&amp;rdquo;).&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-encrypt-decrypt.md&#34;&gt;
            &lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CBC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CTR&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-GCM&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-OAEP&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/&#34;&gt;AesCbcParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/&#34;&gt;AesCtrParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/&#34;&gt;AesGcmParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsaoaepparams/&#34;&gt;RsaOaepParams&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves to a new &lt;code&gt;ArrayBuffer&lt;/code&gt; containing the encrypted data.&lt;/p&gt;
&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;InvalidAccessError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the requested operation is not valid with the provided key. For instance when an invalid encryption algorithm is used, or a key not matching the selected algorithm is provided.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;OperationError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the operation failed for an operation-specific reason. For instance, if the algorithm size is invalid, or errors occurred during the process of decrypting the ciphertext.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const plaintext = new TextEncoder().encode(&amp;#39;Hello, World!&amp;#39;);

  /**
   * Generate a symmetric key using the AES-CBC algorithm.
   */
  const key = await crypto.subtle.generateKey(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      length: 256,
    },
    true,
    [&amp;#39;encrypt&amp;#39;, &amp;#39;decrypt&amp;#39;]
  );

  /**
   * Encrypt the plaintext using the AES-CBC key with
   * have generated.
   */
  const iv = crypto.getRandomValues(new Uint8Array(16));
  const ciphertext = await crypto.subtle.encrypt(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      iv: iv,
    },
    key,
    plaintext
  );

  /**
   * Decrypt the ciphertext using the same key to verify
   * that the resulting plaintext is the same as the original.
   */
  const deciphered = await crypto.subtle.decrypt(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      iv: iv,
    },
    key,
    ciphertext
  );

  console.log(
    &amp;#39;deciphered text == original plaintext: &amp;#39;,
    arrayBufferToHex(deciphered) === arrayBufferToHex(plaintext)
  );
}

function arrayBufferToHex(buffer) {
  return [...new Uint8Array(buffer)].map((x) =&amp;gt; x.toString(16).padStart(2, &amp;#39;0&amp;#39;)).join(&amp;#39;&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="encrypt">encrypt&lt;/h1>
&lt;p>The &lt;code>encrypt()&lt;/code> method encrypts some data.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;div class="code-snippet code-snippet__mini">&lt;div class="lang-toolbar__mini">
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;/div>&lt;div class="code-snippet code-snippet__border">
&lt;pre data-expanded="false">&lt;code class="language-none">encrypt(algorithm, key, data)&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h2 id="parameters">Parameters&lt;/h2>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">Name&lt;/th>
&lt;th style="text-align: left">Type&lt;/th>
&lt;th style="text-align: left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;code>algorithm&lt;/code>&lt;/td>
&lt;td style="text-align: left">
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/">AesCbcParams&lt;/a>,
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/">AesCtrParams&lt;/a>, or
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/">AesGcmParams&lt;/a> object&lt;/td>
&lt;td style="text-align: left">Defines the algorithm to use and any extra-parameters.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>key&lt;/code>&lt;/td>
&lt;td style="text-align: left">
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a>&lt;/td>
&lt;td style="text-align: left">The
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">key&lt;/a> to use for encryption.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>data&lt;/code>&lt;/td>
&lt;td style="text-align: left">&lt;code>ArrayBuffer&lt;/code>, &lt;code>TypedArray&lt;/code>, or &lt;code>DataView&lt;/code>&lt;/td>
&lt;td style="text-align: left">The data to be encrypted (also known as &amp;ldquo;plaintext&amp;rdquo;).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="supported-algorithms">Supported algorithms&lt;/h3>
&lt;div data-shared="crypto/supported-encrypt-decrypt.md">
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">AES-CBC&lt;/th>
&lt;th style="text-align: left">AES-CTR&lt;/th>
&lt;th style="text-align: left">AES-GCM&lt;/th>
&lt;th style="text-align: left">RSA-OAEP&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/">AesCbcParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/">AesCtrParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/">AesGcmParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/rsaoaepparams/">RsaOaepParams&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;/div>
&lt;h2 id="return-value">Return Value&lt;/h2>
&lt;p>A &lt;code>Promise&lt;/code> that resolves to a new &lt;code>ArrayBuffer&lt;/code> containing the encrypted data.&lt;/p></description></item><item><title>exportKey</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/exportkey/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/exportkey/</guid><content><![CDATA[&lt;h1 id=&#34;exportkey&#34;&gt;exportKey&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;exportKey()&lt;/code&gt; method takes a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object as input and exports it in an external, portable format.&lt;/p&gt;
&lt;p&gt;Note that for a key to be exportable, it must have been created with the &lt;code&gt;extractable&lt;/code&gt; flag set to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;exportKey(format, key)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;format&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Defines the data format in which the key should be exported. Depending on the algorithm and key type, the data format could vary. Currently supported formats are &lt;code&gt;raw&lt;/code&gt;, &lt;code&gt;jwk&lt;/code&gt;, &lt;code&gt;spki&lt;/code&gt;, and &lt;code&gt;pkcs8&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;key&lt;/a&gt; to export.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-key-methods.md&#34;&gt;
            &lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CBC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CTR&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-GCM&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-KW&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDH&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDSA&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HMAC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;PBKDF2&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-OAEP&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSASSA-PKCS1-v1_5&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-PSS&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/&#34;&gt;AesCbcParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/&#34;&gt;AesCtrParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/&#34;&gt;AesGcmParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;❌&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdhkeyderiveparams/&#34;&gt;EcdhKeyDeriveParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/&#34;&gt;EcdsaParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;HmacKeyGenParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/pbkdf2params/&#34;&gt;Pbkdf2Params&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h3 id=&#34;supported-formats&#34;&gt;Supported formats&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-key-methods-formats.md&#34;&gt;
            &lt;ul&gt;
&lt;li&gt;&lt;code&gt;ECDH&lt;/code&gt; and &lt;code&gt;ECDSA&lt;/code&gt; algorithms have support for &lt;code&gt;pkcs8&lt;/code&gt;, &lt;code&gt;spki&lt;/code&gt;, &lt;code&gt;raw&lt;/code&gt; and &lt;code&gt;jwk&lt;/code&gt; formats.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RSA-OAEP&lt;/code&gt;, &lt;code&gt;RSASSA-PKCS1-v1_5&lt;/code&gt; and &lt;code&gt;RSA-PSS&lt;/code&gt; algorithms have support for &lt;code&gt;pkcs8&lt;/code&gt;, &lt;code&gt;spki&lt;/code&gt; and &lt;code&gt;jwk&lt;/code&gt; formats.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AES-*&lt;/code&gt; and &lt;code&gt;HMAC&lt;/code&gt; algorithms have currently support for &lt;code&gt;raw&lt;/code&gt; and &lt;code&gt;jwk&lt;/code&gt; formats.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PBKDF2&lt;/code&gt; algorithm has support for &lt;code&gt;raw&lt;/code&gt; format only.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves to a new &lt;code&gt;ArrayBuffer&lt;/code&gt; or an 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/jsonwebkey/&#34;&gt;JsonWebKey&lt;/a&gt; object/dictionary containing the key.&lt;/p&gt;
&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;InvalidAccessError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when trying to export a non-extractable key.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;NotSupportedError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when trying to export in an unknown format.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when trying to use an invalid format.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  /**
   * Generate a symmetric key using the AES-CBC algorithm.
   */
  const generatedKey = await crypto.subtle.generateKey(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      length: &amp;#39;256&amp;#39;,
    },
    true,
    [&amp;#39;encrypt&amp;#39;, &amp;#39;decrypt&amp;#39;]
  );

  /**
   * Export the key in raw format.
   */
  const exportedKey = await crypto.subtle.exportKey(&amp;#39;raw&amp;#39;, generatedKey);

  /**
   * Reimport the key in raw format to verify its integrity.
   */
  const importedKey = await crypto.subtle.importKey(&amp;#39;raw&amp;#39;, exportedKey, &amp;#39;AES-CBC&amp;#39;, true, [
    &amp;#39;encrypt&amp;#39;,
    &amp;#39;decrypt&amp;#39;,
  ]);

  console.log(JSON.stringify(importedKey));
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="exportkey">exportKey&lt;/h1>
&lt;p>The &lt;code>exportKey()&lt;/code> method takes a
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a> object as input and exports it in an external, portable format.&lt;/p>
&lt;p>Note that for a key to be exportable, it must have been created with the &lt;code>extractable&lt;/code> flag set to &lt;code>true&lt;/code>.&lt;/p></description></item><item><title>generateKey</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/generatekey/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/generatekey/</guid><content><![CDATA[&lt;h1 id=&#34;generatekey&#34;&gt;generateKey&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;generateKey()&lt;/code&gt; generates a new cryptographic key and returns it as a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object or a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokeypair/&#34;&gt;CryptoKeyPair&lt;/a&gt; object that can be used with the Web Crypto API.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;generateKey(algorithm, extractable, keyUsages)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;a &lt;code&gt;string&lt;/code&gt; or algorithm object with a single &lt;code&gt;name&lt;/code&gt; string&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The type of key to generate. It can be either a string with any of the currently supported algorithms as a value or any of the generation key parameter objects.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;extractable&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Whether the key can be exported using 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/exportkey/&#34;&gt;exportKey&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;keyUsages&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Array&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;An array of strings describing what operations can be performed with the key. Key usages could vary depending on the algorithm.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-key-methods.md&#34;&gt;
            &lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CBC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CTR&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-GCM&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-KW&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDH&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDSA&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HMAC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;PBKDF2&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-OAEP&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSASSA-PKCS1-v1_5&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-PSS&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/&#34;&gt;AesCbcParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/&#34;&gt;AesCtrParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/&#34;&gt;AesGcmParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;❌&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdhkeyderiveparams/&#34;&gt;EcdhKeyDeriveParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/&#34;&gt;EcdsaParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;HmacKeyGenParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/pbkdf2params/&#34;&gt;Pbkdf2Params&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves with the generated key as a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object or a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokeypair/&#34;&gt;CryptoKeyPair&lt;/a&gt; object.&lt;/p&gt;
&lt;h3 id=&#34;algorithm-specific-input&#34;&gt;Algorithm specific input&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HMAC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDH&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDSA&lt;/th&gt;
              &lt;th&gt;RSA-OAEP&lt;/th&gt;
              &lt;th&gt;RSASSA-PKCS1-v1_5&lt;/th&gt;
              &lt;th&gt;RSA-PSS&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Parameters type to use&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;&lt;code&gt;HmacKeyGenParams&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aeskeygenparams/&#34;&gt;&lt;code&gt;AesKeyGenParams&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/eckeygenparams/&#34;&gt;&lt;code&gt;EcKeyGenParams&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/eckeygenparams/&#34;&gt;&lt;code&gt;EcKeyGenParams&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedkeygenparams/&#34;&gt;&lt;code&gt;RSAHashedKeyGenParams&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedkeygenparams/&#34;&gt;&lt;code&gt;RSAHashedKeyGenParams&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedkeygenparams/&#34;&gt;&lt;code&gt;RSAHashedKeyGenParams&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Possible key usages&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;sign&lt;/code&gt;, &lt;code&gt;verify&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;encrypt&lt;/code&gt;, &lt;code&gt;decrypt&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;deriveKey&lt;/code&gt;, &lt;code&gt;deriveBits&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;sign&lt;/code&gt;, &lt;code&gt;verify&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;encrypt&lt;/code&gt;, &lt;code&gt;decrypt&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;sign&lt;/code&gt;, &lt;code&gt;verify&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;sign&lt;/code&gt;, &lt;code&gt;verify&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;SyntaxError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the &lt;code&gt;keyUsages&lt;/code&gt; parameter is empty, but the key is of type &lt;code&gt;secret&lt;/code&gt; or &lt;code&gt;private&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const key = await crypto.subtle.generateKey(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      length: 256,
    },
    true,
    [&amp;#39;encrypt&amp;#39;, &amp;#39;decrypt&amp;#39;]
  );

  console.log(JSON.stringify(key));
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="generatekey">generateKey&lt;/h1>
&lt;p>The &lt;code>generateKey()&lt;/code> generates a new cryptographic key and returns it as a
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a> object or a
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokeypair/">CryptoKeyPair&lt;/a> object that can be used with the Web Crypto API.&lt;/p></description></item><item><title>importKey</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/importkey/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/importkey/</guid><content><![CDATA[&lt;h1 id=&#34;importkey&#34;&gt;importKey&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;importKey()&lt;/code&gt; imports a key from an external, portable format, and gives you a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object that can be used with the Web Crypto API.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;importKey(format, keyData, algorithm, extractable, keyUsages)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;format&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Defines the data format of the key to import. Depending on the algorithm and key type, the data format could vary. Currently supported formats are &lt;code&gt;raw&lt;/code&gt;, &lt;code&gt;jwk&lt;/code&gt;, &lt;code&gt;spki&lt;/code&gt;, and &lt;code&gt;pkcs8&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;keyData&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;, &lt;code&gt;TypedArray&lt;/code&gt;, &lt;code&gt;DataView&lt;/code&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/jsonwebkey/&#34;&gt;JsonWebKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;the data to import the key from.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;a &lt;code&gt;string&lt;/code&gt; or object with a single &lt;code&gt;name&lt;/code&gt; string property&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The algorithm to use to import the key.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;extractable&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Indicates whether it will be possible to export the key using 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/exportkey/&#34;&gt;exportKey&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;keyUsages&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Array&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;An array of strings describing what operations can be performed with the key. Supported usages include &lt;code&gt;encrypt&lt;/code&gt;, &lt;code&gt;decrypt&lt;/code&gt;, &lt;code&gt;sign&lt;/code&gt;, &lt;code&gt;verify&lt;/code&gt;, &lt;code&gt;deriveBits&lt;/code&gt;, and &lt;code&gt;deriveKey&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-key-methods.md&#34;&gt;
            &lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CBC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-CTR&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-GCM&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;AES-KW&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDH&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDSA&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HMAC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;PBKDF2&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-OAEP&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSASSA-PKCS1-v1_5&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-PSS&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aescbcparams/&#34;&gt;AesCbcParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesctrparams/&#34;&gt;AesCtrParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/aesgcmparams/&#34;&gt;AesGcmParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;❌&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdhkeyderiveparams/&#34;&gt;EcdhKeyDeriveParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/&#34;&gt;EcdsaParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;HmacKeyGenParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/pbkdf2params/&#34;&gt;Pbkdf2Params&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsahashedimportparams/&#34;&gt;RsaHashedImportParams&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h3 id=&#34;supported-formats&#34;&gt;Supported formats&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-key-methods-formats.md&#34;&gt;
            &lt;ul&gt;
&lt;li&gt;&lt;code&gt;ECDH&lt;/code&gt; and &lt;code&gt;ECDSA&lt;/code&gt; algorithms have support for &lt;code&gt;pkcs8&lt;/code&gt;, &lt;code&gt;spki&lt;/code&gt;, &lt;code&gt;raw&lt;/code&gt; and &lt;code&gt;jwk&lt;/code&gt; formats.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RSA-OAEP&lt;/code&gt;, &lt;code&gt;RSASSA-PKCS1-v1_5&lt;/code&gt; and &lt;code&gt;RSA-PSS&lt;/code&gt; algorithms have support for &lt;code&gt;pkcs8&lt;/code&gt;, &lt;code&gt;spki&lt;/code&gt; and &lt;code&gt;jwk&lt;/code&gt; formats.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AES-*&lt;/code&gt; and &lt;code&gt;HMAC&lt;/code&gt; algorithms have currently support for &lt;code&gt;raw&lt;/code&gt; and &lt;code&gt;jwk&lt;/code&gt; formats.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PBKDF2&lt;/code&gt; algorithm has support for &lt;code&gt;raw&lt;/code&gt; format only.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

        
&lt;h3 id=&#34;pbkdf2-constraints&#34;&gt;PBKDF2 constraints&lt;/h3&gt;
&lt;p&gt;When importing a key for the PBKDF2 algorithm, the following constraints apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;extractable&lt;/code&gt; must be &lt;code&gt;false&lt;/code&gt;. Attempting to set it to &lt;code&gt;true&lt;/code&gt; throws a &lt;code&gt;SyntaxError&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Only the &lt;code&gt;raw&lt;/code&gt; format is supported. Other formats throw a &lt;code&gt;NotSupportedError&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Only &lt;code&gt;deriveBits&lt;/code&gt; and &lt;code&gt;deriveKey&lt;/code&gt; usages are allowed. Other usages throw a &lt;code&gt;SyntaxError&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves with the imported key as a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object.&lt;/p&gt;
&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;SyntaxError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the &lt;code&gt;keyUsages&lt;/code&gt; parameter is empty but the key is of type &lt;code&gt;secret&lt;/code&gt; or &lt;code&gt;private&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when trying to use an invalid format, or if the &lt;code&gt;keyData&lt;/code&gt; is not suited for that format.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;round-trip-key-exportimport&#34;&gt;Round-trip key export/import&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  /**
   * Generate a symmetric key using the AES-CBC algorithm.
   */
  const generatedKey = await crypto.subtle.generateKey(
    {
      name: &amp;#39;AES-CBC&amp;#39;,
      length: &amp;#39;256&amp;#39;,
    },
    true,
    [&amp;#39;encrypt&amp;#39;, &amp;#39;decrypt&amp;#39;]
  );

  /**
   * Export the key in raw format.
   */
  const exportedKey = await crypto.subtle.exportKey(&amp;#39;raw&amp;#39;, generatedKey);

  /**
   * Reimport the key in raw format to verify its integrity.
   */
  const importedKey = await crypto.subtle.importKey(&amp;#39;raw&amp;#39;, exportedKey, &amp;#39;AES-CBC&amp;#39;, true, [
    &amp;#39;encrypt&amp;#39;,
    &amp;#39;decrypt&amp;#39;,
  ]);

  console.log(JSON.stringify(importedKey));
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;import-a-static-raw-key-and-decrypt-transmitted-data&#34;&gt;Import a static raw key and decrypt transmitted data&lt;/h3&gt;
&lt;p&gt;This example demonstrates how to import a static &lt;code&gt;raw&lt;/code&gt; key and decrypt some transmitted data in &lt;code&gt;base64&lt;/code&gt;. The transmitted data in this example represents an initialization vector and encoded data, and in a real-world scenario, it can be a response body or other data received from a request.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { b64decode } from &amp;#39;k6/encoding&amp;#39;;

export default async function () {
  const transmittedData = base64Decode(
    &amp;#39;whzEN310mrlWIH/icf0dMquRZ2ENyfOzkvPuu92WR/9F8dbeFM8EGUVNIhaS&amp;#39;
  );

  // keyData is the key used to decrypt the data, which is usually stored in a secure location
  // for this example, we are using a static key
  const keyData = new Uint8Array([
    109, 151, 76, 33, 232, 253, 176, 90, 94, 40, 146, 227, 139, 208, 245, 139, 69, 215, 55, 197, 43,
    122, 160, 178, 228, 104, 4, 115, 138, 159, 119, 49,
  ]);

  try {
    const result = await decrypt(keyData, transmittedData);

    // should output decrypted message
    // INFO[0000] result: &amp;#39;my secret message&amp;#39;  source=console
    console.log(&amp;#34;result: &amp;#39;&amp;#34; &amp;#43; result &amp;#43; &amp;#34;&amp;#39;&amp;#34;);
  } catch (e) {
    console.log(&amp;#39;Error: &amp;#39; &amp;#43; JSON.stringify(e));
  }
}

const decrypt = async (keyData, transmittedData) =&amp;gt; {
  const initializeVectorLength = 12;

  // the first 12 bytes are the initialization vector
  const iv = new Uint8Array(transmittedData.subarray(0, initializeVectorLength));

  // the rest of the transmitted data is the encrypted data
  const encryptedData = new Uint8Array(transmittedData.subarray(initializeVectorLength));

  const importedKey = await crypto.subtle.importKey(
    &amp;#39;raw&amp;#39;,
    keyData,
    { name: &amp;#39;AES-GCM&amp;#39;, length: &amp;#39;256&amp;#39; },
    true,
    [&amp;#39;decrypt&amp;#39;]
  );

  const plain = await crypto.subtle.decrypt(
    { name: &amp;#39;AES-GCM&amp;#39;, iv: iv },
    importedKey,
    encryptedData
  );

  return new TextDecoder().decode(plain);
};

const base64Decode = (base64String) =&amp;gt; {
  return new Uint8Array(b64decode(base64String));
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;import-a-static-jwk-key-and-decrypt-transmitted-data&#34;&gt;Import a static JWK key and decrypt transmitted data&lt;/h3&gt;
&lt;p&gt;This example is similar to the previous one. It demonstrates how to import a static &lt;code&gt;jwk&lt;/code&gt; key and decrypt some transmitted data (which contains the initialization vector and encoded data) in &lt;code&gt;base64&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { b64decode } from &amp;#39;k6/encoding&amp;#39;;

export default async function () {
  // transmitted data is the base64 of the initialization vector &amp;#43; encrypted data
  // that unusually transmitted over the network
  const transmittedData = base64Decode(
    &amp;#39;drCfxl4O&amp;#43;5FcrHe8Bs0CvKlw3gZpv&amp;#43;S5if3zn7c4BJzHJ35QDFV4sJB0pbDT&amp;#39;
  );

  // keyData is the key used to decrypt the data, which is usually stored in a secure location
  // for this example, we are using a static key
  const jwkKeyData = {
    kty: &amp;#39;oct&amp;#39;,
    ext: true,
    key_ops: [&amp;#39;decrypt&amp;#39;, &amp;#39;encrypt&amp;#39;],
    alg: &amp;#39;A256GCM&amp;#39;,
    k: &amp;#39;9Id_8iG6FkGOWmc1S203vGVnTExtpDGxdQN7v7OV9Uc&amp;#39;,
  };

  try {
    const result = await decrypt(jwkKeyData, transmittedData);

    // should output decrypted message
    // INFO[0000] result: &amp;#39;my secret message&amp;#39;  source=console
    console.log(&amp;#34;result: &amp;#39;&amp;#34; &amp;#43; result &amp;#43; &amp;#34;&amp;#39;&amp;#34;);
  } catch (e) {
    console.log(&amp;#39;Error: &amp;#39; &amp;#43; JSON.stringify(e));
  }
}

const decrypt = async (keyData, transmittedData) =&amp;gt; {
  const initializeVectorLength = 12;

  // the first 12 bytes are the initialization vector
  const iv = new Uint8Array(transmittedData.subarray(0, initializeVectorLength));

  // the rest of the transmitted data is the encrypted data
  const encryptedData = new Uint8Array(transmittedData.subarray(initializeVectorLength));

  const importedKey = await crypto.subtle.importKey(
    &amp;#39;jwk&amp;#39;,
    keyData,
    { name: &amp;#39;AES-GCM&amp;#39;, length: 256 },
    true,
    [&amp;#39;encrypt&amp;#39;, &amp;#39;decrypt&amp;#39;]
  );

  const plain = await crypto.subtle.decrypt(
    { name: &amp;#39;AES-GCM&amp;#39;, iv: iv },
    importedKey,
    encryptedData
  );

  return new TextDecoder().decode(plain);
};

const base64Decode = (base64String) =&amp;gt; {
  return new Uint8Array(b64decode(base64String));
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;import-a-password-for-pbkdf2-key-derivation&#34;&gt;Import a password for PBKDF2 key derivation&lt;/h3&gt;
&lt;p&gt;This example demonstrates how to import a password as key material for PBKDF2 key derivation.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const password = new TextEncoder().encode(&amp;#39;my secret password&amp;#39;);

  // Import the password as a key for PBKDF2
  // Note: extractable must be false for PBKDF2
  const baseKey = await crypto.subtle.importKey(&amp;#39;raw&amp;#39;, password, &amp;#39;PBKDF2&amp;#39;, false, [
    &amp;#39;deriveBits&amp;#39;,
    &amp;#39;deriveKey&amp;#39;,
  ]);

  console.log(&amp;#39;imported PBKDF2 key: &amp;#39; &amp;#43; JSON.stringify(baseKey));

  // Now you can use this key with deriveBits or deriveKey
  const salt = crypto.getRandomValues(new Uint8Array(16));
  const derivedBits = await crypto.subtle.deriveBits(
    {
      name: &amp;#39;PBKDF2&amp;#39;,
      hash: &amp;#39;SHA-256&amp;#39;,
      salt: salt,
      iterations: 310000,
    },
    baseKey,
    256
  );

  console.log(&amp;#39;derived bits: &amp;#39; &amp;#43; arrayBufferToHex(derivedBits));
}

function arrayBufferToHex(buffer) {
  return [...new Uint8Array(buffer)].map((x) =&amp;gt; x.toString(16).padStart(2, &amp;#39;0&amp;#39;)).join(&amp;#39;&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="importkey">importKey&lt;/h1>
&lt;p>The &lt;code>importKey()&lt;/code> imports a key from an external, portable format, and gives you a
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a> object that can be used with the Web Crypto API.&lt;/p></description></item><item><title>sign</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/sign/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/sign/</guid><content><![CDATA[&lt;h1 id=&#34;sign&#34;&gt;sign&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;sign()&lt;/code&gt; operation generates a digital signature of the provided &lt;code&gt;data&lt;/code&gt;, using the given 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt; object.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;sign(algorithm, key, data)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;string&lt;/code&gt; or object with a single &lt;code&gt;name&lt;/code&gt; string property (&lt;code&gt;{name: &amp;quot;RSASSA-PKCS1-v1_5&amp;quot;}&lt;/code&gt;) or an 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/&#34;&gt;EcdsaParams&lt;/a&gt;, 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;HmacKeyGenParams&lt;/a&gt;, or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsapssparams/&#34;&gt;RsaPssParams&lt;/a&gt; object.&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The signature algorithm to use.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The key to use for signing.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;data&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;, &lt;code&gt;TypedArray&lt;/code&gt;, or &lt;code&gt;DataView&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The data to be signed.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-sign-verify.md&#34;&gt;
            &lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDSA&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HMAC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSASSA-PKCS1-v1_5&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-PSS&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/&#34;&gt;EcdsaParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;HmacKeyGenParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsapssparams/&#34;&gt;RsaPssParams&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves with the signature as an &lt;code&gt;ArrayBuffer&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;InvalidAccessError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the signing key either does not support signing operation, or is incompatible with the selected algorithm.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;signing-data-with-hmac-key&#34;&gt;Signing data with HMAC key&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const generatedKey = await crypto.subtle.generateKey(
    {
      name: &amp;#39;HMAC&amp;#39;,
      hash: { name: &amp;#39;SHA-1&amp;#39; },
    },
    true,
    [&amp;#39;sign&amp;#39;, &amp;#39;verify&amp;#39;]
  );

  const data = new TextEncoder().encode(&amp;#39;Hello World&amp;#39;);

  /**
   * Signes the encoded data with the provided key using the HMAC algorithm
   * the returned signature can be verified using the verify method.
   */
  const signature = await crypto.subtle.sign(&amp;#39;HMAC&amp;#39;, generatedKey, data);

  /**
   * Verifies the signature of the encoded data with the provided key using the HMAC algorithm.
   */
  const verified = await crypto.subtle.verify(&amp;#39;HMAC&amp;#39;, generatedKey, signature, data);

  console.log(&amp;#39;verified: &amp;#39;, verified);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;signing-and-verifying-data-with-ecdsa&#34;&gt;Signing and verifying data with ECDSA&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const keyPair = await crypto.subtle.generateKey(
    {
      name: &amp;#39;ECDSA&amp;#39;,
      namedCurve: &amp;#39;P-256&amp;#39;,
    },
    true,
    [&amp;#39;sign&amp;#39;, &amp;#39;verify&amp;#39;]
  );

  const data = new TextEncoder().encode(&amp;#39;Hello World&amp;#39;);

  const alg = { name: &amp;#39;ECDSA&amp;#39;, hash: { name: &amp;#39;SHA-256&amp;#39; } };

  // makes a signature of the encoded data with the provided key
  const signature = await crypto.subtle.sign(alg, keyPair.privateKey, data);

  console.log(&amp;#39;signature: &amp;#39;, printArrayBuffer(signature));

  //Verifies the signature of the encoded data with the provided key
  const verified = await crypto.subtle.verify(alg, keyPair.publicKey, signature, data);

  console.log(&amp;#39;verified: &amp;#39;, verified);
}

const printArrayBuffer = (buffer) =&amp;gt; {
  const view = new Uint8Array(buffer);
  return Array.from(view);
};&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="sign">sign&lt;/h1>
&lt;p>The &lt;code>sign()&lt;/code> operation generates a digital signature of the provided &lt;code>data&lt;/code>, using the given
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a> object.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;div class="code-snippet code-snippet__mini">&lt;div class="lang-toolbar__mini">
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;/div>&lt;div class="code-snippet code-snippet__border">
&lt;pre data-expanded="false">&lt;code class="language-none">sign(algorithm, key, data)&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h2 id="parameters">Parameters&lt;/h2>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">Name&lt;/th>
&lt;th style="text-align: left">Type&lt;/th>
&lt;th style="text-align: left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;code>algorithm&lt;/code>&lt;/td>
&lt;td style="text-align: left">&lt;code>string&lt;/code> or object with a single &lt;code>name&lt;/code> string property (&lt;code>{name: &amp;quot;RSASSA-PKCS1-v1_5&amp;quot;}&lt;/code>) or an
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/">EcdsaParams&lt;/a>,
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/">HmacKeyGenParams&lt;/a>, or
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/rsapssparams/">RsaPssParams&lt;/a> object.&lt;/td>
&lt;td style="text-align: left">The signature algorithm to use.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>key&lt;/code>&lt;/td>
&lt;td style="text-align: left">
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/">CryptoKey&lt;/a>&lt;/td>
&lt;td style="text-align: left">The key to use for signing.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>data&lt;/code>&lt;/td>
&lt;td style="text-align: left">&lt;code>ArrayBuffer&lt;/code>, &lt;code>TypedArray&lt;/code>, or &lt;code>DataView&lt;/code>&lt;/td>
&lt;td style="text-align: left">The data to be signed.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="supported-algorithms">Supported algorithms&lt;/h3>
&lt;div data-shared="crypto/supported-sign-verify.md">
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">ECDSA&lt;/th>
&lt;th style="text-align: left">HMAC&lt;/th>
&lt;th style="text-align: left">RSASSA-PKCS1-v1_5&lt;/th>
&lt;th style="text-align: left">RSA-PSS&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/">EcdsaParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/">HmacKeyGenParams&lt;/a>&lt;/td>
&lt;td style="text-align: left">✅&lt;/td>
&lt;td style="text-align: left">✅
&lt;a href="/docs/k6/v2.3.x/javascript-api/crypto/rsapssparams/">RsaPssParams&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;/div>
&lt;h2 id="return-value">Return Value&lt;/h2>
&lt;p>A &lt;code>Promise&lt;/code> that resolves with the signature as an &lt;code>ArrayBuffer&lt;/code>.&lt;/p></description></item><item><title>verify</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/verify/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/crypto/subtlecrypto/verify/</guid><content><![CDATA[&lt;h1 id=&#34;verify&#34;&gt;verify&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;verify()&lt;/code&gt; operation verifies a digital signature. It ensures that some data was signed by a known key and that the data has not been tampered with since it was signed.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;verify(algorithm, key, signature, data)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;parameters&#34;&gt;Parameters&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Name&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;string&lt;/code&gt; or object with a single &lt;code&gt;name&lt;/code&gt; string property (&lt;code&gt;{name: &amp;quot;RSASSA-PKCS1-v1_5&amp;quot;}&lt;/code&gt;) or an 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/&#34;&gt;EcdsaParams&lt;/a&gt;, 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;HmacKeyGenParams&lt;/a&gt;, or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsapssparams/&#34;&gt;RsaPssParams&lt;/a&gt; object.&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The signature algorithm to use.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/cryptokey/&#34;&gt;CryptoKey&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The key that will be used to verify the signature.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;signature&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The signature to verify.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;data&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;The data whose signature is to be verified.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;supported-algorithms&#34;&gt;Supported algorithms&lt;/h3&gt;


&lt;div data-shared=&#34;crypto/supported-sign-verify.md&#34;&gt;
            &lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;ECDSA&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;HMAC&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSASSA-PKCS1-v1_5&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;RSA-PSS&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/ecdsaparams/&#34;&gt;EcdsaParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/hmackeygenparams/&#34;&gt;HmacKeyGenParams&lt;/a&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;✅ 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/crypto/rsapssparams/&#34;&gt;RsaPssParams&lt;/a&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;return-value&#34;&gt;Return Value&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Promise&lt;/code&gt; that resolves to a &lt;code&gt;boolean&lt;/code&gt; value indicating if the signature is valid.&lt;/p&gt;
&lt;h2 id=&#34;throws&#34;&gt;Throws&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Type&lt;/th&gt;
              &lt;th style=&#34;text-align: left&#34;&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;InvalidAccessError&lt;/code&gt;&lt;/td&gt;
              &lt;td style=&#34;text-align: left&#34;&gt;Raised when the key either does not support the &lt;code&gt;verify&lt;/code&gt; operation, or is incompatible with the selected algorithm.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;verifying-an-hmac-signature&#34;&gt;Verifying an HMAC signature&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const generatedKey = await crypto.subtle.generateKey(
    {
      name: &amp;#39;HMAC&amp;#39;,
      hash: { name: &amp;#39;SHA-1&amp;#39; },
    },
    true,
    [&amp;#39;sign&amp;#39;, &amp;#39;verify&amp;#39;]
  );

  const data = new TextEncoder().encode(&amp;#39;Hello World&amp;#39;);

  /**
   * Signes the encoded data with the provided key using the HMAC algorithm
   * the returned signature can be verified using the verify method.
   */
  const signature = await crypto.subtle.sign(&amp;#39;HMAC&amp;#39;, generatedKey, data);

  /**
   * Verifies the signature of the encoded data with the provided key using the HMAC algorithm.
   */
  const verified = await crypto.subtle.verify(&amp;#39;HMAC&amp;#39;, generatedKey, signature, data);

  console.log(&amp;#39;verified: &amp;#39;, verified);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;verifying-an-ecdsa-signature&#34;&gt;Verifying an ECDSA signature&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;export default async function () {
  const publicKey = await crypto.subtle.importKey(
    &amp;#39;spki&amp;#39;,
    spkiPublicKeyData,
    { name: &amp;#39;ECDSA&amp;#39;, namedCurve: &amp;#39;P-256&amp;#39; },
    true,
    [&amp;#39;verify&amp;#39;]
  );

  // Verifies the signature of the encoded data with the provided key
  const verified = await crypto.subtle.verify(
    {
      name: &amp;#39;ECDSA&amp;#39;,
      hash: &amp;#39;SHA-256&amp;#39;,
    },
    publicKey,
    signature,
    plaintText
  );

  console.log(&amp;#39;verified: &amp;#39;, verified);
}

const spkiPublicKeyData = new Uint8Array([
  48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0,
  4, 10, 5, 30, 56, 111, 103, 196, 166, 225, 229, 203, 238, 125, 55, 116, 91, 88, 142, 190, 114, 15,
  117, 89, 22, 40, 111, 150, 41, 105, 122, 57, 23, 17, 216, 106, 234, 201, 103, 8, 210, 58, 38, 35,
  216, 198, 237, 187, 84, 217, 164, 63, 100, 6, 105, 49, 128, 15, 53, 29, 158, 117, 235, 238, 30,
]);

const plaintText = new Uint8Array([
  95, 77, 186, 79, 50, 12, 12, 232, 118, 114, 90, 252, 229, 251, 210, 91, 248, 62, 90, 113, 37, 160,
  140, 175, 231, 60, 62, 186, 196, 33, 119, 157, 249, 213, 93, 24, 12, 58, 233, 148, 38, 69, 225,
  216, 47, 238, 140, 157, 41, 75, 60, 177, 160, 138, 153, 49, 32, 27, 60, 14, 129, 252, 71, 202,
  207, 131, 21, 162, 175, 102, 50, 65, 19, 195, 182, 98, 48, 195, 70, 8, 196, 244, 89, 54, 52, 206,
  2, 178, 103, 54, 34, 119, 240, 168, 64, 202, 116, 188, 61, 26, 98, 54, 149, 44, 94, 215, 170, 248,
  168, 254, 203, 221, 250, 117, 132, 230, 151, 140, 234, 93, 42, 91, 159, 183, 241, 180, 140, 139,
  11, 229, 138, 48, 82, 2, 117, 77, 131, 118, 16, 115, 116, 121, 60, 240, 38, 170, 238, 83, 0, 114,
  125, 131, 108, 215, 30, 113, 179, 69, 221, 178, 228, 68, 70, 255, 197, 185, 1, 99, 84, 19, 137,
  13, 145, 14, 163, 128, 152, 74, 144, 25, 16, 49, 50, 63, 22, 219, 204, 157, 107, 225, 104, 184,
  72, 133, 56, 76, 160, 62, 18, 96, 10, 193, 194, 72, 2, 138, 243, 114, 108, 201, 52, 99, 136, 46,
  168, 192, 42, 171,
]);

const signature = new Uint8Array([
  83, 223, 63, 226, 42, 29, 106, 105, 225, 145, 197, 180, 118, 154, 109, 110, 66, 67, 47, 251, 53,
  190, 203, 65, 207, 36, 19, 57, 49, 122, 124, 118, 59, 74, 222, 134, 42, 235, 180, 229, 134, 24,
  205, 81, 171, 156, 100, 218, 127, 242, 126, 53, 27, 77, 249, 101, 157, 132, 244, 30, 67, 30, 64,
  12,
]);&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="verify">verify&lt;/h1>
&lt;p>The &lt;code>verify()&lt;/code> operation verifies a digital signature. It ensures that some data was signed by a known key and that the data has not been tampered with since it was signed.&lt;/p></description></item></channel></rss>