13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be 33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file. 43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#ifndef NET_BASE_PEM_TOKENIZER_H_ 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define NET_BASE_PEM_TOKENIZER_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <string> 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <vector> 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_piece.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace net { 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// PEMTokenizer is a utility class for the parsing of data encapsulated 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// using RFC 1421, Privacy Enhancement for Internet Electronic Mail. It 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// does not implement the full specification, most notably it does not 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// support the Encapsulated Header Portion described in Section 4.4. 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass PEMTokenizer { 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Create a new PEMTokenizer that iterates through |str| searching for 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // instances of PEM encoded blocks that are of the |allowed_block_types|. 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // |str| must remain valid for the duration of the PEMTokenizer. 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick PEMTokenizer(const base::StringPiece& str, 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::vector<std::string>& allowed_block_types); 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ~PEMTokenizer(); 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Attempts to decode the next PEM block in the string. Returns false if no 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // PEM blocks can be decoded. The decoded PEM block will be available via 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // data(). 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool GetNext(); 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns the PEM block type (eg: CERTIFICATE) of the last successfully 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // decoded PEM block. 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // GetNext() must have returned true before calling this method. 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& block_type() const { return block_type_; } 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns the raw, Base64-decoded data of the last successfully decoded 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // PEM block. 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // GetNext() must have returned true before calling this method. 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& data() const { return data_; } 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void Init(const base::StringPiece& str, 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::vector<std::string>& allowed_block_types); 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // A simple cache of the allowed PEM header and footer for a given PEM 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // block type, so that it is only computed once. 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick struct PEMType; 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The string to search, which must remain valid for as long as this class 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // is around. 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::StringPiece str_; 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The current position within |str_| that searching should begin from, 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // or StringPiece::npos if iteration is complete 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::StringPiece::size_type pos_; 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The type of data that was encoded, as indicated in the PEM 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Pre-Encapsulation Boundary (eg: CERTIFICATE, PKCS7, or 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // PRIVACY-ENHANCED MESSAGE). 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string block_type_; 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The types of PEM blocks that are allowed. PEM blocks that are not of 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // one of these types will be skipped. 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<PEMType> block_types_; 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The raw (Base64-decoded) data of the last successfully decoded block. 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string data_; 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DISALLOW_COPY_AND_ASSIGN(PEMTokenizer); 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} // namespace net 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif // NET_BASE_PEM_TOKENIZER_H_ 78