in certdataDiffCCADB/certdata/certdata.go [117:185]
func Extract(b *bufio.Reader, start int, distrust bool, fname string) (*utils.Entry, int, error) {
issuerFound := false
serialFound := false
pemFound := false
webTrustFound := false
emailTrustFound := false
lineNum := 0
var issuer pkix.RDNSequence
var serialNum string
var pem string
var hash string
var webTrust bool
var emailTrust bool
for l, err := b.ReadString('\n'); err == nil; l, err = b.ReadString('\n') {
lineNum++
// Putting this break guard here instead of the loop signature makes it easier to count lines.
// Distrust objects lack a PEM. Hence (pemFound || distrust).
if issuerFound && serialFound && webTrustFound && emailTrustFound && (pemFound || distrust) {
break
}
switch true {
case strings.HasPrefix(l, IssuerPrefix):
oct, lcount := ExtractMultilineOctal(b)
lineNum += lcount
issuerFound = true
if issuer, err = DecodeIssuer(oct); err != nil {
return nil, lineNum, err
}
case strings.HasPrefix(l, SerialNumberPrefix):
oct, lcount := ExtractMultilineOctal(b)
lineNum += lcount
serialFound = true
if serialNum, err = DecodeSerialNumber(oct); err != nil {
return nil, lineNum, err
}
case strings.HasPrefix(l, SerialNumberPrefix):
oct, lcount := ExtractMultilineOctal(b)
lineNum += lcount
serialFound = true
if serialNum, err = DecodeSerialNumber(oct); err != nil {
return nil, lineNum, err
}
case !distrust && strings.HasPrefix(l, PEMPrefix):
oct, lcount := ExtractMultilineOctal(b)
lineNum += lcount
pemFound = true
if pem, hash, err = DecodeDER(oct); err != nil {
return nil, lineNum, err
}
case strings.HasPrefix(l, WebTrust):
webTrust = true
webTrustFound = true
case distrustWebRegex.MatchString(l):
webTrust = false
webTrustFound = true
case strings.HasPrefix(l, EmailTrust):
emailTrust = true
emailTrustFound = true
case distrustEmailRegex.MatchString(l):
emailTrust = false
emailTrustFound = true
}
}
if !(issuerFound && serialFound && webTrustFound && emailTrustFound && (pemFound || distrust)) {
return nil, lineNum, errors.New("unexpected EOF")
}
e := NewEntry(issuer, serialNum, pem, hash, webTrust, emailTrust, start, fname)
return e, lineNum, nil
}