@@ -490,69 +490,62 @@ private ASN1Encodable parseIssuerAltName(final ThreadContext context, final Stri
490490
491491 private static final String DNS_ = "DNS:" ;
492492 private static final String DNS_Name_ = "DNS Name:" ;
493+ private static final String IP_ = "IP:" ;
494+ private static final String IP_Address_ = "IP Address:" ;
493495 private static final String URI_ = "URI:" ;
494496 private static final String RID_ = "RID:" ;
495497 private static final String email_ = "email:" ;
496498 private static final String dirName_ = "dirName:" ;
497499 private static final String otherName_ = "otherName:" ;
498500
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 up to three levels 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 ].replaceAll ("\\ \\ ([,\\ \\ ])" , "$1" ).trim ());
506+ }
507+ return new GeneralNames (names );
508+ }
509+
510+ private static GeneralName parseGeneralName (final String valuex ) throws IOException {
500511 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 );
508514 }
509515 if ( valuex .startsWith (DNS_Name_ ) ) {
510- final String dns = valuex .substring (DNS_Name_ .length ());
516+ final String dns = valuex .substring (DNS_Name_ .length ()). trim () ;
511517 return new GeneralName (GeneralName .dNSName , dns );
512518 }
513519 if ( valuex .startsWith (URI_ ) ) {
514- final String uri = valuex .substring (URI_ .length ());
520+ final String uri = valuex .substring (URI_ .length ()). trim () ;
515521 return new GeneralName (GeneralName .uniformResourceIdentifier , uri );
516522 }
517523 if ( valuex .startsWith (RID_ ) ) {
518- final String rid = valuex .substring (RID_ .length ());
524+ final String rid = valuex .substring (RID_ .length ()). trim () ;
519525 return new GeneralName (GeneralName .registeredID , rid );
520526 }
521527 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 );
544538 }
545539 if ( valuex .startsWith ("other" ) ) { // otherName || othername
546- final String other = valuex .substring (otherName_ .length ());
540+ final String other = valuex .substring (otherName_ .length ()). trim () ;
547541 return new GeneralName (GeneralName .otherName , other );
548542 }
549543 if ( valuex .startsWith ("dir" ) ) { // dirName || dirname
550- final String dir = valuex .substring (dirName_ .length ());
544+ final String dir = valuex .substring (dirName_ .length ()). trim () ;
551545 return new GeneralName (GeneralName .directoryName , dir );
552546 }
553547
554- throw new IOException ("could not parse SubjectAltName: " + valuex );
555-
548+ throw new IOException ("could not parse SubjectAltName part: " + valuex );
556549 }
557550
558551 private DEROctetString parseSubjectKeyIdentifier (final ThreadContext context , final String oid , final String valuex ) {
0 commit comments