param_fusion.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. BYTE* crypto_cert_hash(X509* xcert, const char* hash, UINT32* length, int* p_key)
  5. {
  6. EVP_MD_CTX* md_ctx;
  7. const EVP_MD* md;
  8. BYTE* fp;
  9. unsigned int fp_len;
  10. md = EVP_get_digestbyname(hash);
  11. if (!md)
  12. return NULL;
  13. md_ctx = EVP_MD_CTX_new();
  14. if (!md_ctx)
  15. return NULL;
  16. fp = (BYTE*)calloc(EVP_MAX_MD_SIZE, sizeof(BYTE));
  17. if (!fp)
  18. goto fail;
  19. if (!EVP_DigestInit_ex(md_ctx, md, NULL))
  20. goto fail;
  21. if (!EVP_DigestUpdate(md_ctx, xcert->cert_info->data, xcert->cert_info->length))
  22. goto fail;
  23. if (!EVP_DigestFinal_ex(md_ctx, fp, &fp_len))
  24. goto fail;
  25. *length = fp_len;
  26. printf("key=%d", *p_key);
  27. EVP_MD_CTX_free(md_ctx);
  28. return fp;
  29. fail:
  30. EVP_MD_CTX_free(md_ctx);
  31. free(fp);
  32. return NULL;
  33. }
  34. char* crypto_cert_fingerprint_by_hash(X509* xcert, const char* hash, int* p_key)
  35. {
  36. UINT32 fp_len, i;
  37. BYTE* fp;
  38. char* p;
  39. char* fp_buffer;
  40. fp = crypto_cert_hash(xcert, hash, &fp_len, p_key);
  41. if (!fp)
  42. return NULL;
  43. fp_buffer = calloc(fp_len * 3 + 1, sizeof(char));
  44. if (!fp_buffer)
  45. goto fail;
  46. p = fp_buffer;
  47. for (i = 0; i < (fp_len - 1); i++)
  48. {
  49. sprintf_s(p, (fp_len - i) * 3, "%02" PRIx8 ":", fp[i]);
  50. p = &fp_buffer[(i + 1) * 3];
  51. }
  52. sprintf_s(p, (fp_len - i) * 3, "%02" PRIx8 "", fp[i]);
  53. fail:
  54. free(fp);
  55. return fp_buffer;
  56. }
  57. char* crypto_cert_fingerprint(X509* xcert, int* p_secret)
  58. {
  59. char* fp;
  60. int key = (*p_secret) ^ 0xABCD;
  61. fp = crypto_cert_fingerprint_by_hash(xcert, "sha256", &key);
  62. return fp;
  63. }
  64. rdpCertificateData* crypto_get_certificate_data(X509* xcert, const char* hostname, UINT16 port)
  65. {
  66. char* issuer;
  67. char* subject;
  68. char* fp;
  69. rdpCertificateData* certdata;
  70. int secret = 42;
  71. fp = crypto_cert_fingerprint(xcert, &secret);
  72. if (!fp)
  73. return NULL;
  74. issuer = crypto_cert_issuer(xcert);
  75. subject = crypto_cert_subject(xcert);
  76. certdata = certificate_data_new(hostname, port, issuer, subject, fp);
  77. free(subject);
  78. free(issuer);
  79. free(fp);
  80. return certdata;
  81. }