This is probably a stupid question.  :-)
I generated a keypair for DSA ,signed  some data and stored the
public/private keys for later use.

Later on I want to verify the data i previously signed.
So I just create a DSA struct and and add the public key to it.
But that doesn't work, since the DSA struct needs p,q,g.
How do I get those from my private/public keys??

/Magnus - attached some shitty code...

>>>>>>example ....>>>>>>>>
#include <stdio.h>
#include <openssl/dsa.h>
int main(int argc, char *argv[])
 {

     DSA *dsa;
     int counter_ret;
     char mess1[] = "OneSmallTestMessage";
     unsigned long h_ret;
     int i,j;
     int status;
     unsigned char sigret[1000];
     unsigned int siglen;
     char pub_key[1000];
     char priv_key[1000];

     for(i=0;i<1;i++){ //loop once break at errors

  dsa =
DSA_generate_parameters(1024,NULL,0,&counter_ret,&h_ret,NULL,NULL);
  if(dsa == NULL){
      printf("Failed to generate params\n");
      break;
  }

  //try generate a key pair
  status = DSA_generate_key(dsa);
  if (status != 1){
      printf("Failed to generate keys\n");
      break;
  }

  //try signing a message
  status = DSA_sign(0,
      mess1,
      strlen(mess1),
      sigret,
      &siglen,
      dsa);
  if (status != 1){
      printf("Failed to sign message\n");
      break;
  } else {
      printf("Siglen = %d\n",siglen);
      printf("Signature is: ");
      for(j = 0; j < siglen; j++) printf("%02x", sigret[j]);
      printf("\n");
  }

  //try verifying the signature
  printf("Checking signature on %s\n",mess1);
  status = DSA_verify(0,
        mess1,
        strlen(mess1),
        sigret,
        siglen,
        dsa);
  if (status != 1){
      printf("Signature is not valid\n");
      break;
  } else {
      printf("Signature valid\n");
  }

    //SAVE KEYS...
  strcpy(pub_key,BN_bn2hex(dsa->pub_key));
  strcpy(priv_key,BN_bn2hex(dsa->pub_key));

  //free the whole shit.
  DSA_free(dsa);

  dsa = DSA_new();
  dsa->p = BN_new();
  dsa->q = BN_new();
  dsa->g = BN_new();
  dsa->pub_key = BN_new();
  dsa->priv_key = BN_new();

  status = BN_hex2bn(&(dsa->pub_key),pub_key);
  printf("status = %d\n",status);
  status = BN_hex2bn(&(dsa->priv_key),priv_key);
  printf("status = %d\n",status);

  printf("Checking signature on %s\n",mess1);
  status = DSA_verify(0,
        mess1,
        strlen(mess1),
        sigret,
        siglen,
        dsa);
  if (status != 1){
      printf("Signature is not valid\n");
  } else {
      printf("Signature valid\n");
  }


  DSA_free(dsa);


     }
     return 0;
 }



______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to