Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. //
  2. // Created by Jack Wang on 2019-07-11.
  3. //
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <openssl/evp.h>
  7. #include <openssl/rsa.h>
  8. #include <openssl/objects.h>
  9. #include <openssl/x509.h>
  10. #include <openssl/err.h>
  11. #include <openssl/pem.h>
  12. #include <openssl/ssl.h>
  13.  
  14. #define MAX_LEN 4096
  15. #define MAX_NAME_LEN 20
  16.  
  17. int main(int argc, char **argv)
  18. {
  19. int err;
  20. unsigned int sig_len;
  21. unsigned char sig_buff[MAX_LEN];
  22. static char pubic_key[] = "public_key.pem";
  23. static char private_key[] = "private_key.pem";
  24. static char raw_data[] = "raw_data.txt";
  25. char *hash_name, *key, *file_format, *input_file, *output_file;
  26. EVP_MD_CTX md_ctx;
  27. const EVP_MD *md;
  28. EVP_PKEY *pkey;
  29. FILE *fp;
  30.  
  31. ERR_load_crypto_strings();
  32.  
  33. if (argc != 11)
  34. {
  35. fprintf(stderr, "参数个数有误\n");
  36. printf("usage: ./RSA_Sig -d SHA256 -k signer.pem -i input.txt -f BASE64 -out sig.txt\n"
  37. "支持命令行参数:\n"
  38. "-d/--digest 摘要算法(包括 SHA1 | SHA256 | SHA512, default SHA256)\n"
  39. "-k/--key 私钥文件(能自动适应 PEM 和 DER 格式)\n"
  40. "-i/--input 输入文件\n"
  41. "-o/--output 输出文件\n"
  42. "-f/--format 输出/输入格式,包括 binary | hex | base64,default binary\n"
  43. "-h/--help 显示使用帮助\n");
  44. }
  45.  
  46. hash_name = argv[2];
  47. key = argv[4];
  48. file_format = argv[6];
  49. input_file = argv[8];
  50. output_file = argv[argc - 1];
  51.  
  52. printf("hash name: %s\n"
  53. "key: %s\n"
  54. "file format: %s\n"
  55. "input file: %s\n"
  56. "output file: %s\n",
  57. hash_name, key, file_format, input_file, output_file);
  58.  
  59. // read private key
  60. fp = fopen(private_key, "r");
  61. if (fp == NULL)
  62. exit(EXIT_FAILURE);
  63. pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
  64. fclose(fp);
  65.  
  66. if (pkey == NULL)
  67. {
  68. ERR_print_errors_fp(stderr);
  69. exit(EXIT_FAILURE);
  70. }
  71.  
  72. /* select a digest algorithm ,include SHA1 | SHA256 | SHA512,
  73. default SHA256, get digest algorithm md
  74. */
  75. if (strncmp(hash_name, "SHA1", MAX_NAME_LEN) == 0)
  76. md = EVP_sha1();
  77. else if ( (strncmp(hash_name, "SHA512", MAX_NAME_LEN) == 0))
  78. md = EVP_sha512();
  79. else
  80. md = EVP_sha256();
  81.  
  82. // do the signature
  83. EVP_SignInit(&md_ctx, md);
  84. EVP_SignUpdate(&md_ctx, raw_data, strlen(raw_data));
  85. sig_len = sizeof(sig_buff);
  86. err = EVP_SignFinal(&md_ctx, sig_buff, &sig_len, pkey);
  87. EVP_PKEY_free(pkey);
  88.  
  89. printf("Signature succeed.\n");
  90. printf("Signature: %s\n", sig_buff);
  91.  
  92. // read public key
  93. fp = fopen(pubic_key, "r");
  94. if (fp == NULL)
  95. exit(EXIT_FAILURE);
  96. pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
  97. fclose(fp);
  98. if (pkey == NULL)
  99. {
  100. ERR_print_errors_fp(stderr);
  101. exit(EXIT_FAILURE);
  102. }
  103.  
  104. // Verify the signature
  105. EVP_VerifyInit(&md_ctx, md);
  106. EVP_VerifyUpdate(&md_ctx, raw_data, strlen(raw_data));
  107. err = EVP_VerifyFinal(&md_ctx, sig_buff, sig_len, pkey);
  108. EVP_PKEY_free(pkey);
  109.  
  110. if (err != 1)
  111. {
  112. ERR_print_errors_fp(stderr);
  113. exit(EXIT_FAILURE);
  114. }
  115. printf("Signature Verified Success.\n");
  116.  
  117. return EXIT_SUCCESS;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement