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 /**************************** sha.h ****************************/
XinZhangMS 0:f7f1f0d76dd6 5 /******************* See RFC 4634 for details ******************/
XinZhangMS 0:f7f1f0d76dd6 6 #ifndef _SHA_H_
XinZhangMS 0:f7f1f0d76dd6 7 #define _SHA_H_
XinZhangMS 0:f7f1f0d76dd6 8
XinZhangMS 0:f7f1f0d76dd6 9 #ifdef __cplusplus
XinZhangMS 0:f7f1f0d76dd6 10 extern "C"
XinZhangMS 0:f7f1f0d76dd6 11 {
XinZhangMS 0:f7f1f0d76dd6 12 #endif
XinZhangMS 0:f7f1f0d76dd6 13
XinZhangMS 0:f7f1f0d76dd6 14 /*
XinZhangMS 0:f7f1f0d76dd6 15 * Description:
XinZhangMS 0:f7f1f0d76dd6 16 * This file implements the Secure Hash Signature Standard
XinZhangMS 0:f7f1f0d76dd6 17 * algorithms as defined in the National Institute of Standards
XinZhangMS 0:f7f1f0d76dd6 18 * and Technology Federal Information Processing Standards
XinZhangMS 0:f7f1f0d76dd6 19 * Publication (FIPS PUB) 180-1 published on April 17, 1995, 180-2
XinZhangMS 0:f7f1f0d76dd6 20 * published on August 1, 2002, and the FIPS PUB 180-2 Change
XinZhangMS 0:f7f1f0d76dd6 21 * Notice published on February 28, 2004.
XinZhangMS 0:f7f1f0d76dd6 22 *
XinZhangMS 0:f7f1f0d76dd6 23 * A combined document showing all algorithms is available at
XinZhangMS 0:f7f1f0d76dd6 24 * http://csrc.nist.gov/publications/fips/
XinZhangMS 0:f7f1f0d76dd6 25 * fips180-2/fips180-2withchangenotice.pdf
XinZhangMS 0:f7f1f0d76dd6 26 *
XinZhangMS 0:f7f1f0d76dd6 27 * The five hashes are defined in these sizes:
XinZhangMS 0:f7f1f0d76dd6 28 * SHA-1 20 byte / 160 bit
XinZhangMS 0:f7f1f0d76dd6 29 * SHA-224 28 byte / 224 bit
XinZhangMS 0:f7f1f0d76dd6 30 * SHA-256 32 byte / 256 bit
XinZhangMS 0:f7f1f0d76dd6 31 * SHA-384 48 byte / 384 bit
XinZhangMS 0:f7f1f0d76dd6 32 * SHA-512 64 byte / 512 bit
XinZhangMS 0:f7f1f0d76dd6 33 */
XinZhangMS 0:f7f1f0d76dd6 34
XinZhangMS 0:f7f1f0d76dd6 35 #include <stdint.h>
XinZhangMS 0:f7f1f0d76dd6 36 /*
XinZhangMS 0:f7f1f0d76dd6 37 * If you do not have the ISO standard stdint.h header file, then you
XinZhangMS 0:f7f1f0d76dd6 38 * must typedef the following:
XinZhangMS 0:f7f1f0d76dd6 39 * name meaning
XinZhangMS 0:f7f1f0d76dd6 40 * uint64_t unsigned 64 bit integer
XinZhangMS 0:f7f1f0d76dd6 41 * uint32_t unsigned 32 bit integer
XinZhangMS 0:f7f1f0d76dd6 42 * uint8_t unsigned 8 bit integer (i.e., unsigned char)
XinZhangMS 0:f7f1f0d76dd6 43 * int_least16_t integer of >= 16 bits
XinZhangMS 0:f7f1f0d76dd6 44 *
XinZhangMS 0:f7f1f0d76dd6 45 */
XinZhangMS 0:f7f1f0d76dd6 46
XinZhangMS 0:f7f1f0d76dd6 47 #ifndef _SHA_enum_
XinZhangMS 0:f7f1f0d76dd6 48 #define _SHA_enum_
XinZhangMS 0:f7f1f0d76dd6 49 /*
XinZhangMS 0:f7f1f0d76dd6 50 * All SHA functions return one of these values.
XinZhangMS 0:f7f1f0d76dd6 51 */
XinZhangMS 0:f7f1f0d76dd6 52 enum {
XinZhangMS 0:f7f1f0d76dd6 53 shaSuccess = 0,
XinZhangMS 0:f7f1f0d76dd6 54 shaNull, /* Null pointer parameter */
XinZhangMS 0:f7f1f0d76dd6 55 shaInputTooLong, /* input data too long */
XinZhangMS 0:f7f1f0d76dd6 56 shaStateError, /* called Input after FinalBits or Result */
XinZhangMS 0:f7f1f0d76dd6 57 shaBadParam /* passed a bad parameter */
XinZhangMS 0:f7f1f0d76dd6 58 };
XinZhangMS 0:f7f1f0d76dd6 59 #endif /* _SHA_enum_ */
XinZhangMS 0:f7f1f0d76dd6 60
XinZhangMS 0:f7f1f0d76dd6 61 /*
XinZhangMS 0:f7f1f0d76dd6 62 * These constants hold size information for each of the SHA
XinZhangMS 0:f7f1f0d76dd6 63 * hashing operations
XinZhangMS 0:f7f1f0d76dd6 64 */
XinZhangMS 0:f7f1f0d76dd6 65 enum {
XinZhangMS 0:f7f1f0d76dd6 66 SHA1_Message_Block_Size = 64, SHA224_Message_Block_Size = 64,
XinZhangMS 0:f7f1f0d76dd6 67 SHA256_Message_Block_Size = 64, SHA384_Message_Block_Size = 128,
XinZhangMS 0:f7f1f0d76dd6 68 SHA512_Message_Block_Size = 128,
XinZhangMS 0:f7f1f0d76dd6 69 USHA_Max_Message_Block_Size = SHA512_Message_Block_Size,
XinZhangMS 0:f7f1f0d76dd6 70
XinZhangMS 0:f7f1f0d76dd6 71 SHA1HashSize = 20, SHA224HashSize = 28, SHA256HashSize = 32,
XinZhangMS 0:f7f1f0d76dd6 72 SHA384HashSize = 48, SHA512HashSize = 64,
XinZhangMS 0:f7f1f0d76dd6 73 USHAMaxHashSize = SHA512HashSize,
XinZhangMS 0:f7f1f0d76dd6 74
XinZhangMS 0:f7f1f0d76dd6 75 SHA1HashSizeBits = 160, SHA224HashSizeBits = 224,
XinZhangMS 0:f7f1f0d76dd6 76 SHA256HashSizeBits = 256, SHA384HashSizeBits = 384,
XinZhangMS 0:f7f1f0d76dd6 77 SHA512HashSizeBits = 512, USHAMaxHashSizeBits = SHA512HashSizeBits
XinZhangMS 0:f7f1f0d76dd6 78 };
XinZhangMS 0:f7f1f0d76dd6 79
XinZhangMS 0:f7f1f0d76dd6 80 /*
XinZhangMS 0:f7f1f0d76dd6 81 * These constants are used in the USHA (unified sha) functions.
XinZhangMS 0:f7f1f0d76dd6 82 */
XinZhangMS 0:f7f1f0d76dd6 83 typedef enum SHAversion {
XinZhangMS 0:f7f1f0d76dd6 84 SHA1, SHA224, SHA256, SHA384, SHA512
XinZhangMS 0:f7f1f0d76dd6 85 } SHAversion;
XinZhangMS 0:f7f1f0d76dd6 86
XinZhangMS 0:f7f1f0d76dd6 87 /*
XinZhangMS 0:f7f1f0d76dd6 88 * This structure will hold context information for the SHA-1
XinZhangMS 0:f7f1f0d76dd6 89 * hashing operation.
XinZhangMS 0:f7f1f0d76dd6 90 */
XinZhangMS 0:f7f1f0d76dd6 91 typedef struct SHA1Context {
XinZhangMS 0:f7f1f0d76dd6 92 uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */
XinZhangMS 0:f7f1f0d76dd6 93
XinZhangMS 0:f7f1f0d76dd6 94 uint32_t Length_Low; /* Message length in bits */
XinZhangMS 0:f7f1f0d76dd6 95 uint32_t Length_High; /* Message length in bits */
XinZhangMS 0:f7f1f0d76dd6 96
XinZhangMS 0:f7f1f0d76dd6 97 int_least16_t Message_Block_Index; /* Message_Block array index */
XinZhangMS 0:f7f1f0d76dd6 98 /* 512-bit message blocks */
XinZhangMS 0:f7f1f0d76dd6 99 uint8_t Message_Block[SHA1_Message_Block_Size];
XinZhangMS 0:f7f1f0d76dd6 100
XinZhangMS 0:f7f1f0d76dd6 101 int Computed; /* Is the digest computed? */
XinZhangMS 0:f7f1f0d76dd6 102 int Corrupted; /* Is the digest corrupted? */
XinZhangMS 0:f7f1f0d76dd6 103 } SHA1Context;
XinZhangMS 0:f7f1f0d76dd6 104
XinZhangMS 0:f7f1f0d76dd6 105 /*
XinZhangMS 0:f7f1f0d76dd6 106 * This structure will hold context information for the SHA-256
XinZhangMS 0:f7f1f0d76dd6 107 * hashing operation.
XinZhangMS 0:f7f1f0d76dd6 108 */
XinZhangMS 0:f7f1f0d76dd6 109 typedef struct SHA256Context {
XinZhangMS 0:f7f1f0d76dd6 110 uint32_t Intermediate_Hash[SHA256HashSize/4]; /* Message Digest */
XinZhangMS 0:f7f1f0d76dd6 111
XinZhangMS 0:f7f1f0d76dd6 112 uint32_t Length_Low; /* Message length in bits */
XinZhangMS 0:f7f1f0d76dd6 113 uint32_t Length_High; /* Message length in bits */
XinZhangMS 0:f7f1f0d76dd6 114
XinZhangMS 0:f7f1f0d76dd6 115 int_least16_t Message_Block_Index; /* Message_Block array index */
XinZhangMS 0:f7f1f0d76dd6 116 /* 512-bit message blocks */
XinZhangMS 0:f7f1f0d76dd6 117 uint8_t Message_Block[SHA256_Message_Block_Size];
XinZhangMS 0:f7f1f0d76dd6 118
XinZhangMS 0:f7f1f0d76dd6 119 int Computed; /* Is the digest computed? */
XinZhangMS 0:f7f1f0d76dd6 120 int Corrupted; /* Is the digest corrupted? */
XinZhangMS 0:f7f1f0d76dd6 121 } SHA256Context;
XinZhangMS 0:f7f1f0d76dd6 122
XinZhangMS 0:f7f1f0d76dd6 123 /*
XinZhangMS 0:f7f1f0d76dd6 124 * This structure will hold context information for the SHA-512
XinZhangMS 0:f7f1f0d76dd6 125 * hashing operation.
XinZhangMS 0:f7f1f0d76dd6 126 */
XinZhangMS 0:f7f1f0d76dd6 127 typedef struct SHA512Context {
XinZhangMS 0:f7f1f0d76dd6 128 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 129 uint32_t Intermediate_Hash[SHA512HashSize/4]; /* Message Digest */
XinZhangMS 0:f7f1f0d76dd6 130 uint32_t Length[4]; /* Message length in bits */
XinZhangMS 0:f7f1f0d76dd6 131 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 132 uint64_t Intermediate_Hash[SHA512HashSize/8]; /* Message Digest */
XinZhangMS 0:f7f1f0d76dd6 133 uint64_t Length_Low, Length_High; /* Message length in bits */
XinZhangMS 0:f7f1f0d76dd6 134 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 135
XinZhangMS 0:f7f1f0d76dd6 136 int_least16_t Message_Block_Index; /* Message_Block array index */
XinZhangMS 0:f7f1f0d76dd6 137 /* 1024-bit message blocks */
XinZhangMS 0:f7f1f0d76dd6 138 uint8_t Message_Block[SHA512_Message_Block_Size];
XinZhangMS 0:f7f1f0d76dd6 139
XinZhangMS 0:f7f1f0d76dd6 140 int Computed; /* Is the digest computed?*/
XinZhangMS 0:f7f1f0d76dd6 141 int Corrupted; /* Is the digest corrupted? */
XinZhangMS 0:f7f1f0d76dd6 142 } SHA512Context;
XinZhangMS 0:f7f1f0d76dd6 143
XinZhangMS 0:f7f1f0d76dd6 144 /*
XinZhangMS 0:f7f1f0d76dd6 145 * This structure will hold context information for the SHA-224
XinZhangMS 0:f7f1f0d76dd6 146 * hashing operation. It uses the SHA-256 structure for computation.
XinZhangMS 0:f7f1f0d76dd6 147 */
XinZhangMS 0:f7f1f0d76dd6 148 typedef struct SHA256Context SHA224Context;
XinZhangMS 0:f7f1f0d76dd6 149
XinZhangMS 0:f7f1f0d76dd6 150 /*
XinZhangMS 0:f7f1f0d76dd6 151 * This structure will hold context information for the SHA-384
XinZhangMS 0:f7f1f0d76dd6 152 * hashing operation. It uses the SHA-512 structure for computation.
XinZhangMS 0:f7f1f0d76dd6 153 */
XinZhangMS 0:f7f1f0d76dd6 154 typedef struct SHA512Context SHA384Context;
XinZhangMS 0:f7f1f0d76dd6 155
XinZhangMS 0:f7f1f0d76dd6 156 /*
XinZhangMS 0:f7f1f0d76dd6 157 * This structure holds context information for all SHA
XinZhangMS 0:f7f1f0d76dd6 158 * hashing operations.
XinZhangMS 0:f7f1f0d76dd6 159 */
XinZhangMS 0:f7f1f0d76dd6 160 typedef struct USHAContext {
XinZhangMS 0:f7f1f0d76dd6 161 int whichSha; /* which SHA is being used */
XinZhangMS 0:f7f1f0d76dd6 162 union {
XinZhangMS 0:f7f1f0d76dd6 163 SHA1Context sha1Context;
XinZhangMS 0:f7f1f0d76dd6 164 SHA224Context sha224Context; SHA256Context sha256Context;
XinZhangMS 0:f7f1f0d76dd6 165 SHA384Context sha384Context; SHA512Context sha512Context;
XinZhangMS 0:f7f1f0d76dd6 166 } ctx;
XinZhangMS 0:f7f1f0d76dd6 167 } USHAContext;
XinZhangMS 0:f7f1f0d76dd6 168
XinZhangMS 0:f7f1f0d76dd6 169 /*
XinZhangMS 0:f7f1f0d76dd6 170 * This structure will hold context information for the HMAC
XinZhangMS 0:f7f1f0d76dd6 171 * keyed hashing operation.
XinZhangMS 0:f7f1f0d76dd6 172 */
XinZhangMS 0:f7f1f0d76dd6 173 typedef struct HMACContext {
XinZhangMS 0:f7f1f0d76dd6 174 int whichSha; /* which SHA is being used */
XinZhangMS 0:f7f1f0d76dd6 175 int hashSize; /* hash size of SHA being used */
XinZhangMS 0:f7f1f0d76dd6 176 int blockSize; /* block size of SHA being used */
XinZhangMS 0:f7f1f0d76dd6 177 USHAContext shaContext; /* SHA context */
XinZhangMS 0:f7f1f0d76dd6 178 unsigned char k_opad[USHA_Max_Message_Block_Size];
XinZhangMS 0:f7f1f0d76dd6 179 /* outer padding - key XORd with opad */
XinZhangMS 0:f7f1f0d76dd6 180 } HMACContext;
XinZhangMS 0:f7f1f0d76dd6 181
XinZhangMS 0:f7f1f0d76dd6 182
XinZhangMS 0:f7f1f0d76dd6 183 /*
XinZhangMS 0:f7f1f0d76dd6 184 * Function Prototypes
XinZhangMS 0:f7f1f0d76dd6 185 */
XinZhangMS 0:f7f1f0d76dd6 186
XinZhangMS 0:f7f1f0d76dd6 187 /* SHA-1 */
XinZhangMS 0:f7f1f0d76dd6 188 extern int SHA1Reset(SHA1Context *);
XinZhangMS 0:f7f1f0d76dd6 189 extern int SHA1Input(SHA1Context *, const uint8_t *bytes,
XinZhangMS 0:f7f1f0d76dd6 190 unsigned int bytecount);
XinZhangMS 0:f7f1f0d76dd6 191 extern int SHA1FinalBits(SHA1Context *, const uint8_t bits,
XinZhangMS 0:f7f1f0d76dd6 192 unsigned int bitcount);
XinZhangMS 0:f7f1f0d76dd6 193 extern int SHA1Result(SHA1Context *,
XinZhangMS 0:f7f1f0d76dd6 194 uint8_t Message_Digest[SHA1HashSize]);
XinZhangMS 0:f7f1f0d76dd6 195
XinZhangMS 0:f7f1f0d76dd6 196 /* SHA-224 */
XinZhangMS 0:f7f1f0d76dd6 197 extern int SHA224Reset(SHA224Context *);
XinZhangMS 0:f7f1f0d76dd6 198 extern int SHA224Input(SHA224Context *, const uint8_t *bytes,
XinZhangMS 0:f7f1f0d76dd6 199 unsigned int bytecount);
XinZhangMS 0:f7f1f0d76dd6 200 extern int SHA224FinalBits(SHA224Context *, const uint8_t bits,
XinZhangMS 0:f7f1f0d76dd6 201 unsigned int bitcount);
XinZhangMS 0:f7f1f0d76dd6 202 extern int SHA224Result(SHA224Context *,
XinZhangMS 0:f7f1f0d76dd6 203 uint8_t Message_Digest[SHA224HashSize]);
XinZhangMS 0:f7f1f0d76dd6 204
XinZhangMS 0:f7f1f0d76dd6 205 /* SHA-256 */
XinZhangMS 0:f7f1f0d76dd6 206 extern int SHA256Reset(SHA256Context *);
XinZhangMS 0:f7f1f0d76dd6 207 extern int SHA256Input(SHA256Context *, const uint8_t *bytes,
XinZhangMS 0:f7f1f0d76dd6 208 unsigned int bytecount);
XinZhangMS 0:f7f1f0d76dd6 209 extern int SHA256FinalBits(SHA256Context *, const uint8_t bits,
XinZhangMS 0:f7f1f0d76dd6 210 unsigned int bitcount);
XinZhangMS 0:f7f1f0d76dd6 211 extern int SHA256Result(SHA256Context *,
XinZhangMS 0:f7f1f0d76dd6 212 uint8_t Message_Digest[SHA256HashSize]);
XinZhangMS 0:f7f1f0d76dd6 213
XinZhangMS 0:f7f1f0d76dd6 214 /* SHA-384 */
XinZhangMS 0:f7f1f0d76dd6 215 extern int SHA384Reset(SHA384Context *);
XinZhangMS 0:f7f1f0d76dd6 216 extern int SHA384Input(SHA384Context *, const uint8_t *bytes,
XinZhangMS 0:f7f1f0d76dd6 217 unsigned int bytecount);
XinZhangMS 0:f7f1f0d76dd6 218 extern int SHA384FinalBits(SHA384Context *, const uint8_t bits,
XinZhangMS 0:f7f1f0d76dd6 219 unsigned int bitcount);
XinZhangMS 0:f7f1f0d76dd6 220 extern int SHA384Result(SHA384Context *,
XinZhangMS 0:f7f1f0d76dd6 221 uint8_t Message_Digest[SHA384HashSize]);
XinZhangMS 0:f7f1f0d76dd6 222
XinZhangMS 0:f7f1f0d76dd6 223 /* SHA-512 */
XinZhangMS 0:f7f1f0d76dd6 224 extern int SHA512Reset(SHA512Context *);
XinZhangMS 0:f7f1f0d76dd6 225 extern int SHA512Input(SHA512Context *, const uint8_t *bytes,
XinZhangMS 0:f7f1f0d76dd6 226 unsigned int bytecount);
XinZhangMS 0:f7f1f0d76dd6 227 extern int SHA512FinalBits(SHA512Context *, const uint8_t bits,
XinZhangMS 0:f7f1f0d76dd6 228 unsigned int bitcount);
XinZhangMS 0:f7f1f0d76dd6 229 extern int SHA512Result(SHA512Context *,
XinZhangMS 0:f7f1f0d76dd6 230 uint8_t Message_Digest[SHA512HashSize]);
XinZhangMS 0:f7f1f0d76dd6 231
XinZhangMS 0:f7f1f0d76dd6 232 /* Unified SHA functions, chosen by whichSha */
XinZhangMS 0:f7f1f0d76dd6 233 extern int USHAReset(USHAContext *, SHAversion whichSha);
XinZhangMS 0:f7f1f0d76dd6 234 extern int USHAInput(USHAContext *,
XinZhangMS 0:f7f1f0d76dd6 235 const uint8_t *bytes, unsigned int bytecount);
XinZhangMS 0:f7f1f0d76dd6 236 extern int USHAFinalBits(USHAContext *,
XinZhangMS 0:f7f1f0d76dd6 237 const uint8_t bits, unsigned int bitcount);
XinZhangMS 0:f7f1f0d76dd6 238 extern int USHAResult(USHAContext *,
XinZhangMS 0:f7f1f0d76dd6 239 uint8_t Message_Digest[USHAMaxHashSize]);
XinZhangMS 0:f7f1f0d76dd6 240 extern int USHABlockSize(enum SHAversion whichSha);
XinZhangMS 0:f7f1f0d76dd6 241 extern int USHAHashSize(enum SHAversion whichSha);
XinZhangMS 0:f7f1f0d76dd6 242 extern int USHAHashSizeBits(enum SHAversion whichSha);
XinZhangMS 0:f7f1f0d76dd6 243
XinZhangMS 0:f7f1f0d76dd6 244 /*
XinZhangMS 0:f7f1f0d76dd6 245 * HMAC Keyed-Hashing for Message Authentication, RFC2104,
XinZhangMS 0:f7f1f0d76dd6 246 * for all SHAs.
XinZhangMS 0:f7f1f0d76dd6 247 * This interface allows a fixed-length text input to be used.
XinZhangMS 0:f7f1f0d76dd6 248 */
XinZhangMS 0:f7f1f0d76dd6 249 extern int hmac(SHAversion whichSha, /* which SHA algorithm to use */
XinZhangMS 0:f7f1f0d76dd6 250 const unsigned char *text, /* pointer to data stream */
XinZhangMS 0:f7f1f0d76dd6 251 int text_len, /* length of data stream */
XinZhangMS 0:f7f1f0d76dd6 252 const unsigned char *key, /* pointer to authentication key */
XinZhangMS 0:f7f1f0d76dd6 253 int key_len, /* length of authentication key */
XinZhangMS 0:f7f1f0d76dd6 254 uint8_t digest[USHAMaxHashSize]); /* caller digest to fill in */
XinZhangMS 0:f7f1f0d76dd6 255
XinZhangMS 0:f7f1f0d76dd6 256 /*
XinZhangMS 0:f7f1f0d76dd6 257 * HMAC Keyed-Hashing for Message Authentication, RFC2104,
XinZhangMS 0:f7f1f0d76dd6 258 * for all SHAs.
XinZhangMS 0:f7f1f0d76dd6 259 * This interface allows any length of text input to be used.
XinZhangMS 0:f7f1f0d76dd6 260 */
XinZhangMS 0:f7f1f0d76dd6 261 extern int hmacReset(HMACContext *ctx, enum SHAversion whichSha,
XinZhangMS 0:f7f1f0d76dd6 262 const unsigned char *key, int key_len);
XinZhangMS 0:f7f1f0d76dd6 263 extern int hmacInput(HMACContext *ctx, const unsigned char *text,
XinZhangMS 0:f7f1f0d76dd6 264 int text_len);
XinZhangMS 0:f7f1f0d76dd6 265
XinZhangMS 0:f7f1f0d76dd6 266 extern int hmacFinalBits(HMACContext *ctx, const uint8_t bits,
XinZhangMS 0:f7f1f0d76dd6 267 unsigned int bitcount);
XinZhangMS 0:f7f1f0d76dd6 268 extern int hmacResult(HMACContext *ctx,
XinZhangMS 0:f7f1f0d76dd6 269 uint8_t digest[USHAMaxHashSize]);
XinZhangMS 0:f7f1f0d76dd6 270
XinZhangMS 0:f7f1f0d76dd6 271
XinZhangMS 0:f7f1f0d76dd6 272 #ifdef __cplusplus
XinZhangMS 0:f7f1f0d76dd6 273 }
XinZhangMS 0:f7f1f0d76dd6 274 #endif
XinZhangMS 0:f7f1f0d76dd6 275
XinZhangMS 0:f7f1f0d76dd6 276 #endif /* _SHA_H_ */
XinZhangMS 0:f7f1f0d76dd6 277