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 }