hi all
 
I meet a run time error "OPENSSL_Uplink(0099E000,07): no OPENSSL_Applink" which 
feaze me several days.
this is my project description:
I had download openssl-0.9.8i. then build it and install it correctly following 
the INSTALL.WIN32 instruction.
I use vs2005 to develop my project
and I had set vs2005 environment such as "MultiThread Debug DLL" etc. Because 
it works well in my other projects.
this project is a bit different because the below function is called by a dll 
project. but the function is the same in dll project and application project.
[source code]
// "MyCryptlib.cpp"
#include "stdafx.h"#include <openssl/ssl.h>
#include "MyCryptlib.h"#include <iostream>using namespace std;
extern "C"{#include <openssl/applink.c>}
CONF *config=NULL;BIO *bio_err=NULL;// encrypt data#define RSA_SIGN  1#define 
RSA_VERIFY  2#define RSA_ENCRYPT  3#define RSA_DECRYPT  4
#define KEY_PRIVKEY 1#define KEY_PUBKEY 2#define KEY_CERT 3
//int EncryptData()int EncryptData(unsigned char* indata, unsigned char* 
outdata, char* pubkeyfile, int& len){  ENGINE *e = NULL; BIO *in = NULL, *out = 
NULL; char *infile = NULL, *outfile = NULL;#ifndef OPENSSL_NO_ENGINE char 
*engine = NULL;#endif char *keyfile = NULL; char rsa_mode = RSA_VERIFY, 
key_type = KEY_PRIVKEY; int keyform = FORMAT_PEM; char need_priv = 0, badarg = 
0, rev = 0; char hexdump = 0, asn1parse = 0; X509 *x; EVP_PKEY *pkey = NULL; 
RSA *rsa = NULL; unsigned char *rsa_in = NULL, *rsa_out = NULL, pad; char 
*passargin = NULL, *passin = NULL; int rsa_inlen, rsa_outlen = 0; int keysize;
 int ret = 1; CRYPTO_malloc_init();SSL_library_init(); if(!bio_err) bio_err = 
BIO_new_fp(stderr, BIO_NOCLOSE);
 if (!load_config(bio_err, NULL))  goto end; ERR_load_crypto_strings(); 
OpenSSL_add_all_algorithms(); pad = RSA_PKCS1_PADDING;  
rsa_mode = RSA_ENCRYPT;key_type = KEY_PUBKEY;keyfile = pubkeyfile;//infile = 
"data.txt";//outfile = "data.ssl";//cerr <<"just for testing BIO_printf\n" << 
endl;
 if(need_priv && (key_type != KEY_PRIVKEY)) {  BIO_printf(bio_err, "A private 
key is needed for this operation\n");  goto end; }
#ifndef OPENSSL_NO_ENGINE        e = setup_engine(bio_err, engine, 0);#endif 
if(!app_passwd(bio_err, passargin, NULL, &passin, NULL)) {  BIO_printf(bio_err, 
"Error getting password\n");  goto end; }
/* FIXME: seed PRNG only if needed */ app_RAND_load_file(NULL, bio_err, 0);  
switch(key_type) {  case KEY_PRIVKEY:  pkey = load_key(bio_err, keyfile, 
keyform, 0,   passin, e, "Private Key");  break;
  case KEY_PUBKEY:  pkey = load_pubkey(bio_err, keyfile, keyform, 0,   NULL, e, 
"Public Key");  break;
  case KEY_CERT:  x = load_cert(bio_err, keyfile, keyform,   NULL, e, 
"Certificate");  if(x) {   pkey = X509_get_pubkey(x);   X509_free(x);  }  
break; }
 if(!pkey) {  return 1; }
 rsa = EVP_PKEY_get1_RSA(pkey); EVP_PKEY_free(pkey);
 if(!rsa) {  BIO_printf(bio_err, "Error getting RSA key\n");  
ERR_print_errors(bio_err);  goto end; }
 if(infile) {  if(!(in = BIO_new_file(infile, "rb"))) {   BIO_printf(bio_err, 
"Error Reading Input File\n");   ERR_print_errors(bio_err);    goto end;  } } 
else in = BIO_new_fp(stdin, BIO_NOCLOSE);
 if(outfile) {  if(!(out = BIO_new_file(outfile, "wb"))) {   
BIO_printf(bio_err, "Error Reading Output File\n");   
ERR_print_errors(bio_err);    goto end;  } } else {  out = BIO_new_fp(stdout, 
BIO_NOCLOSE);#ifdef OPENSSL_SYS_VMS  {      BIO *tmpbio = 
BIO_new(BIO_f_linebuffer());      out = BIO_push(tmpbio, out);  }#endif }
 keysize = RSA_size(rsa);
 rsa_in = (unsigned char *)OPENSSL_malloc(keysize * 2); rsa_out = (unsigned 
char *)OPENSSL_malloc(keysize);
 /* Read the input data */ //rsa_inlen = BIO_read(in, rsa_in, keysize * 2);
 rsa_inlen = strlen((char *)indata);    strcpy((char*)rsa_in, (char*)indata); 
if(rsa_inlen <= 0) {  BIO_printf(bio_err, "Error reading input Data\n");  
exit(1); }  if(rev) {  int i;  unsigned char ctmp;  for(i = 0; i < rsa_inlen/2; 
i++) {   ctmp = rsa_in[i];   rsa_in[i] = rsa_in[rsa_inlen - 1 - i];   
rsa_in[rsa_inlen - 1 - i] = ctmp;  } } switch(rsa_mode) {
  case RSA_VERIFY:   rsa_outlen  = RSA_public_decrypt(rsa_inlen, rsa_in, 
rsa_out, rsa, pad);  break;
  case RSA_SIGN:   rsa_outlen  = RSA_private_encrypt(rsa_inlen, rsa_in, 
rsa_out, rsa, pad);  break;
  case RSA_ENCRYPT:   rsa_outlen  = RSA_public_encrypt(rsa_inlen, rsa_in, 
rsa_out, rsa, pad);  break;
  case RSA_DECRYPT:   rsa_outlen  = RSA_private_decrypt(rsa_inlen, rsa_in, 
rsa_out, rsa, pad);  break;
 }      if(rsa_outlen <= 0) {  BIO_printf(bio_err, "RSA operation error\n");  
ERR_print_errors(bio_err);  goto end; }
memcpy(outdata, rsa_out, rsa_outlen);
outdata[rsa_outlen] = 0;len = 
rsa_outlen;//cout<<"%%%%%%%%%%len%%%%%%%%%"<<len<<endl;ret = 0; if(asn1parse) { 
 if(!ASN1_parse_dump(out, rsa_out, rsa_outlen, 1, -1)) {   
ERR_print_errors(bio_err);  } } else if(hexdump) BIO_dump(out, (char *)rsa_out, 
rsa_outlen); else BIO_write(out, rsa_out, rsa_outlen); end: RSA_free(rsa); 
BIO_free(in); BIO_free_all(out); if(rsa_in) OPENSSL_free(rsa_in); if(rsa_out) 
OPENSSL_free(rsa_out); if(passin) OPENSSL_free(passin); return ret;}
 
this function use a pass in a buffer (indata) , and expect a buffer (outdata)  
out. outdata contains encrypted data.
 
please help me ! thank you for your kind in advance.
 
by the way, I wirte above EncryptData function referring to rsa source code.
 
 
 
 
 
 
_________________________________________________________________
Invite your mail contacts to join your friends list with Windows Live Spaces. 
It's easy!
http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=/friends.aspx&mkt=en-us

Reply via email to