Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
IanBenzMaxim
Date:
Wed Jan 23 13:11:04 2019 -0600
Revision:
6:a8c83a2e6fa4
Child:
7:471901a04573
Updated to version 1.6 and removed platform files that are incompatible with mbed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 6:a8c83a2e6fa4 1 /*******************************************************************************
IanBenzMaxim 6:a8c83a2e6fa4 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 6:a8c83a2e6fa4 3 *
IanBenzMaxim 6:a8c83a2e6fa4 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 6:a8c83a2e6fa4 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 6:a8c83a2e6fa4 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 6:a8c83a2e6fa4 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 6:a8c83a2e6fa4 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 6:a8c83a2e6fa4 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 6:a8c83a2e6fa4 10 *
IanBenzMaxim 6:a8c83a2e6fa4 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 6:a8c83a2e6fa4 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 6:a8c83a2e6fa4 13 *
IanBenzMaxim 6:a8c83a2e6fa4 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 6:a8c83a2e6fa4 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 6:a8c83a2e6fa4 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 6:a8c83a2e6fa4 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 6:a8c83a2e6fa4 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 6:a8c83a2e6fa4 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 6:a8c83a2e6fa4 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 6:a8c83a2e6fa4 21 *
IanBenzMaxim 6:a8c83a2e6fa4 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 6:a8c83a2e6fa4 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 6:a8c83a2e6fa4 24 * Products, Inc. Branding Policy.
IanBenzMaxim 6:a8c83a2e6fa4 25 *
IanBenzMaxim 6:a8c83a2e6fa4 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 6:a8c83a2e6fa4 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 6:a8c83a2e6fa4 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 6:a8c83a2e6fa4 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 6:a8c83a2e6fa4 30 * ownership rights.
IanBenzMaxim 6:a8c83a2e6fa4 31 *******************************************************************************/
IanBenzMaxim 6:a8c83a2e6fa4 32
IanBenzMaxim 6:a8c83a2e6fa4 33 #ifndef MaximInterface_DS28E38
IanBenzMaxim 6:a8c83a2e6fa4 34 #define MaximInterface_DS28E38
IanBenzMaxim 6:a8c83a2e6fa4 35
IanBenzMaxim 6:a8c83a2e6fa4 36 #include <stdint.h>
IanBenzMaxim 6:a8c83a2e6fa4 37 #include <MaximInterface/Links/RunCommand.hpp>
IanBenzMaxim 6:a8c83a2e6fa4 38 #include <MaximInterface/Utilities/array_span.hpp>
IanBenzMaxim 6:a8c83a2e6fa4 39 #include <MaximInterface/Utilities/Ecc256.hpp>
IanBenzMaxim 6:a8c83a2e6fa4 40 #include <MaximInterface/Utilities/Export.h>
IanBenzMaxim 6:a8c83a2e6fa4 41 #include <MaximInterface/Utilities/FlagSet.hpp>
IanBenzMaxim 6:a8c83a2e6fa4 42 #include <MaximInterface/Utilities/ManId.hpp>
IanBenzMaxim 6:a8c83a2e6fa4 43 #include <MaximInterface/Utilities/system_error.hpp>
IanBenzMaxim 6:a8c83a2e6fa4 44
IanBenzMaxim 6:a8c83a2e6fa4 45 namespace MaximInterface {
IanBenzMaxim 6:a8c83a2e6fa4 46
IanBenzMaxim 6:a8c83a2e6fa4 47 class DS28E38 {
IanBenzMaxim 6:a8c83a2e6fa4 48 public:
IanBenzMaxim 6:a8c83a2e6fa4 49 /// Device command results.
IanBenzMaxim 6:a8c83a2e6fa4 50 enum ErrorValue {
IanBenzMaxim 6:a8c83a2e6fa4 51 InvalidOperationError = 0x55,
IanBenzMaxim 6:a8c83a2e6fa4 52 InvalidParameterError = 0x77,
IanBenzMaxim 6:a8c83a2e6fa4 53 InvalidSequenceError = 0x33,
IanBenzMaxim 6:a8c83a2e6fa4 54 InternalError = 0x22,
IanBenzMaxim 6:a8c83a2e6fa4 55 DeviceDisabledError = 0x88,
IanBenzMaxim 6:a8c83a2e6fa4 56 InvalidResponseError =
IanBenzMaxim 6:a8c83a2e6fa4 57 0x100 ///< Command response does not match expected format.
IanBenzMaxim 6:a8c83a2e6fa4 58 };
IanBenzMaxim 6:a8c83a2e6fa4 59
IanBenzMaxim 6:a8c83a2e6fa4 60 // Device memory pages.
IanBenzMaxim 6:a8c83a2e6fa4 61 static const int decrementCounterPage = 3;
IanBenzMaxim 6:a8c83a2e6fa4 62 static const int publicKeyXPage = 4;
IanBenzMaxim 6:a8c83a2e6fa4 63 static const int publicKeyYPage = 5;
IanBenzMaxim 6:a8c83a2e6fa4 64 static const int privateKeyPage = 6;
IanBenzMaxim 6:a8c83a2e6fa4 65
IanBenzMaxim 6:a8c83a2e6fa4 66 static const int memoryPages = 7;
IanBenzMaxim 6:a8c83a2e6fa4 67
IanBenzMaxim 6:a8c83a2e6fa4 68 /// Holds a device memory page.
IanBenzMaxim 6:a8c83a2e6fa4 69 typedef array_span<uint_least8_t, 32> Page;
IanBenzMaxim 6:a8c83a2e6fa4 70
IanBenzMaxim 6:a8c83a2e6fa4 71 /// Format page authentication input data.
IanBenzMaxim 6:a8c83a2e6fa4 72 class PageAuthenticationData;
IanBenzMaxim 6:a8c83a2e6fa4 73
IanBenzMaxim 6:a8c83a2e6fa4 74 /// Page protection types.
IanBenzMaxim 6:a8c83a2e6fa4 75 enum PageProtectionType {
IanBenzMaxim 6:a8c83a2e6fa4 76 RP = 0x01, ///< Read protection.
IanBenzMaxim 6:a8c83a2e6fa4 77 WP = 0x02, ///< Write protection.
IanBenzMaxim 6:a8c83a2e6fa4 78 EM = 0x04, ///< EPROM emulation mode.
IanBenzMaxim 6:a8c83a2e6fa4 79 DC = 0x08, ///< Decrement counter.
IanBenzMaxim 6:a8c83a2e6fa4 80 PF = 0x10 ///< PUF used as private key.
IanBenzMaxim 6:a8c83a2e6fa4 81 };
IanBenzMaxim 6:a8c83a2e6fa4 82 typedef FlagSet<PageProtectionType, 5> PageProtection;
IanBenzMaxim 6:a8c83a2e6fa4 83
IanBenzMaxim 6:a8c83a2e6fa4 84 struct Status {
IanBenzMaxim 6:a8c83a2e6fa4 85 enum EntropyHealthTestStatus {
IanBenzMaxim 6:a8c83a2e6fa4 86 TestNotPerformed = 0xFF,
IanBenzMaxim 6:a8c83a2e6fa4 87 EntropyHealthy = 0xAA,
IanBenzMaxim 6:a8c83a2e6fa4 88 EntropyNotHealthy = 0xDD
IanBenzMaxim 6:a8c83a2e6fa4 89 };
IanBenzMaxim 6:a8c83a2e6fa4 90
IanBenzMaxim 6:a8c83a2e6fa4 91 typedef array<PageProtection, memoryPages> PageProtectionList;
IanBenzMaxim 6:a8c83a2e6fa4 92 typedef array<uint_least8_t, 2> RomVersion;
IanBenzMaxim 6:a8c83a2e6fa4 93
IanBenzMaxim 6:a8c83a2e6fa4 94 PageProtectionList pageProtection;
IanBenzMaxim 6:a8c83a2e6fa4 95 ManId::array manId;
IanBenzMaxim 6:a8c83a2e6fa4 96 RomVersion romVersion;
IanBenzMaxim 6:a8c83a2e6fa4 97 EntropyHealthTestStatus entropyHealthTestStatus;
IanBenzMaxim 6:a8c83a2e6fa4 98 };
IanBenzMaxim 6:a8c83a2e6fa4 99
IanBenzMaxim 6:a8c83a2e6fa4 100 explicit DS28E38(const RunCommand & runCommand) : doRunCommand(runCommand) {}
IanBenzMaxim 6:a8c83a2e6fa4 101
IanBenzMaxim 6:a8c83a2e6fa4 102 void setRunCommand(const RunCommand & runCommand) {
IanBenzMaxim 6:a8c83a2e6fa4 103 doRunCommand = runCommand;
IanBenzMaxim 6:a8c83a2e6fa4 104 }
IanBenzMaxim 6:a8c83a2e6fa4 105
IanBenzMaxim 6:a8c83a2e6fa4 106 /// Write memory with no protection.
IanBenzMaxim 6:a8c83a2e6fa4 107 /// @param pageNum Number of page to write.
IanBenzMaxim 6:a8c83a2e6fa4 108 /// @param page Data to write.
IanBenzMaxim 6:a8c83a2e6fa4 109 MaximInterface_EXPORT error_code writeMemory(int pageNum,
IanBenzMaxim 6:a8c83a2e6fa4 110 Page::const_span page);
IanBenzMaxim 6:a8c83a2e6fa4 111
IanBenzMaxim 6:a8c83a2e6fa4 112 /// Read memory with no protection.
IanBenzMaxim 6:a8c83a2e6fa4 113 /// @param pageNum Number of page to read.
IanBenzMaxim 6:a8c83a2e6fa4 114 /// @param[out] page Data that was read.
IanBenzMaxim 6:a8c83a2e6fa4 115 MaximInterface_EXPORT error_code readMemory(int pageNum, Page::span page);
IanBenzMaxim 6:a8c83a2e6fa4 116
IanBenzMaxim 6:a8c83a2e6fa4 117 /// Reads the current status of the device and optionally performs an
IanBenzMaxim 6:a8c83a2e6fa4 118 /// entropy health test.
IanBenzMaxim 6:a8c83a2e6fa4 119 /// @param entropyHealthTest True to perform an entropy health test.
IanBenzMaxim 6:a8c83a2e6fa4 120 /// @param[out] status Status that was read.
IanBenzMaxim 6:a8c83a2e6fa4 121 MaximInterface_EXPORT error_code readStatus(bool entropyHealthTest,
IanBenzMaxim 6:a8c83a2e6fa4 122 Status & status);
IanBenzMaxim 6:a8c83a2e6fa4 123
IanBenzMaxim 6:a8c83a2e6fa4 124 /// Set the protection settings of a page.
IanBenzMaxim 6:a8c83a2e6fa4 125 /// @param pageNum Number of page to write.
IanBenzMaxim 6:a8c83a2e6fa4 126 /// @param protection Protection to write.
IanBenzMaxim 6:a8c83a2e6fa4 127 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 128 setPageProtection(int pageNum, const PageProtection & protection);
IanBenzMaxim 6:a8c83a2e6fa4 129
IanBenzMaxim 6:a8c83a2e6fa4 130 /// Compute and read page authentication with ECDSA.
IanBenzMaxim 6:a8c83a2e6fa4 131 /// @param pageNum Number of page to authenticate.
IanBenzMaxim 6:a8c83a2e6fa4 132 /// @param anonymous True to disable use of ROM ID in computation.
IanBenzMaxim 6:a8c83a2e6fa4 133 /// @param challenge Random challenge used to prevent replay attacks.
IanBenzMaxim 6:a8c83a2e6fa4 134 /// @param[out] signature Computed page signature.
IanBenzMaxim 6:a8c83a2e6fa4 135 MaximInterface_EXPORT error_code computeAndReadPageAuthentication(
IanBenzMaxim 6:a8c83a2e6fa4 136 int pageNum, bool anonymous, Page::const_span challenge,
IanBenzMaxim 6:a8c83a2e6fa4 137 Ecc256::Signature::span signature);
IanBenzMaxim 6:a8c83a2e6fa4 138
IanBenzMaxim 6:a8c83a2e6fa4 139 /// Decrement the decrement-only counter.
IanBenzMaxim 6:a8c83a2e6fa4 140 MaximInterface_EXPORT error_code decrementCounter();
IanBenzMaxim 6:a8c83a2e6fa4 141
IanBenzMaxim 6:a8c83a2e6fa4 142 /// Permanently disable the device.
IanBenzMaxim 6:a8c83a2e6fa4 143 MaximInterface_EXPORT error_code disableDevice();
IanBenzMaxim 6:a8c83a2e6fa4 144
IanBenzMaxim 6:a8c83a2e6fa4 145 /// Generate a new ECDSA public key from an existing private key.
IanBenzMaxim 6:a8c83a2e6fa4 146 /// @param privateKeyPuf True if PUF is used as the private key.
IanBenzMaxim 6:a8c83a2e6fa4 147 /// @param writeProtectEnable True to lock the key against further writes.
IanBenzMaxim 6:a8c83a2e6fa4 148 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 149 generateEcc256KeyPair(bool privateKeyPuf, bool writeProtectEnable);
IanBenzMaxim 6:a8c83a2e6fa4 150
IanBenzMaxim 6:a8c83a2e6fa4 151 /// Read a block of random data from the RNG.
IanBenzMaxim 6:a8c83a2e6fa4 152 /// @param[out] data Random data from RNG with length from 1 to 64.
IanBenzMaxim 6:a8c83a2e6fa4 153 MaximInterface_EXPORT error_code readRng(span<uint_least8_t> data);
IanBenzMaxim 6:a8c83a2e6fa4 154
IanBenzMaxim 6:a8c83a2e6fa4 155 MaximInterface_EXPORT static const error_category & errorCategory();
IanBenzMaxim 6:a8c83a2e6fa4 156
IanBenzMaxim 6:a8c83a2e6fa4 157 protected:
IanBenzMaxim 6:a8c83a2e6fa4 158 MaximInterface_EXPORT error_code runCommand(span<const uint_least8_t> command,
IanBenzMaxim 6:a8c83a2e6fa4 159 int delayTime,
IanBenzMaxim 6:a8c83a2e6fa4 160 span<uint_least8_t> & response);
IanBenzMaxim 6:a8c83a2e6fa4 161
IanBenzMaxim 6:a8c83a2e6fa4 162 MaximInterface_EXPORT error_code runCommand(span<const uint_least8_t> command,
IanBenzMaxim 6:a8c83a2e6fa4 163 int delayTime);
IanBenzMaxim 6:a8c83a2e6fa4 164
IanBenzMaxim 6:a8c83a2e6fa4 165 private:
IanBenzMaxim 6:a8c83a2e6fa4 166 RunCommand doRunCommand;
IanBenzMaxim 6:a8c83a2e6fa4 167 };
IanBenzMaxim 6:a8c83a2e6fa4 168
IanBenzMaxim 6:a8c83a2e6fa4 169 inline error_code make_error_code(DS28E38::ErrorValue e) {
IanBenzMaxim 6:a8c83a2e6fa4 170 return error_code(e, DS28E38::errorCategory());
IanBenzMaxim 6:a8c83a2e6fa4 171 }
IanBenzMaxim 6:a8c83a2e6fa4 172
IanBenzMaxim 6:a8c83a2e6fa4 173 /// Read the device MAN ID using the Read Status command.
IanBenzMaxim 6:a8c83a2e6fa4 174 /// @param ds28e38 Device to read.
IanBenzMaxim 6:a8c83a2e6fa4 175 /// @param[out] manId Read MAN ID valid when operation is successful.
IanBenzMaxim 6:a8c83a2e6fa4 176 MaximInterface_EXPORT error_code readManId(DS28E38 & ds28e38,
IanBenzMaxim 6:a8c83a2e6fa4 177 ManId::span manId);
IanBenzMaxim 6:a8c83a2e6fa4 178
IanBenzMaxim 6:a8c83a2e6fa4 179 class DS28E38::PageAuthenticationData {
IanBenzMaxim 6:a8c83a2e6fa4 180 public:
IanBenzMaxim 6:a8c83a2e6fa4 181 typedef array_span<uint_least8_t,
IanBenzMaxim 6:a8c83a2e6fa4 182 RomId::size + 2 * Page::size + 1 + ManId::size>
IanBenzMaxim 6:a8c83a2e6fa4 183 Result;
IanBenzMaxim 6:a8c83a2e6fa4 184
IanBenzMaxim 6:a8c83a2e6fa4 185 PageAuthenticationData() : result_() {}
IanBenzMaxim 6:a8c83a2e6fa4 186
IanBenzMaxim 6:a8c83a2e6fa4 187 /// Formatted data result.
IanBenzMaxim 6:a8c83a2e6fa4 188 Result::const_span result() const { return result_; }
IanBenzMaxim 6:a8c83a2e6fa4 189
IanBenzMaxim 6:a8c83a2e6fa4 190 /// @{
IanBenzMaxim 6:a8c83a2e6fa4 191 /// 1-Wire ROM ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 192 RomId::span romId() {
IanBenzMaxim 6:a8c83a2e6fa4 193 return make_span(result_).subspan<romIdIdx, RomId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 194 }
IanBenzMaxim 6:a8c83a2e6fa4 195
IanBenzMaxim 6:a8c83a2e6fa4 196 RomId::const_span romId() const {
IanBenzMaxim 6:a8c83a2e6fa4 197 return const_cast<PageAuthenticationData &>(*this).romId();
IanBenzMaxim 6:a8c83a2e6fa4 198 }
IanBenzMaxim 6:a8c83a2e6fa4 199
IanBenzMaxim 6:a8c83a2e6fa4 200 PageAuthenticationData & setRomId(RomId::const_span romId) {
IanBenzMaxim 6:a8c83a2e6fa4 201 copy(romId, this->romId());
IanBenzMaxim 6:a8c83a2e6fa4 202 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 203 }
IanBenzMaxim 6:a8c83a2e6fa4 204
IanBenzMaxim 6:a8c83a2e6fa4 205 MaximInterface_EXPORT PageAuthenticationData & setAnonymousRomId();
IanBenzMaxim 6:a8c83a2e6fa4 206 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 207
IanBenzMaxim 6:a8c83a2e6fa4 208 /// @{
IanBenzMaxim 6:a8c83a2e6fa4 209 /// Data from a device memory page.
IanBenzMaxim 6:a8c83a2e6fa4 210 Page::span page() {
IanBenzMaxim 6:a8c83a2e6fa4 211 return make_span(result_).subspan<pageIdx, Page::size>();
IanBenzMaxim 6:a8c83a2e6fa4 212 }
IanBenzMaxim 6:a8c83a2e6fa4 213
IanBenzMaxim 6:a8c83a2e6fa4 214 Page::const_span page() const {
IanBenzMaxim 6:a8c83a2e6fa4 215 return const_cast<PageAuthenticationData &>(*this).page();
IanBenzMaxim 6:a8c83a2e6fa4 216 }
IanBenzMaxim 6:a8c83a2e6fa4 217
IanBenzMaxim 6:a8c83a2e6fa4 218 PageAuthenticationData & setPage(Page::const_span page) {
IanBenzMaxim 6:a8c83a2e6fa4 219 copy(page, this->page());
IanBenzMaxim 6:a8c83a2e6fa4 220 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 221 }
IanBenzMaxim 6:a8c83a2e6fa4 222 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 223
IanBenzMaxim 6:a8c83a2e6fa4 224 /// @{
IanBenzMaxim 6:a8c83a2e6fa4 225 /// Random challenge used to prevent replay attacks.
IanBenzMaxim 6:a8c83a2e6fa4 226 Page::span challenge() {
IanBenzMaxim 6:a8c83a2e6fa4 227 return make_span(result_).subspan<challengeIdx, Page::size>();
IanBenzMaxim 6:a8c83a2e6fa4 228 }
IanBenzMaxim 6:a8c83a2e6fa4 229
IanBenzMaxim 6:a8c83a2e6fa4 230 Page::const_span challenge() const {
IanBenzMaxim 6:a8c83a2e6fa4 231 return const_cast<PageAuthenticationData &>(*this).challenge();
IanBenzMaxim 6:a8c83a2e6fa4 232 }
IanBenzMaxim 6:a8c83a2e6fa4 233
IanBenzMaxim 6:a8c83a2e6fa4 234 PageAuthenticationData & setChallenge(Page::const_span challenge) {
IanBenzMaxim 6:a8c83a2e6fa4 235 copy(challenge, this->challenge());
IanBenzMaxim 6:a8c83a2e6fa4 236 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 237 }
IanBenzMaxim 6:a8c83a2e6fa4 238 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 239
IanBenzMaxim 6:a8c83a2e6fa4 240 /// @{
IanBenzMaxim 6:a8c83a2e6fa4 241 /// Number of the page to use data from.
IanBenzMaxim 6:a8c83a2e6fa4 242 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 6:a8c83a2e6fa4 243
IanBenzMaxim 6:a8c83a2e6fa4 244 PageAuthenticationData & setPageNum(int pageNum) {
IanBenzMaxim 6:a8c83a2e6fa4 245 result_[pageNumIdx] = pageNum;
IanBenzMaxim 6:a8c83a2e6fa4 246 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 247 }
IanBenzMaxim 6:a8c83a2e6fa4 248 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 249
IanBenzMaxim 6:a8c83a2e6fa4 250 /// @{
IanBenzMaxim 6:a8c83a2e6fa4 251 /// Manufacturer ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 252 ManId::span manId() {
IanBenzMaxim 6:a8c83a2e6fa4 253 return make_span(result_).subspan<manIdIdx, ManId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 254 }
IanBenzMaxim 6:a8c83a2e6fa4 255
IanBenzMaxim 6:a8c83a2e6fa4 256 ManId::const_span manId() const {
IanBenzMaxim 6:a8c83a2e6fa4 257 return const_cast<PageAuthenticationData &>(*this).manId();
IanBenzMaxim 6:a8c83a2e6fa4 258 }
IanBenzMaxim 6:a8c83a2e6fa4 259
IanBenzMaxim 6:a8c83a2e6fa4 260 PageAuthenticationData & setManId(ManId::const_span manId) {
IanBenzMaxim 6:a8c83a2e6fa4 261 copy(manId, this->manId());
IanBenzMaxim 6:a8c83a2e6fa4 262 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 263 }
IanBenzMaxim 6:a8c83a2e6fa4 264 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 265
IanBenzMaxim 6:a8c83a2e6fa4 266 private:
IanBenzMaxim 6:a8c83a2e6fa4 267 typedef Result::span::index_type index;
IanBenzMaxim 6:a8c83a2e6fa4 268
IanBenzMaxim 6:a8c83a2e6fa4 269 static const index romIdIdx = 0;
IanBenzMaxim 6:a8c83a2e6fa4 270 static const index pageIdx = romIdIdx + RomId::size;
IanBenzMaxim 6:a8c83a2e6fa4 271 static const index challengeIdx = pageIdx + Page::size;
IanBenzMaxim 6:a8c83a2e6fa4 272 static const index pageNumIdx = challengeIdx + Page::size;
IanBenzMaxim 6:a8c83a2e6fa4 273 static const index manIdIdx = pageNumIdx + 1;
IanBenzMaxim 6:a8c83a2e6fa4 274
IanBenzMaxim 6:a8c83a2e6fa4 275 Result::array result_;
IanBenzMaxim 6:a8c83a2e6fa4 276 };
IanBenzMaxim 6:a8c83a2e6fa4 277
IanBenzMaxim 6:a8c83a2e6fa4 278 } // namespace MaximInterface
IanBenzMaxim 6:a8c83a2e6fa4 279
IanBenzMaxim 6:a8c83a2e6fa4 280 #endif