Avi Drissman | 8ba1bad | 2022-09-13 19:22:36 | [diff] [blame] | 1 | // Copyright 2016 The Chromium Authors |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Daniel Cheng | 7b7aaecc | 2022-02-26 17:57:25 | [diff] [blame] | 5 | #include "components/base32/base32.h" |
| 6 | |
Tom Sepez | 46f69d89 | 2023-11-10 23:39:10 | [diff] [blame] | 7 | #include <stdint.h> |
| 8 | |
Peter Kasting | ccea0983 | 2025-01-27 18:38:22 | [diff] [blame] | 9 | #include <algorithm> |
Elly | a88dc72 | 2024-09-04 22:32:29 | [diff] [blame] | 10 | #include <array> |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 11 | #include <string> |
| 12 | |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 13 | #include "testing/gtest/include/gtest/gtest.h" |
| 14 | |
| 15 | namespace base32 { |
| 16 | namespace { |
| 17 | |
| 18 | TEST(Base32Test, EncodesRfcTestVectorsCorrectlyWithoutPadding) { |
| 19 | // Tests from http://tools.ietf.org/html/rfc4648#section-10. |
Helmut Januschka | 4f0bff9 | 2024-06-02 22:43:46 | [diff] [blame] | 20 | static constexpr uint8_t test_data[] = "foobar"; |
| 21 | constexpr base::span test_subspan(test_data); |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 22 | |
Elly | a88dc72 | 2024-09-04 22:32:29 | [diff] [blame] | 23 | constexpr auto expected = std::to_array<const char*>( |
| 24 | {"", "MY", "MZXQ", "MZXW6", "MZXW6YQ", "MZXW6YTB", "MZXW6YTBOI"}); |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 25 | |
| 26 | // Run the tests, with one more letter in the input every pass. |
Elly | a88dc72 | 2024-09-04 22:32:29 | [diff] [blame] | 27 | for (size_t i = 0; i < expected.size(); ++i) { |
Tom Sepez | 46f69d89 | 2023-11-10 23:39:10 | [diff] [blame] | 28 | auto encoded_output = |
Helmut Januschka | 4f0bff9 | 2024-06-02 22:43:46 | [diff] [blame] | 29 | Base32Encode(test_subspan.first(i), Base32EncodePolicy::OMIT_PADDING); |
Daniel Hosseinian | f4386ba | 2019-10-22 00:29:36 | [diff] [blame] | 30 | EXPECT_EQ(expected[i], encoded_output); |
Tom Sepez | 46f69d89 | 2023-11-10 23:39:10 | [diff] [blame] | 31 | auto decoded_output = Base32Decode(encoded_output); |
Peter Kasting | ccea0983 | 2025-01-27 18:38:22 | [diff] [blame] | 32 | EXPECT_TRUE(std::ranges::equal(test_subspan.first(i), decoded_output)); |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 33 | } |
| 34 | } |
| 35 | |
| 36 | TEST(Base32Test, EncodesRfcTestVectorsCorrectlyWithPadding) { |
| 37 | // Tests from http://tools.ietf.org/html/rfc4648#section-10. |
Helmut Januschka | 4f0bff9 | 2024-06-02 22:43:46 | [diff] [blame] | 38 | static constexpr uint8_t test_data[] = "foobar"; |
| 39 | constexpr base::span test_subspan(test_data); |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 40 | |
Elly | a88dc72 | 2024-09-04 22:32:29 | [diff] [blame] | 41 | constexpr auto expected = std::to_array<const char*>( |
| 42 | {"", "MY======", "MZXQ====", "MZXW6===", "MZXW6YQ=", "MZXW6YTB", |
| 43 | "MZXW6YTBOI======"}); |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 44 | |
| 45 | // Run the tests, with one more letter in the input every pass. |
Elly | a88dc72 | 2024-09-04 22:32:29 | [diff] [blame] | 46 | for (size_t i = 0; i < expected.size(); ++i) { |
Helmut Januschka | 4f0bff9 | 2024-06-02 22:43:46 | [diff] [blame] | 47 | std::string encoded_output = Base32Encode(test_subspan.first(i)); |
Daniel Hosseinian | f4386ba | 2019-10-22 00:29:36 | [diff] [blame] | 48 | EXPECT_EQ(expected[i], encoded_output); |
Tom Sepez | 46f69d89 | 2023-11-10 23:39:10 | [diff] [blame] | 49 | std::vector<uint8_t> decoded_output = Base32Decode(encoded_output); |
Peter Kasting | ccea0983 | 2025-01-27 18:38:22 | [diff] [blame] | 50 | EXPECT_TRUE(std::ranges::equal(test_subspan.first(i), decoded_output)); |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 51 | } |
| 52 | } |
| 53 | |
| 54 | TEST(Base32Test, EncodesSha256HashCorrectly) { |
| 55 | // Useful to test with longer input than the RFC test vectors, and encoding |
| 56 | // SHA-256 hashes is one of the use cases for this component. |
Helmut Januschka | 4f0bff9 | 2024-06-02 22:43:46 | [diff] [blame] | 57 | static constexpr uint8_t hash[] = |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 58 | "\x1f\x25\xe1\xca\xba\x4f\xf9\xb8\x27\x24\x83\x0f\xca\x60\xe4\xc2\xbe\xa8" |
| 59 | "\xc3\xa9\x44\x1c\x27\xb0\xb4\x3e\x6a\x96\x94\xc7\xb8\x04"; |
Helmut Januschka | 4f0bff9 | 2024-06-02 22:43:46 | [diff] [blame] | 60 | constexpr auto test_span = base::span(hash).first(32u); |
Daniel Hosseinian | f4386ba | 2019-10-22 00:29:36 | [diff] [blame] | 61 | std::string encoded_output = |
Tom Sepez | 46f69d89 | 2023-11-10 23:39:10 | [diff] [blame] | 62 | Base32Encode(test_span, Base32EncodePolicy::OMIT_PADDING); |
Daniel Hosseinian | f4386ba | 2019-10-22 00:29:36 | [diff] [blame] | 63 | EXPECT_EQ("D4S6DSV2J743QJZEQMH4UYHEYK7KRQ5JIQOCPMFUHZVJNFGHXACA", |
| 64 | encoded_output); |
Tom Sepez | 46f69d89 | 2023-11-10 23:39:10 | [diff] [blame] | 65 | std::vector<uint8_t> decoded_output = Base32Decode(encoded_output); |
Peter Kasting | ccea0983 | 2025-01-27 18:38:22 | [diff] [blame] | 66 | EXPECT_TRUE(std::ranges::equal(test_span, decoded_output)); |
robpercival | 633e8bc | 2016-06-08 13:45:11 | [diff] [blame] | 67 | } |
| 68 | |
| 69 | } // namespace |
| 70 | } // namespace base32 |