011-tls-util.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "catch.hpp"
  2. #include "utils/base32.h"
  3. #include "utils/tls.h"
  4. #include "test-utils.h"
  5. #include <openssl/pem.h>
  6. #include <boost/filesystem.hpp>
  7. #include <memory>
  8. #include <cstdio>
  9. using namespace syncspirit::utils;
  10. using namespace syncspirit::test;
  11. namespace fs = boost::filesystem;
  12. TEST_CASE("generate cert/key pair, save & load", "[support][tls]") {
  13. auto pair = generate_pair("sample");
  14. REQUIRE((bool)pair);
  15. REQUIRE((bool)pair.value().cert);
  16. REQUIRE((bool)pair.value().private_key);
  17. REQUIRE(pair.value().cert_data.bytes.size() > 0);
  18. auto &value = pair.value();
  19. PEM_write_PrivateKey(stdout, value.private_key.get(), nullptr, nullptr, 0, nullptr, nullptr);
  20. PEM_write_X509(stdout, value.cert.get());
  21. X509_print_fp(stdout, value.cert.get());
  22. auto cert_file = bfs::unique_path();
  23. auto cert_file_guard = path_guard_t(cert_file);
  24. auto key_file = bfs::unique_path();
  25. auto key_file_guard = path_guard_t(key_file);
  26. auto save_result = value.save(cert_file.c_str(), key_file.c_str());
  27. REQUIRE((bool)save_result);
  28. printf("cert has been saved as %s\n", cert_file.c_str());
  29. auto load_result = load_pair(cert_file.c_str(), key_file.c_str());
  30. REQUIRE((bool)load_result);
  31. REQUIRE(load_result.value().cert_data.bytes.size() == pair.value().cert_data.bytes.size());
  32. bool bytes_equal = load_result.value().cert_data.bytes == pair.value().cert_data.bytes;
  33. REQUIRE(bytes_equal);
  34. auto cn = get_common_name(value.cert.get());
  35. REQUIRE(cn);
  36. REQUIRE(cn.value() == "sample");
  37. }
  38. TEST_CASE("sha256 for certificate", "[support][tls]") {
  39. auto cert = read_file("/data/cert.der");
  40. auto sha_result = sha256_digest(cert);
  41. REQUIRE((bool)sha_result);
  42. auto &sha = sha_result.value();
  43. REQUIRE(1 == 1);
  44. std::string expected = "b1b48b580b78b47c975a138b4aaa2988fc621795c95a2868e24d93b327e8858c";
  45. char got[expected.size() + 1];
  46. std::memset(got, 0, sizeof(got));
  47. for (std::size_t i = 0; i < sha.size(); i++) {
  48. sprintf(got + (i * 2), "%02x", (unsigned char)sha[i]);
  49. }
  50. std::string got_str(got, expected.size());
  51. REQUIRE(got_str == expected);
  52. auto enc = base32::encode(sha);
  53. REQUIRE(enc == "WG2IWWALPC2HZF22COFUVKRJRD6GEF4VZFNCQ2HCJWJ3GJ7IQWGA");
  54. }