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)