func Extract()

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
}