1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_xmlsecurity.hxx"
30*cdf0e10cSrcweir #include <sal/config.h>
31*cdf0e10cSrcweir #include <rtl/uuid.h>
32*cdf0e10cSrcweir #include <rtl/ustring.hxx>
33*cdf0e10cSrcweir #include <com/sun/star/security/ExtAltNameType.hpp>
34*cdf0e10cSrcweir #include <com/sun/star/security/CertAltNameEntry.hpp>
35*cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp>
36*cdf0e10cSrcweir #include <com/sun/star/uno/Reference.hxx>
37*cdf0e10cSrcweir #include <comphelper/sequence.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #ifndef _SANEXTENSION_MSCRYPTIMPL_HXX_
41*cdf0e10cSrcweir #include "sanextension_mscryptimpl.hxx"
42*cdf0e10cSrcweir #endif
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir using namespace ::com::sun::star;
45*cdf0e10cSrcweir using namespace ::com::sun::star::uno ;
46*cdf0e10cSrcweir using namespace ::com::sun::star::security ;
47*cdf0e10cSrcweir using ::rtl::OUString ;
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir using ::com::sun::star::security::XCertificateExtension ;
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir SanExtensionImpl :: SanExtensionImpl() :
53*cdf0e10cSrcweir 	m_critical( sal_False )
54*cdf0e10cSrcweir {
55*cdf0e10cSrcweir }
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir SanExtensionImpl :: ~SanExtensionImpl() {
58*cdf0e10cSrcweir }
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir //Methods from XCertificateExtension
62*cdf0e10cSrcweir sal_Bool SAL_CALL SanExtensionImpl :: isCritical() throw( ::com::sun::star::uno::RuntimeException ) {
63*cdf0e10cSrcweir 	return m_critical ;
64*cdf0e10cSrcweir }
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL SanExtensionImpl :: getExtensionId() throw( ::com::sun::star::uno::RuntimeException ) {
67*cdf0e10cSrcweir 	return m_xExtnId ;
68*cdf0e10cSrcweir }
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL SanExtensionImpl :: getExtensionValue() throw( ::com::sun::star::uno::RuntimeException ) {
71*cdf0e10cSrcweir 	return m_xExtnValue ;
72*cdf0e10cSrcweir }
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir //Methods from XSanExtension
75*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< com::sun::star::security::CertAltNameEntry > SAL_CALL SanExtensionImpl :: getAlternativeNames() throw( ::com::sun::star::uno::RuntimeException ){
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir     if (!m_Entries.hasElements())
78*cdf0e10cSrcweir     {
79*cdf0e10cSrcweir         CERT_ALT_NAME_INFO *subjectName;
80*cdf0e10cSrcweir         DWORD size;
81*cdf0e10cSrcweir         CryptDecodeObjectEx(X509_ASN_ENCODING, X509_ALTERNATE_NAME, (unsigned char*) m_xExtnValue.getArray(), m_xExtnValue.getLength(), CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_NOCOPY_FLAG, NULL,&subjectName, &size);
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir         CertAltNameEntry* arrCertAltNameEntry = new CertAltNameEntry[subjectName->cAltEntry];
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir         for (unsigned int i = 0; i < (unsigned int)subjectName->cAltEntry; i++){
86*cdf0e10cSrcweir           PCERT_ALT_NAME_ENTRY pEntry = &subjectName->rgAltEntry[i];
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir           switch(pEntry->dwAltNameChoice) {
89*cdf0e10cSrcweir             case CERT_ALT_NAME_OTHER_NAME :
90*cdf0e10cSrcweir                 {
91*cdf0e10cSrcweir                     arrCertAltNameEntry[i].Type = ExtAltNameType_OTHER_NAME;
92*cdf0e10cSrcweir                     PCERT_OTHER_NAME pOtherName = pEntry->pOtherName;
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir                     ::com::sun::star::beans::NamedValue otherNameProp;
95*cdf0e10cSrcweir                     otherNameProp.Name = ::rtl::OUString::createFromAscii(pOtherName->pszObjId);
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir                     Sequence< sal_Int8 > otherName( pOtherName->Value.cbData ) ;
98*cdf0e10cSrcweir 		            for( unsigned int n = 0; n < (unsigned int) pOtherName->Value.cbData ; n ++ )
99*cdf0e10cSrcweir 			            otherName[n] = *( pOtherName->Value.pbData + n ) ;
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir                     otherNameProp.Value <<= otherName;
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir                     arrCertAltNameEntry[i].Value <<= otherNameProp;
104*cdf0e10cSrcweir                     break;
105*cdf0e10cSrcweir                 }
106*cdf0e10cSrcweir             case CERT_ALT_NAME_RFC822_NAME :
107*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Type = ExtAltNameType_RFC822_NAME;
108*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Value <<= ::rtl::OUString((const sal_Unicode*)pEntry->pwszRfc822Name);
109*cdf0e10cSrcweir                 break;
110*cdf0e10cSrcweir             case CERT_ALT_NAME_DNS_NAME :
111*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Type = ExtAltNameType_DNS_NAME;
112*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Value <<= ::rtl::OUString((const sal_Unicode*)pEntry->pwszDNSName);
113*cdf0e10cSrcweir                 break;
114*cdf0e10cSrcweir             case CERT_ALT_NAME_DIRECTORY_NAME :
115*cdf0e10cSrcweir                 {
116*cdf0e10cSrcweir                     arrCertAltNameEntry[i].Type = ExtAltNameType_DIRECTORY_NAME;
117*cdf0e10cSrcweir                     break;
118*cdf0e10cSrcweir                 }
119*cdf0e10cSrcweir             case CERT_ALT_NAME_URL :
120*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Type = ExtAltNameType_URL;
121*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Value <<= ::rtl::OUString((const sal_Unicode*)pEntry->pwszURL);
122*cdf0e10cSrcweir                 break;
123*cdf0e10cSrcweir             case CERT_ALT_NAME_IP_ADDRESS :
124*cdf0e10cSrcweir                 {
125*cdf0e10cSrcweir                     arrCertAltNameEntry[i].Type = ExtAltNameType_IP_ADDRESS;
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir                     Sequence< sal_Int8 > ipAddress( pEntry->IPAddress.cbData ) ;
128*cdf0e10cSrcweir 		            for( unsigned int n = 0; n < pEntry->IPAddress.cbData ; n ++ )
129*cdf0e10cSrcweir 			            ipAddress[n] = *( pEntry->IPAddress.pbData + n ) ;
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir                     arrCertAltNameEntry[i].Value <<= ipAddress;
132*cdf0e10cSrcweir                     break;
133*cdf0e10cSrcweir                 }
134*cdf0e10cSrcweir             case CERT_ALT_NAME_REGISTERED_ID :
135*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Type = ExtAltNameType_REGISTERED_ID;
136*cdf0e10cSrcweir                 arrCertAltNameEntry[i].Value <<= ::rtl::OUString::createFromAscii(pEntry->pszRegisteredID);
137*cdf0e10cSrcweir                 break;
138*cdf0e10cSrcweir           }
139*cdf0e10cSrcweir         }
140*cdf0e10cSrcweir         m_Entries = ::comphelper::arrayToSequence< com::sun::star::security::CertAltNameEntry >(arrCertAltNameEntry, subjectName->cAltEntry);
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir         delete [] arrCertAltNameEntry;
143*cdf0e10cSrcweir     }
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir     return m_Entries;
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir //Helper method
149*cdf0e10cSrcweir void SanExtensionImpl :: setCertExtn( ::com::sun::star::uno::Sequence< sal_Int8 > extnId, ::com::sun::star::uno::Sequence< sal_Int8 > extnValue, sal_Bool critical ) {
150*cdf0e10cSrcweir 	m_critical = critical ;
151*cdf0e10cSrcweir 	m_xExtnId = extnId ;
152*cdf0e10cSrcweir 	m_xExtnValue = extnValue ;
153*cdf0e10cSrcweir }
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir void SanExtensionImpl :: setCertExtn( unsigned char* value, unsigned int vlen, unsigned char* id, unsigned int idlen, sal_Bool critical ) {
156*cdf0e10cSrcweir 	unsigned int i ;
157*cdf0e10cSrcweir 	if( value != NULL && vlen != 0 ) {
158*cdf0e10cSrcweir 		Sequence< sal_Int8 > extnv( vlen ) ;
159*cdf0e10cSrcweir 		for( i = 0; i < vlen ; i ++ )
160*cdf0e10cSrcweir 			extnv[i] = *( value + i ) ;
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 		m_xExtnValue = extnv ;
163*cdf0e10cSrcweir 	} else {
164*cdf0e10cSrcweir 		m_xExtnValue = Sequence<sal_Int8>();
165*cdf0e10cSrcweir 	}
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir 	if( id != NULL && idlen != 0 ) {
168*cdf0e10cSrcweir 		Sequence< sal_Int8 > extnId( idlen ) ;
169*cdf0e10cSrcweir 		for( i = 0; i < idlen ; i ++ )
170*cdf0e10cSrcweir 			extnId[i] = *( id + i ) ;
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir 		m_xExtnId = extnId ;
173*cdf0e10cSrcweir 	} else {
174*cdf0e10cSrcweir 		m_xExtnId =  Sequence<sal_Int8>();
175*cdf0e10cSrcweir 	}
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir 	m_critical = critical ;
178*cdf0e10cSrcweir }
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir void SanExtensionImpl :: extractCertExt () {
181*cdf0e10cSrcweir }
182*cdf0e10cSrcweir 
183