Maxim Integrated / Mbed OS MAXREFDES155#

Dependencies:   MaximInterface

Committer:
IanBenzMaxim
Date:
Fri Feb 24 11:23:12 2017 -0600
Revision:
0:33d4e66780c0
Child:
9:40dd19da90c3
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 0:33d4e66780c0 1 /*******************************************************************************
IanBenzMaxim 0:33d4e66780c0 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 0:33d4e66780c0 3 *
IanBenzMaxim 0:33d4e66780c0 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 0:33d4e66780c0 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 0:33d4e66780c0 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 0:33d4e66780c0 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 0:33d4e66780c0 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 0:33d4e66780c0 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 0:33d4e66780c0 10 *
IanBenzMaxim 0:33d4e66780c0 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 0:33d4e66780c0 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 0:33d4e66780c0 13 *
IanBenzMaxim 0:33d4e66780c0 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 0:33d4e66780c0 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 0:33d4e66780c0 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 0:33d4e66780c0 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 0:33d4e66780c0 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 0:33d4e66780c0 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 0:33d4e66780c0 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 0:33d4e66780c0 21 *
IanBenzMaxim 0:33d4e66780c0 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 0:33d4e66780c0 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 0:33d4e66780c0 24 * Products, Inc. Branding Policy.
IanBenzMaxim 0:33d4e66780c0 25 *
IanBenzMaxim 0:33d4e66780c0 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 0:33d4e66780c0 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 0:33d4e66780c0 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 0:33d4e66780c0 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 0:33d4e66780c0 30 * ownership rights.
IanBenzMaxim 0:33d4e66780c0 31 *******************************************************************************/
IanBenzMaxim 0:33d4e66780c0 32
IanBenzMaxim 0:33d4e66780c0 33 #ifndef DS28C36_HPP
IanBenzMaxim 0:33d4e66780c0 34 #define DS28C36_HPP
IanBenzMaxim 0:33d4e66780c0 35
IanBenzMaxim 0:33d4e66780c0 36 #include <vector>
IanBenzMaxim 0:33d4e66780c0 37 #include "array.h"
IanBenzMaxim 0:33d4e66780c0 38
IanBenzMaxim 0:33d4e66780c0 39 namespace mbed { class I2C; }
IanBenzMaxim 0:33d4e66780c0 40 namespace OneWire { class RomId; }
IanBenzMaxim 0:33d4e66780c0 41
IanBenzMaxim 0:33d4e66780c0 42 /// Interface to the DS28C36 authenticator.
IanBenzMaxim 0:33d4e66780c0 43 class DS28C36
IanBenzMaxim 0:33d4e66780c0 44 {
IanBenzMaxim 0:33d4e66780c0 45 public:
IanBenzMaxim 0:33d4e66780c0 46 /// Device command results.
IanBenzMaxim 0:33d4e66780c0 47 enum CmdResult
IanBenzMaxim 0:33d4e66780c0 48 {
IanBenzMaxim 0:33d4e66780c0 49 Success = 0xAA,
IanBenzMaxim 0:33d4e66780c0 50 ProtectionError = 0x55,
IanBenzMaxim 0:33d4e66780c0 51 InvalidParameterError = 0x77,
IanBenzMaxim 0:33d4e66780c0 52 InvalidSequenceError = 0x33,
IanBenzMaxim 0:33d4e66780c0 53 InvalidEcdsaInputOrResultError = 0x22,
IanBenzMaxim 0:33d4e66780c0 54 AuthenticationError = 0x00,
IanBenzMaxim 0:33d4e66780c0 55 CommunicationError = 0xFF ///< Special code for I2C communication error.
IanBenzMaxim 0:33d4e66780c0 56 };
IanBenzMaxim 0:33d4e66780c0 57
IanBenzMaxim 0:33d4e66780c0 58 /// Device memory pages.
IanBenzMaxim 0:33d4e66780c0 59 enum PageNum
IanBenzMaxim 0:33d4e66780c0 60 {
IanBenzMaxim 0:33d4e66780c0 61 UserData0 = 0,
IanBenzMaxim 0:33d4e66780c0 62 UserData1,
IanBenzMaxim 0:33d4e66780c0 63 UserData2,
IanBenzMaxim 0:33d4e66780c0 64 UserData3,
IanBenzMaxim 0:33d4e66780c0 65 UserData4,
IanBenzMaxim 0:33d4e66780c0 66 UserData5,
IanBenzMaxim 0:33d4e66780c0 67 UserData6,
IanBenzMaxim 0:33d4e66780c0 68 UserData7,
IanBenzMaxim 0:33d4e66780c0 69 UserData8,
IanBenzMaxim 0:33d4e66780c0 70 UserData9,
IanBenzMaxim 0:33d4e66780c0 71 UserData10,
IanBenzMaxim 0:33d4e66780c0 72 UserData11,
IanBenzMaxim 0:33d4e66780c0 73 UserData12,
IanBenzMaxim 0:33d4e66780c0 74 UserData13,
IanBenzMaxim 0:33d4e66780c0 75 UserData14,
IanBenzMaxim 0:33d4e66780c0 76 UserData15,
IanBenzMaxim 0:33d4e66780c0 77 PublicKeyAX,
IanBenzMaxim 0:33d4e66780c0 78 PublicKeyAY,
IanBenzMaxim 0:33d4e66780c0 79 PublicKeyBX,
IanBenzMaxim 0:33d4e66780c0 80 PublicKeyBY,
IanBenzMaxim 0:33d4e66780c0 81 PublicKeyCX,
IanBenzMaxim 0:33d4e66780c0 82 PublicKeyCY,
IanBenzMaxim 0:33d4e66780c0 83 PrivateKeyA,
IanBenzMaxim 0:33d4e66780c0 84 PrivateKeyB,
IanBenzMaxim 0:33d4e66780c0 85 PrivateKeyC,
IanBenzMaxim 0:33d4e66780c0 86 SecretA,
IanBenzMaxim 0:33d4e66780c0 87 SecretB,
IanBenzMaxim 0:33d4e66780c0 88 DecrementCounter,
IanBenzMaxim 0:33d4e66780c0 89 RomOptions,
IanBenzMaxim 0:33d4e66780c0 90 GpioControl,
IanBenzMaxim 0:33d4e66780c0 91 PublicKeySX,
IanBenzMaxim 0:33d4e66780c0 92 PublicKeySY
IanBenzMaxim 0:33d4e66780c0 93 };
IanBenzMaxim 0:33d4e66780c0 94
IanBenzMaxim 0:33d4e66780c0 95 /// Available keys for ECDSA operations.
IanBenzMaxim 0:33d4e66780c0 96 enum KeyNum
IanBenzMaxim 0:33d4e66780c0 97 {
IanBenzMaxim 0:33d4e66780c0 98 KeyNumA = 0,
IanBenzMaxim 0:33d4e66780c0 99 KeyNumB = 1,
IanBenzMaxim 0:33d4e66780c0 100 KeyNumC = 2,
IanBenzMaxim 0:33d4e66780c0 101 KeyNumS = 3
IanBenzMaxim 0:33d4e66780c0 102 };
IanBenzMaxim 0:33d4e66780c0 103
IanBenzMaxim 0:33d4e66780c0 104 /// Available secrets for HMAC operations.
IanBenzMaxim 0:33d4e66780c0 105 enum SecretNum
IanBenzMaxim 0:33d4e66780c0 106 {
IanBenzMaxim 0:33d4e66780c0 107 SecretNumA = 0,
IanBenzMaxim 0:33d4e66780c0 108 SecretNumB = 1,
IanBenzMaxim 0:33d4e66780c0 109 SecretNumS = 2
IanBenzMaxim 0:33d4e66780c0 110 };
IanBenzMaxim 0:33d4e66780c0 111
IanBenzMaxim 0:33d4e66780c0 112 /// Data hash type when verifying an ECDSA signature.
IanBenzMaxim 0:33d4e66780c0 113 enum HashType
IanBenzMaxim 0:33d4e66780c0 114 {
IanBenzMaxim 0:33d4e66780c0 115 HashInBuffer = 0, ///< Hash is loaded in the buffer.
IanBenzMaxim 0:33d4e66780c0 116 DataInBuffer = 1, ///< Compute hash from data loaded in the buffer.
IanBenzMaxim 0:33d4e66780c0 117 THASH = 2 ///< Use THASH from Compute Multiblock Hash command.
IanBenzMaxim 0:33d4e66780c0 118 };
IanBenzMaxim 0:33d4e66780c0 119
IanBenzMaxim 0:33d4e66780c0 120 /// Available PIO states when verifying an ECDSA signature.
IanBenzMaxim 0:33d4e66780c0 121 enum PioState
IanBenzMaxim 0:33d4e66780c0 122 {
IanBenzMaxim 0:33d4e66780c0 123 Unchanged,
IanBenzMaxim 0:33d4e66780c0 124 Conducting,
IanBenzMaxim 0:33d4e66780c0 125 HighImpedance
IanBenzMaxim 0:33d4e66780c0 126 };
IanBenzMaxim 0:33d4e66780c0 127
IanBenzMaxim 0:33d4e66780c0 128 typedef OneWire::array<uint8_t, 32> Page; ///< Holds a device memory page.
IanBenzMaxim 0:33d4e66780c0 129 typedef OneWire::array<uint8_t, 32> HMAC; ///< Holds a computed HMAC.
IanBenzMaxim 0:33d4e66780c0 130 typedef std::vector<uint8_t> Buffer; ///< Holds a variable length device buffer.
IanBenzMaxim 0:33d4e66780c0 131
IanBenzMaxim 0:33d4e66780c0 132 /// Holds a computed ECDSA signature.
IanBenzMaxim 0:33d4e66780c0 133 struct Signature
IanBenzMaxim 0:33d4e66780c0 134 {
IanBenzMaxim 0:33d4e66780c0 135 Page r;
IanBenzMaxim 0:33d4e66780c0 136 Page s;
IanBenzMaxim 0:33d4e66780c0 137 };
IanBenzMaxim 0:33d4e66780c0 138
IanBenzMaxim 0:33d4e66780c0 139 /// Holds an encrypted device memory page.
IanBenzMaxim 0:33d4e66780c0 140 struct EncryptedPage
IanBenzMaxim 0:33d4e66780c0 141 {
IanBenzMaxim 0:33d4e66780c0 142 OneWire::array<uint8_t, 8> challenge;
IanBenzMaxim 0:33d4e66780c0 143 Page data;
IanBenzMaxim 0:33d4e66780c0 144 };
IanBenzMaxim 0:33d4e66780c0 145
IanBenzMaxim 0:33d4e66780c0 146 /// Holds the protection status of a memory page.
IanBenzMaxim 0:33d4e66780c0 147 class PageProtection
IanBenzMaxim 0:33d4e66780c0 148 {
IanBenzMaxim 0:33d4e66780c0 149 public:
IanBenzMaxim 0:33d4e66780c0 150 /// Page protection types.
IanBenzMaxim 0:33d4e66780c0 151 enum Protection
IanBenzMaxim 0:33d4e66780c0 152 {
IanBenzMaxim 0:33d4e66780c0 153 RP = 0x01, ///< Read protection.
IanBenzMaxim 0:33d4e66780c0 154 WP = 0x02, ///< Write protection.
IanBenzMaxim 0:33d4e66780c0 155 EM = 0x04, ///< EPROM emulation mode.
IanBenzMaxim 0:33d4e66780c0 156 APH = 0x08, ///< Authentication write protection HMAC.
IanBenzMaxim 0:33d4e66780c0 157 EPH = 0x10, ///< Encryption and authenticated write protection HMAC.
IanBenzMaxim 0:33d4e66780c0 158 AUTH = 0x20, ///< Public Key C is set to authority public key.
IanBenzMaxim 0:33d4e66780c0 159 ECH = 0x40, ///< Encrypted read and write using shared key from ECDH.
IanBenzMaxim 0:33d4e66780c0 160 ECW = 0x80 ///< Authentication write protection ECDSA.
IanBenzMaxim 0:33d4e66780c0 161 };
IanBenzMaxim 0:33d4e66780c0 162
IanBenzMaxim 0:33d4e66780c0 163 explicit PageProtection(uint8_t status = 0x00) : m_status(status) { }
IanBenzMaxim 0:33d4e66780c0 164
IanBenzMaxim 0:33d4e66780c0 165 /// @{
IanBenzMaxim 0:33d4e66780c0 166 /// Byte representation used by the device.
IanBenzMaxim 0:33d4e66780c0 167 uint8_t statusByte() const { return m_status; }
IanBenzMaxim 0:33d4e66780c0 168 void setStatusByte(uint8_t status) { m_status = status; }
IanBenzMaxim 0:33d4e66780c0 169 /// @}
IanBenzMaxim 0:33d4e66780c0 170
IanBenzMaxim 0:33d4e66780c0 171 /// @{
IanBenzMaxim 0:33d4e66780c0 172 /// Get/set whether a protection type is enabled.
IanBenzMaxim 0:33d4e66780c0 173 bool protectionEnabled(Protection protection) const
IanBenzMaxim 0:33d4e66780c0 174 {
IanBenzMaxim 0:33d4e66780c0 175 return ((m_status & protection) == protection);
IanBenzMaxim 0:33d4e66780c0 176 }
IanBenzMaxim 0:33d4e66780c0 177 void setProtectionEnabled(Protection protection, bool enabled)
IanBenzMaxim 0:33d4e66780c0 178 {
IanBenzMaxim 0:33d4e66780c0 179 if (enabled) { m_status |= protection; }
IanBenzMaxim 0:33d4e66780c0 180 else { m_status &= ~protection; }
IanBenzMaxim 0:33d4e66780c0 181 }
IanBenzMaxim 0:33d4e66780c0 182 /// @}
IanBenzMaxim 0:33d4e66780c0 183
IanBenzMaxim 0:33d4e66780c0 184 private:
IanBenzMaxim 0:33d4e66780c0 185 uint8_t m_status;
IanBenzMaxim 0:33d4e66780c0 186 };
IanBenzMaxim 0:33d4e66780c0 187
IanBenzMaxim 0:33d4e66780c0 188 explicit DS28C36(mbed::I2C & i2c, uint8_t i2cAddress = 0x36) :
IanBenzMaxim 0:33d4e66780c0 189 m_i2c(i2c), m_i2cAddress(i2cAddress) { }
IanBenzMaxim 0:33d4e66780c0 190
IanBenzMaxim 0:33d4e66780c0 191 /// Write memory with no protection.
IanBenzMaxim 0:33d4e66780c0 192 /// @param pageNum Number of page to write.
IanBenzMaxim 0:33d4e66780c0 193 /// @param page Data to write.
IanBenzMaxim 0:33d4e66780c0 194 CmdResult writeMemory(unsigned int pageNum, const Page & page);
IanBenzMaxim 0:33d4e66780c0 195
IanBenzMaxim 0:33d4e66780c0 196 /// Read memory with no protection.
IanBenzMaxim 0:33d4e66780c0 197 /// @param pageNum Number of page to read.
IanBenzMaxim 0:33d4e66780c0 198 /// @param[out] page Data that was read.
IanBenzMaxim 0:33d4e66780c0 199 CmdResult readMemory(unsigned int pageNum, Page & page);
IanBenzMaxim 0:33d4e66780c0 200
IanBenzMaxim 0:33d4e66780c0 201 /// Write the temporary buffer.
IanBenzMaxim 0:33d4e66780c0 202 /// @param data Data to write.
IanBenzMaxim 0:33d4e66780c0 203 CmdResult writeBuffer(const Buffer & data);
IanBenzMaxim 0:33d4e66780c0 204
IanBenzMaxim 0:33d4e66780c0 205 /// Read the temporary buffer.
IanBenzMaxim 0:33d4e66780c0 206 /// @param[out] data Data that was read.
IanBenzMaxim 0:33d4e66780c0 207 CmdResult readBuffer(Buffer & data);
IanBenzMaxim 0:33d4e66780c0 208
IanBenzMaxim 0:33d4e66780c0 209 /// Read the protection settings of a page.
IanBenzMaxim 0:33d4e66780c0 210 /// @param pageNum Number of page to read.
IanBenzMaxim 0:33d4e66780c0 211 /// @param[out] protection Protection that was read.
IanBenzMaxim 0:33d4e66780c0 212 CmdResult readPageProtection(unsigned int pageNum, PageProtection & protection);
IanBenzMaxim 0:33d4e66780c0 213
IanBenzMaxim 0:33d4e66780c0 214 /// Set the protection settings of a page.
IanBenzMaxim 0:33d4e66780c0 215 /// @param pageNum Number of page to write.
IanBenzMaxim 0:33d4e66780c0 216 /// @param protection Protection to write.
IanBenzMaxim 0:33d4e66780c0 217 CmdResult setPageProtection(unsigned int pageNum, const PageProtection & protection);
IanBenzMaxim 0:33d4e66780c0 218
IanBenzMaxim 0:33d4e66780c0 219 /// Decrement the decrement-only counter.
IanBenzMaxim 0:33d4e66780c0 220 CmdResult decrementCounter();
IanBenzMaxim 0:33d4e66780c0 221
IanBenzMaxim 0:33d4e66780c0 222 /// Read a block of random data from the RNG.
IanBenzMaxim 0:33d4e66780c0 223 /// @param numBytes Number of bytes to read from 1 to 64.
IanBenzMaxim 0:33d4e66780c0 224 /// @param[out] data Random data from RNG.
IanBenzMaxim 0:33d4e66780c0 225 CmdResult readRng(unsigned int numBytes, Buffer & data);
IanBenzMaxim 0:33d4e66780c0 226
IanBenzMaxim 0:33d4e66780c0 227 /// Read memory with encryption.
IanBenzMaxim 0:33d4e66780c0 228 /// @param pageNum Number of page to read from.
IanBenzMaxim 0:33d4e66780c0 229 /// @param secretNum Secret to use for encryption.
IanBenzMaxim 0:33d4e66780c0 230 /// @param[out] page Data that was read.
IanBenzMaxim 0:33d4e66780c0 231 CmdResult encryptedReadMemory(unsigned int pageNum, SecretNum secretNum, EncryptedPage & page);
IanBenzMaxim 0:33d4e66780c0 232
IanBenzMaxim 0:33d4e66780c0 233 /// Compute and read page authentication with ECDSA.
IanBenzMaxim 0:33d4e66780c0 234 /// @param pageNum Number of page to authenticate.
IanBenzMaxim 0:33d4e66780c0 235 /// @param keyNum Private key to use for authentication. Key S cannot be used with this command.
IanBenzMaxim 0:33d4e66780c0 236 /// @param[out] signature Computed page signature.
IanBenzMaxim 0:33d4e66780c0 237 CmdResult computeAndReadEcdsaPageAuthentication(unsigned int pageNum, KeyNum keyNum, Signature & signature);
IanBenzMaxim 0:33d4e66780c0 238
IanBenzMaxim 0:33d4e66780c0 239 /// Compute and read page authentication with HMAC.
IanBenzMaxim 0:33d4e66780c0 240 /// @param pageNum Number of page to authenticate.
IanBenzMaxim 0:33d4e66780c0 241 /// @param secretNum Secret to use for authentication.
IanBenzMaxim 0:33d4e66780c0 242 /// @param[out] hmac Computed page HMAC.
IanBenzMaxim 0:33d4e66780c0 243 CmdResult computeAndReadHmacPageAuthentication(unsigned int pageNum, SecretNum secretNum, HMAC & hmac);
IanBenzMaxim 0:33d4e66780c0 244
IanBenzMaxim 0:33d4e66780c0 245 /// Write with SHA2 authentication.
IanBenzMaxim 0:33d4e66780c0 246 /// @param pageNum Number of page to write.
IanBenzMaxim 0:33d4e66780c0 247 /// @param secretNum Secret to use for authentication.
IanBenzMaxim 0:33d4e66780c0 248 /// @param page Data to write.
IanBenzMaxim 0:33d4e66780c0 249 CmdResult authenticatedSha2WriteMemory(unsigned int pageNum, SecretNum secretNum, const Page & page);
IanBenzMaxim 0:33d4e66780c0 250
IanBenzMaxim 0:33d4e66780c0 251 /// Compute SHA2 secret and optionally lock.
IanBenzMaxim 0:33d4e66780c0 252 /// @param pageNum Number of page to use in computation.
IanBenzMaxim 0:33d4e66780c0 253 /// @param msecretNum Master secret to use in computation.
IanBenzMaxim 0:33d4e66780c0 254 /// @param dsecretNum Destination secret to receive the computation result.
IanBenzMaxim 0:33d4e66780c0 255 /// @param writeProtectEnable True to lock the destination secret against further writes.
IanBenzMaxim 0:33d4e66780c0 256 CmdResult computeAndLockSha2Secret(unsigned int pageNum, SecretNum msecretNum, SecretNum dsecretNum, bool writeProtectEnable);
IanBenzMaxim 0:33d4e66780c0 257
IanBenzMaxim 0:33d4e66780c0 258 /// Generate a new ECDSA key pair.
IanBenzMaxim 0:33d4e66780c0 259 /// @param keyNum Key to generate. Key S cannot be used with this command.
IanBenzMaxim 0:33d4e66780c0 260 /// @param writeProtectEnable True to lock the key against further writes.
IanBenzMaxim 0:33d4e66780c0 261 CmdResult generateEcc256KeyPair(KeyNum keyNum, bool writeProtectEnable);
IanBenzMaxim 0:33d4e66780c0 262
IanBenzMaxim 0:33d4e66780c0 263 /// Compute a hash over multiple blocks.
IanBenzMaxim 0:33d4e66780c0 264 /// @param firstBlock True if this is the first block being hashed.
IanBenzMaxim 0:33d4e66780c0 265 /// @param lastBlock True if thisis the last block being hashed.
IanBenzMaxim 0:33d4e66780c0 266 /// @param data Data block to hash. Length should be 64 bytes unless this is the last block.
IanBenzMaxim 0:33d4e66780c0 267 CmdResult computeMultiblockHash(bool firstBlock, bool lastBlock, const Buffer & data);
IanBenzMaxim 0:33d4e66780c0 268
IanBenzMaxim 0:33d4e66780c0 269 /// Verify ECDSA signature.
IanBenzMaxim 0:33d4e66780c0 270 /// @param keyNum Public key to use for verification.
IanBenzMaxim 0:33d4e66780c0 271 /// @param hashType Source of the data hash input.
IanBenzMaxim 0:33d4e66780c0 272 /// @param signature Signature to verify.
IanBenzMaxim 0:33d4e66780c0 273 /// @param pioa New state of PIOA if verification successful.
IanBenzMaxim 0:33d4e66780c0 274 /// @param piob New state of PIOB if verification successful.
IanBenzMaxim 0:33d4e66780c0 275 CmdResult verifyEcdsaSignature(KeyNum keyNum, HashType hashType, const Signature & signature, PioState pioa = Unchanged, PioState piob = Unchanged);
IanBenzMaxim 0:33d4e66780c0 276
IanBenzMaxim 0:33d4e66780c0 277 /// Authenticate a public key for authenticated writes or encrypted reads with ECDH.
IanBenzMaxim 0:33d4e66780c0 278 /// @param authWrites True to select authentication for writes.
IanBenzMaxim 0:33d4e66780c0 279 /// @param ecdh True to select ECDH key exchange.
IanBenzMaxim 0:33d4e66780c0 280 /// @param keyNum Private key to use for ECDH key exchange. Key A or B can be selected.
IanBenzMaxim 0:33d4e66780c0 281 /// @param csOffset Certificate customization field ending offset in buffer.
IanBenzMaxim 0:33d4e66780c0 282 /// @param signature Signature to use for authentication of public key S.
IanBenzMaxim 0:33d4e66780c0 283 CmdResult authenticateEcdsaPublicKey(bool authWrites, bool ecdh, KeyNum keyNum, unsigned int csOffset, const Signature & signature);
IanBenzMaxim 0:33d4e66780c0 284
IanBenzMaxim 0:33d4e66780c0 285 /// Write with ECDSA authentication.
IanBenzMaxim 0:33d4e66780c0 286 /// @param pageNum Number of page to write.
IanBenzMaxim 0:33d4e66780c0 287 /// @param page Data to write.
IanBenzMaxim 0:33d4e66780c0 288 CmdResult authenticatedEcdsaWriteMemory(unsigned int pageNum, const Page & page);
IanBenzMaxim 0:33d4e66780c0 289
IanBenzMaxim 0:33d4e66780c0 290 /// Read the device ROM ID using the Read Memory command.
IanBenzMaxim 0:33d4e66780c0 291 /// @param ds28c36 Device to read.
IanBenzMaxim 0:33d4e66780c0 292 /// @param[out] romId Read ROM ID valid when operation is successful.
IanBenzMaxim 0:33d4e66780c0 293 static CmdResult readRomId(DS28C36 & ds28c36, OneWire::RomId & romId);
IanBenzMaxim 0:33d4e66780c0 294
IanBenzMaxim 0:33d4e66780c0 295 protected:
IanBenzMaxim 0:33d4e66780c0 296 // Timing constants.
IanBenzMaxim 0:33d4e66780c0 297 static const unsigned int generateEcdsaSignatureTimeMs = 50;
IanBenzMaxim 0:33d4e66780c0 298 static const unsigned int generateEccKeyPairTimeMs = 100;
IanBenzMaxim 0:33d4e66780c0 299 static const unsigned int verifyEsdsaSignatureOrComputeEcdhTimeMs = 150;
IanBenzMaxim 0:33d4e66780c0 300 static const unsigned int sha256ComputationTimeMs = 3;
IanBenzMaxim 0:33d4e66780c0 301 static const unsigned int readMemoryTimeMs = /*1*/ 2;
IanBenzMaxim 0:33d4e66780c0 302 static const unsigned int writeMemoryTimeMs = 15;
IanBenzMaxim 0:33d4e66780c0 303
IanBenzMaxim 0:33d4e66780c0 304 static CmdResult convertResultByte(uint8_t resultByte);
IanBenzMaxim 0:33d4e66780c0 305
IanBenzMaxim 0:33d4e66780c0 306 CmdResult writeCommand(uint8_t command, const Buffer & parameters);
IanBenzMaxim 0:33d4e66780c0 307 CmdResult readResponse(Buffer & response);
IanBenzMaxim 0:33d4e66780c0 308
IanBenzMaxim 0:33d4e66780c0 309 private:
IanBenzMaxim 0:33d4e66780c0 310 enum AuthType
IanBenzMaxim 0:33d4e66780c0 311 {
IanBenzMaxim 0:33d4e66780c0 312 HmacWithSecretA = 0,
IanBenzMaxim 0:33d4e66780c0 313 HmacWithSecretB = 1,
IanBenzMaxim 0:33d4e66780c0 314 HmacWithSecretS = 2,
IanBenzMaxim 0:33d4e66780c0 315 EcdsaWithKeyA = 3,
IanBenzMaxim 0:33d4e66780c0 316 EcdsaWithKeyB = 4,
IanBenzMaxim 0:33d4e66780c0 317 EcdsaWithKeyC = 5
IanBenzMaxim 0:33d4e66780c0 318 };
IanBenzMaxim 0:33d4e66780c0 319
IanBenzMaxim 0:33d4e66780c0 320 static const unsigned int numPages = 32;
IanBenzMaxim 0:33d4e66780c0 321
IanBenzMaxim 0:33d4e66780c0 322 mbed::I2C & m_i2c;
IanBenzMaxim 0:33d4e66780c0 323 uint8_t m_i2cAddress;
IanBenzMaxim 0:33d4e66780c0 324
IanBenzMaxim 0:33d4e66780c0 325 /// Compute any type of authentication on page.
IanBenzMaxim 0:33d4e66780c0 326 /// @param pageNum Number of page to authenticate.
IanBenzMaxim 0:33d4e66780c0 327 /// @param authType Method to use to compute authentication.
IanBenzMaxim 0:33d4e66780c0 328 /// @param[out] data Raw computed page authentication.
IanBenzMaxim 0:33d4e66780c0 329 CmdResult computeAndReadPageAuthentication(unsigned int pageNum, AuthType authType, Buffer & data);
IanBenzMaxim 0:33d4e66780c0 330 };
IanBenzMaxim 0:33d4e66780c0 331
IanBenzMaxim 0:33d4e66780c0 332 #endif