{"record":{"id":"e855d7bd4e59a8bd","repo":"ruvnet/ruflo","slug":"sha256sums-sig-failed-ed25519-verification-refus","errorCode":null,"errorMessage":"SHA256SUMS.sig failed Ed25519 verification — refusing to install","messagePattern":"SHA256SUMS\\.sig failed Ed25519 verification — refusing to install","errorType":"exception","errorClass":"ReleaseVerificationError","httpStatus":null,"severity":"critical","filePath":"v3/@claude-flow/cli/src/proxy/verify.ts","lineNumber":79,"sourceCode":"  sigBase64: string;\n  assetBytes: Buffer;\n  assetFilename: string;\n  pubkeyPem?: string;\n}\n\nexport interface VerifyReleaseResult {\n  sha256: string;\n}\n\n/**\n * Full verification: signature over SHA256SUMS, then the asset's own hash\n * against the matching line. Throws `ReleaseVerificationError` on ANY\n * failure — there is no partial-trust outcome, matching ADR-307's \"refuses\n * on any mismatch\" requirement.\n */\nexport function verifyRelease(input: VerifyReleaseInput): VerifyReleaseResult {\n  if (!verifySha256SumsSignature(input.sumsBytes, input.sigBase64, input.pubkeyPem)) {\n    throw new ReleaseVerificationError('SHA256SUMS.sig failed Ed25519 verification — refusing to install');\n  }\n\n  const sums = parseSha256Sums(input.sumsBytes.toString('utf-8'));\n  const expected = sums[input.assetFilename];\n  if (!expected) {\n    throw new ReleaseVerificationError(`SHA256SUMS has no entry for ${input.assetFilename}`);\n  }\n\n  const actual = sha256Hex(input.assetBytes);\n  if (actual !== expected) {\n    throw new ReleaseVerificationError(\n      `sha256 mismatch for ${input.assetFilename}: expected ${expected.slice(0, 12)}…, got ${actual.slice(0, 12)}…`,\n    );\n  }\n\n  return { sha256: actual };\n}\n","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/cli/src/proxy/verify.ts#L61-L97","documentation":"verifyRelease() first checks the Ed25519 signature over the SHA256SUMS manifest using the public key embedded in the CLI — per ADR-307 there is no partial-trust outcome, so any signature failure refuses the install outright. This is the root-of-trust check: per-file hashes are only consulted after it passes. A wrong key, tampered manifest, or corrupted download all produce this one error.","triggerScenarios":"A signature produced by a different key than the one embedded in this CLI version (upstream key rotation without updating ruflo); a modified SHA256SUMS or .sig in transit; a truncated download of either file failing crypto.verify.","commonSituations":"Upstream rotated the signing key while users run an older CLI; MITM/proxy rewriting downloads; interrupted downloads leaving truncated files; releases published with a mis-signed manifest.","solutions":["Update the ruflo CLI to the latest release — key rotations ship with an updated embedded public key","Clear cached downloads and retry `ruflo proxy install` from a clean network path (in-transit corruption is common)","If it persists on the latest CLI from a clean network, report it to maintainers immediately — consistent failure can indicate a genuine supply-chain compromise","Never attempt to bypass it; there is intentionally no override flag"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"const isReleaseVerification = (e: unknown): e is Error & { name: 'ReleaseVerificationError' } =>\n  e instanceof Error && e.name === 'ReleaseVerificationError';","tryCatchPattern":"try {\n  const { sha256 } = verifyRelease(input);\n} catch (e) {\n  if (isReleaseVerification(e)) {\n    // NEVER bypass: report and abort. Signature failure on a current CLI\n    // from a clean network is a supply-chain signal.\n    securityLog.fatal('release signature invalid', { detail: e.message });\n    process.exit(4);\n  }\n  throw e;\n}","preventionTips":["Auto-update the CLI so the embedded signing key stays current","Never add a skip-verification escape hatch in wrappers","Alert on this error class in fleet telemetry — consistent failures warrant incident response"],"tags":["security","ed25519","signature-verification","supply-chain","proxy-install"],"backgroundTag":"signature-verification-failed","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}