styx/utils/main.go
Christopher Talib 6eaae99668 Extracting structures from CertStream
This work builds an extractor for the data in the CertStream in order to
save it. It builds itself from the previous work, so extensions and
flags can be added to the structures. The work in `utils` is basically a
big extractor for the data taking advantage of the JSONq library.

Currently, there is not refactoring and the "chains" are not saved
because they need additionnal computation which will come in a later
commit.
2020-01-15 14:36:53 +01:00

113 lines
3.6 KiB
Go

package utils
import (
"github.com/jmoiron/jsonq"
"github.com/sirupsen/logrus"
"gitlab.dcso.lolcat/LABS/styx/models"
)
// ExtractCertFromStream builds the structures before saving them. It uses the
// power of jsonq to parse quickly the json stream.
// The base structure is coming from : https://github.com/CaliDog/certstream-go#example-data-structure
func ExtractCertFromStream(input jsonq.JsonQuery) (*models.CertStreamStruct, error) {
// LeafCertStruct
// LeafCertStruct > Subject
aggregated, err := input.String("data", "leaf_cert", "subject", "aggregated")
c, err := input.String("data", "leaf_cert", "subject", "C")
st, err := input.String("data", "leaf_cert", "subject", "ST")
l, err := input.String("data", "leaf_cert", "subject", "L")
o, err := input.String("data", "leaf_cert", "subject", "O")
ou, err := input.String("data", "leaf_cert", "subject", "OU")
cn, err := input.String("data", "leaf_cert", "subject", "CN")
if err != nil {
logrus.Error(err)
}
subject := models.LeafCertSubject{
Aggregated: aggregated,
C: c,
ST: st,
L: l,
O: o,
OU: ou,
CN: cn,
}
// LeafCertStruct > Extensions
keyUsage, err := input.String("data", "leaf_cert", "extensions", "keyUsage")
extendedKeyUsage, err := input.String("data", "leaf_cert", "extensions", "extendedKeyUsage")
basicConstrains, err := input.String("data", "leaf_cert", "extensions", "basicConstrains")
subjectKeyIdentifier, err := input.String("data", "leaf_cert", "extensions", "subjectKeyIdentifier")
authorityInfoAccess, err := input.String("data", "leaf_cert", "extensions", "authorityInfoAccess")
subjectAltName, err := input.String("data", "leaf_cert", "extensions", "subjectAltName")
certificatePolicies, err := input.String("data", "leaf_cert", "extensions", "certificatePolicies")
extensions := models.LeafCertExtensions{
KeyUsage: keyUsage,
ExtendedKeyUsage: extendedKeyUsage,
BasicConstrains: basicConstrains,
SubjectKeyIdentifier: subjectKeyIdentifier,
AuthorityInfoAccess: authorityInfoAccess,
SubjectAltName: subjectAltName,
CertificatePolicies: certificatePolicies,
}
notBefore, err := input.String("data", "leaf_cert", "not_before")
notAfter, err := input.String("data", "leaf_cert", "not_after")
serialNumber, err := input.String("data", "leaf_cert", "serialNumber")
fingerprint, err := input.String("data", "leaf_cert", "fingerprint")
asDer, err := input.String("data", "leaf_cert", "as_der")
allDomains, err := input.ArrayOfStrings("data", "leaf_cert", "all_domains")
leafCertStruct := models.LeafCertStruct{
Subject: &subject,
Extensions: &extensions,
NotBefore: notBefore,
NotAfter: notAfter,
SerialNumber: serialNumber,
Fingerprint: fingerprint,
AsDer: asDer,
AllDomains: allDomains,
}
// CertStreamData > Source
url, err := input.String("data", "source", "url")
name, err := input.String("data", "source", "name")
if err != nil {
logrus.Error(err)
}
source := models.Source{
URL: url,
Name: name,
}
// CertStreamData
updateType, err := input.String("data", "update_type")
certIndex, err := input.Int("data", "cert_index")
seen, err := input.Int("data", "seen")
csd := models.CertStreamData{
UpdateType: updateType,
LeafCert: &leafCertStruct,
// chain
CertIndex: certIndex,
Seen: seen,
Source: &source,
}
// CertStreamStruct
messageType, err := input.String("message_type")
if err != nil {
logrus.Error(err)
}
res := models.CertStreamStruct{
MessageType: messageType,
Data: &csd,
}
return &res, nil
}