{"record":{"id":"a136d2486eaf6fed","repo":"denoland/deno","slug":"err-incompatible-option-pair","errorCode":"ERR_INCOMPATIBLE_OPTION_PAIR","errorMessage":"Option \"group\" cannot be used in combination with option \"prime\"","messagePattern":"Option \"group\" cannot be used in combination with option \"prime\"","errorType":"error_code","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/internal/crypto/keygen.ts","lineNumber":568,"sourceCode":"    }\n    case \"ed448\": {\n      if (mode === kSync) {\n        return op_node_generate_ed448_key();\n      }\n      return op_node_generate_ed448_key_async();\n    }\n    case \"x448\": {\n      if (mode === kSync) {\n        return op_node_generate_x448_key();\n      }\n      return op_node_generate_x448_key_async();\n    }\n    case \"dh\": {\n      validateObject(options, \"options\");\n      const { group, primeLength, prime, generator } = options;\n      if (group != null) {\n        if (prime != null) {\n          throw new ERR_INCOMPATIBLE_OPTION_PAIR(\"group\", \"prime\");\n        }\n        if (primeLength != null) {\n          throw new ERR_INCOMPATIBLE_OPTION_PAIR(\"group\", \"primeLength\");\n        }\n        if (generator != null) {\n          throw new ERR_INCOMPATIBLE_OPTION_PAIR(\"group\", \"generator\");\n        }\n\n        validateString(group, \"options.group\");\n\n        if (\n          group !== \"modp5\" && group !== \"modp14\" && group !== \"modp15\" &&\n          group !== \"modp16\" && group !== \"modp17\" && group !== \"modp18\"\n        ) {\n          throw new ERR_CRYPTO_UNKNOWN_DH_GROUP();\n        }\n\n        if (mode === kSync) {","sourceCodeStart":550,"sourceCodeEnd":586,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/ext/node/polyfills/internal/crypto/keygen.ts#L550-L586","documentation":"DH key generation via generateKeyPair('dh', options) takes parameters from either a predefined MODP group (options.group) or custom parameters (options.prime / options.primeLength). These sources are mutually exclusive; supplying group together with prime throws ERR_INCOMPATIBLE_OPTION_PAIR before any key is generated.","triggerScenarios":"crypto.generateKeyPair('dh', { group: 'modp14', prime: primeBuffer }) — any dh options object where group and prime are both non-null.","commonSituations":"Config templates that set every DH option 'to be safe'; merging a default group with user-supplied custom primes; porting code that assembles the options object dynamically without clearing conflicting keys.","solutions":["Use group alone for predefined RFC 3526 groups: { group: 'modp14' }","Or use custom parameters without group: { prime: <Buffer> } or { primeLength: 2048 }","Strip the conflicting key before calling generateKeyPair when options come from merged sources"],"exampleFix":"// before\ncrypto.generateKeyPair('dh', { group: 'modp14', prime: primeBuffer });\n// after\ncrypto.generateKeyPair('dh', { group: 'modp14' });","handlingStrategy":"validation","validationCode":"const { group, prime, primeLength } = dhOptions;\nif (group != null && (prime != null || primeLength != null)) {\n  throw new Error('DH group cannot be combined with prime/primeLength');\n}\ncrypto.generateKeyPairSync('dh', dhOptions);","typeGuard":"function isCleanDhOptions(o) {\n  const group = o.group != null, prime = o.prime != null, len = o.primeLength != null;\n  return group ? !(prime || len || o.generator != null) : true;\n}","tryCatchPattern":"try {\n  crypto.generateKeyPairSync('dh', opts);\n} catch (e) {\n  if (e.code === 'ERR_INCOMPATIBLE_OPTION_PAIR') {\n    if (opts.group != null) delete opts.prime; // pick group as the winner\n    return crypto.generateKeyPairSync('dh', opts);\n  }\n  throw e;\n}","preventionTips":["Model DH options as a discriminated union: group XOR (prime|primeLength)","Never merge user crypto options over defaults blindly","Build option objects explicitly per parameter source"],"tags":["crypto","keygen","diffie-hellman","options","node-compat"],"backgroundTag":"mutually-exclusive-options","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}