@@ -1042,7 +1042,7 @@ func parsePublicKey(algo PublicKeyAlgorithm, keyData *publicKeyInfo) (interface{
1042
1042
}
1043
1043
}
1044
1044
1045
- func parseSANExtension ( value []byte ) ( dnsNames , emailAddresses [] string , ipAddresses []net. IP , err error ) {
1045
+ func forEachSAN ( extension []byte , callback func ( tag int , data []byte ) error ) error {
1046
1046
// RFC 5280, 4.2.1.6
1047
1047
1048
1048
// SubjectAltName ::= GeneralNames
@@ -1060,40 +1060,50 @@ func parseSANExtension(value []byte) (dnsNames, emailAddresses []string, ipAddre
1060
1060
// iPAddress [7] OCTET STRING,
1061
1061
// registeredID [8] OBJECT IDENTIFIER }
1062
1062
var seq asn1.RawValue
1063
- var rest [] byte
1064
- if rest , err = asn1 . Unmarshal ( value , & seq ); err != nil {
1065
- return
1063
+ rest , err := asn1 . Unmarshal ( extension , & seq )
1064
+ if err != nil {
1065
+ return err
1066
1066
} else if len (rest ) != 0 {
1067
- err = errors .New ("x509: trailing data after X.509 extension" )
1068
- return
1067
+ return errors .New ("x509: trailing data after X.509 extension" )
1069
1068
}
1070
1069
if ! seq .IsCompound || seq .Tag != 16 || seq .Class != 0 {
1071
- err = asn1.StructuralError {Msg : "bad SAN sequence" }
1072
- return
1070
+ return asn1.StructuralError {Msg : "bad SAN sequence" }
1073
1071
}
1074
1072
1075
1073
rest = seq .Bytes
1076
1074
for len (rest ) > 0 {
1077
1075
var v asn1.RawValue
1078
1076
rest , err = asn1 .Unmarshal (rest , & v )
1079
1077
if err != nil {
1080
- return
1078
+ return err
1079
+ }
1080
+
1081
+ if err := callback (v .Tag , v .Bytes ); err != nil {
1082
+ return err
1081
1083
}
1082
- switch v .Tag {
1084
+ }
1085
+
1086
+ return nil
1087
+ }
1088
+
1089
+ func parseSANExtension (value []byte ) (dnsNames , emailAddresses []string , ipAddresses []net.IP , err error ) {
1090
+ err = forEachSAN (value , func (tag int , data []byte ) error {
1091
+ switch tag {
1083
1092
case 1 :
1084
- emailAddresses = append (emailAddresses , string (v . Bytes ))
1093
+ emailAddresses = append (emailAddresses , string (data ))
1085
1094
case 2 :
1086
- dnsNames = append (dnsNames , string (v . Bytes ))
1095
+ dnsNames = append (dnsNames , string (data ))
1087
1096
case 7 :
1088
- switch len (v . Bytes ) {
1097
+ switch len (data ) {
1089
1098
case net .IPv4len , net .IPv6len :
1090
- ipAddresses = append (ipAddresses , v . Bytes )
1099
+ ipAddresses = append (ipAddresses , data )
1091
1100
default :
1092
- err = errors .New ("x509: certificate contained IP address of length " + strconv .Itoa (len (v .Bytes )))
1093
- return
1101
+ return errors .New ("x509: certificate contained IP address of length " + strconv .Itoa (len (data )))
1094
1102
}
1095
1103
}
1096
- }
1104
+
1105
+ return nil
1106
+ })
1097
1107
1098
1108
return
1099
1109
}
0 commit comments