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