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"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (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) {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN EXPECTED-BLOCK-----\n"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "TWF0Y2hlc0FjY2VwdGVkQmxvY2tUeXBl\n"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END EXPECTED-BLOCK-----\n";
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece string_piece(data);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("EXPECTED-BLOCK");
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("EXPECTED-BLOCK", tokenizer.block_type());
245821806d5e7f356e8fa4b058a389a808ea183019Torne (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"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END EXPECTED-BLOCK-----\r\n";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  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[] =
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN UNEXPECTED-BLOCK-----\n"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SWdub3Jlc1JlamVjdGVkQmxvY2tUeXBl\n"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END UNEXPECTED-BLOCK-----\n";
525821806d5e7f356e8fa4b058a389a808ea183019Torne (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"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----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)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("MISSING-FOOTER", tokenizer.block_type());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("EncodedDataOne", tokenizer.data());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, NestedEncoding) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFPbmU=\n"
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-TWO-----\n"
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFUd28=\n"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END BLOCK-TWO-----\n"
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (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";
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece string_piece(data);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_types.push_back("BLOCK-ONE");
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tokenizer.GetNext());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("BLOCK-ONE", tokenizer.block_type());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("EncodedDataThree", tokenizer.data());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, EmptyAcceptedTypes) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFPbmU=\n"
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END BLOCK-ONE-----\n";
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece string_piece(data);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accepted_types;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PEMTokenizer tokenizer(string_piece, accepted_types);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PEMTokenizerTest, BlockWithHeader) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char data[] =
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Header-One: Data data data\n"
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Header-Two: \n"
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  continuation\n"
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Header-Three: Mix-And,Match\n"
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\n"
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "RW5jb2RlZERhdGFPbmU=\n"
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----END BLOCK-ONE-----\n"
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-----BEGIN BLOCK-ONE-----\n"
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (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");
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (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());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tokenizer.GetNext());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
170