sha1.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "catch.hpp"
  2. #include "sha1.hh"
  3. #include <cstring>
  4. #include <sstream>
  5. using namespace openmsx;
  6. TEST_CASE("Sha1Sum: constructors")
  7. {
  8. SECTION("default") {
  9. Sha1Sum sum;
  10. CHECK(sum.empty());
  11. CHECK(sum.toString() == "0000000000000000000000000000000000000000");
  12. }
  13. SECTION("from string, ok") {
  14. Sha1Sum sum("1234567890123456789012345678901234567890");
  15. CHECK(!sum.empty());
  16. CHECK(sum.toString() == "1234567890123456789012345678901234567890");
  17. }
  18. SECTION("from string, too short") {
  19. CHECK_THROWS(Sha1Sum("123456789012345678901234567890123456789"));
  20. }
  21. SECTION("from string, too long") {
  22. CHECK_THROWS(Sha1Sum("12345678901234567890123456789012345678901"));
  23. }
  24. SECTION("from string, invalid char") {
  25. CHECK_THROWS(Sha1Sum("g234567890123456789012345678901234567890"));
  26. }
  27. }
  28. TEST_CASE("Sha1Sum: parse")
  29. {
  30. Sha1Sum sum;
  31. // precondition: string must be 40 chars long
  32. SECTION("ok") {
  33. sum.parse40("abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd");
  34. CHECK(sum.toString() == "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd");
  35. }
  36. SECTION("invalid char") {
  37. CHECK_THROWS(sum.parse40("abcdabcdabcdabcdabcdabcdabcdabcd-bcdabcd"));
  38. }
  39. }
  40. TEST_CASE("Sha1Sum: clear")
  41. {
  42. Sha1Sum sum("1111111111111111111111111111111111111111");
  43. REQUIRE(!sum.empty());
  44. REQUIRE(sum.toString() != "0000000000000000000000000000000000000000");
  45. sum.clear();
  46. CHECK(sum.empty());
  47. CHECK(sum.toString() == "0000000000000000000000000000000000000000");
  48. }
  49. static void testCompare(const Sha1Sum& x, const Sha1Sum& y, bool expectEqual, bool expectLess)
  50. {
  51. if (expectEqual) {
  52. REQUIRE(!expectLess);
  53. CHECK( x == y ); CHECK( y == x );
  54. CHECK(!(x != y)); CHECK(!(y != x));
  55. CHECK(!(x < y)); CHECK(!(y < x));
  56. CHECK( x <= y ); CHECK( y <= x );
  57. CHECK(!(x > y)); CHECK(!(y > x));
  58. CHECK( x >= y ); CHECK( y >= x );
  59. } else {
  60. CHECK(!(x == y)); CHECK(!(y == x));
  61. CHECK( x != y ); CHECK( y != x );
  62. if (expectLess) {
  63. CHECK( x < y ); CHECK(!(y < x));
  64. CHECK( x <= y ); CHECK(!(y <= x));
  65. CHECK(!(x > y)); CHECK( y > x );
  66. CHECK(!(x >= y)); CHECK( y >= x );
  67. } else {
  68. CHECK(!(x < y)); CHECK( y < x );
  69. CHECK(!(x <= y)); CHECK( y <= x );
  70. CHECK( x > y ); CHECK(!(y > x));
  71. CHECK( x >= y ); CHECK(!(y >= x));
  72. }
  73. }
  74. }
  75. TEST_CASE("Sha1Sum: comparisons")
  76. {
  77. Sha1Sum sumA ("0000000000000000000000000000000000000000");
  78. Sha1Sum sumB ("0000000000000000000000000000000000000001");
  79. Sha1Sum sumB2("0000000000000000000000000000000000000001");
  80. Sha1Sum sumC ("0000000000100000000000000000000000000001");
  81. testCompare(sumB, sumB2, true, false);
  82. testCompare(sumA, sumB, false, true);
  83. testCompare(sumC, sumB, false, false);
  84. }
  85. TEST_CASE("Sha1Sum: stream")
  86. {
  87. Sha1Sum sum("abcdef0123ABCDEF0123abcdef0123ABCDEF0123");
  88. std::stringstream ss;
  89. ss << sum;
  90. CHECK(ss.str() == "abcdef0123abcdef0123abcdef0123abcdef0123");
  91. }
  92. TEST_CASE("sha1: calc")
  93. {
  94. const char* in = "abc";
  95. Sha1Sum output = SHA1::calc(reinterpret_cast<const uint8_t*>(in), strlen(in));
  96. CHECK(output.toString() == "a9993e364706816aba3e25717850c26c9cd0d89d");
  97. }
  98. TEST_CASE("sha1: update,digest")
  99. {
  100. SHA1 sha1;
  101. SECTION("single block") {
  102. const char* in = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
  103. sha1.update(reinterpret_cast<const uint8_t*>(in), strlen(in));
  104. Sha1Sum sum1 = sha1.digest();
  105. Sha1Sum sum2 = sha1.digest(); // call 2nd time is ok
  106. CHECK(sum1 == sum2);
  107. CHECK(sum1.toString() == "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
  108. }
  109. SECTION("multiple blocks") {
  110. const char* in = "aaaaaaaaaaaaaaaaaaaaaaaaa";
  111. REQUIRE(strlen(in) == 25);
  112. for (int i = 0; i < 40000; ++i) {
  113. sha1.update(reinterpret_cast<const uint8_t*>(in), strlen(in));
  114. }
  115. // 25 * 40'000 = 1'000'000 repetitions of "a"
  116. Sha1Sum sum = sha1.digest();
  117. CHECK(sum.toString() == "34aa973cd4c4daa4f61eeb2bdbad27316534016f");
  118. }
  119. }