EncoreBootImageReader.h revision 1.1.2.2
1/* 2 * File: EncoreBootImageReader.h 3 * 4 * Copyright (c) Freescale Semiconductor, Inc. All rights reserved. 5 * See included license file for license details. 6 */ 7#if !defined(_EncoreBootImageReader_h_) 8#define _EncoreBootImageReader_h_ 9 10#include "EncoreBootImage.h" 11 12namespace elftosb 13{ 14 15/*! 16 * \brief Reads a Piano/Encore boot image from an input stream. 17 */ 18class EncoreBootImageReader 19{ 20public: 21 /*! 22 * \brief Exception class used for error found while reading a boot image. 23 */ 24 class read_error : public std::runtime_error 25 { 26 public: 27 //! \brief Constructor. 28 read_error(const std::string & msg) : std::runtime_error(msg) {} 29 }; 30 31 //! \brief An array of section headers. 32 typedef std::vector<EncoreBootImage::section_header_t> section_array_t; 33 34 //! \brief An array of boot tags. 35 typedef std::vector<EncoreBootImage::boot_command_t> boot_tag_array_t; 36 37public: 38 //! \brief Default constructor. 39 EncoreBootImageReader(std::istream & stream) : m_stream(stream) {} 40 41 //! \brief Destructor. 42 virtual ~EncoreBootImageReader() {} 43 44 //! \name Decryption key 45 //! These methods provide access to the Data Encryption Key (DEK). Normally 46 //! the DEK is discovered using the readKeyDictionary() method. 47 //@{ 48 inline void setKey(const AESKey<128> & key) { m_dek = key; } 49 inline const AESKey<128> & getKey() const { return m_dek; } 50 //@} 51 52 //! \name Readers 53 //! This group of methods is responsible for reading and parsing different 54 //! pieces and parts of the boot image file. 55 //@{ 56 //! \brief Reads the header from the image. 57 void readImageHeader(); 58 59 //! \brief Computes the actual SHA-1 digest of the image header. 60 void computeHeaderDigest(sha1_digest_t & digest); 61 62 //! \brief Reads the digest at the end of the image. 63 void readImageDigest(); 64 65 //! \brief Run a SHA-1 digest over the entire image. 66 void computeImageDigest(sha1_digest_t & digest); 67 68 //! \brief Read the plaintext section table entries. 69 void readSectionTable(); 70 71 //! \brief Reads the key dictionary, if the image is encrypted. 72 bool readKeyDictionary(const AESKey<128> & kek); 73 74 //! \brief 75 void readBootTags(); 76 77 //! \brief 78 EncoreBootImage::Section * readSection(unsigned index); 79 //@} 80 81 //! \name Accessors 82 //! Information retrieved with reader methods is accessible through 83 //! these methods. 84 //@{ 85 //! \brief Returns whether the image is encrypted or not. 86 //! \pre The header must have been read already. 87 inline bool isEncrypted() const { return m_header.m_keyCount > 0; } 88 89 //! \brief Returns a reference to the image's header. 90 const EncoreBootImage::boot_image_header_t & getHeader() const { return m_header; } 91 92 //! \brief Returns a reference to the SHA-1 digest read from the image. 93 const sha1_digest_t & getDigest() const { return m_digest; } 94 95 //! \brief Returns a reference to the STL container holding the section headers. 96 inline const section_array_t & getSections() const { return m_sections; } 97 98 //! \brief Returns a reference to the STL container holding the boot tags. 99 inline const boot_tag_array_t & getBootTags() const { return m_bootTags; } 100 //@} 101 102protected: 103 std::istream & m_stream; //!< The input stream to read the image from. 104 AESKey<128> m_dek; //!< DEK (data encryption key) read from the key dictionary. 105 EncoreBootImage::boot_image_header_t m_header; //!< Header from the boot image. 106 sha1_digest_t m_digest; //!< SHA-1 digest as read from the image. 107 section_array_t m_sections; //!< The section table. 108 boot_tag_array_t m_bootTags; //!< The array of boot tags read from the image. 109 110protected: 111 //! \brief Calculates the 8-bit checksum on a boot command header. 112 uint8_t calculateCommandChecksum(EncoreBootImage::boot_command_t & header); 113}; 114 115}; // namespace elftosb 116 117#endif // _EncoreBootImageReader_h_ 118