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 Hughespackage org.apache.harmony.xnet.provider.jsse;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayInputStream;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.CertificateException;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.CertificateFactory;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.X509Certificate;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.x500.X500Principal;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>CertificateRequest</code> constructors and methods
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class CertificateRequestTest extends TestCase {
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static String base64certEncoding = "-----BEGIN CERTIFICATE-----\n"
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "MIIC+jCCAragAwIBAgICAiswDAYHKoZIzjgEAwEBADAdMRswGQYDVQQKExJDZXJ0a"
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "WZpY2F0ZSBJc3N1ZXIwIhgPMTk3MDAxMTIxMzQ2NDBaGA8xOTcwMDEyNDAzMzMyMF"
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "owHzEdMBsGA1UEChMUU3ViamVjdCBPcmdhbml6YXRpb24wGTAMBgcqhkjOOAQDAQE"
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "AAwkAAQIDBAUGBwiBAgCqggIAVaOCAhQwggIQMA8GA1UdDwEB/wQFAwMBqoAwEgYD"
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "VR0TAQH/BAgwBgEB/wIBBTAUBgNVHSABAf8ECjAIMAYGBFUdIAAwZwYDVR0RAQH/B"
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "F0wW4EMcmZjQDgyMi5OYW1lggdkTlNOYW1lpBcxFTATBgNVBAoTDE9yZ2FuaXphdG"
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "lvboYaaHR0cDovL3VuaWZvcm0uUmVzb3VyY2UuSWSHBP///wCIByoDolyDsgMwDAY"
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "DVR0eAQH/BAIwADAMBgNVHSQBAf8EAjAAMIGZBgNVHSUBAf8EgY4wgYsGBFUdJQAG"
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "CCsGAQUFBwMBBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDB"
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "AYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEFBQcDBwYIKwYBBQUHAwgGCCsGAQUFBw"
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "MJBggrBgEFBQgCAgYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GA1UdNgEB/wQDAgE"
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "BMA4GBCpNhgkBAf8EAwEBATBkBgNVHRIEXTBbgQxyZmNAODIyLk5hbWWCB2ROU05h"
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "bWWkFzEVMBMGA1UEChMMT3JnYW5pemF0aW9uhhpodHRwOi8vdW5pZm9ybS5SZXNvd"
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "XJjZS5JZIcE////AIgHKgOiXIOyAzAJBgNVHR8EAjAAMAoGA1UdIwQDAQEBMAoGA1"
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "UdDgQDAQEBMAoGA1UdIQQDAQEBMAwGByqGSM44BAMBAQADMAAwLQIUAL4QvoazNWP"
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "7jrj84/GZlhm09DsCFQCBKGKCGbrP64VtUt4JPmLjW1VxQA==\n"
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            + "-----END CERTIFICATE-----\n";
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic void testCertificateRequest() throws Exception {
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateFactory certFactory = CertificateFactory.getInstance("X509");
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(base64certEncoding
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getBytes("UTF-8"));
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        X509Certificate cert = (X509Certificate) certFactory.generateCertificate(bais);
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        X509Certificate[] accepted = {cert};
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        X500Principal[] certificate_authorities = {cert.getIssuerX500Principal()};
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] certificate_types = new byte[] { CertificateRequest.RSA_SIGN,
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                CertificateRequest.RSA_FIXED_DH };
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CertificateRequest message = new CertificateRequest(certificate_types,
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                accepted);
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("incorrect type", Handshake.CERTIFICATE_REQUEST, message
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getType());
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("incorrect CertificateRequest", Arrays.equals(
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                message.certificate_types, certificate_types));
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("incorrect CertificateRequest", Arrays.equals(
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                message.certificate_authorities, certificate_authorities));
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		HandshakeIODataStream out = new HandshakeIODataStream();
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		message.send(out);
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] encoded = out.getData(1000);
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("incorrect out data length", message.length(), encoded.length);
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		HandshakeIODataStream in = new HandshakeIODataStream();
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.append(encoded);
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CertificateRequest message_2 = new CertificateRequest(in, message.length());
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("incorrect message decoding",
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Arrays.equals(message.certificate_types, message_2.certificate_types));
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("incorrect message decoding",
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Arrays.equals(message.certificate_authorities, message_2.certificate_authorities));
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.append(encoded);
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			message_2 = new CertificateRequest(in, message.length() - 1);
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Small length: No expected AlertException");
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (AlertException e) {
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.append(encoded);
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.append(new byte[] { 1, 2, 3 });
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			message_2 = new CertificateRequest(in, message.length() + 3);
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("Extra bytes: No expected AlertException ");
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (AlertException e) {
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
105