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