Maxim Integrated / Mbed 2 deprecated DeepCover Embedded Security in IoT

Dependencies:   MaximInterface mbed

Committer:
IanBenzMaxim
Date:
Thu Jul 21 11:06:13 2016 -0500
Revision:
17:41be4896ed6d
Parent:
16:6bce01c1dd90
Child:
18:6fbf7e7b6ab6
Fixed issue with LCD controller initialization on some boards due to power instability. Updated following downstream restructuring in OneWire library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 1:e1c7c1c636af 1 /*******************************************************************************
IanBenzMaxim 1:e1c7c1c636af 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 1:e1c7c1c636af 3 *
IanBenzMaxim 1:e1c7c1c636af 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 1:e1c7c1c636af 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 1:e1c7c1c636af 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 1:e1c7c1c636af 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 1:e1c7c1c636af 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 1:e1c7c1c636af 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 1:e1c7c1c636af 10 *
IanBenzMaxim 1:e1c7c1c636af 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 1:e1c7c1c636af 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 1:e1c7c1c636af 13 *
IanBenzMaxim 1:e1c7c1c636af 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 1:e1c7c1c636af 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 1:e1c7c1c636af 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 1:e1c7c1c636af 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 1:e1c7c1c636af 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 1:e1c7c1c636af 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 1:e1c7c1c636af 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 1:e1c7c1c636af 21 *
IanBenzMaxim 1:e1c7c1c636af 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 1:e1c7c1c636af 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 1:e1c7c1c636af 24 * Products, Inc. Branding Policy.
IanBenzMaxim 1:e1c7c1c636af 25 *
IanBenzMaxim 1:e1c7c1c636af 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 1:e1c7c1c636af 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 1:e1c7c1c636af 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 1:e1c7c1c636af 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 1:e1c7c1c636af 30 * ownership rights.
IanBenzMaxim 1:e1c7c1c636af 31 *******************************************************************************
IanBenzMaxim 1:e1c7c1c636af 32 */
IanBenzMaxim 1:e1c7c1c636af 33
IanBenzMaxim 1:e1c7c1c636af 34 #include "Factory.hpp"
IanBenzMaxim 1:e1c7c1c636af 35 #include "SensorNode.hpp"
IanBenzMaxim 1:e1c7c1c636af 36 #include "common.hpp"
IanBenzMaxim 6:b6bafd0a7013 37 #include "Masters/DS2465/DS2465.h"
IanBenzMaxim 16:6bce01c1dd90 38 #include "Slaves/Authenticators/DS28E15_22_25/DS28E15_22_25.h"
IanBenzMaxim 6:b6bafd0a7013 39 #include "wait_api.h"
IanBenzMaxim 1:e1c7c1c636af 40
IanBenzMaxim 8:594529956266 41 using namespace OneWire;
IanBenzMaxim 6:b6bafd0a7013 42
IanBenzMaxim 6:b6bafd0a7013 43 const uint8_t Factory::masterSecret[] = { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x21,
IanBenzMaxim 1:e1c7c1c636af 44 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x31, 0x32 };
IanBenzMaxim 6:b6bafd0a7013 45 const uint8_t Factory::invalidMasterSecret[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
IanBenzMaxim 1:e1c7c1c636af 46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
IanBenzMaxim 1:e1c7c1c636af 47
IanBenzMaxim 1:e1c7c1c636af 48 bool Factory::provision(DS2465 & ds2465)
IanBenzMaxim 1:e1c7c1c636af 49 {
IanBenzMaxim 6:b6bafd0a7013 50 bool result = (ds2465.setMasterSecret(masterSecret) == ISha256MacCoproc::Success);
IanBenzMaxim 1:e1c7c1c636af 51 if (result)
IanBenzMaxim 1:e1c7c1c636af 52 {
IanBenzMaxim 1:e1c7c1c636af 53 SensorNode::AuthData authData;
IanBenzMaxim 1:e1c7c1c636af 54 DS28E15_22_25::Page pageData;
IanBenzMaxim 1:e1c7c1c636af 55 std::memset(pageData, SensorNode::defaultPaddingByte, pageData.length);
IanBenzMaxim 1:e1c7c1c636af 56 std::memcpy(pageData, authData.segment, authData.segment.length);
IanBenzMaxim 1:e1c7c1c636af 57 result = (ds2465.writeScratchpad(pageData, pageData.length) == OneWireMaster::Success);
IanBenzMaxim 1:e1c7c1c636af 58 }
IanBenzMaxim 1:e1c7c1c636af 59 if (result)
IanBenzMaxim 1:e1c7c1c636af 60 {
IanBenzMaxim 1:e1c7c1c636af 61 result = (ds2465.copyScratchpadToPage(0) == OneWireMaster::Success);
IanBenzMaxim 1:e1c7c1c636af 62 if (result)
IanBenzMaxim 1:e1c7c1c636af 63 wait_ms(DS2465::eepromPageWriteDelayMs);
IanBenzMaxim 1:e1c7c1c636af 64 }
IanBenzMaxim 1:e1c7c1c636af 65
IanBenzMaxim 1:e1c7c1c636af 66 return result;
IanBenzMaxim 1:e1c7c1c636af 67 }
IanBenzMaxim 1:e1c7c1c636af 68
IanBenzMaxim 1:e1c7c1c636af 69 bool Factory::provision(SensorNode & sensorNode, bool validSecret)
IanBenzMaxim 1:e1c7c1c636af 70 {
IanBenzMaxim 1:e1c7c1c636af 71 const int blockNum = sensorNode.authData.pageNum / 2;
IanBenzMaxim 1:e1c7c1c636af 72 const DS28E15_22_25::BlockProtection desiredProtection(false, false, false, true, blockNum); // Authentication Protection only
IanBenzMaxim 1:e1c7c1c636af 73
IanBenzMaxim 1:e1c7c1c636af 74 // Reset to starting defaults
IanBenzMaxim 1:e1c7c1c636af 75 sensorNode.authData.reset();
IanBenzMaxim 1:e1c7c1c636af 76
IanBenzMaxim 1:e1c7c1c636af 77 // Read current protection status
IanBenzMaxim 1:e1c7c1c636af 78 DS28E15_22_25::BlockProtection protectionStatus;
IanBenzMaxim 1:e1c7c1c636af 79 bool result;
IanBenzMaxim 9:bc3d211d75ce 80 // Read block protections
IanBenzMaxim 9:bc3d211d75ce 81 result = (sensorNode.ds28e15_22_25.readBlockProtection(blockNum, protectionStatus) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 82 // Check if invalid protections are set
IanBenzMaxim 1:e1c7c1c636af 83 if (result)
IanBenzMaxim 1:e1c7c1c636af 84 result = ((protectionStatus.statusByte() & ~(desiredProtection.statusByte())) == 0x00);
IanBenzMaxim 1:e1c7c1c636af 85 // Load secret into scratchpad
IanBenzMaxim 1:e1c7c1c636af 86 if (result)
IanBenzMaxim 1:e1c7c1c636af 87 result = (sensorNode.ds28e15_22_25.writeScratchpad(validSecret ? masterSecret : invalidMasterSecret) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 88 // Load master secret from scratchpad without locking
IanBenzMaxim 1:e1c7c1c636af 89 if (result)
IanBenzMaxim 1:e1c7c1c636af 90 result = (sensorNode.ds28e15_22_25.loadSecret(false) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 91
IanBenzMaxim 1:e1c7c1c636af 92 // Setup is complete if not using a valid secret
IanBenzMaxim 1:e1c7c1c636af 93 if (!validSecret)
IanBenzMaxim 1:e1c7c1c636af 94 return result;
IanBenzMaxim 1:e1c7c1c636af 95
IanBenzMaxim 1:e1c7c1c636af 96 // Create constant partial secret
IanBenzMaxim 1:e1c7c1c636af 97 DS28E15_22_25::Scratchpad partialSecret;
IanBenzMaxim 1:e1c7c1c636af 98 DS28E15_22_25::Page pageData;
IanBenzMaxim 1:e1c7c1c636af 99 std::memset(partialSecret, SensorNode::defaultPaddingByte, partialSecret.length);
IanBenzMaxim 1:e1c7c1c636af 100
IanBenzMaxim 1:e1c7c1c636af 101 // Read page data
IanBenzMaxim 1:e1c7c1c636af 102 if (result)
IanBenzMaxim 1:e1c7c1c636af 103 result = (sensorNode.ds28e15_22_25.readPage(sensorNode.authData.pageNum, pageData, false) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 104 // Load partial secret into scratchpad
IanBenzMaxim 1:e1c7c1c636af 105 if (result)
IanBenzMaxim 1:e1c7c1c636af 106 result = (sensorNode.ds28e15_22_25.writeScratchpad(partialSecret) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 107 // Compute secret
IanBenzMaxim 1:e1c7c1c636af 108 if (result)
IanBenzMaxim 1:e1c7c1c636af 109 result = (sensorNode.ds28e15_22_25.computeSecret(sensorNode.authData.pageNum, false) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 110 // Configure slave secret on DS2465
IanBenzMaxim 1:e1c7c1c636af 111 if (result)
IanBenzMaxim 14:0962f818bf7f 112 result = (DS28E15_22_25::computeNextSecret(sensorNode.ds2465, pageData, sensorNode.authData.pageNum, partialSecret, sensorNode.ds28e15_22_25.romId(), sensorNode.ds28e15_22_25.manId()) == ISha256MacCoproc::Success);
IanBenzMaxim 1:e1c7c1c636af 113 // Enable authentication protection if not set
IanBenzMaxim 1:e1c7c1c636af 114 if (result && (protectionStatus != desiredProtection))
IanBenzMaxim 1:e1c7c1c636af 115 result = (sensorNode.ds28e15_22_25.writeAuthBlockProtection(sensorNode.ds2465, desiredProtection, protectionStatus) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 116 // Write initial filter life and set all other segments to default value
IanBenzMaxim 1:e1c7c1c636af 117 if (result)
IanBenzMaxim 1:e1c7c1c636af 118 {
IanBenzMaxim 1:e1c7c1c636af 119 DS28E15_22_25::Segment blankSegment;
IanBenzMaxim 1:e1c7c1c636af 120 std::memset(blankSegment, SensorNode::defaultPaddingByte, blankSegment.length);
IanBenzMaxim 6:b6bafd0a7013 121 for (size_t i = 0; i < DS28E15_22_25::segmentsPerPage; i++)
IanBenzMaxim 1:e1c7c1c636af 122 {
IanBenzMaxim 9:bc3d211d75ce 123 result = (sensorNode.ds28e15_22_25.writeAuthSegment(sensorNode.ds2465, sensorNode.authData.pageNum, i,
IanBenzMaxim 9:bc3d211d75ce 124 ((i == sensorNode.authData.segmentNum) ? sensorNode.authData.segment : blankSegment),
IanBenzMaxim 9:bc3d211d75ce 125 pageData.toSegment(i), false) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 126
IanBenzMaxim 1:e1c7c1c636af 127 if (!result)
IanBenzMaxim 1:e1c7c1c636af 128 break;
IanBenzMaxim 1:e1c7c1c636af 129 }
IanBenzMaxim 1:e1c7c1c636af 130 }
IanBenzMaxim 1:e1c7c1c636af 131
IanBenzMaxim 1:e1c7c1c636af 132 // Reload secret with known page values
IanBenzMaxim 1:e1c7c1c636af 133 // Load master secret into scratchpad
IanBenzMaxim 1:e1c7c1c636af 134 if (result)
IanBenzMaxim 1:e1c7c1c636af 135 result = (sensorNode.ds28e15_22_25.writeScratchpad(masterSecret) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 136 // Load master secret
IanBenzMaxim 1:e1c7c1c636af 137 if (result)
IanBenzMaxim 1:e1c7c1c636af 138 result = (sensorNode.ds28e15_22_25.loadSecret(false) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 139 // Read page data
IanBenzMaxim 1:e1c7c1c636af 140 if (result)
IanBenzMaxim 1:e1c7c1c636af 141 result = (sensorNode.ds28e15_22_25.readPage(sensorNode.authData.pageNum, pageData, false) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 142 // Write partial secret to scratchpad
IanBenzMaxim 1:e1c7c1c636af 143 if (result)
IanBenzMaxim 1:e1c7c1c636af 144 result = (sensorNode.ds28e15_22_25.writeScratchpad(partialSecret) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 145 // Compute secret
IanBenzMaxim 1:e1c7c1c636af 146 if (result)
IanBenzMaxim 1:e1c7c1c636af 147 result = (sensorNode.ds28e15_22_25.computeSecret(sensorNode.authData.pageNum, false) == OneWireSlave::Success);
IanBenzMaxim 1:e1c7c1c636af 148 // Configure slave secret on DS2465
IanBenzMaxim 1:e1c7c1c636af 149 if (result)
IanBenzMaxim 14:0962f818bf7f 150 result = (DS28E15_22_25::computeNextSecret(sensorNode.ds2465, pageData, sensorNode.authData.pageNum, partialSecret, sensorNode.ds28e15_22_25.romId(), sensorNode.ds28e15_22_25.manId()) == ISha256MacCoproc::Success);
IanBenzMaxim 1:e1c7c1c636af 151
IanBenzMaxim 1:e1c7c1c636af 152 return result;
IanBenzMaxim 1:e1c7c1c636af 153 }