This package includes the SharkSSL lite library and header files.

Dependents:   WebSocket-Client-Example SharkMQ-LED-Demo

SharkSSL-Lite

Description: SharkSSL is an SSL v3.0 TLS v1.0/1.1/1.2 implementation of the TLS and SSL protocol standard. With its array of compile-time options and Raycrypto proprietary cryptographic algorithms, SharkSSL can be fine-tuned to a footprint that occupies less than 20 kB, while maintaining full x.509 authentication. The SharkSSL-Lite download includes a subset of SharkSSL and header files made for use in non-commercial and for evaluation purposes.

Features

Examples

Limitations

SharkSSL-Lite includes a limited set of ciphers. To use SharkSSL-Lite, the peer side must support Elliptic Curve Cryptography (ECC) and you must use ECC certificates. The peer side must also support the new ChaCha20/Poly1305 cipher combination.

ChaCha20 and Poly1305 for TLS is published RFC 7905. The development of this new cipher was a response to many attacks discovered against other widely used TLS cipher suites. ChaCha20 is the cipher and Poly1305 is an authenticated encryption mode.

SharkSSL-Lite occupies less than 20kB, while maintaining full x.509 authentication. The ChaCha20/Poly1305 cipher software implementation is equally as fast as many hardware accelerated AES engines.

Creating ECC Certificates for SharkSSL-Lite

The following video shows how to create an Elliptic Curve Cryptography (ECC) certificate for a server, how to install the certificate in the server, and how to make the mbed clients connecting to the server trust this certificate. The server in this video is installed on a private/personal computer on a private network for test purposes. The video was produced for the embedded.com article How to run your own secure IoT cloud server.

Committer:
wini
Date:
Mon May 23 13:56:30 2016 +0000
Revision:
1:d5e0e1dcf0d6
Parent:
0:e0adec41ad6b
Type conflict fix (U8-U32) for latest mbed release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wini 0:e0adec41ad6b 1 /*
wini 0:e0adec41ad6b 2 * ____ _________ __ _
wini 0:e0adec41ad6b 3 * / __ \___ ____ _/ /_ __(_)___ ___ ___ / / ____ ____ _(_)____
wini 0:e0adec41ad6b 4 * / /_/ / _ \/ __ `/ / / / / / __ `__ \/ _ \/ / / __ \/ __ `/ / ___/
wini 0:e0adec41ad6b 5 * / _, _/ __/ /_/ / / / / / / / / / / / __/ /___/ /_/ / /_/ / / /__
wini 0:e0adec41ad6b 6 * /_/ |_|\___/\__,_/_/ /_/ /_/_/ /_/ /_/\___/_____/\____/\__, /_/\___/
wini 0:e0adec41ad6b 7 * /____/
wini 0:e0adec41ad6b 8 ****************************************************************************
wini 0:e0adec41ad6b 9 * HEADER
wini 0:e0adec41ad6b 10 *
wini 0:e0adec41ad6b 11 * $Id: SingleList.h 3215 2013-11-29 14:43:17Z wini $
wini 0:e0adec41ad6b 12 *
wini 0:e0adec41ad6b 13 * COPYRIGHT: Real Time Logic, 2002
wini 0:e0adec41ad6b 14 *
wini 0:e0adec41ad6b 15 * This software is copyrighted by and is the sole property of Real
wini 0:e0adec41ad6b 16 * Time Logic LLC. All rights, title, ownership, or other interests in
wini 0:e0adec41ad6b 17 * the software remain the property of Real Time Logic LLC. This
wini 0:e0adec41ad6b 18 * software may only be used in accordance with the terms and
wini 0:e0adec41ad6b 19 * conditions stipulated in the corresponding license agreement under
wini 0:e0adec41ad6b 20 * which the software has been supplied. Any unauthorized use,
wini 0:e0adec41ad6b 21 * duplication, transmission, distribution, or disclosure of this
wini 0:e0adec41ad6b 22 * software is expressly forbidden.
wini 0:e0adec41ad6b 23 *
wini 0:e0adec41ad6b 24 * This Copyright notice may not be removed or modified without prior
wini 0:e0adec41ad6b 25 * written consent of Real Time Logic LLC.
wini 0:e0adec41ad6b 26 *
wini 0:e0adec41ad6b 27 * Real Time Logic LLC. reserves the right to modify this software
wini 0:e0adec41ad6b 28 * without notice.
wini 0:e0adec41ad6b 29 *
wini 0:e0adec41ad6b 30 * http://www.realtimelogic.com
wini 0:e0adec41ad6b 31 ****************************************************************************
wini 0:e0adec41ad6b 32
wini 0:e0adec41ad6b 33 CONTENTS
wini 0:e0adec41ad6b 34 --------
wini 0:e0adec41ad6b 35
wini 0:e0adec41ad6b 36 1 Description
wini 0:e0adec41ad6b 37 2 History of developmentDoubleLink
wini 0:e0adec41ad6b 38 3 Macros
wini 0:e0adec41ad6b 39 4 Include files
wini 0:e0adec41ad6b 40 5 types Constants Variables
wini 0:e0adec41ad6b 41 6 Function prototypes
wini 0:e0adec41ad6b 42
wini 0:e0adec41ad6b 43 ****************************************************************************
wini 0:e0adec41ad6b 44 */
wini 0:e0adec41ad6b 45 #ifndef _SingleList_h
wini 0:e0adec41ad6b 46 #define _SingleList_h
wini 0:e0adec41ad6b 47
wini 0:e0adec41ad6b 48 /*
wini 0:e0adec41ad6b 49 ****************************************************************************
wini 0:e0adec41ad6b 50 * 1 DESCRIPTION.
wini 0:e0adec41ad6b 51 ****************************************************************************
wini 0:e0adec41ad6b 52 *
wini 0:e0adec41ad6b 53 */
wini 0:e0adec41ad6b 54
wini 0:e0adec41ad6b 55 /*
wini 0:e0adec41ad6b 56 ****************************************************************************
wini 0:e0adec41ad6b 57 *
wini 0:e0adec41ad6b 58 */
wini 0:e0adec41ad6b 59
wini 0:e0adec41ad6b 60 /*
wini 0:e0adec41ad6b 61 ****************************************************************************
wini 0:e0adec41ad6b 62 * 3 MACROS.
wini 0:e0adec41ad6b 63 ****************************************************************************
wini 0:e0adec41ad6b 64 */
wini 0:e0adec41ad6b 65
wini 0:e0adec41ad6b 66 /*
wini 0:e0adec41ad6b 67 ****************************************************************************
wini 0:e0adec41ad6b 68 * 4 INCLUDE FILES.
wini 0:e0adec41ad6b 69 ****************************************************************************
wini 0:e0adec41ad6b 70 */
wini 0:e0adec41ad6b 71 #include <TargConfig.h>
wini 0:e0adec41ad6b 72
wini 0:e0adec41ad6b 73
wini 0:e0adec41ad6b 74 /*
wini 0:e0adec41ad6b 75 ****************************************************************************
wini 0:e0adec41ad6b 76 * 5 TYPES CONSTANTS VARIABLES
wini 0:e0adec41ad6b 77 ****************************************************************************
wini 0:e0adec41ad6b 78 */
wini 0:e0adec41ad6b 79
wini 0:e0adec41ad6b 80 /*Forward declarations*/
wini 0:e0adec41ad6b 81 struct SingleList;
wini 0:e0adec41ad6b 82 struct SingleListEnumerator;
wini 0:e0adec41ad6b 83
wini 0:e0adec41ad6b 84 /*===========================================================================
wini 0:e0adec41ad6b 85 *
wini 0:e0adec41ad6b 86 * Class: SingleLink
wini 0:e0adec41ad6b 87 *---------------------------------------------------------------------------
wini 0:e0adec41ad6b 88 * Description:
wini 0:e0adec41ad6b 89 * Contains the link chain for the next element in the SingleList. Subclass
wini 0:e0adec41ad6b 90 * o link for data stored in the SingleList.
wini 0:e0adec41ad6b 91 * Note, o class contains no virtual destructor and the subclassed node
wini 0:e0adec41ad6b 92 * will not be informed when the node is deleted.
wini 0:e0adec41ad6b 93 */
wini 0:e0adec41ad6b 94 typedef struct SingleLink
wini 0:e0adec41ad6b 95 {
wini 0:e0adec41ad6b 96 #ifdef __cplusplus
wini 0:e0adec41ad6b 97 SingleLink();
wini 0:e0adec41ad6b 98 SingleLink* getNext();
wini 0:e0adec41ad6b 99 private:
wini 0:e0adec41ad6b 100 friend struct SingleList;
wini 0:e0adec41ad6b 101 friend struct SingleListEnumerator;
wini 0:e0adec41ad6b 102 #endif
wini 0:e0adec41ad6b 103 struct SingleLink* next;
wini 0:e0adec41ad6b 104 } SingleLink;
wini 0:e0adec41ad6b 105 #define SingleLink_constructor(o) ((SingleLink*)(o))->next = 0
wini 0:e0adec41ad6b 106 #define SingleLink_getNext(o) ((SingleLink*)(o))->next
wini 0:e0adec41ad6b 107 #define SingleLink_isLinked(o) \
wini 0:e0adec41ad6b 108 (((SingleLink*)o)->next ? TRUE : FALSE)
wini 0:e0adec41ad6b 109
wini 0:e0adec41ad6b 110 #ifdef __cplusplus
wini 0:e0adec41ad6b 111 inline SingleLink::SingleLink() {SingleLink_constructor(this);}
wini 0:e0adec41ad6b 112 inline SingleLink* SingleLink::getNext() {return SingleLink_getNext(this);}
wini 0:e0adec41ad6b 113 #endif
wini 0:e0adec41ad6b 114
wini 0:e0adec41ad6b 115 /*===========================================================================
wini 0:e0adec41ad6b 116 *
wini 0:e0adec41ad6b 117 * Class: SingleList
wini 0:e0adec41ad6b 118 *---------------------------------------------------------------------------
wini 0:e0adec41ad6b 119 * Description:
wini 0:e0adec41ad6b 120 * Contains nodes of type SingleLink.
wini 0:e0adec41ad6b 121 */
wini 0:e0adec41ad6b 122 typedef struct SingleList
wini 0:e0adec41ad6b 123 {
wini 0:e0adec41ad6b 124 #ifdef __cplusplus
wini 0:e0adec41ad6b 125 SingleList();
wini 0:e0adec41ad6b 126 void insertLast(SingleLink* link);
wini 0:e0adec41ad6b 127 SingleLink* removeFirst();
wini 0:e0adec41ad6b 128 SingleLink* peekFirst();
wini 0:e0adec41ad6b 129 bool isEmpty();
wini 0:e0adec41ad6b 130 bool isLast(SingleLink* link);
wini 0:e0adec41ad6b 131 private:
wini 0:e0adec41ad6b 132 friend struct SingleListEnumerator;
wini 0:e0adec41ad6b 133 #endif
wini 0:e0adec41ad6b 134 SingleLink link;
wini 0:e0adec41ad6b 135 SingleLink* last;
wini 0:e0adec41ad6b 136 } SingleList;
wini 0:e0adec41ad6b 137
wini 0:e0adec41ad6b 138 #define SingleList_insertLast(o, linkMA) do \
wini 0:e0adec41ad6b 139 { \
wini 0:e0adec41ad6b 140 baAssert((SingleLink*)(linkMA) != (SingleLink*)(o)); \
wini 0:e0adec41ad6b 141 baAssert(((SingleLink*)(linkMA))->next == 0); \
wini 0:e0adec41ad6b 142 (o)->last->next = (SingleLink*)(linkMA); \
wini 0:e0adec41ad6b 143 (o)->last = (SingleLink*)(linkMA); \
wini 0:e0adec41ad6b 144 ((SingleLink*)(linkMA))->next = (SingleLink*)(o); \
wini 0:e0adec41ad6b 145 } while(0)
wini 0:e0adec41ad6b 146
wini 0:e0adec41ad6b 147 #define SingleList_peekFirst(o) ((o)->link.next == (SingleLink*)(o) ? 0 : (o)->link.next)
wini 0:e0adec41ad6b 148
wini 0:e0adec41ad6b 149 #define SingleList_isEmpty(o) ((o)->link.next == (SingleLink*)(o))
wini 0:e0adec41ad6b 150 #define SingleList_isLast(o, n) ((n)->next == (SingleLink*)(o))
wini 0:e0adec41ad6b 151
wini 0:e0adec41ad6b 152 #ifdef __cplusplus
wini 0:e0adec41ad6b 153 extern "C" {
wini 0:e0adec41ad6b 154 #endif
wini 0:e0adec41ad6b 155 BA_API void SingleList_constructor(SingleList* o);
wini 0:e0adec41ad6b 156 BA_API SingleLink* SingleList_removeFirst(SingleList* o);
wini 0:e0adec41ad6b 157 #ifdef __cplusplus
wini 0:e0adec41ad6b 158 }
wini 0:e0adec41ad6b 159 inline
wini 0:e0adec41ad6b 160 SingleList::SingleList() { SingleList_constructor(this); }
wini 0:e0adec41ad6b 161 inline void
wini 0:e0adec41ad6b 162 SingleList::insertLast(SingleLink* link) { SingleList_insertLast(this, link); }
wini 0:e0adec41ad6b 163 inline SingleLink*
wini 0:e0adec41ad6b 164 SingleList::peekFirst() { return SingleList_peekFirst(this); }
wini 0:e0adec41ad6b 165 inline bool
wini 0:e0adec41ad6b 166 SingleList::isEmpty() { return SingleList_isEmpty(this); }
wini 0:e0adec41ad6b 167 inline bool
wini 0:e0adec41ad6b 168 SingleList::isLast(SingleLink* link) { return SingleList_isLast(this,link); }
wini 0:e0adec41ad6b 169 inline SingleLink*
wini 0:e0adec41ad6b 170 SingleList::removeFirst() { return SingleList_removeFirst(this); }
wini 0:e0adec41ad6b 171 #endif
wini 0:e0adec41ad6b 172
wini 0:e0adec41ad6b 173 /*===========================================================================
wini 0:e0adec41ad6b 174 *
wini 0:e0adec41ad6b 175 * Class: SingleListEnumerator
wini 0:e0adec41ad6b 176 *---------------------------------------------------------------------------
wini 0:e0adec41ad6b 177 * Description:
wini 0:e0adec41ad6b 178 * Usage:
wini 0:e0adec41ad6b 179 * SingleListEnumerator e(list);
wini 0:e0adec41ad6b 180 * for(Slink* link = e.getElement() ; link ; link = e.nextElement())
wini 0:e0adec41ad6b 181 * or
wini 0:e0adec41ad6b 182 * SingleListEnumerator e(list);
wini 0:e0adec41ad6b 183 * Slink* link = e.getElement();
wini 0:e0adec41ad6b 184 * while(link)
wini 0:e0adec41ad6b 185 * {
wini 0:e0adec41ad6b 186 * if(link bla bla)
wini 0:e0adec41ad6b 187 * //Deletes current element and returns next element
wini 0:e0adec41ad6b 188 * link = e.deleteElement();
wini 0:e0adec41ad6b 189 * else
wini 0:e0adec41ad6b 190 * link = e.nextElement();
wini 0:e0adec41ad6b 191 * }
wini 0:e0adec41ad6b 192 */
wini 0:e0adec41ad6b 193 typedef struct SingleListEnumerator
wini 0:e0adec41ad6b 194 {
wini 0:e0adec41ad6b 195 #ifdef __cplusplus
wini 0:e0adec41ad6b 196 SingleListEnumerator(){}
wini 0:e0adec41ad6b 197 SingleListEnumerator(SingleList* list);
wini 0:e0adec41ad6b 198 SingleLink* getElement();
wini 0:e0adec41ad6b 199 SingleLink* nextElement();
wini 0:e0adec41ad6b 200 SingleLink* removeElement();
wini 0:e0adec41ad6b 201 int insertBefore(SingleLink* l);
wini 0:e0adec41ad6b 202 private:
wini 0:e0adec41ad6b 203 #endif
wini 0:e0adec41ad6b 204 SingleList* list;
wini 0:e0adec41ad6b 205 SingleLink* prevElement;
wini 0:e0adec41ad6b 206 SingleLink* curElement;
wini 0:e0adec41ad6b 207 } SingleListEnumerator;
wini 0:e0adec41ad6b 208
wini 0:e0adec41ad6b 209 #define SingleListEnumerator_constructor(o, listMA) do \
wini 0:e0adec41ad6b 210 { \
wini 0:e0adec41ad6b 211 (o)->list = listMA; \
wini 0:e0adec41ad6b 212 (o)->prevElement = (SingleLink*)listMA; \
wini 0:e0adec41ad6b 213 (o)->curElement = SingleList_isEmpty(listMA) ? 0 : (o)->list->link.next; \
wini 0:e0adec41ad6b 214 } while(0)
wini 0:e0adec41ad6b 215
wini 0:e0adec41ad6b 216 #define SingleListEnumerator_getElement(o) (o)->curElement
wini 0:e0adec41ad6b 217
wini 0:e0adec41ad6b 218 #define SingleListEnumerator_nextElement(o) \
wini 0:e0adec41ad6b 219 ((o)->curElement ? ( \
wini 0:e0adec41ad6b 220 (o)->prevElement = (o)->prevElement->next, \
wini 0:e0adec41ad6b 221 (o)->curElement = (o)->curElement == (o)->list->last ? 0 : (o)->curElement->next, \
wini 0:e0adec41ad6b 222 (o)->curElement \
wini 0:e0adec41ad6b 223 ) : 0)
wini 0:e0adec41ad6b 224
wini 0:e0adec41ad6b 225 #ifdef __cplusplus
wini 0:e0adec41ad6b 226 extern "C" {
wini 0:e0adec41ad6b 227 #endif
wini 0:e0adec41ad6b 228 BA_API int SingleListEnumerator_insertBefore(
wini 0:e0adec41ad6b 229 SingleListEnumerator*, SingleLink*);
wini 0:e0adec41ad6b 230 BA_API SingleLink* SingleListEnumerator_removeElement(SingleListEnumerator* o);
wini 0:e0adec41ad6b 231 #ifdef __cplusplus
wini 0:e0adec41ad6b 232 }
wini 0:e0adec41ad6b 233 inline SingleListEnumerator::SingleListEnumerator(SingleList* list) {
wini 0:e0adec41ad6b 234 SingleListEnumerator_constructor(this, list); }
wini 0:e0adec41ad6b 235 inline SingleLink*
wini 0:e0adec41ad6b 236 SingleListEnumerator::removeElement() {
wini 0:e0adec41ad6b 237 return SingleListEnumerator_removeElement(this); }
wini 0:e0adec41ad6b 238 inline SingleLink*
wini 0:e0adec41ad6b 239 SingleListEnumerator::getElement() {return SingleListEnumerator_getElement(this);}
wini 0:e0adec41ad6b 240 inline SingleLink*
wini 0:e0adec41ad6b 241 SingleListEnumerator::nextElement() {return SingleListEnumerator_nextElement(this); }
wini 0:e0adec41ad6b 242 inline int SingleListEnumerator::insertBefore(SingleLink* l) {
wini 0:e0adec41ad6b 243 return SingleListEnumerator_insertBefore(this, l); }
wini 0:e0adec41ad6b 244 #endif
wini 0:e0adec41ad6b 245
wini 0:e0adec41ad6b 246
wini 0:e0adec41ad6b 247 #endif /*_SingleList_h*/
wini 0:e0adec41ad6b 248
wini 0:e0adec41ad6b 249
wini 0:e0adec41ad6b 250 #if defined(SingleListCode) && ! defined(SingleListCodeIncluded)
wini 0:e0adec41ad6b 251 #define SingleListCodeIncluded
wini 0:e0adec41ad6b 252
wini 0:e0adec41ad6b 253 BA_API void
wini 0:e0adec41ad6b 254 SingleList_constructor(SingleList* o)
wini 0:e0adec41ad6b 255 {
wini 0:e0adec41ad6b 256 SingleLink_constructor((SingleLink*)o);
wini 0:e0adec41ad6b 257 o->last = ((SingleLink*)o);
wini 0:e0adec41ad6b 258 o->last->next = ((SingleLink*)o);
wini 0:e0adec41ad6b 259 o->link.next = ((SingleLink*)o);
wini 0:e0adec41ad6b 260 }
wini 0:e0adec41ad6b 261
wini 0:e0adec41ad6b 262
wini 0:e0adec41ad6b 263 BA_API int
wini 0:e0adec41ad6b 264 SingleListEnumerator_insertBefore(SingleListEnumerator* o, SingleLink* l)
wini 0:e0adec41ad6b 265 {
wini 0:e0adec41ad6b 266 if(l->next)
wini 0:e0adec41ad6b 267 return -1;
wini 0:e0adec41ad6b 268
wini 0:e0adec41ad6b 269 if(SingleList_isEmpty(o->list))
wini 0:e0adec41ad6b 270 SingleList_insertLast(o->list, l);
wini 0:e0adec41ad6b 271 else
wini 0:e0adec41ad6b 272 {
wini 0:e0adec41ad6b 273 l->next = o->prevElement->next;
wini 0:e0adec41ad6b 274 o->prevElement->next = l;
wini 0:e0adec41ad6b 275 }
wini 0:e0adec41ad6b 276 o->prevElement = l;
wini 0:e0adec41ad6b 277 return 0;
wini 0:e0adec41ad6b 278 }
wini 0:e0adec41ad6b 279
wini 0:e0adec41ad6b 280
wini 0:e0adec41ad6b 281 BA_API SingleLink*
wini 0:e0adec41ad6b 282 SingleListEnumerator_removeElement(SingleListEnumerator* o)
wini 0:e0adec41ad6b 283 {
wini 0:e0adec41ad6b 284 if(o->curElement)
wini 0:e0adec41ad6b 285 {
wini 0:e0adec41ad6b 286 /*Store current position and iterate iterator*/
wini 0:e0adec41ad6b 287 SingleLink* cur = o->curElement;
wini 0:e0adec41ad6b 288 /*If element to remove is last element in list*/
wini 0:e0adec41ad6b 289 if(cur == o->list->last)
wini 0:e0adec41ad6b 290 {
wini 0:e0adec41ad6b 291 o->curElement = 0;
wini 0:e0adec41ad6b 292 o->list->last = o->prevElement;
wini 0:e0adec41ad6b 293 o->prevElement->next = (SingleLink*)o->list;
wini 0:e0adec41ad6b 294 }
wini 0:e0adec41ad6b 295 else
wini 0:e0adec41ad6b 296 {
wini 0:e0adec41ad6b 297 o->curElement = o->curElement->next;
wini 0:e0adec41ad6b 298 o->prevElement->next = o->curElement;
wini 0:e0adec41ad6b 299 }
wini 0:e0adec41ad6b 300 cur->next = 0;
wini 0:e0adec41ad6b 301 }
wini 0:e0adec41ad6b 302 return o->curElement;
wini 0:e0adec41ad6b 303 }
wini 0:e0adec41ad6b 304
wini 0:e0adec41ad6b 305
wini 0:e0adec41ad6b 306 BA_API SingleLink*
wini 0:e0adec41ad6b 307 SingleList_removeFirst(SingleList* o)
wini 0:e0adec41ad6b 308 {
wini 0:e0adec41ad6b 309 SingleLink* link2Remove;
wini 0:e0adec41ad6b 310 link2Remove = o->link.next;
wini 0:e0adec41ad6b 311 if(o->link.next == o->last)
wini 0:e0adec41ad6b 312 {
wini 0:e0adec41ad6b 313 if(o->link.next == (SingleLink*)o)
wini 0:e0adec41ad6b 314 return 0;
wini 0:e0adec41ad6b 315 o->link.next = o->last = (SingleLink*)o;
wini 0:e0adec41ad6b 316 }
wini 0:e0adec41ad6b 317 else
wini 0:e0adec41ad6b 318 o->link.next = o->link.next->next;
wini 0:e0adec41ad6b 319 link2Remove->next = 0;
wini 0:e0adec41ad6b 320 return link2Remove;
wini 0:e0adec41ad6b 321 }
wini 0:e0adec41ad6b 322
wini 0:e0adec41ad6b 323 #endif /* SingleListCode */