1
#include <openssl/bn.h>
2
#include <openssl/dsa.h>
3
#include <openssl/fips.h>
4
#include <openssl/err.h>
5
#include <openssl/sha.h>
8
int hex2bin(const char *in, unsigned char *out)
13
for (n1=0,n2=0 ; in[n1] && in[n1] != '\n' ; )
15
if ((in[n1] >= '0') && (in[n1] <= '9'))
17
else if ((in[n1] >= 'A') && (in[n1] <= 'F'))
18
ch = in[n1++] - 'A' + 10;
19
else if ((in[n1] >= 'a') && (in[n1] <= 'f'))
20
ch = in[n1++] - 'a' + 10;
30
if ((in[n1] >= '0') && (in[n1] <= '9'))
32
else if ((in[n1] >= 'A') && (in[n1] <= 'F'))
33
ch = in[n1++] - 'A' + 10;
34
else if ((in[n1] >= 'a') && (in[n1] <= 'f'))
35
ch = in[n1++] - 'a' + 10;
43
BIGNUM *hex2bn(const char *in)
52
int bin2hex(const unsigned char *in,int len,char *out)
57
for (n1=0,n2=0 ; n1 < len ; ++n1)
74
void pv(const char *tag,const unsigned char *val,int len)
78
bin2hex(val,len,obuf);
79
printf("%s = %s\n",tag,obuf);
82
void pbn(const char *tag,const BIGNUM *val)
84
printf("%s = %s\n",tag,BN_bn2hex(val));
91
while(fgets(buf,sizeof buf,stdin) != NULL)
94
if(!strncmp(buf,"Prime= ",7))
100
printf("result= %c\n",
101
BN_is_prime(pp,20,NULL,NULL,NULL) ? 'P' : 'F');
111
while(fgets(buf,sizeof buf,stdin) != NULL)
113
if(!strncmp(buf,"[mod = ",7))
115
else if(!strncmp(buf,"N = ",4))
119
printf("[mod = %d]\n\n",nmod);
123
unsigned char seed[20];
128
dsa=DSA_generate_parameters(nmod,seed,0,&counter,&h,NULL,NULL);
129
printf("P = %s\n",BN_bn2hex(dsa->p));
130
printf("Q = %s\n",BN_bn2hex(dsa->q));
131
printf("G = %s\n",BN_bn2hex(dsa->g));
133
printf("c = %d\n",counter);
134
printf("H = %lx\n",h);
148
while(fgets(buf,sizeof buf,stdin) != NULL)
150
if(!strncmp(buf,"[mod = ",7))
152
else if(!strncmp(buf,"N = ",4))
157
printf("[mod = %d]\n\n",nmod);
159
dsa=DSA_generate_parameters(nmod,NULL,0,NULL,NULL,NULL,NULL);
167
DSA_generate_key(dsa);
169
pbn("X",dsa->priv_key);
170
pbn("Y",dsa->pub_key);
183
while(fgets(buf,sizeof buf,stdin) != NULL)
185
if(!strncmp(buf,"[mod = ",7))
188
printf("[mod = %d]\n\n",nmod);
190
dsa=DSA_generate_parameters(nmod,NULL,0,NULL,NULL,NULL,NULL);
196
else if(!strncmp(buf,"Msg = ",6))
198
unsigned char msg[1024];
199
unsigned char hash[20];
203
n=hex2bin(buf+6,msg);
206
DSA_generate_key(dsa);
207
pbn("Y",dsa->pub_key);
210
sig=DSA_do_sign(hash,sizeof hash,dsa);
223
unsigned char hash[20];
224
DSA_SIG *sig=DSA_SIG_new();
226
while(fgets(buf,sizeof buf,stdin) != NULL)
228
if(!strncmp(buf,"[mod = ",7))
235
else if(!strncmp(buf,"P = ",4))
236
dsa->p=hex2bn(buf+4);
237
else if(!strncmp(buf,"Q = ",4))
238
dsa->q=hex2bn(buf+4);
239
else if(!strncmp(buf,"G = ",4))
241
dsa->g=hex2bn(buf+4);
243
printf("[mod = %d]\n\n",nmod);
249
else if(!strncmp(buf,"Msg = ",6))
251
unsigned char msg[1024];
254
n=hex2bin(buf+6,msg);
258
else if(!strncmp(buf,"Y = ",4))
259
dsa->pub_key=hex2bn(buf+4);
260
else if(!strncmp(buf,"R = ",4))
261
sig->r=hex2bn(buf+4);
262
else if(!strncmp(buf,"S = ",4))
264
sig->s=hex2bn(buf+4);
266
pbn("Y",dsa->pub_key);
269
printf("Result = %c\n",DSA_do_verify(hash,sizeof hash,sig,dsa)
276
int main(int argc,char **argv)
280
fprintf(stderr,"%s [prime|pqg]\n",argv[0]);
283
if(!FIPS_mode_set(1,argv[0]))
285
ERR_load_crypto_strings();
286
ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
289
if(!strcmp(argv[1],"prime"))
291
else if(!strcmp(argv[1],"pqg"))
293
else if(!strcmp(argv[1],"keypair"))
295
else if(!strcmp(argv[1],"siggen"))
297
else if(!strcmp(argv[1],"sigver"))
301
fprintf(stderr,"Don't know how to %s.\n",argv[1]);