OAuth library for twitter. Original: http://mbed.org/users/soramimi/programs/Twitter/

Dependents:   OAuth4Tw

Committer:
takahashim
Date:
Mon Dec 12 18:47:10 2011 +0000
Revision:
0:0048b264a3ad
publish library

Who changed what in which revision?

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