Hi,I tried to build the program in visual studio c++ using some OpenSSL�s functions. The environment is Windows XP and Visual C++ 6.0.
I downloaded the latest version of openSSL (openssl-0.9.7d) from http://www.openssl.org/source and I compiled it with visual C++ under windows.
The commands that I used to built openSSL are describe in the file Install.win32 supplied with openSSL.
I have installed openSSL successfully and I think that the configuration of Visual C++ is well. However I got a serious problem when I
tried to
run my program.
In fact, whenever I try to call any function of openSSL my program embedded.
For example, my program got stuck when it try to call one of the following functions: PEM_read_RSAPrivateKey or RSA_generate_key.
I attached the files. I'll be waiting for you prompt answer. Thanks Saladine
// #include "stdafx.h"
// demo.cpp : Defines the entry point for the console application.
// /* NOCW */
/* demos/spkigen.c
* 18-Mar-1997 - eay - A quick hack :-)
* version 1.1, it would probably help to save or load the
* private key :-)
*/ /* The following two don't exist in SSLeay but they are in here as
* examples */
#define PEM_write_SPKI(fp,x)
\
PEM_ASN1_write((int (*)())i2d_NETSCAPE_SPKI,"SPKI",fp,\
(char *)x,NULL,NULL,0,NULL,NULL) int SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); /* These are defined in the next version of SSLeay */
int EVP_PKEY_assign(EVP_PKEY *pkey, int type,char *key);
//#define RSA_F4 0x10001
#define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\
(char *)(rsa)) int main(int argc,char*
argv[]){
//int argc;
//char *argv[];
RSA *rsa=NULL;
DSA* dsa = NULL;
NETSCAPE_SPKI *spki=NULL;
EVP_PKEY *pkey = NULL;
char buf[128];
int ok=0,i;
FILE *fp;
std::cout <<"Appel a EVP_PKEY_new" <<std::endl;
pkey=EVP_PKEY_new();
std::cout <<"Appel a EVP_PKEY_new reussi" <<std::endl;
if (argc > 2)
{
/* Generate an RSA key, the random state should have been seeded
* with lots of calls to RAND_seed(....) */
fprintf(stderr,"generating RSA key, could take some time...\n");
std::cout <<"Appel a RSA_generate_key" <<std::endl;
if ((rsa=RSA_generate_key(512,RSA_F4,NULL,NULL)) == NULL) goto err;
std::cout <<"Appel a RSA_generate_key reussi"
<<std::endl;
}
else
{
std::cout <<"Lecture de la cle privee :"<< std::endl;
std::cout <<"Etape 1 : ouverture du fichier"<< std::endl;
if ((fp=fopen("C:/sequestre/cles/privkey.pem","r")) == NULL)
{std::cout <<"Fichier introuvable"<< std::endl; perror(argv[1]); goto err; }
std::cout <<"Etape 1 : Terminee avec succes "<<std::endl;
std::cout <<"Etape 2 : Appel � PEM_read_RSAPrivateKey"<< std::endl;
if ((rsa=PEM_read_RSAPrivateKey(fp,NULL,NULL,NULL)) == NULL){
std::cout <<"Etape 2: Echec" <<std::endl;
goto err;
}
std::cout <<"Etape 2 : Terminee avec succes"<<
std::endl;
fclose(fp);
}
if (!EVP_PKEY_assign_RSA(pkey,rsa)) goto err;
rsa=NULL; /* lets make the spki and set the public key and challenge */
if ((spki=NETSCAPE_SPKI_new()) == NULL) goto err; if (!SPKI_set_pubkey(spki,pkey)) goto err; fprintf(stderr,"please enter challenge string:");
fflush(stderr);
buf[0]='\0';
fgets(buf,sizeof
buf,stdin);
i=strlen(buf);
if (i > 0) buf[--i]='\0'; std::cout <<"Appel a ASN1_STRING_set"<< std::endl;
if (!ASN1_STRING_set((ASN1_STRING *)spki->spkac->challenge,
buf,i)) goto err; if (!NETSCAPE_SPKI_sign(spki,pkey,EVP_md5())) goto err;
PEM_write_SPKI(stdout,spki);
if (argc < 2)
PEM_write_RSAPrivateKey(stdout,pkey->pkey.rsa,NULL,NULL,0,NULL,NULL); ok=1;
err:
if (!ok)
{
fprintf(stderr,"something bad happened....");
ERR_print_errors_fp(stderr);
}
NETSCAPE_SPKI_free(spki);
EVP_PKEY_free(pkey);
//exit(!ok);
return !ok;
} /* This function is in the next version of SSLeay */
int EVP_PKEY_assign(EVP_PKEY * pkey,int type,char * key){
//EVP_PKEY *pkey;
//int type;
//char *key;
if (pkey == NULL) return(0);
if (pkey->pkey.ptr != NULL)
{
if (pkey->type == EVP_PKEY_RSA)
RSA_free(pkey->pkey.rsa);
/* else memory leak
*/
}
pkey->type=type;
pkey->pkey.ptr=key;
return(1);
} /* While I have a
* X509_set_pubkey() and X509_REQ_set_pubkey(), SPKI_set_pubkey() does
* not currently exist so here is a version of it.
* The next SSLeay release will probably have
* X509_set_pubkey(),
* X509_REQ_set_pubkey() and
* NETSCAPE_SPKI_set_pubkey()
* as macros calling the same function */
int SPKI_set_pubkey(NETSCAPE_SPKI * x,EVP_PKEY * pkey){
//NETSCAPE_SPKI *x;
//EVP_PKEY *pkey;
int ok=0;
X509_PUBKEY *pk;
X509_ALGOR *a;
ASN1_OBJECT *o;
unsigned char *s,*p;
int i; if (x == NULL) return(0); if ((pk=X509_PUBKEY_new()) == NULL) goto err;
a=pk->algor; /* set the algorithm id */
if ((o=OBJ_nid2obj(pkey->type)) == NULL) goto err;
ASN1_OBJECT_free(a->algorithm);
a->algorithm=o; /* Set the parameter list */
if ((a->parameter == NULL) || (a->parameter->type !=
V_ASN1_NULL))
{
ASN1_TYPE_free(a->parameter);
a->parameter=ASN1_TYPE_new();
a->parameter->type=V_ASN1_NULL;
}
i=i2d_PublicKey(pkey,NULL);
if ((s=(unsigned char *)malloc(i+1)) == NULL) goto err;
p=s;
i2d_PublicKey(pkey,&p);
if (!ASN1_BIT_STRING_set(pk->public_key,s,i)) goto err;
free(s); X509_PUBKEY_free(x->spkac->pubkey);
x->spkac->pubkey=pk;
pk=NULL;
ok=1;
err:
if (pk != NULL) X509_PUBKEY_free(pk);
return(ok);
}
Yahoo! Mail : votre e-mail personnel et gratuit qui vous suit partout !
Cr�ez votre Yahoo! Mail
Dialoguez en direct avec vos amis gr�ce � Yahoo! Messenger !
// demo.cpp : Defines the entry point for the console application. // #include "stdafx.h" // demo.cpp : Defines the entry point for the console application. //
/* NOCW */
/* demos/spkigen.c
* 18-Mar-1997 - eay - A quick hack :-)
* version 1.1, it would probably help to save or load the
* private key :-)
*/
/* The following two don't exist in SSLeay but they are in here as
* examples */
#define PEM_write_SPKI(fp,x) \
PEM_ASN1_write((int (*)())i2d_NETSCAPE_SPKI,"SPKI",fp,\
(char *)x,NULL,NULL,0,NULL,NULL)
int SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey);
/* These are defined in the next version of SSLeay */
int EVP_PKEY_assign(EVP_PKEY *pkey, int type,char *key);
//#define RSA_F4 0x10001
#define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\
(char *)(rsa))
int main(int argc,char* argv[]){
//int argc;
//char *argv[];
RSA *rsa=NULL;
DSA* dsa = NULL;
NETSCAPE_SPKI *spki=NULL;
EVP_PKEY *pkey = NULL;
char buf[128];
int ok=0,i;
FILE *fp;
std::cout <<"Appel a EVP_PKEY_new" <<std::endl;
pkey=EVP_PKEY_new();
std::cout <<"Appel a EVP_PKEY_new reussi" <<std::endl;
if (argc > 2)
{
/* Generate an RSA key, the random state should have been seeded
* with lots of calls to RAND_seed(....) */
fprintf(stderr,"generating RSA key, could take some time...\n");
std::cout <<"Appel a RSA_generate_key" <<std::endl;
if ((rsa=RSA_generate_key(512,RSA_F4,NULL,NULL)) == NULL) goto err;
std::cout <<"Appel a RSA_generate_key reussi" <<std::endl;
}
else
{
std::cout <<"Lecture de la cle privee :"<< std::endl;
std::cout <<"Etape 1 : ouverture du fichier"<< std::endl;
if ((fp=fopen("C:/sequestre/cles/privkey.pem","r")) == NULL)
{std::cout <<"Fichier introuvable"<< std::endl;
perror(argv[1]); goto err; }
std::cout <<"Etape 1 : Terminee avec succes "<<std::endl;
std::cout <<"Etape 2 : Appel � PEM_read_RSAPrivateKey"<< std::endl;
if ((rsa=PEM_read_RSAPrivateKey(fp,NULL,NULL,NULL)) == NULL){
std::cout <<"Etape 2: Echec" <<std::endl;
goto err;
}
std::cout <<"Etape 2 : Terminee avec succes"<< std::endl;
fclose(fp);
}
if (!EVP_PKEY_assign_RSA(pkey,rsa)) goto err;
rsa=NULL;
/* lets make the spki and set the public key and challenge */
if ((spki=NETSCAPE_SPKI_new()) == NULL) goto err;
if (!SPKI_set_pubkey(spki,pkey)) goto err;
fprintf(stderr,"please enter challenge string:");
fflush(stderr);
buf[0]='\0';
fgets(buf,sizeof buf,stdin);
i=strlen(buf);
if (i > 0) buf[--i]='\0';
std::cout <<"Appel a ASN1_STRING_set"<< std::endl;
if (!ASN1_STRING_set((ASN1_STRING *)spki->spkac->challenge,
buf,i)) goto err;
if (!NETSCAPE_SPKI_sign(spki,pkey,EVP_md5())) goto err;
PEM_write_SPKI(stdout,spki);
if (argc < 2)
PEM_write_RSAPrivateKey(stdout,pkey->pkey.rsa,NULL,NULL,0,NULL,NULL);
ok=1;
err:
if (!ok)
{
fprintf(stderr,"something bad happened....");
ERR_print_errors_fp(stderr);
}
NETSCAPE_SPKI_free(spki);
EVP_PKEY_free(pkey);
//exit(!ok);
return !ok;
}
/* This function is in the next version of SSLeay */
int EVP_PKEY_assign(EVP_PKEY * pkey,int type,char * key){
//EVP_PKEY *pkey;
//int type;
//char *key;
if (pkey == NULL) return(0);
if (pkey->pkey.ptr != NULL)
{
if (pkey->type == EVP_PKEY_RSA)
RSA_free(pkey->pkey.rsa);
/* else memory leak */
}
pkey->type=type;
pkey->pkey.ptr=key;
return(1);
}
/* While I have a
* X509_set_pubkey() and X509_REQ_set_pubkey(), SPKI_set_pubkey() does
* not currently exist so here is a version of it.
* The next SSLeay release will probably have
* X509_set_pubkey(),
* X509_REQ_set_pubkey() and
* NETSCAPE_SPKI_set_pubkey()
* as macros calling the same function */
int SPKI_set_pubkey(NETSCAPE_SPKI * x,EVP_PKEY * pkey){
//NETSCAPE_SPKI *x;
//EVP_PKEY *pkey;
int ok=0;
X509_PUBKEY *pk;
X509_ALGOR *a;
ASN1_OBJECT *o;
unsigned char *s,*p;
int i;
if (x == NULL) return(0);
if ((pk=X509_PUBKEY_new()) == NULL) goto err;
a=pk->algor;
/* set the algorithm id */
if ((o=OBJ_nid2obj(pkey->type)) == NULL) goto err;
ASN1_OBJECT_free(a->algorithm);
a->algorithm=o;
/* Set the parameter list */
if ((a->parameter == NULL) || (a->parameter->type != V_ASN1_NULL))
{
ASN1_TYPE_free(a->parameter);
a->parameter=ASN1_TYPE_new();
a->parameter->type=V_ASN1_NULL;
}
i=i2d_PublicKey(pkey,NULL);
if ((s=(unsigned char *)malloc(i+1)) == NULL) goto err;
p=s;
i2d_PublicKey(pkey,&p);
if (!ASN1_BIT_STRING_set(pk->public_key,s,i)) goto err;
free(s);
X509_PUBKEY_free(x->spkac->pubkey);
x->spkac->pubkey=pk;
pk=NULL;
ok=1;
err:
if (pk != NULL) X509_PUBKEY_free(pk);
return(ok);
}
