Developer, I wrote some code in Go to parse the IDP extension information in a CRL, but I'm encountering an error while parsing the DistributionPoint. I've tried multiple times, but I can't get it to work. Can you help me figure out what is wrong with this code? package main
import ( "crypto/x509" "crypto/x509/pkix" "encoding/asn1" "flag" "fmt" "os" ) type IssuingDistributionPoint struct { DistributionPoint asn1.RawValue `asn1:"optional,tag:0,explicit"` OnlyContainsUserCerts bool `asn1:"optional,tag:1"` OnlyContainsCACerts bool `asn1:"optional,tag:2"` OnlySomeReasons asn1.BitString `asn1:"optional,tag:3"` IndirectCRL bool `asn1:"optional,tag:4"` OnlyContainsAttributeCerts bool `asn1:"optional,tag:5"` } type GeneralNames []asn1.RawValue func main() { // 1. Command line flag processing crlFilePath := flag.String("crl", "", "CRL file path") flag.Parse() if *crlFilePath == "" { fmt.Println("CRL file path is required") os.Exit(1) } // 2. File reading derBytes, err := os.ReadFile(*crlFilePath) if err != nil { fmt.Printf("Unable to read file: %v\n", err) os.Exit(1) } // 3. CRL parsing crl, err := x509.ParseRevocationList(derBytes) if err != nil { fmt.Printf("CRL parsing failed: %v\n", err) os.Exit(1) } oidIssuingDistributionPoint := asn1.ObjectIdentifier{2, 5, 29, 28} // 4. Process extensions of the CRL for _, ext := range crl.Extensions { if ext.Id.Equal(oidIssuingDistributionPoint) { var idp IssuingDistributionPoint if _, err := asn1.Unmarshal(ext.Value, &idp); err != nil { fmt.Printf("Unable to decode IDP extension: %v\n", err) continue } // 5. Print IDP flags fmt.Printf("IDP Extension Flags:\n") fmt.Printf(" OnlyContainsUserCerts: %t\n", idp.OnlyContainsUserCerts) fmt.Printf(" OnlyContainsCACerts: %t\n", idp.OnlyContainsCACerts) fmt.Printf(" IndirectCRL: %t\n", idp.IndirectCRL) // 6. if len(idp.DistributionPoint.Bytes) > 0 { // Unpack outer explicit tag var explicitTag struct { Raw asn1.RawContent `asn1:"tag:0,explicit"` } if _, err := asn1.Unmarshal(idp.DistributionPoint.Bytes, &explicitTag); err != nil { fmt.Printf("Failed to unpack explicit tag: %v\n", err) continue } // Parse GeneralNames var generalNames GeneralNames if _, err := asn1.Unmarshal(explicitTag.Raw, &generalNames); err != nil { fmt.Printf("Unable to parse GeneralNames: %v\n", err) continue } // 7. Process URI and DirectoryName for _, rawGN := range generalNames { switch rawGN.Tag { case 6: // URI var uri string if _, err := asn1.Unmarshal(rawGN.Bytes, &uri); err != nil { fmt.Printf("Failed to parse URI: %v\n", err) continue } fmt.Printf(" URI: %s\n", uri) case 4: // DirectoryName var rdnSeq pkix.RDNSequence if _, err := asn1.Unmarshal(rawGN.Bytes, &rdnSeq); err != nil { fmt.Printf("Failed to parse DirectoryName: %v\n", err) continue } var name pkix.Name name.FillFromRDNSequence(&rdnSeq) fmt.Printf(" DirectoryName: %s\n", name.String()) } } } } } } -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/1f5b7071-ac04-41a5-847c-09a860785627n%40googlegroups.com.
crl_IDP_Normal.der
Description: application/x509-ca-cert