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) {
continueView on GitHub (pinned to 251596fc0d)
Solutions
- Retry from a different network or after bypassing the proxy to rule out in-transit modification.
- Switch to the stable channel (independent checksum source).
- 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
- Never ignore a digest mismatch — it signals in-transit tampering or a stale mirror.
- Retry from a different network to localize proxy/captive-portal interference.
- Fall back to the stable cloud JSON checksums rather than disabling the digest check.
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
- update package is unavailable: [%s] checksum is unavailable
- verify checksum failed, download install package [%s] checks
- checksum manifest is too large
- checksum manifest is unavailable
- package checksum is unavailable
AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12).
Data as JSON: /api/errors/344113c0769d3f40.
Report an issue: GitHub.