1*06b3ce53SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*06b3ce53SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*06b3ce53SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*06b3ce53SAndrew Rist * distributed with this work for additional information 6*06b3ce53SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*06b3ce53SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*06b3ce53SAndrew Rist * "License"); you may not use this file except in compliance 9*06b3ce53SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*06b3ce53SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*06b3ce53SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*06b3ce53SAndrew Rist * software distributed under the License is distributed on an 15*06b3ce53SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*06b3ce53SAndrew Rist * KIND, either express or implied. See the License for the 17*06b3ce53SAndrew Rist * specific language governing permissions and limitations 18*06b3ce53SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*06b3ce53SAndrew Rist *************************************************************/ 21*06b3ce53SAndrew Rist 22*06b3ce53SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_xmlsecurity.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <xmlsecurity/biginteger.hxx> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <sal/types.h> 30cdf0e10cSrcweir //For reasons that escape me, this is what xmlsec does when size_t is not 4 31cdf0e10cSrcweir #if SAL_TYPES_SIZEOFPOINTER != 4 32cdf0e10cSrcweir # define XMLSEC_NO_SIZE_T 33cdf0e10cSrcweir #endif 34cdf0e10cSrcweir #include <xmlsec/xmlsec.h> 35cdf0e10cSrcweir #include <xmlsec/bn.h> 36cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir using namespace ::com::sun::star::uno ; 39cdf0e10cSrcweir using ::rtl::OUString ; 40cdf0e10cSrcweir 41cdf0e10cSrcweir Sequence< sal_Int8 > numericStringToBigInteger ( OUString numeral ) 42cdf0e10cSrcweir { 43cdf0e10cSrcweir if( numeral.getStr() != NULL ) 44cdf0e10cSrcweir { 45cdf0e10cSrcweir xmlChar* chNumeral ; 46cdf0e10cSrcweir const xmlSecByte* bnInteger ; 47cdf0e10cSrcweir xmlSecSize length ; 48cdf0e10cSrcweir xmlSecBn bn ; 49cdf0e10cSrcweir 50cdf0e10cSrcweir rtl::OString onumeral = rtl::OUStringToOString( numeral , RTL_TEXTENCODING_ASCII_US ) ; 51cdf0e10cSrcweir 52cdf0e10cSrcweir chNumeral = xmlStrndup( ( const xmlChar* )onumeral.getStr(), ( int )onumeral.getLength() ) ; 53cdf0e10cSrcweir 54cdf0e10cSrcweir if( xmlSecBnInitialize( &bn, 0 ) < 0 ) { 55cdf0e10cSrcweir xmlFree( chNumeral ) ; 56cdf0e10cSrcweir return Sequence< sal_Int8 >(); 57cdf0e10cSrcweir } 58cdf0e10cSrcweir 59cdf0e10cSrcweir if( xmlSecBnFromDecString( &bn, chNumeral ) < 0 ) { 60cdf0e10cSrcweir xmlFree( chNumeral ) ; 61cdf0e10cSrcweir xmlSecBnFinalize( &bn ) ; 62cdf0e10cSrcweir return Sequence< sal_Int8 >(); 63cdf0e10cSrcweir } 64cdf0e10cSrcweir 65cdf0e10cSrcweir xmlFree( chNumeral ) ; 66cdf0e10cSrcweir 67cdf0e10cSrcweir length = xmlSecBnGetSize( &bn ) ; 68cdf0e10cSrcweir if( length <= 0 ) { 69cdf0e10cSrcweir xmlSecBnFinalize( &bn ) ; 70cdf0e10cSrcweir return Sequence< sal_Int8 >(); 71cdf0e10cSrcweir } 72cdf0e10cSrcweir 73cdf0e10cSrcweir bnInteger = xmlSecBnGetData( &bn ) ; 74cdf0e10cSrcweir if( bnInteger == NULL ) { 75cdf0e10cSrcweir xmlSecBnFinalize( &bn ) ; 76cdf0e10cSrcweir return Sequence< sal_Int8 >(); 77cdf0e10cSrcweir } 78cdf0e10cSrcweir 79cdf0e10cSrcweir Sequence< sal_Int8 > integer( length ) ; 80cdf0e10cSrcweir for( unsigned int i = 0 ; i < length ; i ++ ) 81cdf0e10cSrcweir { 82cdf0e10cSrcweir integer[i] = *( bnInteger + i ) ; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir xmlSecBnFinalize( &bn ) ; 86cdf0e10cSrcweir return integer ; 87cdf0e10cSrcweir } 88cdf0e10cSrcweir 89cdf0e10cSrcweir return Sequence< sal_Int8 >(); 90cdf0e10cSrcweir } 91cdf0e10cSrcweir 92cdf0e10cSrcweir OUString bigIntegerToNumericString ( Sequence< sal_Int8 > integer ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir OUString aRet ; 95cdf0e10cSrcweir 96cdf0e10cSrcweir if( integer.getLength() ) { 97cdf0e10cSrcweir xmlSecBn bn ; 98cdf0e10cSrcweir xmlChar* chNumeral ; 99cdf0e10cSrcweir 100cdf0e10cSrcweir if( xmlSecBnInitialize( &bn, 0 ) < 0 ) 101cdf0e10cSrcweir return aRet ; 102cdf0e10cSrcweir 103cdf0e10cSrcweir if( xmlSecBnSetData( &bn, ( const unsigned char* )&integer[0], integer.getLength() ) < 0 ) { 104cdf0e10cSrcweir xmlSecBnFinalize( &bn ) ; 105cdf0e10cSrcweir return aRet ; 106cdf0e10cSrcweir } 107cdf0e10cSrcweir 108cdf0e10cSrcweir chNumeral = xmlSecBnToDecString( &bn ) ; 109cdf0e10cSrcweir if( chNumeral == NULL ) { 110cdf0e10cSrcweir xmlSecBnFinalize( &bn ) ; 111cdf0e10cSrcweir return aRet ; 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir aRet = OUString::createFromAscii( ( const char* )chNumeral ) ; 115cdf0e10cSrcweir 116cdf0e10cSrcweir xmlSecBnFinalize( &bn ) ; 117cdf0e10cSrcweir xmlFree( chNumeral ) ; 118cdf0e10cSrcweir } 119cdf0e10cSrcweir 120cdf0e10cSrcweir return aRet ; 121cdf0e10cSrcweir } 122cdf0e10cSrcweir 123