1 #include <openssl/opensslconf.h>
8 printf("No FIPS DSA support\n");
13 #include <openssl/bn.h>
14 #include <openssl/dsa.h>
15 #include <openssl/fips.h>
16 #include <openssl/err.h>
17 #include <openssl/fips_sha.h>
21 static int parse_line(char **pkw, char **pval, char *linebuf, char *olinebuf)
23 char *keyword, *value, *p, *q;
24 strcpy(linebuf, olinebuf);
26 /* Skip leading space */
27 while (isspace((unsigned char)*keyword))
31 p = strchr(linebuf, '=');
39 /* Remove trailing space */
40 while (isspace((unsigned char)*q))
46 /* Remove leading space from value */
47 while (isspace((unsigned char)*value))
50 /* Remove trailing space from value */
51 p = value + strlen(value) - 1;
53 while (*p == '\n' || isspace((unsigned char)*p))
61 int hex2bin(const char *in, unsigned char *out)
66 for (n1=0,n2=0 ; in[n1] && in[n1] != '\n' ; )
68 if ((in[n1] >= '0') && (in[n1] <= '9'))
70 else if ((in[n1] >= 'A') && (in[n1] <= 'F'))
71 ch = in[n1++] - 'A' + 10;
72 else if ((in[n1] >= 'a') && (in[n1] <= 'f'))
73 ch = in[n1++] - 'a' + 10;
83 if ((in[n1] >= '0') && (in[n1] <= '9'))
85 else if ((in[n1] >= 'A') && (in[n1] <= 'F'))
86 ch = in[n1++] - 'A' + 10;
87 else if ((in[n1] >= 'a') && (in[n1] <= 'f'))
88 ch = in[n1++] - 'a' + 10;
96 BIGNUM *hex2bn(const char *in)
105 int bin2hex(const unsigned char *in,int len,char *out)
110 for (n1=0,n2=0 ; n1 < len ; ++n1)
127 void pv(const char *tag,const unsigned char *val,int len)
131 bin2hex(val,len,obuf);
132 printf("%s = %s\n",tag,obuf);
135 void pbn(const char *tag,const BIGNUM *val)
137 printf("%s = %s\n",tag,BN_bn2hex(val));
144 char *keyword, *value;
146 while(fgets(buf,sizeof buf,stdin) != NULL)
149 if (!parse_line(&keyword, &value, lbuf, buf))
151 if(!strcmp(keyword,"Prime"))
156 BN_hex2bn(&pp,value);
157 printf("result= %c\n",
158 BN_is_prime(pp,20,NULL,NULL,NULL) ? 'P' : 'F');
167 char *keyword, *value;
170 while(fgets(buf,sizeof buf,stdin) != NULL)
172 if (!parse_line(&keyword, &value, lbuf, buf))
177 if(!strcmp(keyword,"[mod"))
179 else if(!strcmp(keyword,"N"))
183 printf("[mod = %d]\n\n",nmod);
187 unsigned char seed[20];
192 dsa=DSA_generate_parameters(nmod,seed,0,&counter,&h,NULL,NULL);
193 printf("P = %s\n",BN_bn2hex(dsa->p));
194 printf("Q = %s\n",BN_bn2hex(dsa->q));
195 printf("G = %s\n",BN_bn2hex(dsa->g));
197 printf("c = %d\n",counter);
198 printf("H = %lx\n",h);
211 char *keyword, *value;
212 BIGNUM *p = NULL, *q = NULL, *g = NULL;
213 int counter, counter2;
217 unsigned char seed[1024];
219 while(fgets(buf,sizeof buf,stdin) != NULL)
221 if (!parse_line(&keyword, &value, lbuf, buf))
226 if(!strcmp(keyword,"[mod"))
228 else if(!strcmp(keyword,"P"))
230 else if(!strcmp(keyword,"Q"))
232 else if(!strcmp(keyword,"G"))
234 else if(!strcmp(keyword,"Seed"))
236 int slen = hex2bin(value, seed);
239 fprintf(stderr, "Seed parse length error\n");
243 else if(!strcmp(keyword,"c"))
244 counter =atoi(buf+4);
245 else if(!strcmp(keyword,"H"))
250 fprintf(stderr, "Parse Error\n");
257 printf("c = %d\n",counter);
258 printf("H = %lx\n",h);
259 dsa=DSA_generate_parameters(nmod,seed,20,&counter2,&h2,NULL,NULL);
260 if (BN_cmp(dsa->p, p) || BN_cmp(dsa->q, q) || BN_cmp(dsa->g, g)
261 || (counter != counter2) || (h != h2))
262 printf("Result = F\n");
264 printf("Result = T\n");
281 char *keyword, *value;
284 while(fgets(buf,sizeof buf,stdin) != NULL)
286 if (!parse_line(&keyword, &value, lbuf, buf))
291 if(!strcmp(keyword,"[mod"))
293 else if(!strcmp(keyword,"N"))
298 printf("[mod = %d]\n\n",nmod);
300 dsa=DSA_generate_parameters(nmod,NULL,0,NULL,NULL,NULL,NULL);
308 DSA_generate_key(dsa);
310 pbn("X",dsa->priv_key);
311 pbn("Y",dsa->pub_key);
322 char *keyword, *value;
326 while(fgets(buf,sizeof buf,stdin) != NULL)
328 if (!parse_line(&keyword, &value, lbuf, buf))
333 if(!strcmp(keyword,"[mod"))
336 printf("[mod = %d]\n\n",nmod);
338 dsa=DSA_generate_parameters(nmod,NULL,0,NULL,NULL,NULL,NULL);
344 else if(!strcmp(keyword,"Msg"))
346 unsigned char msg[1024];
347 unsigned char hash[20];
351 n=hex2bin(value,msg);
354 DSA_generate_key(dsa);
355 pbn("Y",dsa->pub_key);
358 sig=DSA_do_sign(hash,sizeof hash,dsa);
371 char *keyword, *value;
373 unsigned char hash[20];
374 DSA_SIG sg, *sig = &sg;
379 while(fgets(buf,sizeof buf,stdin) != NULL)
381 if (!parse_line(&keyword, &value, lbuf, buf))
386 if(!strcmp(keyword,"[mod"))
393 else if(!strcmp(keyword,"P"))
394 dsa->p=hex2bn(value);
395 else if(!strcmp(keyword,"Q"))
396 dsa->q=hex2bn(value);
397 else if(!strcmp(keyword,"G"))
399 dsa->g=hex2bn(value);
401 printf("[mod = %d]\n\n",nmod);
407 else if(!strcmp(keyword,"Msg"))
409 unsigned char msg[1024];
412 n=hex2bin(value,msg);
416 else if(!strcmp(keyword,"Y"))
417 dsa->pub_key=hex2bn(value);
418 else if(!strcmp(keyword,"R"))
419 sig->r=hex2bn(value);
420 else if(!strcmp(keyword,"S"))
422 sig->s=hex2bn(value);
424 pbn("Y",dsa->pub_key);
427 printf("Result = %c\n",DSA_do_verify(hash,sizeof hash,sig,dsa)
434 int main(int argc,char **argv)
438 fprintf(stderr,"%s [prime|pqg]\n",argv[0]);
441 if(!FIPS_mode_set(1))
443 ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
446 if(!strcmp(argv[1],"prime"))
448 else if(!strcmp(argv[1],"pqg"))
450 else if(!strcmp(argv[1],"pqgver"))
452 else if(!strcmp(argv[1],"keypair"))
454 else if(!strcmp(argv[1],"siggen"))
456 else if(!strcmp(argv[1],"sigver"))
460 fprintf(stderr,"Don't know how to %s.\n",argv[1]);