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