sign problem

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

sign problem

Amir Reda
dear all
i have a problem with c++ code for sign some data here is the code

 BIO *sgerr = NULL;
      const char szPath[MAX_FILE_NAME_SIZE] = "sgerr.pem";
      sgerr = BIO_new_file(szPath,"wb");

      cout<<"i'm in sign digest"<<endl;
      //create private key
      EVP_PKEY *priv_key = NULL;
      priv_key = EVP_PKEY_new();
      if (1 == EVP_PKEY_set1_RSA(priv_key,m_caKeyPairs))
      {
          cout<<"Successful key private created"<<endl;
      }
      else
      {
          cout<<"private key is bad"<<endl;
      }

    EVP_MD_CTX *mdctx = NULL;
    mdctx = EVP_MD_CTX_create();
    size_t *signlen = NULL;
    //Initialize the DigestSign operation
    if (1 == EVP_DigestSignInit(mdctx, NULL, EVP_sha1(), NULL, priv_key))
    {
        cout<<"initialize correct"<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }
    //update with the message
    if (1 == EVP_DigestSignUpdate(mdctx, m_digestData,(DATA_SIZE + RSA_KEY_SIZE)))
    {
        cout<<"digest created successfully"<<endl;
        cout<<"digest is "<<endl;
        for (int i = 0; i < DIGEST_SIZE; i++)
        {
             printf("0x%.2x ", m_digest[i]);
        }
        cout<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }
    //Finalise the DigestSign operation determine the sign length
    if (1 == EVP_DigestSignFinal(mdctx, NULL, signlen))
    {
        cout<<"sign length is "<<(*signlen)<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }
    if (1 == EVP_DigestSignFinal(mdctx, m_signedDigest, signlen))
    {
        cout<<"sign successfully created"<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }

the output of this code in terminal during debugging

i'm in sign digest
Successful key private created
initialize correct
digest created successfully
digest is
0x99 0x2d 0x5c 0x5b 0x2f 0x7a 0x85 0x98 0x7c 0x69 0xca 0x33 0x17 0xab 0x87 0x7c 0x79 0x73 0xd7 0x4a

until i arrive to this point
    if (1 == EVP_DigestSignFinal(mdctx, NULL, signlen))
i got this error
No source available for "EVP_PKEY_sign() at 0xb7ede098"

even this function just return the length of the sign

note i'm using eclipse kepler and i don't know what i did wrong



--
Warmest regards and best wishes for a good health,urs sincerely
mero
Reply | Threaded
Open this post in threaded view
|

RE: sign problem

Scott Neugroschl-2
Your problem is with signlen.   You’re accessing a null pointer in EVP_DigestSignFinal().

Declare signlen as  size_t, not a size_t*, and pass the *ADDRESS* of signlen.  E.g.:

  EVP_DigestSignFinal(mdctx, NULL, &signlen);



From: [hidden email] [mailto:[hidden email]] On Behalf Of Amir Reda
Sent: Monday, November 24, 2014 10:10 AM
To: [hidden email]
Subject: sign problem

dear all
i have a problem with c++ code for sign some data here is the code

 BIO *sgerr = NULL;
      const char szPath[MAX_FILE_NAME_SIZE] = "sgerr.pem";
      sgerr = BIO_new_file(szPath,"wb");

      cout<<"i'm in sign digest"<<endl;
      //create private key
      EVP_PKEY *priv_key = NULL;
      priv_key = EVP_PKEY_new();
      if (1 == EVP_PKEY_set1_RSA(priv_key,m_caKeyPairs))
      {
          cout<<"Successful key private created"<<endl;
      }
      else
      {
          cout<<"private key is bad"<<endl;
      }

    EVP_MD_CTX *mdctx = NULL;
    mdctx = EVP_MD_CTX_create();
    size_t *signlen = NULL;
    //Initialize the DigestSign operation
    if (1 == EVP_DigestSignInit(mdctx, NULL, EVP_sha1(), NULL, priv_key))
    {
        cout<<"initialize correct"<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }
    //update with the message
    if (1 == EVP_DigestSignUpdate(mdctx, m_digestData,(DATA_SIZE + RSA_KEY_SIZE)))
    {
        cout<<"digest created successfully"<<endl;
        cout<<"digest is "<<endl;
        for (int i = 0; i < DIGEST_SIZE; i++)
        {
             printf("0x%.2x ", m_digest[i]);
        }
        cout<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }
    //Finalise the DigestSign operation determine the sign length
    if (1 == EVP_DigestSignFinal(mdctx, NULL, signlen))
    {
        cout<<"sign length is "<<(*signlen)<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }
    if (1 == EVP_DigestSignFinal(mdctx, m_signedDigest, signlen))
    {
        cout<<"sign successfully created"<<endl;
    }
    else
    {
        cout<<"something wrong"<<endl;
    }
the output of this code in terminal during debugging

i'm in sign digest
Successful key private created
initialize correct
digest created successfully
digest is
0x99 0x2d 0x5c 0x5b 0x2f 0x7a 0x85 0x98 0x7c 0x69 0xca 0x33 0x17 0xab 0x87 0x7c 0x79 0x73 0xd7 0x4a
until i arrive to this point
    if (1 == EVP_DigestSignFinal(mdctx, NULL, signlen))
i got this error
No source available for "EVP_PKEY_sign() at 0xb7ede098"
even this function just return the length of the sign
note i'm using eclipse kepler and i don't know what i did wrong




--
Warmest regards and best wishes for a good health,urs sincerely
mero
:��I"Ϯ��r�m���� (���Z+�K�+����1���x ��h���[�z�(���Z+� ��f�y������f���h��)z{,���