Hello! 
Did you use OpenSSL in a VC++ Component before?
I am developing an ATL component with VC++ in windows 2000 environment but
encountered the problem . I am not sure if I can use OpenSSL function in a
component. For example:

pkey = PEM_read_PrivateKey(fp12, NULL,NULL, NULL);??

Pls give me some help.

Zoe

Details::
Hello!
I am developing an ATL component with VC++ in windows 2000 environment.
Actually, I'd like to use this component in a web server.
When Client wants to connect to the Server, Client downloads this
component---OutCtl from Server.
The task of the component OutCtl is:
1. Read private key of the client ( in a special place  of client machine:
key.pem)
2. Do the digital signature   

I set one property of the component as Signature.
Then I'd like to pass this property to Client side by VBScript or JavaScript. 
I will use that property later.
 The function using OpenSSL in my component mainly as the following:
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <string.h>

void COutCtl: : DoSignature( )
{
  int err;
  int sig_len;
  unsigned char sig_buf [4096];
static char keyfile[]  = "D:\key.pem";
  static char data[]     = "I owe you...";
   EVP_MD_CTX     md_ctx;
  EVP_PKEY *      pkey;
  FILE *fp12;

  /* Just load the crypto library error strings,
   * SSL_load_error_strings() loads the crypto AND the SSL ones */
  /* SSL_load_error_strings();*/
  ERR_load_crypto_strings();
  
   OpenSSL_add_all_algorithms();
   
  /* Read private key */
  
  fp12 = fopen (keyfile, "r+");
  if (fp12 == NULL) { 
          printf ("Can't read private key.\n");
          exit (1);

  }
pkey = PEM_read_PrivateKey(fp12, NULL,NULL, NULL);
fclose (fp12);
 
if (pkey == NULL) { 
        ERR_print_errors_fp (stderr);
        exit (1);
  }
  
  /* Do the signature */
  
  EVP_SignInit   (&md_ctx, EVP_sha1());
  EVP_SignUpdate (&md_ctx, data, strlen(data));
  sig_len = sizeof(sig_buf);
  err = EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey);

  if (err != 1) {
        ERR_print_errors_fp(stderr);
        exit (1);
  }
// m_bstrSignature will be passed to the property Signature
m_bstrSignature= (CComBSTR) sig_buf;


  EVP_PKEY_free (pkey);

}


STDMETHODIMP COutCtl::get_Signature (BSTR *pval)
{

*pval= m_bstrSignature;
return S_OK;

} 

Then in a test page OutCtl.html:

<html>
<head>
<title>ATL 3.0 test pages for object OutCtl</title>
</head>
<body>
<OBJECT ID ="OutCtl"  CLASSID="CLSID: 48933cd2_etc......">
<script Language ="VBScript">
document.write ("Hello!! " & OutCtl.Signature)
</script> 

</body></html>

The component OutCtl passed when building Dll .
When I test another property (a string for testing purpose), The test page
OutCtl.html works. But It loaded extremely slowly when I added the funtion void
COutCtl: : DoSignature( ) in my component. There is no error appeared. Only IE
stopped there when open OutCtl.html. I tried to debug step by step. At last I
found the problem appeared when the first statement needing OpenSSL being used:
key = PEM_read_PrivateKey(fp12, NULL,NULL, NULL);

Actually, I have used the same function of void COutCtl: : DoSignature( )  in a
VC++ Application ( not a ATL Component), And the whole application is OK. I can
print out the Signature. 
But Can't I work with Open SSL in a Component? By the way, I have found all the
.h files of OpenSSL in my External Dependencies , such as evp.h, sha.h,
pem.h...Etc. I have set Debug Multithreaded DLL in project setting.

Is there anyone using OPenSSL in a component before? 
I do appreciate if you can give me any information about my problem.

Thank you!

Zoe

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to