15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/pem_tokenizer.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, BasicParsing) {
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char data[] =
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN EXPECTED-BLOCK-----\n"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "TWF0Y2hlc0FjY2VwdGVkQmxvY2tUeXBl\n"
155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      "-----END EXPECTED-BLOCK-----\n";
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::StringPiece string_piece(data);
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<std::string> accepted_types;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("EXPECTED-BLOCK");
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("EXPECTED-BLOCK", tokenizer.block_type());
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("MatchesAcceptedBlockType", tokenizer.data());
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, CarriageReturnLineFeeds) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN EXPECTED-BLOCK-----\r\n"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "TWF0Y2hlc0FjY2VwdGVkQmxvY2tUeXBl\r\n"
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "-----END EXPECTED-BLOCK-----\r\n";
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::StringPiece string_piece(data);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("EXPECTED-BLOCK");
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("EXPECTED-BLOCK", tokenizer.block_type());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("MatchesAcceptedBlockType", tokenizer.data());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, NoAcceptedBlockTypes) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "-----BEGIN UNEXPECTED-BLOCK-----\n"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SWdub3Jlc1JlamVjdGVkQmxvY2tUeXBl\n"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END UNEXPECTED-BLOCK-----\n";
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::StringPiece string_piece(data);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("EXPECTED-BLOCK");
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, MultipleAcceptedBlockTypes) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFPbmU=\n"
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "-----END BLOCK-ONE-----\n"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-TWO-----\n"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFUd28=\n"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END BLOCK-TWO-----\n";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece string_piece(data);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("BLOCK-ONE");
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("BLOCK-TWO");
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("BLOCK-ONE", tokenizer.block_type());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("EncodedDataOne", tokenizer.data());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("BLOCK-TWO", tokenizer.block_type());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("EncodedDataTwo", tokenizer.data());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, MissingFooter) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN MISSING-FOOTER-----\n"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFPbmU=\n"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END MISSING-FOOTER-----\n"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN MISSING-FOOTER-----\n"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFUd28=\n";
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece string_piece(data);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("MISSING-FOOTER");
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("MISSING-FOOTER", tokenizer.block_type());
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("EncodedDataOne", tokenizer.data());
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(PEMTokenizerTest, NestedEncoding) {
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const char data[] =
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "RW5jb2RlZERhdGFPbmU=\n"
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "-----BEGIN BLOCK-TWO-----\n"
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "RW5jb2RlZERhdGFUd28=\n"
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "-----END BLOCK-TWO-----\n"
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "-----END BLOCK-ONE-----\n"
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFUaHJlZQ==\n"
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END BLOCK-ONE-----\n";
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringPiece string_piece(data);
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<std::string> accepted_types;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  accepted_types.push_back("BLOCK-ONE");
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("BLOCK-ONE", tokenizer.block_type());
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("EncodedDataThree", tokenizer.data());
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(PEMTokenizerTest, EmptyAcceptedTypes) {
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const char data[] =
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "RW5jb2RlZERhdGFPbmU=\n"
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "-----END BLOCK-ONE-----\n";
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::StringPiece string_piece(data);
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<std::string> accepted_types;
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(PEMTokenizerTest, BlockWithHeader) {
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const char data[] =
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "Header-One: Data data data\n"
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "Header-Two: \n"
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "  continuation\n"
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Header-Three: Mix-And,Match\n"
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "\n"
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFPbmU=\n"
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END BLOCK-ONE-----\n"
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "RW5jb2RlZERhdGFUd28=\n"
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END BLOCK-ONE-----\n";
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece string_piece(data);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("BLOCK-ONE");
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("BLOCK-ONE", tokenizer.block_type());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("EncodedDataTwo", tokenizer.data());
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)