DeepCover Embedded Security in IoT: Public-key Secured Data Paths

Dependencies:   MaximInterface

The MAXREFDES155# is an internet-of-things (IoT) embedded-security reference design, built to authenticate and control a sensing node using elliptic-curve-based public-key cryptography with control and notification from a web server.

The hardware includes an ARM® mbed™ shield and attached sensor endpoint. The shield contains a DS2476 DeepCover® ECDSA/SHA-2 coprocessor, Wifi communication, LCD push-button controls, and status LEDs. The sensor endpoint is attached to the shield using a 300mm cable and contains a DS28C36 DeepCover ECDSA/SHA-2 authenticator, IR-thermal sensor, and aiming laser for the IR sensor. The MAXREFDES155# is equipped with a standard Arduino® form-factor shield connector for immediate testing using an mbed board such as the MAX32600MBED#. The combination of these two devices represent an IoT device. Communication to the web server is accomplished with the shield Wifi circuitry. Communication from the shield to the attached sensor module is accomplished over I2C . The sensor module represents an IoT endpoint that generates small data with a requirement for message authenticity/integrity and secure on/off operational control.

The design is hierarchical with each mbed platform and shield communicating data from the sensor node to a web server that maintains a centralized log and dispatches notifications as necessary. The simplicity of this design enables rapid integration into any star-topology IoT network to provide security with the low overhead and cost provided by the ECDSA-P256 asymmetric-key and SHA-256 symmetric-key algorithms.

More information about the MAXREFDES155# is available on the Maxim Integrated website.

Committer:
IanBenzMaxim
Date:
Wed May 03 16:08:59 2017 -0500
Revision:
11:989eabe2a376
Parent:
10:71359af61af8
Child:
13:6a6225690c2e
Changed to always using scanline encoding for bitmaps.

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 #include <algorithm>
IanBenzMaxim 0:33d4e66780c0 34 #include "Bitmap.hpp"
IanBenzMaxim 0:33d4e66780c0 35
IanBenzMaxim 0:33d4e66780c0 36 static const int minWidthHeight = 1;
IanBenzMaxim 11:989eabe2a376 37 static const int pixelsPerSegment = 8;
IanBenzMaxim 0:33d4e66780c0 38
IanBenzMaxim 0:33d4e66780c0 39 template <typename T>
IanBenzMaxim 0:33d4e66780c0 40 static T divideRoundUp(const T dividend, const T divisor)
IanBenzMaxim 0:33d4e66780c0 41 {
IanBenzMaxim 0:33d4e66780c0 42 return (dividend / divisor) + (((dividend % divisor) == 0) ? 0 : 1);
IanBenzMaxim 0:33d4e66780c0 43 }
IanBenzMaxim 0:33d4e66780c0 44
IanBenzMaxim 11:989eabe2a376 45 static int calculateSegmentsPerLine(int width)
IanBenzMaxim 11:989eabe2a376 46 {
IanBenzMaxim 11:989eabe2a376 47 return divideRoundUp(width, pixelsPerSegment);
IanBenzMaxim 11:989eabe2a376 48 }
IanBenzMaxim 11:989eabe2a376 49
IanBenzMaxim 11:989eabe2a376 50 static int calculateHeight(size_t size, int width)
IanBenzMaxim 0:33d4e66780c0 51 {
IanBenzMaxim 11:989eabe2a376 52 return static_cast<int>(divideRoundUp(size, static_cast<size_t>(calculateSegmentsPerLine(width))));
IanBenzMaxim 11:989eabe2a376 53 }
IanBenzMaxim 11:989eabe2a376 54
IanBenzMaxim 11:989eabe2a376 55 static int calculateSegmentIndex(int x, int y, int width)
IanBenzMaxim 11:989eabe2a376 56 {
IanBenzMaxim 11:989eabe2a376 57 return y * calculateSegmentsPerLine(width) + x / pixelsPerSegment;
IanBenzMaxim 0:33d4e66780c0 58 }
IanBenzMaxim 0:33d4e66780c0 59
IanBenzMaxim 11:989eabe2a376 60 static int calculatePixelMask(int x)
IanBenzMaxim 0:33d4e66780c0 61 {
IanBenzMaxim 11:989eabe2a376 62 return 1 << (pixelsPerSegment - 1 - (x % pixelsPerSegment));
IanBenzMaxim 11:989eabe2a376 63 }
IanBenzMaxim 11:989eabe2a376 64
IanBenzMaxim 11:989eabe2a376 65 Bitmap::Bitmap(int width, int height) :
IanBenzMaxim 11:989eabe2a376 66 m_width(std::max(width, minWidthHeight)),
IanBenzMaxim 11:989eabe2a376 67 m_height(std::max(height, minWidthHeight)),
IanBenzMaxim 11:989eabe2a376 68 m_data(calculateSegmentsPerLine(m_width) * m_height, 0x00) { }
IanBenzMaxim 11:989eabe2a376 69
IanBenzMaxim 11:989eabe2a376 70 Bitmap::Bitmap(const uint8_t * data, size_t size, int width) :
IanBenzMaxim 11:989eabe2a376 71 m_width(std::max(width, minWidthHeight)),
IanBenzMaxim 11:989eabe2a376 72 m_height(std::max(calculateHeight(size, width), minWidthHeight)),
IanBenzMaxim 11:989eabe2a376 73 m_data(calculateSegmentsPerLine(m_width) * m_height, 0x00)
IanBenzMaxim 11:989eabe2a376 74 {
IanBenzMaxim 11:989eabe2a376 75 std::copy(data, data + size, m_data.begin());
IanBenzMaxim 0:33d4e66780c0 76 }
IanBenzMaxim 0:33d4e66780c0 77
IanBenzMaxim 0:33d4e66780c0 78 bool Bitmap::pixelEnabled(int x, int y) const
IanBenzMaxim 0:33d4e66780c0 79 {
IanBenzMaxim 11:989eabe2a376 80 bool enabled = false;
IanBenzMaxim 0:33d4e66780c0 81 if ((x >= 0) && (x < m_width) && (y >= 0) && (y < m_height))
IanBenzMaxim 0:33d4e66780c0 82 {
IanBenzMaxim 11:989eabe2a376 83 enabled = m_data[calculateSegmentIndex(x, y, m_width)] & calculatePixelMask(x);
IanBenzMaxim 0:33d4e66780c0 84 }
IanBenzMaxim 0:33d4e66780c0 85 return enabled;
IanBenzMaxim 0:33d4e66780c0 86 }
IanBenzMaxim 0:33d4e66780c0 87
IanBenzMaxim 0:33d4e66780c0 88 void Bitmap::setPixelEnabled(int x, int y, bool enabled)
IanBenzMaxim 0:33d4e66780c0 89 {
IanBenzMaxim 0:33d4e66780c0 90 if ((x >= 0) && (x < m_width) && (y >= 0) && (y < m_height))
IanBenzMaxim 0:33d4e66780c0 91 {
IanBenzMaxim 11:989eabe2a376 92 uint8_t & dataSegment = m_data[calculateSegmentIndex(x, y, m_width)];
IanBenzMaxim 11:989eabe2a376 93 uint8_t dataMask = calculatePixelMask(x);
IanBenzMaxim 0:33d4e66780c0 94 if (enabled)
IanBenzMaxim 11:989eabe2a376 95 {
IanBenzMaxim 11:989eabe2a376 96 dataSegment |= dataMask;
IanBenzMaxim 11:989eabe2a376 97 }
IanBenzMaxim 0:33d4e66780c0 98 else
IanBenzMaxim 11:989eabe2a376 99 {
IanBenzMaxim 11:989eabe2a376 100 dataSegment &= ~dataMask;
IanBenzMaxim 11:989eabe2a376 101 }
IanBenzMaxim 0:33d4e66780c0 102 }
IanBenzMaxim 0:33d4e66780c0 103 }
IanBenzMaxim 0:33d4e66780c0 104
IanBenzMaxim 11:989eabe2a376 105 void Bitmap::overlay(int x, int y, const uint8_t * data, size_t size, int width)
IanBenzMaxim 0:33d4e66780c0 106 {
IanBenzMaxim 11:989eabe2a376 107 if (width < minWidthHeight)
IanBenzMaxim 0:33d4e66780c0 108 {
IanBenzMaxim 11:989eabe2a376 109 return;
IanBenzMaxim 11:989eabe2a376 110 }
IanBenzMaxim 11:989eabe2a376 111
IanBenzMaxim 11:989eabe2a376 112 const int segmentsPerLine = calculateSegmentsPerLine(width);
IanBenzMaxim 11:989eabe2a376 113 for (size_t segment = 0; segment < size; segment++)
IanBenzMaxim 11:989eabe2a376 114 {
IanBenzMaxim 11:989eabe2a376 115 const int curY = segment / segmentsPerLine;
IanBenzMaxim 11:989eabe2a376 116 if (!((y + curY) < m_height))
IanBenzMaxim 0:33d4e66780c0 117 {
IanBenzMaxim 11:989eabe2a376 118 break;
IanBenzMaxim 11:989eabe2a376 119 }
IanBenzMaxim 11:989eabe2a376 120 for (int pixel = 0; pixel < pixelsPerSegment; pixel++)
IanBenzMaxim 11:989eabe2a376 121 {
IanBenzMaxim 11:989eabe2a376 122 const int curX = (segment % segmentsPerLine) * pixelsPerSegment + pixel;
IanBenzMaxim 11:989eabe2a376 123 if (!(((x + curX) < m_width) && (curX < width)))
IanBenzMaxim 0:33d4e66780c0 124 {
IanBenzMaxim 11:989eabe2a376 125 break;
IanBenzMaxim 0:33d4e66780c0 126 }
IanBenzMaxim 11:989eabe2a376 127 setPixelEnabled(x + curX, y + curY, data[segment] & (1 << (pixelsPerSegment - 1 - pixel)));
IanBenzMaxim 0:33d4e66780c0 128 }
IanBenzMaxim 0:33d4e66780c0 129 }
IanBenzMaxim 0:33d4e66780c0 130 }
IanBenzMaxim 10:71359af61af8 131
IanBenzMaxim 11:989eabe2a376 132 void Bitmap::overlay(int x, int y, const Bitmap & src)
IanBenzMaxim 11:989eabe2a376 133 {
IanBenzMaxim 11:989eabe2a376 134 overlay(x, y, &src.m_data[0], src.m_data.size(), src.m_width);
IanBenzMaxim 11:989eabe2a376 135 }
IanBenzMaxim 11:989eabe2a376 136
IanBenzMaxim 10:71359af61af8 137 void Bitmap::clear()
IanBenzMaxim 10:71359af61af8 138 {
IanBenzMaxim 10:71359af61af8 139 std::fill(m_data.begin(), m_data.end(), 0);
IanBenzMaxim 10:71359af61af8 140 }
IanBenzMaxim 10:71359af61af8 141
IanBenzMaxim 10:71359af61af8 142 void Bitmap::clear(int x, int y, int width, int height)
IanBenzMaxim 10:71359af61af8 143 {
IanBenzMaxim 10:71359af61af8 144 if (!((x >= 0) && (x < m_width) && (y >= 0) && (y < m_height)))
IanBenzMaxim 10:71359af61af8 145 {
IanBenzMaxim 10:71359af61af8 146 return;
IanBenzMaxim 10:71359af61af8 147 }
IanBenzMaxim 10:71359af61af8 148 if ((x + width) > m_width)
IanBenzMaxim 10:71359af61af8 149 {
IanBenzMaxim 10:71359af61af8 150 width = m_width - x;
IanBenzMaxim 10:71359af61af8 151 }
IanBenzMaxim 10:71359af61af8 152 if ((y + height) > m_height)
IanBenzMaxim 10:71359af61af8 153 {
IanBenzMaxim 10:71359af61af8 154 height = m_height - y;
IanBenzMaxim 10:71359af61af8 155 }
IanBenzMaxim 10:71359af61af8 156
IanBenzMaxim 10:71359af61af8 157 const int startX = x;
IanBenzMaxim 10:71359af61af8 158 const int startY = y;
IanBenzMaxim 11:989eabe2a376 159 while (y < (startY + height))
IanBenzMaxim 10:71359af61af8 160 {
IanBenzMaxim 11:989eabe2a376 161 x = startX;
IanBenzMaxim 11:989eabe2a376 162 while (x < (startX + width))
IanBenzMaxim 10:71359af61af8 163 {
IanBenzMaxim 11:989eabe2a376 164 if (((x % pixelsPerSegment) == 0) && ((x + pixelsPerSegment) < (startX + width)))
IanBenzMaxim 10:71359af61af8 165 {
IanBenzMaxim 11:989eabe2a376 166 m_data[calculateSegmentIndex(x, y, m_width)] = 0;
IanBenzMaxim 11:989eabe2a376 167 x += pixelsPerSegment;
IanBenzMaxim 10:71359af61af8 168 }
IanBenzMaxim 10:71359af61af8 169 else
IanBenzMaxim 10:71359af61af8 170 {
IanBenzMaxim 10:71359af61af8 171 setPixelEnabled(x, y, false);
IanBenzMaxim 11:989eabe2a376 172 x++;
IanBenzMaxim 10:71359af61af8 173 }
IanBenzMaxim 10:71359af61af8 174 }
IanBenzMaxim 11:989eabe2a376 175 y++;
IanBenzMaxim 10:71359af61af8 176 }
IanBenzMaxim 10:71359af61af8 177 }