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]);