Kinetis Bootloader Host  2.0.0
Host Tools for Kinetis devices
Keyblob.h
1 /*
2 * File: Keyblob.h
3 *
4 * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5 * See included license file for license details.
6 */
7 #if !defined(_Keyblob_h_)
8 #define _Keyblob_h_
9 
10 #include "smart_ptr.h"
11 #include "OptionContext.h"
12 #include "DataTarget.h"
13 #include "AESKey.h"
14 #include "AESCounter.h"
15 
17 #define kKeyblobOptionNameStart "start"
18 #define kKeyblobOptionNameEnd "end"
19 #define kKeyblobOptionNameKey "key"
20 #define kKeyblobOptionNameCounter "counter"
21 
22 namespace elftosb
23 {
27 class Keyblob
28 {
29 public:
30  typedef std::vector<OptionContext *> option_vector_t;
31 
34  {
37  512
38  };
40 
41 public:
42  Keyblob()
43  : m_id(0)
44  , m_options(0)
45  {
46  }
47  Keyblob(uint32_t identifier)
48  : m_id(identifier)
49  , m_options(0)
50  {
51  }
52  virtual ~Keyblob() {}
53  static uint32_t getKekSizeBytes() { return kKekSizeBytes; }
54  void setIdentifier(uint32_t identifier) { m_id = identifier; }
55  uint32_t getIdentifier() const { return m_id; }
57  inline void addOptions(OptionContext *context) { m_options.push_back(context); }
59  inline option_vector_t *getOptions() { return &m_options; }
64  uint8_t *createWrappedKeyblobData(uint8_t *kek, uint32_t *byteCount);
65 
72  bool encryptMatchingRange(uint32_t start, uint32_t len, uint8_t *data);
73 
74 protected:
77  {
78  kKeySizeBits = 128,
83  kRegionAddrMask = (0x400 - 1),
84  kFlagMask = 0x07,
85  kKeyFlags = 0x03,
89  kNumKeyChars = 32,
90  kNumCtrChars = 16,
92  };
93 
95  typedef struct KeyBlob
96  {
97  unsigned char key[kAesKeySizeBytes]; // 16 bytes, 128-bits, KEY[A15...A00]
98  unsigned char ctr[kCtrSizeBytes]; // 8 bytes, 64-bits, CTR[C7...C0]
99  unsigned int srtaddr; // region start, STRADDR[31 - 10]
100  unsigned int endaddr; // region end, ENDADDR[31 - 10]
101  // end of 32-byte area covered by CRC
102  unsigned int zero_fill; // zeros
103  unsigned int key_blob_crc32; // crc32 over 1st 32-bytes
104  // end of 40 byte (5*64-bit) key blob data
105  unsigned char expanded_wrap_data[8]; // 8 bytes, used for wrap expanded data
106  // end of 48 byte (6*64-bit) wrap data
107  unsigned char unused_filler[16]; // unused fill to 64 bytes
108  } keyblob_t;
109 
110  void populateKeyBlob(keyblob_t *blob, uint32_t start, uint32_t end, const char *keyHex, const char *counterHex);
111  void encrypt(uint32_t length, uint8_t *data, AESKey<128> *key, AESCounter<128> *counter);
112  bool getOptionValues(OptionContext &opt, const char **key, const char **ctr, uint32_t *start, uint32_t *end);
113 
114  uint32_t m_id;
115  option_vector_t m_options;
116 };
117 
118 }; // namespace elftosb
119 
120 #endif // _Keyblob_h_
Expanded KeK size.
Definition: Keyblob.h:79
bool encryptMatchingRange(uint32_t start, uint32_t len, uint8_t *data)
Encrypt for OTFAD if range is within a keyblob entry range.
Definition: Keyblob.cpp:135
Number of bytes in KeK.
Definition: Keyblob.h:88
Number of characters in ctr string.
Definition: Keyblob.h:90
Number of bytes in Ctr.
Definition: Keyblob.h:87
AES-128.
Definition: Keyblob.h:78
_keywrap_constants
Keywrap constants.
Definition: Keyblob.h:76
Block size for AES-128 encryption.
Definition: Keyblob.h:35
std::vector< OptionContext * > option_vector_t
List of options entries.
Definition: Keyblob.h:30
Key Blob format.
Definition: Keyblob.h:95
Key flags mask.
Definition: Keyblob.h:84
Definition: BootImage.h:13
Number of key blobs.
Definition: Keyblob.h:80
Definition: Keyblob.h:36
Number of characters in key string.
Definition: Keyblob.h:89
void addOptions(OptionContext *context)
Add options.
Definition: Keyblob.h:57
Pure abstract interface class to a table of options.
Definition: apps/elftosb/common/OptionContext.h:18
Default flags: RO=0, ADE=1, VLD=1.
Definition: Keyblob.h:85
Keyblob specification.
Definition: Keyblob.h:27
Number of bytes covered by CRC32.
Definition: Keyblob.h:91
Number of bytes per output line.
Definition: Keyblob.h:82
Region addresses are modulo 1024.
Definition: Keyblob.h:83
Number of bytes in AES-128 key.
Definition: Keyblob.h:86
uint8_t * createWrappedKeyblobData(uint8_t *kek, uint32_t *byteCount)
Create and wrap keyblob data based on options.
Definition: Keyblob.cpp:225
option_vector_t m_options
List of option entries.
Definition: Keyblob.h:115
Key blob size in bytes.
Definition: Keyblob.h:81
option_vector_t * getOptions()
Return options vector.
Definition: Keyblob.h:59
uint32_t m_id
Unique identifier.
Definition: Keyblob.h:114
_encryption_constants
Constants for encryption.
Definition: Keyblob.h:33