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 * SharkSSL Embedded SSL/TLS Stack
wini 0:e0adec41ad6b 10 ****************************************************************************
wini 0:e0adec41ad6b 11 * PROGRAM MODULE
wini 0:e0adec41ad6b 12 *
wini 0:e0adec41ad6b 13 * $Id: SharkSslCrypto.h 3686 2015-04-27 06:35:45Z gianluca $
wini 0:e0adec41ad6b 14 *
wini 0:e0adec41ad6b 15 * COPYRIGHT: Real Time Logic LLC, 2010 - 2013
wini 0:e0adec41ad6b 16 *
wini 0:e0adec41ad6b 17 * This software is copyrighted by and is the sole property of Real
wini 0:e0adec41ad6b 18 * Time Logic LLC. All rights, title, ownership, or other interests in
wini 0:e0adec41ad6b 19 * the software remain the property of Real Time Logic LLC. This
wini 0:e0adec41ad6b 20 * software may only be used in accordance with the terms and
wini 0:e0adec41ad6b 21 * conditions stipulated in the corresponding license agreement under
wini 0:e0adec41ad6b 22 * which the software has been supplied. Any unauthorized use,
wini 0:e0adec41ad6b 23 * duplication, transmission, distribution, or disclosure of this
wini 0:e0adec41ad6b 24 * software is expressly forbidden.
wini 0:e0adec41ad6b 25 *
wini 0:e0adec41ad6b 26 * This Copyright notice may not be removed or modified without prior
wini 0:e0adec41ad6b 27 * written consent of Real Time Logic LLC.
wini 0:e0adec41ad6b 28 *
wini 0:e0adec41ad6b 29 * Real Time Logic LLC. reserves the right to modify this software
wini 0:e0adec41ad6b 30 * without notice.
wini 0:e0adec41ad6b 31 *
wini 0:e0adec41ad6b 32 * http://www.realtimelogic.com
wini 0:e0adec41ad6b 33 * http://www.sharkssl.com
wini 0:e0adec41ad6b 34 ****************************************************************************
wini 0:e0adec41ad6b 35 *
wini 0:e0adec41ad6b 36 */
wini 0:e0adec41ad6b 37 #ifndef _SharkSslCrypto_h
wini 0:e0adec41ad6b 38 #define _SharkSslCrypto_h
wini 0:e0adec41ad6b 39
wini 0:e0adec41ad6b 40 #define SHARKSSL_LIB 1
wini 0:e0adec41ad6b 41 #include "SharkSSL.h"
wini 0:e0adec41ad6b 42
wini 0:e0adec41ad6b 43
wini 0:e0adec41ad6b 44 #define SHARKSSL_MD5_HASH_LEN 16
wini 0:e0adec41ad6b 45 #define SHARKSSL_SHA1_HASH_LEN 20
wini 0:e0adec41ad6b 46 #define SHARKSSL_SHA256_HASH_LEN 32
wini 0:e0adec41ad6b 47 #define SHARKSSL_SHA384_HASH_LEN 48
wini 0:e0adec41ad6b 48 #define SHARKSSL_SHA512_HASH_LEN 64
wini 0:e0adec41ad6b 49 #define SHARKSSL_POLY1305_HASH_LEN 16
wini 0:e0adec41ad6b 50
wini 0:e0adec41ad6b 51
wini 0:e0adec41ad6b 52 #if SHARKSSL_USE_MD5
wini 0:e0adec41ad6b 53 /** MD5
wini 0:e0adec41ad6b 54 \ingroup RayCryptoMD5
wini 0:e0adec41ad6b 55 */
wini 0:e0adec41ad6b 56 typedef struct SharkSslMd5Ctx
wini 0:e0adec41ad6b 57 {
wini 0:e0adec41ad6b 58 U32 total[2];
wini 0:e0adec41ad6b 59 U32 state[4];
wini 0:e0adec41ad6b 60 U8 buffer[64];
wini 0:e0adec41ad6b 61 } SharkSslMd5Ctx;
wini 0:e0adec41ad6b 62 #endif
wini 0:e0adec41ad6b 63
wini 0:e0adec41ad6b 64
wini 0:e0adec41ad6b 65 #if SHARKSSL_USE_SHA1
wini 0:e0adec41ad6b 66 /** SHA1
wini 0:e0adec41ad6b 67 \ingroup RayCryptoSHA1
wini 0:e0adec41ad6b 68 */
wini 0:e0adec41ad6b 69 typedef struct SharkSslSha1Ctx
wini 0:e0adec41ad6b 70 {
wini 0:e0adec41ad6b 71 U32 total[2];
wini 0:e0adec41ad6b 72 U32 state[5];
wini 0:e0adec41ad6b 73 U8 buffer[64];
wini 0:e0adec41ad6b 74 } SharkSslSha1Ctx;
wini 0:e0adec41ad6b 75 #endif
wini 0:e0adec41ad6b 76
wini 0:e0adec41ad6b 77
wini 0:e0adec41ad6b 78 #if SHARKSSL_USE_SHA_256
wini 0:e0adec41ad6b 79 /** SHA256
wini 0:e0adec41ad6b 80 \ingroup RayCryptoSHA256
wini 0:e0adec41ad6b 81 */
wini 0:e0adec41ad6b 82 typedef struct SharkSslSha256Ctx
wini 0:e0adec41ad6b 83 {
wini 0:e0adec41ad6b 84 U32 total[2];
wini 0:e0adec41ad6b 85 U32 state[8];
wini 0:e0adec41ad6b 86 U8 buffer[64];
wini 0:e0adec41ad6b 87 } SharkSslSha256Ctx;
wini 0:e0adec41ad6b 88 #endif
wini 0:e0adec41ad6b 89
wini 0:e0adec41ad6b 90
wini 0:e0adec41ad6b 91 #if (SHARKSSL_USE_SHA_384 || SHARKSSL_USE_SHA_512)
wini 0:e0adec41ad6b 92 /** SHA384
wini 0:e0adec41ad6b 93 \ingroup RayCryptoSHA384
wini 0:e0adec41ad6b 94 */
wini 0:e0adec41ad6b 95 typedef struct SharkSslSha384Ctx
wini 0:e0adec41ad6b 96 {
wini 0:e0adec41ad6b 97 U32 total[4];
wini 0:e0adec41ad6b 98 U64 state[8];
wini 0:e0adec41ad6b 99 U8 buffer[128];
wini 0:e0adec41ad6b 100 } SharkSslSha384Ctx;
wini 0:e0adec41ad6b 101 #endif
wini 0:e0adec41ad6b 102
wini 0:e0adec41ad6b 103
wini 0:e0adec41ad6b 104 #if SHARKSSL_USE_SHA_512
wini 0:e0adec41ad6b 105 /** SHA512
wini 0:e0adec41ad6b 106 \ingroup RayCryptoSHA512
wini 0:e0adec41ad6b 107 */
wini 0:e0adec41ad6b 108 typedef struct SharkSslSha384Ctx SharkSslSha512Ctx;
wini 0:e0adec41ad6b 109 #endif
wini 0:e0adec41ad6b 110
wini 0:e0adec41ad6b 111
wini 0:e0adec41ad6b 112 #if SHARKSSL_USE_POLY1305
wini 0:e0adec41ad6b 113 /** POLY1305
wini 0:e0adec41ad6b 114 \ingroup RayCryptoPOLY1305
wini 0:e0adec41ad6b 115 */
wini 0:e0adec41ad6b 116 typedef struct SharkSslPoly1305Ctx
wini 0:e0adec41ad6b 117 {
wini 0:e0adec41ad6b 118 U32 r[5];
wini 0:e0adec41ad6b 119 U32 key[4];
wini 0:e0adec41ad6b 120 U32 nonce[4];
wini 0:e0adec41ad6b 121 U8 buffer[16];
wini 0:e0adec41ad6b 122 U8 flag, blen;
wini 0:e0adec41ad6b 123 } SharkSslPoly1305Ctx;
wini 0:e0adec41ad6b 124 #endif
wini 0:e0adec41ad6b 125
wini 0:e0adec41ad6b 126
wini 0:e0adec41ad6b 127 #if SHARKSSL_USE_CHACHA20
wini 0:e0adec41ad6b 128 /** CHACHA20
wini 0:e0adec41ad6b 129 \ingroup RayCryptoCHACHA20
wini 0:e0adec41ad6b 130 */
wini 0:e0adec41ad6b 131 typedef struct
wini 0:e0adec41ad6b 132 {
wini 0:e0adec41ad6b 133 U32 state[16];
wini 0:e0adec41ad6b 134 } SharkSslChaChaCtx;
wini 0:e0adec41ad6b 135 #endif
wini 0:e0adec41ad6b 136
wini 0:e0adec41ad6b 137
wini 0:e0adec41ad6b 138 #if SHARKSSL_USE_ARC4
wini 0:e0adec41ad6b 139 /** ARC4
wini 0:e0adec41ad6b 140 \ingroup RayCryptoARC4
wini 0:e0adec41ad6b 141 */
wini 0:e0adec41ad6b 142 typedef struct SharkSslArc4Ctx
wini 0:e0adec41ad6b 143 {
wini 0:e0adec41ad6b 144 U8 x;
wini 0:e0adec41ad6b 145 U8 y;
wini 0:e0adec41ad6b 146 U8 b[256];
wini 0:e0adec41ad6b 147 } SharkSslArc4Ctx;
wini 0:e0adec41ad6b 148 #endif
wini 0:e0adec41ad6b 149
wini 0:e0adec41ad6b 150
wini 0:e0adec41ad6b 151 #if (SHARKSSL_USE_DES || SHARKSSL_USE_3DES)
wini 0:e0adec41ad6b 152 /** DES
wini 0:e0adec41ad6b 153 \ingroup RayCryptoDES
wini 0:e0adec41ad6b 154 */
wini 0:e0adec41ad6b 155 typedef struct SharkSslDesCtx
wini 0:e0adec41ad6b 156 {
wini 0:e0adec41ad6b 157 #if SHARKSSL_NOPACK
wini 0:e0adec41ad6b 158 U32 key[96]; /* Max size == 3DES */
wini 0:e0adec41ad6b 159 U8 tdea;
wini 0:e0adec41ad6b 160 #else
wini 0:e0adec41ad6b 161
wini 0:e0adec41ad6b 162 #if (SHARKSSL_USE_CAU || SHARKSSL_USE_MMCAU)
wini 0:e0adec41ad6b 163 #if SHARKSSL_USE_3DES
wini 0:e0adec41ad6b 164 U32 key[6];
wini 0:e0adec41ad6b 165 #else
wini 0:e0adec41ad6b 166 U32 key[2];
wini 0:e0adec41ad6b 167 #endif
wini 0:e0adec41ad6b 168
wini 0:e0adec41ad6b 169 #else
wini 0:e0adec41ad6b 170
wini 0:e0adec41ad6b 171 #if SHARKSSL_USE_3DES
wini 0:e0adec41ad6b 172 U32 key[96];
wini 0:e0adec41ad6b 173 #else
wini 0:e0adec41ad6b 174 U32 key[32];
wini 0:e0adec41ad6b 175 #endif
wini 0:e0adec41ad6b 176 #endif
wini 0:e0adec41ad6b 177
wini 0:e0adec41ad6b 178 #if (SHARKSSL_USE_DES && SHARKSSL_USE_3DES)
wini 0:e0adec41ad6b 179 U8 tdea;
wini 0:e0adec41ad6b 180 #endif
wini 0:e0adec41ad6b 181
wini 0:e0adec41ad6b 182 #endif
wini 0:e0adec41ad6b 183 } SharkSslDesCtx;
wini 0:e0adec41ad6b 184
wini 0:e0adec41ad6b 185
wini 0:e0adec41ad6b 186 /* Encrypt/decrypt type */
wini 0:e0adec41ad6b 187 typedef enum
wini 0:e0adec41ad6b 188 {
wini 0:e0adec41ad6b 189 SharkSslDesCtx_Decrypt, /*!< Decrypt */
wini 0:e0adec41ad6b 190 SharkSslDesCtx_Encrypt /*!< Encrypt */
wini 0:e0adec41ad6b 191 } SharkSslDesCtx_Type;
wini 0:e0adec41ad6b 192 #endif
wini 0:e0adec41ad6b 193
wini 0:e0adec41ad6b 194
wini 0:e0adec41ad6b 195 #if (SHARKSSL_USE_AES_256 || SHARKSSL_USE_AES_192 || SHARKSSL_USE_AES_128)
wini 0:e0adec41ad6b 196 /** AES
wini 0:e0adec41ad6b 197 \ingroup RayCryptoAES
wini 0:e0adec41ad6b 198 */
wini 0:e0adec41ad6b 199 typedef struct SharkSslAesCtx
wini 0:e0adec41ad6b 200 {
wini 0:e0adec41ad6b 201 #if (SHARKSSL_USE_AES_256 || SHARKSSL_NOPACK)
wini 0:e0adec41ad6b 202 U32 key[60];
wini 0:e0adec41ad6b 203 #elif SHARKSSL_USE_AES_192
wini 0:e0adec41ad6b 204 U32 key[52];
wini 0:e0adec41ad6b 205 #else
wini 0:e0adec41ad6b 206 U32 key[44];
wini 0:e0adec41ad6b 207 #endif
wini 0:e0adec41ad6b 208 U16 nr;
wini 0:e0adec41ad6b 209 } SharkSslAesCtx;
wini 0:e0adec41ad6b 210
wini 0:e0adec41ad6b 211 typedef enum
wini 0:e0adec41ad6b 212 {
wini 0:e0adec41ad6b 213 SharkSslAesCtx_Decrypt,
wini 0:e0adec41ad6b 214 SharkSslAesCtx_Encrypt
wini 0:e0adec41ad6b 215 } SharkSslAesCtx_Type;
wini 0:e0adec41ad6b 216
wini 0:e0adec41ad6b 217 #if SHARKSSL_ENABLE_AES_GCM
wini 0:e0adec41ad6b 218 /** AesGcmCtx
wini 0:e0adec41ad6b 219 \ingroup RayCryptoAesGcm
wini 0:e0adec41ad6b 220 */
wini 0:e0adec41ad6b 221 typedef struct SharkSslAesGcmCtx
wini 0:e0adec41ad6b 222 {
wini 0:e0adec41ad6b 223 SharkSslAesCtx super;
wini 0:e0adec41ad6b 224 U8 M0[16][16];
wini 0:e0adec41ad6b 225 } SharkSslAesGcmCtx;
wini 0:e0adec41ad6b 226 #endif
wini 0:e0adec41ad6b 227
wini 0:e0adec41ad6b 228 #if SHARKSSL_ENABLE_AES_CCM
wini 0:e0adec41ad6b 229 /** AesCcmCtx
wini 0:e0adec41ad6b 230 \ingroup RayCryptoAesCcm
wini 0:e0adec41ad6b 231 */
wini 0:e0adec41ad6b 232 typedef struct SharkSslAesCcmCtx
wini 0:e0adec41ad6b 233 {
wini 0:e0adec41ad6b 234 SharkSslAesCtx super;
wini 0:e0adec41ad6b 235 U8 tagLen;
wini 0:e0adec41ad6b 236 } SharkSslAesCcmCtx;
wini 0:e0adec41ad6b 237 #endif
wini 0:e0adec41ad6b 238 #endif /* SHARKSSL_USE_AES_256 || SHARKSSL_USE_AES_192 || SHARKSSL_USE_AES_128 */
wini 0:e0adec41ad6b 239
wini 0:e0adec41ad6b 240
wini 0:e0adec41ad6b 241 #ifdef __cplusplus
wini 0:e0adec41ad6b 242 extern "C" {
wini 0:e0adec41ad6b 243 #endif
wini 0:e0adec41ad6b 244
wini 0:e0adec41ad6b 245 /* SharkSslCrypto.c */
wini 0:e0adec41ad6b 246 SHARKSSL_API int sharkssl_entropy(U32);
wini 0:e0adec41ad6b 247 SHARKSSL_API int sharkssl_rng(U8*, U16);
wini 0:e0adec41ad6b 248 SHARKSSL_API int sharkssl_kmemcmp(const void *a, const void *b, U32 n);
wini 0:e0adec41ad6b 249
wini 0:e0adec41ad6b 250
wini 0:e0adec41ad6b 251 #if SHARKSSL_USE_MD5
wini 0:e0adec41ad6b 252 /** Initialize
wini 0:e0adec41ad6b 253 \ingroup RayCryptoMD5
wini 0:e0adec41ad6b 254
wini 0:e0adec41ad6b 255 \param ctx Uninitialized data of size sizeof(SharkSslMd5Ctx).
wini 0:e0adec41ad6b 256 */
wini 0:e0adec41ad6b 257 SHARKSSL_API void SharkSslMd5Ctx_constructor(SharkSslMd5Ctx* ctx);
wini 0:e0adec41ad6b 258
wini 0:e0adec41ad6b 259 /** append
wini 0:e0adec41ad6b 260 \ingroup RayCryptoMD5
wini 0:e0adec41ad6b 261 */
wini 0:e0adec41ad6b 262 SHARKSSL_API void SharkSslMd5Ctx_append(SharkSslMd5Ctx* ctx, const U8* data, U32 len);
wini 0:e0adec41ad6b 263
wini 0:e0adec41ad6b 264 /** finish
wini 0:e0adec41ad6b 265 \ingroup RayCryptoMD5
wini 0:e0adec41ad6b 266 */
wini 0:e0adec41ad6b 267 SHARKSSL_API void SharkSslMd5Ctx_finish(SharkSslMd5Ctx* ctx, U8 digest[SHARKSSL_MD5_HASH_LEN]);
wini 0:e0adec41ad6b 268
wini 0:e0adec41ad6b 269 /** md5
wini 0:e0adec41ad6b 270 \ingroup RayCryptoMD5
wini 0:e0adec41ad6b 271 */
wini 0:e0adec41ad6b 272 SHARKSSL_API int sharkssl_md5(const U8*, U16, U8*);
wini 0:e0adec41ad6b 273 #endif
wini 0:e0adec41ad6b 274
wini 0:e0adec41ad6b 275 #if SHARKSSL_USE_SHA1
wini 0:e0adec41ad6b 276 /** Initialize
wini 0:e0adec41ad6b 277 \ingroup RayCryptoSHA1
wini 0:e0adec41ad6b 278
wini 0:e0adec41ad6b 279 \param ctx Uninitialized data of size sizeof(SharkSslSha1Ctx).
wini 0:e0adec41ad6b 280 */
wini 0:e0adec41ad6b 281 SHARKSSL_API void SharkSslSha1Ctx_constructor(SharkSslSha1Ctx* ctx);
wini 0:e0adec41ad6b 282
wini 0:e0adec41ad6b 283 /** append
wini 0:e0adec41ad6b 284 \ingroup RayCryptoSHA1
wini 0:e0adec41ad6b 285 */
wini 0:e0adec41ad6b 286 SHARKSSL_API void SharkSslSha1Ctx_append(SharkSslSha1Ctx* ctx, const U8* data, U32 len);
wini 0:e0adec41ad6b 287
wini 0:e0adec41ad6b 288 /** finish
wini 0:e0adec41ad6b 289 \ingroup RayCryptoSHA1
wini 0:e0adec41ad6b 290 */
wini 0:e0adec41ad6b 291 SHARKSSL_API void SharkSslSha1Ctx_finish(SharkSslSha1Ctx*, U8 digest[SHARKSSL_SHA1_HASH_LEN]);
wini 0:e0adec41ad6b 292
wini 0:e0adec41ad6b 293 /** sha1
wini 0:e0adec41ad6b 294 \ingroup RayCryptoSHA1
wini 0:e0adec41ad6b 295 */
wini 0:e0adec41ad6b 296 SHARKSSL_API int sharkssl_sha1(const U8*, U16, U8*);
wini 0:e0adec41ad6b 297 #endif
wini 0:e0adec41ad6b 298
wini 0:e0adec41ad6b 299 #if SHARKSSL_USE_SHA_256
wini 0:e0adec41ad6b 300 /** Initialize
wini 0:e0adec41ad6b 301 \ingroup RayCryptoSHA256
wini 0:e0adec41ad6b 302
wini 0:e0adec41ad6b 303 \param ctx Uninitialized data of size sizeof(SharkSslSha256Ctx).
wini 0:e0adec41ad6b 304 */
wini 0:e0adec41ad6b 305 SHARKSSL_API void SharkSslSha256Ctx_constructor(SharkSslSha256Ctx* ctx);
wini 0:e0adec41ad6b 306
wini 0:e0adec41ad6b 307 /** append
wini 0:e0adec41ad6b 308 \ingroup RayCryptoSHA256
wini 0:e0adec41ad6b 309 */
wini 0:e0adec41ad6b 310 SHARKSSL_API void SharkSslSha256Ctx_append(SharkSslSha256Ctx*, const U8* data, U32 len);
wini 0:e0adec41ad6b 311
wini 0:e0adec41ad6b 312 /** finish
wini 0:e0adec41ad6b 313 \ingroup RayCryptoSHA256
wini 0:e0adec41ad6b 314 */
wini 0:e0adec41ad6b 315 SHARKSSL_API void SharkSslSha256Ctx_finish(SharkSslSha256Ctx*, U8 digest[SHARKSSL_SHA256_HASH_LEN]);
wini 0:e0adec41ad6b 316
wini 0:e0adec41ad6b 317 /** sha256
wini 0:e0adec41ad6b 318 \ingroup RayCryptoSHA256
wini 0:e0adec41ad6b 319 */
wini 0:e0adec41ad6b 320 SHARKSSL_API int sharkssl_sha256(const U8*, U16, U8*);
wini 0:e0adec41ad6b 321 #endif
wini 0:e0adec41ad6b 322
wini 0:e0adec41ad6b 323 #if SHARKSSL_USE_SHA_384
wini 0:e0adec41ad6b 324 /** Initialize
wini 0:e0adec41ad6b 325 \ingroup RayCryptoSHA384
wini 0:e0adec41ad6b 326
wini 0:e0adec41ad6b 327 \param ctx Uninitialized data of size sizeof(SharkSslSha384Ctx).
wini 0:e0adec41ad6b 328 */
wini 0:e0adec41ad6b 329 SHARKSSL_API void SharkSslSha384Ctx_constructor(SharkSslSha384Ctx* ctx);
wini 0:e0adec41ad6b 330
wini 0:e0adec41ad6b 331 /** append
wini 0:e0adec41ad6b 332 \ingroup RayCryptoSHA384
wini 0:e0adec41ad6b 333 */
wini 0:e0adec41ad6b 334 SHARKSSL_API void SharkSslSha384Ctx_append(SharkSslSha384Ctx*, const U8* data, U32 len);
wini 0:e0adec41ad6b 335
wini 0:e0adec41ad6b 336 /** finish
wini 0:e0adec41ad6b 337 \ingroup RayCryptoSHA384
wini 0:e0adec41ad6b 338 */
wini 0:e0adec41ad6b 339 SHARKSSL_API void SharkSslSha384Ctx_finish(SharkSslSha384Ctx*, U8 digest[SHARKSSL_SHA384_HASH_LEN]);
wini 0:e0adec41ad6b 340
wini 0:e0adec41ad6b 341 /** sha384
wini 0:e0adec41ad6b 342 \ingroup RayCryptoSHA384
wini 0:e0adec41ad6b 343 */
wini 0:e0adec41ad6b 344 SHARKSSL_API int sharkssl_sha384(const U8*, U16, U8*);
wini 0:e0adec41ad6b 345 #endif
wini 0:e0adec41ad6b 346
wini 0:e0adec41ad6b 347 #if SHARKSSL_USE_SHA_512
wini 0:e0adec41ad6b 348 /** Initialize
wini 0:e0adec41ad6b 349 \ingroup RayCryptoSHA512
wini 0:e0adec41ad6b 350
wini 0:e0adec41ad6b 351 \param ctx Uninitialized data of size sizeof(SharkSslSha512Ctx).
wini 0:e0adec41ad6b 352 */
wini 0:e0adec41ad6b 353 SHARKSSL_API void SharkSslSha512Ctx_constructor(SharkSslSha512Ctx* ctx);
wini 0:e0adec41ad6b 354
wini 0:e0adec41ad6b 355 /** append
wini 0:e0adec41ad6b 356 \ingroup RayCryptoSHA512
wini 0:e0adec41ad6b 357 */
wini 0:e0adec41ad6b 358 #define SharkSslSha512Ctx_append(ctx, d, l) \
wini 0:e0adec41ad6b 359 SharkSslSha384Ctx_append((SharkSslSha384Ctx*)ctx, d, l)
wini 0:e0adec41ad6b 360
wini 0:e0adec41ad6b 361 /** finish
wini 0:e0adec41ad6b 362 \ingroup RayCryptoSHA512
wini 0:e0adec41ad6b 363 */
wini 0:e0adec41ad6b 364 SHARKSSL_API void SharkSslSha512Ctx_finish(SharkSslSha512Ctx*, U8 digest[SHARKSSL_SHA512_HASH_LEN]);
wini 0:e0adec41ad6b 365
wini 0:e0adec41ad6b 366 /** sha512
wini 0:e0adec41ad6b 367 \ingroup RayCryptoSHA512
wini 0:e0adec41ad6b 368 */
wini 0:e0adec41ad6b 369 SHARKSSL_API int sharkssl_sha512(const U8*, U16, U8*);
wini 0:e0adec41ad6b 370 #endif
wini 0:e0adec41ad6b 371
wini 0:e0adec41ad6b 372 #if SHARKSSL_USE_POLY1305
wini 0:e0adec41ad6b 373 /** Initialize
wini 0:e0adec41ad6b 374 \ingroup RayCryptoPOLY1305
wini 0:e0adec41ad6b 375
wini 0:e0adec41ad6b 376 \param ctx Uninitialized data of size sizeof(SharkSslPoly1305Ctx).
wini 0:e0adec41ad6b 377 \param key 16-byte key + 16-byte nonce
wini 0:e0adec41ad6b 378 */
wini 0:e0adec41ad6b 379 SHARKSSL_API void SharkSslPoly1305Ctx_constructor(SharkSslPoly1305Ctx *ctx, const U8 key[32]);
wini 0:e0adec41ad6b 380
wini 0:e0adec41ad6b 381 #define SharkSslPoly1305Ctx_destructor(o) memset(o, 0, sizeof(SharkSslPoly1305Ctx))
wini 0:e0adec41ad6b 382
wini 0:e0adec41ad6b 383 /** append
wini 0:e0adec41ad6b 384 \ingroup RayCryptoPOLY1305
wini 0:e0adec41ad6b 385 */
wini 0:e0adec41ad6b 386 SHARKSSL_API void SharkSslPoly1305Ctx_append(SharkSslPoly1305Ctx *ctx, const U8 *in, U32 len);
wini 0:e0adec41ad6b 387
wini 0:e0adec41ad6b 388 /** finish
wini 0:e0adec41ad6b 389 \ingroup RayCryptoPOLY1305
wini 0:e0adec41ad6b 390 */
wini 0:e0adec41ad6b 391 SHARKSSL_API void SharkSslPoly1305Ctx_finish(SharkSslPoly1305Ctx *ctx, U8 digest[SHARKSSL_POLY1305_HASH_LEN]);
wini 0:e0adec41ad6b 392
wini 0:e0adec41ad6b 393 /** poly1305
wini 0:e0adec41ad6b 394 \ingroup RayCryptoPOLY1305
wini 0:e0adec41ad6b 395 */
wini 0:e0adec41ad6b 396 SHARKSSL_API int sharkssl_poly1305(const U8 *data, U16 len, U8 *digest, const U8 key[32]);
wini 0:e0adec41ad6b 397 #endif
wini 0:e0adec41ad6b 398
wini 0:e0adec41ad6b 399 #if SHARKSSL_USE_CHACHA20
wini 0:e0adec41ad6b 400 /** Initialize
wini 0:e0adec41ad6b 401 \ingroup RayCryptoCHACHA20
wini 0:e0adec41ad6b 402
wini 0:e0adec41ad6b 403 \param ctx Uninitialized data of size sizeof(SharkSslChaChaCtx)
wini 0:e0adec41ad6b 404 \param key 16- or 32-byte key
wini 0:e0adec41ad6b 405 \param keyLen the key length in bytes (either 16 or 32)
wini 0:e0adec41ad6b 406 */
wini 0:e0adec41ad6b 407 SHARKSSL_API void SharkSslChaChaCtx_constructor(SharkSslChaChaCtx *ctx,
wini 0:e0adec41ad6b 408 const U8 *key, U8 keyLen);
wini 0:e0adec41ad6b 409
wini 0:e0adec41ad6b 410 #define SharkSslChaChaCtx_destructor(ctx) memset(ctx, 0, sizeof(SharkSslChaChaCtx))
wini 0:e0adec41ad6b 411
wini 0:e0adec41ad6b 412 /** Initialize
wini 0:e0adec41ad6b 413 \ingroup RayCryptoCHACHA20
wini 0:e0adec41ad6b 414
wini 0:e0adec41ad6b 415 \param ctx Initialized data of size sizeof(SharkSslChaChaCtx)
wini 0:e0adec41ad6b 416 \param IV 8-byte initialization vector
wini 0:e0adec41ad6b 417 */
wini 0:e0adec41ad6b 418 SHARKSSL_API void SharkSslChaChaCtx_setIV(SharkSslChaChaCtx *ctx, const U8 IV[8]);
wini 0:e0adec41ad6b 419
wini 0:e0adec41ad6b 420 /** Encrypt or decrypt
wini 0:e0adec41ad6b 421 \ingroup RayCryptoCHACHA20
wini 0:e0adec41ad6b 422 */
wini 0:e0adec41ad6b 423 SHARKSSL_API void SharkSslChaChaCtx_crypt(
wini 0:e0adec41ad6b 424 SharkSslChaChaCtx *ctx, const U8 *input, U8 *output, U32 len);
wini 0:e0adec41ad6b 425 #endif
wini 0:e0adec41ad6b 426
wini 0:e0adec41ad6b 427 #if SHARKSSL_USE_ARC4
wini 0:e0adec41ad6b 428 /** Initialize
wini 0:e0adec41ad6b 429 \ingroup RayCryptoARC4
wini 0:e0adec41ad6b 430
wini 0:e0adec41ad6b 431 */
wini 0:e0adec41ad6b 432 SHARKSSL_API void SharkSslArc4Ctx_constructor(SharkSslArc4Ctx *ctx,
wini 0:e0adec41ad6b 433 const U8 *key, U8 keyLen);
wini 0:e0adec41ad6b 434
wini 0:e0adec41ad6b 435 #define SharkSslArc4Ctx_destructor(ctx) memset(ctx, 0, sizeof(SharkSslArc4Ctx))
wini 0:e0adec41ad6b 436
wini 0:e0adec41ad6b 437 /** Encrypt or decrypt
wini 0:e0adec41ad6b 438 \ingroup RayCryptoARC4
wini 0:e0adec41ad6b 439 */
wini 0:e0adec41ad6b 440 SHARKSSL_API void SharkSslArc4Ctx_crypt(
wini 0:e0adec41ad6b 441 SharkSslArc4Ctx *ctx, U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 442 #endif
wini 0:e0adec41ad6b 443
wini 0:e0adec41ad6b 444 #if (SHARKSSL_USE_DES || SHARKSSL_USE_3DES)
wini 0:e0adec41ad6b 445 /** Initialize
wini 0:e0adec41ad6b 446 \ingroup RayCryptoDES
wini 0:e0adec41ad6b 447
wini 0:e0adec41ad6b 448 \param ctx Uninitialized data of size sizeof(SharkSslDesCtx)
wini 0:e0adec41ad6b 449 \param type encrypt/decrypt
wini 0:e0adec41ad6b 450 \param key the encryption/decryption key
wini 0:e0adec41ad6b 451 \param keyLen 'key' length
wini 0:e0adec41ad6b 452 */
wini 0:e0adec41ad6b 453 SHARKSSL_API void SharkSslDesCtx_constructor(SharkSslDesCtx *ctx,
wini 0:e0adec41ad6b 454 SharkSslDesCtx_Type type,
wini 0:e0adec41ad6b 455 const U8 *key, U8 keyLen);
wini 0:e0adec41ad6b 456 #define SharkSslDesCtx_destructor(ctx) memset(ctx, 0, sizeof(SharkSslDesCtx))
wini 0:e0adec41ad6b 457
wini 0:e0adec41ad6b 458 /** Encrypt
wini 0:e0adec41ad6b 459 \ingroup RayCryptoDES
wini 0:e0adec41ad6b 460 */
wini 0:e0adec41ad6b 461 SHARKSSL_API void SharkSslDesCtx_encrypt(
wini 0:e0adec41ad6b 462 SharkSslDesCtx *ctx, U8 input[8], U8 output[8]);
wini 0:e0adec41ad6b 463 #if (SHARKSSL_USE_CAU || SHARKSSL_USE_MMCAU)
wini 0:e0adec41ad6b 464
wini 0:e0adec41ad6b 465 /** Decrypt
wini 0:e0adec41ad6b 466 \ingroup RayCryptoDES
wini 0:e0adec41ad6b 467 */
wini 0:e0adec41ad6b 468 SHARKSSL_API void SharkSslDesCtx_decrypt(
wini 0:e0adec41ad6b 469 SharkSslDesCtx *ctx, U8 input[8], U8 output[8]);
wini 0:e0adec41ad6b 470 #else
wini 0:e0adec41ad6b 471 #define SharkSslDesCtx_decrypt(ctx,i,o) SharkSslDesCtx_encrypt((ctx),(i),(o))
wini 0:e0adec41ad6b 472 #endif
wini 0:e0adec41ad6b 473
wini 0:e0adec41ad6b 474 /** Encrypt
wini 0:e0adec41ad6b 475 \ingroup RayCryptoDES
wini 0:e0adec41ad6b 476 */
wini 0:e0adec41ad6b 477 SHARKSSL_API void SharkSslDesCtx_cbc_encrypt(SharkSslDesCtx *ctx, U8 vect[8],
wini 0:e0adec41ad6b 478 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 479
wini 0:e0adec41ad6b 480 /** Decrypt
wini 0:e0adec41ad6b 481 \ingroup RayCryptoDES
wini 0:e0adec41ad6b 482 */
wini 0:e0adec41ad6b 483 SHARKSSL_API void SharkSslDesCtx_cbc_decrypt(SharkSslDesCtx *ctx, U8 vect[8],
wini 0:e0adec41ad6b 484 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 485 #endif
wini 0:e0adec41ad6b 486
wini 0:e0adec41ad6b 487 #if (SHARKSSL_USE_AES_256 || SHARKSSL_USE_AES_192 || SHARKSSL_USE_AES_128)
wini 0:e0adec41ad6b 488 /** Initialize
wini 0:e0adec41ad6b 489 \ingroup RayCryptoAES
wini 0:e0adec41ad6b 490
wini 0:e0adec41ad6b 491 \param ctx Uninitialized data of size sizeof(SharkSslAesCtx)
wini 0:e0adec41ad6b 492 \param type encrypt/decrypt
wini 0:e0adec41ad6b 493 \param key the encryption/decryption key
wini 0:e0adec41ad6b 494 \param keyLen 'key' length
wini 0:e0adec41ad6b 495 */
wini 0:e0adec41ad6b 496 SHARKSSL_API void SharkSslAesCtx_constructor(SharkSslAesCtx *ctx,
wini 0:e0adec41ad6b 497 SharkSslAesCtx_Type type,
wini 0:e0adec41ad6b 498 const U8 *key, U8 keyLen);
wini 0:e0adec41ad6b 499 #define SharkSslAesCtx_destructor(ctx) memset(ctx, 0, sizeof(SharkSslAesCtx))
wini 0:e0adec41ad6b 500
wini 0:e0adec41ad6b 501 #if (!SHARKSSL_DISABLE_AES_ECB_DECRYPT)
wini 0:e0adec41ad6b 502 /** Decrypt
wini 0:e0adec41ad6b 503 \ingroup RayCryptoAES
wini 0:e0adec41ad6b 504 */
wini 0:e0adec41ad6b 505 SHARKSSL_API void SharkSslAesCtx_decrypt(SharkSslAesCtx *ctx, U8 input[16], U8 output[16]);
wini 0:e0adec41ad6b 506 #endif
wini 0:e0adec41ad6b 507
wini 0:e0adec41ad6b 508 /** Encrypt
wini 0:e0adec41ad6b 509 \ingroup RayCryptoAES
wini 0:e0adec41ad6b 510 */
wini 0:e0adec41ad6b 511 SHARKSSL_API void SharkSslAesCtx_encrypt(SharkSslAesCtx *ctx, U8 input[16], U8 output[16]);
wini 0:e0adec41ad6b 512
wini 0:e0adec41ad6b 513 #if (!SHARKSSL_DISABLE_AES_CBC_MODE)
wini 0:e0adec41ad6b 514 /** Encrypt
wini 0:e0adec41ad6b 515 \ingroup RayCryptoAES
wini 0:e0adec41ad6b 516 */
wini 0:e0adec41ad6b 517 SHARKSSL_API void SharkSslAesCtx_cbc_encrypt(SharkSslAesCtx *ctx, U8 vect[16],
wini 0:e0adec41ad6b 518 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 519
wini 0:e0adec41ad6b 520 /** Decrypt
wini 0:e0adec41ad6b 521 \ingroup RayCryptoAES
wini 0:e0adec41ad6b 522 */
wini 0:e0adec41ad6b 523 SHARKSSL_API void SharkSslAesCtx_cbc_decrypt(SharkSslAesCtx *ctx, U8 vect[16],
wini 0:e0adec41ad6b 524 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 525 #endif
wini 0:e0adec41ad6b 526 #if SHARKSSL_ENABLE_AES_CTR_MODE
wini 0:e0adec41ad6b 527
wini 0:e0adec41ad6b 528 /**
wini 0:e0adec41ad6b 529 \ingroup RayCryptoAES
wini 0:e0adec41ad6b 530 */
wini 0:e0adec41ad6b 531 SHARKSSL_API void SharkSslAesCtx_ctr_mode(SharkSslAesCtx *ctx, U8 ctr[16],
wini 0:e0adec41ad6b 532 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 533 #endif
wini 0:e0adec41ad6b 534 #if SHARKSSL_ENABLE_AES_GCM
wini 0:e0adec41ad6b 535 /** Initialize
wini 0:e0adec41ad6b 536 \ingroup RayCryptoAesGcm
wini 0:e0adec41ad6b 537
wini 0:e0adec41ad6b 538 \param ctx Uninitialized data of size sizeof(SharkSslAesGcmCtx).
wini 0:e0adec41ad6b 539 \param key the encryption/decryption key
wini 0:e0adec41ad6b 540 \param keyLen 'key' length
wini 0:e0adec41ad6b 541 */
wini 0:e0adec41ad6b 542 SHARKSSL_API void SharkSslAesGcmCtx_constructor(SharkSslAesGcmCtx *ctx,
wini 0:e0adec41ad6b 543 const U8 *key, U8 keyLen);
wini 0:e0adec41ad6b 544
wini 0:e0adec41ad6b 545 #define SharkSslAesGcmCtx_destructor(ctx) \
wini 0:e0adec41ad6b 546 memset(ctx, 0, sizeof(SharkSslAesGcmCtx))
wini 0:e0adec41ad6b 547
wini 0:e0adec41ad6b 548 /** Encrypt
wini 0:e0adec41ad6b 549 \ingroup RayCryptoAesGcm
wini 0:e0adec41ad6b 550 */
wini 0:e0adec41ad6b 551 SHARKSSL_API int SharkSslAesGcmCtx_encrypt(SharkSslAesGcmCtx *ctx,
wini 0:e0adec41ad6b 552 const U8 vect[12], U8 tagout[16],
wini 0:e0adec41ad6b 553 const U8 *auth, U16 authlen,
wini 0:e0adec41ad6b 554 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 555
wini 0:e0adec41ad6b 556
wini 0:e0adec41ad6b 557 /** Decrypt
wini 0:e0adec41ad6b 558 \ingroup RayCryptoAesGcm
wini 0:e0adec41ad6b 559 */
wini 0:e0adec41ad6b 560 SHARKSSL_API int SharkSslAesGcmCtx_decrypt(SharkSslAesGcmCtx *ctx,
wini 0:e0adec41ad6b 561 const U8 vect[12], U8 tagin[16],
wini 0:e0adec41ad6b 562 const U8 *auth, U16 authlen,
wini 0:e0adec41ad6b 563 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 564 #endif
wini 0:e0adec41ad6b 565 #if SHARKSSL_ENABLE_AES_CCM
wini 0:e0adec41ad6b 566 /** Initialize
wini 0:e0adec41ad6b 567 \ingroup RayCryptoAesCcm
wini 0:e0adec41ad6b 568
wini 0:e0adec41ad6b 569 \param ctx Uninitialized data of size sizeof(SharkSslAesCcmCtx).
wini 0:e0adec41ad6b 570 */
wini 0:e0adec41ad6b 571 SHARKSSL_API void SharkSslAesCcmCtx_constructor(SharkSslAesCcmCtx *ctx,
wini 0:e0adec41ad6b 572 const U8 *key, U8 keyLen, U8 tagLen);
wini 0:e0adec41ad6b 573
wini 0:e0adec41ad6b 574 #define SharkSslAesCcmCtx_destructor(ctx) memset(ctx, 0, sizeof(SharkSslAesCcmCtx))
wini 0:e0adec41ad6b 575
wini 0:e0adec41ad6b 576 /** Encrypt
wini 0:e0adec41ad6b 577 \ingroup RayCryptoAesCcm
wini 0:e0adec41ad6b 578 */
wini 0:e0adec41ad6b 579 SHARKSSL_API int SharkSslAesCcmCtx_encrypt(SharkSslAesCcmCtx *ctx,
wini 0:e0adec41ad6b 580 const U8 vect[12], U8 *tagout,
wini 0:e0adec41ad6b 581 const U8 *auth, U16 authlen,
wini 0:e0adec41ad6b 582 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 583
wini 0:e0adec41ad6b 584
wini 0:e0adec41ad6b 585 /** Decrypt
wini 0:e0adec41ad6b 586 \ingroup RayCryptoAesCcm
wini 0:e0adec41ad6b 587 */
wini 0:e0adec41ad6b 588 SHARKSSL_API int SharkSslAesCcmCtx_decrypt(SharkSslAesCcmCtx *ctx,
wini 0:e0adec41ad6b 589 const U8 vect[12], U8 *tagin,
wini 0:e0adec41ad6b 590 const U8 *auth, U16 authlen,
wini 0:e0adec41ad6b 591 U8 *input, U8 *output, U16 len);
wini 0:e0adec41ad6b 592 #endif
wini 0:e0adec41ad6b 593 #endif
wini 0:e0adec41ad6b 594
wini 0:e0adec41ad6b 595 #ifdef __cplusplus
wini 0:e0adec41ad6b 596 }
wini 0:e0adec41ad6b 597 #endif
wini 0:e0adec41ad6b 598
wini 0:e0adec41ad6b 599
wini 0:e0adec41ad6b 600 #endif /* _SharkSslCrypto_h */