submitct: reorganize code
This commit is contained in:
parent
b94d850dbe
commit
732a660767
|
@ -29,69 +29,6 @@ import (
|
||||||
|
|
||||||
var verbose = flag.Bool("v", false, "Enable verbose output")
|
var verbose = flag.Bool("v", false, "Enable verbose output")
|
||||||
|
|
||||||
type CertificateBunch struct {
|
|
||||||
byFingerprint map[[32]byte]*Certificate
|
|
||||||
bySubject map[[32]byte]*Certificate
|
|
||||||
}
|
|
||||||
|
|
||||||
func MakeCertificateBunch() CertificateBunch {
|
|
||||||
return CertificateBunch{
|
|
||||||
byFingerprint: make(map[[32]byte]*Certificate),
|
|
||||||
bySubject: make(map[[32]byte]*Certificate),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (certs *CertificateBunch) Add(cert *Certificate) {
|
|
||||||
certs.byFingerprint[cert.Fingerprint()] = cert
|
|
||||||
certs.bySubject[sha256.Sum256(cert.Subject)] = cert
|
|
||||||
}
|
|
||||||
|
|
||||||
func (certs *CertificateBunch) FindBySubject(subject []byte) *Certificate {
|
|
||||||
return certs.bySubject[sha256.Sum256(subject)]
|
|
||||||
}
|
|
||||||
|
|
||||||
type Chain []*Certificate
|
|
||||||
|
|
||||||
func (c Chain) GetRawCerts() [][]byte {
|
|
||||||
rawCerts := make([][]byte, len(c))
|
|
||||||
for i := range c {
|
|
||||||
rawCerts[i] = c[i].Raw
|
|
||||||
}
|
|
||||||
return rawCerts
|
|
||||||
}
|
|
||||||
|
|
||||||
type Log struct {
|
|
||||||
info certspotter.LogInfo
|
|
||||||
verify *ct.SignatureVerifier
|
|
||||||
client *client.LogClient
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ctlog *Log) SubmitChain(chain Chain) (*ct.SignedCertificateTimestamp, error) {
|
|
||||||
rawCerts := chain.GetRawCerts()
|
|
||||||
sct, err := ctlog.client.AddChain(rawCerts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
entry := ct.LogEntry{
|
|
||||||
Leaf: ct.MerkleTreeLeaf{
|
|
||||||
Version: 0,
|
|
||||||
LeafType: ct.TimestampedEntryLeafType,
|
|
||||||
TimestampedEntry: ct.TimestampedEntry{
|
|
||||||
Timestamp: sct.Timestamp,
|
|
||||||
EntryType: ct.X509LogEntryType,
|
|
||||||
X509Entry: rawCerts[0],
|
|
||||||
Extensions: sct.Extensions,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := ctlog.verify.VerifySCTSignature(*sct, entry); err != nil {
|
|
||||||
return nil, fmt.Errorf("Bad SCT signature: %s", err)
|
|
||||||
}
|
|
||||||
return sct, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Certificate struct {
|
type Certificate struct {
|
||||||
Subject []byte
|
Subject []byte
|
||||||
Issuer []byte
|
Issuer []byte
|
||||||
|
@ -132,6 +69,69 @@ func parseCertificate(data []byte) (*Certificate, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Chain []*Certificate
|
||||||
|
|
||||||
|
func (c Chain) GetRawCerts() [][]byte {
|
||||||
|
rawCerts := make([][]byte, len(c))
|
||||||
|
for i := range c {
|
||||||
|
rawCerts[i] = c[i].Raw
|
||||||
|
}
|
||||||
|
return rawCerts
|
||||||
|
}
|
||||||
|
|
||||||
|
type CertificateBunch struct {
|
||||||
|
byFingerprint map[[32]byte]*Certificate
|
||||||
|
bySubject map[[32]byte]*Certificate
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeCertificateBunch() CertificateBunch {
|
||||||
|
return CertificateBunch{
|
||||||
|
byFingerprint: make(map[[32]byte]*Certificate),
|
||||||
|
bySubject: make(map[[32]byte]*Certificate),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (certs *CertificateBunch) Add(cert *Certificate) {
|
||||||
|
certs.byFingerprint[cert.Fingerprint()] = cert
|
||||||
|
certs.bySubject[sha256.Sum256(cert.Subject)] = cert
|
||||||
|
}
|
||||||
|
|
||||||
|
func (certs *CertificateBunch) FindBySubject(subject []byte) *Certificate {
|
||||||
|
return certs.bySubject[sha256.Sum256(subject)]
|
||||||
|
}
|
||||||
|
|
||||||
|
type Log struct {
|
||||||
|
info certspotter.LogInfo
|
||||||
|
verify *ct.SignatureVerifier
|
||||||
|
client *client.LogClient
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctlog *Log) SubmitChain(chain Chain) (*ct.SignedCertificateTimestamp, error) {
|
||||||
|
rawCerts := chain.GetRawCerts()
|
||||||
|
sct, err := ctlog.client.AddChain(rawCerts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
entry := ct.LogEntry{
|
||||||
|
Leaf: ct.MerkleTreeLeaf{
|
||||||
|
Version: 0,
|
||||||
|
LeafType: ct.TimestampedEntryLeafType,
|
||||||
|
TimestampedEntry: ct.TimestampedEntry{
|
||||||
|
Timestamp: sct.Timestamp,
|
||||||
|
EntryType: ct.X509LogEntryType,
|
||||||
|
X509Entry: rawCerts[0],
|
||||||
|
Extensions: sct.Extensions,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ctlog.verify.VerifySCTSignature(*sct, entry); err != nil {
|
||||||
|
return nil, fmt.Errorf("Bad SCT signature: %s", err)
|
||||||
|
}
|
||||||
|
return sct, nil
|
||||||
|
}
|
||||||
|
|
||||||
func buildChain(cert *Certificate, certs *CertificateBunch) Chain {
|
func buildChain(cert *Certificate, certs *CertificateBunch) Chain {
|
||||||
chain := make([]*Certificate, 0)
|
chain := make([]*Certificate, 0)
|
||||||
for len(chain) < 16 && cert != nil && !bytes.Equal(cert.Subject, cert.Issuer) {
|
for len(chain) < 16 && cert != nil && !bytes.Equal(cert.Subject, cert.Issuer) {
|
||||||
|
|
Loading…
Reference in New Issue