- 論壇徽章:
- 0
|
本帖最后由 liukunmeister 于 2011-01-09 16:17 編輯
請大家看看我遇到的最新問題,我在openssl的簽名的demo代碼中做了一個測試,其實就反應(yīng)了我現(xiàn)在遇到的問題
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
int main ()
{
int err;
int sig_len;
unsigned char sig_buf [4096];
static char certfile[] = "cert.pem";
static char keyfile[] = "key.pem";
static char data[] = "I owe you...";
EVP_MD_CTX md_ctx;
EVP_PKEY * pkey;
FILE * fp;
X509 * x509;
/* Just load the crypto library error strings,
* SSL_load_error_strings() loads the crypto AND the SSL ones */
/* SSL_load_error_strings();*/
ERR_load_crypto_strings();
/* Read private key */
fp = fopen (keyfile, "r");
if (fp == NULL) exit (1);
pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
fclose (fp);
if (pkey == NULL) {
ERR_print_errors_fp (stderr);
exit (1);
}
/* Do the signature */
EVP_SignInit (&md_ctx, EVP_sha1());
EVP_SignUpdate (&md_ctx, data, strlen(data));
sig_len = sizeof(sig_buf);
err = EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey);
if (err != 1) {
ERR_print_errors_fp(stderr);
exit (1);
}
EVP_PKEY_free (pkey);
注意,問題從這里開始,我把用于保存簽名的數(shù)組sig_buf以二進制文件操作的形式寫到了test_sig文件中,我就按照數(shù)組長度4096全寫進去了
fp=fopen("/home/administrator/test_sig","w");
if(fwrite(sig_buf,sizeof(unsigned char),4096,fp)!=4096)
{
printf("fwrite error\n");
exit(1);
}
fclose(fp);
在這里,問題出現(xiàn)了
然而,當(dāng)我重新定義了一個和sig_buf一樣長度的數(shù)組,讀取同樣長度的內(nèi)容也就是4096, 再往下執(zhí)行的時候,就會報錯,說簽名長度有問題.補充一下,如果我還是用sig_buf而不是sigData從test_sig中把保存進去的內(nèi)容讀出來,就又是正確的。
unsigned char sigData[4096];
fp=fopen("/home/administrator/test_sig","r");
if(fread(sigData,sizeof(unsigned char),4096,fp)!=4096)
{
printf("fread error\n");
exit(1);
}
fclose(fp);
/* Read public key */
fp = fopen (certfile, "r");
if (fp == NULL) exit (1);
x509 = PEM_read_X509(fp, NULL, NULL, NULL);
fclose (fp);
if (x509 == NULL) {
ERR_print_errors_fp (stderr);
exit (1);
}
/* Get public key - eay */
pkey=X509_get_pubkey(x509);
if (pkey == NULL) {
ERR_print_errors_fp (stderr);
exit (1);
}
/* Verify the signature */
EVP_VerifyInit (&md_ctx, EVP_sha1());
EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data));
err = EVP_VerifyFinal (&md_ctx, sigData, sizeof(sigData), pkey); //這里我也都把以前的sig_buf改為了sigData
EVP_PKEY_free (pkey);
if (err != 1) {
ERR_print_errors_fp (stderr);
exit (1);
}
printf ("Signature Verified Ok.\n");
return(0);
}
難道簽名還記錄數(shù)組名字?明明一樣的數(shù)組,sig_buf行,sigData怎么就不行了? |
|