Handle partial test where H is absent: needed to check g generation.
[openssl.git] / fips / dsa / fips_dssvs.c
index d355fcb6ff10220fae0f15c0444209fea625b8bb..45bca7c155c1cb28da1344313d6fcd8561dd3c99 100644 (file)
@@ -101,7 +101,7 @@ static void primes(FILE *in, FILE *out)
 
            pp=BN_new();
            do_hex2bn(&pp,value);
-           fprintf(out, "result= %c\n",
+           fprintf(out, "result= %c" RESP_EOL,
                   BN_is_prime_ex(pp,20,NULL,NULL) ? 'P' : 'F');
            }       
        }
@@ -116,6 +116,8 @@ int dsa_builtin_paramgen2(DSA *ret, size_t L, size_t N,
        int idx, unsigned char *seed_out,
        int *counter_ret, unsigned long *h_ret, BN_GENCB *cb);
 
+int dsa_paramgen_check_g(DSA *dsa);
+
 static void pqg(FILE *in, FILE *out)
     {
     char buf[1024];
@@ -145,7 +147,8 @@ static void pqg(FILE *in, FILE *out)
                fputs(buf,out);
                continue;
                }
-       fputs(buf,out);
+       if (strcmp(keyword, "Num"))
+               fputs(buf,out);
        if(!strcmp(keyword,"[mod"))
            {
            if (!parse_mod(value, &dsa2, &L, &N, &md))
@@ -189,11 +192,13 @@ static void pqg(FILE *in, FILE *out)
                                seed, M_EVP_MD_size(md), out, 0);
                if (!dsa2)
                        {
-                       fprintf(out, "c = %d\n",counter);
-                       fprintf(out, "H = %lx\n\n",h);
+                       fprintf(out, "c = %d" RESP_EOL, counter);
+                       fprintf(out, "H = %lx" RESP_EOL RESP_EOL,h);
                        }
                else
-                       fputs("\n", out);
+                       {
+                       fprintf(out, "counter = %d" RESP_EOL RESP_EOL, counter);
+                       }
                }
            }
        else if(!strcmp(keyword,"P"))
@@ -202,6 +207,12 @@ static void pqg(FILE *in, FILE *out)
            q=hex2bn(value);
        else if(!strcmp(keyword,"domain_parameter_seed"))
            seedlen = hex2bin(value, seed);
+       else if(!strcmp(keyword,"firstseed"))
+           seedlen = hex2bin(value, seed);
+       else if(!strcmp(keyword,"pseed"))
+           seedlen += hex2bin(value, seed + seedlen);
+       else if(!strcmp(keyword,"qseed"))
+           seedlen += hex2bin(value, seed + seedlen);
        else if(!strcmp(keyword,"index"))
            {
            idxlen = hex2bin(value, idtmp);
@@ -274,6 +285,12 @@ static void pqgver(FILE *in, FILE *out)
            q=hex2bn(value);
        else if(!strcmp(keyword,"G"))
            g=hex2bn(value);
+       else if(!strcmp(keyword,"firstseed"))
+           seedlen = hex2bin(value, seed);
+       else if(!strcmp(keyword,"pseed"))
+           seedlen += hex2bin(value, seed + seedlen);
+       else if(!strcmp(keyword,"qseed"))
+           seedlen += hex2bin(value, seed + seedlen);
        else if(!strcmp(keyword,"Seed")
                || !strcmp(keyword,"domain_parameter_seed"))
            {
@@ -299,7 +316,27 @@ static void pqgver(FILE *in, FILE *out)
        else if(!strcmp(keyword,"c"))
            counter = atoi(buf+4);
        partial:
-       if(!strcmp(keyword,"H") || part_test)
+       if (part_test && idx < 0 && h == 0 && g)
+           {
+           dsa = FIPS_dsa_new();
+           dsa->p = BN_dup(p);
+           dsa->q = BN_dup(q);
+           dsa->g = BN_dup(g);
+           if (dsa_paramgen_check_g(dsa))
+               fprintf(out, "Result = P" RESP_EOL);
+           else
+               fprintf(out, "Result = F" RESP_EOL);
+           BN_free(p);
+           BN_free(q);
+           BN_free(g);
+           p = NULL;
+           q = NULL;
+           g = NULL;
+           FIPS_dsa_free(dsa);
+           dsa = NULL;
+           part_test = 0;
+           }
+       else if(!strcmp(keyword,"H") || part_test)
            {
            if (!part_test)
                h = atoi(value);
@@ -333,16 +370,16 @@ static void pqgver(FILE *in, FILE *out)
            if (idx >= 0)
                {
                if (BN_cmp(dsa->g, g))
-                       fprintf(out, "Result = F\n");
+                       fprintf(out, "Result = F" RESP_EOL);
                else
-                       fprintf(out, "Result = P\n");
+                       fprintf(out, "Result = P" RESP_EOL);
                }
             else if (BN_cmp(dsa->p, p) || BN_cmp(dsa->q, q) || 
                (!part_test &&
                ((BN_cmp(dsa->g, g) || (counter != counter2) || (h != h2)))))
-               fprintf(out, "Result = F\n");
+               fprintf(out, "Result = F" RESP_EOL);
            else
-               fprintf(out, "Result = P\n");
+               fprintf(out, "Result = P" RESP_EOL);
            BN_free(p);
            BN_free(q);
            BN_free(g);
@@ -460,13 +497,13 @@ static void keyver(FILE *in, FILE *out)
                        paramcheck = -1;
                }
            if (paramcheck != 1)
-               fprintf(out, "Result = F\n");
+               fprintf(out, "Result = F" RESP_EOL);
            else
                {
                if (!BN_mod_exp(Y2, g, X, p, ctx) || BN_cmp(Y2, Y))
-                       fprintf(out, "Result = F\n");
+                       fprintf(out, "Result = F" RESP_EOL);
                else
-                       fprintf(out, "Result = P\n");
+                       fprintf(out, "Result = P" RESP_EOL);
                }
            BN_free(X);
            BN_free(Y);
@@ -527,7 +564,7 @@ static void keypair(FILE *in, FILE *out)
            do_bn_print_name(out, "P",dsa->p);
            do_bn_print_name(out, "Q",dsa->q);
            do_bn_print_name(out, "G",dsa->g);
-           fputs("\n", out);
+           fputs(RESP_EOL, out);
 
            while(n--)
                {
@@ -536,7 +573,7 @@ static void keypair(FILE *in, FILE *out)
 
                do_bn_print_name(out, "X",dsa->priv_key);
                do_bn_print_name(out, "Y",dsa->pub_key);
-               fputs("\n", out);
+               fputs(RESP_EOL, out);
                }
            }
        }
@@ -584,7 +621,7 @@ static void siggen(FILE *in, FILE *out)
            do_bn_print_name(out, "P",dsa->p);
            do_bn_print_name(out, "Q",dsa->q);
            do_bn_print_name(out, "G",dsa->g);
-           fputs("\n", out);
+           fputs(RESP_EOL, out);
            }
        else if(!strcmp(keyword,"Msg"))
            {
@@ -606,7 +643,7 @@ static void siggen(FILE *in, FILE *out)
 
            do_bn_print_name(out, "R",sig->r);
            do_bn_print_name(out, "S",sig->s);
-           fputs("\n", out);
+           fputs(RESP_EOL, out);
            FIPS_dsa_sig_free(sig);
            FIPS_md_ctx_cleanup(&mctx);
            }
@@ -675,7 +712,7 @@ static void sigver(FILE *in, FILE *out)
            no_err = 0;
            FIPS_md_ctx_cleanup(&mctx);
        
-           fprintf(out, "Result = %c\n\n", r == 1 ? 'P' : 'F');
+           fprintf(out, "Result = %c" RESP_EOL RESP_EOL, r == 1 ? 'P' : 'F');
            }
        }
     }