Files
slsa-verifier/verifiers/utils/container/container.go
Shunsuke Suzuki 74fd528309 fix: fix the Go package version to v2 (#373)
* fix: fix the package version to v2

```
git ls-files | grep ".go$" | xargs -n 1 gsed -i "s|github.com/slsa-framework/slsa-verifier|github.com/slsa-framework/slsa-verifier/v2|g"
```

Signed-off-by: Shunsuke Suzuki <suzuki.shunsuke.1989@gmail.com>

* fix: fix the package version to v2

Signed-off-by: Shunsuke Suzuki <suzuki.shunsuke.1989@gmail.com>

* test: fix source

Signed-off-by: Shunsuke Suzuki <suzuki.shunsuke.1989@gmail.com>

Signed-off-by: Shunsuke Suzuki <suzuki.shunsuke.1989@gmail.com>
2022-12-01 18:49:39 -08:00

54 lines
1.5 KiB
Go

package container
import (
"fmt"
"os"
"strings"
"github.com/google/go-containerregistry/pkg/crane"
crname "github.com/google/go-containerregistry/pkg/name"
serrors "github.com/slsa-framework/slsa-verifier/v2/errors"
)
func GetImageDigest(image string) (string, error) {
digest, err := crane.Digest(image)
if err != nil {
return "", fmt.Errorf("%w: crane.Digest(): %v", serrors.ErrorImageHash, err)
}
return strings.TrimPrefix(digest, "sha256:"), nil
}
// ValidateArtifactReference verifies that the reference is immutable
// and has digest `digest`.
func ValidateArtifactReference(image, expectedDigest string) error {
// Check if the image refers to a file.
// If it does, we don't expect users to provide an 'imutable'
// reference with `@sha256:xxx`.
_, err := os.Stat(image)
if err != nil && !os.IsNotExist(err) {
return fmt.Errorf("os.Stat(): %w", err)
}
if !os.IsNotExist(err) {
return nil
}
// For image in a registry, only allow immutable images.
ref, err := crname.ParseReference(image)
if err != nil {
return fmt.Errorf("crane.ParseReference(): %w", err)
}
if !strings.HasPrefix(ref.Identifier(), "sha256:") {
return fmt.Errorf("%w: expected '%s@sha256:%s', got '%s'",
serrors.ErrorMutableImage, image, expectedDigest, image)
}
digest := strings.TrimPrefix(ref.Identifier(), "sha256:")
if expectedDigest != digest {
return fmt.Errorf("%w: expected digest '%s', got '%s'",
serrors.ErrorInternal, expectedDigest, digest)
}
return nil
}