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>
23 static void pbn(const char *name, BIGNUM *bn)
27 len = BN_num_bytes(bn);
28 tmp = OPENSSL_malloc(len);
31 fprintf(stderr, "Memory allocation error\n");
35 printf("%s = ", name);
36 for (i = 0; i < len; i++)
37 printf("%02X", tmp[i]);
47 char *keyword, *value;
49 while(fgets(buf,sizeof buf,stdin) != NULL)
52 if (!parse_line(&keyword, &value, lbuf, buf))
54 if(!strcmp(keyword,"Prime"))
60 printf("result= %c\n",
61 BN_is_prime_ex(pp,20,NULL,NULL) ? 'P' : 'F');
70 char *keyword, *value;
73 while(fgets(buf,sizeof buf,stdin) != NULL)
75 if (!parse_line(&keyword, &value, lbuf, buf))
80 if(!strcmp(keyword,"[mod"))
82 else if(!strcmp(keyword,"N"))
86 printf("[mod = %d]\n\n",nmod);
90 unsigned char seed[20];
96 DSA_generate_parameters_ex(dsa, nmod,seed,0,&counter,&h,NULL);
101 printf("c = %d\n",counter);
102 printf("H = %lx\n",h);
115 char *keyword, *value;
118 while(fgets(buf,sizeof buf,stdin) != NULL)
120 if (!parse_line(&keyword, &value, lbuf, buf))
125 if(!strcmp(keyword,"[mod"))
127 else if(!strcmp(keyword,"N"))
132 printf("[mod = %d]\n\n",nmod);
133 dsa = FIPS_dsa_new();
134 DSA_generate_parameters_ex(dsa, nmod,NULL,0,NULL,NULL,NULL);
142 DSA_generate_key(dsa);
144 pbn("X",dsa->priv_key);
145 pbn("Y",dsa->pub_key);
156 char *keyword, *value;
160 while(fgets(buf,sizeof buf,stdin) != NULL)
162 if (!parse_line(&keyword, &value, lbuf, buf))
167 if(!strcmp(keyword,"[mod"))
170 printf("[mod = %d]\n\n",nmod);
172 dsa = FIPS_dsa_new();
173 DSA_generate_parameters_ex(dsa, nmod,NULL,0,NULL,NULL,NULL);
179 else if(!strcmp(keyword,"Msg"))
181 unsigned char msg[1024];
182 unsigned char hash[20];
186 n=hex2bin(value,msg);
189 DSA_generate_key(dsa);
190 pbn("Y",dsa->pub_key);
193 sig=DSA_do_sign(hash,sizeof hash,dsa);
206 char *keyword, *value;
208 unsigned char hash[20];
209 DSA_SIG sg, *sig = &sg;
214 while(fgets(buf,sizeof buf,stdin) != NULL)
216 if (!parse_line(&keyword, &value, lbuf, buf))
221 if(!strcmp(keyword,"[mod"))
228 else if(!strcmp(keyword,"P"))
229 dsa->p=hex2bn(value);
230 else if(!strcmp(keyword,"Q"))
231 dsa->q=hex2bn(value);
232 else if(!strcmp(keyword,"G"))
234 dsa->g=hex2bn(value);
236 printf("[mod = %d]\n\n",nmod);
242 else if(!strcmp(keyword,"Msg"))
244 unsigned char msg[1024];
247 n=hex2bin(value,msg);
251 else if(!strcmp(keyword,"Y"))
252 dsa->pub_key=hex2bn(value);
253 else if(!strcmp(keyword,"R"))
254 sig->r=hex2bn(value);
255 else if(!strcmp(keyword,"S"))
257 sig->s=hex2bn(value);
259 pbn("Y",dsa->pub_key);
262 printf("Result = %c\n",DSA_do_verify(hash,sizeof hash,sig,dsa)
269 int main(int argc,char **argv)
273 fprintf(stderr,"%s [prime|pqg]\n",argv[0]);
276 if(!FIPS_mode_set(1))
281 if(!strcmp(argv[1],"prime"))
283 else if(!strcmp(argv[1],"pqg"))
285 else if(!strcmp(argv[1],"keypair"))
287 else if(!strcmp(argv[1],"siggen"))
289 else if(!strcmp(argv[1],"sigver"))
293 fprintf(stderr,"Don't know how to %s.\n",argv[1]);