siyuan-note/siyuan · error

checksum manifest digest mismatch

Error message

checksum manifest digest mismatch

What it means

Returned by getGitHubManifestChecksum when the GitHub asset's declared Digest (a sha256 of the manifest file, exposed via the asset metadata) is present but does not equal the SHA-256 computed over the downloaded bytes. This is an integrity check on the checksum file itself — a self-validating guard that the manifest wasn't tampered with in transit or by a mirror.

Source

Thrown at kernel/model/updater_release.go:404

	}
	if nil == response || nil == response.Response {
		return "", errors.New("checksum manifest response is empty")
	}
	defer response.Body.Close()
	if 200 != response.StatusCode {
		return "", fmt.Errorf("get checksum manifest failed: %d", response.StatusCode)
	}
	data, err := io.ReadAll(io.LimitReader(response.Body, maxChecksumManifestSize+1))
	if err != nil {
		return "", err
	}
	if maxChecksumManifestSize < int64(len(data)) {
		return "", errors.New("checksum manifest is too large")
	}
	if "" != manifestDigest {
		actualDigest := fmt.Sprintf("%x", sha256.Sum256(data))
		if manifestDigest != actualDigest {
			return "", errors.New("checksum manifest digest mismatch")
		}
	}
	manifest := string(data)
	if "" != manifestCacheKey {
		githubManifestCache.Store(manifestCacheKey, manifest)
	}
	checksum := parseChecksumManifest(manifest, pkgName)
	if "" == checksum {
		return "", errors.New("package checksum is unavailable")
	}
	return checksum, nil
}

func parseChecksumManifest(manifest, pkgName string) string {
	for _, line := range strings.Split(manifest, "\n") {
		fields := strings.Fields(line)
		if 2 > len(fields) {
			continue

View on GitHub (pinned to 251596fc0d)

Solutions

  1. Retry from a different network or after bypassing the proxy to rule out in-transit modification.
  2. Switch to the stable channel (independent checksum source).
  3. Download the manifest directly from GitHub in a browser and compare its SHA-256 to the asset's declared digest to localize the discrepancy.
Defensive patterns

Strategy: fallback

Try / catch

// On digest mismatch, do NOT trust the bytes; switch source.
checksum, err := getGitHubManifestChecksum(ctx, release, pkgName)
if err != nil && strings.Contains(err.Error(), "digest mismatch") {
    logging.LogErrorf("manifest tampered in transit; falling back: %s", err)
    checksum = getStablePackageChecksum(rhyResult, pkgName)
}

Prevention

When it happens

Trigger: A proxy or CDN altered the manifest bytes. The asset's declared Digest in the GitHub API response is stale relative to the actual asset content. MITM serving a different manifest. GitHub's asset digest field is inconsistent due to a re-upload.

Common situations: Corporate proxy that re-encodes or injects into downloads. A mirror caching a stale manifest after a release was re-published. A CDN serving a partial manifest whose digest no longer matches.

Related errors


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/344113c0769d3f40. Report an issue: GitHub.