func addChain(logClient *client.LogClient) { if *certChain == "" { log.Fatalf("No certificate chain file specified with -cert_chain") } rest, err := ioutil.ReadFile(*certChain) if err != nil { log.Fatalf("Failed to read certificate file: %v", err) } var chain []ct.ASN1Cert for { var block *pem.Block block, rest = pem.Decode(rest) if block == nil { break } if block.Type == "CERTIFICATE" { chain = append(chain, ct.ASN1Cert(block.Bytes)) } } sct, err := logClient.AddChain(chain) if err != nil { log.Fatal(err) } // Display the SCT when := ctTimestampToTime(sct.Timestamp) fmt.Printf("%v: Uploaded chain of %d certs to %v log at %v\n", when, len(chain), sct.SCTVersion, *logURI) fmt.Printf("%v\n", signatureToString(&sct.Signature)) }
func certSubmitterJob(ctx context.Context, addedCerts chan<- *preload.AddedCert, log_client *client.LogClient, certs <-chan *ct.LogEntry, wg *sync.WaitGroup) { for c := range certs { chain := make([]ct.ASN1Cert, len(c.Chain)+1) chain[0] = c.X509Cert.Raw copy(chain[1:], c.Chain) sct, err := log_client.AddChain(ctx, chain) if err != nil { log.Printf("failed to add chain with CN %s: %v\n", c.X509Cert.Subject.CommonName, err) recordFailure(addedCerts, chain[0], err) continue } recordSct(addedCerts, chain[0], sct) if !*quiet { log.Printf("Added chain for CN '%s', SCT: %s\n", c.X509Cert.Subject.CommonName, sct) } } wg.Done() }