@@ -748,6 +748,8 @@ type Certificate struct {
748
748
749
749
// Name constraints
750
750
PermittedDNSDomainsCritical bool // if true then the name constraints are marked critical.
751
+ PermittedDirNames []* pkix.RDNSequence
752
+ ExcludedDirNames []* pkix.RDNSequence
751
753
PermittedDNSDomains []string
752
754
ExcludedDNSDomains []string
753
755
PermittedIPRanges []* net.IPNet
@@ -1211,27 +1213,28 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
1211
1213
return false , errors .New ("x509: empty name constraints extension" )
1212
1214
}
1213
1215
1214
- getValues := func (subtrees cryptobyte.String ) (dnsNames []string , ips []* net.IPNet , emails , uriDomains []string , err error ) {
1216
+ getValues := func (subtrees cryptobyte.String ) (dirNames [] * pkix. RDNSequence , dnsNames []string , ips []* net.IPNet , emails , uriDomains []string , err error ) {
1215
1217
for ! subtrees .Empty () {
1216
1218
var seq , value cryptobyte.String
1217
1219
var tag cryptobyte_asn1.Tag
1218
1220
if ! subtrees .ReadASN1 (& seq , cryptobyte_asn1 .SEQUENCE ) ||
1219
1221
! seq .ReadAnyASN1 (& value , & tag ) {
1220
- return nil , nil , nil , nil , fmt .Errorf ("x509: invalid NameConstraints extension" )
1222
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: invalid NameConstraints extension" )
1221
1223
}
1222
1224
1223
1225
var (
1224
- dnsTag = cryptobyte_asn1 .Tag (2 ).ContextSpecific ()
1225
- emailTag = cryptobyte_asn1 .Tag (1 ).ContextSpecific ()
1226
- ipTag = cryptobyte_asn1 .Tag (7 ).ContextSpecific ()
1227
- uriTag = cryptobyte_asn1 .Tag (6 ).ContextSpecific ()
1226
+ dirNameTag = cryptobyte_asn1 .Tag (4 ).ContextSpecific ().Constructed ()
1227
+ dnsTag = cryptobyte_asn1 .Tag (2 ).ContextSpecific ()
1228
+ emailTag = cryptobyte_asn1 .Tag (1 ).ContextSpecific ()
1229
+ ipTag = cryptobyte_asn1 .Tag (7 ).ContextSpecific ()
1230
+ uriTag = cryptobyte_asn1 .Tag (6 ).ContextSpecific ()
1228
1231
)
1229
1232
1230
1233
switch tag {
1231
1234
case dnsTag :
1232
1235
domain := string (value )
1233
1236
if err := isIA5String (domain ); err != nil {
1234
- return nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
1237
+ return nil , nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
1235
1238
}
1236
1239
1237
1240
trimmedDomain := domain
@@ -1243,10 +1246,22 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
1243
1246
trimmedDomain = trimmedDomain [1 :]
1244
1247
}
1245
1248
if _ , ok := domainToReverseLabels (trimmedDomain ); ! ok {
1246
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse dnsName constraint %q" , domain )
1249
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse dnsName constraint %q" , domain )
1247
1250
}
1248
1251
dnsNames = append (dnsNames , domain )
1249
1252
1253
+ case dirNameTag :
1254
+
1255
+ var dirName pkix.RDNSequence
1256
+
1257
+ if rest , err := asn1 .Unmarshal (value , & dirName ); err != nil {
1258
+ return nil , nil , nil , nil , nil , err
1259
+ } else if len (rest ) != 0 {
1260
+ return nil , nil , nil , nil , nil , errors .New ("x509: trailing data after dirname constraint" )
1261
+ }
1262
+
1263
+ dirNames = append (dirNames , & dirName )
1264
+
1250
1265
case ipTag :
1251
1266
l := len (value )
1252
1267
var ip , mask []byte
@@ -1261,26 +1276,26 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
1261
1276
mask = value [16 :]
1262
1277
1263
1278
default :
1264
- return nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained value of length %d" , l )
1279
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained value of length %d" , l )
1265
1280
}
1266
1281
1267
1282
if ! isValidIPMask (mask ) {
1268
- return nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained invalid mask %x" , mask )
1283
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained invalid mask %x" , mask )
1269
1284
}
1270
1285
1271
1286
ips = append (ips , & net.IPNet {IP : net .IP (ip ), Mask : net .IPMask (mask )})
1272
1287
1273
1288
case emailTag :
1274
1289
constraint := string (value )
1275
1290
if err := isIA5String (constraint ); err != nil {
1276
- return nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
1291
+ return nil , nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
1277
1292
}
1278
1293
1279
1294
// If the constraint contains an @ then
1280
1295
// it specifies an exact mailbox name.
1281
1296
if strings .Contains (constraint , "@" ) {
1282
1297
if _ , ok := parseRFC2821Mailbox (constraint ); ! ok {
1283
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
1298
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
1284
1299
}
1285
1300
} else {
1286
1301
// Otherwise it's a domain name.
@@ -1289,19 +1304,19 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
1289
1304
domain = domain [1 :]
1290
1305
}
1291
1306
if _ , ok := domainToReverseLabels (domain ); ! ok {
1292
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
1307
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
1293
1308
}
1294
1309
}
1295
1310
emails = append (emails , constraint )
1296
1311
1297
1312
case uriTag :
1298
1313
domain := string (value )
1299
1314
if err := isIA5String (domain ); err != nil {
1300
- return nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
1315
+ return nil , nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
1301
1316
}
1302
1317
1303
1318
if net .ParseIP (domain ) != nil {
1304
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q: cannot be IP address" , domain )
1319
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q: cannot be IP address" , domain )
1305
1320
}
1306
1321
1307
1322
trimmedDomain := domain
@@ -1313,7 +1328,7 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
1313
1328
trimmedDomain = trimmedDomain [1 :]
1314
1329
}
1315
1330
if _ , ok := domainToReverseLabels (trimmedDomain ); ! ok {
1316
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q" , domain )
1331
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q" , domain )
1317
1332
}
1318
1333
uriDomains = append (uriDomains , domain )
1319
1334
@@ -1322,13 +1337,13 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
1322
1337
}
1323
1338
}
1324
1339
1325
- return dnsNames , ips , emails , uriDomains , nil
1340
+ return dirNames , dnsNames , ips , emails , uriDomains , nil
1326
1341
}
1327
1342
1328
- if out .PermittedDNSDomains , out .PermittedIPRanges , out .PermittedEmailAddresses , out .PermittedURIDomains , err = getValues (permitted ); err != nil {
1343
+ if out .PermittedDirNames , out . PermittedDNSDomains , out .PermittedIPRanges , out .PermittedEmailAddresses , out .PermittedURIDomains , err = getValues (permitted ); err != nil {
1329
1344
return false , err
1330
1345
}
1331
- if out .ExcludedDNSDomains , out .ExcludedIPRanges , out .ExcludedEmailAddresses , out .ExcludedURIDomains , err = getValues (excluded ); err != nil {
1346
+ if out .ExcludedDirNames , out . ExcludedDNSDomains , out .ExcludedIPRanges , out .ExcludedEmailAddresses , out .ExcludedURIDomains , err = getValues (excluded ); err != nil {
1332
1347
return false , err
1333
1348
}
1334
1349
out .PermittedDNSDomainsCritical = e .Critical
0 commit comments