6eaae99668
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.
112 lines
3.6 KiB
Go
112 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
|
|
|
|
}
|