From 12b77cbec33a958f000f0eb424d3bd7d5be8f554 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Tue, 8 Mar 2011 13:27:29 +0000 Subject: [PATCH] Remove need for redirection on RNG and DSS algorithm test programs: some platforms don't support it. --- fips/dsa/fips_dssvs.c | 187 +++++++++++++++++++++-------------------- fips/rand/fips_rngvs.c | 49 ++++++++--- 2 files changed, 133 insertions(+), 103 deletions(-) diff --git a/fips/dsa/fips_dssvs.c b/fips/dsa/fips_dssvs.c index 96f43cd626..ff97808ee2 100644 --- a/fips/dsa/fips_dssvs.c +++ b/fips/dsa/fips_dssvs.c @@ -84,37 +84,15 @@ static int parse_mod(char *line, int *pdsa2, int *pL, int *pN, return 1; } - - -static void pbn(const char *name, BIGNUM *bn) - { - int len, i; - unsigned char *tmp; - len = BN_num_bytes(bn); - tmp = OPENSSL_malloc(len); - if (!tmp) - { - fprintf(stderr, "Memory allocation error\n"); - return; - } - BN_bn2bin(bn, tmp); - printf("%s = ", name); - for (i = 0; i < len; i++) - printf("%02X", tmp[i]); - fputs("\n", stdout); - OPENSSL_free(tmp); - return; - } - -static void primes() +static void primes(FILE *in, FILE *out) { char buf[10240]; char lbuf[10240]; char *keyword, *value; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { - fputs(buf,stdout); + fputs(buf,out); if (!parse_line(&keyword, &value, lbuf, buf)) continue; if(!strcmp(keyword,"Prime")) @@ -123,7 +101,7 @@ static void primes() pp=BN_new(); do_hex2bn(&pp,value); - printf("result= %c\n", + fprintf(out, "result= %c\n", BN_is_prime_ex(pp,20,NULL,NULL) ? 'P' : 'F'); } } @@ -138,7 +116,7 @@ int dsa_builtin_paramgen2(DSA *ret, size_t bits, size_t qbits, unsigned char *seed_out, int *counter_ret, unsigned long *h_ret, BN_GENCB *cb); -static void pqg() +static void pqg(FILE *in, FILE *out) { char buf[1024]; char lbuf[1024]; @@ -146,16 +124,16 @@ static void pqg() int dsa2, L, N; const EVP_MD *md = NULL; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { if (!parse_line(&keyword, &value, lbuf, buf)) { - fputs(buf,stdout); + fputs(buf,out); continue; } if(!strcmp(keyword,"[mod")) { - fputs(buf,stdout); + fputs(buf,out); if (!parse_mod(value, &dsa2, &L, &N, &md)) { fprintf(stderr, "Mod Parse Error\n"); @@ -189,21 +167,20 @@ static void pqg() exit(1); } - pbn("P",dsa->p); - pbn("Q",dsa->q); - pbn("G",dsa->g); - pv("Seed",seed, M_EVP_MD_size(md)); - printf("c = %d\n",counter); - printf("H = %lx\n",h); - putc('\n',stdout); + do_bn_print_name(out, "P",dsa->p); + do_bn_print_name(out, "Q",dsa->q); + do_bn_print_name(out, "G",dsa->g); + OutputValue("Seed",seed, M_EVP_MD_size(md), out, 0); + fprintf(out, "c = %d\n",counter); + fprintf(out, "H = %lx\n\n",h); } } else - fputs(buf,stdout); + fputs(buf,out); } } -static void pqgver() +static void pqgver(FILE *in, FILE *out) { char buf[1024]; char lbuf[1024]; @@ -217,7 +194,7 @@ static void pqgver() int seedlen=-1; unsigned char seed[1024]; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { if (!parse_line(&keyword, &value, lbuf, buf)) { @@ -226,10 +203,10 @@ static void pqgver() part_test = 1; goto partial; } - fputs(buf,stdout); + fputs(buf,out); continue; } - fputs(buf, stdout); + fputs(buf, out); if(!strcmp(keyword,"[mod")) { if (!parse_mod(value, &dsa2, &L, &N, &md)) @@ -283,9 +260,9 @@ static void pqgver() if (BN_cmp(dsa->p, p) || BN_cmp(dsa->q, q) || (!part_test && ((BN_cmp(dsa->g, g) || (counter != counter2) || (h != h2))))) - printf("Result = F\n"); + fprintf(out, "Result = F\n"); else - printf("Result = P\n"); + fprintf(out, "Result = P\n"); BN_free(p); BN_free(q); BN_free(g); @@ -296,7 +273,7 @@ static void pqgver() dsa = NULL; if (part_test) { - fputs(buf,stdout); + fputs(buf,out); part_test = 0; } } @@ -333,7 +310,7 @@ static int dss_paramcheck(int L, int N, BIGNUM *p, BIGNUM *q, BIGNUM *g, return 1; } -static void keyver() +static void keyver(FILE *in, FILE *out) { char buf[1024]; char lbuf[1024]; @@ -347,11 +324,11 @@ static void keyver() ctx = BN_CTX_new(); Y2 = BN_new(); - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { if (!parse_line(&keyword, &value, lbuf, buf)) { - fputs(buf,stdout); + fputs(buf,out); continue; } if(!strcmp(keyword,"[mod")) @@ -388,11 +365,11 @@ static void keyver() fprintf(stderr, "Parse Error\n"); exit (1); } - pbn("P",p); - pbn("Q",q); - pbn("G",g); - pbn("X",X); - pbn("Y",Y); + do_bn_print_name(out, "P",p); + do_bn_print_name(out, "Q",q); + do_bn_print_name(out, "G",g); + do_bn_print_name(out, "X",X); + do_bn_print_name(out, "Y",Y); if (!paramcheck) { if (dss_paramcheck(L, N, p, q, g, ctx)) @@ -401,13 +378,13 @@ static void keyver() paramcheck = -1; } if (paramcheck != 1) - printf("Result = F\n"); + fprintf(out, "Result = F\n"); else { if (!BN_mod_exp(Y2, g, X, p, ctx) || BN_cmp(Y2, Y)) - printf("Result = F\n"); + fprintf(out, "Result = F\n"); else - printf("Result = P\n"); + fprintf(out, "Result = P\n"); } BN_free(X); BN_free(Y); @@ -425,14 +402,14 @@ static void keyver() BN_free(Y2); } -static void keypair() +static void keypair(FILE *in, FILE *out) { char buf[1024]; char lbuf[1024]; char *keyword, *value; int dsa2, L, N; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { if (!parse_line(&keyword, &value, lbuf, buf)) { @@ -445,7 +422,7 @@ static void keypair() fprintf(stderr, "Mod Parse Error\n"); exit (1); } - fputs(buf,stdout); + fputs(buf,out); } else if(!strcmp(keyword,"N")) { @@ -465,25 +442,25 @@ static void keypair() fprintf(stderr, "Parameter Generation error\n"); exit(1); } - pbn("P",dsa->p); - pbn("Q",dsa->q); - pbn("G",dsa->g); - putc('\n',stdout); + 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); while(n--) { if (!DSA_generate_key(dsa)) exit(1); - pbn("X",dsa->priv_key); - pbn("Y",dsa->pub_key); - putc('\n',stdout); + do_bn_print_name(out, "X",dsa->priv_key); + do_bn_print_name(out, "Y",dsa->pub_key); + fputs("\n", out); } } } } -static void siggen() +static void siggen(FILE *in, FILE *out) { char buf[1024]; char lbuf[1024]; @@ -492,14 +469,14 @@ static void siggen() const EVP_MD *md = NULL; DSA *dsa=NULL; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { if (!parse_line(&keyword, &value, lbuf, buf)) { - fputs(buf,stdout); + fputs(buf,out); continue; } - fputs(buf,stdout); + fputs(buf,out); if(!strcmp(keyword,"[mod")) { if (!parse_mod(value, &dsa2, &L, &N, &md)) @@ -522,10 +499,10 @@ static void siggen() fprintf(stderr, "Parameter Generation error\n"); exit(1); } - pbn("P",dsa->p); - pbn("Q",dsa->q); - pbn("G",dsa->g); - putc('\n',stdout); + 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); } else if(!strcmp(keyword,"Msg")) { @@ -539,15 +516,15 @@ static void siggen() if (!DSA_generate_key(dsa)) exit(1); - pbn("Y",dsa->pub_key); + do_bn_print_name(out, "Y",dsa->pub_key); FIPS_digestinit(&mctx, md); FIPS_digestupdate(&mctx, msg, n); sig = FIPS_dsa_sign_ctx(dsa, &mctx); - pbn("R",sig->r); - pbn("S",sig->s); - putc('\n',stdout); + do_bn_print_name(out, "R",sig->r); + do_bn_print_name(out, "S",sig->s); + fputs("\n", out); FIPS_dsa_sig_free(sig); FIPS_md_ctx_cleanup(&mctx); } @@ -556,7 +533,7 @@ static void siggen() FIPS_dsa_free(dsa); } -static void sigver() +static void sigver(FILE *in, FILE *out) { DSA *dsa=NULL; char buf[1024]; @@ -571,14 +548,14 @@ static void sigver() sig->r = NULL; sig->s = NULL; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { if (!parse_line(&keyword, &value, lbuf, buf)) { - fputs(buf,stdout); + fputs(buf,out); continue; } - fputs(buf,stdout); + fputs(buf,out); if(!strcmp(keyword,"[mod")) { if (!parse_mod(value, &dsa2, &L, &N, &md)) @@ -616,15 +593,35 @@ static void sigver() no_err = 0; FIPS_md_ctx_cleanup(&mctx); - printf("Result = %c\n", r == 1 ? 'P' : 'F'); - putc('\n',stdout); + fprintf(out, "Result = %c\n\n", r == 1 ? 'P' : 'F'); } } } int main(int argc,char **argv) { - if(argc != 2) + FILE *in, *out; + if (argc == 4) + { + in = fopen(argv[2], "r"); + if (!in) + { + fprintf(stderr, "Error opening input file\n"); + exit(1); + } + out = fopen(argv[3], "w"); + if (!out) + { + fprintf(stderr, "Error opening output file\n"); + exit(1); + } + } + else if (argc == 2) + { + in = stdin; + out = stdout; + } + else { fprintf(stderr,"%s [prime|pqg|pqgver|keypair|keyver|siggen|sigver]\n",argv[0]); exit(1); @@ -633,25 +630,31 @@ int main(int argc,char **argv) if(!FIPS_mode_set(1)) exit(1); if(!strcmp(argv[1],"prime")) - primes(); + primes(in, out); else if(!strcmp(argv[1],"pqg")) - pqg(); + pqg(in, out); else if(!strcmp(argv[1],"pqgver")) - pqgver(); + pqgver(in, out); else if(!strcmp(argv[1],"keypair")) - keypair(); + keypair(in, out); else if(!strcmp(argv[1],"keyver")) - keyver(); + keyver(in, out); else if(!strcmp(argv[1],"siggen")) - siggen(); + siggen(in, out); else if(!strcmp(argv[1],"sigver")) - sigver(); + sigver(in, out); else { fprintf(stderr,"Don't know how to %s.\n",argv[1]); exit(1); } + if (argc == 4) + { + fclose(in); + fclose(out); + } + return 0; } diff --git a/fips/rand/fips_rngvs.c b/fips/rand/fips_rngvs.c index be03ae3770..786f5420b4 100644 --- a/fips/rand/fips_rngvs.c +++ b/fips/rand/fips_rngvs.c @@ -33,7 +33,7 @@ int main(int argc, char **argv) #include "fips_utl.h" -static void vst() +static void vst(FILE *in, FILE *out) { unsigned char *key = NULL; unsigned char *v = NULL; @@ -46,9 +46,9 @@ static void vst() keylen = 0; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { - fputs(buf,stdout); + fputs(buf,out); if(!strncmp(buf,"[AES 128-Key]", 13)) keylen = 16; else if(!strncmp(buf,"[AES 192-Key]", 13)) @@ -99,7 +99,7 @@ static void vst() return; } - pv("R",ret,16); + OutputValue("R", ret, 16, out, 0); OPENSSL_free(key); key = NULL; OPENSSL_free(dt); @@ -110,7 +110,7 @@ static void vst() } } -static void mct() +static void mct(FILE *in, FILE *out) { unsigned char *key = NULL; unsigned char *v = NULL; @@ -124,9 +124,9 @@ static void mct() keylen = 0; - while(fgets(buf,sizeof buf,stdin) != NULL) + while(fgets(buf,sizeof buf,in) != NULL) { - fputs(buf,stdout); + fputs(buf,out); if(!strncmp(buf,"[AES 128-Key]", 13)) keylen = 16; else if(!strncmp(buf,"[AES 192-Key]", 13)) @@ -187,7 +187,7 @@ static void mct() } } - pv("R",ret,16); + OutputValue("R", ret, 16, out, 0); OPENSSL_free(key); key = NULL; OPENSSL_free(dt); @@ -200,7 +200,28 @@ static void mct() int main(int argc,char **argv) { - if(argc != 2) + FILE *in, *out; + if (argc == 4) + { + in = fopen(argv[2], "r"); + if (!in) + { + fprintf(stderr, "Error opening input file\n"); + exit(1); + } + out = fopen(argv[3], "w"); + if (!out) + { + fprintf(stderr, "Error opening output file\n"); + exit(1); + } + } + else if (argc == 2) + { + in = stdin; + out = stdout; + } + else { fprintf(stderr,"%s [mct|vst]\n",argv[0]); exit(1); @@ -215,15 +236,21 @@ int main(int argc,char **argv) exit(1); } if(!strcmp(argv[1],"mct")) - mct(); + mct(in, out); else if(!strcmp(argv[1],"vst")) - vst(); + vst(in, out); else { fprintf(stderr,"Don't know how to %s.\n",argv[1]); exit(1); } + if (argc == 4) + { + fclose(in); + fclose(out); + } + return 0; } #endif -- 2.25.1