Device interface library for multiple platforms including Mbed.

Dependents:   DeepCover Embedded Security in IoT MaximInterface MAXREFDES155#

Maxim Interface is a library framework focused on providing flexible and expressive hardware interfaces. Both communication interfaces such as I2C and 1-Wire and device interfaces such as DS18B20 are supported. Modern C++ concepts are used extensively while keeping compatibility with C++98/C++03 and requiring no external dependencies. The embedded-friendly design does not depend on exceptions or RTTI.

The full version of the project is hosted on GitLab: https://gitlab.com/iabenz/MaximInterface

Committer:
IanBenzMaxim
Date:
Fri May 29 16:19:22 2020 -0500
Revision:
12:7eb41621ba22
Updated to version 2.2.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 12:7eb41621ba22 1 /*******************************************************************************
IanBenzMaxim 12:7eb41621ba22 2 * Copyright (C) Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 12:7eb41621ba22 3 *
IanBenzMaxim 12:7eb41621ba22 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 12:7eb41621ba22 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 12:7eb41621ba22 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 12:7eb41621ba22 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 12:7eb41621ba22 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 12:7eb41621ba22 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 12:7eb41621ba22 10 *
IanBenzMaxim 12:7eb41621ba22 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 12:7eb41621ba22 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 12:7eb41621ba22 13 *
IanBenzMaxim 12:7eb41621ba22 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 12:7eb41621ba22 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 12:7eb41621ba22 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 12:7eb41621ba22 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 12:7eb41621ba22 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 12:7eb41621ba22 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 12:7eb41621ba22 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 12:7eb41621ba22 21 *
IanBenzMaxim 12:7eb41621ba22 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 12:7eb41621ba22 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 12:7eb41621ba22 24 * Products, Inc. Branding Policy.
IanBenzMaxim 12:7eb41621ba22 25 *
IanBenzMaxim 12:7eb41621ba22 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 12:7eb41621ba22 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 12:7eb41621ba22 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 12:7eb41621ba22 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 12:7eb41621ba22 30 * ownership rights.
IanBenzMaxim 12:7eb41621ba22 31 *******************************************************************************/
IanBenzMaxim 12:7eb41621ba22 32
IanBenzMaxim 12:7eb41621ba22 33 #ifndef MaximInterfaceDevices_DS28C16_hpp
IanBenzMaxim 12:7eb41621ba22 34 #define MaximInterfaceDevices_DS28C16_hpp
IanBenzMaxim 12:7eb41621ba22 35
IanBenzMaxim 12:7eb41621ba22 36 #include <stdint.h>
IanBenzMaxim 12:7eb41621ba22 37 #include <MaximInterfaceCore/Algorithm.hpp>
IanBenzMaxim 12:7eb41621ba22 38 #include <MaximInterfaceCore/array_span.hpp>
IanBenzMaxim 12:7eb41621ba22 39 #include <MaximInterfaceCore/FlagSet.hpp>
IanBenzMaxim 12:7eb41621ba22 40 #include <MaximInterfaceCore/RomId.hpp>
IanBenzMaxim 12:7eb41621ba22 41 #include <MaximInterfaceCore/RunCommand.hpp>
IanBenzMaxim 12:7eb41621ba22 42 #include <MaximInterfaceCore/system_error.hpp>
IanBenzMaxim 12:7eb41621ba22 43 #include "Config.hpp"
IanBenzMaxim 12:7eb41621ba22 44
IanBenzMaxim 12:7eb41621ba22 45 namespace MaximInterfaceDevices {
IanBenzMaxim 12:7eb41621ba22 46
IanBenzMaxim 12:7eb41621ba22 47 class DS28C16 {
IanBenzMaxim 12:7eb41621ba22 48 public:
IanBenzMaxim 12:7eb41621ba22 49 /// Device command results.
IanBenzMaxim 12:7eb41621ba22 50 enum ErrorValue {
IanBenzMaxim 12:7eb41621ba22 51 InvalidOperationError = 0x55,
IanBenzMaxim 12:7eb41621ba22 52 InvalidParameterError = 0x77,
IanBenzMaxim 12:7eb41621ba22 53 InvalidSequenceError = 0x33,
IanBenzMaxim 12:7eb41621ba22 54 InternalError = 0x22,
IanBenzMaxim 12:7eb41621ba22 55 DeviceDisabledError = 0x88,
IanBenzMaxim 12:7eb41621ba22 56 AuthenticationError = 0x100,
IanBenzMaxim 12:7eb41621ba22 57 InvalidResponseError ///< Command response does not match expected format.
IanBenzMaxim 12:7eb41621ba22 58 };
IanBenzMaxim 12:7eb41621ba22 59
IanBenzMaxim 12:7eb41621ba22 60 /// @name Device memory pages
IanBenzMaxim 12:7eb41621ba22 61 /// @{
IanBenzMaxim 12:7eb41621ba22 62
IanBenzMaxim 12:7eb41621ba22 63 static const int decrementCounterPage = 2;
IanBenzMaxim 12:7eb41621ba22 64 static const int masterSecretPage = 3;
IanBenzMaxim 12:7eb41621ba22 65
IanBenzMaxim 12:7eb41621ba22 66 /// @}
IanBenzMaxim 12:7eb41621ba22 67
IanBenzMaxim 12:7eb41621ba22 68 static const int memoryPages = 4;
IanBenzMaxim 12:7eb41621ba22 69
IanBenzMaxim 12:7eb41621ba22 70 /// Holds a device memory page.
IanBenzMaxim 12:7eb41621ba22 71 typedef Core::array_span<uint_least8_t, 16> Page;
IanBenzMaxim 12:7eb41621ba22 72
IanBenzMaxim 12:7eb41621ba22 73 /// Holds a Challenge, Partial Secret, or HMAC.
IanBenzMaxim 12:7eb41621ba22 74 typedef Core::array_span<uint_least8_t, 32> DoublePage;
IanBenzMaxim 12:7eb41621ba22 75
IanBenzMaxim 12:7eb41621ba22 76 /// Holds a password used to disable the device.
IanBenzMaxim 12:7eb41621ba22 77 typedef Core::array_span<uint_least8_t, 2> DisableDevicePassword;
IanBenzMaxim 12:7eb41621ba22 78
IanBenzMaxim 12:7eb41621ba22 79 // Format page authentication input data.
IanBenzMaxim 12:7eb41621ba22 80 class PageAuthenticationData;
IanBenzMaxim 12:7eb41621ba22 81
IanBenzMaxim 12:7eb41621ba22 82 // Format compute secret input data.
IanBenzMaxim 12:7eb41621ba22 83 class ComputeSecretData;
IanBenzMaxim 12:7eb41621ba22 84
IanBenzMaxim 12:7eb41621ba22 85 /// Page protection types.
IanBenzMaxim 12:7eb41621ba22 86 enum PageProtectionType {
IanBenzMaxim 12:7eb41621ba22 87 RP = 0x01, ///< Read protection.
IanBenzMaxim 12:7eb41621ba22 88 WP = 0x02, ///< Write protection.
IanBenzMaxim 12:7eb41621ba22 89 DC = 0x08 ///< Decrement counter.
IanBenzMaxim 12:7eb41621ba22 90 };
IanBenzMaxim 12:7eb41621ba22 91 typedef Core::FlagSet<PageProtectionType, 4> PageProtection;
IanBenzMaxim 12:7eb41621ba22 92
IanBenzMaxim 12:7eb41621ba22 93 struct Status {
IanBenzMaxim 12:7eb41621ba22 94 typedef Core::array_span<PageProtection, memoryPages> PageProtectionList;
IanBenzMaxim 12:7eb41621ba22 95
IanBenzMaxim 12:7eb41621ba22 96 PageProtectionList::array pageProtection;
IanBenzMaxim 12:7eb41621ba22 97 Core::RomId::array romId;
IanBenzMaxim 12:7eb41621ba22 98 uint_least8_t manId;
IanBenzMaxim 12:7eb41621ba22 99 uint_least8_t deviceVersion;
IanBenzMaxim 12:7eb41621ba22 100 };
IanBenzMaxim 12:7eb41621ba22 101
IanBenzMaxim 12:7eb41621ba22 102 explicit DS28C16(const Core::RunCommand & runCommand)
IanBenzMaxim 12:7eb41621ba22 103 : doRunCommand(runCommand) {}
IanBenzMaxim 12:7eb41621ba22 104
IanBenzMaxim 12:7eb41621ba22 105 void setRunCommand(const Core::RunCommand & runCommand) {
IanBenzMaxim 12:7eb41621ba22 106 doRunCommand = runCommand;
IanBenzMaxim 12:7eb41621ba22 107 }
IanBenzMaxim 12:7eb41621ba22 108
IanBenzMaxim 12:7eb41621ba22 109 /// @brief Write memory with no protection.
IanBenzMaxim 12:7eb41621ba22 110 /// @param pageNum Number of page to write.
IanBenzMaxim 12:7eb41621ba22 111 /// @param page Data to write.
IanBenzMaxim 12:7eb41621ba22 112 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 12:7eb41621ba22 113 writeMemory(int pageNum, Page::const_span page);
IanBenzMaxim 12:7eb41621ba22 114
IanBenzMaxim 12:7eb41621ba22 115 /// @brief Read memory with no protection.
IanBenzMaxim 12:7eb41621ba22 116 /// @param pageNum Number of page to read.
IanBenzMaxim 12:7eb41621ba22 117 /// @returns Data that was read.
IanBenzMaxim 12:7eb41621ba22 118 MaximInterfaceDevices_EXPORT Core::Result<Page::array>
IanBenzMaxim 12:7eb41621ba22 119 readMemory(int pageNum) const;
IanBenzMaxim 12:7eb41621ba22 120
IanBenzMaxim 12:7eb41621ba22 121 /// @brief Reads the current status of the device.
IanBenzMaxim 12:7eb41621ba22 122 /// @returns Status that was read.
IanBenzMaxim 12:7eb41621ba22 123 MaximInterfaceDevices_EXPORT Core::Result<Status> readStatus() const;
IanBenzMaxim 12:7eb41621ba22 124
IanBenzMaxim 12:7eb41621ba22 125 /// @brief Set the protection settings of a page.
IanBenzMaxim 12:7eb41621ba22 126 /// @param pageNum Number of page to write.
IanBenzMaxim 12:7eb41621ba22 127 /// @param protection Protection to write.
IanBenzMaxim 12:7eb41621ba22 128 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 12:7eb41621ba22 129 setPageProtection(int pageNum, const PageProtection & protection);
IanBenzMaxim 12:7eb41621ba22 130
IanBenzMaxim 12:7eb41621ba22 131 /// @brief Compute and read page authentication with HMAC.
IanBenzMaxim 12:7eb41621ba22 132 /// @param pageNum Number of page to authenticate.
IanBenzMaxim 12:7eb41621ba22 133 /// @param anonymous True to disable use of ROM ID in computation.
IanBenzMaxim 12:7eb41621ba22 134 /// @param challenge Random challenge used to prevent replay attacks.
IanBenzMaxim 12:7eb41621ba22 135 /// @returns Computed page HMAC.
IanBenzMaxim 12:7eb41621ba22 136 MaximInterfaceDevices_EXPORT Core::Result<DoublePage::array>
IanBenzMaxim 12:7eb41621ba22 137 computeAndReadPageAuthentication(int pageNum, bool anonymous,
IanBenzMaxim 12:7eb41621ba22 138 DoublePage::const_span challenge) const;
IanBenzMaxim 12:7eb41621ba22 139
IanBenzMaxim 12:7eb41621ba22 140 /// Decrement the decrement-only counter.
IanBenzMaxim 12:7eb41621ba22 141 MaximInterfaceDevices_EXPORT Core::Result<void> decrementCounter();
IanBenzMaxim 12:7eb41621ba22 142
IanBenzMaxim 12:7eb41621ba22 143 /// Set password that will be subsequently used to disable the device.
IanBenzMaxim 12:7eb41621ba22 144 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 12:7eb41621ba22 145 setDisableDevicePassword(DisableDevicePassword::const_span password);
IanBenzMaxim 12:7eb41621ba22 146
IanBenzMaxim 12:7eb41621ba22 147 /// @brief Lock-out all disable functionality for the device.
IanBenzMaxim 12:7eb41621ba22 148 /// @note Only allowed prior to setting password.
IanBenzMaxim 12:7eb41621ba22 149 MaximInterfaceDevices_EXPORT Core::Result<void> lockOutDisableDevice();
IanBenzMaxim 12:7eb41621ba22 150
IanBenzMaxim 12:7eb41621ba22 151 /// Permanently disable the device.
IanBenzMaxim 12:7eb41621ba22 152 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 12:7eb41621ba22 153 disableDevice(DisableDevicePassword::const_span password);
IanBenzMaxim 12:7eb41621ba22 154
IanBenzMaxim 12:7eb41621ba22 155 /// @brief
IanBenzMaxim 12:7eb41621ba22 156 /// Compute a derivative secret for authentication from the Master Secret.
IanBenzMaxim 12:7eb41621ba22 157 /// @param bindingDataPageNum Page number for Binding Data.
IanBenzMaxim 12:7eb41621ba22 158 /// @param constantBindingData
IanBenzMaxim 12:7eb41621ba22 159 /// Use constant Binding Data instead of Binding Data from the selected page.
IanBenzMaxim 12:7eb41621ba22 160 /// @param anonymous True to disable use of ROM ID in computation.
IanBenzMaxim 12:7eb41621ba22 161 /// @param partialSecret Partial secret to use in computation.
IanBenzMaxim 12:7eb41621ba22 162 /// @note
IanBenzMaxim 12:7eb41621ba22 163 /// This command should be executed prior to the
IanBenzMaxim 12:7eb41621ba22 164 /// Compute and Read Page Authentication command.
IanBenzMaxim 12:7eb41621ba22 165 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 12:7eb41621ba22 166 computeSecret(int bindingDataPageNum, bool constantBindingData,
IanBenzMaxim 12:7eb41621ba22 167 bool anonymous, DoublePage::const_span partialSecret);
IanBenzMaxim 12:7eb41621ba22 168
IanBenzMaxim 12:7eb41621ba22 169 MaximInterfaceDevices_EXPORT static const Core::error_category &
IanBenzMaxim 12:7eb41621ba22 170 errorCategory();
IanBenzMaxim 12:7eb41621ba22 171
IanBenzMaxim 12:7eb41621ba22 172 protected:
IanBenzMaxim 12:7eb41621ba22 173 MaximInterfaceDevices_EXPORT Core::Result<Core::span<uint_least8_t> >
IanBenzMaxim 12:7eb41621ba22 174 runCommand(Core::span<const uint_least8_t> request, int delayTime,
IanBenzMaxim 12:7eb41621ba22 175 Core::span<uint_least8_t> response) const;
IanBenzMaxim 12:7eb41621ba22 176
IanBenzMaxim 12:7eb41621ba22 177 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 12:7eb41621ba22 178 runCommand(Core::span<const uint_least8_t> request, int delayTime);
IanBenzMaxim 12:7eb41621ba22 179
IanBenzMaxim 12:7eb41621ba22 180 private:
IanBenzMaxim 12:7eb41621ba22 181 enum DisableDeviceOperation {
IanBenzMaxim 12:7eb41621ba22 182 SetDisableDevicePassword = 0x0F,
IanBenzMaxim 12:7eb41621ba22 183 LockOutDisableDevice = 0x05,
IanBenzMaxim 12:7eb41621ba22 184 DisableDevice = 0x00
IanBenzMaxim 12:7eb41621ba22 185 };
IanBenzMaxim 12:7eb41621ba22 186
IanBenzMaxim 12:7eb41621ba22 187 Core::Result<void> disableDevice(DisableDeviceOperation operation,
IanBenzMaxim 12:7eb41621ba22 188 DisableDevicePassword::const_span password);
IanBenzMaxim 12:7eb41621ba22 189
IanBenzMaxim 12:7eb41621ba22 190 Core::RunCommand doRunCommand;
IanBenzMaxim 12:7eb41621ba22 191 };
IanBenzMaxim 12:7eb41621ba22 192
IanBenzMaxim 12:7eb41621ba22 193 } // namespace MaximInterfaceDevices
IanBenzMaxim 12:7eb41621ba22 194 namespace MaximInterfaceCore {
IanBenzMaxim 12:7eb41621ba22 195
IanBenzMaxim 12:7eb41621ba22 196 template <>
IanBenzMaxim 12:7eb41621ba22 197 struct is_error_code_enum<MaximInterfaceDevices::DS28C16::ErrorValue>
IanBenzMaxim 12:7eb41621ba22 198 : true_type {};
IanBenzMaxim 12:7eb41621ba22 199
IanBenzMaxim 12:7eb41621ba22 200 } // namespace MaximInterfaceCore
IanBenzMaxim 12:7eb41621ba22 201 namespace MaximInterfaceDevices {
IanBenzMaxim 12:7eb41621ba22 202
IanBenzMaxim 12:7eb41621ba22 203 inline Core::error_code make_error_code(DS28C16::ErrorValue e) {
IanBenzMaxim 12:7eb41621ba22 204 return Core::error_code(e, DS28C16::errorCategory());
IanBenzMaxim 12:7eb41621ba22 205 }
IanBenzMaxim 12:7eb41621ba22 206
IanBenzMaxim 12:7eb41621ba22 207 /// Format page authentication input data.
IanBenzMaxim 12:7eb41621ba22 208 class DS28C16::PageAuthenticationData {
IanBenzMaxim 12:7eb41621ba22 209 public:
IanBenzMaxim 12:7eb41621ba22 210 typedef Core::array_span<uint_least8_t, Core::RomId::size + 2 * Page::size +
IanBenzMaxim 12:7eb41621ba22 211 DoublePage::size + 3>
IanBenzMaxim 12:7eb41621ba22 212 Result;
IanBenzMaxim 12:7eb41621ba22 213
IanBenzMaxim 12:7eb41621ba22 214 PageAuthenticationData() : result_() {}
IanBenzMaxim 12:7eb41621ba22 215
IanBenzMaxim 12:7eb41621ba22 216 /// Formatted data result.
IanBenzMaxim 12:7eb41621ba22 217 Result::const_span result() const { return result_; }
IanBenzMaxim 12:7eb41621ba22 218
IanBenzMaxim 12:7eb41621ba22 219 /// @name ROM ID
IanBenzMaxim 12:7eb41621ba22 220 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 12:7eb41621ba22 221 /// @{
IanBenzMaxim 12:7eb41621ba22 222
IanBenzMaxim 12:7eb41621ba22 223 /// Get mutable ROM ID.
IanBenzMaxim 12:7eb41621ba22 224 Core::RomId::span romId() {
IanBenzMaxim 12:7eb41621ba22 225 return make_span(result_).subspan<romIdIdx, Core::RomId::size>();
IanBenzMaxim 12:7eb41621ba22 226 }
IanBenzMaxim 12:7eb41621ba22 227
IanBenzMaxim 12:7eb41621ba22 228 /// Get immutable ROM ID.
IanBenzMaxim 12:7eb41621ba22 229 Core::RomId::const_span romId() const {
IanBenzMaxim 12:7eb41621ba22 230 return const_cast<PageAuthenticationData &>(*this).romId();
IanBenzMaxim 12:7eb41621ba22 231 }
IanBenzMaxim 12:7eb41621ba22 232
IanBenzMaxim 12:7eb41621ba22 233 /// Set ROM ID.
IanBenzMaxim 12:7eb41621ba22 234 PageAuthenticationData & setRomId(Core::RomId::const_span romId) {
IanBenzMaxim 12:7eb41621ba22 235 copy(romId, this->romId());
IanBenzMaxim 12:7eb41621ba22 236 return *this;
IanBenzMaxim 12:7eb41621ba22 237 }
IanBenzMaxim 12:7eb41621ba22 238
IanBenzMaxim 12:7eb41621ba22 239 /// Set ROM ID for use in anonymous mode.
IanBenzMaxim 12:7eb41621ba22 240 MaximInterfaceDevices_EXPORT PageAuthenticationData & setAnonymousRomId();
IanBenzMaxim 12:7eb41621ba22 241
IanBenzMaxim 12:7eb41621ba22 242 /// @}
IanBenzMaxim 12:7eb41621ba22 243
IanBenzMaxim 12:7eb41621ba22 244 /// @name Page
IanBenzMaxim 12:7eb41621ba22 245 /// @brief Data from a device memory page.
IanBenzMaxim 12:7eb41621ba22 246 /// @{
IanBenzMaxim 12:7eb41621ba22 247
IanBenzMaxim 12:7eb41621ba22 248 /// Get mutable page.
IanBenzMaxim 12:7eb41621ba22 249 Page::span page() {
IanBenzMaxim 12:7eb41621ba22 250 return make_span(result_).subspan<pageIdx, Page::size>();
IanBenzMaxim 12:7eb41621ba22 251 }
IanBenzMaxim 12:7eb41621ba22 252
IanBenzMaxim 12:7eb41621ba22 253 /// Get immutable page.
IanBenzMaxim 12:7eb41621ba22 254 Page::const_span page() const {
IanBenzMaxim 12:7eb41621ba22 255 return const_cast<PageAuthenticationData &>(*this).page();
IanBenzMaxim 12:7eb41621ba22 256 }
IanBenzMaxim 12:7eb41621ba22 257
IanBenzMaxim 12:7eb41621ba22 258 /// Set page.
IanBenzMaxim 12:7eb41621ba22 259 PageAuthenticationData & setPage(Page::const_span page) {
IanBenzMaxim 12:7eb41621ba22 260 copy(page, this->page());
IanBenzMaxim 12:7eb41621ba22 261 return *this;
IanBenzMaxim 12:7eb41621ba22 262 }
IanBenzMaxim 12:7eb41621ba22 263
IanBenzMaxim 12:7eb41621ba22 264 /// @}
IanBenzMaxim 12:7eb41621ba22 265
IanBenzMaxim 12:7eb41621ba22 266 /// @name Challenge.
IanBenzMaxim 12:7eb41621ba22 267 /// @brief Random challenge used to prevent replay attacks.
IanBenzMaxim 12:7eb41621ba22 268 /// @{
IanBenzMaxim 12:7eb41621ba22 269
IanBenzMaxim 12:7eb41621ba22 270 /// Get mutable Challenge.
IanBenzMaxim 12:7eb41621ba22 271 DoublePage::span challenge() {
IanBenzMaxim 12:7eb41621ba22 272 return make_span(result_).subspan<challengeIdx, DoublePage::size>();
IanBenzMaxim 12:7eb41621ba22 273 }
IanBenzMaxim 12:7eb41621ba22 274
IanBenzMaxim 12:7eb41621ba22 275 /// Get immutable Challenge.
IanBenzMaxim 12:7eb41621ba22 276 DoublePage::const_span challenge() const {
IanBenzMaxim 12:7eb41621ba22 277 return const_cast<PageAuthenticationData &>(*this).challenge();
IanBenzMaxim 12:7eb41621ba22 278 }
IanBenzMaxim 12:7eb41621ba22 279
IanBenzMaxim 12:7eb41621ba22 280 /// Set Challenge.
IanBenzMaxim 12:7eb41621ba22 281 PageAuthenticationData & setChallenge(DoublePage::const_span challenge) {
IanBenzMaxim 12:7eb41621ba22 282 copy(challenge, this->challenge());
IanBenzMaxim 12:7eb41621ba22 283 return *this;
IanBenzMaxim 12:7eb41621ba22 284 }
IanBenzMaxim 12:7eb41621ba22 285
IanBenzMaxim 12:7eb41621ba22 286 /// @}
IanBenzMaxim 12:7eb41621ba22 287
IanBenzMaxim 12:7eb41621ba22 288 /// @name Page number
IanBenzMaxim 12:7eb41621ba22 289 /// @brief Number of the page to use data from.
IanBenzMaxim 12:7eb41621ba22 290 /// @{
IanBenzMaxim 12:7eb41621ba22 291
IanBenzMaxim 12:7eb41621ba22 292 /// Get page number.
IanBenzMaxim 12:7eb41621ba22 293 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 12:7eb41621ba22 294
IanBenzMaxim 12:7eb41621ba22 295 /// Set page number.
IanBenzMaxim 12:7eb41621ba22 296 PageAuthenticationData & setPageNum(int pageNum) {
IanBenzMaxim 12:7eb41621ba22 297 result_[pageNumIdx] = pageNum;
IanBenzMaxim 12:7eb41621ba22 298 return *this;
IanBenzMaxim 12:7eb41621ba22 299 }
IanBenzMaxim 12:7eb41621ba22 300
IanBenzMaxim 12:7eb41621ba22 301 /// @}
IanBenzMaxim 12:7eb41621ba22 302
IanBenzMaxim 12:7eb41621ba22 303 /// @name MAN ID
IanBenzMaxim 12:7eb41621ba22 304 /// @brief Manufacturer ID of the device.
IanBenzMaxim 12:7eb41621ba22 305 /// @{
IanBenzMaxim 12:7eb41621ba22 306
IanBenzMaxim 12:7eb41621ba22 307 /// Get mutable MAN ID.
IanBenzMaxim 12:7eb41621ba22 308 uint_least8_t & manId() { return result_[manIdIdx]; }
IanBenzMaxim 12:7eb41621ba22 309
IanBenzMaxim 12:7eb41621ba22 310 /// Get immutable MAN ID.
IanBenzMaxim 12:7eb41621ba22 311 uint_least8_t manId() const {
IanBenzMaxim 12:7eb41621ba22 312 return const_cast<PageAuthenticationData &>(*this).manId();
IanBenzMaxim 12:7eb41621ba22 313 }
IanBenzMaxim 12:7eb41621ba22 314
IanBenzMaxim 12:7eb41621ba22 315 /// Set MAN ID.
IanBenzMaxim 12:7eb41621ba22 316 PageAuthenticationData & setManId(uint_least8_t manId) {
IanBenzMaxim 12:7eb41621ba22 317 this->manId() = manId;
IanBenzMaxim 12:7eb41621ba22 318 return *this;
IanBenzMaxim 12:7eb41621ba22 319 }
IanBenzMaxim 12:7eb41621ba22 320
IanBenzMaxim 12:7eb41621ba22 321 /// @}
IanBenzMaxim 12:7eb41621ba22 322
IanBenzMaxim 12:7eb41621ba22 323 private:
IanBenzMaxim 12:7eb41621ba22 324 static const size_t romIdIdx = 0;
IanBenzMaxim 12:7eb41621ba22 325 static const size_t pageIdx = romIdIdx + Core::RomId::size;
IanBenzMaxim 12:7eb41621ba22 326 static const size_t challengeIdx = pageIdx + 2 * Page::size;
IanBenzMaxim 12:7eb41621ba22 327 static const size_t pageNumIdx = challengeIdx + DoublePage::size;
IanBenzMaxim 12:7eb41621ba22 328 static const size_t manIdIdx = pageNumIdx + 1;
IanBenzMaxim 12:7eb41621ba22 329
IanBenzMaxim 12:7eb41621ba22 330 Result::array result_;
IanBenzMaxim 12:7eb41621ba22 331 };
IanBenzMaxim 12:7eb41621ba22 332
IanBenzMaxim 12:7eb41621ba22 333 /// Format compute secret input data.
IanBenzMaxim 12:7eb41621ba22 334 class DS28C16::ComputeSecretData {
IanBenzMaxim 12:7eb41621ba22 335 public:
IanBenzMaxim 12:7eb41621ba22 336 typedef PageAuthenticationData::Result Result;
IanBenzMaxim 12:7eb41621ba22 337
IanBenzMaxim 12:7eb41621ba22 338 ComputeSecretData() : data() {
IanBenzMaxim 12:7eb41621ba22 339 data.setPageNum(0x80 | constantBindingDataMask);
IanBenzMaxim 12:7eb41621ba22 340 }
IanBenzMaxim 12:7eb41621ba22 341
IanBenzMaxim 12:7eb41621ba22 342 /// Formatted data result.
IanBenzMaxim 12:7eb41621ba22 343 Result::const_span result() const { return data.result(); }
IanBenzMaxim 12:7eb41621ba22 344
IanBenzMaxim 12:7eb41621ba22 345 /// @name ROM ID
IanBenzMaxim 12:7eb41621ba22 346 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 12:7eb41621ba22 347 /// @{
IanBenzMaxim 12:7eb41621ba22 348
IanBenzMaxim 12:7eb41621ba22 349 /// Get mutable ROM ID.
IanBenzMaxim 12:7eb41621ba22 350 Core::RomId::span romId() { return data.romId(); }
IanBenzMaxim 12:7eb41621ba22 351
IanBenzMaxim 12:7eb41621ba22 352 /// Get immutable ROM ID.
IanBenzMaxim 12:7eb41621ba22 353 Core::RomId::const_span romId() const { return data.romId(); }
IanBenzMaxim 12:7eb41621ba22 354
IanBenzMaxim 12:7eb41621ba22 355 /// Set ROM ID.
IanBenzMaxim 12:7eb41621ba22 356 ComputeSecretData & setRomId(Core::RomId::const_span romId) {
IanBenzMaxim 12:7eb41621ba22 357 data.setRomId(romId);
IanBenzMaxim 12:7eb41621ba22 358 return *this;
IanBenzMaxim 12:7eb41621ba22 359 }
IanBenzMaxim 12:7eb41621ba22 360
IanBenzMaxim 12:7eb41621ba22 361 /// @}
IanBenzMaxim 12:7eb41621ba22 362
IanBenzMaxim 12:7eb41621ba22 363 /// @name Binding Data
IanBenzMaxim 12:7eb41621ba22 364 /// @brief Binding Data contained in the selected page.
IanBenzMaxim 12:7eb41621ba22 365 /// @{
IanBenzMaxim 12:7eb41621ba22 366
IanBenzMaxim 12:7eb41621ba22 367 /// Get mutable Binding Data.
IanBenzMaxim 12:7eb41621ba22 368 Page::span bindingData() { return data.page(); }
IanBenzMaxim 12:7eb41621ba22 369
IanBenzMaxim 12:7eb41621ba22 370 /// Get immutable Binding Data.
IanBenzMaxim 12:7eb41621ba22 371 Page::const_span bindingData() const { return data.page(); }
IanBenzMaxim 12:7eb41621ba22 372
IanBenzMaxim 12:7eb41621ba22 373 /// Set Binding Data.
IanBenzMaxim 12:7eb41621ba22 374 ComputeSecretData & setBindingData(Page::const_span bindingData) {
IanBenzMaxim 12:7eb41621ba22 375 data.setPage(bindingData);
IanBenzMaxim 12:7eb41621ba22 376 return *this;
IanBenzMaxim 12:7eb41621ba22 377 }
IanBenzMaxim 12:7eb41621ba22 378
IanBenzMaxim 12:7eb41621ba22 379 /// @}
IanBenzMaxim 12:7eb41621ba22 380
IanBenzMaxim 12:7eb41621ba22 381 /// @name Constant Binding Data
IanBenzMaxim 12:7eb41621ba22 382 /// @brief
IanBenzMaxim 12:7eb41621ba22 383 /// Use constant Binding Data instead of Binding Data from the selected page.
IanBenzMaxim 12:7eb41621ba22 384 /// @{
IanBenzMaxim 12:7eb41621ba22 385
IanBenzMaxim 12:7eb41621ba22 386 /// Get Constant Binding Data.
IanBenzMaxim 12:7eb41621ba22 387 bool constantBindingData() const {
IanBenzMaxim 12:7eb41621ba22 388 return (data.pageNum() & constantBindingDataMask) ==
IanBenzMaxim 12:7eb41621ba22 389 constantBindingDataMask;
IanBenzMaxim 12:7eb41621ba22 390 }
IanBenzMaxim 12:7eb41621ba22 391
IanBenzMaxim 12:7eb41621ba22 392 /// Set Constant Binding Data.
IanBenzMaxim 12:7eb41621ba22 393 MaximInterfaceDevices_EXPORT ComputeSecretData &
IanBenzMaxim 12:7eb41621ba22 394 setConstantBindingData(bool constantBindingData);
IanBenzMaxim 12:7eb41621ba22 395
IanBenzMaxim 12:7eb41621ba22 396 /// @}
IanBenzMaxim 12:7eb41621ba22 397
IanBenzMaxim 12:7eb41621ba22 398 /// @name Partial Secret
IanBenzMaxim 12:7eb41621ba22 399 /// @brief Partial Secret used for customization.
IanBenzMaxim 12:7eb41621ba22 400 /// @{
IanBenzMaxim 12:7eb41621ba22 401
IanBenzMaxim 12:7eb41621ba22 402 /// Get mutable Partial Secret.
IanBenzMaxim 12:7eb41621ba22 403 DoublePage::span partialSecret() { return data.challenge(); }
IanBenzMaxim 12:7eb41621ba22 404
IanBenzMaxim 12:7eb41621ba22 405 /// Get immutable Partial Secret.
IanBenzMaxim 12:7eb41621ba22 406 DoublePage::const_span partialSecret() const { return data.challenge(); }
IanBenzMaxim 12:7eb41621ba22 407
IanBenzMaxim 12:7eb41621ba22 408 /// Set Partial Secret.
IanBenzMaxim 12:7eb41621ba22 409 ComputeSecretData & setPartialSecret(DoublePage::const_span partialSecret) {
IanBenzMaxim 12:7eb41621ba22 410 data.setChallenge(partialSecret);
IanBenzMaxim 12:7eb41621ba22 411 return *this;
IanBenzMaxim 12:7eb41621ba22 412 }
IanBenzMaxim 12:7eb41621ba22 413
IanBenzMaxim 12:7eb41621ba22 414 /// @}
IanBenzMaxim 12:7eb41621ba22 415
IanBenzMaxim 12:7eb41621ba22 416 /// @name Binding Data page number
IanBenzMaxim 12:7eb41621ba22 417 /// @{
IanBenzMaxim 12:7eb41621ba22 418
IanBenzMaxim 12:7eb41621ba22 419 /// Get Binding Data page number.
IanBenzMaxim 12:7eb41621ba22 420 int bindingDataPageNum() const {
IanBenzMaxim 12:7eb41621ba22 421 return data.pageNum() & bindingDataPageNumMask;
IanBenzMaxim 12:7eb41621ba22 422 }
IanBenzMaxim 12:7eb41621ba22 423
IanBenzMaxim 12:7eb41621ba22 424 /// Set Binding Data page number.
IanBenzMaxim 12:7eb41621ba22 425 ComputeSecretData & setBindingDataPageNum(int bindingDataPageNum) {
IanBenzMaxim 12:7eb41621ba22 426 data.setPageNum((bindingDataPageNum & bindingDataPageNumMask) |
IanBenzMaxim 12:7eb41621ba22 427 (data.pageNum() & ~bindingDataPageNumMask));
IanBenzMaxim 12:7eb41621ba22 428 return *this;
IanBenzMaxim 12:7eb41621ba22 429 }
IanBenzMaxim 12:7eb41621ba22 430
IanBenzMaxim 12:7eb41621ba22 431 /// @}
IanBenzMaxim 12:7eb41621ba22 432
IanBenzMaxim 12:7eb41621ba22 433 /// @name MAN ID
IanBenzMaxim 12:7eb41621ba22 434 /// @brief Manufacturer ID of the device.
IanBenzMaxim 12:7eb41621ba22 435 /// @{
IanBenzMaxim 12:7eb41621ba22 436
IanBenzMaxim 12:7eb41621ba22 437 /// Get mutable MAN ID.
IanBenzMaxim 12:7eb41621ba22 438 uint_least8_t & manId() { return data.manId(); }
IanBenzMaxim 12:7eb41621ba22 439
IanBenzMaxim 12:7eb41621ba22 440 /// Get immutable MAN ID.
IanBenzMaxim 12:7eb41621ba22 441 uint_least8_t manId() const { return data.manId(); }
IanBenzMaxim 12:7eb41621ba22 442
IanBenzMaxim 12:7eb41621ba22 443 /// Set MAN ID.
IanBenzMaxim 12:7eb41621ba22 444 ComputeSecretData & setManId(uint_least8_t manId) {
IanBenzMaxim 12:7eb41621ba22 445 data.setManId(manId);
IanBenzMaxim 12:7eb41621ba22 446 return *this;
IanBenzMaxim 12:7eb41621ba22 447 }
IanBenzMaxim 12:7eb41621ba22 448
IanBenzMaxim 12:7eb41621ba22 449 /// @}
IanBenzMaxim 12:7eb41621ba22 450
IanBenzMaxim 12:7eb41621ba22 451 private:
IanBenzMaxim 12:7eb41621ba22 452 static const unsigned int bindingDataPageNumMask = 0x03;
IanBenzMaxim 12:7eb41621ba22 453 static const unsigned int constantBindingDataMask = 0x04;
IanBenzMaxim 12:7eb41621ba22 454
IanBenzMaxim 12:7eb41621ba22 455 PageAuthenticationData data;
IanBenzMaxim 12:7eb41621ba22 456 };
IanBenzMaxim 12:7eb41621ba22 457
IanBenzMaxim 12:7eb41621ba22 458 } // namespace MaximInterfaceDevices
IanBenzMaxim 12:7eb41621ba22 459
IanBenzMaxim 12:7eb41621ba22 460 #endif