Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

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