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