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 |