/** * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.waveprotocol.wave.crypto; import com.google.common.collect.ImmutableList; import junit.framework.TestCase; import java.io.ByteArrayInputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.List; public class CertpathTest extends TestCase { // an actual Google cert, with the Wave critical extension in it private static String GOOGLE_CERT = "-----BEGIN CERTIFICATE-----\n" + "MIIDTzCCArigAwIBAgIKGE0oGAADAAAKczANBgkqhkiG9w0BAQUFADBGMQswCQYD\n" + "VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu\n" + "dGVybmV0IEF1dGhvcml0eTAeFw0wOTA5MTUyMzEyMjlaFw0xMDA5MTUyMzIyMjla\n" + "MGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N\n" + "b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRgwFgYDVQQDEw93YXZl\n" + "c2FuZGJveC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMMniFvA/e5r\n" + "Ecm1MRX8v3MrDpzUJyMNkMBKKZ8fqVPGPoKdB4doX0N/bCtI4toSf7BL8w5ySLnl\n" + "ClHbympLAuJV2wmjnohUHiKPoajPfQAAlDNiGJTcQqB/Jaj5IHU8lG+KZ/XQCD6G\n" + "YUYn4uDPqlrbIN9EwOJRdY9vEQLCZhjPAgMBAAGjggEfMIIBGzAdBgNVHQ4EFgQU\n" + "5hoQeHxOjzqEMLtYFA80dBfU/KAwHwYDVR0jBBgwFoAUv8Aw6/VDET5nup6R+/xq\n" + "2uNrEiQwWwYDVR0fBFQwUjBQoE6gTIZKaHR0cDovL3d3dy5nc3RhdGljLmNvbS9H\n" + "b29nbGVJbnRlcm5ldEF1dGhvcml0eS9Hb29nbGVJbnRlcm5ldEF1dGhvcml0eS5j\n" + "cmwwZgYIKwYBBQUHAQEEWjBYMFYGCCsGAQUFBzAChkpodHRwOi8vd3d3LmdzdGF0\n" + "aWMuY29tL0dvb2dsZUludGVybmV0QXV0aG9yaXR5L0dvb2dsZUludGVybmV0QXV0\n" + "aG9yaXR5LmNydDAUBgorBgEEAdZ5AgEBAQH/BAMCAQEwDQYJKoZIhvcNAQEFBQAD\n" + "gYEAjZPnUv5X27X8dRrJnH2HWnIIA1BQftP9DeQbIZB3N3q5KMarRGNY0Y7LwJ4m\n" + "Rf5NpC+G/Jm1UW7tJDhetfYoZwgFBvl6nmj5cqwuAGwQ4z8XGRqOp89x9PCkVtZR\n" + "WVaVdw8zCf4ZmdgrBud9R+Rq0qkAEpKOR/FuU7PUqe5RJlQ=\n" + "-----END CERTIFICATE-----"; // the actual Google intermediate cert private static String INTERMEDIATE_CERT = "-----BEGIN CERTIFICATE-----\n" + "MIICsDCCAhmgAwIBAgIDC2dxMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT\n" + "MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0\n" + "aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNjA4MjA0MzI3WhcNMTMwNjA3MTk0MzI3\n" + "WjBGMQswCQYDVQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZ\n" + "R29vZ2xlIEludGVybmV0IEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw\n" + "gYkCgYEAye23pIucV+eEPkB9hPSP0XFjU5nneXQUr0SZMyCSjXvlKAy6rWxJfoNf\n" + "NFlOCnowzdDXxFdF7dWq1nMmzq0yE7jXDx07393cCDaob1FEm8rWIFJztyaHNWrb\n" + "qeXUWaUr/GcZOfqTGBhs3t0lig4zFEfC7wFQeeT9adGnwKziV28CAwEAAaOBozCB\n" + "oDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFL/AMOv1QxE+Z7qekfv8atrjaxIk\n" + "MB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQTzOYkJ/UMBIGA1UdEwEB/wQIMAYB\n" + "Af8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20v\n" + "Y3Jscy9zZWN1cmVjYS5jcmwwDQYJKoZIhvcNAQEFBQADgYEAuIojxkiWsRF8YHde\n" + "BZqrocb6ghwYB8TrgbCoZutJqOkM0ymt9e8kTP3kS8p/XmOrmSfLnzYhLLkQYGfN\n" + "0rTw8Ktx5YtaiScRhKqOv5nwnQkhClIZmloJ0pC3+gz4fniisIWvXEyZ2VxVKfml\n" + "UUIuOss4jHg7y/j7lYe8vJD5UDI=\n" + "-----END CERTIFICATE-----"; private CachedCertPathValidator validator; private List<X509Certificate> certs; @Override protected void setUp() throws Exception { TimeSource time = new DefaultTimeSource(); VerifiedCertChainCache cache = new DefaultCacheImpl(time); validator = new CachedCertPathValidator(cache, time, new DefaultTrustRootsProvider()); CertificateFactory fac = CertificateFactory.getInstance("X509"); X509Certificate ourCert = (X509Certificate) fac.generateCertificate( new ByteArrayInputStream(GOOGLE_CERT.getBytes())); X509Certificate intermediateCert = (X509Certificate) fac.generateCertificate( new ByteArrayInputStream(INTERMEDIATE_CERT.getBytes())); certs = ImmutableList.of(ourCert, intermediateCert); } public void testValidator_canGrokCriticalExtension() throws Exception { validator.validate(certs); } }