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]