// Processes the given |entry| in the specified log. func (s *Scanner) processEntry(entry ct.LogEntry, foundCert func(*ct.LogEntry), foundPrecert func(*ct.LogEntry)) { atomic.AddInt64(&s.certsProcessed, 1) switch entry.Leaf.TimestampedEntry.EntryType { case ct.X509LogEntryType: if s.opts.PrecertOnly { // Only interested in precerts and this is an X.509 cert, early-out. return } cert, err := x509.ParseCertificate(entry.Leaf.TimestampedEntry.X509Entry) if err = s.handleParseEntryError(err, entry.Leaf.TimestampedEntry.EntryType, entry.Index); err != nil { // We hit an unparseable entry, already logged inside handleParseEntryError() return } if s.opts.Matcher.CertificateMatches(cert) { entry.X509Cert = cert foundCert(&entry) } case ct.PrecertLogEntryType: c, err := x509.ParseTBSCertificate(entry.Leaf.TimestampedEntry.PrecertEntry.TBSCertificate) if err = s.handleParseEntryError(err, entry.Leaf.TimestampedEntry.EntryType, entry.Index); err != nil { // We hit an unparseable entry, already logged inside handleParseEntryError() return } precert := &ct.Precertificate{ Raw: entry.Chain[0], TBSCertificate: *c, IssuerKeyHash: entry.Leaf.TimestampedEntry.PrecertEntry.IssuerKeyHash} if s.opts.Matcher.PrecertificateMatches(precert) { entry.Precert = precert foundPrecert(&entry) } s.precertsSeen++ } }
// X509Certificate returns the X.509 Certificate contained within the // MerkleTreeLeaf. // Returns a pointer to an x509.Certificate or a non-nil error. func (m *MerkleTreeLeaf) X509Certificate() (*x509.Certificate, error) { return x509.ParseCertificate(m.TimestampedEntry.X509Entry) }