Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include <sal/config.h>
21 : : #include <rtl/uuid.h>
22 : : #include <rtl/ustring.hxx>
23 : : #include <com/sun/star/security/ExtAltNameType.hpp>
24 : : #include <com/sun/star/security/CertAltNameEntry.hpp>
25 : : #include <com/sun/star/beans/PropertyValue.hpp>
26 : : #include <com/sun/star/uno/Reference.hxx>
27 : : #include <comphelper/sequence.hxx>
28 : : #include <seccomon.h>
29 : : #include <cert.h>
30 : : #include <certt.h>
31 : : #include <secitem.h>
32 : : #include <secport.h>
33 : :
34 : : #include "sanextension_nssimpl.hxx"
35 : :
36 : : using namespace ::com::sun::star;
37 : : using namespace ::com::sun::star::uno ;
38 : : using namespace ::com::sun::star::security ;
39 : : using ::rtl::OUString ;
40 : :
41 : : using ::com::sun::star::security::XCertificateExtension ;
42 : :
43 : :
44 : 0 : SanExtensionImpl :: SanExtensionImpl() :
45 [ # # ][ # # ]: 0 : m_critical( sal_False )
[ # # ]
46 : : {
47 : 0 : }
48 : :
49 [ # # ][ # # ]: 0 : SanExtensionImpl :: ~SanExtensionImpl() {
[ # # ]
50 [ # # ]: 0 : }
51 : :
52 : :
53 : : //Methods from XCertificateExtension
54 : 0 : sal_Bool SAL_CALL SanExtensionImpl :: isCritical() throw( ::com::sun::star::uno::RuntimeException ) {
55 : 0 : return m_critical ;
56 : : }
57 : :
58 : 0 : ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL SanExtensionImpl :: getExtensionId() throw( ::com::sun::star::uno::RuntimeException ) {
59 : 0 : return m_xExtnId ;
60 : : }
61 : :
62 : 0 : ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL SanExtensionImpl :: getExtensionValue() throw( ::com::sun::star::uno::RuntimeException ) {
63 : 0 : return m_xExtnValue ;
64 : : }
65 : :
66 : : namespace {
67 : : // Helper functions from nss/lib/certdb/genname.c
68 : 0 : static int GetNamesLength(CERTGeneralName *names)
69 : : {
70 : 0 : int length = 0;
71 : : CERTGeneralName *first;
72 : :
73 : 0 : first = names;
74 [ # # ]: 0 : if (names != NULL) {
75 [ # # ]: 0 : do {
76 : 0 : length++;
77 : 0 : names = CERT_GetNextGeneralName(names);
78 : : } while (names != first);
79 : : }
80 : 0 : return length;
81 : : }
82 : :
83 : : }
84 : :
85 : : //Methods from XSanExtension
86 : 0 : ::com::sun::star::uno::Sequence< com::sun::star::security::CertAltNameEntry > SAL_CALL SanExtensionImpl :: getAlternativeNames() throw( ::com::sun::star::uno::RuntimeException ){
87 : :
88 [ # # ]: 0 : if (!m_Entries.hasElements())
89 : : {
90 : : SECItem item;
91 : :
92 : 0 : item.type = siDERCertBuffer;
93 [ # # ]: 0 : item.data = (unsigned char*) m_xExtnValue.getArray();
94 : 0 : item.len = m_xExtnValue.getLength();
95 : :
96 : : PRArenaPool *arena;
97 : : CERTGeneralName *nameList;
98 [ # # ]: 0 : arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
99 : :
100 [ # # ]: 0 : if (!arena)
101 [ # # ]: 0 : return m_Entries;
102 : :
103 [ # # ]: 0 : nameList = CERT_DecodeAltNameExtension(arena, &item);
104 : :
105 : 0 : CERTGeneralName* current = nameList;
106 : :
107 [ # # ]: 0 : int size = GetNamesLength(nameList);
108 [ # # ][ # # ]: 0 : CertAltNameEntry* arrCertAltNameEntry = new CertAltNameEntry[size];
109 [ # # ]: 0 : for(int i = 0; i < size ; i++){
110 [ # # # # : 0 : switch (current->type) {
# # # # #
# ]
111 : : case certOtherName: {
112 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_OTHER_NAME;
113 : 0 : ::com::sun::star::beans::PropertyValue otherNameProp;
114 [ # # ]: 0 : otherNameProp.Name = ::rtl::OUString::createFromAscii(CERT_GetOidString(¤t->name.OthName.oid));
115 : :
116 [ # # ]: 0 : Sequence< sal_Int8 > otherName( current->name.OthName.name.len ) ;
117 [ # # ]: 0 : for( unsigned int r = 0; r < current->name.OthName.name.len ; r ++ )
118 [ # # ]: 0 : otherName[r] = *( current->name.OthName.name.data + r ) ;
119 : :
120 [ # # ]: 0 : otherNameProp.Value <<= otherName;
121 : :
122 [ # # ]: 0 : arrCertAltNameEntry[i].Value <<= otherNameProp;
123 [ # # ]: 0 : break;
124 : : }
125 : : case certRFC822Name:
126 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_RFC822_NAME;
127 [ # # ][ # # ]: 0 : arrCertAltNameEntry[i].Value <<= ::rtl::OUString((const sal_Char*)current->name.other.data, current->name.other.len, RTL_TEXTENCODING_ASCII_US);
128 : : break;
129 : : case certDNSName:
130 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_DNS_NAME;
131 [ # # ][ # # ]: 0 : arrCertAltNameEntry[i].Value <<= ::rtl::OUString((const sal_Char*)current->name.other.data, current->name.other.len, RTL_TEXTENCODING_ASCII_US);
132 : : break;
133 : : case certX400Address: {
134 : : // unsupported
135 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_X400_ADDRESS;
136 : : break;
137 : : }
138 : : case certDirectoryName: {
139 : : // unsupported
140 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_DIRECTORY_NAME;
141 : : break;
142 : : }
143 : : case certEDIPartyName: {
144 : : // unsupported
145 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_EDI_PARTY_NAME;
146 : : break;
147 : : }
148 : : case certURI:
149 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_URL;
150 [ # # ][ # # ]: 0 : arrCertAltNameEntry[i].Value <<= ::rtl::OUString((const sal_Char*)current->name.other.data, current->name.other.len, RTL_TEXTENCODING_ASCII_US);
151 : : break;
152 : : case certIPAddress: {
153 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_IP_ADDRESS;
154 : :
155 [ # # ]: 0 : Sequence< sal_Int8 > ipAddress( current->name.other.len ) ;
156 [ # # ]: 0 : for( unsigned int r = 0; r < current->name.other.len ; r ++ )
157 [ # # ]: 0 : ipAddress[r] = *( current->name.other.data + r ) ;
158 : :
159 [ # # ]: 0 : arrCertAltNameEntry[i].Value <<= ipAddress;
160 [ # # ]: 0 : break;
161 : : }
162 : : case certRegisterID:
163 : 0 : arrCertAltNameEntry[i].Type = ExtAltNameType_REGISTERED_ID;
164 : :
165 : :
166 [ # # ]: 0 : rtl::OString nssOid = ::rtl::OString(CERT_GetOidString(¤t->name.other));
167 [ # # ]: 0 : rtl::OString unoOid = removeOIDFromString(nssOid);
168 [ # # ][ # # ]: 0 : arrCertAltNameEntry[i].Value <<= rtl::OStringToOUString( unoOid, RTL_TEXTENCODING_ASCII_US );
169 : 0 : break;
170 : : }
171 [ # # ]: 0 : current = CERT_GetNextGeneralName(current);
172 : : }
173 : :
174 [ # # ][ # # ]: 0 : m_Entries = ::comphelper::arrayToSequence< com::sun::star::security::CertAltNameEntry >(arrCertAltNameEntry, size);
[ # # ]
175 : :
176 [ # # ][ # # ]: 0 : delete [] arrCertAltNameEntry;
177 : :
178 [ # # ]: 0 : PORT_FreeArena(arena, PR_FALSE);
179 : :
180 : :
181 : : }
182 : :
183 : 0 : return m_Entries;
184 : : }
185 : :
186 : 0 : ::rtl::OString SanExtensionImpl :: removeOIDFromString( const ::rtl::OString &oidString)
187 : : {
188 : 0 : ::rtl::OString objID;
189 : 0 : ::rtl::OString oid("OID.");
190 [ # # ]: 0 : if (oidString.match(oid))
191 : 0 : objID = oidString.copy(oid.getLength());
192 : : else
193 : 0 : objID = oidString;
194 : 0 : return objID;
195 : :
196 : : }
197 : :
198 : : //Helper method
199 : 0 : void SanExtensionImpl :: setCertExtn( unsigned char* value, unsigned int vlen, unsigned char* id, unsigned int idlen, sal_Bool critical ) {
200 : : unsigned int i ;
201 [ # # ][ # # ]: 0 : if( value != NULL && vlen != 0 ) {
202 [ # # ]: 0 : Sequence< sal_Int8 > extnv( vlen ) ;
203 [ # # ]: 0 : for( i = 0; i < vlen ; i ++ )
204 [ # # ]: 0 : extnv[i] = *( value + i ) ;
205 : :
206 [ # # ][ # # ]: 0 : m_xExtnValue = extnv ;
207 : : } else {
208 [ # # ]: 0 : m_xExtnValue = Sequence<sal_Int8>();
209 : : }
210 : :
211 [ # # ][ # # ]: 0 : if( id != NULL && idlen != 0 ) {
212 [ # # ]: 0 : Sequence< sal_Int8 > extnId( idlen ) ;
213 [ # # ]: 0 : for( i = 0; i < idlen ; i ++ )
214 [ # # ]: 0 : extnId[i] = *( id + i ) ;
215 : :
216 [ # # ][ # # ]: 0 : m_xExtnId = extnId ;
217 : : } else {
218 [ # # ]: 0 : m_xExtnId = Sequence<sal_Int8>();
219 : : }
220 : :
221 : 0 : m_critical = critical ;
222 : 0 : }
223 : :
224 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|