Home | History | Annotate | Download | only in x500
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 /**
     19  * @author Alexander V. Esin
     20  */
     21 
     22 package javax.security.auth.x500;
     23 
     24 import java.io.ByteArrayInputStream;
     25 import java.io.InputStream;
     26 import java.util.ArrayList;
     27 import java.util.Arrays;
     28 import java.util.Locale;
     29 
     30 import junit.framework.TestCase;
     31 import tests.support.resource.Support_Resources;
     32 
     33 /**
     34  * Tests X500Principal class
     35  *
     36  * Distinguished name(DN) strings follows
     37  * BNF syntax specified in RFC 2253 and RFC 1779
     38  *
     39  * @see http://www.ietf.org/rfc/rfc2253.txt
     40  * @see http://www.ietf.org/rfc/rfc1779.txt
     41  * @see http://asn1.elibel.tm.fr/en/standards/index.htm
     42  */
     43 
     44 public class X500PrincipalTest extends TestCase {
     45 
     46     private boolean testing = false;
     47 
     48     public void testStreamPosition() throws Exception {
     49         //this encoding is read from the file
     50         /*byte [] mess = {0x30, 0x30,
     51          0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
     52          0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
     53          1, 2, 3//extra bytes
     54          };
     55          */
     56 
     57         InputStream is = Support_Resources
     58                 .getResourceStream("X500PrincipalTest.0.dat");
     59         X500Principal principal = new X500Principal(is);
     60         String s = principal.toString();
     61         assertEquals("CN=A, CN=B, CN=A, CN=B", s);
     62         byte[] restBytes = new byte[] { 0, 0, 0 };
     63         is.read(restBytes);
     64         assertEquals(restBytes[0], 1);
     65         assertEquals(restBytes[1], 2);
     66         assertEquals(restBytes[2], 3);
     67         is.close();
     68     }
     69 
     70     public void testStreamPosition_0() throws Exception {
     71         //this encoding is read from the file
     72         /*byte [] mess = {0x30, 0x30,
     73          0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
     74          0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
     75          };
     76          */
     77 
     78         InputStream is = Support_Resources
     79                 .getResourceStream("X500PrincipalTest.1.dat");
     80         X500Principal principal = new X500Principal(is);
     81         String s = principal.toString();
     82         assertEquals("CN=A, CN=B, CN=A, CN=B", s);
     83         assertEquals(0, is.available());
     84         is.close();
     85     }
     86 
     87     public void testStreamPosition_1() throws Exception {
     88         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
     89                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
     90                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
     91                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
     92                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
     93                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
     94                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
     95                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
     96                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
     97                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
     98                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
     99                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    100                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    101                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    102                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    103                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 2,
    104                 3, 4 };
    105 
    106         ByteArrayInputStream is = new ByteArrayInputStream(mess);
    107         X500Principal principal = new X500Principal(is);
    108 
    109         String s = principal.getName(X500Principal.RFC1779);
    110         assertEquals(
    111                 "CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=Z",
    112                 s);
    113         assertEquals(3, is.available());
    114         assertEquals(2, is.read());
    115         assertEquals(3, is.read());
    116         assertEquals(4, is.read());
    117     }
    118 
    119     public void testStreamPosition_2() throws Exception {
    120         byte[] mess = { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    121                 0x04, 0x03, 0x13, 0x01, 0x41, 2 };
    122         ByteArrayInputStream is = new ByteArrayInputStream(mess);
    123         X500Principal principal = new X500Principal(is);
    124         String s = principal.getName(X500Principal.RFC1779);
    125         assertEquals("CN=A", s);
    126         assertEquals(1, is.available());
    127         assertEquals(2, is.read());
    128     }
    129 
    130     public void testEncodingFromFile() throws Exception {
    131         //this encoding is read from the file
    132         /*byte [] mess = {0x30, 0x30,
    133          0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
    134          0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41
    135          };
    136          */
    137         InputStream is = Support_Resources
    138                 .getResourceStream("X500PrincipalTest.1.dat");
    139         X500Principal principal = new X500Principal(is);
    140         String s = principal.toString();
    141         assertEquals("CN=A, CN=B, CN=A, CN=B", s);
    142         is.close();
    143     }
    144 
    145     public void testEncodingFromEncoding() {
    146         byte[] arr1 = new X500Principal("O=Org.").getEncoded();
    147         byte[] arr2 = new X500Principal(new X500Principal("O=Org.")
    148                 .getEncoded()).getEncoded();
    149         assertTrue(Arrays.equals(arr1, arr2));
    150     }
    151 
    152     /**
    153      * tests if the encoding is backed
    154      */
    155     public void testSafeEncoding() {
    156         byte[] mess = { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    157                 0x04, 0x03, 0x13, 0x01, 0x41 };
    158         X500Principal principal = new X500Principal(mess);
    159         mess[mess.length - 1] = (byte) 0xFF;
    160         byte[] enc = principal.getEncoded();
    161         assertEquals(enc[mess.length - 1], 0x41);
    162     }
    163 
    164     /**
    165      * Inits X500Principal with byte array
    166      * gets toString
    167      * checks the result
    168      */
    169     public void testToString() throws Exception {
    170         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    171                 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
    172                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
    173         X500Principal principal = new X500Principal(mess);
    174         String s = principal.toString();
    175         assertNotNull(s);
    176     }
    177 
    178     /**
    179      * Inits X500Principal with byte array
    180      * gets hashCode
    181      * compares with expected value
    182      */
    183     public void testHashCode() throws Exception {
    184         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    185                 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
    186                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
    187         X500Principal principal = new X500Principal(mess);
    188         int hash = principal.hashCode();
    189         assertEquals(principal.getName(X500Principal.CANONICAL).hashCode(),
    190                 hash);
    191     }
    192 
    193     /**
    194      * Inits X500Principal with byte array
    195      * Inits other X500Principal with equivalent string
    196      * checks if <code>equals</code> returns true for first against second one
    197      */
    198     public void testEquals() throws Exception {
    199         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    200                 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
    201                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
    202         X500Principal principal = new X500Principal(mess);
    203         X500Principal principal2 = new X500Principal("CN=A, CN=B");
    204         assertTrue(principal.equals(principal2));
    205     }
    206 
    207     /**
    208      * @tests javax.security.auth.x500.X500Principal#equals(Object)
    209      */
    210     public void test_equalsLjava_lang_Object() {
    211         X500Principal xp1 = new X500Principal(
    212                 "C=US, ST=California, L=San Diego, O=Apache, OU=Project Harmony, CN=Test cert");
    213         assertEquals(
    214                 "C=US,ST=California,L=San Diego,O=Apache,OU=Project Harmony,CN=Test cert",
    215                 xp1.getName());
    216     }
    217 
    218     /**
    219      * Inits X500Principal with byte array, where Oid does fall into any keyword, but not given as a keyword
    220      * Value is given as hex value
    221      * (extra spaces are given)
    222      * gets Name in RFC1779 format
    223      * compares with expected value of name
    224      */
    225     public void testKWAsOid_RFC1779() throws Exception {
    226         String dn = "CN=A, OID.2.5.4.3  =    #130142";
    227         X500Principal principal = new X500Principal(dn);
    228 
    229         String s = principal.getName(X500Principal.RFC1779);
    230         assertEquals("CN=A, CN=B", s);
    231     }
    232 
    233     /**
    234      * Inits X500Principal with byte array, where Oid does fall into any keyword, but not given as a keyword
    235      * Value is given as hex value
    236      * (extra spaces are given)
    237      * gets Name in RFC2253 format
    238      * compares with expected value of name
    239      */
    240     public void testKWAsOid_RFC2253() throws Exception {
    241         String dn = "CN=A, OID.2.5.4.3 =  #130142";
    242         X500Principal principal = new X500Principal(dn);
    243 
    244         String s = principal.getName(X500Principal.RFC2253);
    245         assertEquals("CN=A,CN=B", s);
    246     }
    247 
    248     /**
    249      * Inits X500Principal with byte array, where Oid does fall into any keyword, but not given as a keyword
    250      * Value is given as hex value
    251      * (extra spaces are given)
    252      * gets Name in CANONICAL format
    253      * compares with expected value of name
    254      */
    255     public void testKWAsOid_CANONICAL() throws Exception {
    256         String dn = "CN=A, OID.2.5.4.3 =  #130142";
    257         X500Principal principal = new X500Principal(dn);
    258 
    259         String s = principal.getName(X500Principal.CANONICAL);
    260         assertEquals("cn=a,cn=b", s);
    261     }
    262 
    263     /**
    264      * Inits X500Principal with byte array, where Oid does not fall into any keyword
    265      * gets Name in RFC1779 format
    266      * compares with expected value of name
    267      */
    268     public void testOid_RFC1779() throws Exception {
    269         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    270                 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
    271                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
    272         mess[8] = 0x60;
    273         X500Principal principal = new X500Principal(mess);
    274 
    275         String s = principal.getName(X500Principal.RFC1779);
    276         assertEquals("CN=A, OID.2.16.4.3=B", s);
    277     }
    278 
    279     /**
    280      * Inits X500Principal with byte array, where Oid does not fall into any keyword
    281      * gets Name in RFC2253 format
    282      * compares with expected value of name
    283      */
    284     public void testOid_RFC2253() throws Exception {
    285         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    286                 0x04, 0x03, 0x13, 0x01, 0x4F, 0x31, 0x0A, 0x30, 0x08, 0x06,
    287                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
    288         mess[8] = 0x60;
    289         X500Principal principal = new X500Principal(mess);
    290 
    291         String s = principal.getName(X500Principal.RFC2253);
    292         assertEquals("CN=A,2.16.4.3=#13014f", s);
    293     }
    294 
    295     /**
    296      * Inits X500Principal with byte array, where Oid does not fall into any keyword
    297      * gets Name in CANONICAL format
    298      * compares with expected value of name
    299      */
    300     public void testOid_CANONICAL() throws Exception {
    301         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    302                 0x04, 0x03, 0x13, 0x01, 0x4F, 0x31, 0x0A, 0x30, 0x08, 0x06,
    303                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
    304         mess[8] = 0x60;
    305         X500Principal principal = new X500Principal(mess);
    306 
    307         String s = principal.getName(X500Principal.CANONICAL);
    308         assertEquals("cn=a,2.16.4.3=#13014f", s);
    309     }
    310 
    311     /**
    312      * Inits X500Principal with a string
    313      * gets encoded form
    314      * compares with expected byte array
    315      */
    316     public void testNameGetEncoding() throws Exception {
    317         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
    318                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
    319                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
    320                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
    321                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
    322                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
    323                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
    324                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
    325                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
    326                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
    327                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
    328                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    329                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    330                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    331                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    332                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
    333         String dn = "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z";
    334         X500Principal principal = new X500Principal(dn);
    335         byte[] s = principal.getEncoded();
    336 
    337         assertTrue(Arrays.equals(mess, s));
    338     }
    339 
    340     /**
    341      * Inits X500Principal with a string
    342      * gets encoded form
    343      * compares with expected byte array
    344      */
    345     public void testNameGetEncoding_01() throws Exception {
    346         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    347                 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
    348                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
    349         String dn = "CN=A,CN=B";
    350         X500Principal principal = new X500Principal(dn);
    351         byte[] s = principal.getEncoded();
    352 
    353         assertTrue(Arrays.equals(mess, s));
    354     }
    355 
    356     /**
    357      * Inits X500Principal with byte array
    358      * gets Name in RFC1779 format
    359      * compares with expected value of name
    360      */
    361     public void testGetName_RFC1779() throws Exception {
    362         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
    363                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
    364                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
    365                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
    366                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
    367                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
    368                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
    369                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
    370                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
    371                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
    372                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
    373                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    374                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    375                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    376                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    377                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
    378         X500Principal principal = new X500Principal(mess);
    379 
    380         String s = principal.getName(X500Principal.RFC1779);
    381         assertEquals(
    382                 "CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=Z",
    383                 s);
    384 
    385     }
    386 
    387     /**
    388      * Inits X500Principal with byte array
    389      * gets Name in RFC2253 format
    390      * compares with expected value of name
    391      */
    392     public void testGetName_RFC2253() throws Exception {
    393         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
    394                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
    395                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
    396                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
    397                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
    398                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
    399                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
    400                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
    401                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
    402                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
    403                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
    404                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    405                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    406                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    407                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    408                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
    409         X500Principal principal = new X500Principal(mess);
    410 
    411         String s = principal.getName(X500Principal.RFC2253);
    412         assertEquals(
    413                 "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z",
    414                 s);
    415     }
    416 
    417     /**
    418      * Inits X500Principal with byte array
    419      * gets Name in CANONICAL format
    420      * compares with expected value of name
    421      */
    422     public void testGetName_CANONICAL() throws Exception {
    423         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
    424                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
    425                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
    426                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
    427                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
    428                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
    429                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
    430                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
    431                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
    432                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
    433                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
    434                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    435                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    436                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    437                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    438                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
    439         X500Principal principal = new X500Principal(mess);
    440 
    441         String s = principal.getName(X500Principal.CANONICAL);
    442         assertEquals(
    443                 "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z"
    444                         .toLowerCase(Locale.US), s);
    445     }
    446 
    447     /**
    448      * Inits X500Principal with byte array
    449      * gets Name in RFC1779 format
    450      * compares with expected value of name
    451      */
    452     public void testStreamGetName_RFC1779() throws Exception {
    453         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
    454                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
    455                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
    456                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
    457                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
    458                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
    459                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
    460                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
    461                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
    462                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
    463                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
    464                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    465                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    466                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    467                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    468                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
    469         ByteArrayInputStream is = new ByteArrayInputStream(mess);
    470         X500Principal principal = new X500Principal(is);
    471 
    472         String s = principal.getName(X500Principal.RFC1779);
    473         assertEquals(
    474                 "CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=Z",
    475                 s);
    476     }
    477 
    478     /**
    479      * Inits X500Principal with byte array
    480      * gets Name in RFC2253 format
    481      * compares with expected value of name
    482      */
    483     public void testStreamGetName_RFC2253() throws Exception {
    484         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
    485                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
    486                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
    487                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
    488                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
    489                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
    490                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
    491                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
    492                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
    493                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
    494                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
    495                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    496                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    497                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    498                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    499                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
    500         ByteArrayInputStream is = new ByteArrayInputStream(mess);
    501         X500Principal principal = new X500Principal(is);
    502 
    503         String s = principal.getName(X500Principal.RFC2253);
    504         assertEquals(
    505                 "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z",
    506                 s);
    507     }
    508 
    509     /**
    510      * Inits X500Principal with byte array
    511      * gets Name in CANONICAL format
    512      * compares with expected value of name
    513      */
    514     public void testStreamGetName_CANONICAL() throws Exception {
    515         byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
    516                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
    517                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
    518                 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
    519                 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
    520                 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
    521                 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
    522                 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
    523                 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
    524                 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
    525                 0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
    526                 0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    527                 0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
    528                 0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
    529                 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
    530                 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
    531         ByteArrayInputStream is = new ByteArrayInputStream(mess);
    532         X500Principal principal = new X500Principal(is);
    533 
    534         String s = principal.getName(X500Principal.CANONICAL);
    535         assertEquals(
    536                 "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z"
    537                         .toLowerCase(Locale.US), s);
    538     }
    539 
    540     /**
    541      * Inits X500Principal with a string, where OID does not fall into any keyword
    542      * gets encoded form
    543      * inits new X500Principal with the encoding
    544      * gets string in RFC1779 format
    545      * compares with expected value
    546      */
    547     public void testGetName_EncodingWithWrongOidButGoodName_SeveralRDNs_RFC1779()
    548             throws Exception {
    549         String dn = "OID.2.16.4.3=B; CN=A";
    550         X500Principal principal = new X500Principal(dn);
    551         byte[] enc = principal.getEncoded();
    552         X500Principal principal2 = new X500Principal(enc);
    553         String s = principal2.getName(X500Principal.RFC1779);
    554         assertEquals("OID.2.16.4.3=B, CN=A", s);
    555 
    556     }
    557 
    558     /**
    559      * Inits X500Principal with a string, where OID does not fall into any keyword
    560      * gets encoded form
    561      * inits new X500Principal with the encoding
    562      * gets string in RFC2253 format
    563      * compares with expected value
    564      */
    565     public void testGetName_EncodingWithWrongOidButGoodName_SeveralRDNs_RFC2253()
    566             throws Exception {
    567         String dn = "OID.2.16.4.3=B; CN=A";
    568         X500Principal principal = new X500Principal(dn);
    569         byte[] enc = principal.getEncoded();
    570         X500Principal principal2 = new X500Principal(enc);
    571         String s = principal2.getName(X500Principal.RFC2253);
    572         assertEquals("2.16.4.3=#130142,CN=A", s);
    573 
    574     }
    575 
    576     /**
    577      * Inits X500Principal with a string, where OID does not fall into any keyword
    578      * gets encoded form
    579      * inits new X500Principal with the encoding
    580      * gets string in CANONICAL format
    581      * compares with expected value
    582      */
    583     public void testGetName_EncodingWithWrongOidButGoodName_SeveralRDNs_CANONICAL()
    584             throws Exception {
    585         String dn = "OID.2.16.4.3=B; CN=A";
    586         X500Principal principal = new X500Principal(dn);
    587         byte[] enc = principal.getEncoded();
    588         X500Principal principal2 = new X500Principal(enc);
    589         String s = principal2.getName(X500Principal.CANONICAL);
    590         assertEquals("2.16.4.3=#130142,cn=a", s);
    591 
    592     }
    593 
    594     /**
    595      * Inits X500Principal with a string, where OID does not fall into any keyword
    596      * gets string in RFC1779 format
    597      * compares with expected value
    598      */
    599     public void testGetName_wrongOidButGoodName_RFC1779() throws Exception {
    600         String dn = "OID.2.16.4.3=B + CN=A";
    601         X500Principal principal = new X500Principal(dn);
    602 
    603         String s = principal.getName(X500Principal.RFC1779);
    604         assertEquals("OID.2.16.4.3=B + CN=A", s);
    605     }
    606 
    607     /**
    608      * Inits X500Principal with a string, where OID does not fall into any keyword
    609      * gets string in RFC2253 format
    610      * compares with expected value
    611      */
    612     public void testGetName_wrongOidButGoodName_RFC2253() throws Exception {
    613         String dn = "OID.2.16.4.3=B + CN=A";
    614         X500Principal principal = new X500Principal(dn);
    615 
    616         String s = principal.getName(X500Principal.RFC2253);
    617         assertEquals("2.16.4.3=#130142+CN=A", s);
    618     }
    619 
    620     /**
    621      * Inits X500Principal with a string, there are multiple AVAs
    622      * gets string in CANONICAL format
    623      * compares with expected value paying attention on sorting order of AVAs
    624      */
    625     public void testGetName_CANONICAL_SortOrder() throws Exception {
    626         String dn = "ST=C + CN=A; OU=B + CN=D";
    627         X500Principal principal = new X500Principal(dn);
    628 
    629         String s = principal.getName(X500Principal.CANONICAL);
    630         assertEquals("cn=a+st=c,cn=d+ou=b", s);
    631 
    632     }
    633 
    634     /**
    635      * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
    636      * gets string in CANONICAL format
    637      * compares with expected value paying attention on sorting order of AVAs
    638      */
    639     public void testGetName_CANONICAL_SortOrder_01() throws Exception {
    640         String dn = "OID.2.16.4.3=B + CN=A";
    641         X500Principal principal = new X500Principal(dn);
    642 
    643         String s = principal.getName(X500Principal.CANONICAL);
    644         assertEquals("cn=a+2.16.4.3=#130142", s);
    645 
    646     }
    647 
    648     /**
    649      * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword, and value given in hex format
    650      * gets string in CANONICAL format
    651      * compares with expected value paying attention on sorting order of AVAs
    652      */
    653     public void testGetName_CANONICAL_SortOrder_02() throws Exception {
    654         String dn = "OID.2.16.4.3=#13024220+ CN=A";
    655         X500Principal principal = new X500Principal(dn);
    656 
    657         String s = principal.getName(X500Principal.CANONICAL);
    658         assertEquals("cn=a+2.16.4.3=#13024220", s);
    659 
    660     }
    661 
    662     /**
    663      * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
    664      * gets string in CANONICAL format
    665      * compares with expected value paying attention on sorting order of AVAs
    666      */
    667     public void testGetName_CANONICAL_SortOrder_03() throws Exception {
    668         String dn = "OID.2.16.4.9=A + OID.2.16.4.3=B";
    669         X500Principal principal = new X500Principal(dn);
    670 
    671         String s = principal.getName(X500Principal.CANONICAL);
    672         assertEquals("2.16.4.3=#130142+2.16.4.9=#130141", s);
    673 
    674     }
    675 
    676     /**
    677      * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
    678      * gets string in CANONICAL format
    679      * compares with expected value paying attention on sorting order of AVAs
    680      */
    681     public void testGetName_CANONICAL_SortOrder_04() throws Exception {
    682         String dn = "OID.2.2.2.2=A + OID.1.1.1.1=B";
    683         X500Principal principal = new X500Principal(dn);
    684 
    685         String s = principal.getName(X500Principal.CANONICAL);
    686         assertEquals("1.1.1.1=#130142+2.2.2.2=#130141", s);
    687 
    688     }
    689 
    690     /**
    691      * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
    692      * gets string in CANONICAL format
    693      * compares with expected value paying attention on sorting order of AVAs
    694      */
    695     public void testGetName_CANONICAL_SortOrder_05() throws Exception {
    696         String dn = "OID.2.16.4.9=A + OID.2.16.4=B";
    697         X500Principal principal = new X500Principal(dn);
    698 
    699         String s = principal.getName(X500Principal.CANONICAL);
    700         assertEquals("2.16.4=#130142+2.16.4.9=#130141", s);
    701 
    702     }
    703 
    704     /**
    705      * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
    706      * gets string in CANONICAL format
    707      * compares with expected value paying attention on sorting order of AVAs
    708      */
    709     public void testGetName_CANONICAL_SortOrder_06() throws Exception {
    710         String dn = "OID.1.1.2=A + OID.1.2=B";
    711         X500Principal principal = new X500Principal(dn);
    712 
    713         String s = principal.getName(X500Principal.CANONICAL);
    714         assertEquals("1.1.2=#130141+1.2=#130142", s);
    715 
    716     }
    717 
    718     /**
    719      * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
    720      * gets string in CANONICAL format
    721      * compares with expected value paying attention on sorting order of AVAs
    722      */
    723     public void testGetName_CANONICAL_SortOrder_07() throws Exception {
    724         String dn = "OID.1.1.1=A + OID.1.1=B";
    725         X500Principal principal = new X500Principal(dn);
    726 
    727         String s = principal.getName(X500Principal.CANONICAL);
    728         assertEquals("1.1=#130142+1.1.1=#130141", s);
    729 
    730     }
    731 
    732     /**
    733      * FIXME test is failed - implement unicode normalization
    734      * @throws Exception
    735      */
    736     public void testGetNameUnicodeNormalized() throws Exception {
    737         String unicodeStr = "CN= \u0401\u0410";
    738         X500Principal principal = new X500Principal(unicodeStr);
    739         principal.getName(X500Principal.CANONICAL);
    740     }
    741 
    742     /**
    743      * Inits X500Principal with empty string
    744      * gets encoding
    745      * compares with expected encoding
    746      */
    747     public void testEmptyInputName() {
    748         String dn = "CN=\"\"";
    749         byte[] mess = { 0x30, 0x0B, 0x31, 0x09, 0x30, 0x07, 0x06, 0x03, 0x55,
    750                 0x04, 0x03, 0x13, 0x00 };
    751         X500Principal principal = new X500Principal(dn);
    752         assertTrue(Arrays.equals(mess, principal.getEncoded()));
    753     }
    754 
    755     /**
    756      * Inits X500Principal with string as single escaped space
    757      * gets encoding
    758      * compares with expected encoding
    759      */
    760     public void testNameSingleEscapedSpace() {
    761         String dn = "CN=\\ ";
    762         byte[] mess = { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
    763                 0x04, 0x03, 0x13, 0x01, 0x20 };
    764         X500Principal principal = new X500Principal(dn);
    765         assertTrue(Arrays.equals(mess, principal.getEncoded()));
    766     }
    767 
    768     /**
    769      * Inits X500Principal with string with spaces
    770      * gets Name in RFC2253 format
    771      * compares with expected value of name
    772      */
    773     public void testNameOnlySpaces_RFC1779() {
    774         String dn = "CN=\"  \"";
    775         X500Principal principal = new X500Principal(dn);
    776         assertEquals("CN=\"  \"", principal.getName(X500Principal.RFC1779));
    777     }
    778 
    779     /**
    780      * Inits X500Principal with string with spaces
    781      * gets Name in RFC2253 format
    782      * compares with expected value of name
    783      */
    784     public void testNameOnlySpaces_RFC2253() {
    785         String dn = "CN=\"  \"";
    786         X500Principal principal = new X500Principal(dn);
    787         assertEquals("CN=\\ \\ ", principal.getName(X500Principal.RFC2253));
    788     }
    789 
    790     /**
    791      * Inits X500Principal with string with only spaces,
    792      * gets Name in CANONICAL format:leading and trailing white space
    793      * chars are removed even string doesn't have other chars (bug???)
    794      */
    795     public void testNameOnlySpaces_CANONICAL() {
    796         String dn = "CN=\"  \"";
    797         X500Principal principal = new X500Principal(dn);
    798         assertEquals("cn=", principal.getName(X500Principal.CANONICAL));
    799     }
    800 
    801     ///*** Negative Tests ***///
    802     /**
    803      * Inits X500Principal with string, where DN name is improper "CNN"
    804      * checks if proper exception is thrown
    805      */
    806     public void testIllegalInputName() {
    807         try {
    808             String dn = "CNN=A";
    809             new X500Principal(dn);
    810             fail("No IllegalArgumentException on improper input name \"CNN\"");
    811         } catch (IllegalArgumentException e) {
    812         }
    813     }
    814 
    815     /**
    816      * Inits X500Principal with string, where there is leading ';'
    817      * checks if proper exception is thrown
    818      */
    819     public void testIllegalInputName_01() {
    820         try {
    821             String dn = ";CN=A";
    822             new X500Principal(dn);
    823             fail("No IllegalArgumentException on leading ';' in input name");
    824         } catch (IllegalArgumentException e) {
    825         }
    826     }
    827 
    828     /**
    829      * Inits X500Principal with string, where there is leading '='
    830      * checks if proper exception is thrown
    831      */
    832     public void testIllegalInputName_02() {
    833         try {
    834             String dn = "=CN=A";
    835             new X500Principal(dn);
    836             fail("No IllegalArgumentException on leading '=' in input name");
    837         } catch (IllegalArgumentException e) {
    838         }
    839     }
    840 
    841     /**
    842      * Inits X500Principal with string, where there is no value
    843      * checks if proper exception is thrown
    844      */
    845     public void testEmptyInputName_0() {
    846         String dn = "CN=";
    847         byte[] mess = { 0x30, 0x0B, 0x31, 0x09, 0x30, 0x07, 0x06, 0x03, 0x55,
    848                 0x04, 0x03, 0x13, 0x00 };
    849         X500Principal principal = new X500Principal(dn);
    850         assertTrue(Arrays.equals(mess, principal.getEncoded()));
    851     }
    852 
    853     public void testEmptyInputName_1() {
    854         String dn = "CN=\"\", C=\"\"";
    855         X500Principal principal = new X500Principal(dn);
    856         dn = "CN=, C=";
    857         X500Principal principal2 = new X500Principal(dn);
    858         assertTrue(Arrays.equals(principal.getEncoded(), principal2
    859                 .getEncoded()));
    860 
    861     }
    862 
    863     public void testEmptyInputName_2() {
    864         String dn = "CN=\"\" + OU=A, C=\"\"";
    865         X500Principal principal = new X500Principal(dn);
    866         dn = "CN=+OU=A, C=";
    867         X500Principal principal2 = new X500Principal(dn);
    868         assertTrue(Arrays.equals(principal.getEncoded(), principal2
    869                 .getEncoded()));
    870 
    871     }
    872 
    873     public void testIllegalInputName_15() {
    874         try {
    875             String dn = "CN=,C";
    876             new X500Principal(dn);
    877             fail("No IllegalArgumentException on improper attribute value");
    878         } catch (IllegalArgumentException e) {
    879         }
    880     }
    881 
    882     public void testIllegalInputName_16() {
    883         try {
    884             String dn = "CN=,C=+";
    885             new X500Principal(dn);
    886             fail("No IllegalArgumentException on improper attribute value");
    887         } catch (IllegalArgumentException e) {
    888         }
    889     }
    890 
    891     /**
    892      * Inits X500Principal with string, where value is given in wrong hex format
    893      * checks if proper exception is thrown
    894      */
    895     public void testIllegalInputName_04() {
    896         try {
    897             String dn = "CN=#XYZ";
    898             new X500Principal(dn);
    899             fail("No IllegalArgumentException on improper hex value");
    900         } catch (IllegalArgumentException e) {
    901         }
    902     }
    903 
    904     /**
    905      * Inits X500Principal with string, where value is given with special chars
    906      * checks if proper exception is thrown
    907      */
    908     public void testIllegalInputName_05() {
    909         try {
    910             String dn = "CN=X+YZ";
    911             new X500Principal(dn);
    912             fail("No IllegalArgumentException on improper attribute value");
    913         } catch (IllegalArgumentException e) {
    914         }
    915     }
    916 
    917     /**
    918      * Inits X500Principal with string, where value is given with special chars
    919      * Compatibility issue: according RFC 2253 such string is invalid
    920      * but we accept it, not string char is escaped
    921      */
    922     public void testIllegalInputName_06() {
    923         String dn = "CN=X=YZ";
    924         X500Principal p = new X500Principal(dn);
    925         assertEquals("CN=X\\=YZ", p.getName(X500Principal.RFC2253));
    926     }
    927 
    928     /**
    929      * Inits X500Principal with string, where value is given with not string chars
    930      * Compatibility issue: according RFC 2253 such string is invalid
    931      * but we accept it, not string char is escaped
    932      */
    933     public void testIllegalInputName_07() {
    934         String dn = "CN=X\"YZ";
    935         X500Principal p = new X500Principal(dn);
    936         assertEquals("CN=X\\\"YZ", p.getName(X500Principal.RFC2253));
    937     }
    938 
    939     /**
    940      * Inits X500Principal with string, where value is given with special chars
    941      * Compatibility issue: according RFC 2253 such string is invalid
    942      * but we accept it, special char is escaped
    943      */
    944     public void testIllegalInputName_08() {
    945         String dn = "CN=X<YZ";
    946         X500Principal p = new X500Principal(dn);
    947         assertEquals("CN=X\\<YZ", p.getName(X500Principal.RFC2253));
    948     }
    949 
    950     /**
    951      * Inits X500Principal with string, where value is given with special chars
    952      * checks if proper exception is thrown
    953      */
    954     public void testIllegalInputName_09() {
    955         try {
    956             String dn = "CN=#";
    957             new X500Principal(dn);
    958             fail("No IllegalArgumentException on improper attribute hex value");
    959         } catch (IllegalArgumentException e) {
    960             //ignore
    961         }
    962 
    963     }
    964 
    965     /**
    966      * Inits X500Principal with string, where value is given with special chars
    967      * checks if proper exception is thrown
    968      */
    969     public void testIllegalInputName_10() {
    970         try {
    971             String dn = "CN=#13";
    972             new X500Principal(dn);
    973             fail("No IllegalArgumentException on improper attribute hex value");
    974         } catch (IllegalArgumentException e) {
    975             //ignore
    976         }
    977 
    978     }
    979 
    980     /**
    981      * Inits X500Principal with string, where value is given with special chars
    982      * checks if proper exception is thrown
    983      */
    984     public void testIllegalInputName_11() {
    985         try {
    986             String dn = "CN=#1301";
    987             new X500Principal(dn);
    988             fail("No IllegalArgumentException on improper attribute hex value");
    989         } catch (IllegalArgumentException e) {
    990             //ignore
    991         }
    992 
    993     }
    994 
    995     /**
    996      * Inits X500Principal with string, where value is given with special chars
    997      * checks if proper exception is thrown
    998      */
    999     public void testIllegalInputName_12() {
   1000         try {
   1001             String dn = "CN=#13010101";
   1002             new X500Principal(dn);
   1003             fail("No IllegalArgumentException on improper attribute hex value");
   1004         } catch (IllegalArgumentException e) {
   1005         }
   1006     }
   1007 
   1008     /**
   1009      * Inits X500Principal with string, where value is given with special chars
   1010      * checks if proper exception is thrown
   1011      */
   1012     public void testIllegalInputName_13() {
   1013         try {
   1014             String dn = "CN=# 0";
   1015             new X500Principal(dn);
   1016             fail("No IllegalArgumentException on improper attribute hex value");
   1017         } catch (IllegalArgumentException e) {
   1018         }
   1019     }
   1020 
   1021     /**
   1022      * Inits X500Principal with string, where value is given in hex format, but improper tag
   1023      * checks if it is ignored
   1024      */
   1025     public void testSemiIllegalInputName_14() {
   1026         String dn = "CN=#7E0142";
   1027         new X500Principal(dn);
   1028     }
   1029 
   1030     public void testInitClause() {
   1031         try {
   1032             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1033                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1034                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1035             mess[3] = 0x12;//length field
   1036             new X500Principal(mess);
   1037 
   1038             fail("No IllegalArgumentException on input array with improper length field");
   1039         } catch (IllegalArgumentException e) {
   1040         }
   1041     }
   1042 
   1043     /**
   1044      * Inits X500Principal with byte array = null
   1045      * checks if proper exception is thrown
   1046      */
   1047     public void testIllegalInputArray_0() {
   1048         try {
   1049             byte[] mess = null;
   1050             new X500Principal(mess);
   1051             fail("No IllegalArgumentException on input array with improper length field");
   1052         } catch (IllegalArgumentException e) {
   1053         }
   1054     }
   1055 
   1056     /**
   1057      * Inits X500Principal with byte array with wrong length field
   1058      * checks if proper exception is thrown
   1059      */
   1060     public void testIllegalInputArray() {
   1061         try {
   1062             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1063                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1064                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1065             mess[3] = 0x12;//length field
   1066             new X500Principal(mess);
   1067 
   1068             fail("No IllegalArgumentException on input array with improper length field");
   1069         } catch (IllegalArgumentException e) {
   1070         }
   1071     }
   1072 
   1073     /**
   1074      * Inits X500Principal with input stream with wrong length field
   1075      * checks if proper exception is thrown
   1076      */
   1077     public void testIllegalInputArray_is() {
   1078         try {
   1079             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1080                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1081                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1082             mess[3] = 0x12;//length field
   1083             ByteArrayInputStream is = new ByteArrayInputStream(mess);
   1084             new X500Principal(is);
   1085 
   1086             fail("No IllegalArgumentException on input array with improper length field");
   1087         } catch (IllegalArgumentException e) {
   1088         }
   1089     }
   1090 
   1091     /**
   1092      * Inits X500Principal with byte array with wrong inner Sequence tag field
   1093      * checks if proper exception is thrown
   1094      */
   1095     public void testIllegalInputArray_01() {
   1096         try {
   1097             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1098                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1099                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1100             mess[4] = 0x12;//inner Sequence tag field
   1101             new X500Principal(mess);
   1102 
   1103             fail("No IllegalArgumentException on input array with improper inner Sequence tag field");
   1104         } catch (IllegalArgumentException e) {
   1105         }
   1106     }
   1107 
   1108     /**
   1109      * Inits X500Principal with byte array with wrong last byte of OID
   1110      * checks if proper exception is thrown
   1111      */
   1112     public void testIllegalInputArray_02() {
   1113         try {
   1114             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1115                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1116                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1117             mess[10] = (byte) 0xFE;//last byte of OID
   1118             new X500Principal(mess);
   1119 
   1120             fail("No IllegalArgumentException on input array with improper last byte of OID");
   1121         } catch (IllegalArgumentException e) {
   1122         }
   1123     }
   1124 
   1125     /**
   1126      * Inits X500Principal with byte array with wrong length of OID
   1127      * checks if proper exception is thrown
   1128      */
   1129     public void testIllegalInputArray_03() {
   1130         try {
   1131             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1132                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1133                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1134             mess[7] = 2;//length of OID
   1135             new X500Principal(mess);
   1136 
   1137             fail("No IllegalArgumentException on input array with improper length of OID");
   1138         } catch (IllegalArgumentException e) {
   1139         }
   1140     }
   1141 
   1142     /**
   1143      * Inits X500Principal with byte array with wrong tag of value
   1144      * checks if it is ignored
   1145      */
   1146     public void testSemiIllegalInputArray_04() {
   1147         byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
   1148                 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
   1149                 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1150         mess[11] = (byte) 0x0F;//tag of value
   1151         new X500Principal(mess);
   1152     }
   1153 
   1154     /**
   1155      * Inits X500Principal with byte array with wrong length of value
   1156      * checks if proper exception is thrown
   1157      */
   1158     public void testIllegalInputArray_05() {
   1159         try {
   1160             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1161                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1162                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1163             mess[12] = 2;//length of value
   1164             new X500Principal(mess);
   1165 
   1166             fail("No IllegalArgumentException on input array with improper length of value");
   1167         } catch (IllegalArgumentException e) {
   1168         }
   1169     }
   1170 
   1171     /**
   1172      * Inits X500Principal with input stream with wrong length of value
   1173      * checks if proper exception is thrown
   1174      */
   1175     public void testIllegalInputArray_05_is() {
   1176         try {
   1177             byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   1178                     0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
   1179                     0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
   1180             mess[12] = 2;//length of value
   1181             ByteArrayInputStream is = new ByteArrayInputStream(mess);
   1182             new X500Principal(is);
   1183 
   1184             fail("No IllegalArgumentException on input array with improper length of value");
   1185         } catch (IllegalArgumentException e) {
   1186         }
   1187     }
   1188 
   1189     /**
   1190      * Inits X500Principal with string
   1191      * Calls getName with improper parameter as format
   1192      * checks if proper exception is thrown
   1193      */
   1194     public void testIllegalFormat() {
   1195         try {
   1196             String dn = "CN=A";
   1197             X500Principal principal = new X500Principal(dn);
   1198             principal.getName("WRONG FORMAT");
   1199             fail("No IllegalArgumentException on improper parameter as format");
   1200         } catch (IllegalArgumentException e) {
   1201         }
   1202     }
   1203 
   1204     /**
   1205      * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
   1206      * Gets encoding
   1207      * Inits other X500Principal with the encoding
   1208      * gets string in RFC1779 format
   1209      * compares with expected value paying attention on sorting order of AVAs
   1210      */
   1211     public void testGetName_EncodingWithWrongOidButGoodName_MultAVA_RFC1779()
   1212             throws Exception {
   1213         String dn = "OID.2.16.4.3=B + CN=A";
   1214         X500Principal principal = new X500Principal(dn);
   1215         byte[] enc = principal.getEncoded();
   1216         X500Principal principal2 = new X500Principal(enc);
   1217         String s = principal2.getName(X500Principal.RFC1779);
   1218         assertEquals("OID.2.16.4.3=B + CN=A", s);
   1219 
   1220     }
   1221 
   1222     /**
   1223      * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
   1224      * Gets encoding
   1225      * Inits other X500Principal with the encoding
   1226      * gets string in RFC2253 format
   1227      * compares with expected value paying attention on sorting order of AVAs
   1228      */
   1229     public void testGetName_EncodingWithWrongOidButGoodName_MultAVA_RFC2253()
   1230             throws Exception {
   1231         String dn = "OID.2.16.4.3=B + CN=A";
   1232         X500Principal principal = new X500Principal(dn);
   1233         byte[] enc = principal.getEncoded();
   1234         X500Principal principal2 = new X500Principal(enc);
   1235         String s = principal2.getName(X500Principal.RFC2253);
   1236         assertEquals("2.16.4.3=#130142+CN=A", s);
   1237 
   1238     }
   1239 
   1240     /**
   1241      * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
   1242      * Gets encoding
   1243      * Inits other X500Principal with the encoding
   1244      * gets string in CANONICAL format
   1245      * compares with expected value paying attention on sorting order of AVAs
   1246      */
   1247     public void testGetName_EncodingWithWrongOidButGoodName_MultAVA_CANONICAL()
   1248             throws Exception {
   1249         String dn = "OID.2.16.4.3=B + CN=A";
   1250         X500Principal principal = new X500Principal(dn);
   1251         byte[] enc = principal.getEncoded();
   1252         X500Principal principal2 = new X500Principal(enc);
   1253         String s = principal2.getName(X500Principal.CANONICAL);
   1254         assertEquals("cn=a+2.16.4.3=#130142", s);
   1255 
   1256     }
   1257 
   1258     /**
   1259      * Inits X500Principal with byte array, where there are leading and tailing spaces
   1260      * gets Name in RFC1779 format
   1261      * compares with expected value of name
   1262      */
   1263     public void testNameSpaceFromEncoding_RFC1779() throws Exception {
   1264         byte[] mess = { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, 0x55,
   1265                 0x04, 0x03, 0x13, 0x03, 0x20, 0x41, 0x20, };
   1266         X500Principal principal = new X500Principal(mess);
   1267         String s = principal.getName(X500Principal.RFC1779);
   1268         assertEquals("CN=\" A \"", s);
   1269 
   1270     }
   1271 
   1272     /**
   1273      * Inits X500Principal with byte array, where there are leading and tailing spaces
   1274      * gets Name in RFC2253 format
   1275      * compares with expected value of name
   1276      */
   1277     public void testNameSpaceFromEncoding_RFC2253() throws Exception {
   1278         byte[] mess = { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, 0x55,
   1279                 0x04, 0x03, 0x13, 0x03, 0x20, 0x41, 0x20, };
   1280         X500Principal principal = new X500Principal(mess);
   1281         String s = principal.getName(X500Principal.RFC2253);
   1282         assertEquals("CN=\\ A\\ ", s);
   1283 
   1284     }
   1285 
   1286     /**
   1287      * Inits X500Principal with byte array, where there are leading and tailing spaces
   1288      * gets Name in CANONICAL format
   1289      * compares with expected value of name
   1290      */
   1291     public void testNameSpaceFromEncoding_CANONICAL() throws Exception {
   1292         byte[] mess = { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, 0x55,
   1293                 0x04, 0x03, 0x13, 0x03, 0x20, 0x41, 0x20, };
   1294         X500Principal principal = new X500Principal(mess);
   1295         String s = principal.getName(X500Principal.CANONICAL);
   1296         assertEquals("cn=a", s);
   1297 
   1298     }
   1299 
   1300     /**
   1301      * Inits X500Principal with byte array, where there are special characters
   1302      * gets Name in RFC1779 format
   1303      * compares with expected value of name, checks if the string is in quotes
   1304      */
   1305     public void testNameSpecialCharsFromEncoding_RFC1779() throws Exception {
   1306         byte[] mess = { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
   1307                 0x04, 0x03, 0x0C, 0x02, 0x3B, 0x2C };
   1308         X500Principal principal = new X500Principal(mess);
   1309         String s = principal.getName(X500Principal.RFC1779);
   1310         assertEquals("CN=\";,\"", s);
   1311 
   1312     }
   1313 
   1314     /**
   1315      * Inits X500Principal with byte array, where there are special characters
   1316      * gets Name in RFC1779 format
   1317      * compares with expected value of name, checks if the characters are escaped
   1318      */
   1319     public void testNameSpecialCharsFromEncoding_RFC2253() throws Exception {
   1320         byte[] mess = { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
   1321                 0x04, 0x03, 0x0C, 0x02, 0x3B, 0x2C };
   1322         X500Principal principal = new X500Principal(mess);
   1323         String s = principal.getName(X500Principal.RFC2253);
   1324         assertEquals("CN=\\;\\,", s);
   1325 
   1326     }
   1327 
   1328     /**
   1329      * Inits X500Principal with byte array, where there are special characters
   1330      * gets Name in CANONICAL format
   1331      * compares with expected value of name, checks if the characters are escaped
   1332      */
   1333     public void testNameSpecialCharsFromEncoding_CANONICAL() throws Exception {
   1334         byte[] mess = { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
   1335                 0x04, 0x03, 0x0C, 0x02, 0x3B, 0x2C };
   1336         X500Principal principal = new X500Principal(mess);
   1337         String s = principal.getName(X500Principal.CANONICAL);
   1338         assertEquals("cn=\\;\\,", s);
   1339 
   1340     }
   1341 
   1342     /**
   1343      * Inits X500Principal with the string with special characters - \"B
   1344      * gets Name in RFC1779 format
   1345      * compares with expected value of name - "\B"
   1346      */
   1347     public void testNameSpecialChars_RFC1779() throws Exception {
   1348         String dn = "CN=A,CN=\\\"B";
   1349         X500Principal principal = new X500Principal(dn);
   1350         String s = principal.getName(X500Principal.RFC1779);
   1351         assertEquals("CN=A, CN=\"\\\"B\"", s);
   1352 
   1353     }
   1354 
   1355     /**
   1356      * Inits X500Principal with the string with special characters - \"B
   1357      * gets Name in RFC2253 format
   1358      * compares with expected value of name - "\B"
   1359      */
   1360     public void testNameSpecialChars_RFC2253() throws Exception {
   1361         String dn = "CN=A,CN=\\\"B";
   1362         X500Principal principal = new X500Principal(dn);
   1363         String s = principal.getName(X500Principal.RFC2253);
   1364         assertEquals("CN=A,CN=\\\"B", s);
   1365 
   1366     }
   1367 
   1368     /**
   1369      * Inits X500Principal with the string with special characters - \"B
   1370      * gets Name in CANONICAL format
   1371      * compares with expected value of name - "\b"
   1372      */
   1373     public void testNameSpecialChars_CANONICAL() throws Exception {
   1374         String dn = "CN=A,CN=\\\"B";
   1375         X500Principal principal = new X500Principal(dn);
   1376         String s = principal.getName(X500Principal.CANONICAL);
   1377         assertEquals("cn=a,cn=\\\"b", s);
   1378 
   1379     }
   1380 
   1381     /**
   1382      * Inits X500Principal with the string with special characters - \\nB
   1383      * gets Name in RFC1779 format
   1384      * compares with expected value of name - "\nB"
   1385      */
   1386     public void testNameSpecialChars_RFC1779_01() throws Exception {
   1387         //FIXME see testNameSpecialChars_RFC2253_01
   1388         //        String dn = "CN=\\\nB";
   1389         //        X500Principal principal = new X500Principal(dn);
   1390         //        String s = principal.getName(X500Principal.RFC1779);
   1391         //        assertEquals("CN=\"\nB\"", s);
   1392 
   1393     }
   1394 
   1395     /**
   1396      * Inits X500Principal with the string with special characters - \\nB
   1397      * gets Name in RFC2253 format
   1398      * compares with expected value of name - \\nB
   1399      */
   1400     public void testNameSpecialChars_RFC2253_01() throws Exception {
   1401 
   1402         try {
   1403             // compatibility issue:
   1404             // don't accept escaped \n because it is not a special char
   1405             new X500Principal("CN=\\\nB");
   1406             fail("No expected IllegalArgumentException");
   1407         } catch (IllegalArgumentException e) {
   1408         }
   1409     }
   1410 
   1411     /**
   1412      * Inits X500Principal with the string with special characters - \\nB
   1413      * gets Name in CANONICAL format
   1414      * compares with expected value of name - \\nb
   1415      */
   1416     public void testNameSpecialChars_CANONICAL_01() throws Exception {
   1417         //FIXME testNameSpecialChars_RFC2253_01
   1418         //        String dn = "CN=\\\nB";
   1419         //        X500Principal principal = new X500Principal(dn);
   1420         //        String s = principal.getName(X500Principal.CANONICAL);
   1421         //        assertEquals("cn=b", s);
   1422 
   1423     }
   1424 
   1425     /**
   1426      * Inits X500Principal with the string with special characters - \\B
   1427      * gets Name in RFC1779 format
   1428      * compares with expected value of name - "\B"
   1429      */
   1430     public void testNameSpecialChars_RFC1779_02() throws Exception {
   1431         String dn = "CN=\\\\B";
   1432         X500Principal principal = new X500Principal(dn);
   1433         String s = principal.getName(X500Principal.RFC1779);
   1434         assertEquals("CN=\"\\\\B\"", s);
   1435 
   1436     }
   1437 
   1438     /**
   1439      * Inits X500Principal with the string with special characters - \\B
   1440      * gets Name in RFC2253 format
   1441      * compares with expected value of name - \\B
   1442      */
   1443     public void testNameSpecialChars_RFC2253_02() throws Exception {
   1444         String dn = "CN=\\\\B";
   1445         X500Principal principal = new X500Principal(dn);
   1446         String s = principal.getName(X500Principal.RFC2253);
   1447         assertEquals("CN=\\\\B", s);
   1448 
   1449     }
   1450 
   1451     /**
   1452      * Inits X500Principal with the string with special characters - \\B
   1453      * gets Name in CANONICAL format
   1454      * compares with expected value of name - \\b
   1455      */
   1456     public void testNameSpecialChars_CANONICAL_02() throws Exception {
   1457         String dn = "CN=\\\\B";
   1458         X500Principal principal = new X500Principal(dn);
   1459         String s = principal.getName(X500Principal.CANONICAL);
   1460         assertEquals("cn=\\\\b", s);
   1461 
   1462     }
   1463 
   1464     /**
   1465      * Inits X500Principal with the string with special characters - ABC"DEF"
   1466      * gets encoding
   1467      * compares with expected encoding
   1468      */
   1469     public void testNameWithQuotation() throws Exception {
   1470         String dn = "CN=\"ABCDEF\"";
   1471 
   1472         X500Principal principal = new X500Principal(dn);
   1473         byte[] enc = principal.getEncoded();
   1474         assertTrue(Arrays.equals(new byte[] { 0x30, 0x11, 0x31, 0x0F, 0x30,
   1475                 0x0D, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x41, 0x42,
   1476                 0x43, 0x44, 0x45, 0x46 }, enc));
   1477 
   1478     }
   1479 
   1480     /**
   1481      * Inits X500Principal with the string with special characters - "ABCDEF
   1482      * checks if the proper exception is thrown
   1483      */
   1484     public void testNameWithQuotation_01() throws Exception {
   1485         String dn = "CN=\"ABCDEF";
   1486         try {
   1487             new X500Principal(dn);
   1488             fail("No IllegalArgumentException on string with no closing quotations");
   1489         } catch (IllegalArgumentException e) {
   1490         }
   1491     }
   1492 
   1493     /**
   1494      * Inits X500Principal with the string with special characters - ABC"D#EF"
   1495      * gets encoding
   1496      * compares with expected encoding
   1497      */
   1498     public void testNameWithQuotation_02() throws Exception {
   1499         String dn = "CN=\"ABCD#EF\"";
   1500         X500Principal principal = new X500Principal(dn);
   1501         byte[] enc = principal.getEncoded();
   1502         assertTrue(Arrays.equals(new byte[] { 0x30, 0x12, 0x31, 0x10, 0x30,
   1503                 0x0E, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x07, 0x41, 0x42,
   1504                 0x43, 0x44, 0x23, 0x45, 0x46 }, enc));
   1505     }
   1506 
   1507     /**
   1508      * Inits X500Principal with the string with special characters - ABC"DEF"
   1509      * Compatibility issue: according RFC 2253 such string is invalid
   1510      * but we accept it, not string char is escaped
   1511      */
   1512     public void testNameWithQuotation_03() throws Exception {
   1513         String dn = "CN=ABC\"DEF\"";
   1514         X500Principal principal = new X500Principal(dn);
   1515         assertEquals("CN=ABC\\\"DEF\\\"", principal
   1516                 .getName(X500Principal.RFC2253));
   1517     }
   1518 
   1519     /**
   1520      * Inits X500Principal with the string with special characters - ABC"DEF"
   1521      * gets Name in RFC1779 format
   1522      * compares with expected value of name - "ABCDEF"
   1523      */
   1524     public void testNameSpecialChars_RFC1779_03() throws Exception {
   1525         String dn = "CN=\"ABCDEF\"";
   1526         X500Principal principal = new X500Principal(dn);
   1527         String s = principal.getName(X500Principal.RFC1779);
   1528         assertEquals("CN=ABCDEF", s);
   1529 
   1530     }
   1531 
   1532     /**
   1533      * Inits X500Principal with the string with special characters - ABC"DEF"
   1534      * gets Name in RFC2253 format
   1535      * compares with expected value of name - ABC"DEF"
   1536      */
   1537     public void testNameSpecialChars_RFC2253_03() throws Exception {
   1538         String dn = "CN=\"ABCDEF\"";
   1539         X500Principal principal = new X500Principal(dn);
   1540         String s = principal.getName(X500Principal.RFC2253);
   1541         assertEquals("CN=ABCDEF", s);
   1542 
   1543     }
   1544 
   1545     /**
   1546      * Inits X500Principal with the string with special characters - ABC"DEF"
   1547      * gets Name in CANONICAL format
   1548      * compares with expected value of name - abc"def"
   1549      */
   1550     public void testNameSpecialChars_CANONICAL_03() throws Exception {
   1551         String dn = "CN=\"ABCDEF\"";
   1552         X500Principal principal = new X500Principal(dn);
   1553         String s = principal.getName(X500Principal.CANONICAL);
   1554         assertEquals("cn=abcdef", s);
   1555 
   1556     }
   1557 
   1558     /**
   1559      * Inits X500Principal with the string with special characters - ABC"D#EF"
   1560      * gets Name in RFC1779 format
   1561      * compares with expected value of name - "ABCD#EF"
   1562      */
   1563     public void testNameSpecialChars_RFC1779_04() throws Exception {
   1564         String dn = "CN=\"ABCD#EF\"";
   1565         X500Principal principal = new X500Principal(dn);
   1566         String s = principal.getName(X500Principal.RFC1779);
   1567         assertEquals("CN=\"ABCD#EF\"", s);
   1568 
   1569     }
   1570 
   1571     /**
   1572      * Inits X500Principal with the string with special characters - ABC"D#EF"
   1573      * gets Name in RFC1779 format
   1574      * compares with expected value of name - ABCD\#EF
   1575      */
   1576     public void testNameSpecialChars_RFC2253_04() throws Exception {
   1577         String dn = "CN=\"ABCD#EF\"";
   1578         X500Principal principal = new X500Principal(dn);
   1579         String s = principal.getName(X500Principal.RFC2253);
   1580         assertEquals("CN=ABCD\\#EF", s);
   1581 
   1582     }
   1583 
   1584     /**
   1585      * Inits X500Principal with the string with special characters - ABC"D#EF"
   1586      * gets Name in RFC1779 format
   1587      * compares with expected value of name - abc"d#ef"
   1588      */
   1589     public void testNameSpecialChars_CANONICAL_04() throws Exception {
   1590         String dn = "CN=\"ABCD#EF\"";
   1591         X500Principal principal = new X500Principal(dn);
   1592         String s = principal.getName(X500Principal.CANONICAL);
   1593         assertEquals("cn=abcd#ef", s);
   1594 
   1595     }
   1596 
   1597     /**
   1598      * Inits X500Principal with the string with special characters - X#YZ
   1599      * gets Name in RFC1779 format
   1600      * compares with expected value of name - "X#YZ"
   1601      */
   1602     public void testNameSpecialChars_RFC1779_05() {
   1603         String dn = "CN=X#YZ";
   1604         X500Principal principal = new X500Principal(dn);
   1605 
   1606         String s = principal.getName(X500Principal.RFC1779);
   1607         assertEquals("CN=\"X#YZ\"", s);
   1608 
   1609     }
   1610 
   1611     /**
   1612      * Inits X500Principal with the string with special characters - X#YZ
   1613      * gets Name in RFC2253 format
   1614      * compares with expected value of name - X\#YZ
   1615      */
   1616     public void testNameSpecialChars_RFC2253_05() {
   1617         String dn = "CN=X#YZ";
   1618         X500Principal principal = new X500Principal(dn);
   1619 
   1620         String s = principal.getName(X500Principal.RFC2253);
   1621 
   1622         assertEquals("CN=X\\#YZ", s);
   1623 
   1624     }
   1625 
   1626     /**
   1627      * Inits X500Principal with the string with special characters - X#YZ
   1628      * gets Name in CANONICAL format
   1629      * compares with expected value of name - x#yz
   1630      */
   1631     public void testNameSpecialChars_CANONICAL_05() {
   1632         String dn = "CN=X#YZ";
   1633         X500Principal principal = new X500Principal(dn);
   1634 
   1635         String s = principal.getName(X500Principal.CANONICAL);
   1636         assertEquals("cn=x#yz", s);
   1637 
   1638     }
   1639 
   1640     /**
   1641      * Inits X500Principal with the string with special characters - CN=\#XYZ
   1642      * gets Name in RFC1779 format
   1643      * compares with expected value of name - CN="#XYZ"
   1644      */
   1645     public void testNameSpecialChars_RFC1779_6() throws Exception {
   1646         String dn = "CN=\\#XYZ";
   1647         X500Principal principal = new X500Principal(dn);
   1648         String s = principal.getName(X500Principal.RFC1779);
   1649         assertEquals("CN=\"#XYZ\"", s);
   1650 
   1651     }
   1652 
   1653     /**
   1654      * Inits X500Principal with the string with special characters - CN=\#XYZ
   1655      * gets Name in RFC2253 format
   1656      * compares with expected value of name - CN=\#XYZ
   1657      */
   1658     public void testNameSpecialChars_RFC2253_6() throws Exception {
   1659         String dn = "CN=\\#XYZ";
   1660         X500Principal principal = new X500Principal(dn);
   1661         String s = principal.getName(X500Principal.RFC2253);
   1662         assertEquals("CN=\\#XYZ", s);
   1663     }
   1664 
   1665     /**
   1666      * Inits X500Principal with the string with special characters - CN=\#XYZ
   1667      * gets Name in CANONICAL format
   1668      * compares with expected value of name - cn=\#xyz
   1669      */
   1670     public void testNameSpecialChars_CANONICAL_6() throws Exception {
   1671         String dn = "CN=\\#XYZ";
   1672         X500Principal principal = new X500Principal(dn);
   1673         String s = principal.getName(X500Principal.CANONICAL);
   1674         assertEquals("cn=\\#xyz", s);
   1675     }
   1676 
   1677     /**
   1678      * Inits X500Principal with the string with special characters - B\'space'
   1679      * gets Name in RFC1779 format
   1680      * compares with expected value of name - "B "
   1681      */
   1682     public void testNameSpaces_RFC1779() throws Exception {
   1683         String dn = "CN=A,CN=B\\ ";
   1684         X500Principal principal = new X500Principal(dn);
   1685         String s = principal.getName(X500Principal.RFC1779);
   1686         assertEquals("CN=A, CN=\"B \"", s);
   1687 
   1688     }
   1689 
   1690     /**
   1691      * Inits X500Principal with the string with special characters - B\'space'
   1692      * gets Name in RFC2253 format
   1693      * compares with expected value of name - B\'space'
   1694      */
   1695     public void testNameSpaces_RFC2253() throws Exception {
   1696         String dn = "CN=A,CN=B\\ ";
   1697         X500Principal principal = new X500Principal(dn);
   1698         String s = principal.getName(X500Principal.RFC2253);
   1699         assertEquals("CN=A,CN=B\\ ", s);
   1700 
   1701     }
   1702 
   1703     /**
   1704      * Inits X500Principal with the string with special characters - B\'space'
   1705      * gets Name in CANONICAL format
   1706      * compares with expected value of name - B\
   1707      */
   1708     public void testNameSpaces_CANONICAL() throws Exception {
   1709         String dn = "CN=A,CN=B\\ ";
   1710         X500Principal principal = new X500Principal(dn);
   1711         String s = principal.getName(X500Principal.CANONICAL);
   1712         assertEquals("cn=a,cn=b", s);
   1713 
   1714     }
   1715 
   1716     /**
   1717      * Inits X500Principal with the string with special characters - "B'space''space''space'A"
   1718      * gets Name in RFC1779 format
   1719      * compares with expected value of name - "B   A"
   1720      */
   1721     public void testNameSpaces_RFC1779_01() throws Exception {
   1722         String dn = "CN=\"B   A\"";
   1723         X500Principal principal = new X500Principal(dn);
   1724         String s = principal.getName(X500Principal.RFC1779);
   1725         assertEquals("CN=B   A", s);
   1726 
   1727     }
   1728 
   1729     /**
   1730      * Inits X500Principal with the string with special characters - "B'space''space''space'A"
   1731      * gets Name in 2253 format
   1732      * compares with expected value of name - B'space''space''space'A
   1733      */
   1734     public void testNameSpaces_RFC2253_01() throws Exception {
   1735         String dn = "CN=\"B   A\"";
   1736         X500Principal principal = new X500Principal(dn);
   1737         String s = principal.getName(X500Principal.RFC2253);
   1738         assertEquals("CN=B   A", s);
   1739 
   1740     }
   1741 
   1742     /**
   1743      * Inits X500Principal with the string with special characters - "B'space''space''space'A"
   1744      * gets Name in CANONICAL format
   1745      * compares with expected value of name - b'space'a
   1746      */
   1747     public void testNameSpaces_CANONICAL_01() throws Exception {
   1748         String dn = "CN=\"B   A\"";
   1749         X500Principal principal = new X500Principal(dn);
   1750         String s = principal.getName(X500Principal.CANONICAL);
   1751         assertEquals("cn=b a", s);
   1752 
   1753     }
   1754 
   1755     /**
   1756      * Inits X500Principal with the string with special characters - \\'space''space'B
   1757      * gets Name in RFC1779 format
   1758      * compares with expected value of name - "  B"
   1759      */
   1760     public void testNameSpaces_RFC1779_02() throws Exception {
   1761         String dn = "CN=\\  B";
   1762         X500Principal principal = new X500Principal(dn);
   1763         String s = principal.getName(X500Principal.RFC1779);
   1764         assertEquals("CN=\"  B\"", s);
   1765 
   1766     }
   1767 
   1768     /**
   1769      * Inits X500Principal with the string with special characters - \\'space''space'B
   1770      * gets Name in RFC1779 format
   1771      * compares with expected value of name - \'space''space'B
   1772      */
   1773     public void testNameSpaces_RFC2253_02() throws Exception {
   1774         String dn = "CN=\\  B";
   1775         X500Principal principal = new X500Principal(dn);
   1776         String s = principal.getName(X500Principal.RFC2253);
   1777         assertEquals("CN=\\  B", s);
   1778 
   1779     }
   1780 
   1781     /**
   1782      * Inits X500Principal with the string with special characters - \\'space''space'B
   1783      * gets Name in CANONICAL format
   1784      * compares with expected value of name - \'space''space'b
   1785      */
   1786     public void testNameSpaces_CANONICAL_02() throws Exception {
   1787         String dn = "CN=\\  B";
   1788         X500Principal principal = new X500Principal(dn);
   1789         String s = principal.getName(X500Principal.CANONICAL);
   1790         assertEquals("cn=b", s);
   1791 
   1792     }
   1793 
   1794     /**
   1795      * Inits X500Principal with the string with special characters - ""B
   1796      * checks if the proper exception is thrown
   1797      */
   1798     public void testNameQu() throws Exception {
   1799         String dn = "CN=\"\"B";
   1800         try {
   1801             new X500Principal(dn);
   1802             fail("No IllegalArgumentException on improper string");
   1803         } catch (IllegalArgumentException e) {
   1804         }
   1805     }
   1806 
   1807     /**
   1808      * Inits X500Principal with the string with special characters - "A\"B"
   1809      * gets Name in RFC1779 format
   1810      * compares with expected value of name - "A\"B"
   1811      */
   1812     public void testNameQu_RFC1779_2() throws Exception {
   1813         String dn = "CN=\"A\\\"B\"";
   1814         X500Principal principal = new X500Principal(dn);
   1815         String s = principal.getName(X500Principal.RFC1779);
   1816         assertEquals("CN=\"A\\\"B\"", s);
   1817     }
   1818 
   1819     /**
   1820      * Inits X500Principal with the string with special characters - "A\"B"
   1821      * gets Name in RFC2253 format
   1822      * compares with expected value of name - A\"B
   1823      */
   1824     public void testNameQu_RFC2253_2() throws Exception {
   1825         String dn = "CN=\"A\\\"B\"";
   1826         X500Principal principal = new X500Principal(dn);
   1827         String s = principal.getName(X500Principal.RFC2253);
   1828         assertEquals("CN=A\\\"B", s);
   1829     }
   1830 
   1831     /**
   1832      * Inits X500Principal with the string with special characters - "A\"B"
   1833      * gets Name in CANONICAL format
   1834      * compares with expected value of name - a\"b
   1835      */
   1836     public void testNameQu_CANONICAL_2() throws Exception {
   1837         String dn = "CN=\"A\\\"B\"";
   1838         X500Principal principal = new X500Principal(dn);
   1839         String s = principal.getName(X500Principal.CANONICAL);
   1840         assertEquals("cn=a\\\"b", s);
   1841 
   1842     }
   1843 
   1844     /**
   1845      * Inits X500Principal with the string with special characters - "A\""
   1846      * gets Name in RFC1779 format
   1847      * compares with expected value of name - "A\""
   1848      */
   1849     public void testNameQu_RFC1779_3() throws Exception {
   1850         String dn = "CN=\"A\\\"\"";
   1851         X500Principal principal = new X500Principal(dn);
   1852         String s = principal.getName(X500Principal.RFC1779);
   1853         assertEquals("CN=\"A\\\"\"", s);
   1854     }
   1855 
   1856     /**
   1857      * Inits X500Principal with the string with special characters - "A\""
   1858      * gets Name in RFC2253 format
   1859      * compares with expected value of name - A\"
   1860      */
   1861     public void testNameQu_RFC2253_3() throws Exception {
   1862         String dn = "CN=\"A\\\"\"";
   1863         X500Principal principal = new X500Principal(dn);
   1864         String s = principal.getName(X500Principal.RFC2253);
   1865         assertEquals("CN=A\\\"", s);
   1866     }
   1867 
   1868     /**
   1869      * Inits X500Principal with the string with special characters - "A\""
   1870      * gets Name in CANONICAL format
   1871      * compares with expected value of name - A\"
   1872      */
   1873     public void testNameQu_CANONICAL_3() throws Exception {
   1874         String dn = "CN=\"A\\\"\"";
   1875         X500Principal principal = new X500Principal(dn);
   1876         String s = principal.getName(X500Principal.CANONICAL);
   1877         assertEquals("cn=a\\\"", s);
   1878 
   1879     }
   1880 
   1881     /**
   1882      * Inits X500Principal with the string with special characters - "A\", C=B"
   1883      * gets Name in RFC1779 format
   1884      * compares with expected value of name - "A\", C=B"
   1885      */
   1886     public void testNameQu_4() throws Exception {
   1887         String dn = "CN=\"A\\\", C=B\"";
   1888         X500Principal principal = new X500Principal(dn);
   1889         String s = principal.getName(X500Principal.RFC1779);
   1890         assertEquals("CN=\"A\\\", C=B\"", s);
   1891 
   1892     }
   1893 
   1894     /**
   1895      * Inits X500Principal with the string with special characters - CN="A\\", C=B
   1896      * gets Name in RFC1779 format
   1897      * compares with expected value of name - CN="A\\", C=B
   1898      */
   1899     public void testNameQu_5() throws Exception {
   1900         String dn = "CN=\"A\\\\\", C=B";
   1901         X500Principal principal = new X500Principal(dn);
   1902         String s = principal.getName(X500Principal.RFC1779);
   1903         assertEquals("CN=\"A\\\\\", C=B", s);
   1904 
   1905     }
   1906 
   1907     /**
   1908      * Inits X500Principal with the string with special characters - CN=A\nB
   1909      * gets Name in RFC1779 format
   1910      * compares with expected value of name - CN="A\nB"
   1911      */
   1912     public void testNameCR_RFC1779() throws Exception {
   1913         String dn = "CN=A\nB";
   1914         X500Principal principal = new X500Principal(dn);
   1915         String s = principal.getName(X500Principal.RFC1779);
   1916         assertEquals("CN=A\nB", s);
   1917     }
   1918 
   1919     /**
   1920      * Inits X500Principal with the string with special characters - CN=A\nB
   1921      * gets Name in RFC2253 format
   1922      * compares with expected value of name - CN=A\nB
   1923      */
   1924     public void testNameCR_RFC2253() throws Exception {
   1925         String dn = "CN=A\nB";
   1926         X500Principal principal = new X500Principal(dn);
   1927         String s = principal.getName(X500Principal.RFC2253);
   1928         assertEquals("CN=A\nB", s);
   1929     }
   1930 
   1931     /**
   1932      * Inits X500Principal with the string with special characters - CN=A\nB
   1933      * gets Name in CANONICAL format
   1934      * compares with expected value of name - cn=a\nb
   1935      */
   1936     public void testNameCR_CANONICAL() throws Exception {
   1937         String dn = "CN=A\nB";
   1938         X500Principal principal = new X500Principal(dn);
   1939         String s = principal.getName(X500Principal.CANONICAL);
   1940         assertEquals("cn=a\nb", s);
   1941     }
   1942 
   1943     public static final String[] RFC2253_SPECIAL = new String[] { ",", "=",
   1944             "+", "<", ">", "#", ";" };
   1945 
   1946     public void testValidDN() throws Exception {
   1947 
   1948         TestList list = new TestList();
   1949 
   1950         list.add("", "", "", "", new byte[] { 0x30, 0x00 }); // empty RDN sequence
   1951 
   1952         // sequence of RDN: RDN *("," RDN)
   1953         list.add("CN=A,C=B", "CN=A,C=B", "CN=A, C=B", "cn=a,c=b");
   1954         list.add("C=B,CN=A", "C=B,CN=A", "C=B, CN=A", "c=b,cn=a");
   1955         list.add("CN=A,CN=A", "CN=A,CN=A", "CN=A, CN=A", "cn=a,cn=a"); // duplicate RDNs
   1956 
   1957         // sequence of RDN: RFC 1779 compatibility
   1958         list.add("CN=A , C=B", "CN=A,C=B", "CN=A, C=B");
   1959         list.add("CN=A  ,  C=B", "CN=A,C=B", "CN=A, C=B");
   1960         list.add("CN=A;C=B", "CN=A,C=B", "CN=A, C=B");
   1961         list.add("CN=A ; C=B", "CN=A,C=B", "CN=A, C=B");
   1962         //FIXME list.add("CN=A\r,\rC=B", "CN=A,C=B"); // <CR> & comma => comma
   1963         list.add("  CN=A,C=B  ", "CN=A,C=B", "CN=A, C=B"); // spaces at beg&end
   1964         list.add("  CN=A,C=\"B\"  ", "CN=A,C=B", "CN=A, C=B"); // spaces at beg&end
   1965 
   1966         // set of ATAV: ATAV *("+" ATAV)
   1967         list.add("CN=A+ST=CA", "CN=A+ST=CA", "CN=A + ST=CA", "cn=a+st=ca");
   1968         list.add("CN=A+CN=A", "CN=A+CN=A", "CN=A + CN=A", "cn=a+cn=a"); // duplicate AT
   1969         list
   1970                 .add("2.5.4.3=A+2.5.4.3=A", "CN=A+CN=A", "CN=A + CN=A",
   1971                         "cn=a+cn=a"); // duplicate AT
   1972 
   1973         // set of ATAV: RFC 1779 compatibility
   1974         list.add("CN=A + ST=CA", "CN=A+ST=CA", "CN=A + ST=CA");
   1975         list.add("CN=A  +  ST=CA", "CN=A+ST=CA", "CN=A + ST=CA");
   1976         //FIXME list.add("CN=A\r+\rST=CA", "CN=A+ST=CA"); // <CR> & '+' => '+'
   1977 
   1978         // ATAV = AttributeType "=" AttributeValue
   1979         list.add("CN=A", "CN=A", "CN=A");
   1980         list.add("cn=A", "CN=A", "CN=A"); // AT case insensitive
   1981         list.add("cN=A", "CN=A", "CN=A"); // AT case insensitive
   1982         list.add("cn=a", "CN=a", "CN=a"); // AT case insensitive
   1983 
   1984         // ATAV : RFC 1779 compatibility
   1985         list.add("CN = A", "CN=A", "CN=A");
   1986         list.add("CN  =  A", "CN=A", "CN=A");
   1987         // FIXME list.add("CN\r=\rA", "CN=A"); // <CR> & '=' => '='
   1988 
   1989         // AttributeType = <name string> | <OID>
   1990         // testing OID case :  OID => <name string>
   1991         // tested all OIDs from RFC 2253 (2.3) and RFC 1779 (Table 1)
   1992 
   1993         // different variants of 2.5.4.3 (CN) OID
   1994         list.add("OID.2.5.4.3=A", "CN=A", "CN=A");
   1995         list.add("oid.2.5.4.3=A", "CN=A", "CN=A");
   1996         list.add("2.5.4.3=A", "CN=A", "CN=A");
   1997         list.add("02.5.4.3=A", "CN=A", "CN=A"); // first: 02 => 2
   1998         list.add("2.5.4.0003=A", "CN=A", "CN=A"); // last: 0003 => 3
   1999 
   2000         // the rest of OIDs
   2001         list.add("2.5.4.7=A", "L=A", "L=A", "l=a");
   2002         list.add("2.5.4.8=A", "ST=A", "ST=A", "st=a");
   2003         list.add("2.5.4.10=A", "O=A", "O=A", "o=a");
   2004         list.add("2.5.4.11=A", "OU=A", "OU=A", "ou=a");
   2005         list.add("2.5.4.6=A", "C=A", "C=A", "c=a");
   2006         list.add("2.5.4.9=A", "STREET=A", "STREET=A", "street=a");
   2007         list.add("0.9.2342.19200300.100.1.25=A", "DC=A",
   2008                 "OID.0.9.2342.19200300.100.1.25=A", "dc=a");
   2009         list.add("0.9.2342.19200300.100.1.1=A", "UID=A",
   2010                 "OID.0.9.2342.19200300.100.1.1=A", "uid=a");
   2011 
   2012         // attribute types from RFC 2459 (see Appendix A)
   2013         // keywords are from the API spec
   2014         list.add("T=A", "2.5.4.12=#130141", "OID.2.5.4.12=A",
   2015                 "2.5.4.12=#130141");
   2016         list.add("DNQ=A", "2.5.4.46=#130141", "OID.2.5.4.46=A",
   2017                 "2.5.4.46=#130141");
   2018         list.add("DNQUALIFIER=A", "2.5.4.46=#130141", "OID.2.5.4.46=A",
   2019                 "2.5.4.46=#130141");
   2020         list.add("SURNAME=A", "2.5.4.4=#130141", "OID.2.5.4.4=A",
   2021                 "2.5.4.4=#130141");
   2022         list.add("GIVENNAME=A", "2.5.4.42=#130141", "OID.2.5.4.42=A",
   2023                 "2.5.4.42=#130141");
   2024         list.add("INITIALS=A", "2.5.4.43=#130141", "OID.2.5.4.43=A",
   2025                 "2.5.4.43=#130141");
   2026         list.add("GENERATION=A", "2.5.4.44=#130141", "OID.2.5.4.44=A",
   2027                 "2.5.4.44=#130141");
   2028         list.add("EMAILADDRESS=A", "1.2.840.113549.1.9.1=#130141",
   2029                 "OID.1.2.840.113549.1.9.1=A", "1.2.840.113549.1.9.1=#130141",
   2030                 null, (byte) 0x05); //FIXME bug???
   2031         list.add("SERIALNUMBER=A", "2.5.4.5=#130141", "OID.2.5.4.5=A",
   2032                 "2.5.4.5=#130141");
   2033 
   2034         // AttributeValue => BER encoding (if OID in dotted-decimal form)
   2035         // see RFC 2253 (2.4)
   2036         list.add("OID.2.5.4.12=A", "2.5.4.12=#130141", "OID.2.5.4.12=A");
   2037         list.add("oid.2.5.4.12=A", "2.5.4.12=#130141", "OID.2.5.4.12=A");
   2038         list.add("2.5.4.12=A", "2.5.4.12=#130141", "OID.2.5.4.12=A");
   2039         list.add("1.1=A", "1.1=#130141", "OID.1.1=A");
   2040 
   2041         //
   2042         // AttributeValue first alternative : *( stringchar / pair )
   2043         // testing pair characters.
   2044         //
   2045         // Note: for RFC1779 quoted string is returned (unspecified)
   2046         //
   2047         list.add("CN=", "CN=", "CN="); // zero string chars
   2048         list.add("CN= ", "CN=", "CN="); // zero string chars
   2049         list.add("CN=A+ST=", "CN=A+ST=", "CN=A + ST="); // zero string chars
   2050         list.add("CN=+ST=A", "CN=+ST=A", "CN= + ST=A"); // empty value for 1 RDN
   2051         list.add("CN=A+ST= ", "CN=A+ST=", "CN=A + ST="); // empty value for 1 RDN
   2052         list.add("CN=+ST=", "CN=+ST=", "CN= + ST="); // empty value for both RDNs
   2053         list.add("CN=,ST=B", "CN=,ST=B", "CN=, ST=B"); // empty value for 1 RDN
   2054         list.add("CN=,ST=", "CN=,ST=", "CN=, ST="); // empty value for both RDNs
   2055         list.add("CN=;ST=B", "CN=,ST=B", "CN=, ST=B"); // empty value for 1 RDN
   2056         list.add("CN=;ST=", "CN=,ST=", "CN=, ST="); // empty value for both RDNs
   2057         for (String element : RFC2253_SPECIAL) {
   2058             // \special
   2059             list.add("CN=\\" + element,
   2060                     "CN=\\" + element, "CN=\"" + element
   2061                             + "\"");
   2062 
   2063             // A + \special + B
   2064             list.add("CN=A\\" + element + "B", "CN=A\\"
   2065                     + element + "B", "CN=\"A" + element
   2066                     + "B\"");
   2067         }
   2068 
   2069         // pair = \"
   2070         list.add("CN=\\\"", "CN=\\\"", "CN=\"\\\"\"", null, (byte) 0x02);
   2071         list.add("CN=\\\"A", "CN=\\\"A", "CN=\"\\\"A\"", null, (byte) 0x02);
   2072         list.add("CN=\\\",C=\\\"", "CN=\\\",C=\\\"", "CN=\"\\\"\", C=\"\\\"\"",
   2073                 null, (byte) 0x02); // 2 RDN
   2074         list.add("CN=A\\\"B", "CN=A\\\"B", "CN=\"A\\\"B\"", null, (byte) 0x02); // A\"B
   2075         list.add("CN=A ST=B", "CN=A ST\\=B", "CN=\"A ST=B\""); // no RDN separator
   2076 
   2077         // pair = \space
   2078         list.add("CN=\\ ", "CN=\\ ", "CN=\" \"", "cn=");
   2079 
   2080         // pair = \hexpair
   2081         list.add("CN=\\41", "CN=A", "CN=A"); // 0x41=='A'
   2082         list.add("CN=\\41\\2C", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2C=','
   2083         list.add("CN=\\41\\2c", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2c=','
   2084         list.add("CN=\\D0\\AF", "CN=" + ((char) 1071), "CN=" + ((char) 1071),
   2085                 new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2086                         0x55, 0x04, 0x03,
   2087                         // UTF8 String
   2088                         0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // 0xD0AF == the last letter(capital) of Russian alphabet
   2089         list.add("CN=\\D0\\AFA\\41", "CN=" + ((char) 1071) + "AA", "CN="
   2090                 + ((char) 1071) + "AA", new byte[] { 0x30, 0x0F, 0x31, 0x0D,
   2091                 0x30, 0x0B, 0x06, 0x03, 0x55, 0x04, 0x03,
   2092                 // UTF8 String
   2093                 0x0C, 0x04, (byte) 0xD0, (byte) 0xAF, 0x41, 0x41 }); // 0xD0AF == the last letter(capital) of Russian alphabet
   2094         // UTF-8(0xE090AF) is non-shortest form of UTF-8(0xD0AF)
   2095         //FIXME list.add("CN=\\E0\\90\\AF", "CN=" + ((char) 1071), "CN="
   2096         //        + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
   2097         //        0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
   2098         //        // UTF8 String
   2099         //        0x0C, 0x02, (byte) 0xD0, (byte) 0xAF });
   2100         // UTF-8(0xF08090AF) is non-shortest form of UTF-8(0xD0AF)
   2101         //FIXME list.add("CN=\\F0\\80\\90\\AF", "CN=" + ((char) 1071), "CN="
   2102         //        + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
   2103         //        0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
   2104         //        // UTF8 String
   2105         //        0x0C, 0x02, (byte) 0xD0, (byte) 0xAF });
   2106         //FIXME        list.add("CN=\\D0", "CN=" + ((char) 65533), "CN=" + ((char) 65533),
   2107         //                new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2108         //                        0x55, 0x04, 0x03,
   2109         //                        // UTF8 String
   2110         //                        0x0C, 0x01, 0x3F }); // 0xD0 is not correct UTF8 char => '?'
   2111         list.add("CN=\\41+ST=A", "CN=A+ST=A", "CN=A + ST=A"); // 0x41=='A'
   2112         list.add("CN=\\41\\2C+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2C=','
   2113         list.add("CN=\\41\\2c+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2c=','
   2114 
   2115         // stringchar '=' or not leading '#'
   2116         //FIXME RFC 2253 grammar violation: '=' and '#' is a special char
   2117         list.add("CN==", "CN=\\=", "CN=\"=\"");
   2118         list.add("CN=A=", "CN=A\\=", "CN=\"A=\"");
   2119         list.add("CN=A#", "CN=A\\#", "CN=\"A#\"");
   2120 
   2121         // not leading or trailing spaces
   2122         list.add("CN=A B", "CN=A B", "CN=A B", "cn=a b");
   2123         list.add("CN=A\\ B", "CN=A B", "CN=A B", "cn=a b");
   2124         list.add("CN=A \\,B", "CN=A \\,B", "CN=\"A ,B\"", "cn=a \\,b");
   2125 
   2126         //not alphabet chars
   2127         list.add("CN=$", "CN=$", "CN=$", new byte[] { 0x30, 0x0C, 0x31, 0x0A,
   2128                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
   2129                 //UTF-8 String: "$"
   2130                 0x0C, 0x01, 0x24 });
   2131         list.add("CN=(", "CN=(", "CN=(", new byte[] { 0x30, 0x0C, 0x31, 0x0A,
   2132                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
   2133                 //PrintableString: "("
   2134                 0x13, 0x01, 0x28 });
   2135 
   2136         //
   2137         //
   2138         // AttributeValue second alternative : "#" hexstring
   2139         //
   2140         //
   2141         list.add("CN=#130141", "CN=A", "CN=A", "cn=a"); // ASN1 Printable hex string = 'A'
   2142         list.add("CN=#140141", "CN=A", "CN=A", "cn=#140141", new byte[] { 0x30,
   2143                 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
   2144                 0x14, 0x01, 0x41 }); // ASN1 Teletex hex string = 'A'
   2145 
   2146         list.add("CN=#010100", "CN=#010100", "CN=#010100", "cn=#010100"); // ASN1 Boolean = FALSE
   2147         list.add("CN=#0101fF", "CN=#0101ff", "CN=#0101FF", "cn=#0101ff"); // ASN1 Boolean = TRUE
   2148         //FIXME list.add("CN=#3000", "CN=#3000", "CN=#3000"); // ASN1 Sequence
   2149         //FIXME list.add("CN=#0500", "CN=A", "CN=A"); // ASN1 Null
   2150         list.add("CN= #0101fF", "CN=#0101ff", "CN=#0101FF", // space at beginning
   2151                 new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2152                         0x55, 0x04, 0x03, 0x01, 0x01, (byte) 0xFF } // ASN.1 Boolean = TRUE
   2153                 );
   2154         list.add("CN= #0101fF+ST=A", "CN=#0101ff+ST=A", "CN=#0101FF + ST=A",
   2155                 "cn=#0101ff+st=a"); //space
   2156         list.add("CN= #0101fF ", "CN=#0101ff", "CN=#0101FF", // space at the end
   2157                 new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2158                         0x55, 0x04, 0x03, 0x01, 0x01, (byte) 0xFF } // ASN.1 Boolean = TRUE
   2159                 , (byte) 0x00);
   2160 
   2161         //FIXME unspecified output for RFC1779
   2162         //FIXME list.add("CN=#1C0141", "CN=A", "CN=A"); // ASN1 Universal hex string = 'A'
   2163         //FIXME list.add("CN=#1E0141", "CN=A", "CN=A"); // ASN1 Bmp hex string = 'A'
   2164 
   2165         //
   2166         // AttributeValue third alternative : " *( quotechar / pair ) "
   2167         // quotechar = <any character except '\' or '"' >
   2168         //
   2169         // Note:
   2170         // RFC2253: passed quoted AV string is unquoted, special chars are escaped
   2171         // RFC1779: escaped quoted chars are unescaped
   2172         //
   2173         list.add("CN=\"\"", "CN=", "CN="); // empty quoted string
   2174         list.add("CN=\"A\"", "CN=A", "CN=A"); // "A"
   2175         for (String element : RFC2253_SPECIAL) {
   2176             // "special" => \special
   2177             list.add("CN=\"" + element + "\"", "CN=\\"
   2178                     + element, "CN=\"" + element + "\"");
   2179 
   2180             // "A + special + B" => A + \special + B
   2181             list.add("CN=\"A" + element + "B\"", "CN=A\\"
   2182                     + element + "B", "CN=\"A" + element
   2183                     + "B\"");
   2184         }
   2185         for (String element : RFC2253_SPECIAL) {
   2186             // "\special" => \special
   2187             list.add("CN=\"\\" + element + "\"", "CN=\\"
   2188                     + element, "CN=\"" + element + "\"");
   2189 
   2190             // "A + \special + B" => A + \special + B
   2191             list.add("CN=\"A\\" + element + "B\"", "CN=A\\"
   2192                     + element + "B", "CN=\"A" + element
   2193                     + "B\"");
   2194         }
   2195         list.add("CN=\"\\\"\"", "CN=\\\"", "CN=\"\\\"\"", null, (byte) 0x02); // "\""
   2196         list.add("CN=\"A\\\"B\"", "CN=A\\\"B", "CN=\"A\\\"B\"", null,
   2197                 (byte) 0x02); // "A\"B"
   2198 
   2199         // pair = \hexpair (test cases are the same as for the first alternative)
   2200         list.add("CN=\"\\41\"", "CN=A", "CN=A"); // 0x41=='A'
   2201         list.add("CN=\"\\41\\2C\"", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2C=','
   2202         list.add("CN=\"\\41\\2c\"", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2c=','
   2203         list.add("CN=\"\\D0\\AF\"", "CN=" + ((char) 1071), "CN="
   2204                 + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
   2205                 0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
   2206                 // UTF8 String
   2207                 0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // 0xD0AF == the last letter(capital) of Russian alphabet
   2208         list.add("CN=\"\\D0\\AFA\\41\"", "CN=" + ((char) 1071) + "AA", "CN="
   2209                 + ((char) 1071) + "AA", new byte[] { 0x30, 0x0F, 0x31, 0x0D,
   2210                 0x30, 0x0B, 0x06, 0x03, 0x55, 0x04, 0x03,
   2211                 // UTF8 String
   2212                 0x0C, 0x04, (byte) 0xD0, (byte) 0xAF, 0x41, 0x41 }); // 0xD0AF == the last letter(capital) of Russian alphabet
   2213         list.add("CN=\"\\E0\\90\\AF\"", "CN=" + ((char) 1071), "CN="
   2214                 + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
   2215                 0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
   2216                 // UTF8 String
   2217                 0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // UTF8(0xE090AF that is not quite correct)== UTF8(0xD0AF) == the last letter(capital) of Russian alphabet
   2218         list.add("CN=\"\\F0\\80\\90\\AF\"", "CN=" + ((char) 1071), "CN="
   2219                 + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
   2220                 0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
   2221                 // UTF8 String
   2222                 0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // UTF8(0xF08090AF that is not quite correct)== UTF8(0xD0AF) == the last letter(capital) of Russian alphabet
   2223 
   2224         list.add("CN=\"\\41\"+ST=A", "CN=A+ST=A", "CN=A + ST=A"); // 0x41=='A'
   2225         list.add("CN=\"\\41\\2C\"+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2C=','
   2226         list.add("CN=\"\\41\\2c\"+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2c=','
   2227 
   2228         // AttributeValue third alternative : RFC 1779 compatibility
   2229         //FIXME list.add("CN=\"\r\"", "CN=\"\r\""); // "<CR>"
   2230         //FIXME list.add("CN=\"\\\r\"", "CN=\"\\\r\""); // "\<CR>"
   2231 
   2232         // AttributeValue : RFC 1779 compatibility
   2233         list.add("CN=  A  ", "CN=A", "CN=A", "cn=a"); // leading & trailing spaces
   2234         list.add("CN=\\  A  ", "CN=\\  A", "CN=\"  A\"", "cn=a", null,
   2235                 (byte) 0x01); // escaped leading space
   2236         list.add("CN=  A \\ ", "CN=A \\ ", "CN=\"A  \"", "cn=a", null,
   2237                 (byte) 0x01); // escaped trailing space
   2238 
   2239         list.add("CN=  \"A\"  ", "CN=A", "CN=A", "cn=a"); // leading & trailing spaces
   2240 
   2241         StringBuffer errorMsg = new StringBuffer();
   2242         for (int i = 0; i < list.size(); i++) {
   2243 
   2244             Object[] obj = list.get(i);
   2245 
   2246             String dn = (String) obj[0];
   2247             String rfc2253 = (String) obj[1];
   2248             String rfc1779 = (String) obj[2];
   2249             String canonical = (String) obj[3];
   2250             byte[] encoded = (byte[]) obj[4];
   2251             byte mask = ((byte[]) obj[5])[0];
   2252 
   2253             try {
   2254                 X500Principal p = new X500Principal(dn);
   2255                 if (!rfc2253.equals(p.getName(X500Principal.RFC2253))) {
   2256                     if (!testing || ((mask & 0x01) == 0)) {
   2257 
   2258                         errorMsg.append("RFC2253: " + i);
   2259                         errorMsg.append("\tparm: '" + dn + "'");
   2260                         errorMsg.append("\t\texpected: '" + rfc2253 + "'");
   2261                         errorMsg.append("\treturned: '"
   2262                                 + p.getName(X500Principal.RFC2253) + "'\n");
   2263                     }
   2264                 }
   2265 
   2266                 if (!rfc1779.equals(p.getName(X500Principal.RFC1779))) {
   2267                     if (!testing || ((mask & 0x02) == 0)) {
   2268 
   2269                         errorMsg.append("RFC1779: " + i);
   2270                         errorMsg.append("\tparm: '" + dn + "'");
   2271                         errorMsg.append("\t\texpected: " + rfc1779 + "'");
   2272                         errorMsg.append("\treturned: '"
   2273                                 + p.getName(X500Principal.RFC1779) + "'\n");
   2274                     }
   2275                 }
   2276 
   2277                 if (canonical != null) {
   2278                     if (!canonical.equals(p.getName(X500Principal.CANONICAL))) {
   2279                         if (!testing || ((mask & 0x04) == 0)) {
   2280 
   2281                             errorMsg.append("CANONICAL: " + i);
   2282                             errorMsg.append("\tparm: '" + dn + "'");
   2283                             errorMsg.append("\t\texpected: " + canonical + "'");
   2284                             errorMsg.append("\treturned: '"
   2285                                     + p.getName(X500Principal.CANONICAL)
   2286                                     + "'\n");
   2287                         }
   2288                     }
   2289                 }
   2290 
   2291                 if (encoded != null) {
   2292                     if (!Arrays.equals(encoded, p.getEncoded())) {
   2293                         if (!testing || ((mask & 0x08) == 0)) {
   2294 
   2295                             errorMsg.append("Unexpected encoding for: " + i
   2296                                     + ", dn= '" + dn + "'\n");
   2297 
   2298                             System.out.println("\nI " + i);
   2299                             byte[] enc = p.getEncoded();
   2300                             for (byte element : enc) {
   2301                                 System.out.print(", 0x"
   2302                                         + Integer.toHexString(element));
   2303                             }
   2304                         }
   2305                     }
   2306                 }
   2307             } catch (IllegalArgumentException e) {
   2308                 errorMsg.append("IllegalArgumentException: " + i);
   2309                 errorMsg.append("\tparm: '" + dn + "'\n");
   2310             } catch (Exception e) {
   2311                 errorMsg.append("Exception: " + i);
   2312                 errorMsg.append("\tparm: '" + dn + "'");
   2313                 errorMsg.append("\texcep: " + e.getClass().getName() + "\n");
   2314             }
   2315         }
   2316 
   2317         if (errorMsg.length() != 0) {
   2318             fail(errorMsg.toString());
   2319         }
   2320 
   2321     }
   2322 
   2323     public void testInvalidDN() {
   2324         String[] illegalDN = new String[] {
   2325         // RDN
   2326                 //FIXME " ", // space only
   2327                 "CN", // attribute type only
   2328                 "CN=A;", // RFC 1779: BNF allows this, but ...
   2329                 "CN=A,", // RFC 1779: BNF allows this, but ...
   2330                 ",CN=A", // no AttributeType for first RDN
   2331                 "CN=,A", // no AttributeType for second RDN
   2332                 "CN=A+", // no AttributeTypeAndValue for second RDN
   2333                 "CN=#130141 ST=B", // no RDN separator
   2334 
   2335                 // AttributeType = <name string> | <OID>
   2336                 "AAA=A", // no such <name string>
   2337                 "1..1=A", // wrong OID
   2338                 ".1.1=A", // wrong OID
   2339                 "11=A", // wrong OID
   2340                 "1=A", // wrong OID
   2341                 "AID.1.1=A", // wrong OID
   2342                 "1.50=A", // wrong OID
   2343                 "5.1.0=A", // wrong OID
   2344                 "2.-5.4.3=A", // wrong OID
   2345                 "2.5.-4.3=A", // wrong OID
   2346                 "2.5.4-.3=A", // wrong OID
   2347                 //FIXME "2.5.4.-3=A", // wrong OID
   2348 
   2349                 // AttributeValue first alternative : *( stringchar / pair )
   2350                 "CN=,", // stringchar = ','
   2351                 //FIXME "CN==",
   2352                 "CN=+", // stringchar = '+'
   2353                 //FIXME "CN=<", // stringchar = '<'
   2354                 //FIXME "CN=>", // stringchar = '>'
   2355                 "CN=#", // stringchar = '#'
   2356                 //FIXME "CN=Z#", // stringchar = '#'
   2357                 "CN=;", // stringchar = ';'
   2358                 "CN=\"", // stringchar = "
   2359                 //FIXME "CN=A\"B", // stringchar = "
   2360                 "CN=\\", // stringchar = \
   2361                 "CN=A\\", // stringchar = \
   2362                 "CN=A\\B", // stringchar = \
   2363                 "CN=\\z", // invalid pair = \z
   2364                 "CN=\\4", // invalid pair = \4
   2365                 "CN=\\4Z", // invalid pair = \4Z
   2366                 "CN=\\4\\2c", // invalid pair = \4\2c
   2367 
   2368                 // AttributeValue second alternative : "#" hexstring
   2369                 "CN=#", // no hex string
   2370                 "CN=#2", // no hex pair
   2371                 "CN=#22", // hexpair is not BER encoding
   2372                 "CN=#0001", // invalid BER encoding (missed content)
   2373                 "CN=#000201", // invalid BER encoding (wrong length)
   2374                 "CN=#0002010101", // invalid BER encoding (wrong length)
   2375                 "CN=#00FF", // invalid BER encoding (wrong length)
   2376                 "CN=#ZZ", // not hex pair
   2377 
   2378                 // FIXME boolean with indefinite length
   2379                 //"CN=#0100010000", // invalid BER encoding (wrong length)
   2380 
   2381                 // AttributeValue third alternative : " *( quotechar / pair ) "
   2382                 "CN=\"A\" B", // TODO comment me
   2383                 "CN=\"A\\", // TODO comment me
   2384                 "CN=\"\\4\"", // invalid pair = \4
   2385                 "CN=\"\\4Z\"", // invalid pair = \4Z
   2386                 "CN=\"\\4\\2c\"", // invalid pair = \4\2c
   2387         };
   2388 
   2389         StringBuffer errorMsg = new StringBuffer();
   2390         for (String element : illegalDN) {
   2391 
   2392             try {
   2393                 new X500Principal(element);
   2394                 errorMsg.append("No IllegalArgumentException: '" + element
   2395                         + "'\n");
   2396             } catch (IllegalArgumentException e) {
   2397             }
   2398         }
   2399 
   2400         if (errorMsg.length() != 0) {
   2401             fail(errorMsg.toString());
   2402         }
   2403     }
   2404 
   2405     public void testValidEncoding() {
   2406         TestList list = new TestList();
   2407 
   2408         //
   2409         // Empty
   2410         //
   2411         list.add(new byte[] { 0x30, 0x00 }, "", "", "");
   2412         list.add(new byte[] { 0x30, 0x02, 0x31, 0x00 }, "", "", ""); //??? invalid size constraints
   2413 
   2414         //
   2415         // Known OID + string with different tags(all string)
   2416         //
   2417         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2418                 0x55, 0x04, 0x03,
   2419                 // PrintableString
   2420                 0x13, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
   2421         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2422                 0x55, 0x04, 0x03,
   2423                 // TeletexString
   2424                 0x14, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=#14015a");
   2425         //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2426         //                0x55, 0x04, 0x03,
   2427         //                // UniversalString
   2428         //                0x1C, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
   2429         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2430                 0x55, 0x04, 0x03,
   2431                 // UTF8String
   2432                 0x0C, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
   2433         //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2434         //                0x55, 0x04, 0x03,
   2435         //                // BMPString
   2436         //                0x1E, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
   2437 
   2438         //
   2439         // Unknown OID + string with different tags(all string)
   2440         //
   2441         list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2442                 0x00,
   2443                 // PrintableString
   2444                 0x13, 0x01, 0x5A }, "0.0=#13015a", "OID.0.0=Z", "0.0=#13015a");
   2445         list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2446                 0x00,
   2447                 // TeletexString
   2448                 0x14, 0x01, 0x5A }, "0.0=#14015a", "OID.0.0=Z", "0.0=#14015a");
   2449         //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2450         //                0x00,
   2451         //                // UniversalString
   2452         //                0x1C, 0x01, 0x5A }, "0.0=#1c015a", "OID.0.0=Z", "cn=z");
   2453         list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2454                 0x00,
   2455                 // UTF8String
   2456                 0x0C, 0x01, 0x5A }, "0.0=#0c015a", "OID.0.0=Z", "0.0=#0c015a");
   2457         //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2458         //                0x00,
   2459         //                // BMPString
   2460         //                0x1E, 0x01, 0x5A }, "0.0=#1e015a", "OID.0.0=Z", "cn=z");
   2461 
   2462         //
   2463         // Known OID + not a string value
   2464         //
   2465         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2466                 0x55, 0x04, 0x03,
   2467                 // Boolean
   2468                 0x01, 0x01, (byte) 0xFF }, "CN=#0101ff", "CN=#0101FF",
   2469                 "cn=#0101ff");
   2470         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2471                 0x55, 0x04, 0x03,
   2472                 // Integer
   2473                 0x02, 0x01, 0x0F }, "CN=#02010f", "CN=#02010F", "cn=#02010f");
   2474         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2475                 0x55, 0x04, 0x03,
   2476                 // BitString
   2477                 0x03, 0x01, 0x00 }, "CN=#030100", "CN=#030100", "cn=#030100");
   2478         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2479                 0x55, 0x04, 0x03,
   2480                 // SEQUENCE
   2481                 0x30, 0x01, 0x0A }, "CN=#30010a", "CN=#30010A", "cn=#30010a");
   2482 
   2483         //
   2484         // unknown OID + not a string value
   2485         //
   2486         list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2487                 0x00,
   2488                 // Boolean
   2489                 0x01, 0x01, (byte) 0xFF }, "0.0=#0101ff", "OID.0.0=#0101FF",
   2490                 "0.0=#0101ff");
   2491         list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2492                 0x00,
   2493                 // Integer
   2494                 0x02, 0x01, 0x0F }, "0.0=#02010f", "OID.0.0=#02010F",
   2495                 "0.0=#02010f");
   2496         list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2497                 0x00,
   2498                 // BitString
   2499                 0x03, 0x01, 0x00 }, "0.0=#030100", "OID.0.0=#030100",
   2500                 "0.0=#030100");
   2501         list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
   2502                 0x00,
   2503                 // SEQUENCE
   2504                 0x30, 0x01, 0x0A }, "0.0=#30010a", "OID.0.0=#30010A",
   2505                 "0.0=#30010a");
   2506 
   2507         //
   2508         // Known OID + UTF-8 string with chars to be escaped
   2509         //
   2510 
   2511         // spaces
   2512         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2513                 0x55, 0x04, 0x03,
   2514                 // UTF8String: a single space char
   2515                 0x0C, 0x01, 0x20 }, "CN=\\ ", "CN=\" \"", "cn=");
   2516         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2517                 0x55, 0x04, 0x03,
   2518                 // UTF8String: a space char at the beginning
   2519                 0x0C, 0x02, 0x20, 0x5A }, "CN=\\ Z", "CN=\" Z\"", "cn=z");
   2520         list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
   2521                 0x55, 0x04, 0x03,
   2522                 // UTF8String: two space chars at the beginning
   2523                 0x0C, 0x03, 0x20, 0x20, 0x5A }, "CN=\\  Z", "CN=\"  Z\"",
   2524                 "cn=z", (byte) 0x01);
   2525         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2526                 0x55, 0x04, 0x03,
   2527                 // UTF8String: a space char at the end
   2528                 0x0C, 0x02, 0x5A, 0x20 }, "CN=Z\\ ", "CN=\"Z \"", "cn=z");
   2529         list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
   2530                 0x55, 0x04, 0x03,
   2531                 // UTF8String: two space chars at the end
   2532                 0x0C, 0x03, 0x5A, 0x20, 0x20 }, "CN=Z \\ ", "CN=\"Z  \"",
   2533                 "cn=z", (byte) 0x01);
   2534 
   2535         // special chars
   2536         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2537                 0x55, 0x04, 0x03,
   2538                 // UTF8String: a '#' char at the beginning
   2539                 0x0C, 0x02, 0x23, 0x5A }, "CN=\\#Z", "CN=\"#Z\"", "cn=\\#z");
   2540         list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
   2541                 0x55, 0x04, 0x03,
   2542                 // UTF8String: two '#' chars
   2543                 0x0C, 0x03, 0x23, 0x5A, 0x23 }, "CN=\\#Z\\#", "CN=\"#Z#\"",
   2544                 "cn=\\#z#");
   2545         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2546                 0x55, 0x04, 0x03,
   2547                 // UTF8String: ','
   2548                 0x0C, 0x02, 0x5A, 0x2C }, "CN=Z\\,", "CN=\"Z,\"", "cn=z\\,");
   2549         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2550                 0x55, 0x04, 0x03,
   2551                 // UTF8String: '+'
   2552                 0x0C, 0x02, 0x5A, 0x2B }, "CN=Z\\+", "CN=\"Z+\"", "cn=z\\+");
   2553         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2554                 0x55, 0x04, 0x03,
   2555                 // UTF8String: '"'
   2556                 0x0C, 0x02, 0x5A, 0x22 }, "CN=Z\\\"", "CN=\"Z\\\"\"",
   2557                 "cn=z\\\"", (byte) 0x02);
   2558         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2559                 0x55, 0x04, 0x03,
   2560                 // UTF8String: '\'
   2561                 0x0C, 0x02, 0x5A, 0x5C }, "CN=Z\\\\", "CN=\"Z\\\\\"",
   2562                 "cn=z\\\\", (byte) 0x02);
   2563         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2564                 0x55, 0x04, 0x03,
   2565                 // UTF8String: '<'
   2566                 0x0C, 0x02, 0x5A, 0x3C }, "CN=Z\\<", "CN=\"Z<\"", "cn=z\\<");
   2567         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2568                 0x55, 0x04, 0x03,
   2569                 // UTF8String: '>'
   2570                 0x0C, 0x02, 0x5A, 0x3E }, "CN=Z\\>", "CN=\"Z>\"", "cn=z\\>");
   2571         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2572                 0x55, 0x04, 0x03,
   2573                 // UTF8String: ';'
   2574                 0x0C, 0x02, 0x5A, 0x3B }, "CN=Z\\;", "CN=\"Z;\"", "cn=z\\;");
   2575         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2576                 0x55, 0x04, 0x03,
   2577                 // UTF8String: '='
   2578                 0x0C, 0x02, 0x5A, 0x3D }, "CN=Z\\=", "CN=\"Z=\"", "cn=z=");
   2579         //FIXME        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2580         //                0x55, 0x04, 0x03,
   2581         //                // UTF8String: ';'
   2582         //                0x0C, 0x02, 0x5A, 0x0D }, "CN=Z\\\r", "CN=\"Z\r\"", "cn=z");
   2583 
   2584         // combinations
   2585         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2586                 0x55, 0x04, 0x03,
   2587                 // UTF8String: '\ '
   2588                 0x0C, 0x02, 0x5C, 0x20 }, "CN=\\\\\\ ", "CN=\"\\\\ \"",
   2589                 "cn=\\\\", (byte) 0x02);
   2590         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2591                 0x55, 0x04, 0x03,
   2592                 // UTF8String: ' \'
   2593                 0x0C, 0x02, 0x20, 0x5C }, "CN=\\ \\\\", "CN=\" \\\\\"",
   2594                 "cn=\\\\", (byte) 0x02);
   2595         list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
   2596                 0x55, 0x04, 0x03,
   2597                 // UTF8String: ' \ '
   2598                 0x0C, 0x03, 0x20, 0x5C, 0x20 }, "CN=\\ \\\\\\ ",
   2599                 "CN=\" \\\\ \"", "cn=\\\\", (byte) 0x02);
   2600         list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
   2601                 0x55, 0x04, 0x03,
   2602                 // UTF8String: 'Z Z' no escaping
   2603                 0x0C, 0x03, 0x5A, 0x20, 0x5A }, "CN=Z Z", "CN=Z Z", "cn=z z");
   2604         list.add(new byte[] { 0x30, 0x0F, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03,
   2605                 0x55, 0x04, 0x03,
   2606                 // UTF8String: 'Z  Z' no escaping
   2607                 0x0C, 0x04, 0x5A, 0x20, 0x20, 0x5A }, "CN=Z  Z", "CN=Z  Z",
   2608                 "cn=z z", (byte) 0x02);
   2609         list.add(new byte[] { 0x30, 0x0F, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03,
   2610                 0x55, 0x04, 0x03,
   2611                 // UTF8String: ' #Z ' no escaping
   2612                 0x0C, 0x04, 0x20, 0x23, 0x5A, 0x20 }, "CN=\\ \\#Z\\ ",
   2613                 "CN=\" #Z \"", "cn=#z");
   2614 
   2615         //
   2616         // Special cases
   2617         //
   2618         //        list.add(new byte[] {
   2619         //        // Name
   2620         //                0x30, 0x13, 0x31, 0x11, 0x30, 0x0F,
   2621         //                // OID
   2622         //                0x06, 0x0A, 0x09, (byte) 0x92, 0x26, (byte) 0x89, (byte) 0x93,
   2623         //                (byte) 0xF2, 0x2C, 0x64, 0x01, 0x01,
   2624         //                // ANY
   2625         //                0x13, 0x01, 0x41 }, "UID=A", "OID.0.9.2342.19200300.100.1.1=A",
   2626         //                "uid=a");
   2627         //
   2628         //        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2629         //                0x55, 0x04, 0x03, 0x1E, 0x01, 0x5A }, "CN=Z", "CN=Z",
   2630         //                "cn=#1e015a");
   2631 
   2632         //
   2633         // Multi-valued DN
   2634         //
   2635         list.add(new byte[] { 0x30, 0x14, 0x31, 0x12,
   2636         // 1
   2637                 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
   2638                 // UTF8String: 'Z'
   2639                 0x0C, 0x01, 0x5A,
   2640                 //2
   2641                 0x30, 0x06, 0x06, 0x01, 0x01,
   2642                 // UTF8String: 'A'
   2643                 0x0C, 0x01, 0x41 }, "CN=Z+0.1=#0c0141", "CN=Z + OID.0.1=A",
   2644                 "cn=z+0.1=#0c0141");
   2645 
   2646         //
   2647         //
   2648         //
   2649         list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
   2650                 0x55, 0x04, 0x03,
   2651                 // UTF8String: the last letter(capital) of Russian alphabet
   2652                 0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }, "CN=" + ((char) 1071),
   2653                 "CN=" + ((char) 1071), "cn=" + ((char) 1103));
   2654         // FIXME list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
   2655         //        0x55, 0x04, 0x03,
   2656         //        // UTF8String: the last letter(capital) of Russian alphabet
   2657         //        0x0C, 0x03, (byte) 0xE0, (byte) 0x90, (byte) 0xAF }, "CN="
   2658         //        + ((char) 1071), "CN=" + ((char) 1071), "cn=" + ((char) 1103));
   2659         // FIXME list.add(
   2660         //        new byte[] { 0x30, 0x0F, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03,
   2661         //                0x55, 0x04, 0x03,
   2662         //                // UTF8String: the last letter(capital) of Russian alphabet
   2663         //                0x0C, 0x04, (byte) 0xF0, (byte) 0x80, (byte) 0x90,
   2664         //                (byte) 0xAF }, "CN=" + ((char) 1071), "CN="
   2665         //                + ((char) 1071), "cn=" + ((char) 1103));
   2666         list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
   2667                 0x55, 0x04, 0x03,
   2668                 // PrintableString: char '$' is not in table 8 (X.680)
   2669                 0x13, 0x01, 0x24 }, "CN=$", "CN=$", "cn=$");
   2670 
   2671         StringBuffer errorMsg = new StringBuffer();
   2672         for (int i = 0; i < list.size(); i++) {
   2673 
   2674             Object[] values = list.get(i);
   2675             byte[] encoded = (byte[]) values[0];
   2676             String rfc2253 = (String) values[1];
   2677             String rfc1179 = (String) values[2];
   2678             String canonical = (String) values[3];
   2679             byte mask = ((byte[]) values[4])[0];
   2680 
   2681             X500Principal p;
   2682             try {
   2683                 p = new X500Principal(encoded);
   2684 
   2685                 if (!rfc2253.equals(p.getName(X500Principal.RFC2253))) {
   2686                     if (!testing || ((mask & 0x01) == 0)) {
   2687                         errorMsg.append("RFC2253: " + i);
   2688                         errorMsg.append("\t\texpected: '" + rfc2253 + "'");
   2689                         errorMsg.append("\treturned: '"
   2690                                 + p.getName(X500Principal.RFC2253) + "'\n");
   2691                     }
   2692                 }
   2693 
   2694                 if (!rfc1179.equals(p.getName(X500Principal.RFC1779))) {
   2695                     if (!testing || ((mask & 0x02) == 0)) {
   2696                         errorMsg.append("RFC1779: " + i);
   2697                         errorMsg.append("\t\texpected: '" + rfc1179 + "'");
   2698                         errorMsg.append("\treturned: '"
   2699                                 + p.getName(X500Principal.RFC1779) + "'\n");
   2700                     }
   2701                 }
   2702 
   2703                 if (!canonical.equals(p.getName(X500Principal.CANONICAL))) {
   2704                     if (!testing || ((mask & 0x04) == 0)) {
   2705                         errorMsg.append("CANONICAL: " + i);
   2706                         errorMsg.append("\t\texpected: " + canonical + "'");
   2707                         errorMsg.append("\treturned: '"
   2708                                 + p.getName(X500Principal.CANONICAL) + "'\n");
   2709                     }
   2710                 }
   2711 
   2712             } catch (IllegalArgumentException e) {
   2713                 errorMsg.append("\nIllegalArgumentException: " + i + ", for "
   2714                         + rfc2253);
   2715                 continue;
   2716             } catch (Exception e) {
   2717                 errorMsg.append("Exception: " + i + ", for " + rfc2253);
   2718                 errorMsg.append("\texcep: " + e.getClass().getName() + "\n");
   2719                 continue;
   2720             }
   2721 
   2722         }
   2723 
   2724         if (errorMsg.length() != 0) {
   2725             fail(errorMsg.toString());
   2726         }
   2727     }
   2728 
   2729     @SuppressWarnings("serial")
   2730     public static class TestList extends ArrayList<Object[]> {
   2731         //
   2732         // TODO comment me
   2733         //
   2734         public void add(String param, String rfc2253, String rfc1779) {
   2735             add(param, rfc2253, rfc1779, (byte[]) null);
   2736         }
   2737 
   2738         public void add(String param, String rfc2253, String rfc1779,
   2739                 String canonical) {
   2740             add(param, rfc2253, rfc1779, canonical, null);
   2741         }
   2742 
   2743         public void add(String param, String rfc2253, String rfc1779,
   2744                 byte[] encoded) {
   2745             add(new Object[] { param, rfc2253, rfc1779, null, encoded,
   2746                     emptyMask });
   2747         }
   2748 
   2749         public void add(String param, String rfc2253, String rfc1779,
   2750                 byte[] encoded, byte mask) {
   2751             add(new Object[] { param, rfc2253, rfc1779, null, encoded,
   2752                     new byte[] { mask } });
   2753         }
   2754 
   2755         public void add(String param, String rfc2253, String rfc1779,
   2756                 String canonical, byte[] encoded) {
   2757             add(new Object[] { param, rfc2253, rfc1779, canonical, encoded,
   2758                     emptyMask });
   2759         }
   2760 
   2761         public void add(String param, String rfc2253, String rfc1779,
   2762                 String canonical, byte[] encoded, byte mask) {
   2763             add(new Object[] { param, rfc2253, rfc1779, canonical, encoded,
   2764                     new byte[] { mask } });
   2765         }
   2766 
   2767         //
   2768         // TODO comment me
   2769         //
   2770 
   2771         private static final byte[] emptyMask = new byte[] { 0x00 };
   2772 
   2773         public void add(byte[] encoding, String rfc2253, String rfc1779,
   2774                 String canonical) {
   2775             add(new Object[] { encoding, rfc2253, rfc1779, canonical, emptyMask });
   2776         }
   2777 
   2778         public void add(byte[] encoding, String rfc2253, String rfc1779,
   2779                 String canonical, byte mask) {
   2780             add(new Object[] { encoding, rfc2253, rfc1779, canonical,
   2781                     new byte[] { mask } });
   2782         }
   2783     }
   2784 }