@@ -490,69 +490,62 @@ private ASN1Encodable parseIssuerAltName(final ThreadContext context, final Stri
490
490
491
491
private static final String DNS_ = "DNS:" ;
492
492
private static final String DNS_Name_ = "DNS Name:" ;
493
+ private static final String IP_ = "IP:" ;
494
+ private static final String IP_Address_ = "IP Address:" ;
493
495
private static final String URI_ = "URI:" ;
494
496
private static final String RID_ = "RID:" ;
495
497
private static final String email_ = "email:" ;
496
498
private static final String dirName_ = "dirName:" ;
497
499
private static final String otherName_ = "otherName:" ;
498
500
499
- private static ASN1Encodable parseSubjectAltName (final String valuex ) throws IOException {
501
+ private static GeneralNames parseSubjectAltName (final String valuex ) throws IOException {
502
+ final String [] vals = valuex .split ("(?<!\\ \\ )," ); // allow one level of escaping of ','
503
+ final GeneralName [] names = new GeneralName [vals .length ];
504
+ for ( int i = 0 ; i < vals .length ; i ++ ) {
505
+ names [i ] = parseGeneralName (vals [i ].replace ("\\ ," , "," ).trim ());
506
+ }
507
+ return new GeneralNames (names );
508
+ }
509
+
510
+ private static GeneralName parseGeneralName (final String valuex ) throws IOException {
500
511
if ( valuex .startsWith (DNS_ ) ) {
501
- final String [] vals = valuex .split ("," );
502
- final GeneralName [] names = new GeneralName [vals .length ];
503
- for ( int i = 0 ; i < vals .length ; i ++ ) {
504
- final String dns = vals [i ].substring (DNS_ .length ());
505
- names [i ] = new GeneralName (GeneralName .dNSName , dns );
506
- }
507
- return new GeneralNames (names );
512
+ final String dns = valuex .substring (DNS_ .length ()).trim ();
513
+ return new GeneralName (GeneralName .dNSName , dns );
508
514
}
509
515
if ( valuex .startsWith (DNS_Name_ ) ) {
510
- final String dns = valuex .substring (DNS_Name_ .length ());
516
+ final String dns = valuex .substring (DNS_Name_ .length ()). trim () ;
511
517
return new GeneralName (GeneralName .dNSName , dns );
512
518
}
513
519
if ( valuex .startsWith (URI_ ) ) {
514
- final String uri = valuex .substring (URI_ .length ());
520
+ final String uri = valuex .substring (URI_ .length ()). trim () ;
515
521
return new GeneralName (GeneralName .uniformResourceIdentifier , uri );
516
522
}
517
523
if ( valuex .startsWith (RID_ ) ) {
518
- final String rid = valuex .substring (RID_ .length ());
524
+ final String rid = valuex .substring (RID_ .length ()). trim () ;
519
525
return new GeneralName (GeneralName .registeredID , rid );
520
526
}
521
527
if ( valuex .startsWith (email_ ) ) {
522
- final String [] vals = valuex .split ("," );
523
- final GeneralName [] names = new GeneralName [vals .length ];
524
- for ( int i = 0 ; i < vals .length ; i ++ ) {
525
- if (vals [i ].startsWith (email_ )) {
526
- String mail = vals [i ].substring (email_ .length ());
527
- names [i ] = new GeneralName (GeneralName .rfc822Name , mail );
528
- }
529
- else {
530
- ASN1Encodable name = parseSubjectAltName (vals [i ]);
531
- names [i ] = name instanceof GeneralNames ? ((GeneralNames ) name ).getNames ()[0 ] : (GeneralName ) name ;
532
- }
533
- }
534
- return new GeneralNames (names );
535
- }
536
- if ( valuex .startsWith ("IP:" ) || valuex .startsWith ("IP Address:" ) ) {
537
- final int idx = valuex .charAt (2 ) == ':' ? 3 : 11 ;
538
- String [] vals = valuex .substring (idx ).split ("\\ .|::" );
539
- final byte [] ip = new byte [vals .length ];
540
- for ( int i = 0 ; i < vals .length ; i ++ ) {
541
- ip [i ] = (byte ) (Integer .parseInt (vals [i ]) & 0xff );
542
- }
543
- return new GeneralName (GeneralName .iPAddress , new DEROctetString (ip ));
528
+ String mail = valuex .substring (email_ .length ()).trim ();
529
+ return new GeneralName (GeneralName .rfc822Name , mail );
530
+ }
531
+ if ( valuex .startsWith (IP_ ) ) {
532
+ final String ip = valuex .substring (IP_ .length ()).trim ();
533
+ return new GeneralName (GeneralName .iPAddress , ip );
534
+ }
535
+ if ( valuex .startsWith (IP_Address_ ) ) {
536
+ final String ip = valuex .substring (IP_Address_ .length ()).trim ();
537
+ return new GeneralName (GeneralName .iPAddress , ip );
544
538
}
545
539
if ( valuex .startsWith ("other" ) ) { // otherName || othername
546
- final String other = valuex .substring (otherName_ .length ());
540
+ final String other = valuex .substring (otherName_ .length ()). trim () ;
547
541
return new GeneralName (GeneralName .otherName , other );
548
542
}
549
543
if ( valuex .startsWith ("dir" ) ) { // dirName || dirname
550
- final String dir = valuex .substring (dirName_ .length ());
544
+ final String dir = valuex .substring (dirName_ .length ()). trim () ;
551
545
return new GeneralName (GeneralName .directoryName , dir );
552
546
}
553
547
554
- throw new IOException ("could not parse SubjectAltName: " + valuex );
555
-
548
+ throw new IOException ("could not parse SubjectAltName part: " + valuex );
556
549
}
557
550
558
551
private DEROctetString parseSubjectKeyIdentifier (final ThreadContext context , final String oid , final String valuex ) {
0 commit comments