Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
reARMnimator
Date:
Wed Apr 03 12:33:10 2019 +0000
Revision:
8:211d1b8f730c
Parent:
7:471901a04573
Merge with version 1.7;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 0:f77ad7f72d04 1 /*******************************************************************************
IanBenzMaxim 0:f77ad7f72d04 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 0:f77ad7f72d04 3 *
IanBenzMaxim 0:f77ad7f72d04 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 0:f77ad7f72d04 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 0:f77ad7f72d04 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 0:f77ad7f72d04 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 0:f77ad7f72d04 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 0:f77ad7f72d04 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 0:f77ad7f72d04 10 *
IanBenzMaxim 0:f77ad7f72d04 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 0:f77ad7f72d04 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 0:f77ad7f72d04 13 *
IanBenzMaxim 0:f77ad7f72d04 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 0:f77ad7f72d04 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 0:f77ad7f72d04 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 0:f77ad7f72d04 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 0:f77ad7f72d04 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 0:f77ad7f72d04 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 0:f77ad7f72d04 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 0:f77ad7f72d04 21 *
IanBenzMaxim 0:f77ad7f72d04 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 24 * Products, Inc. Branding Policy.
IanBenzMaxim 0:f77ad7f72d04 25 *
IanBenzMaxim 0:f77ad7f72d04 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 0:f77ad7f72d04 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 0:f77ad7f72d04 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 0:f77ad7f72d04 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 0:f77ad7f72d04 30 * ownership rights.
IanBenzMaxim 0:f77ad7f72d04 31 *******************************************************************************/
IanBenzMaxim 0:f77ad7f72d04 32
IanBenzMaxim 0:f77ad7f72d04 33 #ifndef MaximInterface_DS28E15_22_25
IanBenzMaxim 0:f77ad7f72d04 34 #define MaximInterface_DS28E15_22_25
IanBenzMaxim 0:f77ad7f72d04 35
IanBenzMaxim 6:a8c83a2e6fa4 36 #include <stdint.h>
IanBenzMaxim 0:f77ad7f72d04 37 #include <MaximInterface/Links/OneWireMaster.hpp>
IanBenzMaxim 0:f77ad7f72d04 38 #include <MaximInterface/Links/SelectRom.hpp>
IanBenzMaxim 0:f77ad7f72d04 39 #include <MaximInterface/Links/Sleep.hpp>
IanBenzMaxim 6:a8c83a2e6fa4 40 #include <MaximInterface/Utilities/array_span.hpp>
IanBenzMaxim 0:f77ad7f72d04 41 #include <MaximInterface/Utilities/Export.h>
IanBenzMaxim 0:f77ad7f72d04 42 #include <MaximInterface/Utilities/ManId.hpp>
IanBenzMaxim 0:f77ad7f72d04 43 #include <MaximInterface/Utilities/Sha256.hpp>
IanBenzMaxim 0:f77ad7f72d04 44
IanBenzMaxim 0:f77ad7f72d04 45 namespace MaximInterface {
IanBenzMaxim 0:f77ad7f72d04 46
IanBenzMaxim 7:471901a04573 47 /// @brief
IanBenzMaxim 0:f77ad7f72d04 48 /// Interface to the DS28E15/22/25 series of authenticators
IanBenzMaxim 0:f77ad7f72d04 49 /// including low power variants.
IanBenzMaxim 0:f77ad7f72d04 50 class DS28E15_22_25 {
IanBenzMaxim 0:f77ad7f72d04 51 public:
IanBenzMaxim 0:f77ad7f72d04 52 enum ErrorValue { CrcError = 1, OperationFailure };
IanBenzMaxim 0:f77ad7f72d04 53
IanBenzMaxim 0:f77ad7f72d04 54 /// Holds the contents of a device memory segment.
IanBenzMaxim 6:a8c83a2e6fa4 55 typedef array_span<uint_least8_t, 4> Segment;
IanBenzMaxim 0:f77ad7f72d04 56
IanBenzMaxim 0:f77ad7f72d04 57 /// Holds the contents of a device memory page.
IanBenzMaxim 6:a8c83a2e6fa4 58 typedef array_span<uint_least8_t, 32> Page;
IanBenzMaxim 0:f77ad7f72d04 59
IanBenzMaxim 0:f77ad7f72d04 60 /// Number of segments per page.
IanBenzMaxim 6:a8c83a2e6fa4 61 static const int segmentsPerPage = Page::size / Segment::size;
IanBenzMaxim 0:f77ad7f72d04 62
IanBenzMaxim 0:f77ad7f72d04 63 /// Holds the contents of the device scratchpad.
IanBenzMaxim 6:a8c83a2e6fa4 64 typedef array_span<uint_least8_t, 32> Scratchpad;
IanBenzMaxim 0:f77ad7f72d04 65
IanBenzMaxim 6:a8c83a2e6fa4 66 /// Container for the device personality.
IanBenzMaxim 0:f77ad7f72d04 67 struct Personality {
IanBenzMaxim 0:f77ad7f72d04 68 uint_least8_t PB1;
IanBenzMaxim 0:f77ad7f72d04 69 uint_least8_t PB2;
IanBenzMaxim 6:a8c83a2e6fa4 70 ManId::array manId;
IanBenzMaxim 6:a8c83a2e6fa4 71
IanBenzMaxim 0:f77ad7f72d04 72 bool secretLocked() const { return PB2 & 0x01; }
IanBenzMaxim 0:f77ad7f72d04 73 };
IanBenzMaxim 0:f77ad7f72d04 74
IanBenzMaxim 7:471901a04573 75 // Represents the status of a memory protection block.
IanBenzMaxim 6:a8c83a2e6fa4 76 class BlockProtection;
IanBenzMaxim 0:f77ad7f72d04 77
IanBenzMaxim 7:471901a04573 78 // Format data to hash for an Authenticated Write to a memory segment.
IanBenzMaxim 6:a8c83a2e6fa4 79 class SegmentWriteMacData;
IanBenzMaxim 0:f77ad7f72d04 80
IanBenzMaxim 7:471901a04573 81 // Format data to hash for an Authenticated Write to a memory protection block.
IanBenzMaxim 6:a8c83a2e6fa4 82 class ProtectionWriteMacData;
IanBenzMaxim 0:f77ad7f72d04 83
IanBenzMaxim 7:471901a04573 84 // Format data to hash for device authentication or computing the next secret
IanBenzMaxim 7:471901a04573 85 // from the existing secret.
IanBenzMaxim 6:a8c83a2e6fa4 86 class AuthenticationData;
IanBenzMaxim 0:f77ad7f72d04 87
IanBenzMaxim 6:a8c83a2e6fa4 88 void setSleep(Sleep & sleep) { this->sleep = &sleep; }
IanBenzMaxim 6:a8c83a2e6fa4 89
IanBenzMaxim 0:f77ad7f72d04 90 void setMaster(OneWireMaster & master) { this->master = &master; }
IanBenzMaxim 6:a8c83a2e6fa4 91
IanBenzMaxim 0:f77ad7f72d04 92 void setSelectRom(const SelectRom & selectRom) {
IanBenzMaxim 0:f77ad7f72d04 93 this->selectRom = selectRom;
IanBenzMaxim 0:f77ad7f72d04 94 }
IanBenzMaxim 0:f77ad7f72d04 95
IanBenzMaxim 0:f77ad7f72d04 96 // Const member functions should not affect the state of the memory,
IanBenzMaxim 0:f77ad7f72d04 97 // block protection, or secret on the device.
IanBenzMaxim 0:f77ad7f72d04 98
IanBenzMaxim 7:471901a04573 99 /// @brief Read memory segment using the Read Memory command on the device.
IanBenzMaxim 0:f77ad7f72d04 100 /// @param pageNum Page number for read operation.
IanBenzMaxim 0:f77ad7f72d04 101 /// @param segmentNum Segment number within page for read operation.
IanBenzMaxim 0:f77ad7f72d04 102 /// @param[out] data Buffer to read data from the segment into.
IanBenzMaxim 0:f77ad7f72d04 103 MaximInterface_EXPORT error_code readSegment(int pageNum, int segmentNum,
IanBenzMaxim 6:a8c83a2e6fa4 104 Segment::span data) const;
IanBenzMaxim 0:f77ad7f72d04 105
IanBenzMaxim 7:471901a04573 106 /// @brief Continue an in-progress readSegment operation.
IanBenzMaxim 0:f77ad7f72d04 107 /// @note A CRC16 will encountered after reading the last segment of a page.
IanBenzMaxim 0:f77ad7f72d04 108 /// @param[out] data Buffer to read data from the segment into.
IanBenzMaxim 6:a8c83a2e6fa4 109 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 110 continueReadSegment(Segment::span data) const;
IanBenzMaxim 0:f77ad7f72d04 111
IanBenzMaxim 7:471901a04573 112 /// @brief Write memory segment using the Write Memory command.
IanBenzMaxim 0:f77ad7f72d04 113 /// @note 1-Wire ROM selection should have already occurred.
IanBenzMaxim 0:f77ad7f72d04 114 /// @param pageNum Page number for write operation.
IanBenzMaxim 0:f77ad7f72d04 115 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 0:f77ad7f72d04 116 /// @param[in] data Data to write to the memory segment.
IanBenzMaxim 0:f77ad7f72d04 117 MaximInterface_EXPORT error_code writeSegment(int pageNum, int segmentNum,
IanBenzMaxim 6:a8c83a2e6fa4 118 Segment::const_span data);
IanBenzMaxim 0:f77ad7f72d04 119
IanBenzMaxim 7:471901a04573 120 /// @brief Continue an in-progress Write Memory command.
IanBenzMaxim 0:f77ad7f72d04 121 /// @param[in] data Data to write to the memory segment.
IanBenzMaxim 6:a8c83a2e6fa4 122 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 123 continueWriteSegment(Segment::const_span data);
IanBenzMaxim 0:f77ad7f72d04 124
IanBenzMaxim 7:471901a04573 125 /// @brief Read memory page using the Read Memory command on the device.
IanBenzMaxim 0:f77ad7f72d04 126 /// @param pageNum Page number for write operation.
IanBenzMaxim 0:f77ad7f72d04 127 /// @param[out] rdbuf Buffer to read data from the page into.
IanBenzMaxim 6:a8c83a2e6fa4 128 MaximInterface_EXPORT error_code readPage(int pageNum,
IanBenzMaxim 6:a8c83a2e6fa4 129 Page::span rdbuf) const;
IanBenzMaxim 0:f77ad7f72d04 130
IanBenzMaxim 7:471901a04573 131 /// @brief Continue an in-progress readPageOperation.
IanBenzMaxim 0:f77ad7f72d04 132 /// @param[out] rdbuf Buffer to read data from the page into.
IanBenzMaxim 6:a8c83a2e6fa4 133 MaximInterface_EXPORT error_code continueReadPage(Page::span rdbuf) const;
IanBenzMaxim 0:f77ad7f72d04 134
IanBenzMaxim 7:471901a04573 135 /// @brief
IanBenzMaxim 0:f77ad7f72d04 136 /// Perform a Compute Page MAC command on the device.
IanBenzMaxim 0:f77ad7f72d04 137 /// Read back the MAC and verify the CRC16.
IanBenzMaxim 0:f77ad7f72d04 138 /// @param pageNum Page number to use for the computation.
IanBenzMaxim 0:f77ad7f72d04 139 /// @param anon True to compute in anonymous mode where ROM ID is not used.
IanBenzMaxim 0:f77ad7f72d04 140 /// @param[out] mac The device computed MAC.
IanBenzMaxim 6:a8c83a2e6fa4 141 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 142 computeReadPageMac(int pageNum, bool anon, Sha256::Hash::span mac) const;
IanBenzMaxim 0:f77ad7f72d04 143
IanBenzMaxim 7:471901a04573 144 /// @brief
IanBenzMaxim 0:f77ad7f72d04 145 /// Update the status of a memory protection block using the
IanBenzMaxim 0:f77ad7f72d04 146 /// Write Page Protection command.
IanBenzMaxim 7:471901a04573 147 /// @param protection
IanBenzMaxim 7:471901a04573 148 /// Desired protection status for the block.
IanBenzMaxim 7:471901a04573 149 /// It is not possible to disable existing protections.
IanBenzMaxim 0:f77ad7f72d04 150 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 151 writeBlockProtection(BlockProtection protection);
IanBenzMaxim 0:f77ad7f72d04 152
IanBenzMaxim 7:471901a04573 153 /// @brief
IanBenzMaxim 0:f77ad7f72d04 154 /// Update the status of a memory protection block using the
IanBenzMaxim 0:f77ad7f72d04 155 /// Authenticated Write Page Protection command.
IanBenzMaxim 6:a8c83a2e6fa4 156 /// @param newProtection New protection status to write.
IanBenzMaxim 0:f77ad7f72d04 157 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 0:f77ad7f72d04 158 MaximInterface_EXPORT error_code writeAuthBlockProtection(
IanBenzMaxim 6:a8c83a2e6fa4 159 BlockProtection newProtection, Sha256::Hash::const_span mac);
IanBenzMaxim 0:f77ad7f72d04 160
IanBenzMaxim 7:471901a04573 161 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 0:f77ad7f72d04 162 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:471901a04573 163 /// @param lock
IanBenzMaxim 7:471901a04573 164 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 0:f77ad7f72d04 165 MaximInterface_EXPORT error_code loadSecret(bool lock);
IanBenzMaxim 0:f77ad7f72d04 166
IanBenzMaxim 7:471901a04573 167 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 0:f77ad7f72d04 168 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:471901a04573 169 /// @param lock
IanBenzMaxim 7:471901a04573 170 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 0:f77ad7f72d04 171 MaximInterface_EXPORT error_code computeSecret(int pageNum, bool lock);
IanBenzMaxim 0:f77ad7f72d04 172
IanBenzMaxim 7:471901a04573 173 /// @brief Read the personality bytes using the Read Status command.
IanBenzMaxim 0:f77ad7f72d04 174 /// @param[out] personality Receives personality read from device.
IanBenzMaxim 0:f77ad7f72d04 175 MaximInterface_EXPORT error_code
IanBenzMaxim 0:f77ad7f72d04 176 readPersonality(Personality & personality) const;
IanBenzMaxim 0:f77ad7f72d04 177
IanBenzMaxim 0:f77ad7f72d04 178 MaximInterface_EXPORT static const error_category & errorCategory();
IanBenzMaxim 0:f77ad7f72d04 179
IanBenzMaxim 0:f77ad7f72d04 180 protected:
IanBenzMaxim 0:f77ad7f72d04 181 enum Variant { DS28E15, DS28E22, DS28E25 };
IanBenzMaxim 0:f77ad7f72d04 182
IanBenzMaxim 6:a8c83a2e6fa4 183 DS28E15_22_25(Sleep & sleep, OneWireMaster & master,
IanBenzMaxim 0:f77ad7f72d04 184 const SelectRom & selectRom)
IanBenzMaxim 0:f77ad7f72d04 185 : selectRom(selectRom), master(&master), sleep(&sleep) {}
IanBenzMaxim 6:a8c83a2e6fa4 186
IanBenzMaxim 6:a8c83a2e6fa4 187 ~DS28E15_22_25() {}
IanBenzMaxim 0:f77ad7f72d04 188
IanBenzMaxim 6:a8c83a2e6fa4 189 error_code doWriteScratchpad(Scratchpad::const_span data, Variant variant);
IanBenzMaxim 0:f77ad7f72d04 190
IanBenzMaxim 6:a8c83a2e6fa4 191 error_code doReadScratchpad(Scratchpad::span data, Variant variant) const;
IanBenzMaxim 0:f77ad7f72d04 192
IanBenzMaxim 0:f77ad7f72d04 193 error_code doReadBlockProtection(int blockNum, BlockProtection & protection,
IanBenzMaxim 0:f77ad7f72d04 194 Variant variant) const;
IanBenzMaxim 0:f77ad7f72d04 195
IanBenzMaxim 0:f77ad7f72d04 196 error_code doWriteAuthSegment(int pageNum, int segmentNum,
IanBenzMaxim 6:a8c83a2e6fa4 197 Segment::const_span newData,
IanBenzMaxim 6:a8c83a2e6fa4 198 Sha256::Hash::const_span mac, Variant variant);
IanBenzMaxim 0:f77ad7f72d04 199
IanBenzMaxim 6:a8c83a2e6fa4 200 error_code doContinueWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 6:a8c83a2e6fa4 201 Sha256::Hash::const_span mac,
IanBenzMaxim 0:f77ad7f72d04 202 Variant variant);
IanBenzMaxim 0:f77ad7f72d04 203
IanBenzMaxim 6:a8c83a2e6fa4 204 error_code doReadAllBlockProtection(span<BlockProtection> protection,
IanBenzMaxim 0:f77ad7f72d04 205 Variant variant) const;
IanBenzMaxim 0:f77ad7f72d04 206
IanBenzMaxim 0:f77ad7f72d04 207 error_code doLoadSecret(bool lock, bool lowPower);
IanBenzMaxim 0:f77ad7f72d04 208
IanBenzMaxim 0:f77ad7f72d04 209 error_code doComputeSecret(int pageNum, bool lock, bool lowPower);
IanBenzMaxim 0:f77ad7f72d04 210
IanBenzMaxim 0:f77ad7f72d04 211 private:
IanBenzMaxim 0:f77ad7f72d04 212 enum Command {
IanBenzMaxim 0:f77ad7f72d04 213 WriteMemory = 0x55,
IanBenzMaxim 0:f77ad7f72d04 214 ReadMemory = 0xF0,
IanBenzMaxim 0:f77ad7f72d04 215 LoadAndLockSecret = 0x33,
IanBenzMaxim 0:f77ad7f72d04 216 ComputeAndLockSecret = 0x3C,
IanBenzMaxim 0:f77ad7f72d04 217 ReadWriteScratchpad = 0x0F,
IanBenzMaxim 0:f77ad7f72d04 218 ComputePageMac = 0xA5,
IanBenzMaxim 0:f77ad7f72d04 219 ReadStatus = 0xAA,
IanBenzMaxim 0:f77ad7f72d04 220 WriteBlockProtection = 0xC3,
IanBenzMaxim 0:f77ad7f72d04 221 AuthWriteMemory = 0x5A,
IanBenzMaxim 0:f77ad7f72d04 222 AuthWriteBlockProtection = 0xCC,
IanBenzMaxim 0:f77ad7f72d04 223 };
IanBenzMaxim 0:f77ad7f72d04 224
IanBenzMaxim 6:a8c83a2e6fa4 225 error_code doWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 6:a8c83a2e6fa4 226 Sha256::Hash::const_span mac, Variant variant,
IanBenzMaxim 0:f77ad7f72d04 227 bool continuing);
IanBenzMaxim 0:f77ad7f72d04 228
IanBenzMaxim 0:f77ad7f72d04 229 error_code writeCommandWithCrc(
IanBenzMaxim 0:f77ad7f72d04 230 Command command, uint_least8_t parameter,
IanBenzMaxim 0:f77ad7f72d04 231 OneWireMaster::Level level = OneWireMaster::NormalLevel) const;
IanBenzMaxim 0:f77ad7f72d04 232
IanBenzMaxim 0:f77ad7f72d04 233 SelectRom selectRom;
IanBenzMaxim 0:f77ad7f72d04 234 OneWireMaster * master;
IanBenzMaxim 6:a8c83a2e6fa4 235 Sleep * sleep;
IanBenzMaxim 0:f77ad7f72d04 236 };
IanBenzMaxim 0:f77ad7f72d04 237
IanBenzMaxim 0:f77ad7f72d04 238 inline error_code make_error_code(DS28E15_22_25::ErrorValue e) {
IanBenzMaxim 0:f77ad7f72d04 239 return error_code(e, DS28E15_22_25::errorCategory());
IanBenzMaxim 0:f77ad7f72d04 240 }
IanBenzMaxim 0:f77ad7f72d04 241
IanBenzMaxim 0:f77ad7f72d04 242 /// Interface to the DS28EL15 (low power) authenticator.
IanBenzMaxim 0:f77ad7f72d04 243 class DS28EL15 : public DS28E15_22_25 {
IanBenzMaxim 0:f77ad7f72d04 244 public:
IanBenzMaxim 0:f77ad7f72d04 245 // DS28E15_22_25 traits
IanBenzMaxim 0:f77ad7f72d04 246 static const int memoryPages = 2;
IanBenzMaxim 0:f77ad7f72d04 247 static const int protectionBlocks = 4;
IanBenzMaxim 0:f77ad7f72d04 248
IanBenzMaxim 6:a8c83a2e6fa4 249 DS28EL15(Sleep & sleep, OneWireMaster & master, const SelectRom & selectRom)
IanBenzMaxim 0:f77ad7f72d04 250 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 0:f77ad7f72d04 251
IanBenzMaxim 7:471901a04573 252 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 0:f77ad7f72d04 253 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 6:a8c83a2e6fa4 254 MaximInterface_EXPORT error_code writeScratchpad(Scratchpad::const_span data);
IanBenzMaxim 0:f77ad7f72d04 255
IanBenzMaxim 7:471901a04573 256 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 0:f77ad7f72d04 257 /// @param[out] data Buffer to read data from the scratchpad into.
IanBenzMaxim 6:a8c83a2e6fa4 258 MaximInterface_EXPORT error_code readScratchpad(Scratchpad::span data) const;
IanBenzMaxim 0:f77ad7f72d04 259
IanBenzMaxim 7:471901a04573 260 /// @brief
IanBenzMaxim 0:f77ad7f72d04 261 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 0:f77ad7f72d04 262 /// @param blockNum Block number to to read status of.
IanBenzMaxim 0:f77ad7f72d04 263 /// @param[out] protection Receives protection status read from device.
IanBenzMaxim 0:f77ad7f72d04 264 MaximInterface_EXPORT error_code
IanBenzMaxim 0:f77ad7f72d04 265 readBlockProtection(int blockNum, BlockProtection & protection) const;
IanBenzMaxim 0:f77ad7f72d04 266
IanBenzMaxim 7:471901a04573 267 /// @brief Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 0:f77ad7f72d04 268 /// @param pageNum Page number for write operation.
IanBenzMaxim 0:f77ad7f72d04 269 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 0:f77ad7f72d04 270 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 0:f77ad7f72d04 271 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 6:a8c83a2e6fa4 272 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 273 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 6:a8c83a2e6fa4 274 Sha256::Hash::const_span mac);
IanBenzMaxim 0:f77ad7f72d04 275
IanBenzMaxim 7:471901a04573 276 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 0:f77ad7f72d04 277 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 0:f77ad7f72d04 278 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 6:a8c83a2e6fa4 279 MaximInterface_EXPORT error_code continueWriteAuthSegment(
IanBenzMaxim 6:a8c83a2e6fa4 280 Segment::const_span newData, Sha256::Hash::const_span mac);
IanBenzMaxim 0:f77ad7f72d04 281
IanBenzMaxim 7:471901a04573 282 /// @brief
IanBenzMaxim 0:f77ad7f72d04 283 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 0:f77ad7f72d04 284 /// @param[out] protection Receives protection statuses read from device.
IanBenzMaxim 0:f77ad7f72d04 285 MaximInterface_EXPORT error_code readAllBlockProtection(
IanBenzMaxim 6:a8c83a2e6fa4 286 span<BlockProtection, protectionBlocks> protection) const;
IanBenzMaxim 0:f77ad7f72d04 287 };
IanBenzMaxim 0:f77ad7f72d04 288
IanBenzMaxim 0:f77ad7f72d04 289 /// Interface to the DS28E15 authenticator.
IanBenzMaxim 0:f77ad7f72d04 290 class DS28E15 : public DS28EL15 {
IanBenzMaxim 0:f77ad7f72d04 291 public:
IanBenzMaxim 6:a8c83a2e6fa4 292 DS28E15(Sleep & sleep, OneWireMaster & master, const SelectRom & selectRom)
IanBenzMaxim 0:f77ad7f72d04 293 : DS28EL15(sleep, master, selectRom) {}
IanBenzMaxim 0:f77ad7f72d04 294
IanBenzMaxim 7:471901a04573 295 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 0:f77ad7f72d04 296 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:471901a04573 297 /// @param lock
IanBenzMaxim 7:471901a04573 298 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 0:f77ad7f72d04 299 MaximInterface_EXPORT error_code loadSecret(bool lock);
IanBenzMaxim 0:f77ad7f72d04 300
IanBenzMaxim 7:471901a04573 301 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 0:f77ad7f72d04 302 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:471901a04573 303 /// @param lock
IanBenzMaxim 7:471901a04573 304 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 0:f77ad7f72d04 305 MaximInterface_EXPORT error_code computeSecret(int pageNum, bool lock);
IanBenzMaxim 0:f77ad7f72d04 306 };
IanBenzMaxim 0:f77ad7f72d04 307
IanBenzMaxim 0:f77ad7f72d04 308 /// Interface to the DS28EL22 (low power) authenticator.
IanBenzMaxim 0:f77ad7f72d04 309 class DS28EL22 : public DS28E15_22_25 {
IanBenzMaxim 0:f77ad7f72d04 310 public:
IanBenzMaxim 0:f77ad7f72d04 311 // DS28E15_22_25 traits
IanBenzMaxim 0:f77ad7f72d04 312 static const int memoryPages = 8;
IanBenzMaxim 0:f77ad7f72d04 313 static const int protectionBlocks = 4;
IanBenzMaxim 0:f77ad7f72d04 314
IanBenzMaxim 6:a8c83a2e6fa4 315 DS28EL22(Sleep & sleep, OneWireMaster & master, const SelectRom & selectRom)
IanBenzMaxim 0:f77ad7f72d04 316 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 0:f77ad7f72d04 317
IanBenzMaxim 7:471901a04573 318 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 0:f77ad7f72d04 319 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 6:a8c83a2e6fa4 320 MaximInterface_EXPORT error_code writeScratchpad(Scratchpad::const_span data);
IanBenzMaxim 0:f77ad7f72d04 321
IanBenzMaxim 7:471901a04573 322 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 0:f77ad7f72d04 323 /// @param[out] data Buffer to read data from the scratchpad into.
IanBenzMaxim 6:a8c83a2e6fa4 324 MaximInterface_EXPORT error_code readScratchpad(Scratchpad::span data) const;
IanBenzMaxim 0:f77ad7f72d04 325
IanBenzMaxim 7:471901a04573 326 /// @brief
IanBenzMaxim 7:471901a04573 327 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 7:471901a04573 328 /// @param blockNum Block number to to read status of.
IanBenzMaxim 7:471901a04573 329 /// @param[out] protection Receives protection status read from device.
IanBenzMaxim 7:471901a04573 330 MaximInterface_EXPORT error_code
IanBenzMaxim 7:471901a04573 331 readBlockProtection(int blockNum, BlockProtection & protection) const;
IanBenzMaxim 7:471901a04573 332
IanBenzMaxim 7:471901a04573 333 /// @brief Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 7:471901a04573 334 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:471901a04573 335 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:471901a04573 336 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:471901a04573 337 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:471901a04573 338 MaximInterface_EXPORT error_code
IanBenzMaxim 7:471901a04573 339 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 7:471901a04573 340 Sha256::Hash::const_span mac);
IanBenzMaxim 7:471901a04573 341
IanBenzMaxim 7:471901a04573 342 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 7:471901a04573 343 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:471901a04573 344 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:471901a04573 345 MaximInterface_EXPORT error_code continueWriteAuthSegment(
IanBenzMaxim 7:471901a04573 346 Segment::const_span newData, Sha256::Hash::const_span mac);
IanBenzMaxim 7:471901a04573 347
IanBenzMaxim 7:471901a04573 348 /// @brief
IanBenzMaxim 7:471901a04573 349 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 7:471901a04573 350 /// @param[out] protection Receives protection statuses read from device.
IanBenzMaxim 7:471901a04573 351 MaximInterface_EXPORT error_code readAllBlockProtection(
IanBenzMaxim 7:471901a04573 352 span<BlockProtection, protectionBlocks> protection) const;
IanBenzMaxim 7:471901a04573 353 };
IanBenzMaxim 7:471901a04573 354
IanBenzMaxim 7:471901a04573 355 /// Interface to the DS28E22 authenticator.
IanBenzMaxim 7:471901a04573 356 class DS28E22 : public DS28EL22 {
IanBenzMaxim 7:471901a04573 357 public:
IanBenzMaxim 7:471901a04573 358 DS28E22(Sleep & sleep, OneWireMaster & master, const SelectRom & selectRom)
IanBenzMaxim 7:471901a04573 359 : DS28EL22(sleep, master, selectRom) {}
IanBenzMaxim 7:471901a04573 360
IanBenzMaxim 7:471901a04573 361 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:471901a04573 362 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:471901a04573 363 /// @param lock
IanBenzMaxim 7:471901a04573 364 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 7:471901a04573 365 MaximInterface_EXPORT error_code loadSecret(bool lock);
IanBenzMaxim 7:471901a04573 366
IanBenzMaxim 7:471901a04573 367 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:471901a04573 368 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:471901a04573 369 /// @param lock
IanBenzMaxim 7:471901a04573 370 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 7:471901a04573 371 MaximInterface_EXPORT error_code computeSecret(int pageNum, bool lock);
IanBenzMaxim 7:471901a04573 372 };
IanBenzMaxim 7:471901a04573 373
IanBenzMaxim 7:471901a04573 374 /// Interface to the DS28EL25 (low power) authenticator.
IanBenzMaxim 7:471901a04573 375 class DS28EL25 : public DS28E15_22_25 {
IanBenzMaxim 7:471901a04573 376 public:
IanBenzMaxim 7:471901a04573 377 // DS28E15_22_25 traits
IanBenzMaxim 7:471901a04573 378 static const int memoryPages = 16;
IanBenzMaxim 7:471901a04573 379 static const int protectionBlocks = 8;
IanBenzMaxim 7:471901a04573 380
IanBenzMaxim 7:471901a04573 381 DS28EL25(Sleep & sleep, OneWireMaster & master, const SelectRom & selectRom)
IanBenzMaxim 7:471901a04573 382 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 7:471901a04573 383
IanBenzMaxim 7:471901a04573 384 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 7:471901a04573 385 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 7:471901a04573 386 MaximInterface_EXPORT error_code writeScratchpad(Scratchpad::const_span data);
IanBenzMaxim 7:471901a04573 387
IanBenzMaxim 7:471901a04573 388 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 7:471901a04573 389 /// @param[out] data Buffer to read data from the scratchpad into.
IanBenzMaxim 7:471901a04573 390 MaximInterface_EXPORT error_code readScratchpad(Scratchpad::span data) const;
IanBenzMaxim 7:471901a04573 391
IanBenzMaxim 7:471901a04573 392 /// @brief
IanBenzMaxim 0:f77ad7f72d04 393 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 0:f77ad7f72d04 394 /// @param blockNum Block number to to read status of.
IanBenzMaxim 0:f77ad7f72d04 395 /// @param[out] protection Receives protection status read from device.
IanBenzMaxim 0:f77ad7f72d04 396 MaximInterface_EXPORT error_code
IanBenzMaxim 0:f77ad7f72d04 397 readBlockProtection(int blockNum, BlockProtection & protection) const;
IanBenzMaxim 0:f77ad7f72d04 398
IanBenzMaxim 0:f77ad7f72d04 399 /// Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 0:f77ad7f72d04 400 /// @param pageNum Page number for write operation.
IanBenzMaxim 0:f77ad7f72d04 401 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 0:f77ad7f72d04 402 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 0:f77ad7f72d04 403 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 6:a8c83a2e6fa4 404 MaximInterface_EXPORT error_code
IanBenzMaxim 6:a8c83a2e6fa4 405 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 6:a8c83a2e6fa4 406 Sha256::Hash::const_span mac);
IanBenzMaxim 0:f77ad7f72d04 407
IanBenzMaxim 7:471901a04573 408 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 0:f77ad7f72d04 409 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 0:f77ad7f72d04 410 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 6:a8c83a2e6fa4 411 MaximInterface_EXPORT error_code continueWriteAuthSegment(
IanBenzMaxim 6:a8c83a2e6fa4 412 Segment::const_span newData, Sha256::Hash::const_span mac);
IanBenzMaxim 0:f77ad7f72d04 413
IanBenzMaxim 7:471901a04573 414 /// @brief
IanBenzMaxim 0:f77ad7f72d04 415 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 0:f77ad7f72d04 416 /// @param[out] protection Receives protection statuses read from device.
IanBenzMaxim 0:f77ad7f72d04 417 MaximInterface_EXPORT error_code readAllBlockProtection(
IanBenzMaxim 6:a8c83a2e6fa4 418 span<BlockProtection, protectionBlocks> protection) const;
IanBenzMaxim 0:f77ad7f72d04 419 };
IanBenzMaxim 0:f77ad7f72d04 420
IanBenzMaxim 0:f77ad7f72d04 421 /// Interface to the DS28E25 authenticator.
IanBenzMaxim 0:f77ad7f72d04 422 class DS28E25 : public DS28EL25 {
IanBenzMaxim 0:f77ad7f72d04 423 public:
IanBenzMaxim 6:a8c83a2e6fa4 424 DS28E25(Sleep & sleep, OneWireMaster & master, const SelectRom & selectRom)
IanBenzMaxim 0:f77ad7f72d04 425 : DS28EL25(sleep, master, selectRom) {}
IanBenzMaxim 0:f77ad7f72d04 426
IanBenzMaxim 7:471901a04573 427 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 0:f77ad7f72d04 428 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 0:f77ad7f72d04 429 /// @param lock Prevent further changes to the secret on the device after loading.
IanBenzMaxim 0:f77ad7f72d04 430 MaximInterface_EXPORT error_code loadSecret(bool lock);
IanBenzMaxim 0:f77ad7f72d04 431
IanBenzMaxim 7:471901a04573 432 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 0:f77ad7f72d04 433 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:471901a04573 434 /// @param lock
IanBenzMaxim 7:471901a04573 435 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 0:f77ad7f72d04 436 MaximInterface_EXPORT error_code computeSecret(int pageNum, bool lock);
IanBenzMaxim 0:f77ad7f72d04 437 };
IanBenzMaxim 0:f77ad7f72d04 438
IanBenzMaxim 7:471901a04573 439 /// Represents the status of a memory protection block.
IanBenzMaxim 6:a8c83a2e6fa4 440 class DS28E15_22_25::BlockProtection {
IanBenzMaxim 6:a8c83a2e6fa4 441 public:
IanBenzMaxim 6:a8c83a2e6fa4 442 explicit BlockProtection(uint_least8_t status = 0x00) : status(status) {}
IanBenzMaxim 6:a8c83a2e6fa4 443
IanBenzMaxim 6:a8c83a2e6fa4 444 /// Get the byte representation used by the device.
IanBenzMaxim 6:a8c83a2e6fa4 445 uint_least8_t statusByte() const { return status; }
IanBenzMaxim 6:a8c83a2e6fa4 446
IanBenzMaxim 6:a8c83a2e6fa4 447 /// Set the byte representation used by the device.
IanBenzMaxim 6:a8c83a2e6fa4 448 BlockProtection & setStatusByte(uint_least8_t status) {
IanBenzMaxim 6:a8c83a2e6fa4 449 this->status = status;
IanBenzMaxim 6:a8c83a2e6fa4 450 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 451 }
IanBenzMaxim 6:a8c83a2e6fa4 452
IanBenzMaxim 6:a8c83a2e6fa4 453 /// Get the Block Number which is indexed from zero.
IanBenzMaxim 6:a8c83a2e6fa4 454 int blockNum() const { return (status & blockNumMask); }
IanBenzMaxim 6:a8c83a2e6fa4 455
IanBenzMaxim 6:a8c83a2e6fa4 456 /// Set the Block Number which is indexed from zero.
IanBenzMaxim 6:a8c83a2e6fa4 457 MaximInterface_EXPORT BlockProtection & setBlockNum(int blockNum);
IanBenzMaxim 6:a8c83a2e6fa4 458
IanBenzMaxim 7:471901a04573 459 /// @brief Get the Read Protection status.
IanBenzMaxim 6:a8c83a2e6fa4 460 /// @returns True if Read Protection is enabled.
IanBenzMaxim 6:a8c83a2e6fa4 461 bool readProtection() const {
IanBenzMaxim 6:a8c83a2e6fa4 462 return ((status & readProtectionMask) == readProtectionMask);
IanBenzMaxim 6:a8c83a2e6fa4 463 }
IanBenzMaxim 6:a8c83a2e6fa4 464
IanBenzMaxim 6:a8c83a2e6fa4 465 /// Set the Read Protection status.
IanBenzMaxim 6:a8c83a2e6fa4 466 MaximInterface_EXPORT BlockProtection &
IanBenzMaxim 6:a8c83a2e6fa4 467 setReadProtection(bool readProtection);
IanBenzMaxim 6:a8c83a2e6fa4 468
IanBenzMaxim 7:471901a04573 469 /// @brief Get the Write Protection status.
IanBenzMaxim 6:a8c83a2e6fa4 470 /// @returns True if Write Protection is enabled.
IanBenzMaxim 6:a8c83a2e6fa4 471 bool writeProtection() const {
IanBenzMaxim 6:a8c83a2e6fa4 472 return ((status & writeProtectionMask) == writeProtectionMask);
IanBenzMaxim 6:a8c83a2e6fa4 473 }
IanBenzMaxim 6:a8c83a2e6fa4 474
IanBenzMaxim 6:a8c83a2e6fa4 475 /// Set the Write Protection status.
IanBenzMaxim 6:a8c83a2e6fa4 476 MaximInterface_EXPORT BlockProtection &
IanBenzMaxim 6:a8c83a2e6fa4 477 setWriteProtection(bool writeProtection);
IanBenzMaxim 6:a8c83a2e6fa4 478
IanBenzMaxim 7:471901a04573 479 /// @brief Get the EEPROM Emulation Mode status.
IanBenzMaxim 6:a8c83a2e6fa4 480 /// @returns True if EEPROM Emulation Mode is enabled.
IanBenzMaxim 6:a8c83a2e6fa4 481 bool eepromEmulation() const {
IanBenzMaxim 6:a8c83a2e6fa4 482 return ((status & eepromEmulationMask) == eepromEmulationMask);
IanBenzMaxim 6:a8c83a2e6fa4 483 }
IanBenzMaxim 6:a8c83a2e6fa4 484
IanBenzMaxim 6:a8c83a2e6fa4 485 /// Set the EEPROM Emulation Mode status.
IanBenzMaxim 6:a8c83a2e6fa4 486 MaximInterface_EXPORT BlockProtection &
IanBenzMaxim 6:a8c83a2e6fa4 487 setEepromEmulation(bool eepromEmulation);
IanBenzMaxim 6:a8c83a2e6fa4 488
IanBenzMaxim 7:471901a04573 489 /// @brief Get the Authentication Protection status.
IanBenzMaxim 6:a8c83a2e6fa4 490 /// @returns True if Authentication Protection is enabled.
IanBenzMaxim 6:a8c83a2e6fa4 491 bool authProtection() const {
IanBenzMaxim 6:a8c83a2e6fa4 492 return ((status & authProtectionMask) == authProtectionMask);
IanBenzMaxim 6:a8c83a2e6fa4 493 }
IanBenzMaxim 6:a8c83a2e6fa4 494
IanBenzMaxim 6:a8c83a2e6fa4 495 /// Set the Authentication Protection status.
IanBenzMaxim 6:a8c83a2e6fa4 496 MaximInterface_EXPORT BlockProtection &
IanBenzMaxim 6:a8c83a2e6fa4 497 setAuthProtection(bool authProtection);
IanBenzMaxim 6:a8c83a2e6fa4 498
IanBenzMaxim 7:471901a04573 499 /// @brief Check if no protection options are enabled.
IanBenzMaxim 6:a8c83a2e6fa4 500 /// @returns True if no protection options are enabled.
IanBenzMaxim 6:a8c83a2e6fa4 501 MaximInterface_EXPORT bool noProtection() const;
IanBenzMaxim 6:a8c83a2e6fa4 502
IanBenzMaxim 6:a8c83a2e6fa4 503 private:
IanBenzMaxim 6:a8c83a2e6fa4 504 static const unsigned int readProtectionMask = 0x80,
IanBenzMaxim 6:a8c83a2e6fa4 505 writeProtectionMask = 0x40,
IanBenzMaxim 6:a8c83a2e6fa4 506 eepromEmulationMask = 0x20,
IanBenzMaxim 6:a8c83a2e6fa4 507 authProtectionMask = 0x10,
IanBenzMaxim 6:a8c83a2e6fa4 508 blockNumMask = 0x0F;
IanBenzMaxim 6:a8c83a2e6fa4 509 uint_least8_t status;
IanBenzMaxim 6:a8c83a2e6fa4 510 };
IanBenzMaxim 6:a8c83a2e6fa4 511
IanBenzMaxim 6:a8c83a2e6fa4 512 inline bool operator==(DS28E15_22_25::BlockProtection lhs,
IanBenzMaxim 6:a8c83a2e6fa4 513 DS28E15_22_25::BlockProtection rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 514 return lhs.statusByte() == rhs.statusByte();
IanBenzMaxim 6:a8c83a2e6fa4 515 }
IanBenzMaxim 6:a8c83a2e6fa4 516
IanBenzMaxim 6:a8c83a2e6fa4 517 inline bool operator!=(DS28E15_22_25::BlockProtection lhs,
IanBenzMaxim 6:a8c83a2e6fa4 518 DS28E15_22_25::BlockProtection rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 519 return !operator==(lhs, rhs);
IanBenzMaxim 6:a8c83a2e6fa4 520 }
IanBenzMaxim 6:a8c83a2e6fa4 521
IanBenzMaxim 7:471901a04573 522 /// Format data to hash for an Authenticated Write to a memory segment.
IanBenzMaxim 6:a8c83a2e6fa4 523 class DS28E15_22_25::SegmentWriteMacData {
IanBenzMaxim 6:a8c83a2e6fa4 524 public:
IanBenzMaxim 6:a8c83a2e6fa4 525 SegmentWriteMacData() : result_() {}
IanBenzMaxim 6:a8c83a2e6fa4 526
IanBenzMaxim 6:a8c83a2e6fa4 527 /// Formatted data result.
IanBenzMaxim 6:a8c83a2e6fa4 528 Sha256::WriteMacData::const_span result() const { return result_; }
IanBenzMaxim 6:a8c83a2e6fa4 529
IanBenzMaxim 7:471901a04573 530 /// @name ROM ID
IanBenzMaxim 7:471901a04573 531 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 532 /// @{
IanBenzMaxim 7:471901a04573 533
IanBenzMaxim 7:471901a04573 534 /// Get mutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 535 RomId::span romId() {
IanBenzMaxim 6:a8c83a2e6fa4 536 return make_span(result_).subspan<romIdIdx, RomId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 537 }
IanBenzMaxim 6:a8c83a2e6fa4 538
IanBenzMaxim 7:471901a04573 539 /// Get immutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 540 RomId::const_span romId() const {
IanBenzMaxim 6:a8c83a2e6fa4 541 return const_cast<SegmentWriteMacData &>(*this).romId();
IanBenzMaxim 6:a8c83a2e6fa4 542 }
IanBenzMaxim 6:a8c83a2e6fa4 543
IanBenzMaxim 7:471901a04573 544 /// Set ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 545 SegmentWriteMacData & setRomId(RomId::const_span romId) {
IanBenzMaxim 6:a8c83a2e6fa4 546 copy(romId, this->romId());
IanBenzMaxim 6:a8c83a2e6fa4 547 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 548 }
IanBenzMaxim 7:471901a04573 549
IanBenzMaxim 6:a8c83a2e6fa4 550 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 551
IanBenzMaxim 7:471901a04573 552 /// @name MAN ID
IanBenzMaxim 7:471901a04573 553 /// @brief Manufacturer ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 554 /// @{
IanBenzMaxim 7:471901a04573 555
IanBenzMaxim 7:471901a04573 556 /// Get mutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 557 ManId::span manId() {
IanBenzMaxim 6:a8c83a2e6fa4 558 return make_span(result_).subspan<manIdIdx, ManId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 559 }
IanBenzMaxim 6:a8c83a2e6fa4 560
IanBenzMaxim 7:471901a04573 561 /// Get immutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 562 ManId::const_span manId() const {
IanBenzMaxim 6:a8c83a2e6fa4 563 return const_cast<SegmentWriteMacData &>(*this).manId();
IanBenzMaxim 6:a8c83a2e6fa4 564 }
IanBenzMaxim 6:a8c83a2e6fa4 565
IanBenzMaxim 7:471901a04573 566 /// Set MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 567 SegmentWriteMacData & setManId(ManId::const_span manId) {
IanBenzMaxim 6:a8c83a2e6fa4 568 copy(manId, this->manId());
IanBenzMaxim 6:a8c83a2e6fa4 569 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 570 }
IanBenzMaxim 7:471901a04573 571
IanBenzMaxim 6:a8c83a2e6fa4 572 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 573
IanBenzMaxim 7:471901a04573 574 /// @name Page number
IanBenzMaxim 7:471901a04573 575 /// @brief Page number for write operation.
IanBenzMaxim 6:a8c83a2e6fa4 576 /// @{
IanBenzMaxim 7:471901a04573 577
IanBenzMaxim 7:471901a04573 578 /// Get page number.
IanBenzMaxim 6:a8c83a2e6fa4 579 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 6:a8c83a2e6fa4 580
IanBenzMaxim 7:471901a04573 581 /// Set page number.
IanBenzMaxim 6:a8c83a2e6fa4 582 SegmentWriteMacData & setPageNum(int pageNum) {
IanBenzMaxim 6:a8c83a2e6fa4 583 result_[pageNumIdx] = pageNum;
IanBenzMaxim 6:a8c83a2e6fa4 584 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 585 }
IanBenzMaxim 7:471901a04573 586
IanBenzMaxim 6:a8c83a2e6fa4 587 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 588
IanBenzMaxim 7:471901a04573 589 /// @name Segment number
IanBenzMaxim 7:471901a04573 590 /// @brief Segment number within page for write operation.
IanBenzMaxim 6:a8c83a2e6fa4 591 /// @{
IanBenzMaxim 7:471901a04573 592
IanBenzMaxim 7:471901a04573 593 /// Get segment number.
IanBenzMaxim 6:a8c83a2e6fa4 594 int segmentNum() const { return result_[segmentNumIdx]; }
IanBenzMaxim 6:a8c83a2e6fa4 595
IanBenzMaxim 7:471901a04573 596 /// Set segment number.
IanBenzMaxim 6:a8c83a2e6fa4 597 SegmentWriteMacData & setSegmentNum(int segmentNum) {
IanBenzMaxim 6:a8c83a2e6fa4 598 result_[segmentNumIdx] = segmentNum;
IanBenzMaxim 6:a8c83a2e6fa4 599 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 600 }
IanBenzMaxim 7:471901a04573 601
IanBenzMaxim 6:a8c83a2e6fa4 602 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 603
IanBenzMaxim 7:471901a04573 604 /// @name Old data
IanBenzMaxim 7:471901a04573 605 /// @brief Existing data contained in the segment.
IanBenzMaxim 6:a8c83a2e6fa4 606 /// @{
IanBenzMaxim 7:471901a04573 607
IanBenzMaxim 7:471901a04573 608 /// Get mutable old data.
IanBenzMaxim 6:a8c83a2e6fa4 609 Segment::span oldData() {
IanBenzMaxim 6:a8c83a2e6fa4 610 return make_span(result_).subspan<oldDataIdx, Segment::size>();
IanBenzMaxim 6:a8c83a2e6fa4 611 }
IanBenzMaxim 6:a8c83a2e6fa4 612
IanBenzMaxim 7:471901a04573 613 /// Get immutable old data.
IanBenzMaxim 6:a8c83a2e6fa4 614 Segment::const_span oldData() const {
IanBenzMaxim 6:a8c83a2e6fa4 615 return const_cast<SegmentWriteMacData &>(*this).oldData();
IanBenzMaxim 6:a8c83a2e6fa4 616 }
IanBenzMaxim 6:a8c83a2e6fa4 617
IanBenzMaxim 7:471901a04573 618 /// Set old data.
IanBenzMaxim 6:a8c83a2e6fa4 619 SegmentWriteMacData & setOldData(Segment::const_span oldData) {
IanBenzMaxim 6:a8c83a2e6fa4 620 copy(oldData, this->oldData());
IanBenzMaxim 6:a8c83a2e6fa4 621 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 622 }
IanBenzMaxim 7:471901a04573 623
IanBenzMaxim 6:a8c83a2e6fa4 624 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 625
IanBenzMaxim 7:471901a04573 626 /// @name New data
IanBenzMaxim 7:471901a04573 627 /// @brief New data to write to the segment.
IanBenzMaxim 6:a8c83a2e6fa4 628 /// @{
IanBenzMaxim 7:471901a04573 629
IanBenzMaxim 7:471901a04573 630 /// Get mutable new data.
IanBenzMaxim 6:a8c83a2e6fa4 631 Segment::span newData() {
IanBenzMaxim 6:a8c83a2e6fa4 632 return make_span(result_).subspan<newDataIdx, Segment::size>();
IanBenzMaxim 6:a8c83a2e6fa4 633 }
IanBenzMaxim 6:a8c83a2e6fa4 634
IanBenzMaxim 7:471901a04573 635 /// Get immutable new data.
IanBenzMaxim 6:a8c83a2e6fa4 636 Segment::const_span newData() const {
IanBenzMaxim 6:a8c83a2e6fa4 637 return const_cast<SegmentWriteMacData &>(*this).newData();
IanBenzMaxim 6:a8c83a2e6fa4 638 }
IanBenzMaxim 6:a8c83a2e6fa4 639
IanBenzMaxim 7:471901a04573 640 /// Set new data.
IanBenzMaxim 6:a8c83a2e6fa4 641 SegmentWriteMacData & setNewData(Segment::const_span newData) {
IanBenzMaxim 6:a8c83a2e6fa4 642 copy(newData, this->newData());
IanBenzMaxim 6:a8c83a2e6fa4 643 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 644 }
IanBenzMaxim 7:471901a04573 645
IanBenzMaxim 6:a8c83a2e6fa4 646 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 647
IanBenzMaxim 6:a8c83a2e6fa4 648 private:
IanBenzMaxim 6:a8c83a2e6fa4 649 typedef Sha256::WriteMacData::span::index_type index;
IanBenzMaxim 6:a8c83a2e6fa4 650
IanBenzMaxim 6:a8c83a2e6fa4 651 static const index romIdIdx = 0;
IanBenzMaxim 6:a8c83a2e6fa4 652 static const index manIdIdx = romIdIdx + RomId::size;
IanBenzMaxim 6:a8c83a2e6fa4 653 static const index pageNumIdx = manIdIdx + ManId::size;
IanBenzMaxim 6:a8c83a2e6fa4 654 static const index segmentNumIdx = pageNumIdx + 1;
IanBenzMaxim 6:a8c83a2e6fa4 655 static const index oldDataIdx = segmentNumIdx + 1;
IanBenzMaxim 6:a8c83a2e6fa4 656 static const index newDataIdx = oldDataIdx + Segment::size;
IanBenzMaxim 6:a8c83a2e6fa4 657
IanBenzMaxim 6:a8c83a2e6fa4 658 Sha256::WriteMacData::array result_;
IanBenzMaxim 6:a8c83a2e6fa4 659 };
IanBenzMaxim 6:a8c83a2e6fa4 660
IanBenzMaxim 7:471901a04573 661 /// Format data to hash for an Authenticated Write to a memory protection block.
IanBenzMaxim 6:a8c83a2e6fa4 662 class DS28E15_22_25::ProtectionWriteMacData {
IanBenzMaxim 6:a8c83a2e6fa4 663 public:
IanBenzMaxim 6:a8c83a2e6fa4 664 MaximInterface_EXPORT ProtectionWriteMacData();
IanBenzMaxim 6:a8c83a2e6fa4 665
IanBenzMaxim 6:a8c83a2e6fa4 666 /// Formatted data result.
IanBenzMaxim 6:a8c83a2e6fa4 667 Sha256::WriteMacData::const_span result() const { return result_; }
IanBenzMaxim 6:a8c83a2e6fa4 668
IanBenzMaxim 7:471901a04573 669 /// @name ROM ID
IanBenzMaxim 7:471901a04573 670 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 671 /// @{
IanBenzMaxim 7:471901a04573 672
IanBenzMaxim 7:471901a04573 673 /// Get mutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 674 RomId::span romId() {
IanBenzMaxim 6:a8c83a2e6fa4 675 return make_span(result_).subspan<romIdIdx, RomId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 676 }
IanBenzMaxim 6:a8c83a2e6fa4 677
IanBenzMaxim 7:471901a04573 678 /// Get immutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 679 RomId::const_span romId() const {
IanBenzMaxim 6:a8c83a2e6fa4 680 return const_cast<ProtectionWriteMacData &>(*this).romId();
IanBenzMaxim 6:a8c83a2e6fa4 681 }
IanBenzMaxim 6:a8c83a2e6fa4 682
IanBenzMaxim 7:471901a04573 683 /// Set ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 684 ProtectionWriteMacData & setRomId(RomId::const_span romId) {
IanBenzMaxim 6:a8c83a2e6fa4 685 copy(romId, this->romId());
IanBenzMaxim 6:a8c83a2e6fa4 686 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 687 }
IanBenzMaxim 7:471901a04573 688
IanBenzMaxim 6:a8c83a2e6fa4 689 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 690
IanBenzMaxim 7:471901a04573 691 /// @name MAN ID
IanBenzMaxim 7:471901a04573 692 /// @brief Manufacturer ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 693 /// @{
IanBenzMaxim 7:471901a04573 694
IanBenzMaxim 7:471901a04573 695 /// Get mutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 696 ManId::span manId() {
IanBenzMaxim 6:a8c83a2e6fa4 697 return make_span(result_).subspan<manIdIdx, ManId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 698 }
IanBenzMaxim 6:a8c83a2e6fa4 699
IanBenzMaxim 7:471901a04573 700 /// Get immutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 701 ManId::const_span manId() const {
IanBenzMaxim 6:a8c83a2e6fa4 702 return const_cast<ProtectionWriteMacData &>(*this).manId();
IanBenzMaxim 6:a8c83a2e6fa4 703 }
IanBenzMaxim 6:a8c83a2e6fa4 704
IanBenzMaxim 7:471901a04573 705 /// Set MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 706 ProtectionWriteMacData & setManId(ManId::const_span manId) {
IanBenzMaxim 6:a8c83a2e6fa4 707 copy(manId, this->manId());
IanBenzMaxim 6:a8c83a2e6fa4 708 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 709 }
IanBenzMaxim 7:471901a04573 710
IanBenzMaxim 6:a8c83a2e6fa4 711 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 712
IanBenzMaxim 7:471901a04573 713 /// @name Old protection
IanBenzMaxim 7:471901a04573 714 /// @brief Existing protection status in device.
IanBenzMaxim 6:a8c83a2e6fa4 715 /// @{
IanBenzMaxim 7:471901a04573 716
IanBenzMaxim 7:471901a04573 717 /// Get old protection.
IanBenzMaxim 6:a8c83a2e6fa4 718 BlockProtection oldProtection() const { return oldProtection_; }
IanBenzMaxim 6:a8c83a2e6fa4 719
IanBenzMaxim 7:471901a04573 720 /// Set old protection.
IanBenzMaxim 6:a8c83a2e6fa4 721 MaximInterface_EXPORT ProtectionWriteMacData &
IanBenzMaxim 6:a8c83a2e6fa4 722 setOldProtection(BlockProtection oldProtection);
IanBenzMaxim 7:471901a04573 723
IanBenzMaxim 6:a8c83a2e6fa4 724 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 725
IanBenzMaxim 7:471901a04573 726 /// @name New protection
IanBenzMaxim 7:471901a04573 727 /// @brief New protection status to write.
IanBenzMaxim 6:a8c83a2e6fa4 728 /// @{
IanBenzMaxim 7:471901a04573 729
IanBenzMaxim 7:471901a04573 730 /// Get new protection.
IanBenzMaxim 6:a8c83a2e6fa4 731 BlockProtection newProtection() const { return newProtection_; }
IanBenzMaxim 6:a8c83a2e6fa4 732
IanBenzMaxim 7:471901a04573 733 /// Set new protection.
IanBenzMaxim 6:a8c83a2e6fa4 734 MaximInterface_EXPORT ProtectionWriteMacData &
IanBenzMaxim 6:a8c83a2e6fa4 735 setNewProtection(BlockProtection newProtection);
IanBenzMaxim 7:471901a04573 736
IanBenzMaxim 6:a8c83a2e6fa4 737 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 738
IanBenzMaxim 6:a8c83a2e6fa4 739 private:
IanBenzMaxim 6:a8c83a2e6fa4 740 typedef Sha256::WriteMacData::span::index_type index;
IanBenzMaxim 6:a8c83a2e6fa4 741
IanBenzMaxim 6:a8c83a2e6fa4 742 static const index romIdIdx = 0;
IanBenzMaxim 6:a8c83a2e6fa4 743 static const index manIdIdx = romIdIdx + RomId::size;
IanBenzMaxim 6:a8c83a2e6fa4 744 static const index blockNumIdx = manIdIdx + ManId::size;
IanBenzMaxim 6:a8c83a2e6fa4 745 static const index oldProtectionIdx = blockNumIdx + 2;
IanBenzMaxim 6:a8c83a2e6fa4 746 static const index newProtectionIdx = oldProtectionIdx + 4;
IanBenzMaxim 6:a8c83a2e6fa4 747
IanBenzMaxim 6:a8c83a2e6fa4 748 Sha256::WriteMacData::array result_;
IanBenzMaxim 6:a8c83a2e6fa4 749 BlockProtection oldProtection_;
IanBenzMaxim 6:a8c83a2e6fa4 750 BlockProtection newProtection_;
IanBenzMaxim 6:a8c83a2e6fa4 751 };
IanBenzMaxim 6:a8c83a2e6fa4 752
IanBenzMaxim 7:471901a04573 753 /// @brief
IanBenzMaxim 7:471901a04573 754 /// Format data to hash for device authentication or computing the next secret
IanBenzMaxim 7:471901a04573 755 /// from the existing secret.
IanBenzMaxim 6:a8c83a2e6fa4 756 class DS28E15_22_25::AuthenticationData {
IanBenzMaxim 6:a8c83a2e6fa4 757 public:
IanBenzMaxim 6:a8c83a2e6fa4 758 AuthenticationData() : result_() {}
IanBenzMaxim 6:a8c83a2e6fa4 759
IanBenzMaxim 6:a8c83a2e6fa4 760 /// Formatted data result.
IanBenzMaxim 6:a8c83a2e6fa4 761 Sha256::AuthenticationData::const_span result() const { return result_; }
IanBenzMaxim 6:a8c83a2e6fa4 762
IanBenzMaxim 7:471901a04573 763 /// @name Page
IanBenzMaxim 7:471901a04573 764 /// @brief Data from a device memory page.
IanBenzMaxim 6:a8c83a2e6fa4 765 /// @{
IanBenzMaxim 7:471901a04573 766
IanBenzMaxim 7:471901a04573 767 /// Get mutable page.
IanBenzMaxim 6:a8c83a2e6fa4 768 Page::span page() {
IanBenzMaxim 6:a8c83a2e6fa4 769 return make_span(result_).subspan<pageIdx, Page::size>();
IanBenzMaxim 6:a8c83a2e6fa4 770 }
IanBenzMaxim 6:a8c83a2e6fa4 771
IanBenzMaxim 7:471901a04573 772 /// Get immutable page.
IanBenzMaxim 6:a8c83a2e6fa4 773 Page::const_span page() const {
IanBenzMaxim 6:a8c83a2e6fa4 774 return const_cast<AuthenticationData &>(*this).page();
IanBenzMaxim 6:a8c83a2e6fa4 775 }
IanBenzMaxim 6:a8c83a2e6fa4 776
IanBenzMaxim 7:471901a04573 777 /// Set page.
IanBenzMaxim 6:a8c83a2e6fa4 778 AuthenticationData & setPage(Page::const_span page) {
IanBenzMaxim 6:a8c83a2e6fa4 779 copy(page, this->page());
IanBenzMaxim 6:a8c83a2e6fa4 780 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 781 }
IanBenzMaxim 7:471901a04573 782
IanBenzMaxim 6:a8c83a2e6fa4 783 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 784
IanBenzMaxim 7:471901a04573 785 /// @name Scratchpad
IanBenzMaxim 7:471901a04573 786 /// @brief
IanBenzMaxim 6:a8c83a2e6fa4 787 /// Data from device scratchpad used as a random challenge in device
IanBenzMaxim 6:a8c83a2e6fa4 788 /// authentication and a partial secret in secret computation.
IanBenzMaxim 7:471901a04573 789 /// @{
IanBenzMaxim 7:471901a04573 790
IanBenzMaxim 7:471901a04573 791 /// Get mutable scratchpad.
IanBenzMaxim 6:a8c83a2e6fa4 792 Scratchpad::span scratchpad() {
IanBenzMaxim 6:a8c83a2e6fa4 793 return make_span(result_).subspan<scratchpadIdx, Scratchpad::size>();
IanBenzMaxim 6:a8c83a2e6fa4 794 }
IanBenzMaxim 6:a8c83a2e6fa4 795
IanBenzMaxim 7:471901a04573 796 /// Get immutable scratchpad.
IanBenzMaxim 6:a8c83a2e6fa4 797 Scratchpad::const_span scratchpad() const {
IanBenzMaxim 6:a8c83a2e6fa4 798 return const_cast<AuthenticationData &>(*this).scratchpad();
IanBenzMaxim 6:a8c83a2e6fa4 799 }
IanBenzMaxim 6:a8c83a2e6fa4 800
IanBenzMaxim 7:471901a04573 801 /// Set scratchpad.
IanBenzMaxim 6:a8c83a2e6fa4 802 AuthenticationData & setScratchpad(Scratchpad::const_span scratchpad) {
IanBenzMaxim 6:a8c83a2e6fa4 803 copy(scratchpad, this->scratchpad());
IanBenzMaxim 6:a8c83a2e6fa4 804 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 805 }
IanBenzMaxim 7:471901a04573 806
IanBenzMaxim 6:a8c83a2e6fa4 807 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 808
IanBenzMaxim 7:471901a04573 809 /// @name ROM ID
IanBenzMaxim 7:471901a04573 810 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 811 /// @{
IanBenzMaxim 7:471901a04573 812
IanBenzMaxim 7:471901a04573 813 /// Get mutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 814 RomId::span romId() {
IanBenzMaxim 6:a8c83a2e6fa4 815 return make_span(result_).subspan<romIdIdx, RomId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 816 }
IanBenzMaxim 6:a8c83a2e6fa4 817
IanBenzMaxim 7:471901a04573 818 /// Get immutable ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 819 RomId::const_span romId() const {
IanBenzMaxim 6:a8c83a2e6fa4 820 return const_cast<AuthenticationData &>(*this).romId();
IanBenzMaxim 6:a8c83a2e6fa4 821 }
IanBenzMaxim 6:a8c83a2e6fa4 822
IanBenzMaxim 7:471901a04573 823 /// Set ROM ID.
IanBenzMaxim 6:a8c83a2e6fa4 824 AuthenticationData & setRomId(RomId::const_span romId) {
IanBenzMaxim 6:a8c83a2e6fa4 825 copy(romId, this->romId());
IanBenzMaxim 6:a8c83a2e6fa4 826 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 827 }
IanBenzMaxim 6:a8c83a2e6fa4 828
IanBenzMaxim 7:471901a04573 829 /// Set ROM ID for use in anonymous mode.
IanBenzMaxim 6:a8c83a2e6fa4 830 MaximInterface_EXPORT AuthenticationData & setAnonymousRomId();
IanBenzMaxim 7:471901a04573 831
IanBenzMaxim 6:a8c83a2e6fa4 832 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 833
IanBenzMaxim 7:471901a04573 834 /// @name MAN ID
IanBenzMaxim 7:471901a04573 835 /// @brief Manufacturer ID of the device.
IanBenzMaxim 6:a8c83a2e6fa4 836 /// @{
IanBenzMaxim 7:471901a04573 837
IanBenzMaxim 7:471901a04573 838 /// Get mutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 839 ManId::span manId() {
IanBenzMaxim 6:a8c83a2e6fa4 840 return make_span(result_).subspan<manIdIdx, ManId::size>();
IanBenzMaxim 6:a8c83a2e6fa4 841 }
IanBenzMaxim 6:a8c83a2e6fa4 842
IanBenzMaxim 7:471901a04573 843 /// Get immutable MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 844 ManId::const_span manId() const {
IanBenzMaxim 6:a8c83a2e6fa4 845 return const_cast<AuthenticationData &>(*this).manId();
IanBenzMaxim 6:a8c83a2e6fa4 846 }
IanBenzMaxim 6:a8c83a2e6fa4 847
IanBenzMaxim 7:471901a04573 848 /// Set MAN ID.
IanBenzMaxim 6:a8c83a2e6fa4 849 AuthenticationData & setManId(ManId::const_span manId) {
IanBenzMaxim 6:a8c83a2e6fa4 850 copy(manId, this->manId());
IanBenzMaxim 6:a8c83a2e6fa4 851 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 852 }
IanBenzMaxim 7:471901a04573 853
IanBenzMaxim 6:a8c83a2e6fa4 854 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 855
IanBenzMaxim 7:471901a04573 856 /// @name Page number
IanBenzMaxim 7:471901a04573 857 /// @brief Number of the page to use data from.
IanBenzMaxim 6:a8c83a2e6fa4 858 /// @{
IanBenzMaxim 7:471901a04573 859
IanBenzMaxim 7:471901a04573 860 /// Get page number.
IanBenzMaxim 6:a8c83a2e6fa4 861 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 6:a8c83a2e6fa4 862
IanBenzMaxim 7:471901a04573 863 /// Set page number.
IanBenzMaxim 6:a8c83a2e6fa4 864 AuthenticationData & setPageNum(int pageNum) {
IanBenzMaxim 6:a8c83a2e6fa4 865 result_[pageNumIdx] = pageNum;
IanBenzMaxim 6:a8c83a2e6fa4 866 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 867 }
IanBenzMaxim 7:471901a04573 868
IanBenzMaxim 6:a8c83a2e6fa4 869 /// @}
IanBenzMaxim 6:a8c83a2e6fa4 870
IanBenzMaxim 6:a8c83a2e6fa4 871 private:
IanBenzMaxim 6:a8c83a2e6fa4 872 typedef Sha256::AuthenticationData::span::index_type index;
IanBenzMaxim 6:a8c83a2e6fa4 873
IanBenzMaxim 6:a8c83a2e6fa4 874 static const index pageIdx = 0;
IanBenzMaxim 6:a8c83a2e6fa4 875 static const index scratchpadIdx = pageIdx + Page::size;
IanBenzMaxim 6:a8c83a2e6fa4 876 static const index romIdIdx = scratchpadIdx + Scratchpad::size;
IanBenzMaxim 6:a8c83a2e6fa4 877 static const index manIdIdx = romIdIdx + RomId::size;
IanBenzMaxim 6:a8c83a2e6fa4 878 static const index pageNumIdx = manIdIdx + ManId::size;
IanBenzMaxim 6:a8c83a2e6fa4 879
IanBenzMaxim 6:a8c83a2e6fa4 880 Sha256::AuthenticationData::array result_;
IanBenzMaxim 6:a8c83a2e6fa4 881 };
IanBenzMaxim 6:a8c83a2e6fa4 882
IanBenzMaxim 0:f77ad7f72d04 883 } // namespace MaximInterface
IanBenzMaxim 0:f77ad7f72d04 884
IanBenzMaxim 0:f77ad7f72d04 885 #endif