Advertisement
Guest User

Untitled

a guest
May 11th, 2011
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.83 KB | None | 0 0
  1. /* terrible signature verification code */
  2.  
  3. #include <openssl/evp.h>
  4. #include <openssl/pem.h>
  5. #include <openssl/bio.h>
  6. #include <openssl/ec.h>
  7. #include <openssl/err.h>
  8.  
  9. #define SIGNATURE_FILE      "sig.dat"
  10. #define DATA_FILE           "data.dat"
  11. #define CERTIFICATE_FILE    "cert.pem"
  12.  
  13. int load_cert(const char *file, EVP_PKEY **key)
  14. {
  15.     if (file == NULL || key == NULL)
  16.         return 0;
  17.  
  18.     FILE *fh = fopen(file, "r");
  19.     if (fh == NULL){
  20.         perror("Can't open certificate file");
  21.         return 0;
  22.     }
  23.  
  24.     X509 *x509 = X509_new();
  25.     if (! PEM_read_X509(fh, &x509, NULL, NULL)){
  26.         fprintf(stderr, "ERROR: PEM_read_X509\n");
  27.         return 0;
  28.     }
  29.  
  30.     *key = X509_get_pubkey(x509);
  31.     if (*key == NULL){
  32.         fprintf(stderr, "ERROR: X509_get_pubkey\n");
  33.         return 0;
  34.     }
  35.     if (fh) fclose(fh);
  36.     if (x509) X509_free(x509);
  37.     return 1;
  38. }
  39.  
  40. int load_data(const char *file, unsigned char **data, size_t *sz)
  41. {
  42.  
  43.     FILE *fh = fopen(file, "rb");
  44.     if (fh == NULL){
  45.         perror("Can't open data file.");
  46.         return -1;
  47.     }
  48.  
  49.     fseek(fh, 0, SEEK_END);
  50.     long len = ftell(fh);
  51.     rewind(fh);
  52.  
  53.     unsigned char *buf = malloc(len);
  54.     if (buf == NULL){
  55.         perror("Can't read data file into memory");
  56.         fclose(fh);
  57.         return -1;
  58.     }
  59.  
  60.     long nbytes = fread(buf, 1, len, fh);
  61.     *data = buf;
  62.     *sz = (size_t) len;
  63.  
  64.     if(fh) fclose(fh);
  65.     return nbytes;
  66. }
  67.  
  68. int verify_signature(EVP_PKEY *pubkey,
  69.         unsigned char *sig,
  70.         size_t sig_len,
  71.         unsigned char *data,
  72.         size_t data_len)
  73. {
  74.     if (pubkey == NULL || sig == NULL || data == NULL){
  75.         return -1;
  76.     }
  77.  
  78.     /* Assumes ecdsa_sha1 for brevity */
  79.     const EVP_MD *dgst = EVP_get_digestbyname("ecdsa-with-SHA1");
  80.     EVP_MD_CTX ctx;
  81.     EVP_MD_CTX_init(&ctx);
  82.  
  83.     int rc = 0;
  84.     if (! (rc = EVP_VerifyInit(&ctx, dgst)))
  85.         return rc;
  86.  
  87.     if (! (rc = EVP_VerifyUpdate(&ctx, data, data_len)))
  88.         return rc;
  89.  
  90.     rc = EVP_VerifyFinal(&ctx, sig, sig_len, pubkey);
  91.  
  92.     printf("Signature verification: ");
  93.     switch (rc){
  94.         case 0:
  95.             printf("FAILED\n");
  96.             break;
  97.         case 1:
  98.             printf("SUCCEEDED\n");
  99.             break;
  100.         default:
  101.             printf("ERROR\n");
  102.     }
  103.     return rc;
  104. }
  105.  
  106. int main(int argc, char *argv[])
  107. {
  108.     unsigned char *sig = NULL;
  109.     size_t sig_len;
  110.  
  111.     unsigned char *data = NULL;
  112.     size_t data_len;
  113.  
  114.     EVP_PKEY *pubkey = NULL;
  115.  
  116.  
  117.     if (load_data(SIGNATURE_FILE, &sig, &sig_len) > 0 &&
  118.         load_data(DATA_FILE, &data, &data_len) > 0 &&
  119.         load_cert(CERTIFICATE_FILE, &pubkey)){
  120.  
  121.         verify_signature(pubkey, sig, sig_len, data, data_len);
  122.     } else {
  123.         printf("Bad input.\n");
  124.     }
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement