// LoadStatement loads and verifies a statement from an input stream. func LoadStatement(r io.Reader, authority *x509.CertPool) (*Statement, error) { b, err := ioutil.ReadAll(r) if err != nil { return nil, err } js, err := libtrust.ParsePrettySignature(b, "signatures") if err != nil { return nil, err } payload, err := js.Payload() if err != nil { return nil, err } var statement Statement err = json.Unmarshal(payload, &statement.jsonStatement) if err != nil { return nil, err } if authority == nil { _, err = js.Verify() if err != nil { return nil, err } } else { _, err = js.VerifyChains(authority) if err != nil { return nil, err } } statement.signature = js return &statement, nil }
// VerifyChains verifies the signature of the signed manifest against the // certificate pool returning the list of verified chains. Signatures without // an x509 chain are not checked. func VerifyChains(sm *SignedManifest, ca *x509.CertPool) ([][]*x509.Certificate, error) { js, err := libtrust.ParsePrettySignature(sm.Raw, "signatures") if err != nil { return nil, err } return js.VerifyChains(ca) }
// Verify verifies the signature of the signed manifest returning the public // keys used during signing. func Verify(sm *SignedManifest) ([]libtrust.PublicKey, error) { js, err := libtrust.ParsePrettySignature(sm.Raw, "signatures") if err != nil { logrus.WithField("err", err).Debugf("(*SignedManifest).Verify") return nil, err } return js.Verify() }
// Signatures returns the signatures as provided by // (*libtrust.JSONSignature).Signatures. The byte slices are opaque jws // signatures. func (sm *SignedManifest) Signatures() ([][]byte, error) { jsig, err := libtrust.ParsePrettySignature(sm.Raw, "signatures") if err != nil { return nil, err } // Resolve the payload in the manifest. return jsig.Signatures() }