pem_unittest.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. // Copyright (c) 2010 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/cert/pem.h"
  5. #include "testing/gtest/include/gtest/gtest.h"
  6. namespace net {
  7. TEST(PEMTokenizerTest, BasicParsing) {
  8. const char data[] =
  9. "-----BEGIN EXPECTED-BLOCK-----\n"
  10. "TWF0Y2hlc0FjY2VwdGVkQmxvY2tUeXBl\n"
  11. "-----END EXPECTED-BLOCK-----\n";
  12. base::StringPiece string_piece(data);
  13. std::vector<std::string> accepted_types;
  14. accepted_types.push_back("EXPECTED-BLOCK");
  15. PEMTokenizer tokenizer(string_piece, accepted_types);
  16. EXPECT_TRUE(tokenizer.GetNext());
  17. EXPECT_EQ("EXPECTED-BLOCK", tokenizer.block_type());
  18. EXPECT_EQ("MatchesAcceptedBlockType", tokenizer.data());
  19. EXPECT_FALSE(tokenizer.GetNext());
  20. }
  21. TEST(PEMTokenizerTest, CarriageReturnLineFeeds) {
  22. const char data[] =
  23. "-----BEGIN EXPECTED-BLOCK-----\r\n"
  24. "TWF0Y2hlc0FjY2VwdGVkQmxvY2tUeXBl\r\n"
  25. "-----END EXPECTED-BLOCK-----\r\n";
  26. base::StringPiece string_piece(data);
  27. std::vector<std::string> accepted_types;
  28. accepted_types.push_back("EXPECTED-BLOCK");
  29. PEMTokenizer tokenizer(string_piece, accepted_types);
  30. EXPECT_TRUE(tokenizer.GetNext());
  31. EXPECT_EQ("EXPECTED-BLOCK", tokenizer.block_type());
  32. EXPECT_EQ("MatchesAcceptedBlockType", tokenizer.data());
  33. EXPECT_FALSE(tokenizer.GetNext());
  34. }
  35. TEST(PEMTokenizerTest, NoAcceptedBlockTypes) {
  36. const char data[] =
  37. "-----BEGIN UNEXPECTED-BLOCK-----\n"
  38. "SWdub3Jlc1JlamVjdGVkQmxvY2tUeXBl\n"
  39. "-----END UNEXPECTED-BLOCK-----\n";
  40. base::StringPiece string_piece(data);
  41. std::vector<std::string> accepted_types;
  42. accepted_types.push_back("EXPECTED-BLOCK");
  43. PEMTokenizer tokenizer(string_piece, accepted_types);
  44. EXPECT_FALSE(tokenizer.GetNext());
  45. }
  46. TEST(PEMTokenizerTest, MultipleAcceptedBlockTypes) {
  47. const char data[] =
  48. "-----BEGIN BLOCK-ONE-----\n"
  49. "RW5jb2RlZERhdGFPbmU=\n"
  50. "-----END BLOCK-ONE-----\n"
  51. "-----BEGIN BLOCK-TWO-----\n"
  52. "RW5jb2RlZERhdGFUd28=\n"
  53. "-----END BLOCK-TWO-----\n";
  54. base::StringPiece string_piece(data);
  55. std::vector<std::string> accepted_types;
  56. accepted_types.push_back("BLOCK-ONE");
  57. accepted_types.push_back("BLOCK-TWO");
  58. PEMTokenizer tokenizer(string_piece, accepted_types);
  59. EXPECT_TRUE(tokenizer.GetNext());
  60. EXPECT_EQ("BLOCK-ONE", tokenizer.block_type());
  61. EXPECT_EQ("EncodedDataOne", tokenizer.data());
  62. EXPECT_TRUE(tokenizer.GetNext());
  63. EXPECT_EQ("BLOCK-TWO", tokenizer.block_type());
  64. EXPECT_EQ("EncodedDataTwo", tokenizer.data());
  65. EXPECT_FALSE(tokenizer.GetNext());
  66. }
  67. TEST(PEMTokenizerTest, MissingFooter) {
  68. const char data[] =
  69. "-----BEGIN MISSING-FOOTER-----\n"
  70. "RW5jb2RlZERhdGFPbmU=\n"
  71. "-----END MISSING-FOOTER-----\n"
  72. "-----BEGIN MISSING-FOOTER-----\n"
  73. "RW5jb2RlZERhdGFUd28=\n";
  74. base::StringPiece string_piece(data);
  75. std::vector<std::string> accepted_types;
  76. accepted_types.push_back("MISSING-FOOTER");
  77. PEMTokenizer tokenizer(string_piece, accepted_types);
  78. EXPECT_TRUE(tokenizer.GetNext());
  79. EXPECT_EQ("MISSING-FOOTER", tokenizer.block_type());
  80. EXPECT_EQ("EncodedDataOne", tokenizer.data());
  81. EXPECT_FALSE(tokenizer.GetNext());
  82. }
  83. TEST(PEMTokenizerTest, NestedEncoding) {
  84. const char data[] =
  85. "-----BEGIN BLOCK-ONE-----\n"
  86. "RW5jb2RlZERhdGFPbmU=\n"
  87. "-----BEGIN BLOCK-TWO-----\n"
  88. "RW5jb2RlZERhdGFUd28=\n"
  89. "-----END BLOCK-TWO-----\n"
  90. "-----END BLOCK-ONE-----\n"
  91. "-----BEGIN BLOCK-ONE-----\n"
  92. "RW5jb2RlZERhdGFUaHJlZQ==\n"
  93. "-----END BLOCK-ONE-----\n";
  94. base::StringPiece string_piece(data);
  95. std::vector<std::string> accepted_types;
  96. accepted_types.push_back("BLOCK-ONE");
  97. PEMTokenizer tokenizer(string_piece, accepted_types);
  98. EXPECT_TRUE(tokenizer.GetNext());
  99. EXPECT_EQ("BLOCK-ONE", tokenizer.block_type());
  100. EXPECT_EQ("EncodedDataThree", tokenizer.data());
  101. EXPECT_FALSE(tokenizer.GetNext());
  102. }
  103. TEST(PEMTokenizerTest, EmptyAcceptedTypes) {
  104. const char data[] =
  105. "-----BEGIN BLOCK-ONE-----\n"
  106. "RW5jb2RlZERhdGFPbmU=\n"
  107. "-----END BLOCK-ONE-----\n";
  108. base::StringPiece string_piece(data);
  109. std::vector<std::string> accepted_types;
  110. PEMTokenizer tokenizer(string_piece, accepted_types);
  111. EXPECT_FALSE(tokenizer.GetNext());
  112. }
  113. TEST(PEMTokenizerTest, BlockWithHeader) {
  114. const char data[] =
  115. "-----BEGIN BLOCK-ONE-----\n"
  116. "Header-One: Data data data\n"
  117. "Header-Two: \n"
  118. " continuation\n"
  119. "Header-Three: Mix-And,Match\n"
  120. "\n"
  121. "RW5jb2RlZERhdGFPbmU=\n"
  122. "-----END BLOCK-ONE-----\n"
  123. "-----BEGIN BLOCK-ONE-----\n"
  124. "RW5jb2RlZERhdGFUd28=\n"
  125. "-----END BLOCK-ONE-----\n";
  126. base::StringPiece string_piece(data);
  127. std::vector<std::string> accepted_types;
  128. accepted_types.push_back("BLOCK-ONE");
  129. PEMTokenizer tokenizer(string_piece, accepted_types);
  130. EXPECT_TRUE(tokenizer.GetNext());
  131. EXPECT_EQ("BLOCK-ONE", tokenizer.block_type());
  132. EXPECT_EQ("EncodedDataTwo", tokenizer.data());
  133. EXPECT_FALSE(tokenizer.GetNext());
  134. }
  135. TEST(PEMEncodeTest, Basic) {
  136. EXPECT_EQ(
  137. "-----BEGIN BLOCK-ONE-----\n"
  138. "RW5jb2RlZERhdGFPbmU=\n"
  139. "-----END BLOCK-ONE-----\n",
  140. PEMEncode("EncodedDataOne", "BLOCK-ONE"));
  141. EXPECT_EQ(
  142. "-----BEGIN BLOCK-TWO-----\n"
  143. "RW5jb2RlZERhdGFUd28=\n"
  144. "-----END BLOCK-TWO-----\n",
  145. PEMEncode("EncodedDataTwo", "BLOCK-TWO"));
  146. }
  147. TEST(PEMEncodeTest, Empty) {
  148. EXPECT_EQ(
  149. "-----BEGIN EMPTY-----\n"
  150. "-----END EMPTY-----\n",
  151. PEMEncode("", "EMPTY"));
  152. }
  153. TEST(PEMEncodeTest, Wrapping) {
  154. EXPECT_EQ(
  155. "-----BEGIN SINGLE LINE-----\n"
  156. "MTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktM\n"
  157. "-----END SINGLE LINE-----\n",
  158. PEMEncode("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL",
  159. "SINGLE LINE"));
  160. EXPECT_EQ(
  161. "-----BEGIN WRAPPED LINE-----\n"
  162. "MTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktM\nTQ==\n"
  163. "-----END WRAPPED LINE-----\n",
  164. PEMEncode("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM",
  165. "WRAPPED LINE"));
  166. }
  167. } // namespace net