#include "opensslhashsign.h" #ifndef MAX_LEN #define MAX_LEN 256 #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Entry point for the program // /* DATA WHICH IS SIGNED IS -> Hello Have pem file converted using openssl from certificate Pls Check http://pastebin.com/ExYDcJ2t for data. */ int main() { // // Local variables definition // const char cert_filestr[] = "./TestCert.pem"; EVP_PKEY* evpkey = NULL; BIO* certbio = NULL; BIO* outbio = NULL; X509* cert = NULL; EVP_MD_CTX* ctx = NULL; unsigned char sigBuf[MAX_LEN] = {0}; char buf[] = "Hello"; int bufSize = sizeof (buf); int ret = 1; int bytesRet = 0; // // Filling sigBuf with zeros // memset(sigBuf, 0, MAX_LEN); // // Function logic begins here // for (;;) { // // These function calls initialize openssl for correct work // OpenSSL_add_all_algorithms(); ERR_load_BIO_strings(); ERR_load_crypto_strings(); // // Create the Input/Output BIO's // certbio = BIO_new(BIO_s_file()); outbio = BIO_new(BIO_s_file()); outbio = BIO_new_fp(stdout, BIO_NOCLOSE); // // Loading the certificate from file (PEM) // ret = BIO_read_filename(certbio, cert_filestr); cert = PEM_read_bio_X509(certbio, NULL, 0, NULL); if (NULL == cert) { BIO_printf(outbio, "Error loading cert into memory\n"); break; } // if printf("Certificate loaded from the .pem file\n\n"); // // Extract the certificate's public key data // evpkey = X509_get_pubkey(cert); if (NULL == evpkey) { BIO_printf(outbio, "Error getting public key from certificate\n"); break; } // if printf("Public key extracted from the certificate\n\n"); // // Allocating memory for EVP_MD_CTX Context object // ctx = (EVP_MD_CTX *) malloc(sizeof (EVP_MD_CTX)); if (NULL == ctx) { printf("Memory is not allocated for EVP_MD_CTX object\n"); break; } // if printf("Memory allocated for EVP_MD_CTX object\n\n"); // // Initializing EVP_MD_CTX Context object EVP_MD_CTX_init(ctx); FILE *fp = fopen("./hellosigneddata.txt", "r"); bytesRet = fread(sigBuf, 1, MAX_LEN, fp); if (MAX_LEN != bytesRet) { printf("Signed buffer has no proper data\n"); break; } // if printf("Data in the signed buffer is : %s\n\n", sigBuf); // // Calling EVP_VerifyInit_ex() function to initialize context // for verification // EVP_VerifyInit_ex(ctx, EVP_sha256(), NULL); // // After initializing the context, the signed data to be verified // is fed into context. This is done with EVP_VerifyUpdate() function // EVP_VerifyUpdate(ctx, buf, bufSize); // // Performing the actual verification of the signature using // EVP_VerifyFinal() function // ret = EVP_VerifyFinal(ctx, sigBuf, MAX_LEN, evpkey); if (0 == ret) { printf("Signature doesn't match\n\n"); break; } // if printf("Signature verified successfully\n\n"); // // Final break statement // break; } // for getchar(); return 0; } // main()