title: RSA Sign: OpenSSL
body: <p>I am trying to code with EVP interface of Openssl for RSA signing with SHA1. Later I would like to expand signing with different digest algorithms and different signature algorithms(sor of generic, and therefore the use of EVP).</p>
  
  <p>I seem to get a segmentation fault whenever I try to retrieve the size of my private key</p>
  
  <p>Can someone tell me how to correct this?</p>
  
  <pre><code>int rsaSign(char *in_file, char * sig_file){
  
          char *data = NULL;
          int data_len;
          unsigned int sig_len;
          unsigned char *sig;
          int err = -1;
  
          OpenSSL_add_all_digests();
          FILE *fd;
          EVP_PKEY *priv_key = EVP_PKEY_new();
          RSA *privkey = NULL;
             printf( "we are here..\n");
  
          if ((fd = fopen(PRIVKEY_FILE, "r")) == NULL){
              printf("error reading file\n");
              exit(0);
          }
  
          privkey = RSA_new();
          if (!PEM_read_PrivateKey(fd, &amp;privkey, NULL, NULL))
          {
              fprintf(stderr, "Error loading RSA Private Key File.\n");
              return 2;
          }
  
          fclose(fd);
  
          if (!EVP_PKEY_assign_RSA (priv_key, privkey))
          {
              fprintf(stderr, "EVP_PKEY_assign_RSA: failed.\n");
              return 3;
          }
  
          if (!priv_key) {
              printf("no private key\n");
          }
          EVP_PKEY_set1_RSA(privkey, priv_key);
  
  
          EVP_MD_CTX *ctx = EVP_MD_CTX_create();
  
          const EVP_MD *md = EVP_get_digestbyname("SHA1");
  
          if (!md) {
              fprintf(stderr, "Error creating message digest");
              fprintf(stderr, " object, unknown name?\n");
              ERR_print_errors_fp(stderr);
              exit(1);
          }
  
  
  
          if (!EVP_SignInit(ctx, md))
              {
                  fprintf(stderr, "EVP_SignInit: failed.\n");
                  EVP_PKEY_free(priv_key);
                  return 3;
              }
          printf( "now to sign update..\n");
          data = readFile(in_file);
          data_len = strlen(data);
          printf("data len = %d\n", data_len);
  
          if (!EVP_SignUpdate(ctx, data, data_len))
          {
              fprintf(stderr, "EVP_SignUpdate: failed.\n");
              EVP_PKEY_free(priv_key);
              return 3;
          }
          printf( "now to sign final..\n");
  
  sig = malloc(EVP_PKEY_size(privkey)); //!!!!! SEGMENTATION FAULT HERE !!!!!
  
  
          if (!EVP_SignFinal(ctx, &amp;sig, &amp;sig_len, priv_key))
          {
              fprintf(stderr, "EVP_SignFinal: failed.\n");
              free(sig);
              EVP_PKEY_free(priv_key);
              return 3;
          }
  
          free(data);
          free(sig);
          EVP_PKEY_free(priv_key);
          return EXIT_SUCCESS;
  
  }
  </code></pre>