xref: /AOO41X/main/xmlsecurity/tools/demo/util2.cxx (revision 06b3ce531745799678cf4bb887ef37436d81238b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmlsecurity.hxx"
26 
27 #include <rtl/locale.h>
28 #include <osl/nlsupport.h>
29 #include <osl/process.h>
30 
31 #include <util.hxx>
32 
33 #include <stdio.h>
34 
35 #include <com/sun/star/registry/XImplementationRegistration.hpp>
36 #include <com/sun/star/security/KeyUsage.hpp>
37 #include <cppuhelper/bootstrap.hxx>
38 #include <xmlsecurity/biginteger.hxx>
39 #include <comphelper/processfactory.hxx>
40 #include <unotools/streamhelper.hxx>
41 
42 #include <rtl/ustrbuf.hxx>
43 #include <tools/string.hxx>
44 
45 namespace cssu = com::sun::star::uno;
46 namespace cssl = com::sun::star::lang;
47 namespace cssxc = com::sun::star::xml::crypto;
48 namespace cssi = com::sun::star::io;
49 
50 using namespace ::com::sun::star;
51 
52 /** convert util::DateTime to ISO Date String */
convertDateTime(::rtl::OUStringBuffer & rBuffer,const com::sun::star::util::DateTime & rDateTime)53 void convertDateTime( ::rtl::OUStringBuffer& rBuffer,
54     const com::sun::star::util::DateTime& rDateTime )
55 {
56     String aString( String::CreateFromInt32( rDateTime.Year ) );
57     aString += '-';
58     if( rDateTime.Month < 10 )
59         aString += '0';
60     aString += String::CreateFromInt32( rDateTime.Month );
61     aString += '-';
62     if( rDateTime.Day < 10 )
63         aString += '0';
64     aString += String::CreateFromInt32( rDateTime.Day );
65 
66     if( rDateTime.Seconds != 0 ||
67         rDateTime.Minutes != 0 ||
68         rDateTime.Hours   != 0 )
69     {
70         aString += 'T';
71         if( rDateTime.Hours < 10 )
72             aString += '0';
73         aString += String::CreateFromInt32( rDateTime.Hours );
74         aString += ':';
75         if( rDateTime.Minutes < 10 )
76             aString += '0';
77         aString += String::CreateFromInt32( rDateTime.Minutes );
78         aString += ':';
79         if( rDateTime.Seconds < 10 )
80             aString += '0';
81         aString += String::CreateFromInt32( rDateTime.Seconds );
82         if ( rDateTime.HundredthSeconds > 0)
83         {
84             aString += ',';
85             if (rDateTime.HundredthSeconds < 10)
86                 aString += '0';
87             aString += String::CreateFromInt32( rDateTime.HundredthSeconds );
88         }
89     }
90 
91     rBuffer.append( aString );
92 }
93 
printHexString(cssu::Sequence<sal_Int8> data)94 ::rtl::OUString printHexString(cssu::Sequence< sal_Int8 > data)
95 {
96     int length = data.getLength();
97     ::rtl::OUString result;
98 
99     char number[4];
100     for (int j=0; j<length; j++)
101     {
102         sprintf(number, "%02X ", (unsigned char)data[j]);
103         result += rtl::OUString::createFromAscii( number );
104     }
105 
106     return result;
107 }
108 
109 
getSignatureInformation(const SignatureInformation & infor,cssu::Reference<::com::sun::star::xml::crypto::XSecurityEnvironment> & xSecurityEnvironment)110 ::rtl::OUString getSignatureInformation(
111     const SignatureInformation& infor,
112     cssu::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment >& xSecurityEnvironment )
113 {
114     char* status[50] = {
115         "STATUS_UNKNOWN",
116         "OPERATION_SUCCEEDED",
117         "RUNTIMEERROR_FAILED",
118         "ENGINE_FAILED",
119         "MALLOC_FAILED",
120         "STRDUP_FAILED",
121         "CRYPTO_FAILED",
122         "XML_FAILED",
123         "XSLT_FAILED",
124         "IO_FAILED",
125         "DISABLED",
126         "NOT_IMPLEMENTED",
127         "INVALID_SIZE",
128         "INVALID_DATA",
129         "INVALID_RESULT",
130         "INVALID_TYPE",
131         "INVALID_OPERATION",
132         "INVALID_STATUS",
133         "INVALID_FORMAT",
134         "DATA_NOT_MATCH",
135         "INVALID_NODE",
136         "INVALID_NODE_CONTENT",
137         "INVALID_NODE_ATTRIBUTE",
138         "MISSING_NODE_ATTRIBUTE",
139         "NODE_ALREADY_PRESENT",
140         "UNEXPECTED_NODE",
141         "NODE_NOT_FOUND",
142         "INVALID_TRANSFORM",
143         "INVALID_TRANSFORM_KEY",
144         "INVALID_URI_TYPE",
145         "TRANSFORM_SAME_DOCUMENT_REQUIRED",
146         "TRANSFORM_DISABLED",
147         "INVALID_KEY_DATA",
148         "KEY_DATA_NOT_FOUND",
149         "KEY_DATA_ALREADY_EXIST",
150         "INVALID_KEY_DATA_SIZE",
151         "KEY_NOT_FOUND",
152         "KEYDATA_DISABLED",
153         "MAX_RETRIEVALS_LEVEL",
154         "MAX_RETRIEVAL_TYPE_MISMATCH",
155         "MAX_ENCKEY_LEVEL",
156         "CERT_VERIFY_FAILED",
157         "CERT_NOT_FOUND",
158         "CERT_REVOKED",
159         "CERT_ISSUER_FAILED",
160         "CERT_NOT_YET_VALID",
161         "CERT_HAS_EXPIRED",
162         "DSIG_NO_REFERENCES",
163         "DSIG_INVALID_REFERENCE",
164         "ASSERTION"};
165 
166     rtl::OUString result;
167 
168     result += rtl::OUString::createFromAscii( "Security Id : " )
169         +rtl::OUString::valueOf(infor.nSecurityId)
170         +rtl::OUString::createFromAscii( "\n" );
171     result += rtl::OUString::createFromAscii( "Status : [" )
172         +rtl::OUString::valueOf((sal_Int32)(infor.nStatus))
173         +rtl::OUString::createFromAscii( "] " )
174         +rtl::OUString::createFromAscii(status[infor.nStatus])
175         +rtl::OUString::createFromAscii( "\n" );
176 
177     const SignatureReferenceInformations& rInfors = infor.vSignatureReferenceInfors;
178     int i;
179     int size = rInfors.size();
180 
181     result += rtl::OUString::createFromAscii( "--References :\n" );
182     for (i=0; i<size; i++)
183     {
184             result += rtl::OUString::createFromAscii( "---URI : " );
185         result += rInfors[i].ouURI;
186         result += rtl::OUString::createFromAscii( "\n" );
187             result += rtl::OUString::createFromAscii( "---DigestValue : " );
188         result += rInfors[i].ouDigestValue;
189         result += rtl::OUString::createFromAscii( "\n" );
190     }
191 
192         if (infor.ouX509IssuerName.getLength()>0)
193         {
194             result += rtl::OUString::createFromAscii( "--X509IssuerName :\n" );
195             result += infor.ouX509IssuerName;
196             result += rtl::OUString::createFromAscii( "\n" );
197         }
198 
199         if (infor.ouX509SerialNumber.getLength()>0)
200         {
201             result += rtl::OUString::createFromAscii( "--X509SerialNumber :\n" );
202             result += infor.ouX509SerialNumber;
203             result += rtl::OUString::createFromAscii( "\n" );
204         }
205 
206         if (infor.ouX509Certificate.getLength()>0)
207         {
208             result += rtl::OUString::createFromAscii( "--X509Certificate :\n" );
209             result += infor.ouX509Certificate;
210             result += rtl::OUString::createFromAscii( "\n" );
211         }
212 
213         if (infor.ouSignatureValue.getLength()>0)
214         {
215             result += rtl::OUString::createFromAscii( "--SignatureValue :\n" );
216             result += infor.ouSignatureValue;
217             result += rtl::OUString::createFromAscii( "\n" );
218         }
219 
220         result += rtl::OUString::createFromAscii( "--Date :\n" );
221 
222     ::rtl::OUStringBuffer buffer;
223     convertDateTime( buffer, infor.stDateTime );
224     result += buffer.makeStringAndClear();
225         result += rtl::OUString::createFromAscii( "\n" );
226 
227         if (infor.ouX509IssuerName.getLength()>0 && infor.ouX509SerialNumber.getLength()>0 && xSecurityEnvironment.is())
228         {
229             result += rtl::OUString::createFromAscii( "--Certificate Path :\n" );
230             cssu::Reference< ::com::sun::star::security::XCertificate > xCert = xSecurityEnvironment->getCertificate( infor.ouX509IssuerName, numericStringToBigInteger(infor.ouX509SerialNumber) );
231             cssu::Sequence < cssu::Reference< ::com::sun::star::security::XCertificate > > xCertPath;
232             if(! xCert.is() )
233             {
234                 fprintf(stdout , " xCert is NULL , so can not buildCertificatePath\n");
235                 return result ;
236             }
237             else
238             {
239                 xCertPath = xSecurityEnvironment->buildCertificatePath( xCert ) ;
240             }
241 
242         for( int i = 0; i < xCertPath.getLength(); i++ )
243         {
244             result += xCertPath[i]->getSubjectName();
245                     result += rtl::OUString::createFromAscii( "\n    Subject public key algorithm : " );
246                     result += xCertPath[i]->getSubjectPublicKeyAlgorithm();
247                     result += rtl::OUString::createFromAscii( "\n    Signature algorithm : " );
248                     result += xCertPath[i]->getSignatureAlgorithm();
249 
250                     result += rtl::OUString::createFromAscii( "\n    Subject public key value : " );
251                     cssu::Sequence< sal_Int8 > keyValue = xCertPath[i]->getSubjectPublicKeyValue();
252                     result += printHexString(keyValue);
253 
254                     result += rtl::OUString::createFromAscii( "\n    Thumbprint (SHA1) : " );
255                     cssu::Sequence< sal_Int8 > SHA1Thumbprint = xCertPath[i]->getSHA1Thumbprint();
256                     result += printHexString(SHA1Thumbprint);
257 
258                     result += rtl::OUString::createFromAscii( "\n    Thumbprint (MD5) : " );
259                     cssu::Sequence< sal_Int8 > MD5Thumbprint = xCertPath[i]->getMD5Thumbprint();
260                     result += printHexString(MD5Thumbprint);
261 
262                     result += rtl::OUString::createFromAscii( "\n  <<\n" );
263         }
264 
265                 result += rtl::OUString::createFromAscii( "\n    Key Usage : " );
266                 sal_Int32 usage = xCert->getCertificateUsage();
267 
268                 if (usage & ::com::sun::star::security::KeyUsage::DIGITAL_SIGNATURE)
269                 {
270                     result += rtl::OUString::createFromAscii( "DIGITAL_SIGNATURE " );
271                 }
272 
273                 if (usage & ::com::sun::star::security::KeyUsage::NON_REPUDIATION)
274                 {
275                     result += rtl::OUString::createFromAscii( "NON_REPUDIATION " );
276                 }
277 
278                 if (usage & ::com::sun::star::security::KeyUsage::KEY_ENCIPHERMENT)
279                 {
280                     result += rtl::OUString::createFromAscii( "KEY_ENCIPHERMENT " );
281                 }
282 
283                 if (usage & ::com::sun::star::security::KeyUsage::DATA_ENCIPHERMENT)
284                 {
285                     result += rtl::OUString::createFromAscii( "DATA_ENCIPHERMENT " );
286                 }
287 
288                 if (usage & ::com::sun::star::security::KeyUsage::KEY_AGREEMENT)
289                 {
290                     result += rtl::OUString::createFromAscii( "KEY_AGREEMENT " );
291                 }
292 
293                 if (usage & ::com::sun::star::security::KeyUsage::KEY_CERT_SIGN)
294                 {
295                     result += rtl::OUString::createFromAscii( "KEY_CERT_SIGN " );
296                 }
297 
298                 if (usage & ::com::sun::star::security::KeyUsage::CRL_SIGN)
299                 {
300                     result += rtl::OUString::createFromAscii( "CRL_SIGN " );
301                 }
302 
303                 result += rtl::OUString::createFromAscii( "\n" );
304         }
305 
306     result += rtl::OUString::createFromAscii( "\n" );
307     return result;
308 }
309 
getSignatureInformations(const SignatureInformations & SignatureInformations,cssu::Reference<::com::sun::star::xml::crypto::XSecurityEnvironment> xSecurityEnvironment)310 ::rtl::OUString getSignatureInformations(
311     const SignatureInformations& SignatureInformations,
312     cssu::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > xSecurityEnvironment )
313 {
314     rtl::OUString result;
315     int i;
316     int size = SignatureInformations.size();
317 
318     for (i=0; i<size; i++)
319     {
320         const SignatureInformation& infor = SignatureInformations[i];
321         result += getSignatureInformation( infor, xSecurityEnvironment );
322     }
323 
324     result += rtl::OUString::createFromAscii( "\n" );
325 
326     return result;
327 }
328 
329 ::com::sun::star::uno::Reference< ::com::sun::star::security::XCertificate >
getCertificateFromEnvironment(::com::sun::star::uno::Reference<::com::sun::star::xml::crypto::XSecurityEnvironment> xSecurityEnvironment,sal_Bool nType)330     getCertificateFromEnvironment( ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment >  xSecurityEnvironment , sal_Bool nType)
331 {
332     cssu::Sequence< cssu::Reference< ::com::sun::star::security::XCertificate > > xPersonalCerts ;
333     int length = 0;
334     int i;
335 
336     // add By CP
337     sal_uInt16 encoding ;
338     rtl_Locale *pLocale = NULL ;
339     osl_getProcessLocale( &pLocale ) ;
340     encoding = osl_getTextEncodingFromLocale( pLocale ) ;
341     // CP end
342 
343     if( nType != sal_False )
344         xPersonalCerts = xSecurityEnvironment->getPersonalCertificates() ;
345     else
346         return NULL; // not support then;
347 
348     length = xPersonalCerts.getLength();
349     if(length == 0)
350     {
351         fprintf( stdout, "\nNo certificate found!\n" ) ;
352         return NULL;
353     }
354 
355     fprintf( stdout, "\nSelect a certificate:\n" ) ;
356     for( i = 0; i < length; i ++ )
357     {
358         rtl::OUString xxxIssuer;
359         rtl::OUString xxxSubject;
360         rtl::OString yyyIssuer;
361         rtl::OString yyySubject;
362 
363         xxxIssuer=xPersonalCerts[i]->getIssuerName();
364         yyyIssuer=rtl::OUStringToOString( xxxIssuer, encoding );
365 
366         xxxSubject=xPersonalCerts[i]->getSubjectName();
367         yyySubject=rtl::OUStringToOString( xxxSubject, encoding );
368 
369         fprintf( stdout, "\n%d:\nsubject=[%s]\nissuer=[%s]\n",
370             i+1,
371             yyySubject.getStr(),
372             yyyIssuer.getStr());
373     }
374 
375     int sel = QuerySelectNumber( 1, length ) -1;
376     return xPersonalCerts[sel] ;
377 }
378 
QueryPrintSignatureDetails(const SignatureInformations & SignatureInformations,::com::sun::star::uno::Reference<::com::sun::star::xml::crypto::XSecurityEnvironment> rSecEnv)379 void QueryPrintSignatureDetails( const SignatureInformations& SignatureInformations, ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > rSecEnv )
380 {
381     char cShowDetails;
382     fprintf( stdout, "\nDisplay details (y/n) [y]?" );
383     fflush( stdout );
384     fscanf( stdin, "%c", &cShowDetails);
385     if ( cShowDetails == 'y' )
386     {
387         rtl_Locale *pLocale = NULL ;
388         osl_getProcessLocale( &pLocale ) ;
389         sal_uInt16 encoding = osl_getTextEncodingFromLocale( pLocale ) ;
390 
391         fprintf( stdout, "------------- Signature details START -------------\n" );
392         fprintf( stdout, "%s",
393             rtl::OUStringToOString(
394                 getSignatureInformations( SignatureInformations, rSecEnv),
395                 encoding).getStr());
396 
397         fprintf( stdout, "------------- Signature details END -------------\n" );
398     }
399 }
400 
QuerySelectNumber(int nMin,int nMax)401 int QuerySelectNumber( int nMin, int nMax )
402 {
403     fprintf( stdout, "\n" ) ;
404     int sel = 0;
405     do
406     {
407         fprintf( stdout, "\nSelect <%d-%d>:", nMin, nMax ) ;
408         fflush( stdout );
409         fscanf( stdin, "%d", &sel ) ;
410     } while( ( sel < nMin ) || ( sel > nMax ) );
411 
412     return sel;
413 }
414 
QueryVerifySignature()415 long QueryVerifySignature()
416 {
417     char answer;
418     fprintf( stdout, "\nFound a signature - verify this one (y/n) [y]?" );
419     fflush( stdout );
420     fscanf( stdin, "%c", &answer);
421     return  (answer == 'n')?0:1;
422 }
423