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