github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/analyzer/executable/executable.go (about) 1 package executable 2 3 import ( 4 "context" 5 "os" 6 7 "golang.org/x/xerrors" 8 9 "github.com/devseccon/trivy/pkg/digest" 10 "github.com/devseccon/trivy/pkg/fanal/analyzer" 11 "github.com/devseccon/trivy/pkg/fanal/utils" 12 ) 13 14 func init() { 15 analyzer.RegisterAnalyzer(&executableAnalyzer{}) 16 } 17 18 const version = 1 19 20 // executableAnalyzer calculates SHA-256 for each binary not managed by package managers (called unpackaged binaries) 21 // so that it can search for SBOM attestation in post-handler. 22 type executableAnalyzer struct{} 23 24 func (a executableAnalyzer) Analyze(_ context.Context, input analyzer.AnalysisInput) (*analyzer.AnalysisResult, error) { 25 // Skip non-binaries 26 isBinary, err := utils.IsBinary(input.Content, input.Info.Size()) 27 if !isBinary || err != nil { 28 return nil, nil 29 } 30 31 dig, err := digest.CalcSHA256(input.Content) 32 if err != nil { 33 return nil, xerrors.Errorf("sha256 error: %w", err) 34 } 35 36 return &analyzer.AnalysisResult{ 37 Digests: map[string]string{ 38 input.FilePath: dig.String(), 39 }, 40 }, nil 41 } 42 43 func (a executableAnalyzer) Required(_ string, fileInfo os.FileInfo) bool { 44 return utils.IsExecutable(fileInfo) 45 } 46 47 func (a executableAnalyzer) Type() analyzer.Type { 48 return analyzer.TypeExecutable 49 } 50 51 func (a executableAnalyzer) Version() int { 52 return version 53 }