1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @author Alexander Y. Kleymenov
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.java.security.cert;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayInputStream;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.KeyFactory;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchAlgorithmException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.PublicKey;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.CertPath;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.CertificateFactory;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.X509CRL;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.X509Certificate;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.spec.X509EncodedKeySpec;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Collection;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Iterator;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.List;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.luni.util.Base64;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * X.509 CertificateFactory provider implementation test.<br>
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See RFC 3280 (http://www.ietf.org/rfc/rfc3280.txt) for
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * more information on X.509, and
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * http://www.ietf.org/rfc/rfc2315.txt
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * for more information on PKCS #7.
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The testing data was generated by use of classes from
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * org.apache.harmony.security.x509 package.
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class CertificateFactory_ImplTest extends TestCase {
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Base64 encoded PKCS7 SignedObject containing two X.509
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Certificates and CRLs.
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String pkcs7so =
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes          "MIIHDwYJKoZIhvcNAQcCoIIHADCCBvwCAQExADALBgkqhkiG9w0BBwGg"
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ggUuMIICkzCCAlOgAwIBAgICAiswCQYHKoZIzjgEAzAdMRswGQYDVQQK"
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ExJDZXJ0aWZpY2F0ZSBJc3N1ZXIwIxcNMDYwOTA1MDk1MzA2WhgSMjMz"
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "NjEwMTMwMjUxMjcuODFaMB0xGzAZBgNVBAoTEkNlcnRpZmljYXRlIElz"
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "c3VlcjCCAbgwggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OBHXUSKVLfSpwu"
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeB"
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "O4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX58aophUPBPuD"
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8VIwvM"
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "spK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlX"
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "TAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqL"
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "VHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4Vrl"
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "nwaSi2ZegHtVJWQBTDv+z0kqA4GFAAKBgQDyCA7AK6Kep2soxt8tIsWW"
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "kafbYdueAkeBNnm46H0OteFa80HMuJjKJ0LjlPrdjFMARKyW/GATtQhg"
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "hY/MrINAHmKcX5QjL1DkuJKDNggLHqj5D6efsWmLKwLvmviWLzWtjh7Y"
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "GBZeLt0ezu2q49aKcOzkkDsCSsMz09u9284L6qMeMBwwGgYDVR0RAQH/"
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "BBAwDoEMcmZjQDgyMi5OYW1lMAkGByqGSM44BAMDLwAwLAIUWo0C+R8P"
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "J8LGSLsCRqJ8SOOO0SoCFGvO6mpNdzOKiwlYwfpF/Xyi7s3vMIICkzCC"
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "AlOgAwIBAgICAiswCQYHKoZIzjgEAzAdMRswGQYDVQQKExJDZXJ0aWZp"
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "Y2F0ZSBJc3N1ZXIwIxcNMDYwOTA1MDk1MzA2WhgSMjMzNjEwMTMwMjUx"
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "MjcuODFaMB0xGzAZBgNVBAoTEkNlcnRpZmljYXRlIElzc3VlcjCCAbgw"
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3Ujzv"
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "RADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3"
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX58aophUPBPuD9tPFHsMCNVQT"
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "WhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8VIwvMspK5gqLrhAvw"
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "WBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlXTAs9B4JnUVlX"
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "jrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4r"
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "s6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtV"
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "JWQBTDv+z0kqA4GFAAKBgQDyCA7AK6Kep2soxt8tIsWWkafbYdueAkeB"
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "Nnm46H0OteFa80HMuJjKJ0LjlPrdjFMARKyW/GATtQhghY/MrINAHmKc"
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "X5QjL1DkuJKDNggLHqj5D6efsWmLKwLvmviWLzWtjh7YGBZeLt0ezu2q"
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "49aKcOzkkDsCSsMz09u9284L6qMeMBwwGgYDVR0RAQH/BBAwDoEMcmZj"
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "QDgyMi5OYW1lMAkGByqGSM44BAMDLwAwLAIUWo0C+R8PJ8LGSLsCRqJ8"
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "SOOO0SoCFGvO6mpNdzOKiwlYwfpF/Xyi7s3voYIBsjCB1jCBlwIBATAJ"
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "BgcqhkjOOAQDMBUxEzARBgNVBAoTCkNSTCBJc3N1ZXIXDTA2MDkwNTA5"
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "NTMwN1oXDTA2MDkwNTA5NTQ0N1owQTA/AgICKxcNMDYwOTA1MDk1MzA4"
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "WjAqMAoGA1UdFQQDCgEBMBwGA1UdGAQVGBMyMDA2MDkwNTA5NTMwNy43"
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "MThaoA8wDTALBgNVHRQEBAICEVwwCQYHKoZIzjgEAwMvADAsAhR/l5kI"
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "bTkuJe9HjcpZ4Ff4Ifv9xwIUIXBlDKsNFlgYdWWTxzrrJOHyMuUwgdYw"
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "gZcCAQEwCQYHKoZIzjgEAzAVMRMwEQYDVQQKEwpDUkwgSXNzdWVyFw0w"
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "NjA5MDUwOTUzMDdaFw0wNjA5MDUwOTU0NDdaMEEwPwICAisXDTA2MDkw"
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "NTA5NTMwOFowKjAKBgNVHRUEAwoBATAcBgNVHRgEFRgTMjAwNjA5MDUw"
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "OTUzMDcuNzE4WqAPMA0wCwYDVR0UBAQCAhFcMAkGByqGSM44BAMDLwAw"
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "LAIUf5eZCG05LiXvR43KWeBX+CH7/ccCFCFwZQyrDRZYGHVlk8c66yTh"
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "8jLlMQA=";
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Base64 encoded PkiPath object containing 2 X.509 certificates.
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String pkiPath =
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes          "MIIFMDCCApQwggJToAMCAQICAgIrMAkGByqGSM44BAMwHTEbMBkGA1UE"
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ChMSQ2VydGlmaWNhdGUgSXNzdWVyMCMXDTA2MDkwNTExMDAyM1oYEjIz"
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "MzYxMDEzMTQwNDE4LjEyWjAdMRswGQYDVQQKExJDZXJ0aWZpY2F0ZSBJ"
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "c3N1ZXIwggG4MIIBLAYHKoZIzjgEATCCAR8CgYEA/X9TgR11EilS30qc"
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "Luzk5/YRt1I870QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzX"
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "gTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJPu6nX/rfGG/g7V+fGqKYVDwT7"
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCFQCXYFCPFSML"
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "zLKSuYKi64QL8Fgc9QKBgQD34aCF1ps93su8q1w2uFe5eZSvu/o66oL5"
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "V0wLPQeCZ1FZV4661FlP5nEHEIGAtEkWcSPoTCgWE7fPCTKMyKbhPBZ6"
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "i1R8jSjgo64eK7OmdZFuo38L+iE1YvH7YnoBJDvMpPG+qFGQiaiD3+Fa"
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "5Z8GkotmXoB7VSVkAUw7/s9JKgOBhQACgYEA8ggOwCuinqdrKMbfLSLF"
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "lpGn22HbngJHgTZ5uOh9DrXhWvNBzLiYyidC45T63YxTAESslvxgE7UI"
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "YIWPzKyDQB5inF+UIy9Q5LiSgzYICx6o+Q+nn7FpiysC75r4li81rY4e"
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "2BgWXi7dHs7tquPWinDs5JA7AkrDM9PbvdvOC+qjHjAcMBoGA1UdEQEB"
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "/wQQMA6BDHJmY0A4MjIuTmFtZTAJBgcqhkjOOAQDAzAAMC0CFQCAUA72"
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "3BIXNluugYcScXeb9vx5vAIUYreCA5ljANvzSsD0ofI+xph4//IwggKU"
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "MIICU6ADAgECAgICKzAJBgcqhkjOOAQDMB0xGzAZBgNVBAoTEkNlcnRp"
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ZmljYXRlIElzc3VlcjAjFw0wNjA5MDUxMTAwMjNaGBIyMzM2MTAxMzE0"
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "MDQxOC4xMlowHTEbMBkGA1UEChMSQ2VydGlmaWNhdGUgSXNzdWVyMIIB"
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "uDCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdS"
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "PO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/Jm"
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "YLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1"
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuE"
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "C/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdR"
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "WVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOu"
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "HiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6A"
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "e1UlZAFMO/7PSSoDgYUAAoGBAPIIDsArop6nayjG3y0ixZaRp9th254C"
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "R4E2ebjofQ614VrzQcy4mMonQuOU+t2MUwBErJb8YBO1CGCFj8ysg0Ae"
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "YpxflCMvUOS4koM2CAseqPkPp5+xaYsrAu+a+JYvNa2OHtgYFl4u3R7O"
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "7arj1opw7OSQOwJKwzPT273bzgvqox4wHDAaBgNVHREBAf8EEDAOgQxy"
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ZmNAODIyLk5hbWUwCQYHKoZIzjgEAwMwADAtAhUAgFAO9twSFzZbroGH"
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "EnF3m/b8ebwCFGK3ggOZYwDb80rA9KHyPsaYeP/y";
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Base64 encoded X.509 CRL.
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String x509crl =
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes          "MIHWMIGWAgEBMAkGByqGSM44BAMwFTETMBEGA1UEChMKQ1JMIElzc3Vl"
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "chcNMDYwOTA1MDk1MzA4WhcNMDYwOTA1MDk1NDQ4WjBAMD4CAgIrFw0w"
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "NjA5MDUwOTUzMDhaMCkwCgYDVR0VBAMKAQEwGwYDVR0YBBQYEjIwMDYw"
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "OTA1MDk1MzA4Ljg5WqAPMA0wCwYDVR0UBAQCAhFcMAkGByqGSM44BAMD"
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "MAAwLQIUJ1KAJumw8mOpGXT/FS5K9WwOBRICFQCR+ez59x9GH3sKoByC"
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "IooeR20Q3Q==";
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Base64 encoded X.509 Certificate.
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String x509cert =
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes          "MIICkzCCAlOgAwIBAgICAiswCQYHKoZIzjgEAzAdMRswGQYDVQQKExJD"
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ZXJ0aWZpY2F0ZSBJc3N1ZXIwIxcNMDYwOTA4MDU1NzUxWhgSMjMzNjEx"
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "MTAxMTM4NTUuNjJaMB0xGzAZBgNVBAoTEkNlcnRpZmljYXRlIElzc3Vl"
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "cjCCAbgwggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OBHXUSKVLfSpwu7OTn"
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeBO4Ad"
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "NG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX58aophUPBPuD9tPF"
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "HsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8VIwvMspK5"
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlXTAs9"
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyN"
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "KOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaS"
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "i2ZegHtVJWQBTDv+z0kqA4GFAAKBgQDyCA7AK6Kep2soxt8tIsWWkafb"
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "YdueAkeBNnm46H0OteFa80HMuJjKJ0LjlPrdjFMARKyW/GATtQhghY/M"
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "rINAHmKcX5QjL1DkuJKDNggLHqj5D6efsWmLKwLvmviWLzWtjh7YGBZe"
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "Lt0ezu2q49aKcOzkkDsCSsMz09u9284L6qMeMBwwGgYDVR0RAQH/BBAw"
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "DoEMcmZjQDgyMi5OYW1lMAkGByqGSM44BAMDLwAwLAIUO+JWKWai/8Si"
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "2oEfhKSobLttYeYCFFO5YVDvtnmVVnvQTtUvrPpsaxJR";
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Base64 encoded Private Key used for data signing.
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * This data is not directly used in the test, but it could be
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * useful in future in case of implementation of additional
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * testing data structures.
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String b64PrivateKeySpec =
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes          "MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s"
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7"
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P2"
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "08UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yy"
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "krmCouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdM"
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "Cz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotU"
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "fI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWf"
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "BpKLZl6Ae1UlZAFMO/7PSSoEFgIUS24w346zv1ic3wsLOHzxQnf9aX0=";
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Base64 encoded Public Key for signature verification.
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String b64PublicKeySpec =
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes          "MIIBuDCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2"
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00"
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208Ue"
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "wwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmC"
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "ouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0H"
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "gmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o"
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKL"
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "Zl6Ae1UlZAFMO/7PSSoDgYUAAoGBAPIIDsArop6nayjG3y0ixZaRp9th"
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "254CR4E2ebjofQ614VrzQcy4mMonQuOU+t2MUwBErJb8YBO1CGCFj8ys"
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "g0AeYpxflCMvUOS4koM2CAseqPkPp5+xaYsrAu+a+JYvNa2OHtgYFl4u"
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        + "3R7O7arj1opw7OSQOwJKwzPT273bzgvq";
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The name of the algorithm used for Certificate/CRL signing.
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String publicKeyAlgorithm = "DSA";
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The public key to verify generated Certificates and CRLs.
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static PublicKey publicKey;
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static {
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            X509EncodedKeySpec publicKeySpec =
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new X509EncodedKeySpec(
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        Base64.decode(b64PublicKeySpec.getBytes("UTF-8")));
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            KeyFactory keyFactory =
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                KeyFactory.getInstance(publicKeyAlgorithm);
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            publicKey = keyFactory.generatePublic(publicKeySpec);
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NoSuchAlgorithmException e) {
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // provider is not installed, will not verify the generated data
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            publicKey = null;
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // problems with a representation of the key
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            e.printStackTrace();
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            publicKey = null;
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // array contains allowed PEM delimiters
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String[][] good = {
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGIN\n", "\n-----END"},
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGIN-----\n", "\n-----END-----"},
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGIN PEM ENCODED DATA STRUCTURE-----\n", "\n-----END-----"},
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGIN MEANINGLESS SEPARATOR\n", "\n-----END PEM"},
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    };
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // array contains not allowed PEM delimiters
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String[][] bad = {
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"----BEGI\n", "\n-----END"},
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGI\n", "\n----END"},
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGI\n", "\n-----END"},
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGIN\n", "\n-----EN"},
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGIN", "\n-----END"},
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        {"-----BEGIN\n", "-----END"},
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    };
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // array contains bad PEM encoded content.
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String[] bad_content = {
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        "MIIHDwYJ", "ABCD", "\r\n\r\n", "\n\r", ""
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    };
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * generateCRLs method testing.
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Generates CRLs on the base of PKCS7 SignedData Object
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateCRLs() throws Exception {
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Testing the CRLs generation on the base of PKCS7 SignedData object
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Base64.decode(pkcs7so.getBytes("UTF-8")));
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Collection crls = factory.generateCRLs(bais);
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Factory returned null on correct PKCS7 data", crls);
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("The size of collection differs from expected",
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                2, crls.size());
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (publicKey != null) {
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // verify the signatures
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (Iterator i = crls.iterator(); i.hasNext();) {
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((X509CRL) i.next()).verify(publicKey);
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * generateCRL/generateCertificate method testing.
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Tries to generates single CRL/Certificate
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * on the base of PKCS7 SignedData Object.
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateCRL() throws Exception {
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Base64.decode(pkcs7so.getBytes("UTF-8")));
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            factory.generateCRL(bais);
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected exception was not thrown");
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) { }
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bais = new ByteArrayInputStream(Base64.decode(pkcs7so.getBytes("UTF-8")));
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            factory.generateCertificate(bais);
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected exception was not thrown");
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) { }
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Generates CRLs on the base of PEM encoding.
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateBase64CRL() throws Exception {
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais;
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<good.length; i++) {
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[i][0] + x509crl + good[i][1]).getBytes("UTF-8"));
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            X509CRL crl = (X509CRL) factory.generateCRL(bais);
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertNotNull("Factory returned null on correct data", crl);
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (publicKey != null) {
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // verify the signatures
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                crl.verify(publicKey);
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<bad_content.length; i++) {
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[0][0] + bad_content[i] + good[0][1]).getBytes("UTF-8"));
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCRL(bais);
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) {
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // e.printStackTrace();
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<bad.length; i++) {
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (bad[i][0] + x509crl + bad[i][1]).getBytes("UTF-8"));
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCRL(bais);
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void verifyCRLs(Collection crls) throws Exception {
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (publicKey != null) {
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // verify the signatures
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (Iterator it = crls.iterator(); it.hasNext();) {
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((X509CRL) it.next()).verify(publicKey);
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    };
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void verifyCertificates(Collection certs) throws Exception {
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (publicKey != null) {
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // verify the signatures
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (Iterator it = certs.iterator(); it.hasNext();) {
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((X509Certificate) it.next()).verify(publicKey);
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    };
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * generateCRLs method testing.
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Generates CRLs on the base of consequent
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * PEM X.509(ASN.1)/X.509(ASN.1)/PKCS7 forms.
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateBase64CRLs() throws Exception {
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // ------------------------ Test Data -----------------------------
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // encoding describing codes
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int pem_x509 = 0, asn_x509 = 1, pem_pkcs = 2, asn_pkcs = 3,
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bad = 4, npe_bad = 5, npe_bad2 = 6, num_of_variants = 7;
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // error code, marks sequences as throwing exceptions
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int error = 999;
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test sequences
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int[][] sequences = {
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {pem_x509, pem_x509},
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {pem_x509, asn_x509},
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {pem_x509, asn_x509, pem_x509},
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {asn_x509, asn_x509},
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {asn_x509, pem_x509},
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {asn_x509, pem_x509, asn_x509},
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // -1 means that only 1 (-(-1)) CRL will be generated
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // on the base of this encodings sequence
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-1, pem_x509, pem_pkcs},
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-1, pem_x509, bad},
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, pem_x509, npe_bad2},
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, pem_x509, npe_bad},
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, pem_x509}, // 2 CRLs are expected
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, bad},
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, npe_bad},
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, npe_bad2},
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-1, asn_x509, pem_pkcs},
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-1, asn_x509, bad},
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, asn_x509, npe_bad},
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, asn_x509, npe_bad2},
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // exception is expected
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, bad},
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, bad, asn_x509},
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, npe_bad},
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, npe_bad2},
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // actual encodings
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[][] data = new byte[num_of_variants][];
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[pem_x509] = (good[0][0] + x509crl + good[0][1] + "\n").getBytes("UTF-8");
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[asn_x509] = Base64.decode(x509crl.getBytes("UTF-8"));
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[pem_pkcs] = (good[0][0] + pkcs7so + good[0][1] + "\n").getBytes("UTF-8");
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[asn_pkcs] = Base64.decode(pkcs7so.getBytes("UTF-8"));
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[bad] = new byte[] {0, 1, 1, 1, 1, 1, 0, 1};
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[npe_bad] = new byte[] {0, 1, 1, 1, 1, 1, 1, 0};
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[npe_bad2] = new byte[] {48, 0, 3, 4, 5, 6, 7};
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // -------------------------- Test --------------------------------
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Tests CRL generation on the base of sequences of heterogeneous
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // data format
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<sequences.length; i++) { // for each of the sequences..
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected size og generated CRL collection
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int expected_size = (sequences[i][0] < 0)
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ? -sequences[i][0]
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                : sequences[i].length;
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // compute the size of the encoding described by sequence
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int encoding_size = 0;
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.print("Sequence:");
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int j=0; j<sequences[i].length; j++) {
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //System.out.print(" "+sequences[i][j]);
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (sequences[i][j] >= 0) {
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    encoding_size += data[sequences[i][j]].length;
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("");
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // create the encoding of described sequence
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] encoding = new byte[encoding_size];
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int position = 0;
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int j=0; j<sequences[i].length; j++) {
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (sequences[i][j] >= 0) {
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    System.arraycopy(
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            data[sequences[i][j]], 0, // from
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            encoding, position, // to
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            data[sequences[i][j]].length); // length
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    position += data[sequences[i][j]].length;
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (expected_size == error) { // exception throwing test
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    factory.generateCRLs(new ByteArrayInputStream(encoding));
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Expected exception was not thrown");
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (Exception e) { }
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Collection crls =
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    factory.generateCRLs(new ByteArrayInputStream(encoding));
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertNotNull("Factory returned null on correct data", crls);
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals("The size of collection differs from expected",
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        expected_size, crls.size());
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                verifyCRLs(crls);
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * generateCertificates method testing.
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Generates Certificates on the base of consequent
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * PEM X.509(ASN.1)/X.509(ASN.1)/PKCS7 forms.
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateBase64Certificates() throws Exception {
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // ------------------------ Test Data -----------------------------
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // encoding describing codes
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int pem_x509 = 0, asn_x509 = 1, pem_pkcs = 2, asn_pkcs = 3,
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bad = 4, bad1 = 5, bad2 = 6, num_of_variants = 7;
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // error code, marks sequences as throwing exceptions
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int error = 999;
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test sequences
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int[][] sequences = {
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {pem_x509, pem_x509},
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {pem_x509, asn_x509},
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {pem_x509, asn_x509, pem_x509},
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {asn_x509, asn_x509},
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {asn_x509, pem_x509},
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {asn_x509, pem_x509, asn_x509},
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // -1 means that only 1 (-(-1)) Certificate will be generated
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // on the base of this encodings sequence
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, pem_x509, pem_pkcs},
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, pem_x509, bad},
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, pem_x509}, // 2 Certificates are expected
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, bad},
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, bad1},
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-2, pem_pkcs, bad2},
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, asn_x509, pem_pkcs},
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, asn_x509, bad},
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, asn_x509, bad1},
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, pem_x509, bad1},
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, asn_x509, bad2},
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // {-1/*-error*/, pem_x509, bad2},
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // exception is expected
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, bad},
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, bad, asn_x509},
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, bad1},
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {-error, bad2},
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // actual encodings
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[][] data = new byte[num_of_variants][];
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[pem_x509] = (good[0][0] + x509cert + good[0][1] + "\n").getBytes("UTF-8");
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[asn_x509] = Base64.decode(x509cert.getBytes("UTF-8"));
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[pem_pkcs] = (good[0][0] + pkcs7so + good[0][1] + "\n").getBytes("UTF-8");
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[asn_pkcs] = Base64.decode(pkcs7so.getBytes("UTF-8"));
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[bad] = new byte[] {0, 1, 1, 1, 1, 1, 0, 1};
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[bad1] = new byte[] {0, 1, 1, 1, 1, 1, 1, 0};
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        data[bad2] = new byte[] {48, 0, 3, 4, 5, 6, 7};
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // -------------------------- Test --------------------------------
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Tests Certificate generation on the base of sequences of heterogeneous
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // data format
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<sequences.length; i++) { // for each of the sequences..
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected size og generated Certificate collection
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int expected_size = (sequences[i][0] < 0)
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ? -sequences[i][0]
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                : sequences[i].length;
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // compute the size of the encoding described by sequence
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int encoding_size = 0;
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.print("Sequence:");
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int j=0; j<sequences[i].length; j++) {
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //System.out.print(" "+sequences[i][j]);
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (sequences[i][j] >= 0) {
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    encoding_size += data[sequences[i][j]].length;
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("");
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // create the encoding of described sequence
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] encoding = new byte[encoding_size];
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int position = 0;
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int j=0; j<sequences[i].length; j++) {
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (sequences[i][j] >= 0) {
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    System.arraycopy(
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            data[sequences[i][j]], 0, // from
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            encoding, position, // to
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            data[sequences[i][j]].length); // length
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    position += data[sequences[i][j]].length;
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (expected_size == error) { // exception throwing test
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    factory.generateCertificates(new ByteArrayInputStream(encoding));
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Expected exception was not thrown");
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (Exception e) { }
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Collection certs =
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    factory.generateCertificates(new ByteArrayInputStream(encoding));
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertNotNull("Factory returned null on correct data", certs);
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals("The size of collection differs from expected",
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        expected_size, certs.size());
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                verifyCertificates(certs);
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Generates CRLs/Certificates on the base of PEM PKCS7 encoding.
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateBase64PKCS7() throws Exception {
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais;
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<good.length; i++) {
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[i][0] + pkcs7so + good[i][1]).getBytes("UTF-8"));
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Collection crls = factory.generateCRLs(bais);
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertNotNull("Factory returned null on correct PKCS7 data", crls);
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("The size of collection differs from expected",
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    2, crls.size());
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (publicKey != null) {
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // verify the signatures
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (Iterator it = crls.iterator(); it.hasNext();) {
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((X509CRL) it.next()).verify(publicKey);
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[i][0] + pkcs7so + good[i][1]).getBytes("UTF-8"));
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Collection certs = factory.generateCertificates(bais);
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertNotNull("Factory returned null on correct PKCS7 data", certs);
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("The size of collection differs from expected",
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    2, certs.size());
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (publicKey != null) {
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // verify the signatures
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (Iterator it = certs.iterator(); it.hasNext();) {
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((X509Certificate) it.next()).verify(publicKey);
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<bad_content.length; i++) {
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[0][0] + bad_content[i] + good[0][1]).getBytes("UTF-8"));
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertificates(bais);
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[0][0] + bad_content[i] + good[0][1]).getBytes("UTF-8"));
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCRLs(bais);
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<bad.length; i++) {
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (bad[i][0] + pkcs7so + bad[i][1]).getBytes("UTF-8"));
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCRLs(bais);
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (bad[i][0] + pkcs7so + bad[i][1]).getBytes("UTF-8"));
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertificates(bais);
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Generates CertPaths on the base of PEM PkiPath/PKCS7 encoding.
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateBase64CertPath() throws Exception {
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais;
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        List certificates;
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<good.length; i++) {
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[i][0] + pkiPath + good[i][1]).getBytes("UTF-8"));
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            certificates = factory.generateCertPath(bais).getCertificates();
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("The size of the list differs from expected",
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    2, certificates.size());
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (publicKey != null) {
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // verify the signatures
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (Iterator it = certificates.iterator(); it.hasNext();) {
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((X509Certificate) it.next()).verify(publicKey);
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[i][0] + pkiPath + good[i][1]).getBytes("UTF-8"));
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            certificates =
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais, "PkiPath").getCertificates();
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("The size of the list differs from expected",
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    2, certificates.size());
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (publicKey != null) {
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // verify the signatures
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (Iterator it = certificates.iterator(); it.hasNext();) {
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((X509Certificate) it.next()).verify(publicKey);
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[i][0] + pkcs7so + good[i][1]).getBytes("UTF-8"));
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            certificates =
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais, "PKCS7").getCertificates();
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("The size of the list differs from expected",
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    2, certificates.size());
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (publicKey != null) {
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // verify the signatures
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (Iterator it = certificates.iterator(); it.hasNext();) {
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ((X509Certificate) it.next()).verify(publicKey);
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // testing empty PkiPath structure (ASN.1 such as 0x30, 0x00)
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bais = new ByteArrayInputStream(
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (good[0][0] + "MAB=" + good[0][1]).getBytes("UTF-8")); // "MABCDEFG"
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("The size of the list differs from expected",
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                0, factory.generateCertPath(bais, "PkiPath")
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                .getCertificates().size());
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // testing with bad PEM content
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<bad_content.length; i++) {
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[0][0] + bad_content[i] + good[0][1]).getBytes("UTF-8"));
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais);
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[0][0] + bad_content[i] + good[0][1]).getBytes("UTF-8"));
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais, "PkiPath");
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (good[0][0] + bad_content[i] + good[0][1]).getBytes("UTF-8"));
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais, "PKCS7");
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i=0; i<bad.length; i++) {
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (bad[i][0] + pkiPath + bad[i][1]).getBytes("UTF-8"));
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais);
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (bad[i][0] + pkiPath + bad[i][1]).getBytes("UTF-8"));
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais, "PkiPath");
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bais = new ByteArrayInputStream(
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (bad[i][0] + pkcs7so + bad[i][1]).getBytes("UTF-8"));
718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                factory.generateCertPath(bais, "PKCS7");
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected exception was not thrown");
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) { }
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * generateCertificates method testing.
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateCertificates() throws Exception {
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Testing the Certificates generation
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // on the base of PKCS7 SignedData object
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Base64.decode(pkcs7so.getBytes("UTF-8")));
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Collection certs = factory.generateCertificates(bais);
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Factory returned null on correct PKCS7 data", certs);
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("The size of collection differs from expected",
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                2, certs.size());
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (publicKey != null) {
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // verify the signatures
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (Iterator i = certs.iterator(); i.hasNext();) {
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((X509Certificate) i.next()).verify(publicKey);
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * generateCertificates method testing.
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGenerateCertPath() throws Exception {
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory factory = CertificateFactory.getInstance("X.509");
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Testing the CertPath generation
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // on the base of PKCS7 SignedData object
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Base64.decode(pkcs7so.getBytes("UTF-8")));
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Collection certPath =
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            factory.generateCertPath(bais, "PKCS7").getCertificates();
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("The size of collection differs from expected",
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                2, certPath.size());
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (publicKey != null) {
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // verify the signatures
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (Iterator i = certPath.iterator(); i.hasNext();) {
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ((X509Certificate) i.next()).verify(publicKey);
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // testing empty PkiPath structure (ASN.1 such as 0x30, 0x00)
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bais = new ByteArrayInputStream(new byte[] {(byte) 0x30, 0x00});
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("The size of the list differs from expected",
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                0, factory.generateCertPath(bais, "PkiPath")
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                .getCertificates().size());
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
780