Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
reARMnimator
Date:
Mon Jan 06 15:54:55 2020 +0000
Revision:
10:de4b8812877d
Parent:
7:471901a04573
Fixed inappropriate include path.

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 7:471901a04573 60 /// @name Device memory pages
IanBenzMaxim 7:471901a04573 61 /// @{
IanBenzMaxim 7:471901a04573 62
IanBenzMaxim 6:a8c83a2e6fa4 63 static const int decrementCounterPage = 3;
IanBenzMaxim 6:a8c83a2e6fa4 64 static const int publicKeyXPage = 4;
IanBenzMaxim 6:a8c83a2e6fa4 65 static const int publicKeyYPage = 5;
IanBenzMaxim 6:a8c83a2e6fa4 66 static const int privateKeyPage = 6;
IanBenzMaxim 7:471901a04573 67
IanBenzMaxim 7:471901a04573 68 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 69
IanBenzMaxim 6:a8c83a2e6fa4 70 static const int memoryPages = 7;
IanBenzMaxim 6:a8c83a2e6fa4 71
IanBenzMaxim 6:a8c83a2e6fa4 72 /// Holds a device memory page.
IanBenzMaxim 6:a8c83a2e6fa4 73 typedef array_span<uint_least8_t, 32> Page;
IanBenzMaxim 6:a8c83a2e6fa4 74
IanBenzMaxim 7:471901a04573 75 // Format page authentication input data.
IanBenzMaxim 6:a8c83a2e6fa4 76 class PageAuthenticationData;
IanBenzMaxim 6:a8c83a2e6fa4 77
IanBenzMaxim 6:a8c83a2e6fa4 78 /// Page protection types.
IanBenzMaxim 6:a8c83a2e6fa4 79 enum PageProtectionType {
IanBenzMaxim 6:a8c83a2e6fa4 80 RP = 0x01, ///< Read protection.
IanBenzMaxim 6:a8c83a2e6fa4 81 WP = 0x02, ///< Write protection.
IanBenzMaxim 6:a8c83a2e6fa4 82 EM = 0x04, ///< EPROM emulation mode.
IanBenzMaxim 6:a8c83a2e6fa4 83 DC = 0x08, ///< Decrement counter.
IanBenzMaxim 6:a8c83a2e6fa4 84 PF = 0x10 ///< PUF used as private key.
IanBenzMaxim 6:a8c83a2e6fa4 85 };
IanBenzMaxim 6:a8c83a2e6fa4 86 typedef FlagSet<PageProtectionType, 5> PageProtection;
IanBenzMaxim 6:a8c83a2e6fa4 87
IanBenzMaxim 6:a8c83a2e6fa4 88 struct Status {
IanBenzMaxim 6:a8c83a2e6fa4 89 enum EntropyHealthTestStatus {
IanBenzMaxim 6:a8c83a2e6fa4 90 TestNotPerformed = 0xFF,
IanBenzMaxim 6:a8c83a2e6fa4 91 EntropyHealthy = 0xAA,
IanBenzMaxim 6:a8c83a2e6fa4 92 EntropyNotHealthy = 0xDD
IanBenzMaxim 6:a8c83a2e6fa4 93 };
IanBenzMaxim 6:a8c83a2e6fa4 94
IanBenzMaxim 6:a8c83a2e6fa4 95 typedef array<PageProtection, memoryPages> PageProtectionList;
IanBenzMaxim 6:a8c83a2e6fa4 96 typedef array<uint_least8_t, 2> RomVersion;
IanBenzMaxim 6:a8c83a2e6fa4 97
IanBenzMaxim 6:a8c83a2e6fa4 98 PageProtectionList pageProtection;
IanBenzMaxim 6:a8c83a2e6fa4 99 ManId::array manId;
IanBenzMaxim 6:a8c83a2e6fa4 100 RomVersion romVersion;
IanBenzMaxim 6:a8c83a2e6fa4 101 EntropyHealthTestStatus entropyHealthTestStatus;
IanBenzMaxim 6:a8c83a2e6fa4 102 };
IanBenzMaxim 6:a8c83a2e6fa4 103
IanBenzMaxim 6:a8c83a2e6fa4 104 explicit DS28E38(const RunCommand & runCommand) : doRunCommand(runCommand) {}
IanBenzMaxim 6:a8c83a2e6fa4 105
IanBenzMaxim 6:a8c83a2e6fa4 106 void setRunCommand(const RunCommand & runCommand) {
IanBenzMaxim 6:a8c83a2e6fa4 107 doRunCommand = runCommand;
IanBenzMaxim 6:a8c83a2e6fa4 108 }
IanBenzMaxim 6:a8c83a2e6fa4 109
IanBenzMaxim 7:471901a04573 110 /// @brief Write memory with no protection.
IanBenzMaxim 6:a8c83a2e6fa4 111 /// @param pageNum Number of page to write.
IanBenzMaxim 6:a8c83a2e6fa4 112 /// @param page Data to write.
IanBenzMaxim 6:a8c83a2e6fa4 113 MaximInterface_EXPORT error_code writeMemory(int pageNum,
IanBenzMaxim 6:a8c83a2e6fa4 114 Page::const_span page);
IanBenzMaxim 6:a8c83a2e6fa4 115
IanBenzMaxim 7:471901a04573 116 /// @brief Read memory with no protection.
IanBenzMaxim 6:a8c83a2e6fa4 117 /// @param pageNum Number of page to read.
IanBenzMaxim 6:a8c83a2e6fa4 118 /// @param[out] page Data that was read.
IanBenzMaxim 6:a8c83a2e6fa4 119 MaximInterface_EXPORT error_code readMemory(int pageNum, Page::span page);
IanBenzMaxim 6:a8c83a2e6fa4 120
IanBenzMaxim 7:471901a04573 121 /// @brief
IanBenzMaxim 6:a8c83a2e6fa4 122 /// Reads the current status of the device and optionally performs an
IanBenzMaxim 6:a8c83a2e6fa4 123 /// entropy health test.
IanBenzMaxim 6:a8c83a2e6fa4 124 /// @param entropyHealthTest True to perform an entropy health test.
IanBenzMaxim 6:a8c83a2e6fa4 125 /// @param[out] status Status that was read.
IanBenzMaxim 6:a8c83a2e6fa4 126 MaximInterface_EXPORT error_code readStatus(bool entropyHealthTest,
IanBenzMaxim 6:a8c83a2e6fa4 127 Status & status);
IanBenzMaxim 6:a8c83a2e6fa4 128
IanBenzMaxim 7:471901a04573 129 /// @brief Set the protection settings of a page.
IanBenzMaxim 6:a8c83a2e6fa4 130 /// @param pageNum Number of page to write.
IanBenzMaxim 6:a8c83a2e6fa4 131 /// @param protection Protection to write.
IanBenzMaxim 6:a8c83a2e6fa4 132 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 133 setPageProtection(int pageNum, const PageProtection & protection);
IanBenzMaxim 6:a8c83a2e6fa4 134
IanBenzMaxim 7:471901a04573 135 /// @brief Compute and read page authentication with ECDSA.
IanBenzMaxim 6:a8c83a2e6fa4 136 /// @param pageNum Number of page to authenticate.
IanBenzMaxim 6:a8c83a2e6fa4 137 /// @param anonymous True to disable use of ROM ID in computation.
IanBenzMaxim 6:a8c83a2e6fa4 138 /// @param challenge Random challenge used to prevent replay attacks.
IanBenzMaxim 6:a8c83a2e6fa4 139 /// @param[out] signature Computed page signature.
IanBenzMaxim 6:a8c83a2e6fa4 140 MaximInterface_EXPORT error_code computeAndReadPageAuthentication(
IanBenzMaxim 6:a8c83a2e6fa4 141 int pageNum, bool anonymous, Page::const_span challenge,
IanBenzMaxim 6:a8c83a2e6fa4 142 Ecc256::Signature::span signature);
IanBenzMaxim 6:a8c83a2e6fa4 143
IanBenzMaxim 6:a8c83a2e6fa4 144 /// Decrement the decrement-only counter.
IanBenzMaxim 6:a8c83a2e6fa4 145 MaximInterface_EXPORT error_code decrementCounter();
IanBenzMaxim 6:a8c83a2e6fa4 146
IanBenzMaxim 6:a8c83a2e6fa4 147 /// Permanently disable the device.
IanBenzMaxim 6:a8c83a2e6fa4 148 MaximInterface_EXPORT error_code disableDevice();
IanBenzMaxim 6:a8c83a2e6fa4 149
IanBenzMaxim 7:471901a04573 150 /// @brief Generate a new ECDSA public key from an existing private key.
IanBenzMaxim 6:a8c83a2e6fa4 151 /// @param privateKeyPuf True if PUF is used as the private key.
IanBenzMaxim 6:a8c83a2e6fa4 152 /// @param writeProtectEnable True to lock the key against further writes.
IanBenzMaxim 6:a8c83a2e6fa4 153 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 154 generateEcc256KeyPair(bool privateKeyPuf, bool writeProtectEnable);
IanBenzMaxim 6:a8c83a2e6fa4 155
IanBenzMaxim 7:471901a04573 156 /// @brief Read a block of random data from the RNG.
IanBenzMaxim 6:a8c83a2e6fa4 157 /// @param[out] data Random data from RNG with length from 1 to 64.
IanBenzMaxim 6:a8c83a2e6fa4 158 MaximInterface_EXPORT error_code readRng(span<uint_least8_t> data);
IanBenzMaxim 6:a8c83a2e6fa4 159
IanBenzMaxim 6:a8c83a2e6fa4 160 MaximInterface_EXPORT static const error_category & errorCategory();
IanBenzMaxim 6:a8c83a2e6fa4 161
IanBenzMaxim 6:a8c83a2e6fa4 162 protected:
IanBenzMaxim 6:a8c83a2e6fa4 163 MaximInterface_EXPORT error_code runCommand(span<const uint_least8_t> command,
IanBenzMaxim 6:a8c83a2e6fa4 164 int delayTime,
IanBenzMaxim 6:a8c83a2e6fa4 165 span<uint_least8_t> & response);
IanBenzMaxim 6:a8c83a2e6fa4 166
IanBenzMaxim 6:a8c83a2e6fa4 167 MaximInterface_EXPORT error_code runCommand(span<const uint_least8_t> command,
IanBenzMaxim 6:a8c83a2e6fa4 168 int delayTime);
IanBenzMaxim 6:a8c83a2e6fa4 169
IanBenzMaxim 6:a8c83a2e6fa4 170 private:
IanBenzMaxim 6:a8c83a2e6fa4 171 RunCommand doRunCommand;
IanBenzMaxim 6:a8c83a2e6fa4 172 };
IanBenzMaxim 6:a8c83a2e6fa4 173
IanBenzMaxim 6:a8c83a2e6fa4 174 inline error_code make_error_code(DS28E38::ErrorValue e) {
IanBenzMaxim 6:a8c83a2e6fa4 175 return error_code(e, DS28E38::errorCategory());
IanBenzMaxim 6:a8c83a2e6fa4 176 }
IanBenzMaxim 6:a8c83a2e6fa4 177
IanBenzMaxim 7:471901a04573 178 /// @brief Read the device MAN ID using the Read Status command.
IanBenzMaxim 6:a8c83a2e6fa4 179 /// @param ds28e38 Device to read.
IanBenzMaxim 6:a8c83a2e6fa4 180 /// @param[out] manId Read MAN ID valid when operation is successful.
IanBenzMaxim 6:a8c83a2e6fa4 181 MaximInterface_EXPORT error_code readManId(DS28E38 & ds28e38,
IanBenzMaxim 6:a8c83a2e6fa4 182 ManId::span manId);
IanBenzMaxim 6:a8c83a2e6fa4 183
IanBenzMaxim 7:471901a04573 184 /// Format page authentication input data.
IanBenzMaxim 6:a8c83a2e6fa4 185 class DS28E38::PageAuthenticationData {
IanBenzMaxim 6:a8c83a2e6fa4 186 public:
IanBenzMaxim 6:a8c83a2e6fa4 187 typedef array_span<uint_least8_t,
IanBenzMaxim 6:a8c83a2e6fa4 188 RomId::size + 2 * Page::size + 1 + ManId::size>
IanBenzMaxim 6:a8c83a2e6fa4 189 Result;
IanBenzMaxim 6:a8c83a2e6fa4 190
IanBenzMaxim 6:a8c83a2e6fa4 191 PageAuthenticationData() : result_() {}
IanBenzMaxim 6:a8c83a2e6fa4 192
IanBenzMaxim 6:a8c83a2e6fa4 193 /// Formatted data result.
IanBenzMaxim 6:a8c83a2e6fa4 194 Result::const_span result() const { return result_; }
IanBenzMaxim 6:a8c83a2e6fa4 195
IanBenzMaxim 7:471901a04573 196 /// @name ROM ID
IanBenzMaxim 7:471901a04573 197 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 198 /// @{
IanBenzMaxim 7:471901a04573 199
IanBenzMaxim 7:471901a04573 200 /// Get mutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 201 RomId::span romId() {
IanBenzMaxim 6:a8c83a2e6fa4 202 return make_span(result_).subspan<romIdIdx, RomId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 203 }
IanBenzMaxim 6:a8c83a2e6fa4 204
IanBenzMaxim 7:471901a04573 205 /// Get immutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 206 RomId::const_span romId() const {
IanBenzMaxim 6:a8c83a2e6fa4 207 return const_cast<PageAuthenticationData &>(*this).romId();
IanBenzMaxim 6:a8c83a2e6fa4 208 }
IanBenzMaxim 6:a8c83a2e6fa4 209
IanBenzMaxim 7:471901a04573 210 /// Set ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 211 PageAuthenticationData & setRomId(RomId::const_span romId) {
IanBenzMaxim 6:a8c83a2e6fa4 212 copy(romId, this->romId());
IanBenzMaxim 6:a8c83a2e6fa4 213 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 214 }
IanBenzMaxim 6:a8c83a2e6fa4 215
IanBenzMaxim 7:471901a04573 216 /// Set ROM ID for use in anonymous mode.
IanBenzMaxim 6:a8c83a2e6fa4 217 MaximInterface_EXPORT PageAuthenticationData & setAnonymousRomId();
IanBenzMaxim 7:471901a04573 218
IanBenzMaxim 6:a8c83a2e6fa4 219 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 220
IanBenzMaxim 7:471901a04573 221 /// @name Page
IanBenzMaxim 7:471901a04573 222 /// @brief Data from a device memory page.
IanBenzMaxim 6:a8c83a2e6fa4 223 /// @{
IanBenzMaxim 7:471901a04573 224
IanBenzMaxim 7:471901a04573 225 /// Get mutable page.
IanBenzMaxim 6:a8c83a2e6fa4 226 Page::span page() {
IanBenzMaxim 6:a8c83a2e6fa4 227 return make_span(result_).subspan<pageIdx, Page::size>();
IanBenzMaxim 6:a8c83a2e6fa4 228 }
IanBenzMaxim 6:a8c83a2e6fa4 229
IanBenzMaxim 7:471901a04573 230 /// Get immutable page.
IanBenzMaxim 6:a8c83a2e6fa4 231 Page::const_span page() const {
IanBenzMaxim 6:a8c83a2e6fa4 232 return const_cast<PageAuthenticationData &>(*this).page();
IanBenzMaxim 6:a8c83a2e6fa4 233 }
IanBenzMaxim 6:a8c83a2e6fa4 234
IanBenzMaxim 7:471901a04573 235 /// Set page.
IanBenzMaxim 6:a8c83a2e6fa4 236 PageAuthenticationData & setPage(Page::const_span page) {
IanBenzMaxim 6:a8c83a2e6fa4 237 copy(page, this->page());
IanBenzMaxim 6:a8c83a2e6fa4 238 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 239 }
IanBenzMaxim 7:471901a04573 240
IanBenzMaxim 6:a8c83a2e6fa4 241 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 242
IanBenzMaxim 7:471901a04573 243 /// @name Challenge
IanBenzMaxim 7:471901a04573 244 /// @brief Random challenge used to prevent replay attacks.
IanBenzMaxim 6:a8c83a2e6fa4 245 /// @{
IanBenzMaxim 7:471901a04573 246
IanBenzMaxim 7:471901a04573 247 /// Get mutable Challenge.
IanBenzMaxim 6:a8c83a2e6fa4 248 Page::span challenge() {
IanBenzMaxim 6:a8c83a2e6fa4 249 return make_span(result_).subspan<challengeIdx, Page::size>();
IanBenzMaxim 6:a8c83a2e6fa4 250 }
IanBenzMaxim 6:a8c83a2e6fa4 251
IanBenzMaxim 7:471901a04573 252 /// Get immutable Challenge.
IanBenzMaxim 6:a8c83a2e6fa4 253 Page::const_span challenge() const {
IanBenzMaxim 6:a8c83a2e6fa4 254 return const_cast<PageAuthenticationData &>(*this).challenge();
IanBenzMaxim 6:a8c83a2e6fa4 255 }
IanBenzMaxim 6:a8c83a2e6fa4 256
IanBenzMaxim 7:471901a04573 257 /// Set Challenge.
IanBenzMaxim 6:a8c83a2e6fa4 258 PageAuthenticationData & setChallenge(Page::const_span challenge) {
IanBenzMaxim 6:a8c83a2e6fa4 259 copy(challenge, this->challenge());
IanBenzMaxim 6:a8c83a2e6fa4 260 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 261 }
IanBenzMaxim 7:471901a04573 262
IanBenzMaxim 6:a8c83a2e6fa4 263 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 264
IanBenzMaxim 7:471901a04573 265 /// @name Page number
IanBenzMaxim 7:471901a04573 266 /// @brief Number of the page to use data from.
IanBenzMaxim 6:a8c83a2e6fa4 267 /// @{
IanBenzMaxim 7:471901a04573 268
IanBenzMaxim 7:471901a04573 269 /// Get page number.
IanBenzMaxim 6:a8c83a2e6fa4 270 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 6:a8c83a2e6fa4 271
IanBenzMaxim 7:471901a04573 272 /// Set page number.
IanBenzMaxim 6:a8c83a2e6fa4 273 PageAuthenticationData & setPageNum(int pageNum) {
IanBenzMaxim 6:a8c83a2e6fa4 274 result_[pageNumIdx] = pageNum;
IanBenzMaxim 6:a8c83a2e6fa4 275 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 276 }
IanBenzMaxim 7:471901a04573 277
IanBenzMaxim 6:a8c83a2e6fa4 278 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 279
IanBenzMaxim 7:471901a04573 280 /// @name MAN ID
IanBenzMaxim 7:471901a04573 281 /// @brief Manufacturer ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 282 /// @{
IanBenzMaxim 7:471901a04573 283
IanBenzMaxim 7:471901a04573 284 /// Get mutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 285 ManId::span manId() {
IanBenzMaxim 6:a8c83a2e6fa4 286 return make_span(result_).subspan<manIdIdx, ManId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 287 }
IanBenzMaxim 6:a8c83a2e6fa4 288
IanBenzMaxim 7:471901a04573 289 /// Get immutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 290 ManId::const_span manId() const {
IanBenzMaxim 6:a8c83a2e6fa4 291 return const_cast<PageAuthenticationData &>(*this).manId();
IanBenzMaxim 6:a8c83a2e6fa4 292 }
IanBenzMaxim 6:a8c83a2e6fa4 293
IanBenzMaxim 7:471901a04573 294 /// Set MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 295 PageAuthenticationData & setManId(ManId::const_span manId) {
IanBenzMaxim 6:a8c83a2e6fa4 296 copy(manId, this->manId());
IanBenzMaxim 6:a8c83a2e6fa4 297 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 298 }
IanBenzMaxim 7:471901a04573 299
IanBenzMaxim 6:a8c83a2e6fa4 300 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 301
IanBenzMaxim 6:a8c83a2e6fa4 302 private:
IanBenzMaxim 6:a8c83a2e6fa4 303 typedef Result::span::index_type index;
IanBenzMaxim 6:a8c83a2e6fa4 304
IanBenzMaxim 6:a8c83a2e6fa4 305 static const index romIdIdx = 0;
IanBenzMaxim 6:a8c83a2e6fa4 306 static const index pageIdx = romIdIdx + RomId::size;
IanBenzMaxim 6:a8c83a2e6fa4 307 static const index challengeIdx = pageIdx + Page::size;
IanBenzMaxim 6:a8c83a2e6fa4 308 static const index pageNumIdx = challengeIdx + Page::size;
IanBenzMaxim 6:a8c83a2e6fa4 309 static const index manIdIdx = pageNumIdx + 1;
IanBenzMaxim 6:a8c83a2e6fa4 310
IanBenzMaxim 6:a8c83a2e6fa4 311 Result::array result_;
IanBenzMaxim 6:a8c83a2e6fa4 312 };
IanBenzMaxim 6:a8c83a2e6fa4 313
IanBenzMaxim 6:a8c83a2e6fa4 314 } // namespace MaximInterface
IanBenzMaxim 6:a8c83a2e6fa4 315
IanBenzMaxim 6:a8c83a2e6fa4 316 #endif