@@ -504,27 +504,40 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
504
504
return false , errors .New ("x509: empty name constraints extension" )
505
505
}
506
506
507
- getValues := func (subtrees cryptobyte.String ) (dnsNames []string , ips []* net.IPNet , emails , uriDomains []string , err error ) {
507
+ getValues := func (subtrees cryptobyte.String ) (dirNames []pkix. RDNSequence , dnsNames []string , ips []* net.IPNet , emails , uriDomains []string , err error ) {
508
508
for ! subtrees .Empty () {
509
509
var seq , value cryptobyte.String
510
510
var tag cryptobyte_asn1.Tag
511
511
if ! subtrees .ReadASN1 (& seq , cryptobyte_asn1 .SEQUENCE ) ||
512
512
! seq .ReadAnyASN1 (& value , & tag ) {
513
- return nil , nil , nil , nil , fmt .Errorf ("x509: invalid NameConstraints extension" )
513
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: invalid NameConstraints extension" )
514
514
}
515
515
516
516
var (
517
- dnsTag = cryptobyte_asn1 .Tag (2 ).ContextSpecific ()
518
- emailTag = cryptobyte_asn1 .Tag (1 ).ContextSpecific ()
519
- ipTag = cryptobyte_asn1 .Tag (7 ).ContextSpecific ()
520
- uriTag = cryptobyte_asn1 .Tag (6 ).ContextSpecific ()
517
+ dirNameTag = cryptobyte_asn1 .Tag (4 ).ContextSpecific ().Constructed ()
518
+ dnsTag = cryptobyte_asn1 .Tag (2 ).ContextSpecific ()
519
+ emailTag = cryptobyte_asn1 .Tag (1 ).ContextSpecific ()
520
+ ipTag = cryptobyte_asn1 .Tag (7 ).ContextSpecific ()
521
+ uriTag = cryptobyte_asn1 .Tag (6 ).ContextSpecific ()
521
522
)
522
523
523
524
switch tag {
525
+ case dirNameTag :
526
+
527
+ var dirName pkix.RDNSequence
528
+
529
+ if rest , err := asn1 .Unmarshal (value , & dirName ); err != nil {
530
+ return nil , nil , nil , nil , nil , err
531
+ } else if len (rest ) != 0 {
532
+ return nil , nil , nil , nil , nil , errors .New ("x509: trailing data after dirname constraint" )
533
+ }
534
+
535
+ dirNames = append (dirNames , dirName )
536
+
524
537
case dnsTag :
525
538
domain := string (value )
526
539
if err := isIA5String (domain ); err != nil {
527
- return nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
540
+ return nil , nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
528
541
}
529
542
530
543
trimmedDomain := domain
@@ -536,7 +549,7 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
536
549
trimmedDomain = trimmedDomain [1 :]
537
550
}
538
551
if _ , ok := domainToReverseLabels (trimmedDomain ); ! ok {
539
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse dnsName constraint %q" , domain )
552
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse dnsName constraint %q" , domain )
540
553
}
541
554
dnsNames = append (dnsNames , domain )
542
555
@@ -554,26 +567,26 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
554
567
mask = value [16 :]
555
568
556
569
default :
557
- return nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained value of length %d" , l )
570
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained value of length %d" , l )
558
571
}
559
572
560
573
if ! isValidIPMask (mask ) {
561
- return nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained invalid mask %x" , mask )
574
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: IP constraint contained invalid mask %x" , mask )
562
575
}
563
576
564
577
ips = append (ips , & net.IPNet {IP : net .IP (ip ), Mask : net .IPMask (mask )})
565
578
566
579
case emailTag :
567
580
constraint := string (value )
568
581
if err := isIA5String (constraint ); err != nil {
569
- return nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
582
+ return nil , nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
570
583
}
571
584
572
585
// If the constraint contains an @ then
573
586
// it specifies an exact mailbox name.
574
587
if strings .Contains (constraint , "@" ) {
575
588
if _ , ok := parseRFC2821Mailbox (constraint ); ! ok {
576
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
589
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
577
590
}
578
591
} else {
579
592
// Otherwise it's a domain name.
@@ -582,19 +595,19 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
582
595
domain = domain [1 :]
583
596
}
584
597
if _ , ok := domainToReverseLabels (domain ); ! ok {
585
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
598
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse rfc822Name constraint %q" , constraint )
586
599
}
587
600
}
588
601
emails = append (emails , constraint )
589
602
590
603
case uriTag :
591
604
domain := string (value )
592
605
if err := isIA5String (domain ); err != nil {
593
- return nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
606
+ return nil , nil , nil , nil , nil , errors .New ("x509: invalid constraint value: " + err .Error ())
594
607
}
595
608
596
609
if net .ParseIP (domain ) != nil {
597
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q: cannot be IP address" , domain )
610
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q: cannot be IP address" , domain )
598
611
}
599
612
600
613
trimmedDomain := domain
@@ -606,7 +619,7 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
606
619
trimmedDomain = trimmedDomain [1 :]
607
620
}
608
621
if _ , ok := domainToReverseLabels (trimmedDomain ); ! ok {
609
- return nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q" , domain )
622
+ return nil , nil , nil , nil , nil , fmt .Errorf ("x509: failed to parse URI constraint %q" , domain )
610
623
}
611
624
uriDomains = append (uriDomains , domain )
612
625
@@ -615,13 +628,13 @@ func parseNameConstraintsExtension(out *Certificate, e pkix.Extension) (unhandle
615
628
}
616
629
}
617
630
618
- return dnsNames , ips , emails , uriDomains , nil
631
+ return dirNames , dnsNames , ips , emails , uriDomains , nil
619
632
}
620
633
621
- if out .PermittedDNSDomains , out .PermittedIPRanges , out .PermittedEmailAddresses , out .PermittedURIDomains , err = getValues (permitted ); err != nil {
634
+ if out .PermittedDirNames , out . PermittedDNSDomains , out .PermittedIPRanges , out .PermittedEmailAddresses , out .PermittedURIDomains , err = getValues (permitted ); err != nil {
622
635
return false , err
623
636
}
624
- if out .ExcludedDNSDomains , out .ExcludedIPRanges , out .ExcludedEmailAddresses , out .ExcludedURIDomains , err = getValues (excluded ); err != nil {
637
+ if out .ExcludedDirNames , out . ExcludedDNSDomains , out .ExcludedIPRanges , out .ExcludedEmailAddresses , out .ExcludedURIDomains , err = getValues (excluded ); err != nil {
625
638
return false , err
626
639
}
627
640
out .PermittedDNSDomainsCritical = e .Critical
0 commit comments