@@ -206,61 +206,51 @@ type GitHubReleaseDetail struct {
206206 Assets []GitHubAsset `json:"assets"`
207207}
208208
209- func verifyChecksum ( file , release , tarballName string ) error {
210- // Calculate file checksum
211- f , err := os .Open (file )
209+ // calculateFileChecksum computes the SHA256 checksum of a file.
210+ func calculateFileChecksum ( path string ) ( string , error ) {
211+ f , err := os .Open (path )
212212 if err != nil {
213- return err
213+ return "" , err
214214 }
215215 defer f .Close ()
216216
217217 h := sha256 .New ()
218218 if _ , err := io .Copy (h , f ); err != nil {
219- return err
219+ return "" , err
220220 }
221- actualChecksum := hex .EncodeToString (h .Sum (nil ))
221+ return hex .EncodeToString (h .Sum (nil )), nil
222+ }
222223
223- // Fetch the release details to get the digest
224+ // fetchReleaseDetails retrieves asset metadata from GitHub API for a release.
225+ func fetchReleaseDetails (release string ) (* GitHubReleaseDetail , error ) {
224226 apiURL := fmt .Sprintf ("https://api.github.com/repos/linuxmatters/ffmpeg-statigo/releases/tags/%s" , release )
225227
226228 req , err := http .NewRequest ("GET" , apiURL , nil )
227229 if err != nil {
228- return err
230+ return nil , err
229231 }
230232 req .Header .Set ("User-Agent" , "ffmpeg-statigo" )
231233
232234 resp , err := http .DefaultClient .Do (req )
233235 if err != nil {
234- return err
236+ return nil , err
235237 }
236238 defer resp .Body .Close ()
237239
238240 if resp .StatusCode != 200 {
239- // If we can't verify, warn but don't fail (might be rate limited)
240241 fmt .Fprintf (os .Stderr , "WARNING: Could not fetch release details for checksum verification (status %d)\n " , resp .StatusCode )
241- return nil
242- }
243-
244- var releaseDetail GitHubReleaseDetail
245- if err := json .NewDecoder (resp .Body ).Decode (& releaseDetail ); err != nil {
246- return err
247- }
248-
249- // Find our tarball asset and get its digest
250- var assetDigest string
251- for _ , asset := range releaseDetail .Assets {
252- if asset .Name == tarballName {
253- assetDigest = asset .Digest
254- break
255- }
242+ return nil , nil // Warn but don't fail (might be rate limited)
256243 }
257244
258- if assetDigest == "" {
259- // Fallback to SHA256SUMS file if digest not available (older releases)
260- return verifyChecksumFromFile ( releaseDetail . Assets , actualChecksum , tarballName )
245+ var detail GitHubReleaseDetail
246+ if err := json . NewDecoder ( resp . Body ). Decode ( & detail ); err != nil {
247+ return nil , err
261248 }
249+ return & detail , nil
250+ }
262251
263- // GitHub provides digests in "sha256:..." format
252+ // verifyDigest validates a checksum against a GitHub asset digest (sha256:... format).
253+ func verifyDigest (actualChecksum , assetDigest string ) error {
264254 if ! strings .HasPrefix (assetDigest , "sha256:" ) {
265255 return fmt .Errorf ("unexpected digest format: %s" , assetDigest )
266256 }
@@ -274,6 +264,31 @@ func verifyChecksum(file, release, tarballName string) error {
274264 return nil
275265}
276266
267+ func verifyChecksum (file , release , tarballName string ) error {
268+ actualChecksum , err := calculateFileChecksum (file )
269+ if err != nil {
270+ return err
271+ }
272+
273+ releaseDetail , err := fetchReleaseDetails (release )
274+ if err != nil {
275+ return err
276+ }
277+ if releaseDetail == nil {
278+ return nil // API unavailable, warning already printed
279+ }
280+
281+ // Find our tarball asset's digest
282+ for _ , asset := range releaseDetail .Assets {
283+ if asset .Name == tarballName && asset .Digest != "" {
284+ return verifyDigest (actualChecksum , asset .Digest )
285+ }
286+ }
287+
288+ // Fallback to SHA256SUMS file for older releases without digest metadata
289+ return verifyChecksumFromFile (releaseDetail .Assets , actualChecksum , tarballName )
290+ }
291+
277292func verifyChecksumFromFile (assets []GitHubAsset , actualChecksum , tarballName string ) error {
278293 // Find and download SHA256SUMS file (fallback for older releases)
279294 var sha256sumsURL string
0 commit comments