Full saving of CertStream data

This work saves the entires CertStream into JSON.
This commit is contained in:
Christopher Talib 2020-01-15 16:07:11 +01:00
parent 9bcc784ffd
commit 1081e0c728
2 changed files with 121 additions and 50 deletions

View file

@ -17,15 +17,6 @@ func main() {
for {
select {
case jq := <-stream:
messageType, err := jq.String("message_type")
if err != nil {
log.Fatal("Error decoding jq string")
}
log.Info("Message type -> ", messageType)
log.Info("recv: ", jq)
if data, err := utils.ExtractCertFromStream(jq); err == nil {
models.SaveData("test", *data)
}

View file

@ -1,6 +1,8 @@
package utils
import (
"strconv"
"github.com/jmoiron/jsonq"
"github.com/sirupsen/logrus"
"gitlab.dcso.lolcat/LABS/styx/models"
@ -11,6 +13,123 @@ import (
// 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, err := extractLeafCertStruct(input)
if err != nil {
logrus.Error(err)
}
// 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")
chain, err := input.ArrayOfObjects("data", "chain")
chainSlice := []*models.LeafCertStruct{}
for i := 0; i < len(chain); i++ {
c, err := extractLeafCertChainStruct(input, strconv.Itoa(i))
if err != nil {
panic(err)
}
chainSlice = append(chainSlice, &c)
}
csd := models.CertStreamData{
UpdateType: updateType,
LeafCert: &leafCertStruct,
Chain: chainSlice,
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
}
func extractLeafCertChainStruct(input jsonq.JsonQuery, index string) (models.LeafCertStruct, error) {
// LeafCertStruct > Subject
aggregated, err := input.String("data", "chain", index, "subject", "aggregated")
if err != nil {
panic(err)
}
c, err := input.String("data", "chain", index, "subject", "C")
st, err := input.String("data", "chain", index, "subject", "ST")
l, err := input.String("data", "chain", index, "subject", "L")
o, err := input.String("data", "chain", index, "subject", "O")
ou, err := input.String("data", "chain", index, "subject", "OU")
cn, err := input.String("data", "chain", index, "subject", "CN")
subject := models.LeafCertSubject{
Aggregated: aggregated,
C: c,
ST: st,
L: l,
O: o,
OU: ou,
CN: cn,
}
// LeafCertStruct > Extensions
keyUsage, err := input.String("data", "chain", index, "extensions", "keyUsage")
extendedKeyUsage, err := input.String("data", "chain", index, "extensions", "extendedKeyUsage")
basicConstrains, err := input.String("data", "chain", index, "extensions", "basicConstrains")
subjectKeyIdentifier, err := input.String("data", "chain", index, "extensions", "subjectKeyIdentifier")
authorityInfoAccess, err := input.String("data", "chain", index, "extensions", "authorityInfoAccess")
subjectAltName, err := input.String("data", "chain", index, "extensions", "subjectAltName")
certificatePolicies, err := input.String("data", "chain", index, "extensions", "certificatePolicies")
extensions := models.LeafCertExtensions{
KeyUsage: keyUsage,
ExtendedKeyUsage: extendedKeyUsage,
BasicConstrains: basicConstrains,
SubjectKeyIdentifier: subjectKeyIdentifier,
AuthorityInfoAccess: authorityInfoAccess,
SubjectAltName: subjectAltName,
CertificatePolicies: certificatePolicies,
}
notBefore, err := input.String("data", "chain", "not_before")
notAfter, err := input.String("data", "chain", "not_after")
serialNumber, err := input.String("data", "chain", "serialNumber")
fingerprint, err := input.String("data", "chain", "fingerprint")
asDer, err := input.String("data", "chain", "as_der")
allDomains, err := input.ArrayOfStrings("data", "chain", "all_domains")
return models.LeafCertStruct{
Subject: &subject,
Extensions: &extensions,
NotBefore: notBefore,
NotAfter: notAfter,
SerialNumber: serialNumber,
Fingerprint: fingerprint,
AsDer: asDer,
AllDomains: allDomains,
}, nil
}
func extractLeafCertStruct(input jsonq.JsonQuery) (models.LeafCertStruct, error) {
// LeafCertStruct > Subject
aggregated, err := input.String("data", "leaf_cert", "subject", "aggregated")
c, err := input.String("data", "leaf_cert", "subject", "C")
@ -59,7 +178,7 @@ func ExtractCertFromStream(input jsonq.JsonQuery) (*models.CertStreamStruct, err
asDer, err := input.String("data", "leaf_cert", "as_der")
allDomains, err := input.ArrayOfStrings("data", "leaf_cert", "all_domains")
leafCertStruct := models.LeafCertStruct{
return models.LeafCertStruct{
Subject: &subject,
Extensions: &extensions,
NotBefore: notBefore,
@ -68,45 +187,6 @@ func ExtractCertFromStream(input jsonq.JsonQuery) (*models.CertStreamStruct, err
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
}, nil
}