crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

Description

@hylmarj

What is the problem this feature will solve?

I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

OpenSSL documentation lists the following AES cipher names:

  • AES-128-SIV
  • AES-192-SIV
  • AES-256-SIV
  • AES-128-GCM-SIV
  • AES-192-GCM-SIV
  • AES-256-GCM-SIV

However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

Reproduction

constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

On my machine:
Node.js version: v24.14.1
OpenSSL version: 3.5.5
FIPS mode: 0
SIV ciphers: []

crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

What is the feature you are proposing to solve the problem?

I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

Ideally, this would include support for:

  • crypto.getCiphers()
  • crypto.getCipherInfo()
  • crypto.createCipheriv()
  • crypto.createDecipheriv()

for the following algorithms:

  • aes-128-siv
  • aes-192-siv
  • aes-256-siv
  • aes-128-gcm-siv
  • aes-192-gcm-siv
  • aes-256-gcm-siv

If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

  1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
  2. Expose them through a non-streaming AEAD API in the future.
  3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

What alternatives have you considered?

I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

    Description

    @hylmarj

    What is the problem this feature will solve?

    I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

    OpenSSL documentation lists the following AES cipher names:

    • AES-128-SIV
    • AES-192-SIV
    • AES-256-SIV
    • AES-128-GCM-SIV
    • AES-192-GCM-SIV
    • AES-256-GCM-SIV

    However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

    AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

    In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

    Reproduction

    constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

    On my machine:
    Node.js version: v24.14.1
    OpenSSL version: 3.5.5
    FIPS mode: 0
    SIV ciphers: []

    crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

    If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

    This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

    What is the feature you are proposing to solve the problem?

    I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

    Ideally, this would include support for:

    • crypto.getCiphers()
    • crypto.getCipherInfo()
    • crypto.createCipheriv()
    • crypto.createDecipheriv()

    for the following algorithms:

    • aes-128-siv
    • aes-192-siv
    • aes-256-siv
    • aes-128-gcm-siv
    • aes-192-gcm-siv
    • aes-256-gcm-siv

    If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

    1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
    2. Expose them through a non-streaming AEAD API in the future.
    3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

    The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

    What alternatives have you considered?

    I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

    I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

    Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

    Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

    Activity

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

      Type

      No type

      Projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

      Description

      @hylmarj

      What is the problem this feature will solve?

      I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

      OpenSSL documentation lists the following AES cipher names:

      • AES-128-SIV
      • AES-192-SIV
      • AES-256-SIV
      • AES-128-GCM-SIV
      • AES-192-GCM-SIV
      • AES-256-GCM-SIV

      However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

      AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

      In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

      Reproduction

      constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

      On my machine:
      Node.js version: v24.14.1
      OpenSSL version: 3.5.5
      FIPS mode: 0
      SIV ciphers: []

      crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

      If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

      This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

      What is the feature you are proposing to solve the problem?

      I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

      Ideally, this would include support for:

      • crypto.getCiphers()
      • crypto.getCipherInfo()
      • crypto.createCipheriv()
      • crypto.createDecipheriv()

      for the following algorithms:

      • aes-128-siv
      • aes-192-siv
      • aes-256-siv
      • aes-128-gcm-siv
      • aes-192-gcm-siv
      • aes-256-gcm-siv

      If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

      1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
      2. Expose them through a non-streaming AEAD API in the future.
      3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

      The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

      What alternatives have you considered?

      I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

      I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

      Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

      Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

        Type

        No type

        Projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

        Description

        @hylmarj

        What is the problem this feature will solve?

        I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

        OpenSSL documentation lists the following AES cipher names:

        • AES-128-SIV
        • AES-192-SIV
        • AES-256-SIV
        • AES-128-GCM-SIV
        • AES-192-GCM-SIV
        • AES-256-GCM-SIV

        However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

        AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

        In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

        Reproduction

        constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

        On my machine:
        Node.js version: v24.14.1
        OpenSSL version: 3.5.5
        FIPS mode: 0
        SIV ciphers: []

        crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

        If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

        This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

        What is the feature you are proposing to solve the problem?

        I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

        Ideally, this would include support for:

        • crypto.getCiphers()
        • crypto.getCipherInfo()
        • crypto.createCipheriv()
        • crypto.createDecipheriv()

        for the following algorithms:

        • aes-128-siv
        • aes-192-siv
        • aes-256-siv
        • aes-128-gcm-siv
        • aes-192-gcm-siv
        • aes-256-gcm-siv

        If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

        1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
        2. Expose them through a non-streaming AEAD API in the future.
        3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

        The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

        What alternatives have you considered?

        I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

        I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

        Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

        Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

        Activity

        Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

        Metadata

        Metadata

        Assignees

        No one assigned

          Labels

          cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

          Type

          No type

          Projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

          Description

          @hylmarj

          What is the problem this feature will solve?

          I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

          OpenSSL documentation lists the following AES cipher names:

          • AES-128-SIV
          • AES-192-SIV
          • AES-256-SIV
          • AES-128-GCM-SIV
          • AES-192-GCM-SIV
          • AES-256-GCM-SIV

          However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

          AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

          In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

          Reproduction

          constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

          On my machine:
          Node.js version: v24.14.1
          OpenSSL version: 3.5.5
          FIPS mode: 0
          SIV ciphers: []

          crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

          If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

          This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

          What is the feature you are proposing to solve the problem?

          I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

          Ideally, this would include support for:

          • crypto.getCiphers()
          • crypto.getCipherInfo()
          • crypto.createCipheriv()
          • crypto.createDecipheriv()

          for the following algorithms:

          • aes-128-siv
          • aes-192-siv
          • aes-256-siv
          • aes-128-gcm-siv
          • aes-192-gcm-siv
          • aes-256-gcm-siv

          If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

          1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
          2. Expose them through a non-streaming AEAD API in the future.
          3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

          The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

          What alternatives have you considered?

          I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

          I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

          Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

          Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

            Type

            No type

            Projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

            Description

            @hylmarj

            What is the problem this feature will solve?

            I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

            OpenSSL documentation lists the following AES cipher names:

            • AES-128-SIV
            • AES-192-SIV
            • AES-256-SIV
            • AES-128-GCM-SIV
            • AES-192-GCM-SIV
            • AES-256-GCM-SIV

            However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

            AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

            In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

            Reproduction

            constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

            On my machine:
            Node.js version: v24.14.1
            OpenSSL version: 3.5.5
            FIPS mode: 0
            SIV ciphers: []

            crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

            If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

            This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

            What is the feature you are proposing to solve the problem?

            I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

            Ideally, this would include support for:

            • crypto.getCiphers()
            • crypto.getCipherInfo()
            • crypto.createCipheriv()
            • crypto.createDecipheriv()

            for the following algorithms:

            • aes-128-siv
            • aes-192-siv
            • aes-256-siv
            • aes-128-gcm-siv
            • aes-192-gcm-siv
            • aes-256-gcm-siv

            If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

            1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
            2. Expose them through a non-streaming AEAD API in the future.
            3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

            The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

            What alternatives have you considered?

            I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

            I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

            Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

            Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

            Activity

            Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

            Metadata

            Metadata

            Assignees

            No one assigned

              Labels

              cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

              Type

              No type

              Projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

              Description

              @hylmarj

              What is the problem this feature will solve?

              I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

              OpenSSL documentation lists the following AES cipher names:

              • AES-128-SIV
              • AES-192-SIV
              • AES-256-SIV
              • AES-128-GCM-SIV
              • AES-192-GCM-SIV
              • AES-256-GCM-SIV

              However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

              AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

              In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

              Reproduction

              constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

              On my machine:
              Node.js version: v24.14.1
              OpenSSL version: 3.5.5
              FIPS mode: 0
              SIV ciphers: []

              crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

              If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

              This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

              What is the feature you are proposing to solve the problem?

              I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

              Ideally, this would include support for:

              • crypto.getCiphers()
              • crypto.getCipherInfo()
              • crypto.createCipheriv()
              • crypto.createDecipheriv()

              for the following algorithms:

              • aes-128-siv
              • aes-192-siv
              • aes-256-siv
              • aes-128-gcm-siv
              • aes-192-gcm-siv
              • aes-256-gcm-siv

              If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

              1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
              2. Expose them through a non-streaming AEAD API in the future.
              3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

              The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

              What alternatives have you considered?

              I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

              I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

              Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

              Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

                Type

                No type

                Projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                crypto: support AES-*-SIV and AES-*-GCM-SIV in createCipheriv() #63393

                Description

                @hylmarj

                What is the problem this feature will solve?

                I would like Node.js node:crypto to expose AES-SIV and AES-GCM-SIV ciphers through crypto.getCiphers(), crypto.getCipherInfo(), crypto.createCipheriv() and crypto.createDecipheriv(), when the underlying OpenSSL version supports them.

                OpenSSL documentation lists the following AES cipher names:

                • AES-128-SIV
                • AES-192-SIV
                • AES-256-SIV
                • AES-128-GCM-SIV
                • AES-192-GCM-SIV
                • AES-256-GCM-SIV

                However, these do not appear to be available through Node.js node:crypto, even with a recent Node.js version backed by OpenSSL 3.5.x.

                AES-GCM is widely available and useful, but it is very sensitive to nonce reuse. AES-SIV and AES-GCM-SIV are misuse-resistant authenticated encryption modes and are useful for application-level encryption APIs where accidental nonce reuse is a realistic operational risk.

                In framework/library code, this would allow Node.js users to choose a safer AEAD mode where nonce misuse resistance is desirable.

                Reproduction

                constcrypto=require('node:crypto');console.log('Node.js version:',process.version);console.log('OpenSSL version:',process.versions.openssl);console.log('FIPS mode:',crypto.getFips());constciphers=crypto.getCiphers().sort();console.log('SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('siv')));console.log('GCM/SIV ciphers:',ciphers.filter((cipher)=>cipher.includes('gcm')||cipher.includes('siv')));for(constalgorithmof['aes-128-siv','aes-192-siv','aes-256-siv','aes-128-gcm-siv','aes-192-gcm-siv','aes-256-gcm-siv',]){console.log(algorithm,crypto.getCipherInfo(algorithm));}

                On my machine:
                Node.js version: v24.14.1
                OpenSSL version: 3.5.5
                FIPS mode: 0
                SIV ciphers: []

                crypto.getCiphers() does not include AES-SIV or AES-GCM-SIV algorithms.

                If the underlying OpenSSL version supports these ciphers and the active provider allows them, I would expect Node.js to expose them through node:crypto, or at least document why they are intentionally unavailable.

                This is not a FIPS-mode issue in my environment because crypto.getFips() returns 0. I understand that OpenSSL support does not automatically imply Node.js API exposure. I am opening this issue to ask whether exposing these ciphers is technically feasible and desirable in Node.js.

                What is the feature you are proposing to solve the problem?

                I propose that Node.js should expose AES-SIV and AES-GCM-SIV ciphers through node:crypto when they are available from the underlying OpenSSL build and active provider.

                Ideally, this would include support for:

                • crypto.getCiphers()
                • crypto.getCipherInfo()
                • crypto.createCipheriv()
                • crypto.createDecipheriv()

                for the following algorithms:

                • aes-128-siv
                • aes-192-siv
                • aes-256-siv
                • aes-128-gcm-siv
                • aes-192-gcm-siv
                • aes-256-gcm-siv

                If these algorithms cannot safely fit into the current streaming Cipheriv / Decipheriv API because of their AEAD/SIV semantics, then I would like to propose one of the following alternatives:

                1. Document explicitly why these OpenSSL-supported ciphers are not exposed through node:crypto.
                2. Expose them through a non-streaming AEAD API in the future.
                3. Provide a documented way to detect that the underlying OpenSSL version supports them, even if Node.js intentionally does not expose them.

                The main goal is to make misuse-resistant authenticated encryption modes available to Node.js applications and libraries in a clear, supported, and documented way.

                What alternatives have you considered?

                I considered using the currently available aes-256-gcm cipher, which is supported by node:crypto today. This is a practical fallback, but it does not provide the same nonce-misuse resistance properties as AES-SIV or AES-GCM-SIV.

                I also considered relying on a third-party cryptography library or native addon, but that adds supply-chain risk, maintenance overhead, and deployment complexity compared to using the built-in node:crypto module.

                Another alternative would be to implement stricter nonce management at the application/framework level. This helps reduce the risk, but it does not fully replace a misuse-resistant AEAD mode.

                Therefore, the preferred solution would be native, documented support in node:crypto, or at least clear documentation explaining why these OpenSSL-supported ciphers are not exposed.

                Activity

                Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                Metadata

                Metadata

                Assignees

                No one assigned

                  Labels

                  cryptoIssues and PRs related to the crypto subsystem.feature requestIssues requesting new Node.js features.

                  Type

                  No type

                  Projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions