Hello Amit,

Maybe you can explore the "IJW" way...
I use Visual C++ 6 to build my aWin32 pplications and I had to use some .NET Crypto functions such as RSA to communicate with a customer. I've used Visual C++ 2005 Express, in which I add the Win32 environment (from a platform SDK. Express don't have Win32 environment by default...) to compile
the .NET dll and use it from a win32 dll.
The trick is to use #pragma managed / #pragma unmanaged as appropriate

cryptodotnet.h : the include file for win32/.NET

   #ifndef    CRYPTDOTNET_EXPORT
       #define    CRYPTDOTNET_EXPORT    __declspec( dllimport )
   #endif

   #define    CRYPTDOTNET_VERSION    "1.0.0"
   #define    CRYPTDOTNET_DATE    "20100228"

   class CRYPTDOTNET_EXPORT CryptDotNet
   {
     public:
       CryptDotNet()                    {};
       virtual ~CryptDotNet()        {};
       int RSAEncrypt( const char* XmlPublicKey, const unsigned char* Data, 
const int DataLength, char* Base64EncryptBuffer, int* Base64EncryptBufferLength 
);
       ...
   };

cryptodotnet.cpp : compiled with VC++2005

   #define CRYPTDOTNET_EXPORT  __declspec(dllexport)
   #pragma unmanaged
   #include "cryptdotnet.h"
   #include <memory.h>
   #include <string.h>
   #pragma managed

   class    CryptDotNetManaged
   {
   public:
       CryptDotNetManaged()    {};
       ~CryptDotNetManaged()    {};
       int RSAEncrypt( const char* XmlPublicKey, const unsigned char* Data, 
const int DataLength, char* Base64EncryptBuffer, int* Base64EncryptBufferLength 
);
   };

   //Unmanaged interface
   int CryptDotNet::RSAEncrypt( const char* XmlPublicKey, const unsigned char* 
Data, const int DataLength, char* Base64EncryptBuffer, int* 
Base64EncryptBufferLength )
   //
   {
       CryptDotNetManaged    c;
       return c.RSAEncrypt( XmlPublicKey, Data, DataLength, 
Base64EncryptBuffer, Base64EncryptBufferLength );
       }
   // Managed part
   #pragma managed
   using namespace System;
   ...
   int CryptDotNetManaged::RSAEncrypt( .... )
{ ... };
This works very well.
In your case, maybe the applink.c should be considered as unmanaged code.

some references for inspiration...
http://ondotnet.com/pub/a/dotnet/2003/01/13/intromcpp.html
http://www.techheadbrothers.com/Articles.aspx/integrez-code-cplusplus-natif-applications-dotnet-page-1 (sorry... in french...)

and finally the thread "Win32 OPENSSL_USE_APPLINK usage" in OpenSSL-dev

Hope this helps.
Patrice.

Amit Ben Shahar a écrit :
On Fri, Apr 23, 2010 at 21:35, James Mansion <ja...@mansionfamily.plus.com <mailto:ja...@mansionfamily.plus.com>> wrote:

    Amit Ben Shahar wrote:

        One of the crucial ingredients is ssl using OpenSsl. but we
        are encountering a problem with the 'no OPENSSL_Applink' error.
        as this is a .Net project, there is no way (i can think of) to
        compile with the applink.c file.

    1) Why is that crucial?  Microsoft provide crypto support on
    Windows, albeit with a different interface.  What's wrong with
    System.Net.Security.SslStream?

The .Net.Security.SslStream is not working in asynchronous calls, meaning we'd have to implement it in a thread-per-connection paradigm, which is obviously not an option.
    2) Why can't you 'compile with the applink.c file'?  You need a
    talk to it through p/invoke - you may need to write another glue
    DLL to do this.  If you can locate an OpenSSL implementation that
    has been wrapped as a free-threaded COM service, you might find
    things easier if you don't know how to write such glue.  You could
    try looking in Mono's runtime, too, which I suspect delegates to
    OpenSsl (tho I haven't checked).

As far as i understood it, openSsl looks for the applink implementation in the actual application and not in dlls, but i could have misread that, anyhow i'm not sure i would know how to do that, can you maybe directly to such an implmentation (free-threaded COM) ? - in the meantime i'll try checking in Mono, though i've never ever looked at it yet. maybe i'll get lucky ;) thanks

Reply via email to