1*c82f2877SAndrew Rist /************************************************************** 2*c82f2877SAndrew Rist * 3*c82f2877SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*c82f2877SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*c82f2877SAndrew Rist * distributed with this work for additional information 6*c82f2877SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*c82f2877SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*c82f2877SAndrew Rist * "License"); you may not use this file except in compliance 9*c82f2877SAndrew Rist * with the License. You may obtain a copy of the License at 10*c82f2877SAndrew Rist * 11*c82f2877SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*c82f2877SAndrew Rist * 13*c82f2877SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*c82f2877SAndrew Rist * software distributed under the License is distributed on an 15*c82f2877SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*c82f2877SAndrew Rist * KIND, either express or implied. See the License for the 17*c82f2877SAndrew Rist * specific language governing permissions and limitations 18*c82f2877SAndrew Rist * under the License. 19*c82f2877SAndrew Rist * 20*c82f2877SAndrew Rist *************************************************************/ 21*c82f2877SAndrew Rist 22*c82f2877SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "precompiled_xmlsecurity.hxx" 25cdf0e10cSrcweir #include "sal/config.h" 26cdf0e10cSrcweir #include "test/officeconnection.hxx" 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <com/sun/star/security/XSanExtension.hpp> 29cdf0e10cSrcweir #include <com/sun/star/security/ExtAltNameType.hpp> 30cdf0e10cSrcweir #include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp> 31cdf0e10cSrcweir #include <com/sun/star/xml/crypto/XSEInitializer.hpp> 32cdf0e10cSrcweir #include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp> 33cdf0e10cSrcweir #include <com/sun/star/security/XCertificate.hpp> 34cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 35cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp> 36cdf0e10cSrcweir #include "com/sun/star/uno/XComponentContext.hpp" 37cdf0e10cSrcweir #include "com/sun/star/uno/Reference.hxx" 38cdf0e10cSrcweir 39cdf0e10cSrcweir #include "cppuhelper/bootstrap.hxx" 40cdf0e10cSrcweir #include "cppunit/TestAssert.h" 41cdf0e10cSrcweir #include "cppunit/TestFixture.h" 42cdf0e10cSrcweir #include "cppunit/extensions/HelperMacros.h" 43cdf0e10cSrcweir #include "cppunit/plugin/TestPlugIn.h" 44cdf0e10cSrcweir #include "sal/types.h" 45cdf0e10cSrcweir #include "comphelper/sequence.hxx" 46cdf0e10cSrcweir #include <rtl/ustring.hxx> 47cdf0e10cSrcweir 48cdf0e10cSrcweir #include <neon/ne_ssl.h> 49cdf0e10cSrcweir 50cdf0e10cSrcweir using namespace com::sun::star; 51cdf0e10cSrcweir 52cdf0e10cSrcweir #define OID_SUBJECT_ALTERNATIVE_NAME "2.5.29.17" 53cdf0e10cSrcweir #define SEINITIALIZER_COMPONENT "com.sun.star.xml.crypto.SEInitializer" 54cdf0e10cSrcweir 55cdf0e10cSrcweir 56cdf0e10cSrcweir namespace { 57cdf0e10cSrcweir 58cdf0e10cSrcweir class Test: public CppUnit::TestFixture { 59cdf0e10cSrcweir 60cdf0e10cSrcweir private: 61cdf0e10cSrcweir static uno::Sequence< security::CertAltNameEntry > altNames; 62cdf0e10cSrcweir static bool runOnce; 63cdf0e10cSrcweir 64cdf0e10cSrcweir uno::Reference< xml::crypto::XSecurityEnvironment > initUno(); 65cdf0e10cSrcweir void init(); 66cdf0e10cSrcweir rtl::OString getB64CertFromFile(const char filename[]); 67cdf0e10cSrcweir test::OfficeConnection connection_; 68cdf0e10cSrcweir 69cdf0e10cSrcweir public: 70cdf0e10cSrcweir 71cdf0e10cSrcweir Test(); 72cdf0e10cSrcweir 73cdf0e10cSrcweir ~Test(); 74cdf0e10cSrcweir 75cdf0e10cSrcweir virtual void setUp(); 76cdf0e10cSrcweir 77cdf0e10cSrcweir virtual void tearDown(); 78cdf0e10cSrcweir 79cdf0e10cSrcweir void test_Others(); 80cdf0e10cSrcweir 81cdf0e10cSrcweir void test_RFC822(); 82cdf0e10cSrcweir 83cdf0e10cSrcweir void test_DNS(); 84cdf0e10cSrcweir 85cdf0e10cSrcweir void test_Direcory(); 86cdf0e10cSrcweir 87cdf0e10cSrcweir void test_URI(); 88cdf0e10cSrcweir 89cdf0e10cSrcweir void test_IP(); 90cdf0e10cSrcweir 91cdf0e10cSrcweir void test_RID(); 92cdf0e10cSrcweir 93cdf0e10cSrcweir void test_EDI(); 94cdf0e10cSrcweir 95cdf0e10cSrcweir void test_X400(); 96cdf0e10cSrcweir 97cdf0e10cSrcweir CPPUNIT_TEST_SUITE(Test); 98cdf0e10cSrcweir CPPUNIT_TEST(test_Others); 99cdf0e10cSrcweir CPPUNIT_TEST(test_RFC822); 100cdf0e10cSrcweir CPPUNIT_TEST(test_DNS); 101cdf0e10cSrcweir CPPUNIT_TEST(test_Direcory); 102cdf0e10cSrcweir CPPUNIT_TEST(test_URI); 103cdf0e10cSrcweir CPPUNIT_TEST(test_IP); 104cdf0e10cSrcweir CPPUNIT_TEST(test_RID); 105cdf0e10cSrcweir CPPUNIT_TEST(test_EDI); 106cdf0e10cSrcweir CPPUNIT_TEST(test_X400); 107cdf0e10cSrcweir CPPUNIT_TEST_SUITE_END(); 108cdf0e10cSrcweir }; 109cdf0e10cSrcweir 110cdf0e10cSrcweir uno::Sequence< security::CertAltNameEntry > Test::altNames; 111cdf0e10cSrcweir bool Test::runOnce = false; 112cdf0e10cSrcweir 113cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(Test); 114cdf0e10cSrcweir 115cdf0e10cSrcweir Test::Test() 116cdf0e10cSrcweir { 117cdf0e10cSrcweir if (runOnce) 118cdf0e10cSrcweir return; 119cdf0e10cSrcweir runOnce = true; 120cdf0e10cSrcweir connection_.setUp(); 121cdf0e10cSrcweir init(); 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir Test::~Test() 125cdf0e10cSrcweir { 126cdf0e10cSrcweir if (runOnce) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir connection_.tearDown(); 129cdf0e10cSrcweir runOnce = false; 130cdf0e10cSrcweir } 131cdf0e10cSrcweir } 132cdf0e10cSrcweir 133cdf0e10cSrcweir 134cdf0e10cSrcweir uno::Reference< xml::crypto::XSecurityEnvironment > Test::initUno() 135cdf0e10cSrcweir { 136cdf0e10cSrcweir uno::Reference< uno::XComponentContext > context(connection_.getComponentContext(), uno::UNO_QUERY_THROW); 137cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > factory(context->getServiceManager(), uno::UNO_QUERY_THROW); 138cdf0e10cSrcweir uno::Reference< xml::crypto::XSEInitializer > xSEInitializer(factory->createInstance( 139cdf0e10cSrcweir rtl::OUString::createFromAscii( SEINITIALIZER_COMPONENT )), uno::UNO_QUERY_THROW); 140cdf0e10cSrcweir uno::Reference< xml::crypto::XXMLSecurityContext > xSecurityContext( 141cdf0e10cSrcweir xSEInitializer->createSecurityContext(rtl::OUString())); 142cdf0e10cSrcweir return xSecurityContext->getSecurityEnvironment(); 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir 146cdf0e10cSrcweir void Test::init() 147cdf0e10cSrcweir { 148cdf0e10cSrcweir uno::Reference< xml::crypto::XSecurityEnvironment > xSecurityEnv = initUno(); 149cdf0e10cSrcweir rtl::OString b64Cert(getB64CertFromFile("User_35_Root_11.crt")); 150cdf0e10cSrcweir uno::Reference< security::XCertificate > xCert = xSecurityEnv->createCertificateFromAscii( 151cdf0e10cSrcweir rtl::OStringToOUString( b64Cert, RTL_TEXTENCODING_ASCII_US ) ); 152cdf0e10cSrcweir uno::Sequence< uno::Reference< security::XCertificateExtension > > extensions = xCert->getExtensions(); 153cdf0e10cSrcweir for (sal_Int32 i = 0 ; i < extensions.getLength(); i++) 154cdf0e10cSrcweir { 155cdf0e10cSrcweir uno::Reference< security::XCertificateExtension >element = extensions[i]; 156cdf0e10cSrcweir rtl::OString aId ( (const sal_Char *)element->getExtensionId().getArray(), element->getExtensionId().getLength()); 157cdf0e10cSrcweir if (aId.equals(OID_SUBJECT_ALTERNATIVE_NAME)) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir uno::Reference< security::XSanExtension > sanExtension ( element, uno::UNO_QUERY ); 160cdf0e10cSrcweir altNames = sanExtension->getAlternativeNames(); 161cdf0e10cSrcweir break; 162cdf0e10cSrcweir } 163cdf0e10cSrcweir } 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir rtl::OString Test::getB64CertFromFile(const char filename[]) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir ne_ssl_certificate* cert = ne_ssl_cert_read(filename); 169cdf0e10cSrcweir char* certExportB64 = ne_ssl_cert_export(cert); 170cdf0e10cSrcweir rtl::OString certB64( certExportB64 ); 171cdf0e10cSrcweir return certB64; 172cdf0e10cSrcweir } 173cdf0e10cSrcweir 174cdf0e10cSrcweir 175cdf0e10cSrcweir void Test::setUp() { 176cdf0e10cSrcweir } 177cdf0e10cSrcweir 178cdf0e10cSrcweir void Test::tearDown() { 179cdf0e10cSrcweir } 180cdf0e10cSrcweir 181cdf0e10cSrcweir void Test::test_Others() { 182cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( altNames.getLength() > 0 ) ); 183cdf0e10cSrcweir for(int n = 1; n < altNames.getLength(); n++) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir if (altNames[n].Type == security::ExtAltNameType_OTHER_NAME) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir ::com::sun::star::beans::NamedValue otherNameProp; 188cdf0e10cSrcweir if (altNames[n].Value >>= otherNameProp) 189cdf0e10cSrcweir { 190cdf0e10cSrcweir CPPUNIT_ASSERT_EQUAL( rtl::OUString::createFromAscii("1.2.3.4"), otherNameProp.Name); 191cdf0e10cSrcweir uno::Sequence< sal_Int8 > ipAddress; 192cdf0e10cSrcweir otherNameProp.Value >>= ipAddress; 193cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( ipAddress.getLength() > 0 ) ); 194cdf0e10cSrcweir } 195cdf0e10cSrcweir } 196cdf0e10cSrcweir } 197cdf0e10cSrcweir } 198cdf0e10cSrcweir 199cdf0e10cSrcweir void Test::test_RFC822() { 200cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( altNames.getLength() > 0 ) ); 201cdf0e10cSrcweir for(int n = 1; n < altNames.getLength(); n++) 202cdf0e10cSrcweir { 203cdf0e10cSrcweir if (altNames[n].Type == security::ExtAltNameType_RFC822_NAME) 204cdf0e10cSrcweir { 205cdf0e10cSrcweir rtl::OUString value; 206cdf0e10cSrcweir altNames[n].Value >>= value; 207cdf0e10cSrcweir CPPUNIT_ASSERT_EQUAL( rtl::OUString::createFromAscii("my@other.address"), value); 208cdf0e10cSrcweir } 209cdf0e10cSrcweir } 210cdf0e10cSrcweir } 211cdf0e10cSrcweir 212cdf0e10cSrcweir void Test::test_DNS() { 213cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( altNames.getLength() > 0 ) ); 214cdf0e10cSrcweir for(int n = 1; n < altNames.getLength(); n++) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir if (altNames[n].Type == security::ExtAltNameType_DNS_NAME) 217cdf0e10cSrcweir { 218cdf0e10cSrcweir rtl::OUString value; 219cdf0e10cSrcweir altNames[n].Value >>= value; 220cdf0e10cSrcweir CPPUNIT_ASSERT_EQUAL( rtl::OUString::createFromAscii("alt.openoffice.org"), value); 221cdf0e10cSrcweir } 222cdf0e10cSrcweir } 223cdf0e10cSrcweir } 224cdf0e10cSrcweir 225cdf0e10cSrcweir void Test::test_Direcory() { 226cdf0e10cSrcweir // Not implemented 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir void Test::test_URI() { 230cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( altNames.getLength() > 0 ) ); 231cdf0e10cSrcweir for(int n = 1; n < altNames.getLength(); n++) 232cdf0e10cSrcweir { 233cdf0e10cSrcweir if (altNames[n].Type == security::ExtAltNameType_URL) 234cdf0e10cSrcweir { 235cdf0e10cSrcweir rtl::OUString value; 236cdf0e10cSrcweir altNames[n].Value >>= value; 237cdf0e10cSrcweir CPPUNIT_ASSERT_EQUAL( rtl::OUString::createFromAscii("http://my.url.here/"), value); 238cdf0e10cSrcweir } 239cdf0e10cSrcweir } 240cdf0e10cSrcweir } 241cdf0e10cSrcweir 242cdf0e10cSrcweir void Test::test_IP() { 243cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( altNames.getLength() > 0 ) ); 244cdf0e10cSrcweir for(int n = 1; n < altNames.getLength(); n++) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir if (altNames[n].Type == security::ExtAltNameType_IP_ADDRESS) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir uno::Sequence< sal_Int8 > ipAddress; 249cdf0e10cSrcweir altNames[n].Value >>= ipAddress; 250cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( ipAddress.getLength() > 0 ) ); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir } 255cdf0e10cSrcweir 256cdf0e10cSrcweir void Test::test_RID() { 257cdf0e10cSrcweir CPPUNIT_ASSERT_ASSERTION_PASS( CPPUNIT_ASSERT( altNames.getLength() > 0 ) ); 258cdf0e10cSrcweir for(int n = 1; n < altNames.getLength(); n++) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir if (altNames[n].Type == security::ExtAltNameType_REGISTERED_ID) 261cdf0e10cSrcweir { 262cdf0e10cSrcweir rtl::OUString value; 263cdf0e10cSrcweir altNames[n].Value >>= value; 264cdf0e10cSrcweir CPPUNIT_ASSERT( rtl::OUString::createFromAscii("1.2.3.4").equals(value)); 265cdf0e10cSrcweir } 266cdf0e10cSrcweir } 267cdf0e10cSrcweir } 268cdf0e10cSrcweir 269cdf0e10cSrcweir void Test::test_EDI() { 270cdf0e10cSrcweir // Not implemented 271cdf0e10cSrcweir } 272cdf0e10cSrcweir 273cdf0e10cSrcweir void Test::test_X400() { 274cdf0e10cSrcweir // Not implemented 275cdf0e10cSrcweir } 276cdf0e10cSrcweir } 277cdf0e10cSrcweir CPPUNIT_PLUGIN_IMPLEMENT(); 278