Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

122 строки
4.8 KiB

  1. /* Copyright (c) 2016, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. #include <math.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include <openssl/crypto.h>
  18. #include <openssl/rand.h>
  19. #include "../test/file_test.h"
  20. #include "internal.h"
  21. static bool TestNewhope(FileTest *t, void *arg) {
  22. bssl::UniquePtr<NEWHOPE_POLY> a(NEWHOPE_POLY_new());
  23. bssl::UniquePtr<NEWHOPE_POLY> s(NEWHOPE_POLY_new()), sp(NEWHOPE_POLY_new());
  24. bssl::UniquePtr<NEWHOPE_POLY> e(NEWHOPE_POLY_new()), ep(NEWHOPE_POLY_new()),
  25. epp(NEWHOPE_POLY_new());
  26. bssl::UniquePtr<NEWHOPE_POLY> in_pk(NEWHOPE_POLY_new());
  27. bssl::UniquePtr<NEWHOPE_POLY> in_rec(NEWHOPE_POLY_new());
  28. if (t->GetType() == "InRandA") {
  29. std::vector<uint8_t> a_bytes, s_bytes, e_bytes, expected_pk;
  30. if (!t->GetBytes(&a_bytes, "InRandA") ||
  31. !t->GetBytes(&s_bytes, "InNoiseS") ||
  32. !t->GetBytes(&e_bytes, "InNoiseE") ||
  33. !t->GetBytes(&expected_pk, "OutPK")) {
  34. return false;
  35. }
  36. NEWHOPE_POLY_frombytes(a.get(), a_bytes.data());
  37. NEWHOPE_POLY_frombytes(s.get(), s_bytes.data());
  38. NEWHOPE_POLY_frombytes(e.get(), e_bytes.data());
  39. NEWHOPE_POLY pk;
  40. NEWHOPE_offer_computation(&pk, s.get(), e.get(), a.get());
  41. uint8_t pk_bytes[NEWHOPE_POLY_LENGTH];
  42. NEWHOPE_POLY_tobytes(pk_bytes, &pk);
  43. return t->ExpectBytesEqual(expected_pk.data(), expected_pk.size(),
  44. pk_bytes, NEWHOPE_POLY_LENGTH);
  45. } else if (t->GetType() == "InPK") {
  46. std::vector<uint8_t> rand, in_pk_bytes, a_bytes, sp_bytes, ep_bytes,
  47. epp_bytes, expected_pk, expected_rec, expected_key;
  48. if (!t->GetBytes(&in_pk_bytes, "InPK") ||
  49. !t->GetBytes(&rand, "InRand") ||
  50. !t->GetBytes(&a_bytes, "InA") ||
  51. !t->GetBytes(&sp_bytes, "InNoiseSP") ||
  52. !t->GetBytes(&ep_bytes, "InNoiseEP") ||
  53. !t->GetBytes(&epp_bytes, "InNoiseEPP") ||
  54. !t->GetBytes(&expected_pk, "OutPK") ||
  55. !t->GetBytes(&expected_rec, "OutRec") ||
  56. !t->GetBytes(&expected_key, "Key")) {
  57. return false;
  58. }
  59. NEWHOPE_POLY_frombytes(in_pk.get(), in_pk_bytes.data());
  60. NEWHOPE_POLY_frombytes(a.get(), a_bytes.data());
  61. NEWHOPE_POLY_frombytes(sp.get(), sp_bytes.data());
  62. NEWHOPE_POLY_frombytes(ep.get(), ep_bytes.data());
  63. NEWHOPE_POLY_frombytes(epp.get(), epp_bytes.data());
  64. uint8_t key[NEWHOPE_KEY_LENGTH];
  65. NEWHOPE_POLY pk, rec;
  66. NEWHOPE_accept_computation(key, &pk, &rec,
  67. sp.get(), ep.get(), epp.get(),
  68. rand.data(), in_pk.get(), a.get());
  69. uint8_t pk_bytes[NEWHOPE_POLY_LENGTH], rec_bytes[NEWHOPE_POLY_LENGTH];
  70. NEWHOPE_POLY_tobytes(pk_bytes, &pk);
  71. NEWHOPE_POLY_tobytes(rec_bytes, &rec);
  72. return
  73. t->ExpectBytesEqual(expected_key.data(), expected_key.size(),
  74. key, NEWHOPE_KEY_LENGTH) &&
  75. t->ExpectBytesEqual(expected_pk.data(), expected_pk.size(),
  76. pk_bytes, NEWHOPE_POLY_LENGTH) &&
  77. t->ExpectBytesEqual(expected_rec.data(), expected_rec.size(),
  78. rec_bytes, NEWHOPE_POLY_LENGTH);
  79. } else if (t->GetType() == "InNoiseS") {
  80. std::vector<uint8_t> s_bytes, in_pk_bytes, in_rec_bytes, expected_key;
  81. if (!t->GetBytes(&s_bytes, "InNoiseS") ||
  82. !t->GetBytes(&in_pk_bytes, "InPK") ||
  83. !t->GetBytes(&in_rec_bytes, "InRec") ||
  84. !t->GetBytes(&expected_key, "Key")) {
  85. return false;
  86. }
  87. NEWHOPE_POLY_frombytes(s.get(), s_bytes.data());
  88. NEWHOPE_POLY_frombytes(in_pk.get(), in_pk_bytes.data());
  89. NEWHOPE_POLY_frombytes(in_rec.get(), in_rec_bytes.data());
  90. uint8_t key[NEWHOPE_KEY_LENGTH];
  91. NEWHOPE_finish_computation(key, s.get(), in_pk.get(), in_rec.get());
  92. return t->ExpectBytesEqual(expected_key.data(), expected_key.size(), key,
  93. NEWHOPE_KEY_LENGTH);
  94. } else {
  95. t->PrintLine("Unknown test '%s'", t->GetType().c_str());
  96. return false;
  97. }
  98. }
  99. int main(int argc, char **argv) {
  100. CRYPTO_library_init();
  101. if (argc != 2) {
  102. fprintf(stderr, "%s <test file>\n", argv[0]);
  103. return 1;
  104. }
  105. return FileTestMain(TestNewhope, nullptr, argv[1]);
  106. }