[xmlsec] Re: problem encrypting when using Windows 2000 ?

Igor Zlatkovic xmlsec@aleksey.com
Wed, 08 Jan 2003 18:06:49 +0100


Good Morning :-)

Of course you put everything in the FAQ. I shall put it online in the 
release notes section as well.

I would still gladly know if Meg's problem has been solved meanwhile?

Ciao,
Igor

Aleksey Sanin wrote:
> Igor,
> 
> Thanks for long explanation! Will you mind if I add this to the FAQ?
> I think this will be helpfull for people and save some time for us :)
> 
> Aleksey
> 
> Igor Zlatkovic wrote:
> 
>> Hi Aleksey,
>>
>> Those pointers being garbage is most often caused by static link 
>> without #defining XMLSEC_STATIC. Another pitfall is using the wrong C 
>> runtime. It is time for another lenghty explanation :-)
>>
>>
>> *STATIC Macros
>> --------------
>>
>> When people link statically to libxmlsec, then they must #define 
>> XMLSEC_STATIC in their source files before including any xmlsec 
>> header. I observe, almost noone is doing that. This macro has no 
>> effect on Unix, but it is vital on Windows.
>>
>> This applies to libxml and libxslt as well, no matter if these are 
>> used directly or not. If just libxmlsec is used, but everything is 
>> linked statically, then there must be a
>>   #define LIBXML_STATIC
>>   #define LIBXSLT_STATIC
>>   #define XMLSEC_STATIC
>> before any xmlsec header is included. Even if the client code doesn't 
>> call into libxml at all, still this must be defined. Xmlsec headers 
>> will include libxml headers and they must have these definitions. 
>> Without them, every variable xmlsec includes from libxml headers will 
>> have __declspec(dllimport) prepended and that will give headaches if 
>> static libxml is used for linking.
>>
>> This scheme makes it possible to have any combination of static and 
>> dynamic libraries in the resulting executable. Its cost is the need to 
>> #define apropriate macros. People would ideally define them by using 
>> the compiler's /D switch in projects that link statically.
>>
>> Note that all this mess originates in MS linker and its inability to 
>> import a variable from a DLL if that variable isn't declared with 
>> apropriate declaration modifier. Since I cannot think of a good reason 
>> for the existence of this requirement, I consider it a bug in MS linker.
>>
>>
>> MS C Runtime
>> ------------
>>
>> Windows basically has two C runtimes. The one is called libc.lib and 
>> can only be linked to statically. The other is called msvcrt.dll and 
>> can only be linked to dynamically. The first one occurs in its 
>> single-threaded and multithreaded variant, which gives three different 
>> runtimes. These three then live in their debug and release 
>> incarnations, which results in six C runtimes, five of which are 
>> designed just to increase overall confusion :-)
>>
>> The art is to choose the right one.
>>
>> libxml, libxslt and libxmlsec, as I compile them, are all linked to 
>> msvcrt.dll. The click-next click-finish wizardry from Visual Studio 
>> chooses the single-threaded libc.lib as the default when you create a 
>> new project. Using my binaries with that default is asking for 
>> trouble. The program will crash as soon as the two runtimes meet.
>>
>> The rule is simple. Exactly the same runtime must be used throughout 
>> the application. Client code must use the same runtime as libxmlsec, 
>> libxml and libxslt. This means, /MD compiler switch must be present 
>> when compiling anything related to the binaries I provide. If someone 
>> needs a different runtime for some reason, then the one must recompile 
>> not only libxmlsec, but libxml and libxslt, perhaps even openssl as well.
>>
>>
>> Ciao,
>> Igor
>>
>>
>>
>> Aleksey Sanin wrote:
>>
>>> Igor,
>>>
>>> Thanks for looking into this! I believe that there is a problem with
>>> exporting pointers from dlls. In xmlsec I have static objects in the
>>> DLL and I export pointers to these objects. The error Meg and
>>> some other folks have is caused by the fact that these pointers are
>>> NULL in the application (or point to garbage in some cases).
>>> AFAIK, libxml and libxslt does not use such technique and there is
>>> no surprise that your binaries work just fine for these libraries :)
>>> When it's a simple and clear operation on *nix, it seems to be a problem
>>> on Windows because of the compiler(s), compiler options or whatever.
>>> I am working on fixing this but this will have to wait till the big new
>>> release because of binary compatibility issues.
>>>
>>> Aleksey
>>>
>>>
>>> Igor Zlatkovic wrote:
>>>
>>>> Hi Meg,
>>>>
>>>> I tried and tried, but wasn't able to reproduce that error.
>>>>
>>>> I use a slightly newer compiler than you do. As far as I know, the 
>>>> binaries produced by that compiler are fully compatible with those 
>>>> produced by VC 6. There should be no problems.
>>>>
>>>> However, there are some, obviously. Things might go good if you 
>>>> recompile xmlsec with VC 6 but I fear that is not the root of the 
>>>> problem. After all, libxml and libxslt binaries on my site are made 
>>>> with the same compiler, are being downloaded fifty times a day in 
>>>> average and many who use them do it with VC 6. The problem never 
>>>> occured in a package other than xmlsec.
>>>>
>>>> I believe that the best way is to find the real source of the peril. 
>>>> If it is in the xmlsec code, it must be fixed. If you did something 
>>>> wrong in your code, then few others are obviously doing the same and 
>>>> it should be discovered what that is. Finally, if the compiler is 
>>>> the problem, then I'll start making binaries with VC 6.
>>>>
>>>> I have produced xmlsec 0.0.11 with VC 6 for you to test. You can get 
>>>> it at
>>>> http://zlatkovic.com/projects/libxml/libxmlsec-0.0.11.win32.vc6.zip
>>>> Check if that one works.
>>>>
>>>> If you have code which demonstrates the error for me to use locally 
>>>> for debugging, it would be very helpful.
>>>>
>>>> Ciao,
>>>> Igor
>>>>
>>>>
>>>> Meg Morgan wrote:
>>>>
>>>>> Greetings,
>>>>>
>>>>> I understand from Alexsey that this problem has been reported before.
>>>>> I am using your binaries and developing a windows application with
>>>>> MS Visual C++ 6.0.  When I call xmlSecEncryptMemory I get an error:
>>>>>
>>>>> xmlSecTransformFind <..\src\transforms.c:331>: error 10:  :
>>>>>   href=http://www.w3.org/2001/04/xmlenc#tripledes-cbc
>>>>>
>>>>>
>>>>> Alexsey writes:
>>>>> "Let me guess, you are using Windows.
>>>>> Most likely you are using Igor's Windows binaries with MS VC 6.0. 
>>>>> There were reported similar problems in this situation and the best 
>>>>> advise I can give is to try to recompile everything by you "native" 
>>>>> compiler."
>>>>>
>>>>> Is there any solution other than for me to compile under Windows 
>>>>> myself?
>>>>>
>>>>> Thank you for your help,
>>>>> meg
>>>>>
>>>>
>>>> _______________________________________________
>>>> xmlsec mailing list
>>>> xmlsec@aleksey.com
>>>> http://www.aleksey.com/mailman/listinfo/xmlsec
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> xmlsec mailing list
>>> xmlsec@aleksey.com
>>> http://www.aleksey.com/mailman/listinfo/xmlsec
>>
>>
>>
>> _______________________________________________
>> xmlsec mailing list
>> xmlsec@aleksey.com
>> http://www.aleksey.com/mailman/listinfo/xmlsec
> 
> 
> 
> 
> _______________________________________________
> xmlsec mailing list
> xmlsec@aleksey.com
> http://www.aleksey.com/mailman/listinfo/xmlsec