Run util/openssl-format-source -v -c .
Reviewed-by: Tim Hudson <tjh@openssl.org>
This commit is contained in:
254
demos/spkigen.c
254
demos/spkigen.c
@@ -1,9 +1,9 @@
|
||||
/* 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 :-)
|
||||
* 18-Mar-1997 - eay - A quick hack :-)
|
||||
* version 1.1, it would probably help to save or load the
|
||||
* private key :-)
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -14,149 +14,159 @@
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/pem.h>
|
||||
|
||||
/* The following two don't exist in SSLeay but they are in here as
|
||||
* examples */
|
||||
/*
|
||||
* 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)
|
||||
PEM_ASN1_write((int (*)())i2d_NETSCAPE_SPKI,"SPKI",fp,\
|
||||
(char *)x,NULL,NULL,0,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
|
||||
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))
|
||||
(char *)(rsa))
|
||||
|
||||
int main(argc,argv)
|
||||
int main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
RSA *rsa=NULL;
|
||||
NETSCAPE_SPKI *spki=NULL;
|
||||
EVP_PKEY *pkey=NULL;
|
||||
char buf[128];
|
||||
int ok=0,i;
|
||||
FILE *fp;
|
||||
{
|
||||
RSA *rsa = NULL;
|
||||
NETSCAPE_SPKI *spki = NULL;
|
||||
EVP_PKEY *pkey = NULL;
|
||||
char buf[128];
|
||||
int ok = 0, i;
|
||||
FILE *fp;
|
||||
|
||||
pkey=EVP_PKEY_new();
|
||||
|
||||
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");
|
||||
if ((rsa=RSA_generate_key(512,RSA_F4,NULL)) == NULL) goto err;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((fp=fopen(argv[1],"r")) == NULL)
|
||||
{ perror(argv[1]); goto err; }
|
||||
if ((rsa=PEM_read_RSAPrivateKey(fp,NULL,NULL)) == NULL)
|
||||
goto err;
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (!EVP_PKEY_assign_RSA(pkey,rsa)) goto err;
|
||||
rsa=NULL;
|
||||
pkey = EVP_PKEY_new();
|
||||
|
||||
/* lets make the spki and set the public key and challenge */
|
||||
if ((spki=NETSCAPE_SPKI_new()) == NULL) goto err;
|
||||
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");
|
||||
if ((rsa = RSA_generate_key(512, RSA_F4, NULL)) == NULL)
|
||||
goto err;
|
||||
} else {
|
||||
if ((fp = fopen(argv[1], "r")) == NULL) {
|
||||
perror(argv[1]);
|
||||
goto err;
|
||||
}
|
||||
if ((rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL)) == NULL)
|
||||
goto err;
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (!SPKI_set_pubkey(spki,pkey)) goto err;
|
||||
if (!EVP_PKEY_assign_RSA(pkey, rsa))
|
||||
goto err;
|
||||
rsa = NULL;
|
||||
|
||||
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';
|
||||
if (!ASN1_STRING_set((ASN1_STRING *)spki->spkac->challenge,
|
||||
buf,i)) goto err;
|
||||
/* lets make the spki and set the public key and challenge */
|
||||
if ((spki = NETSCAPE_SPKI_new()) == NULL)
|
||||
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);
|
||||
if (!SPKI_set_pubkey(spki, pkey))
|
||||
goto err;
|
||||
|
||||
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);
|
||||
}
|
||||
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';
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/* This function is in the next version of SSLeay */
|
||||
int EVP_PKEY_assign(pkey,type,key)
|
||||
int EVP_PKEY_assign(pkey, type, 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);
|
||||
}
|
||||
{
|
||||
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(x,pkey)
|
||||
/*
|
||||
* 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(x, 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;
|
||||
{
|
||||
int ok = 0;
|
||||
X509_PUBKEY *pk;
|
||||
X509_ALGOR *a;
|
||||
ASN1_OBJECT *o;
|
||||
unsigned char *s, *p;
|
||||
int i;
|
||||
|
||||
if (x == NULL) return(0);
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
|
||||
if ((pk=X509_PUBKEY_new()) == NULL) goto err;
|
||||
a=pk->algor;
|
||||
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 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);
|
||||
}
|
||||
/* 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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user