Giter Site home page Giter Site logo

cosign's Introduction

Cosign logo

cosign

Signing OCI containers (and other artifacts) using Sigstore!

Go Report Card e2e-tests CII Best Practices OpenSSF Scorecard

Cosign aims to make signatures invisible infrastructure.

Cosign supports:

  • "Keyless signing" with the Sigstore public good Fulcio certificate authority and Rekor transparency log (default)
  • Hardware and KMS signing
  • Signing with a cosign generated encrypted private/public keypair
  • Container Signing, Verification and Storage in an OCI registry.
  • Bring-your-own PKI

Info

Cosign is developed as part of the sigstore project. We also use a slack channel! Click here for the invite link.

Installation

For Homebrew, Arch, Nix, GitHub Action, and Kubernetes installs see the installation docs.

For Linux and macOS binaries see the GitHub release assets.

๐Ÿšจ If you are downloading releases of cosign from our GCS bucket - please see more information on the July 31, 2023 deprecation notice ๐Ÿšจ

Developer Installation

If you have Go 1.22+, you can setup a development environment:

$ git clone https://github.com/sigstore/cosign
$ cd cosign
$ go install ./cmd/cosign
$ $(go env GOPATH)/bin/cosign

Contributing

If you are interested in contributing to cosign, please read the contributing documentation.

Future Cosign development will be focused the next major release which will be based on sigstore-go. Maintainers will be focused on feature development within sigstore-go. Contributions to sigstore-go, particularly around bring-your-own keys and signing, are appreciated. Please see the issue tracker for good first issues.

Cosign 2.x is a stable release and will continue to receive periodic feature updates and bug fixes. PRs that are small in scope and size are most likely to be quickly reviewed.

PRs which significantly modify or break the API will not be accepted. PRs which are significant in size but do not introduce breaking changes may be accepted, but will be considered lower priority than PRs in sigstore-go.

Dockerfile

Here is how to install and use cosign inside a Dockerfile through the gcr.io/projectsigstore/cosign image:

FROM gcr.io/projectsigstore/cosign:v1.13.0 as cosign-bin

# Source: https://github.com/chainguard-images/static
FROM cgr.dev/chainguard/static:latest
COPY --from=cosign-bin /ko-app/cosign /usr/local/bin/cosign
ENTRYPOINT [ "cosign" ]

Quick Start

This shows how to:

Sign a container and store the signature in the registry

Note that you should always sign images based on their digest (@sha256:...) rather than a tag (:latest) because otherwise you might sign something you didn't intend to!

 cosign sign $IMAGE

Generating ephemeral keys...
Retrieving signed certificate...

	Note that there may be personally identifiable information associated with this signed artifact.
	This may include the email address associated with the account with which you authenticate.
	This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later.

By typing 'y', you attest that you grant (or have permission to grant) and agree to have this information stored permanently in transparency logs.
Are you sure you would like to continue? [y/N] y
Your browser will now be opened to:
https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=OrXitVKUZm2lEWHVt1oQWR4HZvn0rSlKhLcltglYxCY&code_challenge_method=S256&nonce=2KvOWeTFxYfxyzHtssvlIXmY6Jk&redirect_uri=http%3A%2F%2Flocalhost%3A57102%2Fauth%2Fcallback&response_type=code&scope=openid+email&state=2KvOWfbQJ1caqScgjwibzK2qJmb
Successfully verified SCT...
tlog entry created with index: 12086900
Pushing signature to: $IMAGE

Cosign will prompt you to authenticate via OIDC, where you'll sign in with your email address. Under the hood, cosign will request a code signing certificate from the Fulcio certificate authority. The subject of the certificate will match the email address you logged in with. Cosign will then store the signature and certificate in the Rekor transparency log, and upload the signature to the OCI registry alongside the image you're signing.

Verify a container

To verify the image, you'll need to pass in the expected certificate subject and certificate issuer via the --certificate-identity and --certificate-oidc-issuer flags:

cosign verify $IMAGE --certificate-identity=$IDENTITY --certificate-oidc-issuer=$OIDC_ISSUER

You can also pass in a regex for the certificate identity and issuer flags, --certificate-identity-regexp and --certificate-oidc-issuer-regexp.

Verify a container against a public key

This command returns 0 if at least one cosign formatted signature for the image is found matching the public key. See the detailed usage below for information and caveats on other signature formats.

Any valid payloads are printed to stdout, in json format. Note that these signed payloads include the digest of the container image, which is how we can be sure these "detached" signatures cover the correct image.

$ cosign verify --key cosign.pub $IMAGE_URI:1h
The following checks were performed on these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"sha256:87ef60f558bad79beea6425a3b28989f01dd417164150ab3baab98dcbf04def8"},"Type":"cosign container image signature"},"Optional":null}

Verify a container in an air-gapped environment

Cosign can do completely offline verification by verifying a bundle which is typically distributed as an annotation on the image manifest. As long as this annotation is present, then offline verification can be done. This bundle annotation is always included by default for keyless signing, so the default cosign sign functionality will include all materials needed for offline verification.

To verify an image in an air-gapped environment, the image and signatures must be available locally on the filesystem.

An image can be saved locally using cosign save (note, this step must be done with a network connection):

cosign initialize # This will pull in the latest TUF root
cosign save $IMAGE_NAME --dir ./path/to/dir

Now, in an air-gapped environment, this local image can be verified:

cosign verify --certificate-identity $CERT_IDENTITY --certificate-oidc-issuer $CERT_OIDC_ISSUER --offline --local-image ./path/to/dir

You'll need to pass in expected values for $CERT_IDENTITY and $CERT_OIDC_ISSUER to correctly verify this image. If you signed with a keypair, the same command will work, assuming the public key material is present locally:

cosign verify --key cosign.pub --offline --local-image ./path/to/dir

What ** is not ** production ready?

While parts of cosign are stable, we are continuing to experiment and add new features. The following feature set is not considered stable yet, but we are committed to stabilizing it over time!

Formats/Specifications

While the cosign code for uploading, signing, retrieving, and verifying several artifact types is stable, the format specifications for some of those types may not be considered stable yet. Some of these are developed outside of the cosign project, so we are waiting for them to stabilize first.

These include:

  • The SBOM specification for storing SBOMs in a container registry
  • The In-Toto attestation format

Working with Other Artifacts

OCI registries are useful for storing more than just container images! Cosign also includes some utilities for publishing generic artifacts, including binaries, scripts, and configuration files using the OCI protocol.

This section shows how to leverage these for an easy-to-use, backwards-compatible artifact distribution system that integrates well with the rest of Sigstore.

See the documentation for more information.

Blobs

You can publish an artifact with cosign upload blob:

$ echo "my first artifact" > artifact
$ BLOB_SUM=$(shasum -a 256 artifact | cut -d' ' -f 1) && echo "$BLOB_SUM"
c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626
$ BLOB_NAME=my-artifact-$(uuidgen | head -c 8 | tr 'A-Z' 'a-z')
$ BLOB_URI=ttl.sh/$BLOB_NAME:1h

$ BLOB_URI_DIGEST=$(cosign upload blob -f artifact $BLOB_URI) && echo "$BLOB_URI_DIGEST"
Uploading file from [artifact] to [ttl.sh/my-artifact-f42c22e0:5m] with media type [text/plain]
File [artifact] is available directly at [ttl.sh/v2/my-artifact-f42c22e0/blobs/sha256:c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626]
Uploaded image to:
ttl.sh/my-artifact-f42c22e0@sha256:790d47850411e902aabebc3a684eeb78fcae853d4dd6e1cc554d70db7f05f99f

Your users can download it from the "direct" url with standard tools like curl or wget:

$ curl -L ttl.sh/v2/$BLOB_NAME/blobs/sha256:$BLOB_SUM > artifact-fetched

The digest is baked right into the URL, so they can check that as well:

$ cat artifact-fetched | shasum -a 256
c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626  -

You can sign it with the normal cosign sign command and flags:

$ cosign sign --key cosign.key $BLOB_URI_DIGEST
Enter password for private key:
Pushing signature to: ttl.sh/my-artifact-f42c22e0

As usual, make sure to reference any images you sign by their digest to make sure you don't sign the wrong thing!

Tekton Bundles

Tekton bundles can be uploaded and managed within an OCI registry. The specification is here. This means they can also be signed and verified with cosign.

Tekton Bundles can currently be uploaded with the tkn cli, but we may add this support to cosign in the future.

$ tkn bundle push us.gcr.io/dlorenc-vmtest2/pipeline:latest -f task-output-image.yaml
Creating Tekton Bundle:
        - Added TaskRun:  to image

Pushed Tekton Bundle to us.gcr.io/dlorenc-vmtest2/pipeline@sha256:124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155
$ cosign sign --key cosign.key us.gcr.io/dlorenc-vmtest2/pipeline@sha256:124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155
Enter password for private key:
tlog entry created with index: 5086
Pushing signature to: us.gcr.io/dlorenc-vmtest2/demo:sha256-124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155.sig

WASM

Web Assembly Modules can also be stored in an OCI registry, using this specification.

Cosign can upload these using the cosign wasm upload command:

$ cosign upload wasm -f hello.wasm us.gcr.io/dlorenc-vmtest2/wasm
$ cosign sign --key cosign.key us.gcr.io/dlorenc-vmtest2/wasm@sha256:9e7a511fb3130ee4641baf1adc0400bed674d4afc3f1b81bb581c3c8f613f812
Enter password for private key:
tlog entry created with index: 5198
Pushing signature to: us.gcr.io/dlorenc-vmtest2/wasm:sha256-9e7a511fb3130ee4641baf1adc0400bed674d4afc3f1b81bb581c3c8f613f812.sig

eBPF

eBPF modules can also be stored in an OCI registry, using this specification.

The image below was built using the bee tool. More information can be found here

Cosign can then sign these images as they can any other OCI image.

$ bee build ./examples/tcpconnect/tcpconnect.c localhost:5000/tcpconnect:test
$ bee push localhost:5000/tcpconnect:test
$ cosign sign  --key cosign.key localhost:5000/tcpconnect@sha256:7a91c50d922925f152fec96ed1d84b7bc6b2079c169d68826f6cf307f22d40e6
Enter password for private key:
Pushing signature to: localhost:5000/tcpconnect
$ cosign verify --key cosign.pub localhost:5000/tcpconnect:test

Verification for localhost:5000/tcpconnect:test --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"localhost:5000/tcpconnect"},"image":{"docker-manifest-digest":"sha256:7a91c50d922925f152fec96ed1d84b7bc6b2079c169d68826f6cf307f22d40e6"},"type":"cosign container image signature"},"optional":null}]

In-Toto Attestations

Cosign also has built-in support for in-toto attestations. The specification for these is defined here.

You can create and sign one from a local predicate file using the following commands:

$ cosign attest --predicate <file> --key cosign.key $IMAGE_URI_DIGEST

All of the standard key management systems are supported. Payloads are signed using the DSSE signing spec, defined here.

To verify:

$ cosign verify-attestation --key cosign.pub $IMAGE_URI

Detailed Usage

See the Usage documentation for more information.

Hardware-based Tokens

See the Hardware Tokens documentation for information on how to use cosign with hardware.

Registry Support

cosign uses go-containerregistry for registry interactions, which has generally excellent compatibility, but some registries may have quirks.

Today, cosign has been tested and works against the following registries:

  • AWS Elastic Container Registry
  • GCP's Artifact Registry and Container Registry
  • Docker Hub
  • Azure Container Registry
  • JFrog Artifactory Container Registry
  • The CNCF distribution/distribution Registry
  • GitLab Container Registry
  • GitHub Container Registry
  • The CNCF Harbor Registry
  • Digital Ocean Container Registry
  • Sonatype Nexus Container Registry
  • Alibaba Cloud Container Registry
  • Red Hat Quay Container Registry 3.6+ / Red Hat quay.io
  • Elastic Container Registry
  • IBM Cloud Container Registry
  • Cloudsmith Container Registry
  • The CNCF zot Registry
  • OVHcloud Managed Private Registry

We aim for wide registry support. To sign images in registries which do not yet fully support OCI media types, one may need to use COSIGN_DOCKER_MEDIA_TYPES to fall back to legacy equivalents. For example:

COSIGN_DOCKER_MEDIA_TYPES=1 cosign sign --key cosign.key legacy-registry.example.com/my/image@$DIGEST

Please help test and file bugs if you see issues! Instructions can be found in the tracking issue.

Caveats

Intentionally Missing Features

cosign only generates ECDSA-P256 keys and uses SHA256 hashes, for both ephemeral keyless signing and managed key signing. Keys are stored in PEM-encoded PKCS8 format. However, you can use cosign to store and retrieve signatures in any format, from any algorithm.

Things That Should Probably Change

Payload Formats

cosign only supports Red Hat's simple signing format for payloads. That looks like:

{
    "critical": {
           "identity": {
               "docker-reference": "testing/manifest"
           },
           "image": {
               "Docker-manifest-digest": "sha256:20be...fe55"
           },
           "type": "cosign container image signature"
    },
    "optional": {
           "creator": "Bob the Builder",
           "timestamp": 1458239713
    }
}

Note: This can be generated for an image reference using cosign generate $IMAGE_URI_DIGEST.

I'm happy to switch this format to something else if it makes sense. See notaryproject/notation#40 for one option.

Registry Details

cosign signatures are stored as separate objects in the OCI registry, with only a weak reference back to the object they "sign". This means this relationship is opaque to the registry, and signatures will not be deleted or garbage-collected when the image is deleted. Similarly, they can easily be copied from one environment to another, but this is not automatic.

Multiple signatures are stored in a list which is unfortunately a race condition today. To add a signature, clients orchestrate a "read-append-write" operation, so the last write will win in the case of contention.

Specifying Registry

cosign will default to storing signatures in the same repo as the image it is signing. To specify a different repo for signatures, you can set the COSIGN_REPOSITORY environment variable.

This will replace the repo in the provided image like this:

$ export COSIGN_REPOSITORY=gcr.io/my-new-repo
$ cosign sign --key cosign.key $IMAGE_URI_DIGEST

So the signature for gcr.io/dlorenc-vmtest2/demo will be stored in gcr.io/my-new-repo/demo:sha256-DIGEST.sig.

Note: different registries might expect different formats for the "repository."

  • To use GCR, a registry name like gcr.io/$REPO is sufficient, as in the example above.

  • To use Artifact Registry, specify a full image name like $LOCATION-docker.pkg.dev/$PROJECT/$REPO/$STORAGE_IMAGE, not just a repository. For example,

    $ export COSIGN_REPOSITORY=us-docker.pkg.dev/my-new-repo/demo
    $ cosign sign --key cosign.key $IMAGE_URI_DIGEST

    where the sha256-DIGEST will match the digest for gcr.io/dlorenc-vmtest2/demo. Specifying just a repo like $LOCATION-docker.pkg.dev/$PROJECT/$REPO will not work in Artifact Registry.

Signature Specification

cosign is inspired by tools like minisign and signify.

Generated private keys are stored in PEM format. The keys encrypted under a password using scrypt as a KDF and nacl/secretbox for encryption.

They have a PEM header of ENCRYPTED SIGSTORE PRIVATE KEY:

-----BEGIN ENCRYPTED SIGSTORE PRIVATE KEY-----
...
-----END ENCRYPTED SIGSTORE PRIVATE KEY-----

Public keys are stored on disk in PEM-encoded standard PKIX format with a header of PUBLIC KEY.

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELigCnlLNKgOglRTx1D7JhI7eRw99
QolE9Jo4QUxnbMy5nUuBL+UZF9qqfm/Dg1BNeHRThHzWh2ki9vAEgWEDOw==
-----END PUBLIC KEY-----

Storage Specification

cosign stores signatures in an OCI registry, and uses a naming convention (tag based on the sha256 of what we're signing) for locating the signature index.

reg.example.com/ubuntu@sha256:703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715 has signatures located at reg.example.com/ubuntu:sha256-703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715.sig

Roughly (ignoring ports in the hostname): s/:/-/g and s/@/:/g to find the signature index.

See Race conditions for some caveats around this strategy.

Alternative implementations could use transparency logs, local filesystem, a separate repository registry, an explicit reference to a signature index, a new registry API, grafeas, etc.

Signing subjects

cosign only works for artifacts stored as "manifests" in the registry today. The proposed mechanism is flexible enough to support signing arbitrary things.

KMS Support

cosign supports using a KMS provider to generate and sign keys. Right now cosign supports Hashicorp Vault, AWS KMS, GCP KMS, Azure Key Vault and we are hoping to support more in the future!

See the KMS docs for more details.

OCI Artifacts

Push an artifact to a registry using oras (in this case, cosign itself!):

$ oras push us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact ./cosign
Uploading f53604826795 cosign
Pushed us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact
Digest: sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef

Now sign it! Using cosign of course:

$ cosign sign --key cosign.key us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact@sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef
Enter password for private key:
Pushing signature to: us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact:sha256-551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef.sig

Finally, verify cosign with cosign again:

$ cosign verify --key cosign.pub  us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact@sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The claims were present in the transparency log
  - The signatures were integrated into the transparency log when the certificate was valid
  - The signatures were verified against the specified public key
  - The code-signing certificate was verified using trusted certificate authority certificates

{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef"},"Type":"cosign container image signature"},"Optional":null}

FAQ

Why not use Notary v2

It's hard to answer this briefly. This post contains some comparisons:

Notary V2 and Cosign

If you find other comparison posts, please send a PR here and we'll link them all.

Why not use containers/image signing

containers/image signing is close to cosign, and we reuse payload formats. cosign differs in that it signs with ECDSA-P256 keys instead of PGP, and stores signatures in the registry.

Why not use TUF?

I believe this tool is complementary to TUF, and they can be used together. I haven't tried yet, but think we can also reuse a registry for TUF storage.

Design Requirements

  • No external services for signature storage, querying, or retrieval
  • We aim for as much registry support as possible
  • Everything should work over the registry API
  • PGP should not be required at all.
  • Users must be able to find all signatures for an image
  • Signers can sign an image after push
  • Multiple entities can sign an image
  • Signing an image does not mutate the image
  • Pure-go implementation

Future Ideas

Registry API Changes

The naming convention and read-modify-write update patterns we use to store things in a registry are a bit, well, "hacky". I think they're the best (only) real option available today, but if the registry API changes we can improve these.

Other Types

cosign can sign anything in a registry. These examples show signing a single image, but you could also sign a multi-platform Index, or any other type of artifact. This includes Helm Charts, Tekton Pipelines, and anything else currently using OCI registries for distribution.

This also means new artifact types can be uploaded to a registry and signed. One interesting type to store and sign would be TUF repositories. I haven't tried yet, but I'm fairly certain TUF could be implemented on top of this.

Tag Signing

cosign signatures protect the digests of objects stored in a registry. The optional annotations support (via the -a flag to cosign sign) can be used to add extra data to the payload that is signed and protected by the signature. One use-case for this might be to sign a tag->digest mapping.

If you would like to attest that a specific tag (or set of tags) should point at a digest, you can run something like:

$ docker push $IMAGE_URI
The push refers to repository [dlorenc/demo]
994393dc58e7: Pushed
5m: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
$ TAG=sign-me
$ cosign sign --key cosign.key -a tag=$TAG $IMAGE_URI_DIGEST
Enter password for private key:
Pushing signature to: dlorenc/demo:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870.sig

Then you can verify that the tag->digest mapping is also covered in the signature, using the -a flag to cosign verify. This example verifies that the digest $TAG which points to (sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870) has been signed, and also that the tag annotation has the value sign-me:

$ cosign verify --key cosign.pub -a tag=$TAG $IMAGE_URI | jq .
{
  "Critical": {
    "Identity": {
      "docker-reference": ""
    },
    "Image": {
      "Docker-manifest-digest": "97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36"
    },
    "Type": "cosign container image signature"
  },
  "Optional": {
    "tag": "sign-me"
  }
}

Timestamps could also be added here, to implement TUF-style freeze-attack prevention.

Base Image/Layer Signing

Again, cosign can sign anything in a registry. You could use cosign to sign an image that is intended to be used as a base image, and include that provenance metadata in resulting derived images. This could be used to enforce that an image was built from an authorized base image.

Rough Idea:

  • OCI manifests have an ordered list of layer Descriptors, which can contain annotations. See here for the specification.
  • A base image is an ordered list of layers to which other layers are appended, as well as an initial configuration object that is mutated.
    • A derived image is free to completely delete/destroy/recreate the config from its base image, so signing the config would provided limited value.
  • We can sign the full set of ordered base layers, and attach that signature as an annotation to the last layer in the resulting child image.

This example manifest manifest represents an image that has been built from a base image with two layers. One additional layer is added, forming the final image.

{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 7023,
    "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
  },
  "layers": [
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 32654,
      "digest": "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0"
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 16724,
      "digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b",
      "annotations": {
        "dev.cosign.signature.baseimage": "Ejy6ipGJjUzMDoQFePWixqPBYF0iSnIvpMWps3mlcYNSEcRRZelL7GzimKXaMjxfhy5bshNGvDT5QoUJ0tqUAg=="
      }
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 73109,
      "digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
    }
  ],
}

Note that this could be applied recursively, for multiple intermediate base images.

Counter-Signing

Cosign signatures (and their protected payloads) are stored as artifacts in a registry. These signature objects can also be signed, resulting in a new, "counter-signature" artifact. This "counter-signature" protects the signature (or set of signatures) and the referenced artifact, which allows it to act as an attestation to the signature(s) themselves.

Before we sign the signature artifact, we first give it a memorable name so we can find it later.

$ cosign sign --key cosign.key -a sig=original $IMAGE_URI_DIGEST
Enter password for private key:
Pushing signature to: dlorenc/demo:sha256-97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36.sig
$ cosign verify --key cosign.pub dlorenc/demo | jq .
{
  "Critical": {
    "Identity": {
      "docker-reference": ""
    },
    "Image": {
      "Docker-manifest-digest": "97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36"
    },
    "Type": "cosign container image signature"
  },
  "Optional": {
    "sig": "original"
  }
}

Now give that signature a memorable name, then sign that:

$ crane tag $(cosign triangulate $IMAGE_URI) mysignature
2021/02/15 20:22:55 dlorenc/demo:mysignature: digest: sha256:71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e size: 556
$ cosign sign --key cosign.key -a sig=counter dlorenc/demo:mysignature
Enter password for private key:
Pushing signature to: dlorenc/demo:sha256-71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e.sig
$ cosign verify --key cosign.pub dlorenc/demo:mysignature
{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e"},"Type":"cosign container image signature"},"Optional":{"sig":"counter"}}

Finally, check the original signature:

$ crane manifest dlorenc/demo@sha256:71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e
{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 233,
    "digest": "sha256:3b25a088710d03f39be26629d22eb68cd277a01673b9cb461c4c24fbf8c81c89"
  },
  "layers": [
    {
      "mediaType": "application/vnd.oci.descriptor.v1+json",
      "size": 217,
      "digest": "sha256:0e79a356609f038089088ec46fd95f4649d04de989487220b1a0adbcc63fadae",
      "annotations": {
        "dev.sigstore.cosign/signature": "5uNZKEP9rm8zxAL0VVX7McMmyArzLqtxMTNPjPO2ns+5GJpBeXg+i9ILU+WjmGAKBCqiexTxzLC1/nkOzD4cDA=="
      }
    }
  ]
}

Release Cadence

We cut releases as needed. Patch releases are cut to fix small bugs. Minor releases are cut periodically when there are multiple bugs fixed or features added. Major releases will be released when there are breaking features.

Security

Should you discover any security issues, please refer to sigstore's security process

PEM files in GitHub Release Assets

The GitHub release assets for cosign contain a PEM file produced by GoReleaser while signing the cosign blob that is used to verify the integrity of the release binaries. This file is not used by cosign itself, but is provided for users who wish to verify the integrity of the release binaries.

By default, cosign output these PEM files in base64 encoded format, this approach might be good for air-gapped environments where the PEM file is stored in a file system. So, you should decode these PEM files before using them to verify the blobs.

cosign's People

Contributors

ahmetb avatar asraa avatar bobcallaway avatar caarlos0 avatar chrisjburns avatar cmurphy avatar cpanato avatar dentrax avatar dependabot[bot] avatar developer-guy avatar dlorenc avatar dmitris avatar font avatar haydentherapper avatar hectorj2f avatar imjasonh avatar jdolitsky avatar jonjohnsonjr avatar k4leung4 avatar lukehinds avatar mattmoor avatar n3wscott avatar naveensrinivasan avatar priyawadhwa avatar puerco avatar rgerganov avatar vaikas avatar vishal-chdhry avatar wlynch avatar znewman01 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cosign's Issues

Release v0.1.0

Here's a list of what's left to do:

  • Merge #103
  • Release notes!
  • Final smoke testing!
  • Actually tag a release and cut a branch

From there, we'll get an automated Github action build that pushes an Artifact with a signature and a hash.
The signature is created from the private key that is in the repo at this commit.

We'll publish that information on the Github releases page, and our GCS bucket (gs://cosign-releases/ under some path that makes sense. Maybe "gs://cosign-releases/releases/v0.1.0/".

Then we're set! The release can be verified from Github or GCS. The manual upload to GCS is intentional. The hashes should match between the two for easy verification, and we haven't given the GitHub system permissions to the GCS resources, so we have the information in two, independent places.

After that, we can add installation instructions to the readme (download from the releases, or "go install github.com/sigstore/cosign"). @SantiagoTorres has also offered to package for Arch!

Then our first release can be packaged up into GitHub actions and other container build steps (for Tekton and Cloud Build and other container-based systems, which we will also sign). This will make further releases much easier!

Use two dashes (e.g., "--name") for multi-letter options (e.g., --key not -key)

I suggest using two dashes to start multi-letter options. E.g., use "--key" not "-key".

Usually an option with more than one letter is preceded by "--". E.g., "--key" not "-key". That way, you can have single-letter options combined into a single argument, and multi-letter options are clearly distinct. Then you can support, e.g., "-k" for a key option name as well as "--key".

Fix copacetic!

I bet i signature verify doesn't work right now after we switched to ecdsa.

tag update race

are yall aware of any work in opencontainers to support atomic tag swaps (aka fail to update tag if expected previous digest does not match what tag is pointing at right before the update)? it might be too much burden to implement for registry implementors but would be handy for tag updates.

Extra check if the TLOG=1 and the image is not public

We can be extra safe by checking if the image is public before uploading to the tlog.

For public, we can see if we can pull the manifest with no creds.

Print a warning w/ confirmation if the image is private.
Have a -q flag for non-interactive scenarios

Cosign/TUF integration

As mentioned in the README, cosign can be used to store TUF metadata on a registry. This TUF metadata can secure the tag to digest relationships on the registry, define trust delegations, and provide compromise resilience in the case of a registry or infrastructure compromise. It would be nice to get a working prototype of this integration, possibly leveraging existing TUF implementations such as go-tuf.

As I envision it, a TUF/cosign integration would involve:
[x] Storing TUF metadata on a registry using cosign
[] Ensuring easy querying of that TUF metadata by users, ideally using a human-readable name

In the future, this could lead to more sigstore integration, for example:
[] Allowing TUF targets metadata to delegate to a fulcio identity
[] Supporting TUF root key discovery through a threshold of fulcio servers
[] Publishing TUF metadata to rekor for an immutable history

Add a "COSIGN_REPOSITORY" flag/env var

This would act as a replacement for the image repository, in case you want to sign/store/verify from an alternate location.

We should use this before we sign distroless. The first round will be:

export COSIGN_REPOSITORY=gcr.io/distroless-signatures

Causing:

gcr.io/distroless/static -> gcr.io/cosign-signatures/static:sha256-3b3507aa7ce16b085215915d6334f140d8f50ef35bbf3251ee52d3102296f60e.cosign

Add an examples doc

This could show:

  • Other signing formats (in-toto, v1.Descriptor, etc.)
  • How to sign/verify with openssl
  • How to sign/verify with a remote KMS
  • How to sign other things: a Tekton Bundle, a Helm Chart
  • Other places to store these signatures (Rekor, Grafeas?)
  • How to fetch and inline these signatures into a k8s object at deployment time.
  • OPA integration?

Keyless signing for blobs do not seem to be working

I'm trying

export COSIGN_EXPERIMENTAL=1
cosign sign-blob README.md

Output:

Using payload from: README.md
Generating ephemeral keys...
Retrieving signed certificate...
Your browser will now be opened to:
https://accounts.google.com/o/oauth2/v2/auth?access_type=online&client_id=237800849078-rmntmr1b2tcu20kpid66q5[...]

Signing with certificate:
-----BEGIN CERTIFICATE-----
MIICqzCCAjGgAwIBAgIUAOTYpl3cOP2Qaj7PqcLgyCQuTs0wCgYIKoZIzj0EAwMw
KjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MREwDwYDVQQDEwhzaWdzdG9yZTAeFw0y
MTAzMjIyMTUwMDlaFw0yMTAzMjIyMjEwMDJaMDgxGjAYBgNVBAoMEWFobWV0YkBn
b29nbGUuY29tMRowGAYDVQQDDBFhaG1ldGJAZ29vZ2xlLmNvbTBZMBMGByqGSM49
AgEGCCqGSM49AwEHA0IABF/qXf+zmfuTo33RQqeyIKpPZdrNIcwj2MNpg4sfoiXf
bf+YLlJE/wOEry7ORkRmLnp03pfQbIIdXPlp8rc7/LGjggElMIIBITAOBgNVHQ8B
Af8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwDAYDVR0TAQH/BAIwADAdBgNV
HQ4EFgQUa/ko/fUQCEADpHZJOgJOGBI/SVMwHwYDVR0jBBgwFoAUyMUdAEGaJCky
USTrDa5K7UoG0+wwgY0GCCsGAQUFBwEBBIGAMH4wfAYIKwYBBQUHMAKGcGh0dHA6
Ly9wcml2YXRlY2EtY29udGVudC02MDNmZTdlNy0wMDAwLTIyMjctYmY3NS1mNGY1
ZTgwZDI5NTQuc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jYTM2YTFlOTYyNDJiOWZj
YjE0Ni9jYS5jcnQwHAYDVR0RBBUwE4ERYWhtZXRiQGdvb2dsZS5jb20wCgYIKoZI
zj0EAwMDaAAwZQIwD3JNeYCtON2/iO4LMfisM14uwlyEj55rsJXdpFqAoHqamqfm
YQQimUYr75JqObo0AjEAs+oGjyVu/2w+1UwhVqkSjZ+GC091kO/Pm4qQjywoMf0L
5bua4L7sRdRVA9fWCkW/
-----END CERTIFICATE-----

error: empty key

Is this expected? I'm guessing it's just not implemented yet, but it seems we're missing an explicit error.

Code coverage metric in CI

Hi!

I was peering around CI (yay at signing CI builds!), and wondering whether a code coverage metric would be useful per push/PR to detect coverage regressions on new code.

# Run this workflow every time a new commit pushed to your repository

I'm very new to Go so don't know its extend of coverage profiling (how easy it is to filter files/generate reports), but this would be cool to have!

Simplify the env var handling

The TLOG=1 and --force-tlog and the new keyless mode stuff all start to interact with each other in complex ways. I think we should probably consider merging these features and putting them behind a single "COSIGN_EXPERIMENTAL" env var or something.

Then the behavior would be:

Experimental Off: No tlog, no fulcio
Experimental On: tlog and fulcio turned on by default, but warn/prompt/confirm for private images.

cmd: public-key writing to a particular file

$ cosign public-key -kms $KMS
Public key written to cosign.pub

I think this experience is problematic because
it always writes to $CWD and with a fixed file name.
That'll make scripting harder. I think we should
write to stdout.

Happy to refactor.

Switch from ed25519 to ecdsa?

We would use sha256 or 512, and P-384.

Basically until ed25519 gets into FIPS, most KMS systems and CAs aren't going to support ed25519 curves.

The keys are larger, but still smaller than RSA keys. For a sample:

-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0Gq6G8yJClUU8KhnzNs2Cer1C3Ro3yyQ
bNUkEnzOXzC11y3mjLdGXFjY8/RE22GtpTph8Z3nKH6WeNLxJbOGtjWdeAI22Vzu
gUEL+iz5J36ZI1fPu5lRmMaAU/u7qto7
-----END PUBLIC KEY-----

vs.
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAhJNkGxncSZ3R2ijORaJ9m1BHxzx5nJ2Q/GTLNfYt9UM=
-----END PUBLIC KEY-----

It's still manageable to squeeze one of these onto one line for easy CLI operations, but ugly.

Registry Support

Our primary goal is broad registry support. Right now we're unsure of where we are:

  • GCR (tested, mostly works)
  • Google Artifact Registry (works)
  • Quay - works in latest version, not in hosted service yet
  • Dockerhub?
  • Azure Container Registry?
  • Amazon Container Registry?
  • Others?

We have some options we can try to increase support, but they're kind of ugly. I'd first like to understand how much support we have vs. how much we would gain by doing terrible things with media types.

cc @jonjohnsonjr @font
(slack here: https://github.com/google/go-containerregistry/blob/93228a70849651ba98cdee6f0654f623d7cdcbdb/pkg/v1/manifest.go#L27)

ux: distinguish public key vs private key in CLI

Right now -key flag is used in both meanings "public key" and "private key".

It might be wise to distinguish these as -key and -pub earlier than later. Please vote ๐Ÿ‘๐Ÿผ ๐Ÿ‘Ž๐Ÿผ .

USAGE
  cosign verify -key <key> <image uri>

FLAGS
  -a ...              extra key=value pairs to sign
  -check-claims true  whether to check the claims found
  -key ...            path to the public key
  -kms ...            verify via a public key stored in a KMS
USAGE
  cosign sign -key <key> [-payload <path>] [-a key=value] [-upload=true|false] [-force-tlog=true|false] <image uri>

FLAGS
  -a ...             extra key=value pairs to sign
  -force-tlog false  whether to upload to the tlog even when the image is private
  -key ...           path to the private key
  -kms ...           sign via a private key stored in a KMS
  -payload ...       path to a payload file to use rather than generating one.
  -upload true       whether to upload the signature

cosign sign should be able to take multiple keys

cosign sign --key foo.key --key bar.key -a hello=world <img>

should be equivalent to

cosign sign --key foo.key -a hello=world <img>
cosign sign --key bar.key -a hello=world <img>

while making fewer requests to the registry, and failing to publish any signatures if either signing operation fails.

This might also mean that you should be able to cosign sign --key foo.key --kms ... (#78)

ux: consider adding EXAMPLES section to commands

Several flags like -kms are currently hard to infer how to use without exploring docs or source code.

Having EXAMPLES in each cmd would help with CUJs. Might need to shoehorn into Description, or use cobra library to properly do it.

Some kind of remote KMS support

GCP KMS doesn't support ed25519.
So we can store the ed25519 private-key as a GCP Secret, descrypt it - sign - destroy.

The command would be something like:
cosign generate-key-pair -kms gcp://project/secrets/region...

Then allow key -key to reference the kms secret by URI as well.

cosign sign -key gcp://fkdafd gcr.io/dlorenc-vmtest2/demo

It will use GCP auth helpers.

We can support multiple remote KMS systems - not just GCP - the https://github.com/google/go-cloud might have a helper for this.

Reproducible builds

-X github.com/sigstore/cosign/cmd/cosign/cli.buildDate=$(BUILDDATE)"

This makes it harder to have reproducible builds, is there a specific reason to have a date in the ldflags? I understand Git SHA.

ux: required arguments cause "help requested" error

e.g. this command is trying to tell me either -key or -kms is required:

cosign verify gcr.io/ahmetb-demo/ytdl:latest
USAGE
  cosign verify -key <key> <image uri>

FLAGS
  -a ...              extra key=value pairs to sign
  -check-claims true  whether to check the claims found
  -key ...            path to the public key
  -kms ...            verify via a public key stored in a KMS
error: flag: help requested

idea: tarsign

Some kind of mode to sign a zipped tarball, and append the signature/cert into it.

  • We should "attach" the sig and cert into the tarball somehow
  • We can modify it (obviously), but it would be great if we can still find the original digest
  • It should be transparent/not-noticeable to users that don't care about the signatures. They shouldn't notice

test: go test failing locally

To onboard new maintainers, it would be better if go test ./... worked out of the box.

right now it seems it requests some external setup.

also would be good to introduce -short support for unit testing only.

...
?   	github.com/sigstore/cosign/cmd/cosign	[no test files]
?   	github.com/sigstore/cosign/cmd/cosign/cli	[no test files]
?   	github.com/sigstore/cosign/copasetic	[no test files]
=== RUN   TestLoadPrivateKey
--- PASS: TestLoadPrivateKey (0.42s)
PASS
ok  	github.com/sigstore/cosign/pkg/cosign	(cached)
?   	github.com/sigstore/cosign/pkg/cosign/kms	[no test files]
=== RUN   TestSignVerify
    e2e_test.go:353: COSIGN_TEST_REPO unset, using fake registry
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:c8fa724cb05b9c99afa8ef70d3b7da5f9622613cf736f013fadaae5077842a58 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:e28066df07ecde0d32905c66fc35b26804b5cf3125fa6116aac4e88a7040b69e 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:3fe5fdce124718213c3dece6f71632fad0450ced88228501e3077fbca1b1b840 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:801e45da5d42fffbe2910687b444d877bb20a15efbfa7ad502974aa2c4a20bf6 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:6327342866a29c3bbfe5c32a69111e4d6912a1321c3a5ff25cdeea48819a37aa 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:9496397081e5318659b1e728d9b5ba7d3167c68262bfa2b7c17d1788fe4daaec 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/605394647632969758
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/1443635317331776148
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/6334824724549167320
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/2775422040480279449
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/894385949183117216
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/1443635317331776148?digest=sha256%3A3fe5fdce124718213c3dece6f71632fad0450ced88228501e3077fbca1b1b840
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/605394647632969758?digest=sha256%3Ae28066df07ecde0d32905c66fc35b26804b5cf3125fa6116aac4e88a7040b69e
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/4751997750760398084
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/6334824724549167320?digest=sha256%3Ac8fa724cb05b9c99afa8ef70d3b7da5f9622613cf736f013fadaae5077842a58
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/2775422040480279449?digest=sha256%3A801e45da5d42fffbe2910687b444d877bb20a15efbfa7ad502974aa2c4a20bf6
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/894385949183117216?digest=sha256%3A9496397081e5318659b1e728d9b5ba7d3167c68262bfa2b7c17d1788fe4daaec
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/4751997750760398084?digest=sha256%3A6327342866a29c3bbfe5c32a69111e4d6912a1321c3a5ff25cdeea48819a37aa
2021/03/11 11:42:25 PUT /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
Pushing signature to: 127.0.0.1:63572/cosign-e2e:sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:a32319b5ad16e9cf1501850ca2fbc90f4dc23341123872bb8b1fe50f1dfc6226 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:d1cba456fc9361b0270547b441b01341b5aeb3ad6d453855a2e3b17b455c9e17 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/7504504064263669287
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/1976235410884491574
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/7504504064263669287?digest=sha256%3Aa32319b5ad16e9cf1501850ca2fbc90f4dc23341123872bb8b1fe50f1dfc6226
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/1976235410884491574?digest=sha256%3Ad1cba456fc9361b0270547b441b01341b5aeb3ad6d453855a2e3b17b455c9e17
2021/03/11 11:42:25 PUT /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/cosign-e2e/blobs/sha256:d1cba456fc9361b0270547b441b01341b5aeb3ad6d453855a2e3b17b455c9e17
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/cosign-e2e/blobs/sha256:d1cba456fc9361b0270547b441b01341b5aeb3ad6d453855a2e3b17b455c9e17
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
Pushing signature to: 127.0.0.1:63572/cosign-e2e:sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/cosign-e2e/blobs/sha256:a32319b5ad16e9cf1501850ca2fbc90f4dc23341123872bb8b1fe50f1dfc6226
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:d1cba456fc9361b0270547b441b01341b5aeb3ad6d453855a2e3b17b455c9e17
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:34da2ce5fc5fe3687e044878ad16bed6ec32879ab91c57bf6f2ef7aa16f04169 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 HEAD /v2/cosign-e2e/blobs/sha256:bb561a72b2d685c6542f533b90967abd44dbc8855cea8ba34d8b9225821ce4c0 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/3510942875414458836
2021/03/11 11:42:25 PATCH /v2/cosign-e2e/blobs/uploads/2933568871211445515
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/3510942875414458836?digest=sha256%3A34da2ce5fc5fe3687e044878ad16bed6ec32879ab91c57bf6f2ef7aa16f04169
2021/03/11 11:42:25 PUT /v2/cosign-e2e/blobs/uploads/2933568871211445515?digest=sha256%3Abb561a72b2d685c6542f533b90967abd44dbc8855cea8ba34d8b9225821ce4c0
2021/03/11 11:42:25 PUT /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/cosign-e2e/blobs/sha256:d1cba456fc9361b0270547b441b01341b5aeb3ad6d453855a2e3b17b455c9e17
2021/03/11 11:42:25 GET /v2/cosign-e2e/blobs/sha256:34da2ce5fc5fe3687e044878ad16bed6ec32879ab91c57bf6f2ef7aa16f04169
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 GET /v2/cosign-e2e/manifests/sha256-698dc87529807a85dfb56ff24f01b6d0339ba22411638d3320c177513e92dba1.cosign
2021/03/11 11:42:25 GET /v2/cosign-e2e/blobs/sha256:d1cba456fc9361b0270547b441b01341b5aeb3ad6d453855a2e3b17b455c9e17
2021/03/11 11:42:25 GET /v2/cosign-e2e/blobs/sha256:34da2ce5fc5fe3687e044878ad16bed6ec32879ab91c57bf6f2ef7aa16f04169
2021/03/11 11:42:25 GET /v2/
2021/03/11 11:42:25 DELETE /v2/cosign-e2e/manifests/latest
--- PASS: TestSignVerify (2.04s)
=== RUN   TestMultipleSignatures
    e2e_test.go:353: COSIGN_TEST_REPO unset, using fake registry
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:82d9a944e5031fb48f2e03c5f5a47d6e00490c12d3e1bf1b40cf36c349a90e80 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:b54afa1a7d838b27636406dcce16c814bd009795600306fa5fa3910b8fbf0662 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:5460e056d2528994126df8867a41e1c8286ad68e8957d66171f090ce481314fd 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:e0924ae83ac95679207f050d6be4d03512a42e530f7a022ac1fdfd054a794368 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:494bf9fe551d433782a9fe91eecc41d7e7a7187d18eac65e5c43da72dc7f499a 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:ffb45968bd6cbe48f73749b69c088ddfa0bdb729bab1e60f79938a6e1c0922e6 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/3328451335138149956
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/5263531936693774911
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/7955079406183515637
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/1874068156324778273
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/2703501726821866378
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/2740103009342231109
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/1874068156324778273?digest=sha256%3A82d9a944e5031fb48f2e03c5f5a47d6e00490c12d3e1bf1b40cf36c349a90e80
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/3328451335138149956?digest=sha256%3A494bf9fe551d433782a9fe91eecc41d7e7a7187d18eac65e5c43da72dc7f499a
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/5263531936693774911?digest=sha256%3Ab54afa1a7d838b27636406dcce16c814bd009795600306fa5fa3910b8fbf0662
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/2703501726821866378?digest=sha256%3A5460e056d2528994126df8867a41e1c8286ad68e8957d66171f090ce481314fd
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/7955079406183515637?digest=sha256%3Ae0924ae83ac95679207f050d6be4d03512a42e530f7a022ac1fdfd054a794368
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/2740103009342231109?digest=sha256%3Affb45968bd6cbe48f73749b69c088ddfa0bdb729bab1e60f79938a6e1c0922e6
2021/03/11 11:42:27 PUT /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
Pushing signature to: 127.0.0.1:63608/cosign-e2e:sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:8d8feba1a9ec01b2c11cc5c22b609d2dde9fc6dafec11bda873ffd0429d86db0 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/1905388747193831650
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/6941261091797652072
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/1905388747193831650?digest=sha256%3A37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/6941261091797652072?digest=sha256%3A8d8feba1a9ec01b2c11cc5c22b609d2dde9fc6dafec11bda873ffd0429d86db0
2021/03/11 11:42:27 PUT /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
Pushing signature to: 127.0.0.1:63608/cosign-e2e:sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/cosign-e2e/blobs/sha256:8d8feba1a9ec01b2c11cc5c22b609d2dde9fc6dafec11bda873ffd0429d86db0
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 HEAD /v2/cosign-e2e/blobs/sha256:96fde9c17fb0210fefb2cc794c895c2a43bac0e101e9c077ee19d7abde0e5dee 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:27 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:27 PATCH /v2/cosign-e2e/blobs/uploads/7981306761429961588
2021/03/11 11:42:27 PUT /v2/cosign-e2e/blobs/uploads/7981306761429961588?digest=sha256%3A96fde9c17fb0210fefb2cc794c895c2a43bac0e101e9c077ee19d7abde0e5dee
2021/03/11 11:42:27 PUT /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 GET /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 GET /v2/cosign-e2e/manifests/sha256-73d60156e8dde8125f177739902a99b5162ee2cc55ebd1180071506c418397be.cosign
2021/03/11 11:42:27 GET /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 GET /v2/cosign-e2e/blobs/sha256:37229bb39ab2fab4f8bc1d6a7c7c739d80d3aa4d90eccc93e13c024b053ce06b
2021/03/11 11:42:27 GET /v2/
2021/03/11 11:42:27 DELETE /v2/cosign-e2e/manifests/latest
--- PASS: TestMultipleSignatures (1.81s)
=== RUN   TestGenerate
    e2e_test.go:353: COSIGN_TEST_REPO unset, using fake registry
2021/03/11 11:42:29 GET /v2/
2021/03/11 11:42:29 HEAD /v2/cosign-e2e/blobs/sha256:ed4143bf0109f4186b722e0ddff018a58aa6e784aaa7d7c4a93866cb08feea35 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:29 HEAD /v2/cosign-e2e/blobs/sha256:d48486ba0504bf13ed27ee0b7077e94ff9f270375eeaaedfc312e0518d1edc94 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:29 HEAD /v2/cosign-e2e/blobs/sha256:d90a5c65986c01aa64a59eb1ace438c52039ab98656cd187ceddb5e17a17d309 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:29 HEAD /v2/cosign-e2e/blobs/sha256:0741ee4529e95f4129183208cc43b3f645f9768f318a48cd4c56c726bbe28b36 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:29 HEAD /v2/cosign-e2e/blobs/sha256:15dcdc5f68c4301c058d0b2e0e8d665b4ddd8fbb94135f934c931a336c3fe126 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:29 HEAD /v2/cosign-e2e/blobs/sha256:49e0bf138c0096a41211454b8601ae662cb309ec121700bcc9ab0f60d8a864a1 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:29 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:29 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:29 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:29 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:29 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:29 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:29 PATCH /v2/cosign-e2e/blobs/uploads/8995016276575641803
2021/03/11 11:42:29 PATCH /v2/cosign-e2e/blobs/uploads/732830328053361739
2021/03/11 11:42:29 PATCH /v2/cosign-e2e/blobs/uploads/5486140987150761883
2021/03/11 11:42:29 PATCH /v2/cosign-e2e/blobs/uploads/6382800227808658932
2021/03/11 11:42:29 PATCH /v2/cosign-e2e/blobs/uploads/2781055864473387780
2021/03/11 11:42:29 PATCH /v2/cosign-e2e/blobs/uploads/545291762129038907
2021/03/11 11:42:29 PUT /v2/cosign-e2e/blobs/uploads/8995016276575641803?digest=sha256%3Aed4143bf0109f4186b722e0ddff018a58aa6e784aaa7d7c4a93866cb08feea35
2021/03/11 11:42:29 PUT /v2/cosign-e2e/blobs/uploads/732830328053361739?digest=sha256%3Ad48486ba0504bf13ed27ee0b7077e94ff9f270375eeaaedfc312e0518d1edc94
2021/03/11 11:42:29 PUT /v2/cosign-e2e/blobs/uploads/6382800227808658932?digest=sha256%3A15dcdc5f68c4301c058d0b2e0e8d665b4ddd8fbb94135f934c931a336c3fe126
2021/03/11 11:42:29 PUT /v2/cosign-e2e/blobs/uploads/2781055864473387780?digest=sha256%3A49e0bf138c0096a41211454b8601ae662cb309ec121700bcc9ab0f60d8a864a1
2021/03/11 11:42:29 PUT /v2/cosign-e2e/blobs/uploads/5486140987150761883?digest=sha256%3Ad90a5c65986c01aa64a59eb1ace438c52039ab98656cd187ceddb5e17a17d309
2021/03/11 11:42:29 PUT /v2/cosign-e2e/blobs/uploads/545291762129038907?digest=sha256%3A0741ee4529e95f4129183208cc43b3f645f9768f318a48cd4c56c726bbe28b36
2021/03/11 11:42:29 PUT /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:29 GET /v2/
2021/03/11 11:42:29 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:29 GET /v2/
2021/03/11 11:42:29 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:29 GET /v2/
2021/03/11 11:42:29 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:29 GET /v2/
2021/03/11 11:42:29 DELETE /v2/cosign-e2e/manifests/latest
--- PASS: TestGenerate (1.38s)
=== RUN   TestUploadDownload
    e2e_test.go:353: COSIGN_TEST_REPO unset, using fake registry
=== RUN   TestUploadDownload/file_containing_signature
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:ccc60dc456c1ecadb6900cb0b25a733798d57dc9be7ffa0e04643a0026fb5cbb 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:3ab161c3831768ecfee76fdb67065189c28701905c20d844a114b6996160890c 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:5062c0eacbfa77ac7aa40dd0a243f699394f61427478f9d05b752bf1c19b42e2 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:72156bec5ddbc687c8507f4b2e4f2cb9970d5bf556a08bc7075c07acd1a99a2f 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:34c003d38bbdb3473d0d99594925e38c82445da96e81e6db70b42f4ef02474da 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:a4cf8b0b87ee89013866f78697ed4436c4e443fe934118a1abd06dc2a1777c61 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/4893789450120281907
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/7273596521315663110
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/2338498362660772719
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/3337066551442961397
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/2601737961087659062
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/7273596521315663110?digest=sha256%3A5062c0eacbfa77ac7aa40dd0a243f699394f61427478f9d05b752bf1c19b42e2
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/8121576815539813105
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/4893789450120281907?digest=sha256%3A3ab161c3831768ecfee76fdb67065189c28701905c20d844a114b6996160890c
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/2338498362660772719?digest=sha256%3Accc60dc456c1ecadb6900cb0b25a733798d57dc9be7ffa0e04643a0026fb5cbb
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/3337066551442961397?digest=sha256%3A34c003d38bbdb3473d0d99594925e38c82445da96e81e6db70b42f4ef02474da
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/8121576815539813105?digest=sha256%3Aa4cf8b0b87ee89013866f78697ed4436c4e443fe934118a1abd06dc2a1777c61
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/2601737961087659062?digest=sha256%3A72156bec5ddbc687c8507f4b2e4f2cb9970d5bf556a08bc7075c07acd1a99a2f
2021/03/11 11:42:30 PUT /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 GET /v2/cosign-e2e/manifests/sha256-0828c76942faeeeb1f71cb6bd7f90a1e52c3a1c3a6ff15beea1edcd4c40f61a1.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:f5b1321b02e0f73b0e68ecaa6da3d1204ddc4341d62e896136fe69b75a86a1f6 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 HEAD /v2/cosign-e2e/blobs/sha256:17e25830de8833d4c96b15a69173bdbf69e66d620210daed42455095ddd73820 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/2740376916591569721
2021/03/11 11:42:30 PATCH /v2/cosign-e2e/blobs/uploads/8249030965139585917
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/2740376916591569721?digest=sha256%3Af5b1321b02e0f73b0e68ecaa6da3d1204ddc4341d62e896136fe69b75a86a1f6
2021/03/11 11:42:30 PUT /v2/cosign-e2e/blobs/uploads/8249030965139585917?digest=sha256%3A17e25830de8833d4c96b15a69173bdbf69e66d620210daed42455095ddd73820
2021/03/11 11:42:30 PUT /v2/cosign-e2e/manifests/sha256-0828c76942faeeeb1f71cb6bd7f90a1e52c3a1c3a6ff15beea1edcd4c40f61a1.cosign
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 GET /v2/cosign-e2e/manifests/sha256-0828c76942faeeeb1f71cb6bd7f90a1e52c3a1c3a6ff15beea1edcd4c40f61a1.cosign
2021/03/11 11:42:30 GET /v2/cosign-e2e/blobs/sha256:f5b1321b02e0f73b0e68ecaa6da3d1204ddc4341d62e896136fe69b75a86a1f6
2021/03/11 11:42:30 GET /v2/
2021/03/11 11:42:30 DELETE /v2/cosign-e2e/manifests/latest
=== RUN   TestUploadDownload/raw_signature_as_argument
2021/03/11 11:42:31 GET /v2/
2021/03/11 11:42:31 HEAD /v2/cosign-e2e/blobs/sha256:25e24e0af4222be205ca0ac3083cb13b7235dd3ac34f1acf0f3174d678d3ab2e 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:31 HEAD /v2/cosign-e2e/blobs/sha256:da1140b44621bf06dff5a225d2da17f82880d954919b2b189508b2b658a6580c 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:31 HEAD /v2/cosign-e2e/blobs/sha256:5c382987316a8ff64b19d2b07f0b2119d767ab87d2582ff231681146aefec39f 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:31 HEAD /v2/cosign-e2e/blobs/sha256:86d6ef17212b8a2e4371228018677cf8b5e2e2236d0982c48a1a0f395c7a9f6b 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:31 HEAD /v2/cosign-e2e/blobs/sha256:53d704931027a9d5fa06e9002378c00e295b79dda240a825fa857d261ca8dedc 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:31 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:31 HEAD /v2/cosign-e2e/blobs/sha256:f5b8c0d737729e5601aef80c3c56dbcf1c2c6ed28385ca721f6afb3d3f9a0583 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:31 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:31 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:31 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:31 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:31 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/8603989663476771718
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/6735196588112087610
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/6842348953158377901
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/2227583514184312746
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/8603989663476771718?digest=sha256%3A25e24e0af4222be205ca0ac3083cb13b7235dd3ac34f1acf0f3174d678d3ab2e
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/2873287401706343734
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/7388428680384065704
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/6735196588112087610?digest=sha256%3A53d704931027a9d5fa06e9002378c00e295b79dda240a825fa857d261ca8dedc
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/6842348953158377901?digest=sha256%3A86d6ef17212b8a2e4371228018677cf8b5e2e2236d0982c48a1a0f395c7a9f6b
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/7388428680384065704?digest=sha256%3Af5b8c0d737729e5601aef80c3c56dbcf1c2c6ed28385ca721f6afb3d3f9a0583
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/2227583514184312746?digest=sha256%3A5c382987316a8ff64b19d2b07f0b2119d767ab87d2582ff231681146aefec39f
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/2873287401706343734?digest=sha256%3Ada1140b44621bf06dff5a225d2da17f82880d954919b2b189508b2b658a6580c
2021/03/11 11:42:32 PUT /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/sha256-4d3dd9c9829d0a606652beed8118861f7e15f02f4ee65b48d050708c032d39ba.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:17e25830de8833d4c96b15a69173bdbf69e66d620210daed42455095ddd73820
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:f5b1321b02e0f73b0e68ecaa6da3d1204ddc4341d62e896136fe69b75a86a1f6
2021/03/11 11:42:32 PUT /v2/cosign-e2e/manifests/sha256-4d3dd9c9829d0a606652beed8118861f7e15f02f4ee65b48d050708c032d39ba.cosign
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/sha256-4d3dd9c9829d0a606652beed8118861f7e15f02f4ee65b48d050708c032d39ba.cosign
2021/03/11 11:42:32 GET /v2/cosign-e2e/blobs/sha256:f5b1321b02e0f73b0e68ecaa6da3d1204ddc4341d62e896136fe69b75a86a1f6
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 DELETE /v2/cosign-e2e/manifests/latest
=== RUN   TestUploadDownload/empty_signature_as_argument
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:ee6bb2cfc0dff05a5dfecb2b2ba5ebcd93a10a4c16a6f191561022f4e950d8a7 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:e1fae0070f1f6f0c2dd36852bd0e27ce958a495c184d1a901062bbb2bcb6ae0c 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:24fab67a665883245c19e62c2e143aa8259bba69e6d8a82beaf30a5700f895c2 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:c669f37751ee61d6dabef3f2512e7bb36e5ae61ef73be63602e550a64bb9d923 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:8997919a650f12dbdaed0fa91e23dc6570215cd65fd9e62944aa0d3b2845a985 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:32 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:32 HEAD /v2/cosign-e2e/blobs/sha256:0980cc3537ab2f91553fd1486b678f885d966cb0c58331f16ac6210df88e6427 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:32 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:32 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:32 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:32 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:32 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/8505906760983331750
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/837825985403119657
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/4548432111829895923
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/8549944162621642512
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/837825985403119657?digest=sha256%3A24fab67a665883245c19e62c2e143aa8259bba69e6d8a82beaf30a5700f895c2
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/8807817071862113702
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/4548432111829895923?digest=sha256%3Ae1fae0070f1f6f0c2dd36852bd0e27ce958a495c184d1a901062bbb2bcb6ae0c
2021/03/11 11:42:32 PATCH /v2/cosign-e2e/blobs/uploads/3209308858241334655
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/8505906760983331750?digest=sha256%3Aee6bb2cfc0dff05a5dfecb2b2ba5ebcd93a10a4c16a6f191561022f4e950d8a7
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/8549944162621642512?digest=sha256%3Ac669f37751ee61d6dabef3f2512e7bb36e5ae61ef73be63602e550a64bb9d923
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/8807817071862113702?digest=sha256%3A8997919a650f12dbdaed0fa91e23dc6570215cd65fd9e62944aa0d3b2845a985
2021/03/11 11:42:32 PUT /v2/cosign-e2e/blobs/uploads/3209308858241334655?digest=sha256%3A0980cc3537ab2f91553fd1486b678f885d966cb0c58331f16ac6210df88e6427
2021/03/11 11:42:32 PUT /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 GET /v2/cosign-e2e/manifests/sha256-af35eeefb0451634e103b6e7fd715ccf5d08b1080d59b501398ec5d4600f12cf.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:32 GET /v2/
2021/03/11 11:42:32 DELETE /v2/cosign-e2e/manifests/latest
--- PASS: TestUploadDownload (2.99s)
    --- PASS: TestUploadDownload/file_containing_signature (1.38s)
    --- PASS: TestUploadDownload/raw_signature_as_argument (0.79s)
    --- PASS: TestUploadDownload/empty_signature_as_argument (0.82s)
=== RUN   TestTlog
    e2e_test.go:353: COSIGN_TEST_REPO unset, using fake registry
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:72898f5cdc28404569c3f12fcc413c57c83713b6ebe347d18ee7c6ccf0f522ff 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:9b3e560963123ea784a4a63cc5df3774fd98ed3c861f106bbc3aab2a803a1fcd 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:05ca6173264e745e553dad75e3188420cb791576d3dafd903fad586dde4ef62c 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:55ca517a7c7aa8075154fe4edf84d0c7edb7729e47de545477f9cbf7863fae97 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:e3866990dbaf994d8bedab55f5a5ee4537199620314710d4e7eceefc17d87126 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:8d3b3c312110f3ae4094fb5b7aaaa9d204aedafaf3fbe9080289a18b99aa8181 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/6971241403795498694
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/3724427934598140041
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/2970700287221458280
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/1205043859388862788
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/8267293389953062911
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/1205043859388862788?digest=sha256%3Ae3866990dbaf994d8bedab55f5a5ee4537199620314710d4e7eceefc17d87126
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/9093919513921919021
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/6971241403795498694?digest=sha256%3A72898f5cdc28404569c3f12fcc413c57c83713b6ebe347d18ee7c6ccf0f522ff
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/2970700287221458280?digest=sha256%3A05ca6173264e745e553dad75e3188420cb791576d3dafd903fad586dde4ef62c
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/3724427934598140041?digest=sha256%3A9b3e560963123ea784a4a63cc5df3774fd98ed3c861f106bbc3aab2a803a1fcd
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/8267293389953062911?digest=sha256%3A55ca517a7c7aa8075154fe4edf84d0c7edb7729e47de545477f9cbf7863fae97
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/9093919513921919021?digest=sha256%3A8d3b3c312110f3ae4094fb5b7aaaa9d204aedafaf3fbe9080289a18b99aa8181
2021/03/11 11:42:33 PUT /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/latest
Pushing signature to: 127.0.0.1:63718/cosign-e2e:sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign 404 MANIFEST_UNKNOWN Unknown manifest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:1c296162595e02ecec1d6574fb04c073176b199143feedcf8123ac0d072f2e76 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 HEAD /v2/cosign-e2e/blobs/sha256:982bc03e46d22e04936d33cdc173fdf1c0aae25f904e95b66b3c9d077a4553fc 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/5944830206637008055
2021/03/11 11:42:33 PATCH /v2/cosign-e2e/blobs/uploads/6651414131918424343
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/5944830206637008055?digest=sha256%3A982bc03e46d22e04936d33cdc173fdf1c0aae25f904e95b66b3c9d077a4553fc
2021/03/11 11:42:33 PUT /v2/cosign-e2e/blobs/uploads/6651414131918424343?digest=sha256%3A1c296162595e02ecec1d6574fb04c073176b199143feedcf8123ac0d072f2e76
2021/03/11 11:42:33 PUT /v2/cosign-e2e/manifests/sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign
2021/03/11 11:42:33 GET /v2/cosign-e2e/blobs/sha256:1c296162595e02ecec1d6574fb04c073176b199143feedcf8123ac0d072f2e76
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/latest
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign
2021/03/11 11:42:33 GET /v2/cosign-e2e/blobs/sha256:1c296162595e02ecec1d6574fb04c073176b199143feedcf8123ac0d072f2e76
2021/03/11 11:42:33 GET /v2/
2021/03/11 11:42:33 GET /v2/cosign-e2e/manifests/latest
Pushing signature to: 127.0.0.1:63718/cosign-e2e:sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign
2021/03/11 11:42:34 GET /v2/
2021/03/11 11:42:34 GET /v2/cosign-e2e/manifests/sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign
2021/03/11 11:42:34 GET /v2/cosign-e2e/blobs/sha256:982bc03e46d22e04936d33cdc173fdf1c0aae25f904e95b66b3c9d077a4553fc
2021/03/11 11:42:34 GET /v2/
2021/03/11 11:42:34 HEAD /v2/cosign-e2e/blobs/sha256:1c296162595e02ecec1d6574fb04c073176b199143feedcf8123ac0d072f2e76
2021/03/11 11:42:34 HEAD /v2/cosign-e2e/blobs/sha256:03bde37aeb77179cd5ffb4e6f92308b61aaead7d2b35d455753184a05c59a825 404 BLOB_UNKNOWN Unknown blob
2021/03/11 11:42:34 POST /v2/cosign-e2e/blobs/uploads/
2021/03/11 11:42:34 PATCH /v2/cosign-e2e/blobs/uploads/788787457839692041
2021/03/11 11:42:34 PUT /v2/cosign-e2e/blobs/uploads/788787457839692041?digest=sha256%3A03bde37aeb77179cd5ffb4e6f92308b61aaead7d2b35d455753184a05c59a825
2021/03/11 11:42:34 PUT /v2/cosign-e2e/manifests/sha256-d80c967c6c29e51b980e8a0ac95405e83b26ea1b35455fa88a98576e782596de.cosign
2021/03/11 11:42:34 GET /v2/
2021/03/11 11:42:34 GET /v2/cosign-e2e/manifests/latest
    e2e_test.go:282: Post "http://127.0.0.1:3000/api/v1/log/entries": dial tcp 127.0.0.1:3000: connect: connection refused
2021/03/11 11:42:34 GET /v2/
2021/03/11 11:42:34 DELETE /v2/cosign-e2e/manifests/latest
--- FAIL: TestTlog (1.82s)
FAIL
FAIL	github.com/sigstore/cosign/test	10.534s
FAIL

Initial release plans for cosign

I reeallly want to try to sign the first release of cosign, with cosign, if we can figure out a way that makes sense.

I think we'll have to do it manually, since we won't have a signed release to use in automation yet though. Thankfully we can skip some of the issues with reproducible builds.

Here's a rough plan:

The trick is that we can use Go to build a reproducible binary.

  • Setup github actions to build and publish a cosign binary on each commit to main

    • cosign builds should be reproducible, with some care.
    • We'll make these build logs public, showing the sha of each binary we build.
  • One or more of us will generate keys specific to this initial release.

    • The more the merrier!
    • We can commit these public keys to a file here in the repo.
  • We can pick a commit to tag our initial release at.

  • We'll have several of us build our own versions of cosign from it, and check the SHAs against the ones from the GitHub action. We can publish those in an issue.

  • If they match, we can tag the release. We'll then sign the first binaries and git tag (v0.1.0)!

  • We'll publish the signatures in Rekor and in the GitHub release.

  • The keys to verify the release will be included in the git repo at the matching commit!

After this, we can change our automation to use it's own public/private key-pair (also stored in this repo), and the last signed cosign binary release (v0.1.0) in CI to sign continuous builds. Signatures can get published to Rekor, the build log, and wherever we host the binaries.

Actual tagged releases will also be signed by the automation, and one or more maintainers. We'll sign the git commits as well as the resulting binaries. These can get published to the GitHub release. These public keys (and their mapping to maintainers) will also be stored in the repo.

We can write a verification script to help people verify.

Consider verifying local images if they exist

Right now cosign verify verifies that the remote image passed in is valid.

Maybe users would want to verify the local image they just pulled is also what they expected it to be. I'm still not sure if:

  • this is a feature anyone would actually use
  • if there is a way to delete the digest for an image locally but maintain the image in docker (cosign won't work without the digest)

I'll leave this issue open for a bit in case anyone has any thoughts.

minor suggestion on tag name of signature index

while working on https://github.com/vmware-tanzu/imgpkg i've also noodled on the idea of using tags for searching related artifacts (signatures and few other things) since there is no other mechanisms available in registry APIs. i'm glad yall came to a similar conclusion :)

im curious where yall see this project head to (is it a poc)... my team have recently popped into notary OSS WG to see where the community is at with regards to an open standards for signing, so curious about your take on this.

onto minor suggestion:

i think it's worth adding cosign- prefix to sha256-... lookup tag so that it's cosign-sha256-... mostly to have some kind of namespacing between tools using similar approach for lookups.

TLOG Support

Let's add an experimental TLOG mode to the tool. This will look like:

TLOG=1 cosign sign ...

and

TLOG=1 cosign verify ...

The tlog server will default to api.rekor.dev, and can be overridden with the REKOR_SERVER env variable.

TLOG=1 cosign sign will publish the signature, public key and payload to the Rekor tlog.
TLOG=1 cosign verify will verify the signature, public key and payload are in the tlog, as well as verifying the signature itself.

Both commands will record the state of the tlog in the .rekor/state.json configuration file and audit the log on each invocation..

Kms ux

Can we make the string shorter?

Default project, location to global, default key in keyring

Idea: kubectl plugin to embed signatures in objects

This could work something like:

1. Go through a k8s object looking for images
2. For each image, pull do something like "cosign verify" and get all verified payloads
3. Attach those payloads directly into the k8s object as annotations

This way deployment time policy enforcement (OPA, etc.) could look directly at the yaml rather than needing to interact with an external service.

[SOLVED] Build fails (macOS)

Cloned the repo, but go build -o cosign ./cmd after cd ~/Developer/GitHub/cosign failed with no Go files in ~/Developer/GitHub/cosign/cmd. Am I doing something wrong?

(macOS 11.2.3)

--key arg accepts both file and value, leads to confusing error

I was just trying:

cosign verify -key cosign.pub dlorenc/signed-container:v0.0.1
error: illegal base64 data at input byte 6

but it turned out there's no cosign.pub on my disk, so it performed fallback to parsing cosign.pub value as b64, which led to a confusing error message.

  1. This sort of fallback behavior defeats principle of least astonishment.
  2. Users can provide values as fds e.g. --key <(echo "...") that we can read as files.

So this sort of fallback is unpredictable. Happy to send a PR to fix if ๐Ÿ‘๐Ÿผ.

Easy support for GitHub actions

Credentials are passed in as environment variables. That would require writing to disk first (which we would like to avoid anyway). Cosign could take in a predefined env var for private keys for these environments.

export COSIGN_SECRET=$GITHUB_SECRET
cosign sign $image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.