NetworkServices with NUCLEO-L476RG and W5500 by SeeedStudio stack.

Dependents:   coap-example Borsch coap-example

Fork of NetworkServices by AMETEK Powervar

Committer:
sgnezdov
Date:
Wed Jul 05 18:34:39 2017 +0000
Revision:
17:c976088bf39d
Parent:
15:14382459c8b7
Changed setup interface to take MAC address, because W5500 may use software defined MAC when obtaining IP.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dgriffin65 15:14382459c8b7 1 /*
dgriffin65 15:14382459c8b7 2 * source from http://www.ipa.go.jp/security/rfc/RFC3174JA.html
dgriffin65 15:14382459c8b7 3 */
dgriffin65 15:14382459c8b7 4 #include "sha1.h"
dgriffin65 15:14382459c8b7 5
dgriffin65 15:14382459c8b7 6 /*
dgriffin65 15:14382459c8b7 7 * Define the SHA1 circular left shift macro
dgriffin65 15:14382459c8b7 8 */
dgriffin65 15:14382459c8b7 9 #define SHA1CircularShift(bits,word) \
dgriffin65 15:14382459c8b7 10 (((word) << (bits)) | ((word) >> (32-(bits))))
dgriffin65 15:14382459c8b7 11
dgriffin65 15:14382459c8b7 12 /* Local Function Prototyptes */
dgriffin65 15:14382459c8b7 13 void SHA1PadMessage(SHA1Context *);
dgriffin65 15:14382459c8b7 14 void SHA1ProcessMessageBlock(SHA1Context *);
dgriffin65 15:14382459c8b7 15
dgriffin65 15:14382459c8b7 16 /*
dgriffin65 15:14382459c8b7 17 * SHA1Reset
dgriffin65 15:14382459c8b7 18 *
dgriffin65 15:14382459c8b7 19 * Description:
dgriffin65 15:14382459c8b7 20 * This function will initialize the SHA1Context in preparation
dgriffin65 15:14382459c8b7 21 * for computing a new SHA1 message digest.
dgriffin65 15:14382459c8b7 22 *
dgriffin65 15:14382459c8b7 23 * Parameters:
dgriffin65 15:14382459c8b7 24 * context: [in/out]
dgriffin65 15:14382459c8b7 25 * The context to reset.
dgriffin65 15:14382459c8b7 26 *
dgriffin65 15:14382459c8b7 27 * Returns:
dgriffin65 15:14382459c8b7 28 * sha Error Code.
dgriffin65 15:14382459c8b7 29 *
dgriffin65 15:14382459c8b7 30 */
dgriffin65 15:14382459c8b7 31 int SHA1Reset(SHA1Context *context)
dgriffin65 15:14382459c8b7 32 {
dgriffin65 15:14382459c8b7 33 if (!context)
dgriffin65 15:14382459c8b7 34 {
dgriffin65 15:14382459c8b7 35 return shaNull;
dgriffin65 15:14382459c8b7 36 }
dgriffin65 15:14382459c8b7 37
dgriffin65 15:14382459c8b7 38 context->Length_Low = 0;
dgriffin65 15:14382459c8b7 39 context->Length_High = 0;
dgriffin65 15:14382459c8b7 40 context->Message_Block_Index = 0;
dgriffin65 15:14382459c8b7 41
dgriffin65 15:14382459c8b7 42 context->Intermediate_Hash[0] = 0x67452301;
dgriffin65 15:14382459c8b7 43 context->Intermediate_Hash[1] = 0xEFCDAB89;
dgriffin65 15:14382459c8b7 44 context->Intermediate_Hash[2] = 0x98BADCFE;
dgriffin65 15:14382459c8b7 45 context->Intermediate_Hash[3] = 0x10325476;
dgriffin65 15:14382459c8b7 46 context->Intermediate_Hash[4] = 0xC3D2E1F0;
dgriffin65 15:14382459c8b7 47
dgriffin65 15:14382459c8b7 48 context->Computed = 0;
dgriffin65 15:14382459c8b7 49 context->Corrupted = 0;
dgriffin65 15:14382459c8b7 50
dgriffin65 15:14382459c8b7 51 return shaSuccess;
dgriffin65 15:14382459c8b7 52 }
dgriffin65 15:14382459c8b7 53
dgriffin65 15:14382459c8b7 54 /*
dgriffin65 15:14382459c8b7 55 * SHA1Result
dgriffin65 15:14382459c8b7 56 *
dgriffin65 15:14382459c8b7 57 * Description:
dgriffin65 15:14382459c8b7 58 * This function will return the 160-bit message digest into the
dgriffin65 15:14382459c8b7 59 * Message_Digest array provided by the caller.
dgriffin65 15:14382459c8b7 60 * NOTE: The first octet of hash is stored in the 0th element,
dgriffin65 15:14382459c8b7 61 * the last octet of hash in the 19th element.
dgriffin65 15:14382459c8b7 62 *
dgriffin65 15:14382459c8b7 63 * Parameters:
dgriffin65 15:14382459c8b7 64 * context: [in/out]
dgriffin65 15:14382459c8b7 65 * The context to use to calculate the SHA-1 hash.
dgriffin65 15:14382459c8b7 66 * Message_Digest: [out]
dgriffin65 15:14382459c8b7 67 * Where the digest is returned.
dgriffin65 15:14382459c8b7 68 *
dgriffin65 15:14382459c8b7 69 * Returns:
dgriffin65 15:14382459c8b7 70 * sha Error Code.
dgriffin65 15:14382459c8b7 71 *
dgriffin65 15:14382459c8b7 72 */
dgriffin65 15:14382459c8b7 73 int SHA1Result( SHA1Context *context,
dgriffin65 15:14382459c8b7 74 uint8_t Message_Digest[SHA1HashSize])
dgriffin65 15:14382459c8b7 75 {
dgriffin65 15:14382459c8b7 76 int i;
dgriffin65 15:14382459c8b7 77
dgriffin65 15:14382459c8b7 78 if (!context || !Message_Digest)
dgriffin65 15:14382459c8b7 79 {
dgriffin65 15:14382459c8b7 80 return shaNull;
dgriffin65 15:14382459c8b7 81 }
dgriffin65 15:14382459c8b7 82
dgriffin65 15:14382459c8b7 83 if (context->Corrupted)
dgriffin65 15:14382459c8b7 84 {
dgriffin65 15:14382459c8b7 85 return context->Corrupted;
dgriffin65 15:14382459c8b7 86 }
dgriffin65 15:14382459c8b7 87
dgriffin65 15:14382459c8b7 88 if (!context->Computed)
dgriffin65 15:14382459c8b7 89 {
dgriffin65 15:14382459c8b7 90 SHA1PadMessage(context);
dgriffin65 15:14382459c8b7 91 for(i=0; i<64; ++i)
dgriffin65 15:14382459c8b7 92 {
dgriffin65 15:14382459c8b7 93 /* message may be sensitive, clear it out */
dgriffin65 15:14382459c8b7 94 context->Message_Block[i] = 0;
dgriffin65 15:14382459c8b7 95 }
dgriffin65 15:14382459c8b7 96 context->Length_Low = 0; /* and clear length */
dgriffin65 15:14382459c8b7 97 context->Length_High = 0;
dgriffin65 15:14382459c8b7 98 context->Computed = 1;
dgriffin65 15:14382459c8b7 99 }
dgriffin65 15:14382459c8b7 100
dgriffin65 15:14382459c8b7 101 for(i = 0; i < SHA1HashSize; ++i)
dgriffin65 15:14382459c8b7 102 {
dgriffin65 15:14382459c8b7 103 Message_Digest[i] = context->Intermediate_Hash[i>>2]
dgriffin65 15:14382459c8b7 104 >> 8 * ( 3 - ( i & 0x03 ) );
dgriffin65 15:14382459c8b7 105 }
dgriffin65 15:14382459c8b7 106
dgriffin65 15:14382459c8b7 107 return shaSuccess;
dgriffin65 15:14382459c8b7 108 }
dgriffin65 15:14382459c8b7 109
dgriffin65 15:14382459c8b7 110 /*
dgriffin65 15:14382459c8b7 111 * SHA1Input
dgriffin65 15:14382459c8b7 112 *
dgriffin65 15:14382459c8b7 113 * Description:
dgriffin65 15:14382459c8b7 114 * This function accepts an array of octets as the next portion
dgriffin65 15:14382459c8b7 115 * of the message.
dgriffin65 15:14382459c8b7 116 *
dgriffin65 15:14382459c8b7 117 * Parameters:
dgriffin65 15:14382459c8b7 118 * context: [in/out]
dgriffin65 15:14382459c8b7 119 * The SHA context to update
dgriffin65 15:14382459c8b7 120 * message_array: [in]
dgriffin65 15:14382459c8b7 121 * An array of characters representing the next portion of
dgriffin65 15:14382459c8b7 122 * the message.
dgriffin65 15:14382459c8b7 123 * length: [in]
dgriffin65 15:14382459c8b7 124 * The length of the message in message_array
dgriffin65 15:14382459c8b7 125 *
dgriffin65 15:14382459c8b7 126 * Returns:
dgriffin65 15:14382459c8b7 127 * sha Error Code.
dgriffin65 15:14382459c8b7 128 *
dgriffin65 15:14382459c8b7 129 */
dgriffin65 15:14382459c8b7 130 int SHA1Input( SHA1Context *context,
dgriffin65 15:14382459c8b7 131 const uint8_t *message_array,
dgriffin65 15:14382459c8b7 132 unsigned length)
dgriffin65 15:14382459c8b7 133 {
dgriffin65 15:14382459c8b7 134 if (!length)
dgriffin65 15:14382459c8b7 135 {
dgriffin65 15:14382459c8b7 136 return shaSuccess;
dgriffin65 15:14382459c8b7 137 }
dgriffin65 15:14382459c8b7 138
dgriffin65 15:14382459c8b7 139 if (!context || !message_array)
dgriffin65 15:14382459c8b7 140 {
dgriffin65 15:14382459c8b7 141 return shaNull;
dgriffin65 15:14382459c8b7 142 }
dgriffin65 15:14382459c8b7 143
dgriffin65 15:14382459c8b7 144 if (context->Computed)
dgriffin65 15:14382459c8b7 145 {
dgriffin65 15:14382459c8b7 146 context->Corrupted = shaStateError;
dgriffin65 15:14382459c8b7 147 return shaStateError;
dgriffin65 15:14382459c8b7 148 }
dgriffin65 15:14382459c8b7 149
dgriffin65 15:14382459c8b7 150 if (context->Corrupted)
dgriffin65 15:14382459c8b7 151 {
dgriffin65 15:14382459c8b7 152 return context->Corrupted;
dgriffin65 15:14382459c8b7 153 }
dgriffin65 15:14382459c8b7 154 while(length-- && !context->Corrupted)
dgriffin65 15:14382459c8b7 155 {
dgriffin65 15:14382459c8b7 156 context->Message_Block[context->Message_Block_Index++] =
dgriffin65 15:14382459c8b7 157 (*message_array & 0xFF);
dgriffin65 15:14382459c8b7 158
dgriffin65 15:14382459c8b7 159 context->Length_Low += 8;
dgriffin65 15:14382459c8b7 160 if (context->Length_Low == 0)
dgriffin65 15:14382459c8b7 161 {
dgriffin65 15:14382459c8b7 162 context->Length_High++;
dgriffin65 15:14382459c8b7 163 if (context->Length_High == 0)
dgriffin65 15:14382459c8b7 164 {
dgriffin65 15:14382459c8b7 165 /* Message is too long */
dgriffin65 15:14382459c8b7 166 context->Corrupted = 1;
dgriffin65 15:14382459c8b7 167 }
dgriffin65 15:14382459c8b7 168 }
dgriffin65 15:14382459c8b7 169
dgriffin65 15:14382459c8b7 170 if (context->Message_Block_Index == 64)
dgriffin65 15:14382459c8b7 171 {
dgriffin65 15:14382459c8b7 172 SHA1ProcessMessageBlock(context);
dgriffin65 15:14382459c8b7 173 }
dgriffin65 15:14382459c8b7 174
dgriffin65 15:14382459c8b7 175 message_array++;
dgriffin65 15:14382459c8b7 176 }
dgriffin65 15:14382459c8b7 177
dgriffin65 15:14382459c8b7 178 return shaSuccess;
dgriffin65 15:14382459c8b7 179 }
dgriffin65 15:14382459c8b7 180
dgriffin65 15:14382459c8b7 181 /*
dgriffin65 15:14382459c8b7 182 * SHA1ProcessMessageBlock
dgriffin65 15:14382459c8b7 183 *
dgriffin65 15:14382459c8b7 184 * Description:
dgriffin65 15:14382459c8b7 185 * This function will process the next 512 bits of the message
dgriffin65 15:14382459c8b7 186 * stored in the Message_Block array.
dgriffin65 15:14382459c8b7 187 *
dgriffin65 15:14382459c8b7 188 * Parameters:
dgriffin65 15:14382459c8b7 189 * None.
dgriffin65 15:14382459c8b7 190 *
dgriffin65 15:14382459c8b7 191 * Returns:
dgriffin65 15:14382459c8b7 192 * Nothing.
dgriffin65 15:14382459c8b7 193 *
dgriffin65 15:14382459c8b7 194 * Comments:
dgriffin65 15:14382459c8b7 195 * Many of the variable names in this code, especially the
dgriffin65 15:14382459c8b7 196 * single character names, were used because those were the
dgriffin65 15:14382459c8b7 197 * names used in the publication.
dgriffin65 15:14382459c8b7 198 *
dgriffin65 15:14382459c8b7 199 *
dgriffin65 15:14382459c8b7 200 */
dgriffin65 15:14382459c8b7 201 void SHA1ProcessMessageBlock(SHA1Context *context)
dgriffin65 15:14382459c8b7 202 {
dgriffin65 15:14382459c8b7 203 const uint32_t K[] = { /* Constants defined in SHA-1 */
dgriffin65 15:14382459c8b7 204 0x5A827999,
dgriffin65 15:14382459c8b7 205 0x6ED9EBA1,
dgriffin65 15:14382459c8b7 206 0x8F1BBCDC,
dgriffin65 15:14382459c8b7 207 0xCA62C1D6
dgriffin65 15:14382459c8b7 208 };
dgriffin65 15:14382459c8b7 209 int t; /* Loop counter */
dgriffin65 15:14382459c8b7 210 uint32_t temp; /* Temporary word value */
dgriffin65 15:14382459c8b7 211 uint32_t W[80]; /* Word sequence */
dgriffin65 15:14382459c8b7 212 uint32_t A, B, C, D, E; /* Word buffers */
dgriffin65 15:14382459c8b7 213
dgriffin65 15:14382459c8b7 214 /*
dgriffin65 15:14382459c8b7 215 * Initialize the first 16 words in the array W
dgriffin65 15:14382459c8b7 216 */
dgriffin65 15:14382459c8b7 217 for(t = 0; t < 16; t++)
dgriffin65 15:14382459c8b7 218 {
dgriffin65 15:14382459c8b7 219 W[t] = context->Message_Block[t * 4] << 24;
dgriffin65 15:14382459c8b7 220 W[t] |= context->Message_Block[t * 4 + 1] << 16;
dgriffin65 15:14382459c8b7 221 W[t] |= context->Message_Block[t * 4 + 2] << 8;
dgriffin65 15:14382459c8b7 222 W[t] |= context->Message_Block[t * 4 + 3];
dgriffin65 15:14382459c8b7 223 }
dgriffin65 15:14382459c8b7 224
dgriffin65 15:14382459c8b7 225 for(t = 16; t < 80; t++)
dgriffin65 15:14382459c8b7 226 {
dgriffin65 15:14382459c8b7 227 W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
dgriffin65 15:14382459c8b7 228 }
dgriffin65 15:14382459c8b7 229
dgriffin65 15:14382459c8b7 230 A = context->Intermediate_Hash[0];
dgriffin65 15:14382459c8b7 231 B = context->Intermediate_Hash[1];
dgriffin65 15:14382459c8b7 232 C = context->Intermediate_Hash[2];
dgriffin65 15:14382459c8b7 233 D = context->Intermediate_Hash[3];
dgriffin65 15:14382459c8b7 234 E = context->Intermediate_Hash[4];
dgriffin65 15:14382459c8b7 235
dgriffin65 15:14382459c8b7 236 for(t = 0; t < 20; t++)
dgriffin65 15:14382459c8b7 237 {
dgriffin65 15:14382459c8b7 238 temp = SHA1CircularShift(5,A) +
dgriffin65 15:14382459c8b7 239 ((B & C) | ((~B) & D)) + E + W[t] + K[0];
dgriffin65 15:14382459c8b7 240 E = D;
dgriffin65 15:14382459c8b7 241 D = C;
dgriffin65 15:14382459c8b7 242 C = SHA1CircularShift(30,B);
dgriffin65 15:14382459c8b7 243 B = A;
dgriffin65 15:14382459c8b7 244 A = temp;
dgriffin65 15:14382459c8b7 245 }
dgriffin65 15:14382459c8b7 246
dgriffin65 15:14382459c8b7 247 for(t = 20; t < 40; t++)
dgriffin65 15:14382459c8b7 248 {
dgriffin65 15:14382459c8b7 249 temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
dgriffin65 15:14382459c8b7 250 E = D;
dgriffin65 15:14382459c8b7 251 D = C;
dgriffin65 15:14382459c8b7 252 C = SHA1CircularShift(30,B);
dgriffin65 15:14382459c8b7 253 B = A;
dgriffin65 15:14382459c8b7 254 A = temp;
dgriffin65 15:14382459c8b7 255 }
dgriffin65 15:14382459c8b7 256
dgriffin65 15:14382459c8b7 257 for(t = 40; t < 60; t++)
dgriffin65 15:14382459c8b7 258 {
dgriffin65 15:14382459c8b7 259 temp = SHA1CircularShift(5,A) +
dgriffin65 15:14382459c8b7 260 ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
dgriffin65 15:14382459c8b7 261 E = D;
dgriffin65 15:14382459c8b7 262 D = C;
dgriffin65 15:14382459c8b7 263 C = SHA1CircularShift(30,B);
dgriffin65 15:14382459c8b7 264 B = A;
dgriffin65 15:14382459c8b7 265 A = temp;
dgriffin65 15:14382459c8b7 266 }
dgriffin65 15:14382459c8b7 267
dgriffin65 15:14382459c8b7 268 for(t = 60; t < 80; t++)
dgriffin65 15:14382459c8b7 269 {
dgriffin65 15:14382459c8b7 270 temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
dgriffin65 15:14382459c8b7 271 E = D;
dgriffin65 15:14382459c8b7 272 D = C;
dgriffin65 15:14382459c8b7 273 C = SHA1CircularShift(30,B);
dgriffin65 15:14382459c8b7 274 B = A;
dgriffin65 15:14382459c8b7 275 A = temp;
dgriffin65 15:14382459c8b7 276 }
dgriffin65 15:14382459c8b7 277
dgriffin65 15:14382459c8b7 278 context->Intermediate_Hash[0] += A;
dgriffin65 15:14382459c8b7 279 context->Intermediate_Hash[1] += B;
dgriffin65 15:14382459c8b7 280 context->Intermediate_Hash[2] += C;
dgriffin65 15:14382459c8b7 281 context->Intermediate_Hash[3] += D;
dgriffin65 15:14382459c8b7 282 context->Intermediate_Hash[4] += E;
dgriffin65 15:14382459c8b7 283
dgriffin65 15:14382459c8b7 284 context->Message_Block_Index = 0;
dgriffin65 15:14382459c8b7 285 }
dgriffin65 15:14382459c8b7 286
dgriffin65 15:14382459c8b7 287
dgriffin65 15:14382459c8b7 288 /*
dgriffin65 15:14382459c8b7 289 * SHA1PadMessage
dgriffin65 15:14382459c8b7 290 *
dgriffin65 15:14382459c8b7 291 * Description:
dgriffin65 15:14382459c8b7 292 * According to the standard, the message must be padded to an even
dgriffin65 15:14382459c8b7 293 * 512 bits. The first padding bit must be a '1'. The last 64
dgriffin65 15:14382459c8b7 294 * bits represent the length of the original message. All bits in
dgriffin65 15:14382459c8b7 295 * between should be 0. This function will pad the message
dgriffin65 15:14382459c8b7 296 * according to those rules by filling the Message_Block array
dgriffin65 15:14382459c8b7 297 * accordingly. It will also call the ProcessMessageBlock function
dgriffin65 15:14382459c8b7 298 * provided appropriately. When it returns, it can be assumed that
dgriffin65 15:14382459c8b7 299 * the message digest has been computed.
dgriffin65 15:14382459c8b7 300 *
dgriffin65 15:14382459c8b7 301 * Parameters:
dgriffin65 15:14382459c8b7 302 * context: [in/out]
dgriffin65 15:14382459c8b7 303 * The context to pad
dgriffin65 15:14382459c8b7 304 * ProcessMessageBlock: [in]
dgriffin65 15:14382459c8b7 305 * The appropriate SHA*ProcessMessageBlock function
dgriffin65 15:14382459c8b7 306 * Returns:
dgriffin65 15:14382459c8b7 307 * Nothing.
dgriffin65 15:14382459c8b7 308 *
dgriffin65 15:14382459c8b7 309 */
dgriffin65 15:14382459c8b7 310
dgriffin65 15:14382459c8b7 311 void SHA1PadMessage(SHA1Context *context)
dgriffin65 15:14382459c8b7 312 {
dgriffin65 15:14382459c8b7 313 /*
dgriffin65 15:14382459c8b7 314 * Check to see if the current message block is too small to hold
dgriffin65 15:14382459c8b7 315 * the initial padding bits and length. If so, we will pad the
dgriffin65 15:14382459c8b7 316 * block, process it, and then continue padding into a second
dgriffin65 15:14382459c8b7 317 * block.
dgriffin65 15:14382459c8b7 318 */
dgriffin65 15:14382459c8b7 319 if (context->Message_Block_Index > 55)
dgriffin65 15:14382459c8b7 320 {
dgriffin65 15:14382459c8b7 321 context->Message_Block[context->Message_Block_Index++] = 0x80;
dgriffin65 15:14382459c8b7 322 while(context->Message_Block_Index < 64)
dgriffin65 15:14382459c8b7 323 {
dgriffin65 15:14382459c8b7 324 context->Message_Block[context->Message_Block_Index++] = 0;
dgriffin65 15:14382459c8b7 325 }
dgriffin65 15:14382459c8b7 326
dgriffin65 15:14382459c8b7 327 SHA1ProcessMessageBlock(context);
dgriffin65 15:14382459c8b7 328
dgriffin65 15:14382459c8b7 329 while(context->Message_Block_Index < 56)
dgriffin65 15:14382459c8b7 330 {
dgriffin65 15:14382459c8b7 331 context->Message_Block[context->Message_Block_Index++] = 0;
dgriffin65 15:14382459c8b7 332 }
dgriffin65 15:14382459c8b7 333 }
dgriffin65 15:14382459c8b7 334 else
dgriffin65 15:14382459c8b7 335 {
dgriffin65 15:14382459c8b7 336 context->Message_Block[context->Message_Block_Index++] = 0x80;
dgriffin65 15:14382459c8b7 337 while(context->Message_Block_Index < 56)
dgriffin65 15:14382459c8b7 338 {
dgriffin65 15:14382459c8b7 339 context->Message_Block[context->Message_Block_Index++] = 0;
dgriffin65 15:14382459c8b7 340 }
dgriffin65 15:14382459c8b7 341 }
dgriffin65 15:14382459c8b7 342
dgriffin65 15:14382459c8b7 343 /*
dgriffin65 15:14382459c8b7 344 * Store the message length as the last 8 octets
dgriffin65 15:14382459c8b7 345 */
dgriffin65 15:14382459c8b7 346 context->Message_Block[56] = context->Length_High >> 24;
dgriffin65 15:14382459c8b7 347 context->Message_Block[57] = context->Length_High >> 16;
dgriffin65 15:14382459c8b7 348 context->Message_Block[58] = context->Length_High >> 8;
dgriffin65 15:14382459c8b7 349 context->Message_Block[59] = context->Length_High;
dgriffin65 15:14382459c8b7 350 context->Message_Block[60] = context->Length_Low >> 24;
dgriffin65 15:14382459c8b7 351 context->Message_Block[61] = context->Length_Low >> 16;
dgriffin65 15:14382459c8b7 352 context->Message_Block[62] = context->Length_Low >> 8;
dgriffin65 15:14382459c8b7 353 context->Message_Block[63] = context->Length_Low;
dgriffin65 15:14382459c8b7 354
dgriffin65 15:14382459c8b7 355 SHA1ProcessMessageBlock(context);
dgriffin65 15:14382459c8b7 356 }
dgriffin65 15:14382459c8b7 357
dgriffin65 15:14382459c8b7 358 void sha1 (const char *input, int len, char *output) {
dgriffin65 15:14382459c8b7 359 SHA1Context sha;
dgriffin65 15:14382459c8b7 360
dgriffin65 15:14382459c8b7 361 SHA1Reset(&sha);
dgriffin65 15:14382459c8b7 362 SHA1Input(&sha, (unsigned char*)input, len);
dgriffin65 15:14382459c8b7 363 SHA1Result(&sha, (uint8_t*)output);
dgriffin65 15:14382459c8b7 364 }