Demo using MBED TLS

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

Committer:
markrad
Date:
Thu Jan 05 00:20:03 2017 +0000
Revision:
58:f50b97b08851
Sample using MBED TLS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 58:f50b97b08851 1 // Copyright (c) Microsoft. All rights reserved.
markrad 58:f50b97b08851 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
markrad 58:f50b97b08851 3
markrad 58:f50b97b08851 4 /**************************** usha.c ****************************/
markrad 58:f50b97b08851 5 /******************** See RFC 4634 for details ******************/
markrad 58:f50b97b08851 6 /*
markrad 58:f50b97b08851 7 * Description:
markrad 58:f50b97b08851 8 * This file implements a unified interface to the SHA algorithms.
markrad 58:f50b97b08851 9 */
markrad 58:f50b97b08851 10
markrad 58:f50b97b08851 11 #include <stdlib.h>
markrad 58:f50b97b08851 12 #ifdef _CRTDBG_MAP_ALLOC
markrad 58:f50b97b08851 13 #include <crtdbg.h>
markrad 58:f50b97b08851 14 #endif
markrad 58:f50b97b08851 15 #include "azure_c_shared_utility/gballoc.h"
markrad 58:f50b97b08851 16
markrad 58:f50b97b08851 17 #include "azure_c_shared_utility/sha.h"
markrad 58:f50b97b08851 18
markrad 58:f50b97b08851 19 /*
markrad 58:f50b97b08851 20 * USHAReset
markrad 58:f50b97b08851 21 *
markrad 58:f50b97b08851 22 * Description:
markrad 58:f50b97b08851 23 * This function will initialize the SHA Context in preparation
markrad 58:f50b97b08851 24 * for computing a new SHA message digest.
markrad 58:f50b97b08851 25 *
markrad 58:f50b97b08851 26 * Parameters:
markrad 58:f50b97b08851 27 * context: [in/out]
markrad 58:f50b97b08851 28 * The context to reset.
markrad 58:f50b97b08851 29 * whichSha: [in]
markrad 58:f50b97b08851 30 * Selects which SHA reset to call
markrad 58:f50b97b08851 31 *
markrad 58:f50b97b08851 32 * Returns:
markrad 58:f50b97b08851 33 * sha Error Code.
markrad 58:f50b97b08851 34 *
markrad 58:f50b97b08851 35 */
markrad 58:f50b97b08851 36 int USHAReset(USHAContext *ctx, enum SHAversion whichSha)
markrad 58:f50b97b08851 37 {
markrad 58:f50b97b08851 38 if (ctx) {
markrad 58:f50b97b08851 39 ctx->whichSha = whichSha;
markrad 58:f50b97b08851 40 switch (whichSha) {
markrad 58:f50b97b08851 41 case SHA1: return SHA1Reset((SHA1Context*)&ctx->ctx);
markrad 58:f50b97b08851 42 case SHA224: return SHA224Reset((SHA224Context*)&ctx->ctx);
markrad 58:f50b97b08851 43 case SHA256: return SHA256Reset((SHA256Context*)&ctx->ctx);
markrad 58:f50b97b08851 44 case SHA384: return SHA384Reset((SHA384Context*)&ctx->ctx);
markrad 58:f50b97b08851 45 case SHA512: return SHA512Reset((SHA512Context*)&ctx->ctx);
markrad 58:f50b97b08851 46 default: return shaBadParam;
markrad 58:f50b97b08851 47 }
markrad 58:f50b97b08851 48 }
markrad 58:f50b97b08851 49 else {
markrad 58:f50b97b08851 50 return shaNull;
markrad 58:f50b97b08851 51 }
markrad 58:f50b97b08851 52 }
markrad 58:f50b97b08851 53
markrad 58:f50b97b08851 54 /*
markrad 58:f50b97b08851 55 * USHAInput
markrad 58:f50b97b08851 56 *
markrad 58:f50b97b08851 57 * Description:
markrad 58:f50b97b08851 58 * This function accepts an array of octets as the next portion
markrad 58:f50b97b08851 59 * of the message.
markrad 58:f50b97b08851 60 *
markrad 58:f50b97b08851 61 * Parameters:
markrad 58:f50b97b08851 62 * context: [in/out]
markrad 58:f50b97b08851 63 * The SHA context to update
markrad 58:f50b97b08851 64 * message_array: [in]
markrad 58:f50b97b08851 65 * An array of characters representing the next portion of
markrad 58:f50b97b08851 66 * the message.
markrad 58:f50b97b08851 67 * length: [in]
markrad 58:f50b97b08851 68 * The length of the message in message_array
markrad 58:f50b97b08851 69 *
markrad 58:f50b97b08851 70 * Returns:
markrad 58:f50b97b08851 71 * sha Error Code.
markrad 58:f50b97b08851 72 *
markrad 58:f50b97b08851 73 */
markrad 58:f50b97b08851 74 int USHAInput(USHAContext *ctx,
markrad 58:f50b97b08851 75 const uint8_t *bytes, unsigned int bytecount)
markrad 58:f50b97b08851 76 {
markrad 58:f50b97b08851 77 if (ctx) {
markrad 58:f50b97b08851 78 switch (ctx->whichSha) {
markrad 58:f50b97b08851 79 case SHA1:
markrad 58:f50b97b08851 80 return SHA1Input((SHA1Context*)&ctx->ctx, bytes, bytecount);
markrad 58:f50b97b08851 81 case SHA224:
markrad 58:f50b97b08851 82 return SHA224Input((SHA224Context*)&ctx->ctx, bytes,
markrad 58:f50b97b08851 83 bytecount);
markrad 58:f50b97b08851 84 case SHA256:
markrad 58:f50b97b08851 85 return SHA256Input((SHA256Context*)&ctx->ctx, bytes,
markrad 58:f50b97b08851 86 bytecount);
markrad 58:f50b97b08851 87 case SHA384:
markrad 58:f50b97b08851 88 return SHA384Input((SHA384Context*)&ctx->ctx, bytes,
markrad 58:f50b97b08851 89 bytecount);
markrad 58:f50b97b08851 90 case SHA512:
markrad 58:f50b97b08851 91 return SHA512Input((SHA512Context*)&ctx->ctx, bytes,
markrad 58:f50b97b08851 92 bytecount);
markrad 58:f50b97b08851 93 default: return shaBadParam;
markrad 58:f50b97b08851 94 }
markrad 58:f50b97b08851 95 }
markrad 58:f50b97b08851 96 else {
markrad 58:f50b97b08851 97 return shaNull;
markrad 58:f50b97b08851 98 }
markrad 58:f50b97b08851 99 }
markrad 58:f50b97b08851 100
markrad 58:f50b97b08851 101 /*
markrad 58:f50b97b08851 102 * USHAFinalBits
markrad 58:f50b97b08851 103 *
markrad 58:f50b97b08851 104 * Description:
markrad 58:f50b97b08851 105 * This function will add in any final bits of the message.
markrad 58:f50b97b08851 106 *
markrad 58:f50b97b08851 107 * Parameters:
markrad 58:f50b97b08851 108 * context: [in/out]
markrad 58:f50b97b08851 109 * The SHA context to update
markrad 58:f50b97b08851 110 * message_bits: [in]
markrad 58:f50b97b08851 111 * The final bits of the message, in the upper portion of the
markrad 58:f50b97b08851 112 * byte. (Use 0b###00000 instead of 0b00000### to input the
markrad 58:f50b97b08851 113 * three bits ###.)
markrad 58:f50b97b08851 114 * length: [in]
markrad 58:f50b97b08851 115 * The number of bits in message_bits, between 1 and 7.
markrad 58:f50b97b08851 116 *
markrad 58:f50b97b08851 117 * Returns:
markrad 58:f50b97b08851 118 * sha Error Code.
markrad 58:f50b97b08851 119 */
markrad 58:f50b97b08851 120 int USHAFinalBits(USHAContext *ctx,
markrad 58:f50b97b08851 121 const uint8_t bits, unsigned int bitcount)
markrad 58:f50b97b08851 122 {
markrad 58:f50b97b08851 123 if (ctx) {
markrad 58:f50b97b08851 124 switch (ctx->whichSha) {
markrad 58:f50b97b08851 125 case SHA1:
markrad 58:f50b97b08851 126 return SHA1FinalBits((SHA1Context*)&ctx->ctx, bits, bitcount);
markrad 58:f50b97b08851 127 case SHA224:
markrad 58:f50b97b08851 128 return SHA224FinalBits((SHA224Context*)&ctx->ctx, bits,
markrad 58:f50b97b08851 129 bitcount);
markrad 58:f50b97b08851 130 case SHA256:
markrad 58:f50b97b08851 131 return SHA256FinalBits((SHA256Context*)&ctx->ctx, bits,
markrad 58:f50b97b08851 132 bitcount);
markrad 58:f50b97b08851 133 case SHA384:
markrad 58:f50b97b08851 134 return SHA384FinalBits((SHA384Context*)&ctx->ctx, bits,
markrad 58:f50b97b08851 135 bitcount);
markrad 58:f50b97b08851 136 case SHA512:
markrad 58:f50b97b08851 137 return SHA512FinalBits((SHA512Context*)&ctx->ctx, bits,
markrad 58:f50b97b08851 138 bitcount);
markrad 58:f50b97b08851 139 default: return shaBadParam;
markrad 58:f50b97b08851 140 }
markrad 58:f50b97b08851 141 }
markrad 58:f50b97b08851 142 else {
markrad 58:f50b97b08851 143 return shaNull;
markrad 58:f50b97b08851 144 }
markrad 58:f50b97b08851 145 }
markrad 58:f50b97b08851 146
markrad 58:f50b97b08851 147 /*
markrad 58:f50b97b08851 148 * USHAResult
markrad 58:f50b97b08851 149 *
markrad 58:f50b97b08851 150 * Description:
markrad 58:f50b97b08851 151 * This function will return the 160-bit message digest into the
markrad 58:f50b97b08851 152 * Message_Digest array provided by the caller.
markrad 58:f50b97b08851 153 * NOTE: The first octet of hash is stored in the 0th element,
markrad 58:f50b97b08851 154 * the last octet of hash in the 19th element.
markrad 58:f50b97b08851 155 *
markrad 58:f50b97b08851 156 * Parameters:
markrad 58:f50b97b08851 157 * context: [in/out]
markrad 58:f50b97b08851 158 * The context to use to calculate the SHA-1 hash.
markrad 58:f50b97b08851 159 * Message_Digest: [out]
markrad 58:f50b97b08851 160 * Where the digest is returned.
markrad 58:f50b97b08851 161 *
markrad 58:f50b97b08851 162 * Returns:
markrad 58:f50b97b08851 163 * sha Error Code.
markrad 58:f50b97b08851 164 *
markrad 58:f50b97b08851 165 */
markrad 58:f50b97b08851 166 int USHAResult(USHAContext *ctx,
markrad 58:f50b97b08851 167 uint8_t Message_Digest[USHAMaxHashSize])
markrad 58:f50b97b08851 168 {
markrad 58:f50b97b08851 169 if (ctx) {
markrad 58:f50b97b08851 170 switch (ctx->whichSha) {
markrad 58:f50b97b08851 171 case SHA1:
markrad 58:f50b97b08851 172 return SHA1Result((SHA1Context*)&ctx->ctx, Message_Digest);
markrad 58:f50b97b08851 173 case SHA224:
markrad 58:f50b97b08851 174 return SHA224Result((SHA224Context*)&ctx->ctx, Message_Digest);
markrad 58:f50b97b08851 175 case SHA256:
markrad 58:f50b97b08851 176 return SHA256Result((SHA256Context*)&ctx->ctx, Message_Digest);
markrad 58:f50b97b08851 177 case SHA384:
markrad 58:f50b97b08851 178 return SHA384Result((SHA384Context*)&ctx->ctx, Message_Digest);
markrad 58:f50b97b08851 179 case SHA512:
markrad 58:f50b97b08851 180 return SHA512Result((SHA512Context*)&ctx->ctx, Message_Digest);
markrad 58:f50b97b08851 181 default: return shaBadParam;
markrad 58:f50b97b08851 182 }
markrad 58:f50b97b08851 183 }
markrad 58:f50b97b08851 184 else {
markrad 58:f50b97b08851 185 return shaNull;
markrad 58:f50b97b08851 186 }
markrad 58:f50b97b08851 187 }
markrad 58:f50b97b08851 188
markrad 58:f50b97b08851 189 /*
markrad 58:f50b97b08851 190 * USHABlockSize
markrad 58:f50b97b08851 191 *
markrad 58:f50b97b08851 192 * Description:
markrad 58:f50b97b08851 193 * This function will return the blocksize for the given SHA
markrad 58:f50b97b08851 194 * algorithm.
markrad 58:f50b97b08851 195 *
markrad 58:f50b97b08851 196 * Parameters:
markrad 58:f50b97b08851 197 * whichSha:
markrad 58:f50b97b08851 198 * which SHA algorithm to query
markrad 58:f50b97b08851 199 *
markrad 58:f50b97b08851 200 * Returns:
markrad 58:f50b97b08851 201 * block size
markrad 58:f50b97b08851 202 *
markrad 58:f50b97b08851 203 */
markrad 58:f50b97b08851 204 int USHABlockSize(enum SHAversion whichSha)
markrad 58:f50b97b08851 205 {
markrad 58:f50b97b08851 206 switch (whichSha) {
markrad 58:f50b97b08851 207 case SHA1: return SHA1_Message_Block_Size;
markrad 58:f50b97b08851 208 case SHA224: return SHA224_Message_Block_Size;
markrad 58:f50b97b08851 209 case SHA256: return SHA256_Message_Block_Size;
markrad 58:f50b97b08851 210 case SHA384: return SHA384_Message_Block_Size;
markrad 58:f50b97b08851 211 default:
markrad 58:f50b97b08851 212 case SHA512: return SHA512_Message_Block_Size;
markrad 58:f50b97b08851 213 }
markrad 58:f50b97b08851 214 }
markrad 58:f50b97b08851 215
markrad 58:f50b97b08851 216 /*
markrad 58:f50b97b08851 217 * USHAHashSize
markrad 58:f50b97b08851 218 *
markrad 58:f50b97b08851 219 * Description:
markrad 58:f50b97b08851 220 * This function will return the hashsize for the given SHA
markrad 58:f50b97b08851 221 * algorithm.
markrad 58:f50b97b08851 222 *
markrad 58:f50b97b08851 223 * Parameters:
markrad 58:f50b97b08851 224 * whichSha:
markrad 58:f50b97b08851 225 * which SHA algorithm to query
markrad 58:f50b97b08851 226 *
markrad 58:f50b97b08851 227 * Returns:
markrad 58:f50b97b08851 228 * hash size
markrad 58:f50b97b08851 229 *
markrad 58:f50b97b08851 230 */
markrad 58:f50b97b08851 231 int USHAHashSize(enum SHAversion whichSha)
markrad 58:f50b97b08851 232 {
markrad 58:f50b97b08851 233 switch (whichSha) {
markrad 58:f50b97b08851 234 case SHA1: return SHA1HashSize;
markrad 58:f50b97b08851 235 case SHA224: return SHA224HashSize;
markrad 58:f50b97b08851 236 case SHA256: return SHA256HashSize;
markrad 58:f50b97b08851 237 case SHA384: return SHA384HashSize;
markrad 58:f50b97b08851 238 default:
markrad 58:f50b97b08851 239 case SHA512: return SHA512HashSize;
markrad 58:f50b97b08851 240 }
markrad 58:f50b97b08851 241 }
markrad 58:f50b97b08851 242
markrad 58:f50b97b08851 243 /*
markrad 58:f50b97b08851 244 * USHAHashSizeBits
markrad 58:f50b97b08851 245 *
markrad 58:f50b97b08851 246 * Description:
markrad 58:f50b97b08851 247 * This function will return the hashsize for the given SHA
markrad 58:f50b97b08851 248 * algorithm, expressed in bits.
markrad 58:f50b97b08851 249 *
markrad 58:f50b97b08851 250 * Parameters:
markrad 58:f50b97b08851 251 * whichSha:
markrad 58:f50b97b08851 252 * which SHA algorithm to query
markrad 58:f50b97b08851 253 *
markrad 58:f50b97b08851 254 * Returns:
markrad 58:f50b97b08851 255 * hash size in bits
markrad 58:f50b97b08851 256 *
markrad 58:f50b97b08851 257 */
markrad 58:f50b97b08851 258 int USHAHashSizeBits(enum SHAversion whichSha)
markrad 58:f50b97b08851 259 {
markrad 58:f50b97b08851 260 switch (whichSha) {
markrad 58:f50b97b08851 261 case SHA1: return SHA1HashSizeBits;
markrad 58:f50b97b08851 262 case SHA224: return SHA224HashSizeBits;
markrad 58:f50b97b08851 263 case SHA256: return SHA256HashSizeBits;
markrad 58:f50b97b08851 264 case SHA384: return SHA384HashSizeBits;
markrad 58:f50b97b08851 265 default:
markrad 58:f50b97b08851 266 case SHA512: return SHA512HashSizeBits;
markrad 58:f50b97b08851 267 }
markrad 58:f50b97b08851 268 }
markrad 58:f50b97b08851 269