| Index: openssl/fips/dsa/fips_dssvs.c
|
| ===================================================================
|
| --- openssl/fips/dsa/fips_dssvs.c (revision 105093)
|
| +++ openssl/fips/dsa/fips_dssvs.c (working copy)
|
| @@ -1,537 +0,0 @@
|
| -#include <openssl/opensslconf.h>
|
| -
|
| -#ifndef OPENSSL_FIPS
|
| -#include <stdio.h>
|
| -
|
| -int main(int argc, char **argv)
|
| -{
|
| - printf("No FIPS DSA support\n");
|
| - return(0);
|
| -}
|
| -#else
|
| -
|
| -#include <openssl/bn.h>
|
| -#include <openssl/dsa.h>
|
| -#include <openssl/fips.h>
|
| -#include <openssl/err.h>
|
| -#include <openssl/evp.h>
|
| -#include <string.h>
|
| -#include <ctype.h>
|
| -
|
| -#include "fips_utl.h"
|
| -
|
| -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()
|
| - {
|
| - char buf[10240];
|
| - char lbuf[10240];
|
| - char *keyword, *value;
|
| -
|
| - while(fgets(buf,sizeof buf,stdin) != NULL)
|
| - {
|
| - fputs(buf,stdout);
|
| - if (!parse_line(&keyword, &value, lbuf, buf))
|
| - continue;
|
| - if(!strcmp(keyword,"Prime"))
|
| - {
|
| - BIGNUM *pp;
|
| -
|
| - pp=BN_new();
|
| - do_hex2bn(&pp,value);
|
| - printf("result= %c\n",
|
| - BN_is_prime_ex(pp,20,NULL,NULL) ? 'P' : 'F');
|
| - }
|
| - }
|
| - }
|
| -
|
| -static void pqg()
|
| - {
|
| - char buf[1024];
|
| - char lbuf[1024];
|
| - char *keyword, *value;
|
| - int nmod=0;
|
| -
|
| - while(fgets(buf,sizeof buf,stdin) != NULL)
|
| - {
|
| - if (!parse_line(&keyword, &value, lbuf, buf))
|
| - {
|
| - fputs(buf,stdout);
|
| - continue;
|
| - }
|
| - if(!strcmp(keyword,"[mod"))
|
| - nmod=atoi(value);
|
| - else if(!strcmp(keyword,"N"))
|
| - {
|
| - int n=atoi(value);
|
| -
|
| - printf("[mod = %d]\n\n",nmod);
|
| -
|
| - while(n--)
|
| - {
|
| - unsigned char seed[20];
|
| - DSA *dsa;
|
| - int counter;
|
| - unsigned long h;
|
| - dsa = FIPS_dsa_new();
|
| -
|
| - if (!DSA_generate_parameters_ex(dsa, nmod,seed,0,&counter,&h,NULL))
|
| - {
|
| - do_print_errors();
|
| - exit(1);
|
| - }
|
| - pbn("P",dsa->p);
|
| - pbn("Q",dsa->q);
|
| - pbn("G",dsa->g);
|
| - pv("Seed",seed,20);
|
| - printf("c = %d\n",counter);
|
| - printf("H = %lx\n",h);
|
| - putc('\n',stdout);
|
| - }
|
| - }
|
| - else
|
| - fputs(buf,stdout);
|
| - }
|
| - }
|
| -
|
| -static void pqgver()
|
| - {
|
| - char buf[1024];
|
| - char lbuf[1024];
|
| - char *keyword, *value;
|
| - BIGNUM *p = NULL, *q = NULL, *g = NULL;
|
| - int counter, counter2;
|
| - unsigned long h, h2;
|
| - DSA *dsa=NULL;
|
| - int nmod=0;
|
| - unsigned char seed[1024];
|
| -
|
| - while(fgets(buf,sizeof buf,stdin) != NULL)
|
| - {
|
| - if (!parse_line(&keyword, &value, lbuf, buf))
|
| - {
|
| - fputs(buf,stdout);
|
| - continue;
|
| - }
|
| - fputs(buf, stdout);
|
| - if(!strcmp(keyword,"[mod"))
|
| - nmod=atoi(value);
|
| - else if(!strcmp(keyword,"P"))
|
| - p=hex2bn(value);
|
| - else if(!strcmp(keyword,"Q"))
|
| - q=hex2bn(value);
|
| - else if(!strcmp(keyword,"G"))
|
| - g=hex2bn(value);
|
| - else if(!strcmp(keyword,"Seed"))
|
| - {
|
| - int slen = hex2bin(value, seed);
|
| - if (slen != 20)
|
| - {
|
| - fprintf(stderr, "Seed parse length error\n");
|
| - exit (1);
|
| - }
|
| - }
|
| - else if(!strcmp(keyword,"c"))
|
| - counter =atoi(buf+4);
|
| - else if(!strcmp(keyword,"H"))
|
| - {
|
| - h = atoi(value);
|
| - if (!p || !q || !g)
|
| - {
|
| - fprintf(stderr, "Parse Error\n");
|
| - exit (1);
|
| - }
|
| - dsa = FIPS_dsa_new();
|
| - if (!DSA_generate_parameters_ex(dsa, nmod,seed,20 ,&counter2,&h2,NULL))
|
| - {
|
| - do_print_errors();
|
| - exit(1);
|
| - }
|
| - if (BN_cmp(dsa->p, p) || BN_cmp(dsa->q, q) || BN_cmp(dsa->g, g)
|
| - || (counter != counter2) || (h != h2))
|
| - printf("Result = F\n");
|
| - else
|
| - printf("Result = P\n");
|
| - BN_free(p);
|
| - BN_free(q);
|
| - BN_free(g);
|
| - p = NULL;
|
| - q = NULL;
|
| - g = NULL;
|
| - FIPS_dsa_free(dsa);
|
| - dsa = NULL;
|
| - }
|
| - }
|
| - }
|
| -
|
| -/* Keypair verification routine. NB: this isn't part of the standard FIPS140-2
|
| - * algorithm tests. It is an additional test to perform sanity checks on the
|
| - * output of the KeyPair test.
|
| - */
|
| -
|
| -static int dss_paramcheck(int nmod, BIGNUM *p, BIGNUM *q, BIGNUM *g,
|
| - BN_CTX *ctx)
|
| - {
|
| - BIGNUM *rem = NULL;
|
| - if (BN_num_bits(p) != nmod)
|
| - return 0;
|
| - if (BN_num_bits(q) != 160)
|
| - return 0;
|
| - if (BN_is_prime_ex(p, BN_prime_checks, ctx, NULL) != 1)
|
| - return 0;
|
| - if (BN_is_prime_ex(q, BN_prime_checks, ctx, NULL) != 1)
|
| - return 0;
|
| - rem = BN_new();
|
| - if (!BN_mod(rem, p, q, ctx) || !BN_is_one(rem)
|
| - || (BN_cmp(g, BN_value_one()) <= 0)
|
| - || !BN_mod_exp(rem, g, q, p, ctx) || !BN_is_one(rem))
|
| - {
|
| - BN_free(rem);
|
| - return 0;
|
| - }
|
| - /* Todo: check g */
|
| - BN_free(rem);
|
| - return 1;
|
| - }
|
| -
|
| -static void keyver()
|
| - {
|
| - char buf[1024];
|
| - char lbuf[1024];
|
| - char *keyword, *value;
|
| - BIGNUM *p = NULL, *q = NULL, *g = NULL, *X = NULL, *Y = NULL;
|
| - BIGNUM *Y2;
|
| - BN_CTX *ctx = NULL;
|
| - int nmod=0, paramcheck = 0;
|
| -
|
| - ctx = BN_CTX_new();
|
| - Y2 = BN_new();
|
| -
|
| - while(fgets(buf,sizeof buf,stdin) != NULL)
|
| - {
|
| - if (!parse_line(&keyword, &value, lbuf, buf))
|
| - {
|
| - fputs(buf,stdout);
|
| - continue;
|
| - }
|
| - if(!strcmp(keyword,"[mod"))
|
| - {
|
| - if (p)
|
| - BN_free(p);
|
| - p = NULL;
|
| - if (q)
|
| - BN_free(q);
|
| - q = NULL;
|
| - if (g)
|
| - BN_free(g);
|
| - g = NULL;
|
| - paramcheck = 0;
|
| - nmod=atoi(value);
|
| - }
|
| - else if(!strcmp(keyword,"P"))
|
| - p=hex2bn(value);
|
| - else if(!strcmp(keyword,"Q"))
|
| - q=hex2bn(value);
|
| - else if(!strcmp(keyword,"G"))
|
| - g=hex2bn(value);
|
| - else if(!strcmp(keyword,"X"))
|
| - X=hex2bn(value);
|
| - else if(!strcmp(keyword,"Y"))
|
| - {
|
| - Y=hex2bn(value);
|
| - if (!p || !q || !g || !X || !Y)
|
| - {
|
| - fprintf(stderr, "Parse Error\n");
|
| - exit (1);
|
| - }
|
| - pbn("P",p);
|
| - pbn("Q",q);
|
| - pbn("G",g);
|
| - pbn("X",X);
|
| - pbn("Y",Y);
|
| - if (!paramcheck)
|
| - {
|
| - if (dss_paramcheck(nmod, p, q, g, ctx))
|
| - paramcheck = 1;
|
| - else
|
| - paramcheck = -1;
|
| - }
|
| - if (paramcheck != 1)
|
| - printf("Result = F\n");
|
| - else
|
| - {
|
| - if (!BN_mod_exp(Y2, g, X, p, ctx) || BN_cmp(Y2, Y))
|
| - printf("Result = F\n");
|
| - else
|
| - printf("Result = P\n");
|
| - }
|
| - BN_free(X);
|
| - BN_free(Y);
|
| - X = NULL;
|
| - Y = NULL;
|
| - }
|
| - }
|
| - if (p)
|
| - BN_free(p);
|
| - if (q)
|
| - BN_free(q);
|
| - if (g)
|
| - BN_free(g);
|
| - if (Y2)
|
| - BN_free(Y2);
|
| - }
|
| -
|
| -static void keypair()
|
| - {
|
| - char buf[1024];
|
| - char lbuf[1024];
|
| - char *keyword, *value;
|
| - int nmod=0;
|
| -
|
| - while(fgets(buf,sizeof buf,stdin) != NULL)
|
| - {
|
| - if (!parse_line(&keyword, &value, lbuf, buf))
|
| - {
|
| - fputs(buf,stdout);
|
| - continue;
|
| - }
|
| - if(!strcmp(keyword,"[mod"))
|
| - nmod=atoi(value);
|
| - else if(!strcmp(keyword,"N"))
|
| - {
|
| - DSA *dsa;
|
| - int n=atoi(value);
|
| -
|
| - printf("[mod = %d]\n\n",nmod);
|
| - dsa = FIPS_dsa_new();
|
| - if (!DSA_generate_parameters_ex(dsa, nmod,NULL,0,NULL,NULL,NULL))
|
| - {
|
| - do_print_errors();
|
| - exit(1);
|
| - }
|
| - pbn("P",dsa->p);
|
| - pbn("Q",dsa->q);
|
| - pbn("G",dsa->g);
|
| - putc('\n',stdout);
|
| -
|
| - while(n--)
|
| - {
|
| - if (!DSA_generate_key(dsa))
|
| - {
|
| - do_print_errors();
|
| - exit(1);
|
| - }
|
| -
|
| - pbn("X",dsa->priv_key);
|
| - pbn("Y",dsa->pub_key);
|
| - putc('\n',stdout);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| -static void siggen()
|
| - {
|
| - char buf[1024];
|
| - char lbuf[1024];
|
| - char *keyword, *value;
|
| - int nmod=0;
|
| - DSA *dsa=NULL;
|
| -
|
| - while(fgets(buf,sizeof buf,stdin) != NULL)
|
| - {
|
| - if (!parse_line(&keyword, &value, lbuf, buf))
|
| - {
|
| - fputs(buf,stdout);
|
| - continue;
|
| - }
|
| - if(!strcmp(keyword,"[mod"))
|
| - {
|
| - nmod=atoi(value);
|
| - printf("[mod = %d]\n\n",nmod);
|
| - if (dsa)
|
| - FIPS_dsa_free(dsa);
|
| - dsa = FIPS_dsa_new();
|
| - if (!DSA_generate_parameters_ex(dsa, nmod,NULL,0,NULL,NULL,NULL))
|
| - {
|
| - do_print_errors();
|
| - exit(1);
|
| - }
|
| - pbn("P",dsa->p);
|
| - pbn("Q",dsa->q);
|
| - pbn("G",dsa->g);
|
| - putc('\n',stdout);
|
| - }
|
| - else if(!strcmp(keyword,"Msg"))
|
| - {
|
| - unsigned char msg[1024];
|
| - unsigned char sbuf[60];
|
| - unsigned int slen;
|
| - int n;
|
| - EVP_PKEY pk;
|
| - EVP_MD_CTX mctx;
|
| - DSA_SIG *sig;
|
| - EVP_MD_CTX_init(&mctx);
|
| -
|
| - n=hex2bin(value,msg);
|
| - pv("Msg",msg,n);
|
| -
|
| - if (!DSA_generate_key(dsa))
|
| - {
|
| - do_print_errors();
|
| - exit(1);
|
| - }
|
| - pk.type = EVP_PKEY_DSA;
|
| - pk.pkey.dsa = dsa;
|
| - pbn("Y",dsa->pub_key);
|
| -
|
| - EVP_SignInit_ex(&mctx, EVP_dss1(), NULL);
|
| - EVP_SignUpdate(&mctx, msg, n);
|
| - EVP_SignFinal(&mctx, sbuf, &slen, &pk);
|
| -
|
| - sig = DSA_SIG_new();
|
| - FIPS_dsa_sig_decode(sig, sbuf, slen);
|
| -
|
| - pbn("R",sig->r);
|
| - pbn("S",sig->s);
|
| - putc('\n',stdout);
|
| - DSA_SIG_free(sig);
|
| - EVP_MD_CTX_cleanup(&mctx);
|
| - }
|
| - }
|
| - if (dsa)
|
| - FIPS_dsa_free(dsa);
|
| - }
|
| -
|
| -static void sigver()
|
| - {
|
| - DSA *dsa=NULL;
|
| - char buf[1024];
|
| - char lbuf[1024];
|
| - unsigned char msg[1024];
|
| - char *keyword, *value;
|
| - int nmod=0, n=0;
|
| - DSA_SIG sg, *sig = &sg;
|
| -
|
| - sig->r = NULL;
|
| - sig->s = NULL;
|
| -
|
| - while(fgets(buf,sizeof buf,stdin) != NULL)
|
| - {
|
| - if (!parse_line(&keyword, &value, lbuf, buf))
|
| - {
|
| - fputs(buf,stdout);
|
| - continue;
|
| - }
|
| - if(!strcmp(keyword,"[mod"))
|
| - {
|
| - nmod=atoi(value);
|
| - if(dsa)
|
| - FIPS_dsa_free(dsa);
|
| - dsa=FIPS_dsa_new();
|
| - }
|
| - else if(!strcmp(keyword,"P"))
|
| - dsa->p=hex2bn(value);
|
| - else if(!strcmp(keyword,"Q"))
|
| - dsa->q=hex2bn(value);
|
| - else if(!strcmp(keyword,"G"))
|
| - {
|
| - dsa->g=hex2bn(value);
|
| -
|
| - printf("[mod = %d]\n\n",nmod);
|
| - pbn("P",dsa->p);
|
| - pbn("Q",dsa->q);
|
| - pbn("G",dsa->g);
|
| - putc('\n',stdout);
|
| - }
|
| - else if(!strcmp(keyword,"Msg"))
|
| - {
|
| - n=hex2bin(value,msg);
|
| - pv("Msg",msg,n);
|
| - }
|
| - else if(!strcmp(keyword,"Y"))
|
| - dsa->pub_key=hex2bn(value);
|
| - else if(!strcmp(keyword,"R"))
|
| - sig->r=hex2bn(value);
|
| - else if(!strcmp(keyword,"S"))
|
| - {
|
| - EVP_MD_CTX mctx;
|
| - EVP_PKEY pk;
|
| - unsigned char sigbuf[60];
|
| - unsigned int slen;
|
| - int r;
|
| - EVP_MD_CTX_init(&mctx);
|
| - pk.type = EVP_PKEY_DSA;
|
| - pk.pkey.dsa = dsa;
|
| - sig->s=hex2bn(value);
|
| -
|
| - pbn("Y",dsa->pub_key);
|
| - pbn("R",sig->r);
|
| - pbn("S",sig->s);
|
| -
|
| - slen = FIPS_dsa_sig_encode(sigbuf, sig);
|
| - EVP_VerifyInit_ex(&mctx, EVP_dss1(), NULL);
|
| - EVP_VerifyUpdate(&mctx, msg, n);
|
| - r = EVP_VerifyFinal(&mctx, sigbuf, slen, &pk);
|
| - EVP_MD_CTX_cleanup(&mctx);
|
| -
|
| - printf("Result = %c\n", r == 1 ? 'P' : 'F');
|
| - putc('\n',stdout);
|
| - }
|
| - }
|
| - }
|
| -
|
| -int main(int argc,char **argv)
|
| - {
|
| - if(argc != 2)
|
| - {
|
| - fprintf(stderr,"%s [prime|pqg|pqgver|keypair|siggen|sigver]\n",argv[0]);
|
| - exit(1);
|
| - }
|
| - if(!FIPS_mode_set(1))
|
| - {
|
| - do_print_errors();
|
| - exit(1);
|
| - }
|
| - if(!strcmp(argv[1],"prime"))
|
| - primes();
|
| - else if(!strcmp(argv[1],"pqg"))
|
| - pqg();
|
| - else if(!strcmp(argv[1],"pqgver"))
|
| - pqgver();
|
| - else if(!strcmp(argv[1],"keypair"))
|
| - keypair();
|
| - else if(!strcmp(argv[1],"keyver"))
|
| - keyver();
|
| - else if(!strcmp(argv[1],"siggen"))
|
| - siggen();
|
| - else if(!strcmp(argv[1],"sigver"))
|
| - sigver();
|
| - else
|
| - {
|
| - fprintf(stderr,"Don't know how to %s.\n",argv[1]);
|
| - exit(1);
|
| - }
|
| -
|
| - return 0;
|
| - }
|
| -
|
| -#endif
|
|
|